Какие файловые системы повторно используют неизменные блоки данных при записи?

370
lash

Допустим, я открываю и читаю существующий файл Nблоков где N > 1.

Затем я меняю данные, которые находятся в границах одного - 1 - блока.

При обратной записи фактических данных может произойти одно из следующих действий:

  1. N блоки перезаписываются
  2. 1 блок перезаписывается
  3. x блоки перезаписываются, где N > x > 1

В широко используемых файловых системах есть примеры каждого из них и какими они будут?

-1
В основном вариант 2. Но он может варьироваться от случая к случаю, даже на одном и том же томе, файле и измененном блоке данных. Akina 6 лет назад 0
4. ничего не перезаписывается, 1 новый блок размещается в другом месте и подключается к файлу вместо оригинала (например, btrfs) jakub_d 6 лет назад 1
Другая возможность: приложение пишет в новый файл. См. [Этот ответ] (https://unix.stackexchange.com/a/75570/108618). Kamil Maciorowski 6 лет назад 1
список файловых систем, которые не перезаписывают содержимое, см. в предупреждении в [man shred] (https://linux.die.net/man/1/shred). jakub_d 6 лет назад 0
Во многих случаях дело за программистом. В C вы открываете файл в режиме APPEND, который переходит к концу файла, и неизмененные блоки не затрагиваются. Вы также можете открыть файл в двоичном режиме и использовать команду поиска, чтобы перейти в точное место, где должны быть записаны данные. Однако на аппаратном уровне должен быть записан минимум 1 сектор, поэтому при изменении 1 байта остальные 511 могут быть перезаписаны. Кроме того, я считаю, что SSD используют 4k блоков в фоновом режиме (ниже уровня сектора) из-за соображений эффективности. Аппаратные контроллеры могут иметь больше оптимизаций. cybernard 6 лет назад 0
Тем не менее, программа может предпочесть не просто переписывать измененные части, потому что это занимает намного больше кода. Затем выгрузка всего файла обратно на диск. Однако возможна дальнейшая оптимизация оборудования внутри контроллера жесткого диска, чтобы минимизировать ненужную перезапись данных. cybernard 6 лет назад 0

1 ответ на вопрос

1
Austin Hemmelgarn

Предполагая, что вы касаетесь только одного блока, тогда либо этот блок будет перезаписан, либо блоки не будут перезаписаны.

Первая ситуация имеет место в подавляющем большинстве широко используемых сегодня файловых систем, а также почти во всех исторических файловых системах. Примеры включают NTFS, FAT, ext4, XFS, HFS, HFS + и UFS. По сути, это самый простой вариант, и все недостатки хорошо известны и довольно просты для понимания.

Вторая ситуация - это то, что делают некоторые более новые файловые системы. Примечательно, что BTRFS, ZFS, NILFS2, F2FS и, я полагаю, ReFS и APFS делают это (и почтенную архивную файловую систему Fossil из Plan 9 From Bell Labs, которая, я полагаю, могла бы первой сделать это). То, как они работают, немного отличается. Вместо того, чтобы напрямую перезаписывать существующий блок, они записывают в новый, в настоящее время неиспользованный, один, а затем обновляют метаданные файла, чтобы вместо этого указывать на эту новую копию, и освобождают старый. Это немного сложнее, но это гарантирует, что запись происходит или не происходит, вместо того, чтобы оставить возможность того, что она может быть выполнена только частично.

Однако, как только вы закончите работать только с одним этим блоком, это будет сложно. В зависимости от системы у вас могут быть или не быть новые выделения блоков для записи. У вас также могут быть новые блоки, выделенные из-за поведения приложения вместо файловой системы. Во многих UNIX-подобных системах довольно часто приложение записывает измененную версию файла, которую оно обновляет, во временный файл, а затем заменяет старую, переименовывая временный файл, потому что это гарантирует, что обновление произойдет или не произойдет. «т.

Похожие вопросы