วิธีการเติมไดเรกทอรี / dev เมื่อสร้าง initrd ของฉันเอง


9

ฉันพยายามที่จะเรียนรู้สิ่งที่เกี่ยวกับ initrd ฉันได้ทำตามบทช่วยสอนนี้เพื่อสร้าง initrd ของฉันเองตั้งแต่เริ่มต้นและฉันได้ติดตั้ง busybox ไว้ในนั้น จากนั้นฉันทำ. iso จากนั้นด้วย isolinux ดังนั้นฉันสามารถทดสอบใน virtualbox มันใช้งานได้ดี!

ฉันมีคำสั่งพื้นฐานจาก busybox ดังนั้นฉันจึงต้องการติดตั้งระบบไฟล์ แต่ไดเรกทอรี / dev เกือบจะว่างเปล่า (ไม่มี sda) ยกเว้นไฟล์บางไฟล์ที่ฉันสร้างขึ้นในขณะที่ทำตามบทช่วยสอน ฉันเรียนรู้เกี่ยวกับ udev และฉันคิดว่านี่เป็นสิ่งที่ฉันต้องการ อย่างไรก็ตามฉันไม่แน่ใจว่าจะทำอย่างไรต่อไป

ฉันควรจะคว้าซอร์สโค้ดล่าสุดจาก udev รวบรวมและเพิ่มลงใน initrd ของฉันหรือไม่ แล้วโทร / bin / udev หรืออะไรทำนองนั้นในสคริปต์ init ของฉัน หรือมีวิธีอื่น / ดีกว่าในการเติมไดเรกทอรี / dev?

แก้ไข:ข้อมูลเพิ่มเติมและการปรับปรุงบางอย่างเกี่ยวกับสิ่งที่ฉันได้ทำไปแล้ว

  • ฉันทดสอบทุกอย่างในกล่องเสมือน ฉันเพิ่งติดตั้ง Ubuntu น้อยที่สุดในกล่องเสมือนทำ. iso จาก initrd ของฉันแล้วบูตจาก iso ใน virtualbox
  • ฉันใช้ vmlinuz และ/lib/modulesมีอยู่ใน debian-businesscard.iso และคัดลอกสิ่งเหล่านั้นไปยัง initrd ของฉันซึ่งฉันสร้างขึ้นโดยทำตามบทช่วยสอนที่ฉันเชื่อมโยงไว้ก่อนหน้านี้
  • เคอร์เนลมี CONFIG_DEVTMPFS=y
  • อุปกรณ์บางตัวแสดงขึ้นมา/devเช่น tty0-tty63 และอุปกรณ์อื่น ๆ แต่ไม่มี sda / hda
  • วิ่งlspci -kใน OS ของฉันทำงานอยู่ในปัจจุบันและในกล่องเสมือนการตรวจสอบโมดูลในการใช้งาน SATA Controllerบอกว่ามันใช้ahciเป็นโมดูล
  • เมื่อฉันรันmodprobe -v ahciมันบ่นมากเกี่ยวกับสัญลักษณ์ "ที่ไม่รู้จัก: ata_some_stuff" แต่หลังจากนั้นก็จะส่งกลับสิ่งที่ชอบSCSI Subsystem initialized, และATA-6: VBOX HARDDISK Direct-Access ATA VBOX HARDDISKแต่อุปกรณ์ยังคงไม่มี harddrive /devพบใน

/init/สคริปต์ปัจจุบันของฉันเป็นดังนี้:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

ใครบ้างมีความคิดว่าฉันกำลังทำอะไรผิดและฉันควรจะทำอะไรแทน

คำตอบ:


12

ในขณะที่คำตอบของกิลส์นั้นถูกต้อง แต่เป็นโรงเรียนเก่า :-) อีกรายการของบันทึกย่อ (nitpick ในคำศัพท์มากกว่าอะไร) คือคำแนะนำที่คุณเชื่อมโยงไปยังเป็นคำแนะนำเกี่ยวกับวิธีการสร้าง initramfs ไม่ใช่ initrd ทั้งสองมีความคล้ายคลึงกันและให้บริการตามวัตถุประสงค์เดียวกัน แต่มีความแตกต่างในการจัดเก็บและโหลดภาพ

