EXT3: Если размер блока равен 4K, почему ls -l показывает размеры файлов ниже этого?

Если вы запустите ls -l в файле, который содержит одну букву, он будет отображаться как размер 2B. Если ваша файловая система находится в 4k блоках, я думал, что округленные файлы до размера блока? Это потому, что ls -l действительно считывает количество байтов из inode? В каких обстоятельствах вы можете округлить, чтобы блокировать ответы против фактических ответов счетчика байтов в Linux 2.6. Ядро GNU utils?

Я думаю, вы получили это письмо в файл с echo a > file или vim file , а это значит, что у вас будет эта буква и дополнительная строка в ней (два символа, а значит, и два байта). ls -l показывает размер файла в байтах, а не в блоках (более конкретно: длина файла):

 $ echo a > testfile $ ls -l testfile -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile $ cat -A testfile a$ 

(обратите внимание, что cat -A отображает символы новой строки как $ character)

В отличие от ls -l , du покажет реальный размер, занимаемый на диске:

 $ du testfile 4 

(на самом деле, du показывает размер в единицах 1kiB, поэтому здесь размер составляет 4 × 1024 байта = 4096 байтов = 4 kiB, что является размером блока в этой файловой системе)

Чтобы показать это, вам придется использовать опцию -s вместо / в дополнение к -l :

 $ ls -ls testfile 4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile 

Первый столбец – это выделенный размер, снова в единицах 1kiB. Последнее можно изменить, указав --block-size , например

 $ ls -ls --block-size=1 testfile 4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile 

Я думаю, что глубокий ответ таков:

Логическая длина файла и занимаемое пространство на диске – это действительно разные вещи.

Как показывают другие ответы, в принципе файл, созданный с двумя байтами, имеет длину два байта (показать ls -l ) и занимает 4 KiB (показывается du или ls -ls ).

Видеть:

 1& [:~/tmp] % echo -n A > test 1& [:~/tmp] % ls -l test -rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test 1& [:~/tmp] % du test 4 test 

Хорошо, test имеет длину 1 и размер (на диске) 4 KiB. Но:

 1& [:~/tmp] % truncate -s +8191 test 1& [:~/tmp] % ls -l test -rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test 1& [:~/tmp] % du test 4 test 

(первая команда добавляет 8191 нулевых байтов для test ), теперь тест имеет длину 8192, но все еще занимает 4 KiB на диске (в нем есть «отверстие») (1).

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

Примечания:

(1) На самом деле это не дыра , это в конце … но все же, это работает до конца примера.

ls -l – это просто длинный формат. ls -ls используется для отображения размера блока.

тестирование

 echo "1" > 1.txt bash-3.2$ ls -l 1.txt -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt 

Как мы видим, размер файла указан как 2B. Однако, если вам нужно проверить размер блока, вам нужно выполнить команду ниже.

 bash-3.2$ ls -ls 1.txt 4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt 

На приведенном выше рисунке показан размер блока. Мы также можем проверить это же, используя команду stat .

 bash-3.2$ stat 1.txt File: `1.txt' Size: 2 Blocks: 8 IO Block: 4096 regular file Device: 805h/2053d Inode: 48267720 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 505/ ramesh) Gid: ( 508/ ramesh) Access: 2014-04-28 15:17:31.000000000 -0500 Modify: 2014-04-28 15:15:58.000000000 -0500 Change: 2014-04-28 15:15:58.000000000 -0500 

Теперь возникает вопрос, почему ls -ls перечисляет размер блока как 4, в то время как stat отображает размер блока как 8. Причина этого поведения четко объясняется в ответе здесь .

На многих дисках размер сектора составляет 512 байт, что означает, что любое чтение или запись на диске передает целый 512-байтовый сектор за раз. Естественно разрабатывать файловые системы, где сектор не разделяется между файлами (что усложняло бы дизайн и ухудшало бы производительность); поэтому файловые системы обычно используют 512-байтовые фрагменты для файлов. Следовательно, традиционные утилиты, такие как ls и du указывают размеры в единицах 512-байтовых кусков.