این کانفیگ از کجا می آید؟ [دبیان/اوبونتو]

هدف از این پست نشان دادن یک تکنیک اشکال زدایی در دبیان/ابونتو مربوط به "یافتن منبع" در فایل پیکربندی سیستم است.

مثال تست: پس از تمسخر زیاد کپی 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 باشید (جایی که اکثر تنظیمات در آن قرار دارند). ما قطعه 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/ نسخه‌های بدون بسته‌بندی تمام «متافایل» بسته‌ها (اسکریپت‌های نصب/حذف، توضیحات بسته و غیره) وجود دارد. با کمال تعجب، این فایل در postrm (در هنگام حذف) بسته initramfs-tools-core حذف شده است. بیایید به محتویات postinst آن نگاه کنیم... هیچ چیزی به دایرکتوری conf.d مربوط نمی شود.

بیایید به فایل های موجود در بسته نگاه کنیم initramfs-tools-core.

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

تیم dpkg -L به شما این امکان را می دهد که تمام فایل های موجود در سیستم را از بسته مشخص شده مشاهده کنید. من فایلی را که برای مطالعه جالب است هایلایت کرده ام. بررسی فایل نحوه استفاده از این متغیر را نشان می دهد، اما نمی گوید از کجا آمده است.

debconf

معلوم می شود که این مصنوع کسی است. چه کسی؟ قبل از ورود به نصب کننده، بیایید نگاهی به زیرساخت مهم دبیان بیاندازیم - پاسخ به سوالات. هر بار که یک بسته سوالی می پرسد و در بسیاری از موارد که سوالی نمی پرسد اما از گزینه پیش فرض استفاده می کند، سوال و پاسخ هر دو در یک پایگاه داده خاص در دبیان به نام debconf ثبت می شود. ما می توانیم به پایگاه داده پاسخ ها نگاه کنیم (و حتی آنها را قبل از نصب خود بسته تنظیم کنیم - debconf-set-selections)، برای این ما به یک ابزار نیاز داریم debconf-get-selections از ترکیب debconf-utils. متاسفانه چیز جالبی پیدا نشد :(debconf-get-selections |grep -i resume خالی برگشت).

debian-installer

نصب کننده پایگاه داده خود را از پاسخ به سؤالات دارد: /var/log/installer/cdebconf/questions.dat. متأسفانه در مورد رزومه ما نیز صحبتی نشده است.
اما سیاهههای مربوط به این نزدیکی وجود دارد، از جمله. syslog، جایی که کل گزارش نصب نوشته شده است. بسته پایه نصب کننده در آنجا و روی آن ذکر شده است صفحه ما می توانیم پیوند به raw ها را ببینیم.

در داخل آنها می توانیم به راحتی پاسخ سوال خود را پیدا کنیم:

  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. نصب کننده می تواند فایل های مصنوع را ایجاد کند که هرگز توسط کسی (به جز کاربر) تغییر نمی کند و این را می توان در کد نصب کننده مشاهده کرد.

منبع: www.habr.com

اضافه کردن نظر