Целта на овој пост е да се прикаже техника за дебагирање во 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.
Од каде е овој фрагмент?
Постојат три опции:
- Магичен артефакт (некој го ставил и заборавил)
- Конфигурација од пакетот
- Конфигурација генерирана од некоја скрипта од системски пакети
Ајде да го провериме бр. 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 во моментот на инсталацијата, т.е. зборуваме за добро познат, но артефакт. Нема никој или ништо во постоечките пакети во системот што може да ја промени оваа датотека.
Сумирајќи
- dpkg и debconf се главните методи за наоѓање даватели на датотеки.
- пребарувањето во /var/lib/dpkg/info ви овозможува да ги видите операциите на датотеките за време на фазата на инсталација.
- Инсталаторот може да креира датотеки со артефакти кои потоа никој не ги менува (освен корисникот), а тоа може да се види во кодот за инсталатер.
Извор: www.habr.com