
У меня есть 115GB
раздел на жестком диске (вывод cgdisk /dev/sda
ниже):
Part. # Size Partition Type Partition Name
----------------------------------------------------------------
1007.0 KiB free space
1 499.0 MiB Windows RE Basi
2 100.0 MiB EFI System EFI
3 16.0 MiB Microsoft reserved Micr
5 43.9 GiB Linux filesystem ubuntu-root
6 43.9 GiB Linux filesystem ubuntu-home
4 114.9 GiB Linux filesystem data <--- this partition
7 29.5 GiB Linux filesystem
И я смонтировал этот раздел /data
в моем /etc/fstab
:
UUID=<drive-uuid> /data ext4 defaults 0 0
Когда я это делаю df -h /data
, я получаю следующий результат:
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 113G 96G 11G 90% /data
И когда я использую du
вот так: du /data -h --max-depth=1 | sort -hr
, я вижу это:
51G /data
40G /data/virtual-box
4.4G /data/temp
4.1G /data/manjaro-minikube
1.9G /data/.nuget
764M /data/OneDrive
62M /data/manjaro-lxd
40K /data/.minikube
16K /data/lost+found
который, если я не ошибаюсь, показывает, что /data
занимает 51G
и затем у меня есть каталоги virtual-box
, temp
, manjaro-minikube
, и .nuget
занимающие место (остальные не занимают значительного места)
Если я сделаю длинный список моего каталога ( ls -alh /data
):
total 68K
drwxr-xr-x 10 farzad farzad 4.0K Aug 13 21:47 .
drwxr-xr-x 19 root root 4.0K Jul 13 10:32 ..
drwx------ 2 farzad farzad 16K Mar 22 18:22 lost+found
drwx--x--x 15 root root 4.0K Aug 20 17:47 manjaro-lxd
drwxr-xr-x 3 farzad farzad 4.0K Jul 3 18:16 manjaro-minikube
drwxrwxr-x 9 farzad farzad 4.0K Jul 30 17:38 .minikube
drwxr-xr-x 202 farzad farzad 16K Aug 17 10:00 .nuget
drwxr-xr-x 3 farzad farzad 4.0K Aug 13 21:47 OneDrive
drwxrwxr-x 16 farzad farzad 4.0K Jun 3 21:45 temp
drwxr-xr-x 6 farzad farzad 4.0K Aug 20 20:21 virtual-box
Я не вижу никаких файлов или чего-либо, что способствовало бы этому 51G
, /data
поэтому я ожидаю, что на моем диске будет почти 65G
пустое место, но по какой-то причине /data
родительский каталог занимает 51G
все свое место!
Я пытался исследовать Интернет, но ничего не нашел. Может кто-нибудь, пожалуйста, дайте мне знать, что происходит?
ОБНОВЛЯТЬ
Как и предлагалось в ответах, я запустил lsof /data | grep deleted
(как root), но не получил никакого результата, хотя и вижу предупреждение, которое, я не уверен, имеет отношение к делу:
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
решение1
Ваш /data
занимает 51G
. Это включает все подкаталоги и файлы внутри него. Если вы добавите размеры, сообщенные du
для подкаталогов (и учтете проблемы округления), вы получите около 51G
. Если бы были обычные файлы непосредственно в , они бы также /data
внесли вклад в значение, сообщенное для ./data
Так что du
не сообщает о высоком использовании. Это df
то, что сообщает о высоком использовании: 96G
используется в файловой системе.
Поскольку /data
это точка монтирования, можно ожидать, что эти два значения будут одинаковыми. Но эти два инструмента работают по-разному: du
обходят каталоги и добавляют размеры обнаруженных объектов, df
запрашивают файловую систему о ее знаниях о собственном состоянии.
Такое большое расхождение может быть вызвано следующими причинами:
du
не смог добраться (или получить информацию о) всех объектах. Была ли какая-тоpermission denied
ошибка?- В файловой системе есть несоответствия;
fsck.ext4
этоe2fsck
может помочь. (вероятно) Есть по крайней мере один файл, который был удален (все записи каталога, указывающие на соответствующий inode, были удалены, файл не отображается ни в одном списке каталогов, поэтому
du
не может знать о нем), но он все еще используется каким-то процессом (поэтому файловая система сохраняет данные и учитывает их при отправке отчетов вdf
). Смотритеэтот ответ,этот вопрос.Следующая команда должна найти такие файлы и процессы, их использующие:
lsof /data | grep deleted
Пример вывода:
some_daemon … … … … … … … /data/temp/huge_file (deleted)
Это означает, что файловая система действительно удалит
huge_file
только после того, какsome_daemon
прекратит ее использовать. Обратите внимание, что в целом процесс все еще может добавлять к файлу или обрезать его, поэтому файл может увеличиваться или уменьшаться. Это повлияет на то, чтоdf
говорит, но не наdu
.
решение2
Итак, оказалось, что здесь было несколько проблем (спасибо @Kamil за помощь в их обнаружении):
Хотя изначально я интуитивно предполагал, что сумма, выдаваемая du
for, /data
представляет собой сумму всех его дочерних каталогов (с некоторым округлением), полагаю, я пытался оправдать расхождения между df
и du
и подумал, что мне следует суммировать du
вывод for /data
и всех его дочерних каталогов, чтобы получить тот же результат, что и df
.
Другая проблема, которая является основной причиной расхождений, была связана с тем, как я настроил свой /etc/fstab
:
UUID=<uuid> /data ext4 defaults 0 0
^
ISSUE
Когда я создавал свой /etc/fstab
, я думал, что мне не придется продлевать загрузку, включив проверки файловой системы ( fsck
) на моем монтировании, отсюда 0
и шестое поле, но, как оказалось, это приводило к тому, что иноды не очищались, что и приводило к БОЛЬШОЙ разнице между df
и du
.
Итак, глядя на man 5 fstab
, мы видим, что для включения проверок корневая файловая система должна иметь значение 1
, а другие файловые системы должны иметь значение 2
, поэтому я изменил строку следующим образом:
UUID=<uuid> /data ext4 defaults 0 2
И после перезапуска было сообщено о множестве проблем fsck
, я решил их исправить, и вот вывод du /data -h --max-depth=1 | sort -hr
:
28G /data
16G /data/virtual-box
4.5G /data/temp
4.1G /data/manjaro-minikube
1.9G /data/.nuget
824M /data/OneDrive
64M /data/manjaro-lxd
40K /data/.minikube
16K /data/lost+found
И вывод df /data -h
:
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 113G 28G 80G 26% /data
Стоит отметить, что по сравнению с моим первоначальным вопросом я удалил несколько файлов (отсюда и 28G
использование вместо 51G
), но хорошо то, что и и du
сообщают df
одно и то же значение :)
решение3
Ваша команда сортирует результаты от большего к меньшему. Наибольшее значение — этообщийпространство, используемое /data
, а не пространство, которое он использовал сам по себе.