Судо updatedb `/var/lib/mlocate/mlocate.db’ заблокирован из-за неисправного диска, как решить эту проблему навсегда?

Вопрос или проблема

В системе 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 ГБ, что привело к исчерпанию места на диске.

Решения для Ликвидации Проблемы

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

  1. Убийство Подвисшего Процесса:
    Для начала убейте проблемный процесс updatedb:

    sudo kill -9 3249

    Убедитесь, что вы завершили процесс корректно.

  2. Удаление Временных Файлов:
    Удалите временные файлы, связанные с mlocate, которые занимают много места:

    sudo rm -f /var/lib/mlocate/mlocate.db.PRvfsw

    Проверьте, что и основная база данных не удалена:

    sudo du -sh /var/lib/mlocate
  3. Настройка updatedb.conf:
    Используйте файл конфигурации /etc/updatedb.conf для исключения ненадежных путей и файловых систем:

    • Добавьте /Volumes в PRUNEPATHS:
      PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /Volumes"
    • Точно так же, если ваши USB-накопители всегда используют файловые системы FAT или NTFS, добавьте их в PRUNEFS:
      PRUNEFS="vfat ntfs"
  4. Ограничение По Времени:
    Убедитесь, что updatedb.timer выполняется только в течении ограниченного времени. К сожалению, API systemd не предоставляет возможности ограничить время выполнения задачи, но вы можете установить критические значения для TimeoutStartSec и других опций.

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...