Bu yapılandırma nereden geliyor? [Debian/Ubuntu]

Bu yazının amacı, debian/ubuntu'da sistem yapılandırma dosyasındaki "kaynağı bulma" ile ilgili bir hata ayıklama tekniğini göstermektir.

Test örneği: Kurulu işletim sisteminin tar.gz kopyasıyla alay edildikten ve onu geri yükleyip güncellemeleri yükledikten sonra şu mesajı alıyoruz:

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.

Hedef: Bu değerin (U1563304817I0) nereden geldiğini ve doğru şekilde nasıl değiştirileceğini anlamak. Bu, kendi başına pek ilginç olmayan, ancak Linux ile çalışmanın pratik yöntemlerini göstermeye uygun olan ilk örnektir..

Adım 1: DEVAM nereden geldi?

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

Yinelemeli olarak (-r) /etc dizininde (yapılandırmaların çoğunun bulunduğu yer) bu değişkenin bahsini arayın. initramfs-tools paketi tarafından açıkça kullanılan conf.d pasajını buluyoruz.

Bu kesit nereden?

Üç seçenek vardır:

  1. Sihirli eser (birisi onu koydu ve unuttu)
  2. Paketten yapılandırma
  3. Sistem paketlerindeki bazı komut dosyaları tarafından oluşturulan yapılandırma

2 numarayı kontrol edelim (en basiti):

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

dpkg -S yüklü dosyaların veritabanında arama yapmamızı ve dosyanın hangi pakete ait olduğunu bulmamızı sağlar. İşte başarılı bir arama örneği:

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

Görevimize dönelim: dosya initramfs-tools/conf.d/resume Paketten sisteme kurulmaz. Belki paketin postinst/preinst betiğinde oluşturulmuştur? 3 numaralı versiyonu kontrol edelim.

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm:    rm -f /etc/initramfs-tools/conf.d/resume

Kataloğunda /var/lib/dpkg/info/ paketlerin tüm "meta dosyalarının" paketlenmemiş versiyonları vardır (kurulum/kaldırma komut dosyaları, paket açıklamaları vb.). Şaşırtıcı bir şekilde, bu dosya initramfs-tools-core paketinin postrm'inde (kaldırma sırasında) kaldırılır. Postinst içeriğine bakalım... Conf.d dizini ile ilgili bir şey yok.

Pakette yer alan dosyalara bakalım initramfs-tools-core.

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

Ekip dpkg -L Sistemde bulunan tüm dosyaları belirtilen paketten görüntülemenizi sağlar. Çalışmak için ilginç olan bir dosyayı vurguladım. Dosyanın incelenmesi bu değişkenin nasıl kullanıldığını gösterir ancak nereden geldiğini söylemez.

debconf

Bunun birinin eseri olduğu ortaya çıktı. Kimin? Yükleyiciye dalmadan önce, bir başka önemli Debian altyapısına, soruların yanıtlarına bir göz atalım. Bir paket her soru sorduğunda ve çoğu durumda soru sormayıp varsayılan seçeneği kullandığında, hem soru hem de yanıt Debian'da debconf adı verilen özel bir veritabanına kaydedilir. Yanıtların veritabanına bakabiliriz (ve hatta bunları paketin kendisini kurmadan önce ayarlayabiliriz - debconf-set-selections), bunun için bir yardımcı programa ihtiyacımız var debconf-get-selections kompozisyondan debconf-utils. Ne yazık ki ilginç bir şey bulunamadı :(debconf-get-selections |grep -i resume boş döndü).

debian yükleyici

Yükleyicinin soruların yanıtlarını içeren kendi veri tabanı vardır: /var/log/installer/cdebconf/questions.dat. Ne yazık ki özgeçmişimiz hakkında da tek bir kelime yok.
Ancak yakınlarda kütükler var. syslog, tüm kurulum günlüğünün yazıldığı yer. Temel yükleyici paketinden burada bahsediliyor ve üzerinde sayfa raw'ların bağlantısını görebiliriz.

Bunların içinde sorumuzun cevabını rahatlıkla bulabiliriz:

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

Mapdevfs net bir amacı olan bir yardımcı programdır ve ilgilendiğimiz işlev get_resume_partition/proc/swaps okur ve oradaki en büyüğünü seçer. Takas partman'dan geliyor.

Test görevimizin cevabı: Dosya, kurulum sırasında kurulumcu tarafından /target konumunda oluşturulur, yani. tanınmış ama bir eserden bahsediyoruz. Sistemdeki mevcut paketlerde bu dosyayı değiştirebilecek hiç kimse veya hiçbir şey bulunmamaktadır.

Özetleme

  1. dpkg ve debconf, dosya sağlayıcılarını bulmanın ana yöntemleridir.
  2. /var/lib/dpkg/info içinde arama yapmak, kurulum aşamasında dosyalar üzerindeki işlemleri görmenizi sağlar.
  3. Yükleyici, daha sonra hiç kimse (kullanıcı dışında) tarafından değiştirilmeyen yapay dosyalar oluşturabilir ve bu, yükleyici kodunda görülebilir.

Kaynak: habr.com

Yorum ekle