เมื่อใดที่คุณจะใช้ pivot_root บน switch_root


19

ฉันต้องการที่จะเข้าใจกระบวนการเริ่มต้นของ Linux ที่ดีขึ้นเพื่อที่จะ netboot ระบบผ่าน ceph มากกว่า nfs

ในกระบวนการฉันเจอรูทวิทช์สองรูปแบบ หนึ่งเรียกว่า switch_root และอีกหนึ่งเรียกว่า pivot_root สคริปต์เหล่านี้ถูกเรียกใช้จากระบบไฟล์ในหน่วยความจำ (initramfs) ที่ได้รับผ่าน tftp โดยใช้กระบวนการบูต pxe

เมื่อไหร่ที่คุณจะใช้อันอื่น ฉันเคยเห็นทั้งสองใช้ในสคริปต์ init บางส่วนอยู่ในรูท

คำตอบ:


16

ผมพบว่าคำอธิบายที่ยอดเยี่ยมที่นี่ อย่างไรก็ตามให้ฉันลองใส่ในรูปแบบที่สั้นกว่าของสิ่งที่ฉันเข้าใจในคำตอบ

เวอร์ชั่นสั้น

  1. ในขณะที่ระบบบู๊ตจะต้องมี userspace เริ่มต้น มันสามารถทำได้โดยใช้ initramfs หรือ initrd
  2. initrdจะโหลดลงใน ramdisk ซึ่งเป็นที่เกิดขึ้นจริง ของระบบไฟล์
  3. initramfsคือไม่ระบบไฟล์
  4. สำหรับ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


2
ฉันใช้pivot_rootในอดีตสำหรับ initramfs switch_rootไม่ได้อยู่ในเวลานั้น switch_rootดูเหมือนว่าจะเป็นวิธีที่สะดวกในการpivot_rootทำความสะอาดมากขึ้นและยังย้าย/proc /sysและ/devอื่น ๆ และไม่เพียง แต่รากตัวเอง
แดเนียล Alder

2
คุณไม่สามารถใช้ pivot_root บนรูต initramfs คุณจะได้รับอาร์กิวเมนต์ไม่ถูกต้อง คุณสามารถ pivot ระบบไฟล์จริงเท่านั้น
TiCPU

@TiCPU แล้ว Linux จะออกจากพื้นที่ผู้ใช้ก่อนหน้าอย่างไร
Melab

โซลูชันที่ให้มาดูเหมือนจะผิด ไลนัสบอกตัวเองว่า pivot_root () หรือ chroot () /ก็จะเปลี่ยนการอ้างอิงกระบวนการปัจจุบัน ดังนั้นจากความเข้าใจของฉันมันอาจเป็นเส้นทางใดก็ได้และไม่มีอะไรเกี่ยวข้องกับ "ดิสก์" จริง
erikbwork

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.