الغرض من هذا المنشور هو إظهار تقنيات تصحيح الأخطاء debian / ubuntu المتعلقة بـ "find source" في ملف تهيئة النظام.
مثال اختبار: بعد فترة طويلة من الاستهزاء بنسخة 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: من أين أتت RESUME؟
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap
نحن بشكل متكرر (-r
) نبحث عن ذكر لهذا المتغير في الدليل / etc (حيث توجد معظم التكوينات). نجد مقتطف conf.d يتم استخدامه بشكل صريح بواسطة حزمة أدوات initramfs.
من أين هذا المقتطف؟
هناك ثلاثة خيارات:
- قطعة أثرية سحرية (وضع شخص ما ونسي)
- التكوين من الحزمة
- تم إنشاء التكوين بواسطة بعض البرامج النصية من حزم النظام
الاختيار رقم 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. دعونا نرى محتويات بريده ... لا علاقة له بمجلد conf.d.
لنلق نظرة على الملفات الموجودة في الحزمة initramfs-tools-core
.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...
فريق dpkg -L
يسمح لك بعرض جميع الملفات الموجودة في النظام من الحزمة المحددة. لقد أبرزت ملفًا مثيرًا للاهتمام للدراسة. يُظهر فحص الملف كيفية استخدام هذا المتغير ، لكنه لا يجيب من أين أتى.
com.debconf
اتضح أن هذه قطعة أثرية لشخص ما. لمن؟ قبل التعمق في برنامج التثبيت ، دعنا نلقي نظرة على بنية أساسية أخرى مهمة في دبيان - الإجابة عن الأسئلة. في كل مرة تطرح الحزمة سؤالاً ، وفي كثير من الحالات عندما لا تطرح سؤالاً ولكنها تستخدم الافتراضي ، يتم تسجيل السؤال والإجابة في قاعدة بيانات خاصة في دبيان تسمى 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'e في وقت التثبيت ، أي نحن نتحدث عن قطعة أثرية معروفة جيدًا. لا يوجد أحد ولا شيء في الحزم الموجودة في النظام لتغيير هذا الملف.
إجمال
- dpkg و debconf هما الطريقتان الرئيسيتان للعثور على موفري الملفات.
- يتيح لك البحث / var / lib / dpkg / info رؤية عمليات الملف أثناء مرحلة التثبيت.
- يمكن للمثبت إنشاء ملفات أثرية لا يغيرها أي شخص بعد ذلك (باستثناء المستخدم) ، ويمكن رؤية ذلك في كود المثبت.
المصدر: www.habr.com