Скажіть fs звільнити місце від видалених файлів ЗАРАЗ


73

Чи є спосіб сказати ядру, щоб він повернув вільний простір на диску зараз? Як написати щось до / proc /? Використання Ubuntu 11.10 з ext4.

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

Я видалив 100 МБ великих файлів як від користувача, так і з root, і також зробив кілька жорстких посилань.

Перед тим, як у мене apt-get cleanбуло понад 900 Мб в / var / кеш / apt / архівах, зараз є лише 108 КБ:

# du
108 /var/cache/apt/archives

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

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

Будь-які пропозиції? Я вимикаю деякі сервіси / процеси, але не знаю, як перевірити, хто може активно їсти місце на диску.

Більше інформації

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096

4
Файлова система негайно звільняє простір. Однак функція root-зарезервованих блоків ext [234] та те, як ядро ​​зберігає відкриті файли, зарезервовані, можуть створити втрачений простір.
hhaamu

Якщо у вас є декілька файлових систем (патиментів), звільнення місця в одній не принесе користі в іншій.
vonbrand

Чому я зміг заповнити розділ до того, як «зарезервовані» 5Go блоки повернуть себе?
Psddp

Відповіді:


116

Перевірте, lsofчи є файли відкритими. Простір не буде звільнено, поки вони не будуть закриті.

sudo /usr/sbin/lsof | grep deleted

підкаже, які видалені файли залишаються відкритими.


Добре. Показав мені деякі mysqldзамки в / tmp, але багато apport-gtвикористання вимерлих файлів у / var / lib / apt / list / частково /, які, мабуть, накопичуються. Тож я, можливо killall apport-gt, спершу досліджую це.
Маркос

1
Позначення як найближча відповідь, хоча ніколи насправді не «повертав» простір відразу після закриття файлів / процесів їх використання. Шукаємо інші підходи на основі ядра / proc / fs.
Маркос

18
Ви також можете використовувати lsof +L1(виберіть відкриті файли, які від’єднали посилання).
Мартін Фідо

Інформація у цій відповіді є правильною, але проблема, з якою виникала ОП, спричинена не цим, а зарезервованим корінним простором (на який адресується інша відповідь).
marcelm

37

Використовуйте, lsofщоб знайти видалений, але відкритий файл, який все ще займає місце:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

Знайдіть запис у /proc/<pid>/fd/відповідності до файлового файлу:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

Тепер просто cat /dev/nullв fd:

cat /dev/null > /proc/3446/fd/128

Зауважте, що вкладка все ще відкрита, але тепер вона дорівнює 0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
Зайве використання catдля усічення. У оболонці Борна, щойно > /proc/3446/fd/128зробимо.
200_успіх

2
НЕ робіть цього, якщо очікується, що ваша програма перечитає будь-яку частину файлу в майбутньому, яка може бути, а може і не бути доступною в кеш-пам'яті сторінки.
Майкл Р. Хійнс

13

dfне відображатиметься місця, зарезервованого для root(навіть при запуску як root):

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

Як змінити "зарезервований відсотковий відсоток"

  1. Зменшити зарезервований простір до 4%

    # tune2fs -m4 /dev/sda4

df -h Зараз показав 45M безкоштовно.

  1. Швидко зберегли мої файли
  2. Поверніть його до 5%

    # tune2fs -m5 /dev/sda4


2
Простір, зарезервований під корінь, сьогодні майже завжди занадто великий. Ви можете зменшити його до кількох відсотків. dfвідображає простір для звичайного користувача. Оскільки apt працює як root, зарезервований простір корисний лише для захисту від заповнення, спричиненого некорінними користувачами (= звичайні користувачі та служби, які мають власного користувача).
Джофель

Я згоден; в mkfsці дні слід резервувати, наприклад. 5% або 300 МБ, залежно від того, що менше . Просто перенастроювали деякі мої сервери на 2% і звільняли ГБ назад!
Маркос

3
@jofel, ні, це не так. Кожен раз, коли ви перевищуєте 90% використання, ви починаєте отримувати багато фрагментації. Потрібно звільнити трохи більше місця, не наближатися до 100% використання.
psusi

@psusi Ви справді, дякую за ваш коментар. Але можливість використовувати (тимчасовий) майже весь доступний простір як звичайний користувач може бути справді практичною та з ext4, речі вже не такі погані, див. Unix.stackexchange.com/a/7965/15241
jofel

7

У Ubuntu, якщо ви видалили файли за допомогою сміттєвого відро, вони, швидше за все, не були повністю видалені.

Навіть після випорожнення сміття ваші файли залишатимуться ~/.local/share/Trash/expungedдо перезавантаження та, можливо, ще довше.

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


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

6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

Пояснення:
Grep lsofвихід для вилучення лише видалених файлів. Sed витягує ідентифікатор процесу та ідентифікатор fileescriptor з кожного рядка та створює рядок у форматі {pid}/fd/{fid}. Хоча циклічно і не виводьте нічого в кожен файл, встановивши їх порожніми.


3
У мене з'явилася помилка "синтаксична помилка поблизу несподіваного
маркера`

5

Цікаво, чи syncне допомагає тут - але це не повинно бути, оскільки IIRC у більшості ("багатьох"?) Файлових систем синхронізуються кожні 30 с.

Я перевірив би журнал ядра (так dmesg), щоб виявити, чи відбувається щось неприємне, і запустити, lsofщоб побачити, чи ще якийсь великий, видалений файл все ще відкритий (насправді, я думаю, що видалені файли будуть позначені як такі у lsofвисновку).

Дві причини (одна з цих, зазначених у питанні, на яке ви посилаєтесь), які можуть спричинити звільнення видалених файлів, не мають місця

  • файли, які насправді не були видалені: ви видалили файл, який є жорсткою посиланням десь інше (точніше, ви unlink()редагували файл із більш ніж одним посиланням)
  • файли , які все ще відкриті: відкриті файли bookkept з допомогою, ну, файлів, Inodes самі, а НЕ записи каталогу, якщо видалити запис, індексний дескриптор буде залишатися там до тих пір , як він по - , як і раніше відкритий.

Але я не знаю конкретної причини, чому це може статися з такою кількістю файлів ...


syncніколи не допомагав. Що стосується журналів, то це система Ubuntu, тому вона досить глючна, так що так вони зазвичай галасливі. apportчасто розгортається через те, що щоночі виходить з ладу оновлення apt-get, хоча / var / crash має лише 77 Мб. Також зауважив, atdщо затопило / var / log / syslog з повторюваними рядками, atd[8892]: File a0015c0152ab76 is in wrong format - abortingнапевно, оскільки декілька файлів у / var / spool / cron / atspool були розміром 0, що зробило проблему круглою, звичайно
Marcos

1

CentOS 6.3 також робить не фактично спорожнення-сміття-сміття-коли-ви-порожнє-сміття. Я не міг знайти спосіб повернути простір, поки я просто не побіг rm -rf ~/.local/share/Trash/expunged/. Викликали сильне подряпини в голові.

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