Skąd ten konfiguracja? [Debian/Ubuntu]

Celem tego wpisu jest pokazanie techniki debugowania w debianie/ubuntu, związanej z ‚szukaniem źródła‘ w systemowym pliku konfiguracyjnym.

Przykład testowy: po długich zmaganiach z kopią tar.gz zainstalowanego systemu operacyjnego oraz po jej przywróceniu i zainstalowaniu aktualizacji otrzymujemy komunikat:

update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: konfiguracja initramfs-tools ustawia RESUME=/dev/mapper/U1563304817I0-swap
W: ale nie ma dostępnego pasującego urządzenia swap.
I: Initramfs spróbuje wznowić z /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Ustaw zmienną RESUME, aby to nadpisać.

Celem jest zrozumieć, skąd ta wartość (U1563304817I0) się wzięła i jak ją poprawnie zmienić. To pierwszy lepszy przykład, niezbyt interesujący sam w sobie, ale wygodny do pokazania praktycznych metod pracy z Linuxem..

Krok numer 1: Skąd pochodzi RESUME?

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

Rekurencyjnie (-r) szukamy wzmianki o tej zmiennej w katalogu /etc (tam, gdzie znajduje się większość konfiguracji). Znajdujemy snippety conf.d, które są wyraźnie używane przez pakiet initramfs-tools.

Skąd ten snippet?

Są trzy opcje:

  1. Magiczny artefakt (ktoś go umieścił i zapomniał)
  2. Konfiguracja z pakietu
  3. Konfiguracja, wygenerowana przez jakiś skrypt z pakietów systemowych

Sprawdzamy nr 2 (jak najprostsze):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: żadna ścieżka nie pasuje do wzorca *initramfs-tools/conf.d/resume*

dpkg -S pozwala nam szukać w bazie zainstalowanych plików i znaleźć, do jakiego pakietu odnosi się dany plik. Oto przykład udanego wyszukiwania:

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

Wracamy do naszego zadania: plik initramfs-tools/conf.d/resume nie jest instalowany w systemie z pakietu. Może być generowany w skrypcie postinst/preinst pakietu? Sprawdzamy wersję nr 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

W katalogu /var/lib/dpkg/info/ znajdują się rozpakowane wersje wszystkich ‚metaplików‘ pakietów (skrypty instalacyjne/usunięcia, opisy pakietów itd.). Co dziwne, ten plik jest usuwany w postrm (podczas usunięcia) pakietu initramfs-tools-core. Zobaczymy zawartość jego postinst… Nic, co dotyczy katalogu conf.d.

Spójrzmy na pliki wchodzące w skład pakietu initramfs-tools-core.

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

Zespół dpkg -L pozwala zobaczyć wszystkie pliki, które znajdują się w systemie od określonego pakietu. Wydobyłem interesujący plik do analizy. Analiza pliku pokazuje, jak ta zmienna jest używana, ale nie odpowiada na pytanie, skąd ona pochodzi.

debconf

Wygląda na to, że to czyjś artefakt. Czyj? Zanim zanurzymy się w instalator, przyjrzyjmy się jeszcze jednej ważnej infrastrukturze Debiana — odpowiedziom na pytania. Za każdym razem, gdy pakiet zadaje pytanie, a w wielu przypadkach, gdy pytania nie zadaje, ale używa opcji domyślnej, pytanie i odpowiedź są rejestrowane w specjalnej bazie w Debianie, która nazywa się debconf. Możemy przyjrzeć się bazie odpowiedzi (a nawet ustawić je przed instalacją samego pakietu — debconf-set-selections), w tym celu potrzebna nam będzie narzędzie debconf-get-selections z pakietu debconf-utils. Niestety, nie znaleziono nic interesującego: (debconf-get-selections |grep -i resume zwrócił pusto).

debian-installer

Instalator ma swoją własną bazę odpowiedzi na pytania: /var/log/installer/cdebconf/questions.dat. Niestety, tam także nie ma ani słowa o naszym resume.
Z kolei w pobliżu znajdują się logi, w tym syslog, gdzie zapisywany jest cały log instalacji. Wspomniany jest pakiet base-installer, a w jego stronie możemy zobaczyć odnośnik do źródeł.

Wewnątrz łatwo znajdujemy odpowiedź na nasze pytanie:

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

mapdevfs to narzędzie o jasnym przeznaczeniu, a interesującą nas funkcją jest get_resume_partition, które odczytuje /proc/swaps i wybiera tam największą. Swap pochodzi od partmana.

Odpowiedź na nasze testowe zadanie: plik jest tworzony przez instalator w /target w momencie instalacji, tzn. mówimy o well-known, ale artefakcie. W istniejących w systemie pakietach nie ma nikogo i niczego, co zmienia ten plik.

Podsumowując

  1. dpkg i debconf to podstawowe metody wyszukiwania dostawców plików.
  2. wyszukiwanie w /var/lib/dpkg/info pozwala zobaczyć operacje nad plikami na etapie instalacji.
  3. Instalator może tworzyć pliki-artefakty, które później nigdy nie są zmieniane (z wyjątkiem użytkownika), a to można zobaczyć w kodzie instalatora.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster