Бул конфигурация кайдан келет? [Debian/Ubuntu]

Бул посттун максаты debian/ubuntuда системанын конфигурация файлында "булагын табууга" байланыштуу мүчүлүштүктөрдү оңдоо ыкмасын көрсөтүү.

Сыноо мисалы: орнотулган OSтин 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 каталогунан бул өзгөрмө жөнүндө сөз табыңыз (конфигурациялардын көбү ошол жерде). Биз initramfs-tools пакети тарабынан так колдонулган conf.d үзүндүсүн табабыз.

Бул үзүндү кайдан алынган?

үч параметрлер бар:

  1. Сыйкырдуу артефакт (кимдир бирөө коюп, унутуп калган)
  2. Пакеттен конфигурациялоо
  3. Конфигурация тутум пакеттеринен кээ бир скрипт тарабынан түзүлгөн

№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/ пакеттердин бардык “метафайлдарынын” таңгактан чыгарылбаган версиялары бар (орнотуу/чыгаруу скрипттери, пакеттин сүрөттөмөлөрү ж.б.). Таң калыштуусу, бул файл initramfs-tools-core пакетинин postrm (чыгаруу боюнча) алынып салынган. Анын постинсттин мазмунун карап көрөлү... conf.d каталогуна эч кандай тиешеси жок.

Пакетке кирген файлдарды карап көрөлү initramfs-tools-core.

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

команда dpkg -L көрсөтүлгөн пакеттен тутумдагы бардык файлдарды көрүүгө мүмкүнчүлүк берет. Мен изилдөө үчүн кызыктуу файлды бөлүп койдум. Файлды изилдөө бул өзгөрмө кандайча колдонуларын көрсөтөт, бирок анын кайдан келгенин айтпайт.

debconf

Көрсө бул бирөөнүн экспонаты экен. Кимдики? Орноткучка кирүүдөн мурун, келгиле, дагы бир маанилүү Debian инфраструктурасын - суроолорго жоопторду карап көрөлү. Пакет суроо берген сайын жана көп учурларда ал суроо бербей, демейки опцияны колдонгондо, суроо да, жооп да Debianдагы debconf деп аталган атайын маалымат базасына жазылат. Биз жооптордун маалымат базасын карай алабыз (жана аларды пакеттин өзүн орнотуудан мурун да орнотсок болот - debconf-set-selections), бул үчүн бизге пайдалуу программа керек debconf-get-selections курамынан debconf-utils. Тилекке каршы, кызыктуу эч нерсе табылган жок :(debconf-get-selections |grep -i resume бош кайтып келди).

debian-орнотуучу

Орнотуучу суроолорго жооптордун өзүнүн маалымат базасына ээ: /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 окуйт жана ал жерде эң чоңун тандайт. Своп партменден келет.

Биздин тесттик тапшырмабыздын жообу: файл орнотуу учурунда /target ичинде орнотуучу тарабынан түзүлөт, б.а. биз белгилүү, бирок артефакт жөнүндө сөз болуп жатат. Системанын учурдагы пакеттеринде бул файлды өзгөртө турган эч ким же эч нерсе жок.

жыйынтыктап жатып

  1. dpkg жана debconf файл провайдерлерин табуу үчүн негизги ыкмалары болуп саналат.
  2. /var/lib/dpkg/info ичинде издөө орнотуу фазасында файлдардагы операцияларды көрүүгө мүмкүндүк берет.
  3. Орноткуч артефакт файлдарын түзө алат, аларды эч ким эч качан өзгөртпөйт (колдонуучудан башка), жана муну орнотуучу кодунан көрүүгө болот.

Source: www.habr.com

Комментарий кошуу