Որտեղի՞ց է գալիս այս կազմաձևը: [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) և ինչպես ճիշտ փոխել այն: Սա առաջին օրինակն է, որն ինքնին առանձնապես հետաքրքիր չէ, բայց հարմար է Linux-ի հետ աշխատելու գործնական մեթոդներ ցուցադրելու համար.

Քայլ թիվ 1. որտեղի՞ց է առաջացել ՌԵԶՅՈՒՄԸ:

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

Մենք ռեկուրսիվ (-r) փնտրեք այս փոփոխականի հիշատակումը /etc գրացուցակում (որտեղ գտնվում են կազմաձևերի մեծ մասը): Մենք գտնում ենք conf.d հատվածը, որն ակնհայտորեն օգտագործվում է initramfs-tools փաթեթի կողմից։

Որտեղի՞ց է այս հատվածը:

Կան երեք տարբերակ.

  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 վերադարձել է դատարկ):

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-ը և այնտեղ ընտրում ամենամեծը: Փոխանակումը գալիս է partman-ից:

Մեր թեստային առաջադրանքի պատասխանը. ֆայլը ստեղծվում է տեղադրողի կողմից /target-ում տեղադրման պահին, այսինքն. Խոսքը հայտնի, բայց արտեֆակտի մասին է։ Համակարգում գոյություն ունեցող փաթեթներում ոչ ոք կամ որևէ բան չկա, որը կարող է փոխել այս ֆայլը:

Ամփոփելով

  1. dpkg-ը և debconf-ը ֆայլերի մատակարարների որոնման հիմնական մեթոդներն են:
  2. /var/lib/dpkg/info-ում որոնումը թույլ է տալիս տեսնել գործառնությունները ֆայլերի վրա տեղադրման փուլում:
  3. Տեղադրողը կարող է ստեղծել արտեֆակտ ֆայլեր, որոնք այնուհետև երբեք չեն փոխվում որևէ մեկի կողմից (բացի օգտվողից), և դա կարելի է տեսնել տեղադրողի կոդում:

Source: www.habr.com

Добавить комментарий