Linux

Команда df в Linux не показывает правильное свободное пространство после удаления файла

У меня есть файловые серверы, которые используются для хранения файлов. Файлы могут храниться там неделю или год. К сожалению, когда я удаляю файлы с сервера, команда df не отражает освободившееся место. В итоге сервер заполняется (df показывает 99%), и мой скрипт больше не отправляет туда файлы, хотя там может быть несколько десятков ГБ свободного места. У меня есть флаг «noatime» на смонтированных разделах, если это имеет какое-то значение.

 

Ответ 1

Удаление файла не освободит место, пока вы не удалите процессы, у которых есть открытые дескрипторы к этому файлу. Тем не менее вы можете освободить место, не завершая процессы. Все, что вам нужно сделать, это удалить дескрипторы файлов. Сначала выполните команду lsof | grep deleted, чтобы определить процесс, в котором находится файл:

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted

java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

 Затем выполните:

cd /proc/PID/fd

 И в итоге:

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted

total 0

l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

 «1» будет дескриптором файла. Теперь введите «> FD», чтобы освободить это место.

> 1

 Вам может потребоваться повторить операцию, если файл находится в других процессах.

 

Ответ 2

Одна из возможностей заключается в том, что удаленный файл (файлы) имеет больше ссылок в файловой системе. Если вы создали жесткие ссылки, несколько имен файлов будут указывать на одни и те же данные, и данные (фактическое содержимое) не будут помечены как свободные/используемые, пока все ссылки на них не будут удалены. Прежде чем удалять файлы, либо просмотрите их (Entry с именем Links), либо сделайте ls -l (должен быть второй столбец).

Если окажется, что на файлы есть ссылки в других местах, я полагаю, вам придется выполнить ls -i для файла(ов), чтобы найти номер inode, а затем выполнить find с -inum <номер inode>, чтобы найти другие ссылки на этот файл (вероятно, вы также захотите использовать -mount, чтобы оставаться в пределах одной файловой системы).

 

Ответ 3

Если вы удаляете файл, а место не освобождается, это обычно связано либо с тем, что файл все еще открыт, либо с наличием других жестких ссылок на него.

Чтобы помочь в устранении неполадок, используйте инструмент, который подскажет вам, куда расходуется место на диске; для этого вы можете использовать du. Еще лучше использовать графический инструмент xdiskusage (их много) для поиска решения. xdiskusage и другие инструменты позволяют просмотреть самые большие «засорители» пространства и найти, куда уходит место.

Таким образом, вы быстро найдете файлы, которые все еще занимают место из-за второй жесткой ссылки. Он также покажет место, занятое удаленными, но открытыми файлами (как permission denied, я полагаю, поскольку он не сможет прочитать имя файла).

 

Ответ 4

Одна из причин нехватки дискового пространства (сценарий, с которым я только что столкнулся сам, потому что я, очевидно, не сделал то, что обычно делаю при создании нового массива), заключается в следующем... Обычно я освобождаю все доступное дисковое пространство, а также 5%, зарезервированные для root (tune2fs -m0), поскольку это однопользовательская файловая серверная система. Однако внезапно я получил отсутствие свободных байт, согласно df, но разница между общим и используемым пространством говорила о другом.

Поскольку я был уверен, что освободил те 5%, которые зарезервированы по умолчанию в Fedora (и имел несколько пустых папок вместо файлов, которые я только что скопировал... или думал, что скопировал), я начал отчаянно искать способ решить эту проблему, перезагружаясь, пробуя «lsof» и тому подобные вещи.

Затем наконец я решил запустить tune2fs -m0 на файловой системе, хотя я был уверен, что причина не в этом но она была! Чуть больше 400 ГБ стало доступно, как и должно быть. Да, я знаю... моя ошибка, но тем не менее мой ответ может оказаться полезным для других, кто забыл об этом зарезервированном пространстве или твердо уверен, что освободил его.

 

Ответ 5

Если раздел был настроен на резервирование определенной части дискового пространства только для корневого использования, df не будет включать это пространство как доступное.

[root@server]# df -h

Filesystem            Size  Used Avail Use% Mounted on

...

/dev/optvol           625G  607G     0 100% /opt

Даже после того как место будет восстановлено путем удаления файлов/каталогов, пользователь не root не сможет записывать на определенный раздел.

Вы можете легко проверить, так ли это в вашем случае, попробовав создать файл на устройстве от имени пользователя root и от имени пользователя non-root.

Кроме того, вы можете проверить конфигурацию файловой системы, выполнив команду:

tune2fs -l <device> | egrep "Block count|Reserved block count

и вычислить фактический % самостоятельно. Чтобы изменить % диска, зарезервированного для использования только root, выполните команду:

tune2fs -m <percentage> <device>

 

Схожие статьи

Linux

Как узнать максимальное количество потоков на процесс в Linux?

Linux

Стоит ли блокировать ICMP?

Linux

Как работают макросы likely/unlikely в ядре Linux и в чем их преимущество

Linux

Как предотвратить случайное использование rm -rf ?