Hvor er denne konfiguration fra? [Debian/Ubuntu]

Formålet med dette indlæg er at vise debian/ubuntu fejlfindingsteknikker relateret til "find kilde" i systemkonfigurationsfilen.

Testeksempel: efter lang hån af tar.gz kopien af ​​det installerede OS og efter dets gendannelse og installation af opdateringer, får vi beskeden:

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.

Formål: at forstå, hvor denne værdi (U1563304817I0) kom fra, og hvordan den ændres korrekt. Dette er det første eksempel, jeg stødte på, ikke særlig interessant i sig selv, men praktisk til at vise praktiske metoder til at arbejde med Linux..

Trin nummer 1: Hvor kom RESUME fra?

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

Vi rekursivt (-r) vi leder efter en omtale af denne variabel i mappen /etc (hvor de fleste konfigurationer er). Vi finder et conf.d snippet, der eksplicit bruges af pakken initramfs-tools.

Hvor er dette uddrag fra?

Der er tre muligheder:

  1. Magisk artefakt (nogen satte og glemte)
  2. config fra pakken
  3. Konfiguration genereret af et eller andet script fra systempakker

Tjek #2 (som den nemmeste):

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

dpkg -S giver os mulighed for at søge i databasen med installerede filer og finde hvilken pakke filen tilhører. Her er et eksempel på en vellykket søgning:

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

Tilbage til vores opgave: filen initramfs-tools/conf.d/resume er ikke installeret i systemet fra pakken. Måske er det genereret i postinst/preinst-pakkescriptet? Kontrollerer version nummer 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

I kataloget /var/lib/dpkg/info/ der er udpakkede versioner af alle "metafiler" af pakker (installations-/fjernelsesscripts, pakkebeskrivelser osv.). Overraskende nok fjernes denne fil i postrm (ved afinstallation) af initramfs-tools-core-pakken. Lad os se indholdet af hans postinst... Intet at gøre med conf.d mappen.

Lad os se på filerne i pakken initramfs-tools-core.

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

Team dpkg -L giver dig mulighed for at se alle de filer, der er i systemet fra den angivne pakke. Jeg har fremhævet en interessant fil at studere. Undersøgelse af filen viser, hvordan denne variabel bruges, men giver ikke svar på, hvor den kommer fra.

debconf

Det viser sig, at dette er nogens artefakt. Hvis? Før vi dykker ned i installationsprogrammet, lad os tage et kig på en anden vigtig Debian-infrastruktur – besvare spørgsmål. Hver gang en pakke stiller et spørgsmål, og i mange tilfælde, når den ikke stiller et spørgsmål, men bruger standarden, bliver både spørgsmålet og svaret registreret i en speciel database i Debian kaldet debconf. Vi kan se på databasen med svar (og endda afsløre dem, før vi installerer selve pakken - debconf-set-selections), til dette har vi brug for et hjælpeprogram debconf-get-selections fra sammensætningen debconf-utils. Desværre blev der ikke fundet noget interessant :(debconf-get-selections |grep -i resume returneres tom).

debian-installationsprogram

Installationsprogrammet har sin egen database med svar på spørgsmål: /var/log/installer/cdebconf/questions.dat. Desværre er der heller ingen ord om vores CV.
Men der er træstammer i nærheden, inkl. syslog, hvor hele installationsloggen skrives. Den nævner base-installer-pakken, og den side vi kan se linket til raws.

Inde i dem kan vi nemt finde svaret på vores spørgsmål:

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

mapdevfs er et hjælpeprogram med et klart formål, og den funktion vi er interesseret i er get_resume_partition, som læser /proc/swaps og vælger den største der. Swap kommer fra partman.

Svaret på vores testopgave er: filen oprettes af installationsprogrammet i /target på installationstidspunktet, dvs. vi taler om velkendte, men en artefakt. Der er ingen og intet i de eksisterende pakker i systemet til at ændre denne fil.

Opsummering

  1. dpkg og debconf er de vigtigste metoder til at finde filudbydere.
  2. søgning i /var/lib/dpkg/info giver dig mulighed for at se filhandlinger under installationsfasen.
  3. Installationsprogrammet kan oprette artefaktfiler, der aldrig ændres af nogen (undtagen brugeren), og dette kan ses i installationskoden.

Kilde: www.habr.com

Tilføj en kommentar