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

144

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

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

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

Ответы:

237

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

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

lsof +L1

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

Игнасио Васкес-Абрамс
источник
2
К удаленным файлам не обращались более месяца, и единственный процесс, который обращается к ним, - это nginx, так что это сомнительно.
40
+1. Кроме того, «lsof + L1» скажет вам, какая программа держит файлы открытыми.
pehrs
4
Запустив от имени root команду «lsof -n | grep file», вы будете удивлены тем, как долго файлы могут задерживаться из-за процессов, которые по какой-то причине поддерживают их открытыми. Если ничего не помогает, перезагрузите компьютер, я чувствую себя плохо, предлагая это, но он определенно удостоверится, что ничто не держит файл. С другой стороны, lsof + L1, вероятно, лучший путь.
ScottZ
3
Вы только что спасли меня! Удалил файл журнала 93G, не вернул место и не мог понять почему. Благодарю.
Люк Казинс
1
В том же духе, и в случае, если это поможет другим, я удалил большой файл nginx access.log, но смог освободить место только после перезапуска nginx: service nginx restart
Ник
28

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

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

Сначала выполните 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

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

Адриан Декчико
источник
1
что делает > FD?
Пред
удаляет дескриптор файла
Adrián Deccico
2
у этой >команды есть имя? Мне пришлось переключиться с Zsh на Bash, чтобы иметь возможность использовать его. Можно ли запустить его на Zsh?
ariera
1
это перенаправление вывода и, следовательно, усечение файла. Длинна from будет "echo -n> 1" или "true> 1". Он не удаляет FD, а просто указывает на пустой файл.
Eckes
8

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

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

Кжетил Йоргенсен
источник
4

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

  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}. В приведенном выше примере PID составляет 1623.

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

Амина Нураини
источник
4

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

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

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

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

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

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

и рассчитать фактический% самостоятельно.

Чтобы изменить% диска, зарезервированный для использования только в корне, выполните

tune2fs -m <percentage> <device>
luka5z
источник
1

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

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

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

sleske
источник
1

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

lsof -v file

покажу вам это в любом случае.

user1802263
источник
1
Это на самом деле не добавляет много; принятый ответ покрывал логику этого в 2001 году. Если у вас есть 50 представителей, используйте комментарии, если вы хотите добавить квалификаторы к существующим ответам.
Андрей Б
0

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

Чен Леви
источник
0

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

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

Чтобы проверить, какие удаленные файлы заняли память, введите команду

 $ sudo lsof | grep deleted

Он покажет удаленные файлы, которые содержат память.

Затем убейте процесс с помощью pid или name

$ sudo kill <pid>
$ df -h

проверьте сейчас у вас будет такая же память

Если нет, введите команду ниже, чтобы увидеть, какой файл занимает память

# cd /
# du --threshold=(SIZE)

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

Джавид Шакил
источник
-4

открыть терминал, попробуйте эту команду df -Th, затем используйте эту команду sudo du -h --max-deep = 1 / в этой команде вы найдете подробности использования диска, затем откроете, как пользователь root удалит файл (root-local-share-trash) и удали свой файл

Rilson
источник