Од каде доаѓа оваа конфигурација? [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.

Цел: разберете од каде е оваа вредност (U1563304817I0) и како правилно да ја промените. Ова е првиот пример што наиде, не е особено интересен сам по себе, но удобен за прикажување практични методи на работа со Linux.

Чекор број 1: Од каде дојде РЕЗУМЕ?

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

Ние рекурзивно (-r) побарајте спомнување на оваа променлива во директориумот /etc (каде што се повеќето од конфигурациите). Го наоѓаме фрагментот conf.d, кој јасно се користи од пакетот initramfs-tools.

Од каде е овој фрагмент?

Постојат три опции:

  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

Да се ​​вратиме на нашата задача: датотека 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. Ајде да ја погледнеме содржината на неговиот постинст... Ништо поврзано со директориумот conf.d.

Да ги погледнеме датотеките вклучени во пакетот initramfs-tools-core.

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

Тим dpkg -L ви овозможува да ги видите сите датотеки што се на системот од наведениот пакет. Истакнав датотека која е интересна за проучување. Испитувањето на датотеката покажува како се користи оваа променлива, но не кажува од каде доаѓа.

дебконф

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

дебијан-инсталатер

Инсталаторот има своја база на податоци со одговори на прашања: /var/log/installer/cdebconf/questions.dat. За жал, нема ниту збор за нашата биографија.
Но, има трупци во близина, вкл. syslog, каде што е напишан целиот дневник за инсталација. Таму е спомнат и пакетот за инсталирање на базата, и на него страница можеме да ја видиме врската до суровите.

Внатре во нив лесно можеме да го најдеме одговорот на нашето прашање:

  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 во моментот на инсталацијата, т.е. зборуваме за добро познат, но артефакт. Нема никој или ништо во постоечките пакети во системот што може да ја промени оваа датотека.

Сумирајќи

  1. dpkg и debconf се главните методи за наоѓање даватели на датотеки.
  2. пребарувањето во /var/lib/dpkg/info ви овозможува да ги видите операциите на датотеките за време на фазата на инсталација.
  3. Инсталаторот може да креира датотеки со артефакти кои потоа никој не ги менува (освен корисникот), а тоа може да се види во кодот за инсталатер.

Извор: www.habr.com

Додадете коментар