Что произойдет, если я выключу устройство перед "синхронизацией"?

У меня есть встроенное устройство (Linux + BusyBox), на котором я загрузил файл "my_file.txt", я использовал cat проверить содержание файла, и это было удовлетворительным. Затем я вытащил вилку и после перезагрузки увидел, что файл все еще там, но с размером 0 байт...

Может ли это быть вызвано несинхронной файловой системой? На самом деле это двусторонний вопрос:

  1. Создание файла и его содержимого происходит на разных этапах? (разрешение фазы, где существует файл с 0 байтами)
  2. Возможно ли, что я "вижу" файл [то есть мне удалось cat "my_file.txt" ], но то, что я на самом деле вижу, это кэшированная версия, которая не будет там после перезагрузки, если только sync будет называться? и "не быть там" я имею в виду contens, так как сам файл остается

Кстати, когда Linux сбрасывает файловые системы? я знаю это stdout например, сбрасывается (по умолчанию), когда "\n" введен [и может быть настроен как-то, не помню точно, как]. Есть ли правило для файловых систем?

3 ответа

Решение

Создание файла и его содержимого происходит на разных этапах? (допускается этап, на котором существует файл с 0 байтами)

Да. Обычная работа с файлами

  1. открыть / создать файл
  2. чтение / запись данных.
  3. закройте файл.

Возможно ли, что я "вижу" файл [имеется в виду, что мне удалось отследить "my_file.txt"], но на самом деле я вижу кэшированную версию, которой не будет после перезагрузки, если не будет вызвана синхронизация?

Да. Если вышеуказанный шаг 1 был синхронизирован с жестким диском, а шаг 2 - нет, вы потеряете содержимое файла.

Кстати, когда Linux сбрасывает файловые системы? Я знаю, что stdout, например, сбрасывается (по умолчанию), когда вводится "\n" [и может быть настроен как-то, не помню точно, как]. Есть ли правило для файловых систем?

Нет, общих правил нет - это сложно. ОС / ядро ​​и файловая система кэшируют данные в ОЗУ и записывают их на диск, когда внутренние алгоритмы выясняют, что сейчас подходящее время для этого.

Обратите внимание, что на многих уровнях есть флэш / синхронизация. Сброс, о котором вы говорите "когда вводится" \ n "", - это всего лишь сброс из программы в операционную систему. Затем операционная система может хранить данные только в оперативной памяти и позже записывать их на жесткий диск. Жесткий диск может даже кэшировать его в оперативной памяти на жестком диске и позже записать в постоянное хранилище.

Обычно вы можете запустить sync команда в командной строке, чтобы гарантировать, что все кэшированные данные записываются из ОС на жесткий диск. (Хотя на недорогих жестких дисках с встроенной оперативной памятью, которая не резервируется от батареи, это может привести к потере данных, находящихся в оперативной памяти на жестком диске при отключении питания).

  1. Создание файла и его содержимого происходит на разных этапах? (разрешение фазы, где существует файл с 0 байтами)

Да, копирование файла не является атомарной операцией, так как вы впервые вызываете open() а потом write() после... Открытие с O_CREAT Режим создаст пустой файл, так что да: сначала пустой файл, который заполняется после.

  1. Возможно ли, что я "вижу" файл [имеется в виду, что мне удалось отследить "my_file.txt"], но на самом деле я вижу кэшированную версию, которой не будет после перезагрузки, если не будет вызвана синхронизация? и "не быть там" я имею в виду contens, так как сам файл остается

Да, именно то, что вы видели, является кэшированной версией предыдущих операций.

когда Linux сбрасывает файловые системы?

Общее правило состоит в том, что ядро ​​сбрасывает вещи, когда оно хочет. Единственное, что вы можете сделать, это попросить промывку, но, увы, даже это просто вопрос, и это не значит, что промывка произошла, это просто означает, что промывка произойдет в ближайшее время. Соответствующая командная строка sync,

Есть ли правило для файловых систем?

Вы можете смонтировать файловую систему, запрашивая, чтобы IO были сделаны в прямом режиме, или вы можете запросить ее для каждого файла отдельно (см. O_DIRECT и так в open). Но имейте в виду, что прямой режим обычно снижает производительность...

Если вы выключаете устройство во время работы с файлом в своем проекте, он может уничтожить ваш файл, потому что, например, вы хотите стереть документ вашего файла и снова записать в него. Я могу отключить устройство между этими двумя этапами и уничтожением файла,

Другие вопросы по тегам