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

Как быстро скопировать большое количество файлов между двумя серверами

Linux

Как предоставить доступ нескольким системным администраторам Linux, работающим от имени пользователя root?

Linux

Как объединить две статические библиотеки «ar» в одну

×