Размер () 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.

Другие вопросы по тегам