df в Linux не відображає вільного місця після видалення файлу


143

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

Я отримав noatimeпрапор на змонтованих розділах, якщо це має значення.


Це відбувається на одній секції або на всіх розділах?
Халед

Що ж, це відбувається на моєму головному розділі даних, який є єдиним, що мене хвилює, оскільки я пишу на нього / видаляю файли на нього.

Будь ласка, просвітліть мене рішенням або посиланням на одне.

Яка файлова система (и)? DF робить статистику суперблоку, можливо, ваша файлова система не оновлює sb inode. Ви спробували промити кеш?
квасоля

Використання ext4 Як ви стираєте кеші?

Відповіді:


235

Видалення імені файлу фактично не видаляє файл. Деякий інший процес тримає файл відкритим, через що його не видаляють; перезапустіть або закрийте цей процес, щоб випустити файл.

Використовуйте

lsof +L1

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


2
До видалених файлів не можна було отримати доступ протягом місяця, і єдиний процес, що звертається до них, - це nginx, тому його сумнівний.

39
+1. Також "lsof + L1" підкаже, яка програма тримає файли відкритими.
pehrs

4
як запускати "lsof -n | grep файл", ви будете здивовані тим, як довго файли можуть залишатися з-за процесів, що дозволяють відкрити їх з будь-якої причини. Якщо все інше не вдасться, перезавантажтесь, я почуваю себе погано, пропонуючи це, але, безумовно, переконайтеся, що нічого не тримається за файл. Напевно, lsof + L1 - це, мабуть, кращий шлях.
ScottZ

3
Ти мене врятував! Видалено файл журналу 93G і не отримав простір і не міг зрозуміти, чому. Дякую.
Люк Кузен

1
У той же самий рядок, і якщо це допомагає іншим, я стерв великий файл nginx access.log, але міг повернути простір лише після перезавантаження nginx: перезапуск служби nginx
Нік

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?
Pred

він видаляє дескриптор файлів
Adrián Deccico

2
чи має ця >команда ім'я? Мені довелося перейти з zsh на bash, щоб мати можливість ним користуватися. Чи можна запустити його на zsh?
ariera

1
це перенаправлення виводу, і тому усікає файл. Довгим з би було "echo -n> 1" або "true> 1". Він дійсно не видаляє FD, він просто вказує на порожній файл згодом.
eckes

8

Однією з можливостей є те, що файли, які ви видалили, мають більше посилань у файловій системі. Якщо ви створили жорсткі посилання, кілька імен файлів вказуватимуть на ті самі дані, і дані (фактичний вміст) не будуть позначені як вільні / корисні, поки всі посилання на них не будуть видалені. Перед тим, як видалити файли, або stat їх (Запис з назвою Посилання), або зробіть на них 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, так і некористувач.

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

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

і самостійно обчислити фактичний%.

Щоб змінити диск%, зарезервований для використання тільки для root, виконайте виконання

tune2fs -m <percentage> <device>

1

Інші відповіді правильні: якщо ви видалите файл, і простір не звільняється, це зазвичай є тому, що файл все ще залишається відкритим, або є інші жорсткі посилання на нього.

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

Таким чином, ви швидко знайдете файли, які все ще займають місце через друге жорстке посилання. Він також покаже простір, займаний видаленими, але відкритими файлами (як (дозвіл відхилений), я вважаю, оскільки він не може прочитати ім'я файлу).


1

Оскільки я знаю, що багато з вас роблять це для того, щоб /varзмінити та згорнути файли, очікуючи, що FS зменшиться, але замість цього він зростає, просто переконайтеся, що ви перезапустите сервіс syslog. і

lsof -v file

показав би це все одно.


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 -З наступного використання цієї команди sudo du -h --max-width = 1 / в цій команді ви знайдете деталі використання диска, а потім відкрийте як користувач root видалення файлу (root-local-share-trash) і видаліть файл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.