Скажите ФС освободить место из удаленных файлов СЕЙЧАС

73

Есть ли способ заставить ядро ​​вернуть свободное место на диске сейчас? Как написать что-то в / proc /? Использование Ubuntu 11.10 с ext4.

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

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

Непосредственно до того, как я это apt-get cleanсделал, в / var / cache / apt / archives было более 900 МБ, теперь только 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
Marcos
источник
4
Файловая система освобождает пространство немедленно. Однако функция корневых зарезервированных блоков в ext [234] и то, как ядро ​​сохраняет открытые файлы зарезервированными, могут создать впечатление потерянного пространства.
хааму
Если у вас есть несколько файловых систем (патентов), освобождение места в одной не принесет пользы в другой.
vonbrand
Почему я смог заполнить раздел до того, как «зарезервированные» блоки 5Go вернут себя?
Psddp

Ответы:

117

Проверьте, lsofесть ли открытые файлы. Пространство не будет освобождено, пока они не будут закрыты.

sudo /usr/sbin/lsof | grep deleted

скажет вам, какие удаленные файлы остаются открытыми.

Александар Иванишевич
источник
Хороший. Мне показали некоторые mysqldблокировки в / tmp, но многие apport-gtслучаи использования вымерших файлов в / var / lib / apt / lists /partal /, которые, по-видимому, накапливались. Так что я мог бы, killall apport-gtно сначала исследую это.
Маркос
1
Отмечается как наиболее близкий ответ, хотя никогда не «возвращал» пространство сразу после закрытия файловых дескрипторов / процессов, использующих их. Ищем другие подходы, основанные на ядре / proc / fs.
Маркос
18
Вы также можете использовать lsof +L1(выберите открытые файлы, которые не были связаны).
Мартин Фидо
Информация в этом ответе верна, но проблема, с которой столкнулся OP, вероятно, была вызвана не этим, а корневым зарезервированным пространством (которое адресует другой ответ).
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)
BillQ
источник
5
Излишнее использование catдля усечения. В оболочке Bourne точно так > /proc/3446/fd/128и сделаю.
200_success
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 сейчас показал 45М бесплатно.

  1. Быстро сохранили мои файлы
  2. Положи обратно на 5%

    # tune2fs -m5 /dev/sda4

Marcos
источник
2
Зарезервированное для корневого пространства в настоящее время почти всегда слишком большое. Вы можете уменьшить его до нескольких процентов. dfотображает для обычного пользователя полезного пространства. Поскольку apt запускается от имени пользователя root, зарезервированное пространство полезно только для защиты от переполнений, вызванных пользователями без полномочий 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удаляю удаленные файлы.

kwarrick
источник
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 извлекает идентификатор процесса и идентификатор файлового дескриптора из каждой строки и создает строку в формате {pid}/fd/{fid}. Хотя цикл и ничего не выводить в каждый файл, устанавливая их пустыми.

Sepero
источник
3
Я получил ошибку "Синтаксическая ошибка рядом с неожиданным
токеном`
5

Интересно, syncпоможет ли это здесь - но не должно быть, поскольку IIRC в большинстве ("многих"?) Систем, файловые системы синхронизируются каждые 30 с.

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

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

  • файлы, которые на самом деле не были удалены: вы удалили файл, на который есть жесткая unlink()ссылка где-то еще (точнее, вы редактировали файл с более чем одной ссылкой)
  • файлы, которые все еще открыты: открытые файлы хранятся с использованием, в общем, файлов, самих inode , а не записей каталога. Если вы удалите запись, inode будет оставаться там до тех пор, пока она еще открыта.

Но я не знаю конкретной причины, по которой это может произойти с таким количеством файлов ...

njsg
источник
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/. Вызвала сильную головную боль.

Biggles
источник