ผมพบว่าคำอธิบายที่ยอดเยี่ยมที่นี่ อย่างไรก็ตามให้ฉันลองใส่ในรูปแบบที่สั้นกว่าของสิ่งที่ฉันเข้าใจในคำตอบ
เวอร์ชั่นสั้น
- ในขณะที่ระบบบู๊ตจะต้องมี userspace เริ่มต้น มันสามารถทำได้โดยใช้ initramfs หรือ initrd
- initrdจะโหลดลงใน ramdisk ซึ่งเป็นที่เกิดขึ้นจริง ของระบบไฟล์
- initramfsคือไม่ระบบไฟล์
- สำหรับinitrd
pivot_root
จะใช้และสำหรับinitramfs switch_root
จะใช้
รุ่นที่ยาวกว่า
ตอนนี้เพื่ออธิบายรายละเอียดของสิ่งที่ฉันได้กล่าวมาข้างต้น
ในขณะที่ทั้ง initramfs และ initrd มีจุดประสงค์เดียวกันก็มีความแตกต่างกัน 2 ประการ ความแตกต่างที่ชัดเจนที่สุดคือโหลด initrd เข้าไปใน ramdisk มันประกอบไปด้วยระบบไฟล์จริง (โดยทั่วไปคือ ext2) ซึ่งติดตั้งใน ramdisk ในทางตรงกันข้าม initramfs ไม่ใช่ระบบไฟล์ มันเป็นเพียงไฟล์บีบอัด cpio (บีบอัด) (ของประเภท newc) ซึ่งถูกแยกออกเป็น tmpfs สิ่งนี้มีผลข้างเคียงในการทำให้ initramfs ได้รับการปรับให้เหมาะสมที่สุดและสามารถโหลดได้เร็วขึ้นเล็กน้อยในกระบวนการบูตเคอร์เนลมากกว่า initrd นอกจากนี้ขนาดของ initramfs ในหน่วยความจำมีขนาดเล็กลงเนื่องจากเคอร์เนลสามารถปรับขนาดของ tmpfs กับสิ่งที่ถูกโหลดจริงแทนที่จะพึ่งพาขนาด ramdisk ที่กำหนดไว้ล่วงหน้า
นอกจากนี้ยังมีความแตกต่างของผลข้างเคียงอีกประการหนึ่ง: วิธีจัดการอุปกรณ์รูท (และสลับไปใช้) เนื่องจาก initrd เป็นระบบไฟล์จริงที่แกะลงใน ram อุปกรณ์รูทจะต้องเป็น ramdisk สำหรับ initramfs จะมีเคอร์เนล "rootfs" ซึ่งกลายเป็น tmpfs ที่ initramfs ถูกคลายลง (ถ้าเคอร์เนลโหลด initramfs ถ้าไม่เช่นนั้น rootfs เป็นเพียงระบบไฟล์ที่ระบุผ่านรูท = พารามิเตอร์การบูตเคอร์เนล) แต่ ไม่ควรระบุ rootfs ชั่วคราวนี้เนื่องจากพารามิเตอร์ root = boot (และจะไม่มีวิธีในการทำเช่นนี้เนื่องจากไม่มีอุปกรณ์ต่ออยู่) ซึ่งหมายความว่าคุณยังคงสามารถส่งผ่านอุปกรณ์รูทจริงของคุณไปยังเคอร์เนลเมื่อใช้ initramfs ด้วยการเริ่มต้นคุณจะต้องดำเนินการในสิ่งที่อุปกรณ์รากที่แท้จริงคือตัวคุณเอง นอกจากนี้เนื่องจาก "ของจริง" อุปกรณ์รูทที่มี initrd คือ ramdisk เคอร์เนลต้องทำการ swith รูทอุปกรณ์จากอุปกรณ์จริงหนึ่งเครื่อง (ramdisk) ไปยังอุปกรณ์อื่น (root ที่แท้จริงของคุณ) ในกรณีของ initramfs พื้นที่ initramfs (tmpfs) ไม่ใช่อุปกรณ์จริงดังนั้นเคอร์เนลจึงไม่สลับอุปกรณ์จริง ดังนั้นในขณะที่ใช้คำสั่ง pivot_root กับ initrd จะต้องใช้คำสั่งอื่นสำหรับ initramfs Busybox ให้ switch_root ทำสิ่งนี้ให้สำเร็จในขณะที่ klibc เสนอ new_root ต้องใช้คำสั่งอื่นสำหรับ initramfs Busybox ให้ switch_root ทำสิ่งนี้ให้สำเร็จในขณะที่ klibc เสนอ new_root ต้องใช้คำสั่งอื่นสำหรับ initramfs Busybox ให้ switch_root ทำสิ่งนี้ให้สำเร็จในขณะที่ klibc เสนอ new_root
pivot_root
ในอดีตสำหรับ initramfsswitch_root
ไม่ได้อยู่ในเวลานั้นswitch_root
ดูเหมือนว่าจะเป็นวิธีที่สะดวกในการpivot_root
ทำความสะอาดมากขึ้นและยังย้าย/proc
/sys
และ/dev
อื่น ๆ และไม่เพียง แต่รากตัวเอง