Dari mana asalnya konfigurasi ini? [Debian/Ubuntu]

Tujuan siaran ini adalah untuk menunjukkan teknik penyahpepijatan dalam debian/ubuntu yang berkaitan dengan "mencari sumber" dalam fail konfigurasi sistem.

Contoh ujian: selepas banyak mengejek salinan tar.gz OS yang dipasang dan selepas memulihkannya dan memasang kemas kini, kami menerima mesej:

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.

Matlamat: memahami dari mana nilai ini (U1563304817I0) datang dan cara menukarnya dengan betul. Ini adalah contoh pertama yang ditemui, tidak begitu menarik dengan sendirinya, tetapi mudah untuk menunjukkan kaedah praktikal bekerja dengan Linux.

Langkah nombor 1: Dari mana RESUME datang?

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

Kami secara rekursif (-r) cari sebutan pembolehubah ini dalam direktori /etc (di mana kebanyakan konfigurasi berada). Kami menemui coretan conf.d, yang jelas digunakan oleh pakej initramfs-tools.

Dari manakah coretan ini?

Terdapat tiga pilihan:

  1. Artifak ajaib (seseorang meletakkannya dan terlupa)
  2. Konfigurasi daripada pakej
  3. Konfigurasi yang dihasilkan oleh beberapa skrip daripada pakej sistem

Mari kita semak No. 2 (sebagai yang paling mudah):

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

dpkg -S membolehkan kami mencari pangkalan data fail yang dipasang dan mencari pakej mana kepunyaan fail tersebut. Berikut ialah contoh carian yang berjaya:

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

Mari kita kembali kepada tugas kita: file initramfs-tools/conf.d/resume tidak dipasang pada sistem daripada pakej. Mungkin ia dijana dalam skrip pakej postinst/preinst? Mari semak versi nombor 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

Dalam katalog /var/lib/dpkg/info/ terdapat versi yang dibongkar bagi semua "fail meta" pakej (skrip pemasangan/penyingkiran, perihalan pakej, dsb.). Yang menghairankan, fail ini dialih keluar dalam postrm (pada nyahpasang) pakej initramfs-tools-core. Mari lihat kandungan postinstnya... Tiada apa-apa yang berkaitan dengan direktori conf.d.

Mari lihat fail yang disertakan dalam pakej initramfs-tools-core.

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

Pasukan dpkg -L membolehkan anda melihat semua fail yang ada pada sistem daripada pakej yang ditentukan. Saya telah highlight satu fail yang menarik untuk dikaji. Memeriksa fail menunjukkan cara pembolehubah ini digunakan, tetapi tidak memberitahu dari mana ia datang.

debconf

Ternyata ini adalah artifak seseorang. kepunyaan siapa Sebelum menyelami pemasang, mari kita lihat satu lagi infrastruktur Debian yang penting - jawapan kepada soalan. Setiap kali pakej bertanya soalan, dan dalam banyak kes apabila ia tidak bertanya soalan tetapi menggunakan pilihan lalai, kedua-dua soalan dan jawapan direkodkan dalam pangkalan data khas dalam Debian yang dipanggil debconf. Kita boleh melihat pangkalan data jawapan (dan juga menetapkannya sebelum memasang pakej itu sendiri - debconf-set-selections), untuk ini kita memerlukan utiliti debconf-get-selections daripada gubahan debconf-utils. Malangnya, tiada apa yang menarik ditemui :(debconf-get-selections |grep -i resume dikembalikan kosong).

debian-pemasang

Pemasang mempunyai pangkalan data sendiri untuk jawapan kepada soalan: /var/log/installer/cdebconf/questions.dat. Malangnya, tidak ada sebarang perkataan tentang resume kami.
Tetapi terdapat balak berdekatan, termasuk. syslog, di mana keseluruhan log pemasangan ditulis. Pakej pemasang asas disebut di sana, dan di atasnya Laman kita boleh lihat pautan ke raws.

Di dalamnya, kami boleh mencari jawapan kepada soalan kami dengan mudah:

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

mapdevfs ialah utiliti dengan tujuan yang jelas, dan fungsi yang kami minati ialah get_resume_partition, yang membaca /proc/swaps dan memilih yang terbesar di sana. Swap datang dari partman.

Jawapan kepada tugas ujian kami: fail dicipta oleh pemasang dalam /target pada masa pemasangan, i.e. kita bercakap tentang yang terkenal, tetapi artifak. Tiada satu atau apa-apa pun dalam pakej sedia ada dalam sistem yang boleh mengubah fail ini.

Merumuskan

  1. dpkg dan debconf adalah kaedah utama untuk mencari pembekal fail.
  2. mencari dalam /var/lib/dpkg/info membolehkan anda melihat operasi pada fail semasa fasa pemasangan.
  3. Pemasang boleh mencipta fail artifak yang kemudiannya tidak pernah diubah oleh sesiapa sahaja (kecuali pengguna), dan ini boleh dilihat dalam kod pemasang.

Sumber: www.habr.com

Tambah komen