Мне интересно, как команда stat вычисляет блоки файла. Я прочитал article, он говорит:Как команда stat вычисляет блоки файла?
Значение st_blocks дает размер файла в 512-байтных блоках. (Это может быть меньше, чем st_size/512, например, когда файл имеет отверстия.) Значение st_blksize дает «предпочтительный» размер блока для эффективного ввода/вывода файловой системы. (Запись в файл в более мелких фрагментах может привести к неэффективной read-modify-rewrite.)
, но я не могу проверить его на своем тесте.
мой файловая система ext3.
в dumpe2fs -h/DEV/sda3 показывает:
...
First block: 0
Block size: 4096
Fragment size: 4096
...
тогда я бегу
[email protected]:~/Desktop$ stat Email
File: `Email'
Size: 965 Blocks: 8 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746095 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/ kent) Gid: (1000/ kent)
Access: 2009-08-11 21:36:36.000000000 +0200
Modify: 2009-08-11 21:36:35.000000000 +0200
Change: 2009-08-11 21:36:35.000000000 +0200
Если блоки здесь означает: сколько 512bytes блоков, число должно быть 2 не 8. Я подумал, что размер блока из файловой системы (io-блок) равен 4k. Если fs получит файл электронной почты, он будет извлекать минимальные 4k с диска (блоки размером 8 x 512 байтов), что означает 965/512 + 6 = 8. Я не уверен, правильна ли догадка.
еще одно испытание:
[email protected]:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
File: `wxPython-demo-2.8.10.1.tar.bz2'
Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746210 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/ kent) Gid: (1000/ kent)
Access: 2009-08-12 21:45:45.000000000 +0200
Modify: 2009-08-12 21:43:46.000000000 +0200
Change: 2009-08-12 21:43:46.000000000 +0200
3605257/512=7041.xx = 7042
после моей догадке выше, это будет 7042 + 6 = 7048. но результат стат показывает 7056.
И еще один пример из Интернета на http://www.computerhope.com/unix/stat.htm
. Я скопирую пример внизу страницы здесь:
File: `index.htm'
Size: 17137 Blocks: 40 IO Block: 8192 regular file
Device: 8h/8d Inode: 23161443 Links: 1
Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: (32/ www)
Access: 2007-04-03 09:20:18.000000000 -0600
Modify: 2007-04-01 23:13:05.000000000 -0600
Change: 2007-04-02 16:36:21.000000000 -0600
В этом примере размер блока FS равен 8k. Я полагаю, что число блоков должно быть 16xN, но 40. заблудились ...
кто может объяснить, как стат вычислят блоки?
Спасибо!
Согласен. 'st_blocks' называется только по историческим причинам. Не думайте об этом как о блоках, а как о количестве дискового пространства, используемого файлом, в единицах 512 байт. 512 байт - удобная единица, потому что это почти самая маленькая единица распределения, которую каждый использует. – mark4o
Спасибо за объяснение. почти ясно. , но все еще есть вопросы. Я не уверен, правильно ли это понимает: st_blocks = (размер блока ввода-вывода/512) * (сколько IO блокирует используемый файл). Пример электронной почты может быть объяснен следующим образом: (4096/512) * 1 = 8 wxpython один нет. потому что в файле использованы 881 IO-блоки и (4096/512) * 881 = 7048, а не 7056. и последний пример: 40 даже не может быть точно разделен на 16 (8192/512) .. - это «512 байт» для всей системы одинаково? спасибо – Kent