อย่างไรก็ตามคำตอบสำหรับคำถามของคุณนั้นง่ายจริงๆ

  1. เปิดใช้งานdevtmpfsในเคอร์เนล ( CONFIG_DEVTMPFS=y)
  2. ทำงานmount -t devtmpfs none /devเป็นสิ่งแรกในinitสคริปต์ของคุณ

แค่นั้นแหละ. devtmpfs จะเติมข้อมูล/devเหมือน udev คุณไม่จำเป็นต้องแม้กระทั่งเพื่อเติม/dev(ในภาพ initramfs) ด้วยพื้นฐานชอบnull, หรือzeroconsole


ขอบคุณสำหรับความคิดเห็นของคุณ ฉันรันคำสั่งของคุณและตอนนี้ฉันมีอุปกรณ์เพิ่มเติม แต่ยังไม่มี sda หรือ hda ที่จะเมานต์ มีบางอย่างที่ฉันลืมทำหรือไม่? ฉันใช้เคอร์เนล vmlinuz ที่ฉันได้รับจาก debians live system ฉันควรรวบรวมของจริงหรือไม่?
Carlito

@Carlito เคอร์เนลนี้เปิดใช้งาน devtmpfs อยู่หรือไม่ (ตรวจสอบไฟล์กำหนดค่า) Debian เพิ่งเปลี่ยนเป็น devtmpfs
Gilles 'หยุดความชั่วร้าย'

@Gilles ไม่มีไฟล์ config ที่ให้มา แต่ฉันโหลดเคอร์เนลที่ฉันได้รับจาก debian แล้วไฟล์ config พูดCONFIG_DEVTMPFS=yแต่ฉันยังไม่ได้รับอุปกรณ์ sda ใด ๆ ฉันคิดว่าเป็นเพราะฉันไม่ได้โหลดโมดูลใด ๆ (lsmod ส่งคืนอะไร) ฉันควรโหลดโมดูลใดเพื่อรับอุปกรณ์ระบบไฟล์ หรือมีอะไรอีกที่ฉันลืมไป
Carlito

@Carlito ใช่ถ้าคุณมีสิ่งอื่น ๆ ปรากฏขึ้น/devไม่เพียงแค่ไดรฟ์แล้ว devtmpfs ทำงานและคุณอาจหายไปโมดูลคอนโทรลเลอร์ดิสก์ (ตามที่คุณเดา) น่าเสียดายที่วิธีเดียวที่จะทราบว่าไดรเวอร์ / โมดูลใดที่คุณต้องการคืออ่านข้อมูลสำหรับเคอร์เนล config หรือรันlspci -kในระบบ linux ที่กำลังรันอยู่ (ซึ่งจะแสดงให้คุณเห็นว่าไดรเวอร์เคอร์เนลของส่วนประกอบต่างๆในระบบของคุณกำลังใช้งาน) .
Patrick

1
@ CiroSantilli709 大抓捕六四事件法轮功CONFIG_DEVTMPFS_MOUNT=yไม่มีผลกระทบใด ๆ กับ initramfs จากข้อความช่วยเหลือเคอร์เนล: "ตัวเลือกนี้ไม่ส่งผลกระทบต่อการบูตโดยเริ่มต้นจาก initramfs ที่นี่ระบบไฟล์ devtmpfs ต้องติดตั้งด้วยตนเองเสมอหลังจากติดตั้งรูท" "
Patrick

4

Udev จะเติมข้อมูล/devโดยอัตโนมัติตามไดรเวอร์ที่โหลดลงในเคอร์เนลและอุปกรณ์ที่ไดรเวอร์เหล่านี้ตรวจจับ ชื่อของอุปกรณ์และการอนุญาตจะขึ้นอยู่กับชุดของกฎที่ผู้ดูแลระบบสามารถปรับแต่งได้ ระบบ Linux ส่วนใหญ่ควรใช้ udev ข้อยกเว้นคือระบบ (มักฝังอยู่) ที่ทราบการกำหนดค่าฮาร์ดแวร์ในเวลาที่ติดตั้งระบบและจะไม่เปลี่ยนแปลงในภายหลัง

โดยทั่วไปแล้วคุณจะโทรudevเร็วพอสมควรในลำดับการเริ่มต้นของคุณ หนึ่งในไม่กี่สิ่งที่คุณควร (ต้อง) ทำก่อนที่ติดตั้งและ/proc /sysหลังจากเริ่มต้น daemon ให้เรียกใช้udevadm trigger --action=add; udevadm settleเพื่อประมวลผล udev เหตุการณ์ที่ค้างอยู่ทั้งหมดจากเคอร์เนล ( trigger) และรอจนกว่าจะประมวลผลเหตุการณ์ก่อนดำเนินการต่อ ( settle) จากนั้นคุณสามารถค้นหาอุปกรณ์ที่มีระบบไฟล์รูทได้

นอกจากudevdไบนารีคุณจะต้องใช้ส่วนอื่น ๆ ของudevinitrd ของคุณ ซึ่งรวมถึงแฟ้มการกำหนดค่าใน/etc/udevการกำหนดค่าฐาน/lib/udevเช่นเดียวกับผู้ช่วยไบนารีเช่นยังอยู่ในscsi_id /lib/udevคุณต้องการโปรแกรมทั้งหมดที่ถูกเรียกจากกฎของ udev ที่คุณรวมไว้ใน initrd

ในตอนท้ายของการเริ่มต้นก่อนที่จะถ่ายโอนการควบคุมไปยังพาร์ทิชันรูทที่แท้จริงคุณจะต้องหยุดudevdเหมือนโปรแกรมอื่น ๆ จากการเริ่มต้น นี้ไม่ได้ถอดอุปกรณ์ใด ๆ /devจาก ใช้mount --move /dev /root/devเพื่อย้ายเมานต์/devไปยังรูทจริง

Gentoo มีคู่มือ initramfsและหน้า wiki initramfsซึ่งพูดถึง udev ท่ามกลางสิ่งอื่น ๆ Initramfs เป็นผู้สืบทอดยุคใหม่ที่จะเริ่มต้นโดยใช้ไฟล์เก็บถาวร cpio มากกว่าอิมเมจระบบไฟล์และด้วยส่วนต่อประสานกระบวนการที่แตกต่างกัน (บน initrd /linuxrcจะต้องออกในขณะที่บน initramfs /initต้องexecเริ่มต้นจากรูทจริง); ระบบส่วนใหญ่เปลี่ยนวันนี้ (แม้ว่าไฟล์นั้นอาจยังถูกเรียกว่า initrd)


ขอบคุณสำหรับคำตอบ. ฉันมาถึงข้อสรุปว่าจริง ๆ แล้วฉันได้สร้าง initramfs แทนการเริ่มต้น แต่ฉันใช้เคอร์เนล vmlinuz ที่ฉันได้รับจาก debians live system ฉันควรรวบรวมเคอร์เนลของตัวเองสำหรับเรื่องนี้ (เพื่อให้ฉันรู้ว่าโมดูลใดที่มีการโหลดฮาร์ดไดรฟ์) หรือมีรุ่นที่น้อยที่สุดที่ฉันสามารถใช้กับโมดูลพื้นฐาน ? ฉันอาจจะดาวน์โหลด udev ล่าสุดและพยายามรวบรวมและเรียกใช้
Carlito

@Carlito ฉันขอแนะนำให้ลองแรกกับ Debian kernel เนื่องจากลืมไดรเวอร์ที่จำเป็นเป็นข้อผิดพลาดทั่วไปเมื่อรวบรวมเคอร์เนลของคุณเอง
Gilles 'หยุดความชั่วร้าย'

แต่ฉันจะรับได้อย่างไร ฉันเพิ่งคัดลอก vmlinuz ฉันพบใน debian-businesscard.iso (อาจไม่ใช่ความคิดที่ดีที่สุด) ฉันควรคัดลอกเคอร์เนลมาตรฐานที่ฉันได้รับจาก ubuntu หรือ debian และไดเร็กทอรี / lib / modules ทั้งหมดหรือไม่
Carlito

@Carlito อย่างน้อยคุณจะต้องมีโมดูลทั้งหมดที่จำเป็นสำหรับฮาร์ดแวร์ของคุณ การค้นหาสิ่งที่คุณต้องการจากการเรียกดูรายการอาจทำได้ยาก วิธีที่ดีที่สุดในการค้นหาสิ่งที่คุณต้องการคือการทำงานlsmodบนระบบที่ใช้งานได้ ดังนั้นเริ่มต้นด้วยสิ่งเหล่านี้จากนั้นตัดอย่างชาญฉลาดหากคุณต้องการประหยัดพื้นที่
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.