Что произойдет, если я выключу устройство перед "синхронизацией"?
У меня есть встроенное устройство (Linux + BusyBox), на котором я загрузил файл "my_file.txt"
, я использовал cat
проверить содержание файла, и это было удовлетворительным. Затем я вытащил вилку и после перезагрузки увидел, что файл все еще там, но с размером 0 байт...
Может ли это быть вызвано несинхронной файловой системой? На самом деле это двусторонний вопрос:
- Создание файла и его содержимого происходит на разных этапах? (разрешение фазы, где существует файл с 0 байтами)
- Возможно ли, что я "вижу" файл [то есть мне удалось
cat "my_file.txt"
], но то, что я на самом деле вижу, это кэшированная версия, которая не будет там после перезагрузки, если толькоsync
будет называться? и "не быть там" я имею в виду contens, так как сам файл остается
Кстати, когда Linux сбрасывает файловые системы? я знаю это stdout
например, сбрасывается (по умолчанию), когда "\n"
введен [и может быть настроен как-то, не помню точно, как]. Есть ли правило для файловых систем?
3 ответа
Создание файла и его содержимого происходит на разных этапах? (допускается этап, на котором существует файл с 0 байтами)
Да. Обычная работа с файлами
- открыть / создать файл
- чтение / запись данных.
- закройте файл.
Возможно ли, что я "вижу" файл [имеется в виду, что мне удалось отследить "my_file.txt"], но на самом деле я вижу кэшированную версию, которой не будет после перезагрузки, если не будет вызвана синхронизация?
Да. Если вышеуказанный шаг 1 был синхронизирован с жестким диском, а шаг 2 - нет, вы потеряете содержимое файла.
Кстати, когда Linux сбрасывает файловые системы? Я знаю, что stdout, например, сбрасывается (по умолчанию), когда вводится "\n" [и может быть настроен как-то, не помню точно, как]. Есть ли правило для файловых систем?
Нет, общих правил нет - это сложно. ОС / ядро и файловая система кэшируют данные в ОЗУ и записывают их на диск, когда внутренние алгоритмы выясняют, что сейчас подходящее время для этого.
Обратите внимание, что на многих уровнях есть флэш / синхронизация. Сброс, о котором вы говорите "когда вводится" \ n "", - это всего лишь сброс из программы в операционную систему. Затем операционная система может хранить данные только в оперативной памяти и позже записывать их на жесткий диск. Жесткий диск может даже кэшировать его в оперативной памяти на жестком диске и позже записать в постоянное хранилище.
Обычно вы можете запустить sync
команда в командной строке, чтобы гарантировать, что все кэшированные данные записываются из ОС на жесткий диск. (Хотя на недорогих жестких дисках с встроенной оперативной памятью, которая не резервируется от батареи, это может привести к потере данных, находящихся в оперативной памяти на жестком диске при отключении питания).
- Создание файла и его содержимого происходит на разных этапах? (разрешение фазы, где существует файл с 0 байтами)
Да, копирование файла не является атомарной операцией, так как вы впервые вызываете open()
а потом write()
после... Открытие с O_CREAT
Режим создаст пустой файл, так что да: сначала пустой файл, который заполняется после.
- Возможно ли, что я "вижу" файл [имеется в виду, что мне удалось отследить "my_file.txt"], но на самом деле я вижу кэшированную версию, которой не будет после перезагрузки, если не будет вызвана синхронизация? и "не быть там" я имею в виду contens, так как сам файл остается
Да, именно то, что вы видели, является кэшированной версией предыдущих операций.
когда Linux сбрасывает файловые системы?
Общее правило состоит в том, что ядро сбрасывает вещи, когда оно хочет. Единственное, что вы можете сделать, это попросить промывку, но, увы, даже это просто вопрос, и это не значит, что промывка произошла, это просто означает, что промывка произойдет в ближайшее время. Соответствующая командная строка sync
,
Есть ли правило для файловых систем?
Вы можете смонтировать файловую систему, запрашивая, чтобы IO были сделаны в прямом режиме, или вы можете запросить ее для каждого файла отдельно (см. O_DIRECT
и так в open
). Но имейте в виду, что прямой режим обычно снижает производительность...
Если вы выключаете устройство во время работы с файлом в своем проекте, он может уничтожить ваш файл, потому что, например, вы хотите стереть документ вашего файла и снова записать в него. Я могу отключить устройство между этими двумя этапами и уничтожением файла,