Назад | Перейти на главную страницу

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

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

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

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

Использовать

lsof +L1

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

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

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

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

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

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

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

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

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

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

tune2fs -m <percentage> <device>

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

  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 чтобы проверить, освободилось ли место. Если он все еще заполнен, возможно, вам нужно подождать несколько секунд и проверить еще раз.

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

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

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

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

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

lsof -v file

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

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

Если у вас Windows 10 с двойной загрузкой, вы можете попробовать загрузиться в Windows 10, затем перейти в раздел «Очистка диска», выбрать нужный диск и нажать «Очистить системные файлы». Это сработало для меня. Удачи.

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

 $ sudo lsof | grep deleted

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

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

$ sudo kill <pid>
$ df -h

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

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

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

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

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