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


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

я получил noatime флаг на смонтированных разделах, если это имеет значение.


98
2018-02-08 07:36


Источник


Это происходит на одном разделе или на всех разделах? - Khaled
Ну, это происходит на моем основном разделе данных, который является единственным, о котором я забочусь, поскольку я только пишу / удаляю файлы на него.
Пожалуйста, просветите меня с помощью решения или ссылки на него.
Какая файловая система (ы)? DF делает стат суперблока, возможно, ваша файловая система не обновляет inb inode. Вы пытались очистить кеш? - beans
Использование ext4. Как вы очищаете кеши?


Ответы:


Удаление имени файла фактически не удаляет файл. Некоторый другой процесс держит файл открытым, заставляя его не удаляться; перезапустить или убить этот процесс, чтобы выпустить файл.

использование

lsof +L1

чтобы узнать, какой процесс использует удаленный (несвязанный) файл.


167
2018-02-08 07:48



Удаленные файлы не были доступны через месяц, и единственный процесс, который обращается к ним, - nginx, поэтому он сомнительный.
+1. Кроме того, «lsof + L1» сообщит вам, какая программа держит файлы открытыми. - pehrs
как root-файл «lsof -n | grep», вы будете удивлены тем, как долго файлы могут зависеть из-за того, что процессы не открывают их по какой-либо причине. Если все остальное терпит неудачу, перезагрузитесь, я чувствую себя плохо, предлагая это, но он обязательно убедится, что ничего не держит в файл. По словам, lsof + L1, вероятно, лучший путь. - ScottZ
Это возвращает один файл, который закодирован с помощью ffmpeg.
Ты просто спас меня! Удалил файл журнала 93G и не получил пространство назад и не смог понять, почему. Благодарю. - Luke Cousins


как упоминает Игнасио, удаление файла не освободит пространство, пока вы не удалите процессы, у которых есть открытые дескрипторы этого файла.

Тем не менее, вы можете вернуть пространство, не убивая процессы. Все, что вам нужно сделать, это удалить дескрипторы файлов.

Сначала выполните lsof | grep удален для идентификации процесса, содержащего файл

[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

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


20
2018-02-07 01:24



что это > FD делать? - Pred
он удаляет дескриптор файла - Adrián Deccico
Является ли это > команда имеет имя? Мне пришлось переключиться с zsh на bash, чтобы иметь возможность использовать его. Можно ли запустить его на zsh? - ariera
это перенаправление вывода и, следовательно, обрезает файл. Длиной будет «echo -n> 1» или «true> 1». Это действительно не удаляет FD, после этого он просто указывает на пустой файл. - eckes


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

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


8
2018-02-08 10:01





Файл по-прежнему заблокирован процессом, открывающим его. Чтобы освободить место, выполните следующие действия:

  1. Бег sudo lsof | grep deleted и посмотрите, какой процесс хранит файл. Пример результата:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Убейте процесс, используя sudo kill -9 {PID}, В вышеприведенном образце ПИД составляет 1623.

    $ sudo kill -9 1623
    
  3. Бег df чтобы проверить, освобождено ли пространство. Если он по-прежнему заполнен, возможно, вам нужно подождать несколько секунд и снова проверить.


2
2018-02-16 05:31





Если раздел настроен на резервирование определенной части дискового пространства только для использования root, 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>

2
2018-05-08 10:31





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

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

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


1
2018-02-08 10:11





Поскольку я знаю, что тонна вы делаете это для redhat в /var и gzipping файлы, ожидающие сокращения FS, но вместо этого он растет, просто убедитесь, что вы перезапускаете службу syslog. а также

lsof -v file

это покажет вам это.


1
2018-03-23 15:02



На самом деле это не очень много; принятый ответ охватывал логику этого в 2001 году. Когда у вас есть 50 представителей, используйте комментарии, если вы хотите добавить квалификаторы к существующим ответам. - Andrew B


Еще один вариант: диск может быть заполнен из-за процесса, который постоянно создает данные: журналы, ядра и т. П. Возможно, что пространство фактически освобождается, но сразу же заполняется. Я действительно видел такой случай. df в этом случае просто не дает изображение отверстия. использование du Узнать больше.


0
2017-07-17 12:01





Я использую EXT2, FSCK помог мне в этой ситуации. Попробуйте shudown -F теперь, после некоторых перезапусков и fscks, я вижу половину используемого пространства.


0
2018-01-16 09:00



Дорогой Марцелл, ваше решение охвачено принятым ответом; и иногда вы не хотите перезагружаться, если вас не принуждают ... - Deer Hunter