Dari mana konfigurasi ini berasal? [Debian / Ubuntu]

Tujuan dari posting ini adalah untuk menunjukkan teknik debugging debian / ubuntu yang terkait dengan "pencarian sumber" dalam file konfigurasi sistem.


Contoh pengujian: setelah lama menggertak salinan tar.gz dari OS yang diinstal dan setelah memulihkannya dan menginstal pembaruan, kami menerima pesan:


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. 

Tujuan: untuk memahami dari mana nilai ini (U1563304817I0) berasal dan bagaimana cara mengubahnya dengan benar. Ini adalah contoh pertama yang muncul, tidak terlalu menarik dalam dirinya sendiri, tetapi nyaman untuk menunjukkan metode praktis bekerja dengan Linux .


Langkah nomor 1: Dari mana RESUME berasal?


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

Kami secara rekursif ( -r ) mencari penyebutan variabel ini di direktori / etc (di mana sebagian besar konfigurasi berada). Kami menemukan conf.d potongan yang secara eksplisit digunakan oleh paket initramfs-tools.


Dari mana cuplikan ini berasal?


Ada tiga opsi:


  1. Artefak ajaib (seseorang menaruh dan lupa)
  2. Konfigurasi dari paket
  3. Konfigurasi yang dihasilkan oleh beberapa skrip dari paket sistem

Periksa No. 2 (sebagai yang paling sederhana):


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

dpkg -S memungkinkan kita untuk mencari basis data file yang diinstal dan menemukan paket milik file tersebut. Berikut adalah contoh pencarian yang berhasil:


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

Kami kembali ke tugas kami: file initramfs-tools/conf.d/resume tidak diinstal ke dalam sistem dari paket. Mungkin itu dihasilkan dalam skrip postinst / preinst dari paket? Periksa nomor versi 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 

Direktori /var/lib/dpkg/info/ berisi versi yang dibongkar dari semua "metafile" paket (instal / uninstall skrip, deskripsi paket, dll.). Anehnya, file ini dihapus dalam postrm (setelah dihapus) dari paket initramfs-tools-core. Mari kita lihat isi postingannya ... Tidak ada yang berhubungan dengan direktori conf.d.


Mari kita lihat file dari paket initramfs-tools-core .


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

Perintah dpkg -L memungkinkan Anda untuk melihat semua file yang ada di sistem dari paket yang ditentukan. Saya menyoroti file yang menarik untuk dipelajari. Memeriksa file menunjukkan bagaimana variabel ini digunakan, tetapi tidak menjawab dari mana asalnya.


debconf


Ternyata ini adalah artefak seseorang. Milik siapa Sebelum masuk ke installer, mari kita lihat infrastruktur Debian penting lainnya - jawaban atas pertanyaan. Setiap kali sebuah paket mengajukan pertanyaan, dan dalam banyak kasus ketika sebuah paket tidak mengajukan pertanyaan, tetapi menggunakan opsi default, baik pertanyaan dan jawabannya diperbaiki dalam database khusus di Debian yang disebut debconf. Kita dapat melihat pada database jawaban (dan bahkan mengaturnya sebelum menginstal paket itu sendiri - debconf-set-selections ), untuk ini kita memerlukan utilitas debconf-get-selections dari debconf-utils . Sayangnya, tidak ada yang menarik ditemukan: ( debconf-get-selections |grep -i resume dikembalikan kosong).


installer-debian


Pemasang memiliki basis data sendiri untuk jawaban atas pertanyaan: /var/log/installer/cdebconf/questions.dat . Sayangnya, tidak ada sepatah kata pun tentang resume kami di sana.
Tetapi ada log di dekatnya, termasuk syslog, di mana seluruh log instalasi ditulis. Paket pemasang-dasar disebutkan di sana, dan pada halamannya kita dapat melihat tautan ke raw.


Di dalamnya, kita dengan mudah menemukan jawaban untuk pertanyaan kita:


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

mapdevfs adalah utilitas dengan tujuan yang jelas, dan fungsi yang kami minati adalah get_resume_partition , yang bertuliskan / proc / swap dan memilih yang terbesar di sana. Swap berasal dari partman.


Jawaban untuk tugas pengujian kami: file dibuat oleh installer di / target pada saat instalasi, mis. kita berbicara tentang yang terkenal, tetapi artefak. Tidak ada seorang pun dan tidak ada dalam paket yang ada di sistem untuk mengubah file ini.


Untuk meringkas


  1. dpkg dan debconf adalah metode utama untuk menemukan penyedia file.
  2. pencarian di / var / lib / dpkg / info memungkinkan Anda melihat operasi file selama fase instalasi.
  3. Pemasang dapat membuat file artefak yang tidak pernah diubah oleh siapa pun (kecuali pengguna), dan ini dapat dilihat dalam kode pemasang.

Source: https://habr.com/ru/post/id461033/


All Articles