การกำหนดค่านี้มาจากไหน [เดเบียน/อูบุนตู]

วัตถุประสงค์ของโพสต์นี้คือเพื่อแสดงเทคนิคการดีบักในเดเบียน/อูบุนตูที่เกี่ยวข้องกับ "การค้นหาแหล่งที่มา" ในไฟล์การกำหนดค่าระบบ

ตัวอย่างการทดสอบ: หลังจากการเยาะเย้ยสำเนา 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-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

กลับไปที่งานของเรา: file 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/ มีแพ็คเกจ “metafiles” ทั้งหมดในรูปแบบที่คลายแพ็กแล้ว (สคริปต์การติดตั้ง/การลบ คำอธิบายแพ็คเกจ ฯลฯ) น่าแปลกที่ไฟล์นี้ถูกลบออกใน postrm (เมื่อถอนการติดตั้ง) ของแพ็กเกจ initramfs-tools-core มาดูเนื้อหาของ postinst... ไม่มีอะไรเกี่ยวข้องกับไดเร็กทอรี conf.d

มาดูไฟล์ที่รวมอยู่ในแพ็คเกจกัน initramfs-tools-core.

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

ทีม dpkg -L ช่วยให้คุณดูไฟล์ทั้งหมดที่อยู่ในระบบจากแพ็คเกจที่ระบุ ฉันได้เน้นไฟล์ที่น่าสนใจสำหรับการศึกษา การตรวจสอบไฟล์จะแสดงวิธีการใช้ตัวแปรนี้ แต่ไม่ได้บอกว่าตัวแปรนี้มาจากไหน

ดีเบตคอนเฟอเรนซ์

ปรากฎว่านี่คือสิ่งประดิษฐ์ของใครบางคน ของใคร? ก่อนที่จะเจาะลึกถึงตัวติดตั้ง เรามาดูโครงสร้างพื้นฐาน 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 และเลือกอันที่ใหญ่ที่สุดที่นั่น Swap มาจาก partman

คำตอบสำหรับงานทดสอบของเรา: ไฟล์ถูกสร้างขึ้นโดยตัวติดตั้งใน /target ณ เวลาที่ทำการติดตั้ง เช่น เรากำลังพูดถึงสิ่งที่เป็นที่รู้จัก แต่เป็นสิ่งประดิษฐ์ ไม่มีใครหรือสิ่งใดในแพ็คเกจที่มีอยู่ในระบบที่สามารถเปลี่ยนไฟล์นี้ได้

ข้อสรุปถึง

  1. dpkg และ debconf เป็นวิธีการหลักในการค้นหาผู้ให้บริการไฟล์
  2. การค้นหาใน /var/lib/dpkg/info ช่วยให้คุณเห็นการดำเนินการกับไฟล์ระหว่างขั้นตอนการติดตั้ง
  3. โปรแกรมติดตั้งสามารถสร้างไฟล์สิ่งประดิษฐ์ที่ไม่มีใครเปลี่ยนแปลงได้ (ยกเว้นผู้ใช้) และสามารถดูได้ในรหัสโปรแกรมติดตั้ง

ที่มา: will.com

เพิ่มความคิดเห็น