Разница между записью файла из / dev / zero и усечением

Я повторяю то, что я сказал в вопросе на github: вероятно, вы находитесь не в виртуальной папке, когда пытаетесь поставить метку. Тегирование работает только в виртуальной папке, поэтому оно не сработает в =INBOX, но будет успешным в tag:inbox.

2
12.05.2019, 08:25
1 ответ
  1. duне показывает размер в байтах, но (в этом случае )1024 -байт -блоков. Так что цифры на самом деле идентичны(264084 * 1024 = 270422016)

  2. truncateсоздает разреженный файл при условии, что файловая система поддерживает такие вещи

  3. /dev/zeroна самом деле создает бесконечные \0байты, которые затем записываются в файл, а запись нулей занимает место, как и запись любого другого содержимого. Другим способом создания файла, который занимает место без фактической записи нулей , является использование fallocate.

Вы можете использовать filefragдля получения дополнительной информации о таких файлах.

$ timeout 1 cat /dev/zero > file1
$ truncate -s 270422016 file2
$ fallocate -l 270422016 file3
$ filefrag -e file1 file2 file3

Файл 1(cat /dev/zero)полностью написан, а также оказался при этом фрагментированным:

Filesystem type is: 58465342
File size of file1 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    8175:    9983740..   9991915:   8176:            
   1:     8176..   32751:   11049359..  11073934:  24576:    9991916:
   2:    32752..   54271:   11193265..  11214784:  21520:   11073935:
   3:    54272..   62191:   11182601..  11190520:   7920:   11214785:
   4:    62192..   70383:   11214785..  11222976:   8192:   11190521: last,eof
file1: 5 extents found

Фрагментация зависит от того, сколько есть свободного места и откуда файловая система решила начать запись в файл, не зная, насколько большим он окажется в итоге.


Файл 2(truncate)— это просто пустая оболочка, для него вообще не зарезервировано места, его размер просто указывается метаданными, а не физическими экстентами.

File size of file2 is 270422016 (66021 blocks of 4096 bytes)
file2: 0 extents found

Файл 3(fallocate)выделен, но помечен как незаписанный. Таким образом, для него зарезервировано физическое пространство, и оно даже не фрагментировано (, так как файловой системе был заранее сообщен размер ). Чтение этого файла приведет к появлению нулей, хотя физически по этому адресу могут храниться другие данные. Это связано с тем, что мгновенное выделение файлов просто резервирует место, но не перезаписывает данные на диске.

File size of file3 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   66020:   10983338..  11049358:  66021:             last,unwritten,eof
file3: 1 extent found
4
27.01.2020, 22:02

Теги

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