Вопрос или проблема
В системе Arch версии 4.20.3 диск, отформатированный в BTRFS, не имеет свободного пространства. Оказывается, причиной является mlocate:
# du -h --exclude=Volumes -- * 2>/dev/null | sort -hr | head -2
11G var
9.6G var/lib/mlocate
Вопрос updatedb: не удается открыть временный файл для `/var/lib/mlocate/mlocate.db’ в принятом ответе предлагает добавить sudo
, хотя это не меняет ситуацию:
# sudo updatedb
updatedb: `/var/lib/mlocate/mlocate.db' заблокирован (вероятно, предыдущим updatedb)
Кажется, в /var/lib/mlocate есть временный файл, который занимает все место на диске:
# ls -lh var/lib/mlocate/
-rw-r----- 1 root locate 1.1M Oct 21 00:00 mlocate.db
-rw------- 1 root root 9.6G Dec 30 19:46 mlocate.db.PRvfsw
Может быть, коренная причина — это зависшая задача обновления .timer
?
# systemctl status updatedb.timer
* updatedb.timer - Ежедневное обновление базы данных locate
Загружен: загружено (/usr/lib/systemd/system/updatedb.timer; статически; предустановленный производитель: отключено)
Активно: активно (работает) с понедельника 2019-10-21 16:05:10 CEST; 2 месяца 9 дней назад
Триггер: n/a
Операции restart
и stop
не удаляют временный большой .db файл, и updatedb
по-прежнему возвращает locked
.
Похоже, что процесс updatedb
все еще работает:
# ps -ef | grep updatedb
root 3249 1 99 Oct22 ? 213573-14:47:11 /usr/bin/updatedb
Я знаю, что могу завершить этот процесс. Причина, скорее всего, неисправная флешка:
# ls /Volumes/RM_GUE__
ls: невозможно получить доступ к '/Volumes/RM_GUE__/'$'\001\020': Ошибка ввода-вывода
ls: невозможно получить доступ к '/Volumes/RM_GUE__/)': Ошибка ввода-вывода
Хотя в следующий раз, когда флешка выйдет из строя, /
снова заполнится.
updatedb.conf
Опции updatedb.conf
не дают мне никаких полезных возможностей фильтрации:
- по пути: Я не могу предположить, какое имя будет у раздела после повреждения
- по файловой системе: В этом случае VFAT был поврежден (и доступен только для чтения), хотя я не могу заглянуть в будущее, чтобы узнать, какая файловая система будет повреждена.
Как решить эту проблему аккуратно и навсегда, например, ограничив время, в течение которого может работать updatedb.timer
, и/или пропуская диски, которые страдают от ошибок ввода/вывода, или ограничивая размер файла LimitFSIZE=
или даже найти что-то лучшее?
Документация для mlocate
(см. man mlocate
) ссылается на updatedb
, который в свою очередь говорит
Переменные
PRUNE_BIND_MOUNTS
,PRUNEFS
,PRUNENAMES
иPRUNEPATHS
, которые модифицируются некоторыми опциями, документированы вupdatedb.conf
(5).
Чтение документации по этому вопросу (man updatedb.conf
) и просмотр файла /etc/updatedb.conf
показывает две возможные опции, которые соответствуют вашему требованию:
PRUNEFS
Список типов файловых систем, разделенных пробелами (как используется в /etc/mtab), которые не должны сканироватьсяupdatedb
(8). Сравнение типов файловых систем не учитывает регистр.
PRUNEPATHS
Список имен путей каталогов, разделенных пробелами, которые не должны сканироватьсяupdatedb
(8). Каждое имя пути должно быть точно в той форме, в которой каталог будет сообщенlocate
(1).
Если ваши флешки и другие съемные носители всегда монтируются в /Volumes
, вы можете добавить этот каталог в настройки PRUNEPATHS
в /etc/updatedb.conf
. На моей системе Debian это будет выглядеть так:
PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /Volumes"
В качестве альтернативы, если ваши флешки всегда FAT или NTFS, вы можете добавить эти типы файловых систем в набор исключений, указанных в PRUNEFS
.
Ответ или решение
Система Arch на BTRFS, с которой вы столкнулись, демонстрирует проблему заполненности дискового пространства из-за временных файлов, связанных с утилитой mlocate
. Ошибки ввода-вывода на USB-накопителях и блокировка файла баз данных — это серьезные вопросы, которые требуют комплексного подхода для их решения.
Проблема и ее Причины
Согласно вашему описанию, файл базы данных mlocate
, который находится в /var/lib/mlocate/mlocate.db
, заблокирован, вероятно, из-за того, что предыдущий процесс updatedb
не смог корректно завершиться. Это произошло из-за того, что updatedb
пытался обработать поврежденный USB-накопитель, размещенный в каталоге /Volumes
. В результате этого временный файл mlocate.db.PRvfsw
достиг объема в 9.6 ГБ, что привело к исчерпанию места на диске.
Решения для Ликвидации Проблемы
Для того чтобы предотвратить повторение этой ситуации в будущем и решить текущую проблему, выполните следующие шаги:
-
Убийство Подвисшего Процесса:
Для начала убейте проблемный процессupdatedb
:sudo kill -9 3249
Убедитесь, что вы завершили процесс корректно.
-
Удаление Временных Файлов:
Удалите временные файлы, связанные сmlocate
, которые занимают много места:sudo rm -f /var/lib/mlocate/mlocate.db.PRvfsw
Проверьте, что и основная база данных не удалена:
sudo du -sh /var/lib/mlocate
-
Настройка
updatedb.conf
:
Используйте файл конфигурации/etc/updatedb.conf
для исключения ненадежных путей и файловых систем:- Добавьте
/Volumes
вPRUNEPATHS
:PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /Volumes"
- Точно так же, если ваши USB-накопители всегда используют файловые системы FAT или NTFS, добавьте их в
PRUNEFS
:PRUNEFS="vfat ntfs"
- Добавьте
-
Ограничение По Времени:
Убедитесь, чтоupdatedb.timer
выполняется только в течении ограниченного времени. К сожалению, APIsystemd
не предоставляет возможности ограничить время выполнения задачи, но вы можете установить критические значения дляTimeoutStartSec
и других опций. -
Регулярная Поддержка:
Рассмотрите возможность регулярного мониторинга состояния файловой системы с помощью инструментов, таких какfsck
, что позволит выявлять проблемы с накопителями до их критического состояния.
Заключение
Процесс устранения проблемы заполненности диска не сводится к простому удалению временных файлов и завершению процессов. Она требует анализирования текущего состояния системы и принятия мер по профилактике определенных условий, которые могут нарушить её работоспособность. Интегрировав указанные шаги в вашу повседневную практику администрирования системы, вы сможете значительно уменьшить риск возникновения аналогичных ситуаций в будущем.