Хабрахабр

Откуда этот конфиг? [Debian/Ubuntu]

Цель этого поста: показать технику отладки в debian/ubuntu, связанную с "поиском первоисточника" в системном конфигурационном файле.

Тестовый пример: после долгих издевательств над tar.gz копией установленной ОС и после её восстановления и установки апдейтов мы получаем сообщение:

update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.

Это первый попавшийся пример, не особо интересный сам по себе, но удобный, чтобы показать практические методы работы с Linux. Цель: понять, откуда это значение (U1563304817I0) пришло и как его правильно поменять.

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Мы находим conf.d сниппет, который явно используется пакетом initramfs-tools. Мы рекурсивно (-r) ищем упоминание этой переменной в каталоге /etc (там, где большинство конфигов).

Есть три варианта:

  1. Магический артефакт (кто-то положил и забыл)
  2. Конфиг из пакета
  3. Конфиг, сгенерированный каким-то скриптом из системных пакетов

Проверяем №2 (как самый простой):

dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

Вот пример удачного поиска: dpkg -S позволяет нам поискать по базе установленных файлов и найти к какому пакету файл относится.

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Может быть он генерируется в postinst/preinst скрипте пакета? Возвращаемся к нашей задаче: файл initramfs-tools/conf.d/resume не устанавливается в систему из пакета. Проверяем версию номер 3.

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resume

Удивительно, но этот файл удаляется в postrm (при удалении) пакета initramfs-tools-core. В каталоге /var/lib/dpkg/info/ лежат распакованные версии всех "метафайлов" пакетов (скрипты установки/удаления, описания пакетов и т.д.). Посмотрим содержимое его postinst… Ничего, касающегося conf.d директории.

Давайте посмотрим на файлы из состава пакета initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resum
...

Я выделил интересный для изучения файл. Команда dpkg -L позволяет посмотреть все файлы, которые есть в системе от указанного пакета. Изучение файла показывает как эта переменная используется, но не отвечает откуда он появляется.

Чей? Получается, это чей-то артефакт. Каждый раз, когда пакет задаёт вопрос, и во многих случаях, когда он вопроса не задаёт, но использует вариант по-умолчанию, и вопрос, и ответ фиксируются в специальной базе в Debian, которая называется debconf. Перед тем, как нырять в инсталлятор, глянем ещё в одну важную инфраструктуру Debian — ответы на вопросы. К сожалению, ничего интересного не нашлось: (debconf-get-selections |grep -i resume вернул пусто). Мы можем посмотреть на базу ответов (и даже выставить их до установки самого пакета — debconf-set-selections), для этого нам потребуется утилита debconf-get-selections из состава debconf-uitls.

К сожалению, там тоже нет ни слова про наш resume.
Зато рядом есть логи, в т.ч. У установщика есть своя база ответов на вопросы: /var/log/installer/cdebconf/questions.dat. Там упоминается пакет base-installer, и на его странице мы можем видеть ссылку на сырцы. syslog, куда пишется весь лог инсталляции.

Внутри них мы с лёгкостью находим ответ на наш вопрос:

resume="$(mapdevfs "$resume_devfs")"; then
... if [ "$do_initrd" = yes ]; then ... resumeconf=$IT_CONFDIR/resume
.... echo "RESUME=$resume" >> $resumeconf

Swap же у нас приходит от partman'а. mapdevfs — это утилита с понятным назначением, а интересная нам функция это get_resume_partition, которая читает /proc/swaps и выбирает там самую большую.

мы говорим про well-known, но артефакт. Ответ на наше тестовое задание: файл создаётся инсталлятором в /target'е в момент установки, т.е. В существующих в системе пакетах нет никого и ничего, чтобы меняло этот файл.

  1. dpkg и debconf — основные методы для поиска поставщиков файлов.
  2. поиск в /var/lib/dpkg/info позволяет увидеть операции над файлами на этапе установки.
  3. Установщик может создавать файлы-артефакты, которые потом никем никогда не меняются (кроме пользователя), и это можно увидеть в коде установщика.
Показать больше

Похожие публикации

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»