Размер () vs ls -la vs du -h какой из них правильный размер?
Я собирал собственное ядро и хотел проверить размер файла изображения. Вот результаты:
ls -la | grep vmlinux
-rwxr-xr-x 1 root root 8167158 May 21 12:14 vmlinux
du -h vmlinux
3.8M vmlinux
size vmlinux
text data bss dec hex filename
2221248 676148 544768 3442164 3485f4 vmlinux
Поскольку все они имеют разные размеры, какой из них ближе всего к реальному размеру изображения? Почему они разные?
3 ответа
Они все правильные, они просто показывают разные размеры.
ls
показывает размер файла (когда вы откроете и прочитаете его, вот сколько вы получите байт)du
показывает фактическое использование диска, которое может быть меньше размера файла из-за дырsize
показывает размер образа времени выполнения объекта / исполняемого файла, который не имеет прямого отношения к размеру файла (bss не использует байтов в файле независимо от его размера, файл может содержать отладочную информацию, которая не является частью образа времени выполнения, так далее.)
Если вы хотите знать, сколько ОЗУ / ПЗУ займет исполняемый файл, исключая динамическое выделение памяти, size
дает вам необходимую информацию.
Необходимо понять два определения
1 время выполнения и время хранения (вот почему size
отличается)
2 глубина файла и каталог (вот почему du
отличается)
Посмотрите на пример ниже:
[root@localhost test]# ls -l
total 36
-rw-r--r-- 1 root root 712 May 12 19:50 a.c
-rw-r--r-- 1 root root 3561 May 12 19:42 a.h
-rwxr-xr-x 1 root root 71624 May 12 19:50 a.out
-rw-r--r-- 1 root root 1403 May 8 00:15 b.c
-rw-r--r-- 1 root root 1403 May 8 00:15 c.c
[root@localhost test]# du -abch --max-depth=1
1.4K ./b.c
1.4K ./c.c
3.5K ./a.h
712 ./a.c
70K ./a.out
81K .
81K total
[root@localhost test]# ls -l
total 36
-rw-r--r-- 1 root root 712 May 12 19:50 a.c
-rw-r--r-- 1 root root 3561 May 12 19:42 a.h
-rwxr-xr-x 1 root root 71624 May 12 19:50 a.out
-rw-r--r-- 1 root root 1403 May 8 00:15 b.c
-rw-r--r-- 1 root root 1403 May 8 00:15 c.c
[root@localhost test]# size a.out
text data bss dec hex filename
3655 640 16 4311 10d7 a.out
При использовании size
не на исполняемом файле, ОС сообщит об ошибке.
Эмпирически различия чаще всего возникают для разреженных файлов и для сжатых файлов и могут быть в обоих направлениях.
- du <ls
Разреженные файлы содержат метаданные о пространстве, необходимом для приложения, которые ls читает и применяет для своего результата, а du - нет. Например:
truncate -s 1m test.dat
создает разреженный файл, полностью состоящий из нулей, без использования диска, т.е. du показывает 0, а ls показывает 1M.
- du> ls
С другой стороны, du может указывать, как и в вашем случае, файлы, которые могут занимать много места на диске (т. Е. Они распределяются по множеству блоков), но не все блоки заполнены, т. Е. Их размер в байтах (измеряемый ls) равен меньше du (если посмотреть на занятые блоки). Я наблюдал это довольно заметно, например, для некоторых файлов рассола python.