Откъде е тази конфигурация? [Debian/Ubuntu]

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

Тестов пример: след дълги мъки с tar.gz копие на инсталираната ОС и след неговото възстановяване и инсталиране на актуализации, получаваме съобщение:

update-initramfs: Генериране на /boot/initrd.img-4.15.0-54-generic
W: конфигурацията на initramfs-tools задава RESUME=/dev/mapper/U1563304817I0-swap
W: но няма налично съответстващо swap устройство.
I: initramfs ще се опита да продължи от /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Задайте променливата RESUME, за да я пренапишете.

Цел: да разберем откъде идва тази стойност (U1563304817I0) и как да я променим правилно. Това е първият попаднал пример, не е особено интересен сам по себе си, но е удобен, за да покаже практическите методи за работа с Linux..

Стъпка номер 1: Откъде дойде RESUME?

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

Рекурсивно (-r) търсим споменаване на тази променлива в директорията /etc (където се намират повечето конфигурации). Намираме snippeta conf.d, който явно се използва от пакета initramfs-tools.

Откъде е този snippet?

Има три опции:

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

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

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: няма намерен път, съответстващ на шаблона *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

Връщаме се към нашата задача: файлът initramfs-tools/conf.d/resume не се инсталира в системата от пакета. Може би се генерира в скрипта postinst/preinst на пакета? Проверяваме версия номер 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

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

Нека да погледнем файловете от пакета initramfs-tools-core.

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

Екип dpkg -L позволява да видите всички файлове, които са в системата от указания пакет. Избрах интересен файл за проучване. Изучаването на файла показва как се използва тази променлива, но не отговаря откъде идва.

debconf

Изглежда, това е артефакт на някого. Чий? Преди да се гмурнем в инсталатора, нека погледнем в една важна инфраструктура на Debian — отговори на въпроси. Всеки път, когато пакет задава въпрос, и в много случаи, когато не задава въпрос, но използва вариант по подразбиране, и въпросът, и отговорът се записват в специална база в Debian, известна като debconf. Можем да разгледаме базата с отговори (и дори да ги зададем преди инсталацията на самия пакет — debconf-set-selections), за целта ще ни трябва утилита debconf-get-selections от пакета debconf-utils. За съжаление, нищо интересно не беше намерено: (debconf-get-selections | grep -i resume върна празно).

debian-installer

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

Вътре в тях лесно намираме отговора на нашия въпрос:

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

mapdevfs е утилита с ясно предназначение, а интересната за нас функция е get_resume_partition, която чете /proc/swaps и избира най-голямото. Swap обаче идва от partman.

Отговорът на нашето тестово задание: файлът се създава от инсталатора в /target по време на инсталацията, т.е. говорим за well-known, но артефакт. В съществуващите в системата пакети няма никого и нищо, което да променя този файл.

В обобщение

  1. dpkg и debconf — основни методи за търсене на доставчици на файлове.
  2. търсенето в /var/lib/dpkg/info позволява да се видят операцията над файловете по време на инсталацията.
  3. Инсталаторът може да създава файлове-артефакти, които впоследствие никой никога не променя (освен потребителя), и това може да се види в кода на инсталатора.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster