initramfs
ไม่ว่าสิ่งที่คุณทำคุณมี ไม่มีการดำเนินการใด ๆ หากไม่มีมันเป็นระบบไฟล์เดียวที่กำหนดให้กับคุณ จากkernel.org :
รูทคืออะไร?
Rootfs
เป็นตัวอย่างพิเศษramfs
(หรือtmpfs
,ถ้าที่เปิดใช้งาน) ซึ่งเป็น
ปัจจุบันอยู่เสมอในระบบ 2.6 คุณไม่สามารถเลิกเมานท์ได้rootfs
ด้วยเหตุผลเดียวกันกับที่คุณไม่สามารถฆ่ากระบวนการเริ่มต้น แทนที่จะมีรหัสพิเศษเพื่อตรวจสอบและจัดการรายการว่างเปล่ามันมีขนาดเล็กลงและง่ายขึ้นสำหรับเคอร์เนลเพื่อให้แน่ใจว่ารายการบางรายการไม่สามารถว่างเปล่าได้
ระบบส่วนใหญ่ก็ติดระบบแฟ้มอื่นมากกว่าrootfs
และไม่สนใจมัน จำนวนพื้นที่ว่างของอินสแตนซ์ที่ว่างเปล่าของ ramfs ใช้เวลาน้อยมาก
หากเปิดใช้งาน* CONFIG_TMPFS *rootfs
จะใช้tmpfs
แทนramfs
ค่าเริ่มต้น ที่จะมีผลบังคับใช้ramfs
,เพิ่ม"rootfstype=ramfs"
บรรทัดคำสั่งเคอร์เนล
initramfs คืออะไร
2.6 เคอร์เนล Linux ทั้งหมดมีไฟล์"cpio"
เก็บถาวรรูปแบบgzippedซึ่งจะถูกแยกออกมาrootfs
เมื่อเคอร์เนลบูทขึ้น เคอร์เนลจะตรวจสอบว่าrootfs
มีไฟล์อยู่"init"
หรือไม่และถ้าเป็นเช่นนั้นจะเรียกใช้งานเป็น PID 1 หากพบinit
กระบวนการนี้มีความรับผิดชอบในการนำระบบที่เหลือมารวมถึงการค้นหาและติดตั้งอุปกรณ์รูทจริง ( ถ้ามี). หากrootfs
ไม่มีinit
โปรแกรมหลังจากcpio
แยกไฟล์เก็บถาวรที่ฝังตัวลงเคอร์เนลจะผ่านไปยังรหัสเก่าเพื่อค้นหาและติดตั้งพาร์ติชันรูทจากนั้นเรียกใช้งานตัวแปรที่แตกต่าง/sbin/init
จากนั้น
ทั้งหมดนี้แตกต่างจากตัวเริ่มต้นเก่าในหลายวิธี:
initrd เก่าเป็นไฟล์แยกต่างหากเสมอในขณะที่ไฟล์เก็บถาวร initramfs เชื่อมโยงกับเคอร์เนลอิมเมจลินุกซ์ (ไดเรกทอรี linux - * / usr ใช้เพื่อสร้างไฟล์เก็บถาวรนี้ในระหว่างการสร้าง)
ไฟล์ initrd เก่าเป็นอิมเมจระบบไฟล์ gzipped (ในบางรูปแบบไฟล์เช่น ext2 ที่ต้องการไดรเวอร์ที่สร้างไว้ในเคอร์เนล) ในขณะที่ไฟล์เก็บถาวร initramfs ใหม่เป็นไฟล์เก็บถาวร gzipped cpio (เช่น tar เพียงง่ายกว่าดู cpio (1) และเอกสารประกอบ / early-userspace / buffer-format.txt) รหัสการสกัด cpio ของเคอร์เนลไม่เพียง แต่เล็กมากเท่านั้น แต่ยังรวมถึงข้อความและข้อมูลที่สามารถละทิ้งได้ในระหว่างกระบวนการบู๊ต
โปรแกรมที่รันโดย initrd เก่า (ซึ่งเรียกว่า / initrd, ไม่ใช่ / init) ทำการตั้งค่าบางอย่างจากนั้นกลับสู่เคอร์เนลในขณะที่โปรแกรม init จาก initramfs ไม่คาดว่าจะกลับไปที่เคอร์เนล (หาก / init จำเป็นต้องปิดการควบคุมมันสามารถ overmount / ด้วยอุปกรณ์รูทใหม่และดำเนินการโปรแกรม init อื่นดูโปรแกรมอรรถประโยชน์ switch_root ด้านล่าง)
เมื่อเปลี่ยนอุปกรณ์รูทเครื่องอื่น initrd จะ pivot_root จากนั้นติดตั้ง ramdisk แต่initramfs เป็น rootfs: คุณไม่สามารถ pivot_root rootfs หรือเลิกเมานท์ แทนที่จะลบทุกอย่างออกจาก rootfs เพื่อเพิ่มพื้นที่ว่าง (ค้นหา -xdev / -exec rm '{}' ';'), overmount rootfs ด้วย root ใหม่ (cd / newmount; mount --move. /; chroot.) แนบ stdin / stdout / stderr กับใหม่ / dev / console และดำเนินการ init ใหม่
เนื่องจากนี่เป็นกระบวนการที่ใช้ความพยายามอย่างน่าทึ่ง (และเกี่ยวข้องกับการลบคำสั่งก่อนที่คุณจะสามารถรันได้) แพ็คเกจ klibc แนะนำโปรแกรมผู้ช่วยเหลือ (utils / run_init.c) เพื่อทำสิ่งนี้ให้คุณ แพ็คเกจอื่น ๆ ส่วนใหญ่ (เช่น busybox) ได้ตั้งชื่อคำสั่งนี้ว่า "switch_root"
การเติม initramfs:
กระบวนการสร้างเคอร์เนล 2.6 จะสร้างไฟล์เก็บถาวร initramfs รูปแบบ gzipped cpio เสมอและเชื่อมโยงเข้ากับเคอร์เนลไบนารีผลลัพธ์ โดยค่าเริ่มต้นการเก็บถาวรนี้ว่างเปล่า (บริโภค 134 ไบต์บน x86)
ตัวเลือกการกำหนดค่า CONFIG_INITRAMFS_SOURCE (ในการตั้งค่าทั่วไปใน menuconfig และการใช้ชีวิตใน usr / Kconfig) สามารถใช้ในการระบุแหล่งที่มาสำหรับการเก็บถาวร initramfs ซึ่งจะถูกรวมเข้ากับไบนารีผลลัพธ์ ตัวเลือกนี้สามารถชี้ไปยังการเก็บถาวร cpio gzipped ที่มีอยู่ไดเรกทอรีที่มีไฟล์ที่จะเก็บถาวรหรือข้อกำหนดไฟล์ข้อความเช่นตัวอย่างต่อไปนี้:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
เรียกใช้ "usr / gen_init_cpio" (หลังเคอร์เนลบิลด์) เพื่อรับข้อความการใช้งานที่บันทึกในรูปแบบไฟล์ด้านบน
ข้อดีอย่างหนึ่งของไฟล์กำหนดค่าคือไม่จำเป็นต้องเข้าถึงรูทเพื่อตั้งค่าการอนุญาตหรือสร้างโหนดอุปกรณ์ในไฟล์เก็บถาวรใหม่ (โปรดทราบว่าทั้งสองตัวอย่างรายการ "ไฟล์" คาดว่าจะค้นหาไฟล์ชื่อ "init.sh" และ "busybox" ในไดเรกทอรีชื่อ "initramfs" ภายใต้ไดเรกทอรี linux-2.6. * ดูที่เอกสาร / ผู้ใช้เร็ว / README สำหรับ รายละเอียดเพิ่มเติม.)
เคอร์เนลไม่ได้ขึ้นอยู่กับเครื่องมือ cpio ภายนอก หากคุณระบุไดเรกทอรีแทนไฟล์กำหนดค่าโครงสร้างพื้นฐานการสร้างของเคอร์เนลจะสร้างไฟล์การกำหนดค่าจากไดเรกทอรีนั้น (usr / Makefile เรียกใช้สคริปต์ / gen_initramfs_list.sh) และดำเนินการจัดทำแพ็กเกจไดเรกทอรีนั้นโดยใช้ไฟล์กำหนดค่า (โดยป้อนไปที่ usr / gen_init_cpio ซึ่งสร้างจาก usr / gen_init_cpio.c) โค้ดการสร้าง cpio build-time ของเคอร์เนลมีอยู่ในตัวเองอย่างสมบูรณ์และตัวแยกเวลาบูตของเคอร์เนลก็มีอยู่ในตัวด้วย (ชัดเจน)