Энэ тохиргоо хаанаас ирсэн бэ? [Debian/Ubuntu]

Энэхүү нийтлэлийн зорилго нь debian/ubuntu дээр системийн тохиргооны файлаас "эх сурвалжийг олох"-той холбоотой дибаг хийх аргыг харуулах явдал юм.

Туршилтын жишээ: суулгасан үйлдлийн системийн 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) хаанаас ирсэн, түүнийг хэрхэн зөв өөрчлөх талаар ойлгох. Энэ бол тийм ч сонирхолтой биш боловч Линукстэй ажиллах практик аргуудыг харуулахад тохиромжтой анхны жишээ юм.

Алхам дугаар 1: RESUME хаанаас ирсэн бэ?

# 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 (устгах үед) устгасан байна. Түүний postinst-ийн агуулгыг харцгаая... 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 хоосон буцаж ирсэн).

дебиан-суулгагч

Суулгагч нь асуултанд хариулах өөрийн мэдээллийн сантай: /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-д суулгагч үүсгэсэн, i.e. Бид алдартай, гэхдээ олдворын тухай ярьж байна. Системийн одоо байгаа багцуудад энэ файлыг өөрчлөх хэн ч эсвэл юу ч байхгүй.

Дүгнэж хэлэх

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

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх