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

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

16 голосов | спросил Gregg Leventhal 28 PMpMon, 28 Apr 2014 23:57:57 +040057Monday 2014, 23:57:57

3 ответа


21

Я думаю, вы получили это письмо в файл с помощью 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 отображает символы новой строки как $)

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

$ du testfile
4

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

Чтобы показать ls, вам нужно использовать -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
ответил Andreas Wiese 29 AMpTue, 29 Apr 2014 00:14:58 +040014Tuesday 2014, 00:14:58
9

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

  

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

Как показывают другие ответы, в принципе файл, созданный с двумя байтами, имеет длину два байта (show by 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) На самом деле это не дыра , это в конце ... но все же, это работает в конце примера.

ответил Rmano 29 AMpTue, 29 Apr 2014 00:42:19 +040042Tuesday 2014, 00:42:19
5

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

В приведенном выше 4 показан размер блока. Мы также можем проверить это же, используя команду 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-байтовые фрагменты.

ответил Ramesh 29 AMpTue, 29 Apr 2014 00:21:45 +040021Tuesday 2014, 00:21:45

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132