#linux #amazon-ec2 #amazon-linux #linux-disk-free
Вопрос:
когда я пишу df -h
в своем экземпляре, я получаю эти данные:
Filesystem Size Used Avail Use% Mounted on devtmpfs 7.7G 0 7.7G 0% /dev tmpfs 7.7G 0 7.7G 0% /dev/shm tmpfs 7.7G 408K 7.7G 1% /run tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup /dev/nvme0n1p1 32G 24G 8.5G 74% / tmpfs 1.6G 0 1.6G 0% /run/user/1000
но когда я нажимаю sudo du -sh /
, я получаю:
11G /
Итак df -h
, /
размер 24 г, но в du -sh
том же каталоге размер 11 г. Я пытаюсь освободить немного места на своем экземпляре и не могу найти файлы, которые вызывают это. Чего мне не хватает? неужели df -h
это действительно предоставление поддельных данных?
Ответ №1:
Этот вопрос возникает довольно часто. Файловая система выделяет дисковые блоки в файловой системе для записи своих данных. Эти данные называются метаданными, которые не видны большинству программ пользовательского уровня (таких как du). Примерами метаданных являются индексы, карты дисков, косвенные блоки и суперблоки.
Команда du-это программа пользовательского уровня, которая не знает метаданных файловой системы, в то время как df просматривает карты распределения дисков файловой системы и знает метаданные файловой системы. df получает истинную статистику файловой системы, в то время как du видит только частичную картину.
Существует множество причин, по которым различается используемое или доступное дисковое пространство при выполнении команд du или df.
Пожалуй, наиболее распространенными являются удаленные файлы. Удаленные файлы все еще могут быть открыты по крайней мере одним процессом. Запись для таких файлов удаляется из соответствующего каталога, что делает файл недоступным. Поэтому команда du, которая подсчитывает только файлы, не учитывает эти файлы и выдает меньшее значение. Однако до тех пор, пока процесс все еще использует удаленный файл, связанные блоки еще не освобождены в файловой системе, поэтому df, работающий на уровне ядра, правильно отображает их как занятые. Вы можете выяснить, так ли это, выполнив следующие действия:
lsof | grep '(deleted)'
Решение этой проблемы может заключаться в перезапуске служб, в которых все еще открыты эти удаленные файлы.
Вторая наиболее распространенная причина заключается в том, что у вас есть раздел или диск, смонтированный поверх каталога с тем же именем. Например, если у вас есть каталог под / под названием backup, который содержит данные, а затем вы монтируете новый диск поверх этого каталога и помечаете его /backup, но он не содержит данных, то используемое пространство будет отображаться с помощью команды df, даже если команда du не показывает файлов.
Чтобы определить, есть ли какие-либо файлы или каталоги, скрытые под активной точкой монтирования, вы можете попробовать использовать привязку для монтирования вашей / файловой системы, которая позволит мне проверять под другими точками монтирования. Обратите внимание, что это рекомендуется только для опытных системных администраторов.
mkdir /tmp/tmpmnt mount -o bind //tmp/tmpmnt du /tmp/tmpmnt
После того, как вы подтвердите, что это проблема, крепление привязки можно удалить, выполнив:
umount /tmp/tmpmnt/ rmdir /tmp/tmpmnt
Другой возможной причиной может быть повреждение файловой системы. Если вы подозреваете это, пожалуйста, убедитесь, что у вас есть хорошие резервные копии, и в удобное для вас время, пожалуйста, отключите файловую систему и запустите fsck.
Опять же, это должны делать опытные системные администраторы.
Вы также можете проверить расчет, выполнив:
strace -e statfs df /
Это даст вам результат, аналогичный:
statfs("/", {f_type=XFS_SB_MAGIC, f_bsize=4096, f_blocks=20968699, f_bfree=17420469, f_bavail=17420469, f_files=41942464, f_ffree=41509188, f_fsid={val=[64769, 0]}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0 Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda1 83874796 14192920 69681876 17% / exited with 0
Обратите внимание на разницу между f_bfree и f_bavail? Это свободные блоки в файловой системе и бесплатные блоки, доступные непривилегированному пользователю. Используемый столбец-это просто расчет между ними.
Надеюсь, это прояснит вашу идею. Дайте мне знать, если у вас все еще есть какие-либо сомнения.
Комментарии:
1. Прежде всего, большое вам спасибо за ваш подробный ответ. Во-вторых, я просто пытаюсь понять, что моя файловая система монтируется на » / «и использует 75% моего хранилища, мои файлы журналов и все, что я могу «видеть», составляют 34%, я просмотрел то, что вы написали, но ни один из них на самом деле не помогает мне решить, где я могу найти недостающий 41% хранилища, просто хочу очистить систему.
2. Хорошо, простой способ проверить хранение и удалить файлы и папки из вашей системы с помощью терминала — это ncdu, просто введите «sudo apt install ncdu-y», а затем введите «ncdu/», и вы получите данные для хранения.
3. Если вы хотите, я могу добавить еще один ответ, опубликовав решение для этого.
4. когда я запускаю команду «ncdu», она по-прежнему показывает мне только 11G вместо того, чтобы показывать все 25G, которые в usgae
5. как я уже сказал, только команда df предоставит вам данные в реальном времени. Не верьте в эти данные.