Skąd pochodzi ta konfiguracja? [Debian/Ubuntu]

Celem tego wpisu jest pokazanie techniki debugowania w debianie/ubuntu związanej z „znalezieniem źródła” w pliku konfiguracyjnym systemu.

Przykład testowy: po wielu kpinach z kopii tar.gz zainstalowanego systemu operacyjnego oraz po jego przywróceniu i zainstalowaniu aktualizacji, otrzymujemy komunikat:

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.

Cel: zrozumieć, skąd wzięła się ta wartość (U1563304817I0) i jak ją poprawnie zmienić. To pierwszy przykład, który się natknął, niezbyt interesujący sam w sobie, ale wygodny do pokazania praktycznych metod pracy z Linuksem.

Krok numer 1: Skąd wzięło się CV?

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

My rekurencyjnie (-r) poszukaj wzmianki o tej zmiennej w katalogu /etc (gdzie znajduje się większość konfiguracji). Znajdujemy fragment kodu conf.d, który jest wyraźnie używany przez pakiet initramfs-tools.

Skąd jest ten fragment?

Istnieją trzy opcje:

  1. Magiczny artefakt (ktoś go położył i zapomniał)
  2. Konfiguracja z pakietu
  3. Konfiguracja wygenerowana przez jakiś skrypt z pakietów systemowych

Sprawdźmy nr 2 (jako najprostszy):

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

dpkg -S pozwala nam przeszukać bazę zainstalowanych plików i dowiedzieć się, do którego pakietu należy 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

Wróćmy do naszego zadania: plik initramfs-tools/conf.d/resume nie jest zainstalowany w systemie z pakietu. Może jest generowany w skrypcie postinst/preinst pakietu? Sprawdźmy 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/ istnieją rozpakowane wersje wszystkich „metaplików” pakietów (skrypty instalacyjne/usuwające, opisy pakietów itp.). Co zaskakujące, plik ten jest usuwany postrm (podczas dezinstalacji) pakietu initramfs-tools-core. Przyjrzyjmy się zawartości jego postinst... Nic związanego z katalogiem conf.d.

Przyjrzyjmy się plikom zawartym w pakiecie initramfs-tools-core.

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

Zespół dpkg -L umożliwia przeglądanie wszystkich plików znajdujących się w systemie z określonego pakietu. Zaznaczyłem plik, który jest interesujący do przestudiowania. Sprawdzenie pliku pokazuje, w jaki sposób ta zmienna jest używana, ale nie mówi, skąd ona pochodzi.

debconf

Okazuje się, że jest to czyjś artefakt. Którego? Zanim zajmiemy się instalatorem, przyjrzyjmy się innej ważnej infrastrukturze Debiana – odpowiedziom na pytania. Za każdym razem, gdy pakiet zadaje pytanie, a w wielu przypadkach nie zadaje pytania, ale korzysta z opcji domyślnej, zarówno pytanie, jak i odpowiedź są zapisywane w specjalnej bazie danych Debiana zwanej debconf. Możemy zajrzeć do bazy odpowiedzi (a nawet ustawić je przed instalacją samego pakietu - debconf-set-selections), do tego potrzebujemy narzędzia debconf-get-selections ze składu debconf-utils. Niestety nic ciekawego nie znaleziono :(debconf-get-selections |grep -i resume wrócił pusty).

instalator Debiana

Instalator posiada własną bazę danych odpowiedzi na pytania: /var/log/installer/cdebconf/questions.dat. Niestety nie ma też ani słowa o naszym życiorysie.
Ale w pobliżu są kłody, m.in. syslog, w którym zapisywany jest cały dziennik instalacji. Pakiet instalatora podstawowego jest tam wspomniany i na nim strona widzimy link do surowców.

Wewnątrz nich z łatwością znajdziemy 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 celu, a funkcja, która nas interesuje, to get_resume_partition, który czyta /proc/swaps i wybiera największy z nich. Zamiana pochodzi od partmana.

Odpowiedź na nasze zadanie testowe: plik jest tworzony przez instalatora w /target w momencie instalacji, tj. mówimy o dobrze znanym, ale artefakcie. W istniejących pakietach w systemie nie ma nikogo ani niczego, co mogłoby zmienić ten plik.

Reasumując

  1. dpkg i debconf to główne metody wyszukiwania dostawców plików.
  2. wyszukiwanie w /var/lib/dpkg/info pozwala zobaczyć operacje na plikach podczas fazy instalacji.
  3. Instalator może tworzyć pliki artefaktów, które następnie nigdy nie będą zmieniane przez nikogo (z wyjątkiem użytkownika), co można zobaczyć w kodzie instalatora.

Źródło: www.habr.com

Dodaj komentarz