Целта на този пост е да покаже техниката за отстраняване на проблеми в 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?
Има три опции:
- Магически артефакт (някой го е сложил и забравил)
- Конфигурация от пакета
- Конфигурация, генерирана от някакъв скрипт от системните пакети.
Проверяваме вариант №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" >> $resumeconfmapdevfs е утилита с ясно предназначение, а интересната за нас функция е get_resume_partition, която чете /proc/swaps и избира най-голямото. Swap обаче идва от partman.
Отговорът на нашето тестово задание: файлът се създава от инсталатора в /target по време на инсталацията, т.е. говорим за well-known, но артефакт. В съществуващите в системата пакети няма никого и нищо, което да променя този файл.
В обобщение
- dpkg и debconf — основни методи за търсене на доставчици на файлове.
- търсенето в /var/lib/dpkg/info позволява да се видят операцията над файловете по време на инсталацията.
- Инсталаторът може да създава файлове-артефакти, които впоследствие никой никога не променя (освен потребителя), и това може да се види в кода на инсталатора.
Източник: habr.com
