К моему серверу подключен том объемом 130 ГБ.
Чтобы проверить свободное место на диске, я запускаю df -h -x tmpfs -x squashfs | grep -v /run/shared
и получаю:
Filesystem Size Used Avail Use% Mounted on
udev 965M 0 965M 0% /dev
/dev/xvda1 128G 111G 13G 90% /
Однако, когда я хочу получить подробную информацию об использовании диска, запустив команду ncdu
в корневом каталоге, я получаю:
. 55,7 GiB [######### ] /home
. 24,0 GiB [#### ] /var
. 2,4 GiB [ ] /usr
1,0 GiB [ ] swapfile
598,6 MiB [ ] /lib
63,0 MiB [ ] /boot
9,4 MiB [ ] /sbin
9,1 MiB [ ] /bin
. 8,1 MiB [ ] /etc
. 4,3 MiB [ ] /tmp
. 2,7 MiB [ ] /run
! 24,0 KiB [ ] /root
! 16,0 KiB [ ] /lost+found
4,0 KiB [ ] /lib64
e 4,0 KiB [ ] /opt
e 4,0 KiB [ ] /mnt
e 4,0 KiB [ ] /media
! 4,0 KiB [ ] /gandi
. 0,0 B [ ] /proc
. 0,0 B [ ] /sys
0,0 B [ ] /dev
@ 0,0 B [ ] initrd.img.old
@ 0,0 B [ ] initrd.img
@ 0,0 B [ ] vmlinuz.old
@ 0,0 B [ ] vmlinuz
e 0,0 B [ ] /srv
Разница составляет около 27 ГБ по сравнению со свободным местом на диске, возвращенным предыдущей командой (111 ГБ).
Откуда взялась эта разница?
Спасибо.
решение1
Этот вопрос возникает довольно часто. Короткий ответ — du
и df
использовать разные методы для получения данных.
Файловая система выделяет дисковые блоки в файловой системе для записи своих данных. Эти данные называются метаданными, которые не видны большинству программ уровня пользователя (таких как du). Примерами метаданных являются inodes, disk maps, indirect blocks и superblocks.
Theдуcommand — это программа пользовательского уровня, которая не знает метаданных файловой системы, в то время как df просматривает карты распределения дискового пространства файловой системы и знает метаданные файловой системы. дфполучает истинную статистику файловой системы, тогда как du видит только частичную картину.