ทำไม initramfs จึงเมาท์ระบบไฟล์รูทเป็นแบบอ่านอย่างเดียว


12

อะไรคือสาเหตุที่ระบบไฟล์รูทติดตั้งroใน initramfs (และใน initrd)

ตัวอย่างเช่นคู่มือGentoo initramfsเมาท์ระบบไฟล์รูทด้วย:

mount -o ro /dev/sda1 /mnt/root

ทำไมไม่ต่อไปนี้

mount -o rw /dev/sda1 /mnt/root

ฉันเห็นว่ามีเหตุผลที่ดี (และอาจเกี่ยวข้องกับswitchroot) แต่ดูเหมือนจะไม่ได้รับการบันทึกไว้ที่ใดเลย

คำตอบ:


19

ramdisk เริ่มต้น (initrd) โดยปกติจะเป็นปล้นลงรุ่นของระบบแฟ้มรากที่มีเพียงสิ่งที่จำเป็นในการติดตั้งระบบแฟ้มรากเกิดขึ้นจริงและปิดมือบูตกับมัน

มี initrd อยู่ในระบบที่ทันสมัยบูตเดอร์ไม่สามารถฉลาดพอที่จะหาระบบไฟล์รูทได้อย่างน่าเชื่อถือ มีความเป็นไปได้มากเกินไปสำหรับโปรแกรมขนาดเล็กเช่นบูตโหลดเดอร์ พิจารณารูทของ NFS, การ์ด RAID ที่ไม่เป็นมาตรฐานและอื่น ๆ บูตโหลดเดอร์จะต้องทำงานโดยใช้เฉพาะไบออสรวมถึงรหัสที่สามารถอัดเข้าไปในบูตเซกเตอร์ได้

ตัวเริ่มต้นจะถูกเก็บไว้ที่ไหนสักแห่งที่บูตโหลดเดอร์สามารถหาได้และมันก็เล็กพอที่จะเพิ่มพื้นที่ว่างเล็กน้อยที่มันไม่ได้รบกวนใคร (ในระบบฝังตัวขนาดเล็กมักจะไม่มีรูท "ของจริง" เพียงแค่ initrd)

initrd นั้นมีค่า: เนื้อหานั้นจะต้องได้รับการเก็บรักษาไว้ภายใต้เงื่อนไขทั้งหมดเพราะถ้า initrd แตกระบบจะไม่สามารถบู๊ต ทางเลือกหนึ่งในการออกแบบที่นักออกแบบสร้างขึ้นเพื่อให้แน่ใจว่านี่คือการทำให้บูตโหลดเดอร์โหลดแบบอ่านได้อย่างเดียว มีหลักการอื่น ๆ ที่มีต่อการทำงานนี้มากเกินไปเช่นว่าในกรณีของระบบขนาดเล็กที่ไม่มี "ของจริง" รากคุณยังคงติดแยกต่างหาก/tmp, /var/cacheและเช่นสำหรับการจัดเก็บสิ่งที่ การเปลี่ยน initrd นั้นทำได้ไม่บ่อยนักและควรทำอย่างระมัดระวัง

เดินทางกลับไปกรณีปกติที่มีเป็นระบบแฟ้มรากที่แท้จริงมันเป็นครั้งแรกแบบอ่านอย่างเดียวเพราะ initrd เป็น มันจะถูกเก็บไว้เป็นแบบอ่านอย่างเดียวนานเท่าที่จะทำได้ด้วยเหตุผลเดียวกัน การเขียนไปยังรูทจริงที่ต้องทำใด ๆ จะถูกนำออกจนกว่าระบบจะบูตโดยการตั้งค่าหรืออย่างน้อยก็จนกว่าจะถึงช่วงปลายกระบวนการบู๊ตเมื่อการตั้งค่านั้นไม่พอใจ

สิ่งที่สำคัญที่สุดที่เกิดขึ้นระหว่างขั้นตอนการอ่านอย่างเดียวคือระบบไฟล์รูทจะถูกตรวจสอบเพื่อดูว่ามันถูกถอดออกแล้วหรือไม่ นั่นเป็นสิ่งที่บูตโหลดเดอร์สามารถทำได้แทนที่จะปล่อยให้มันเป็น initrd แต่จะเกิดอะไรขึ้นถ้าระบบไฟล์รูทไม่ได้ถูกถอดออกอย่างหมดจด? จากนั้นจะต้องโทรfsckเพื่อตรวจสอบและอาจแก้ไขได้ ดังนั้นจะinitrdได้ที่ไหนfsckถ้ารับผิดชอบขั้นตอนนี้แทนที่จะรอจนกว่าจะส่งไปที่รูท "ของจริง" คุณอาจจะบอกว่าคุณต้องคัดลอกfsckลงในinitrdเมื่อมีการสร้างมัน แต่ตอนนี้มันมีขนาดใหญ่ และด้านบนของที่ซึ่ง fsckคุณจะคัดลอก? ระบบ Linux ใช้ระบบไฟล์ที่แตกต่างกันอย่างสม่ำเสมอ คุณคัดลอกเฉพาะที่จำเป็นสำหรับรูทจริงในเวลาที่initrdถูกสร้างขึ้น? คุณขยายขนาดinitrdด้วยการคัดลอกfsck.fooโปรแกรมที่มีอยู่ทั้งหมดหรือไม่ในกรณีที่ระบบไฟล์รูทถูกย้ายไปยังระบบไฟล์ประเภทอื่นในภายหลังและบางคนลืมที่จะสร้าง initrd ใหม่?

สถาปนิกระบบบูต Linux เลือกที่จะไม่สร้างภาระให้กับปัญหาเหล่านี้อย่างชาญฉลาด พวกเขามอบหมายการตรวจสอบระบบไฟล์รูทจริงให้กับระบบไฟล์รูทจริงเนื่องจากอยู่ในตำแหน่งที่ดีกว่าการทำเช่นนั้น

เมื่อกระบวนการบู๊ตดำเนินไปไกลพอที่จะทำเช่นนั้นได้แล้ว initrd จะถูกสับเปลี่ยนจากภายใต้รูทจริงด้วยpivot_root(8)และระบบไฟล์จะถูกประกอบใหม่ในโหมดอ่าน - เขียน


4
initramfs ไม่ได้ต่อเชื่อมแบบอ่านอย่างเดียว เคอร์เนลคลายมันลงใน tmpfs แบบอ่าน / เขียนที่เมาท์เป็น / นอกจากนี้ยังใช้ pivot_root () ใน initrd ที่เสื่อมราคาในขณะนี้ แต่ไม่ใช่ initramfs ซึ่งระบบส่วนใหญ่ใช้วันนี้ (แม้ว่าไฟล์จะยังคงชื่อ initrd อยู่ก็ตาม) ด้วย initrd, pivot_root เกิดขึ้นก่อนที่จะดำเนินการ / sbin / init ซึ่งไปยัง fsck และ remount r / w ด้วย initramfs เพียงแค่ลบไฟล์ทั้งหมดใน initramfs แล้ว chroots เป็นรูทจริงและ execs / sbin / init
psusi

0

เนื่องจากในระหว่างการบูตระบบไฟล์รูทจะถูกเมาท์เป็นแบบอ่านอย่างเดียวเสมอ เมื่อการทดสอบด้วยตนเองแบบต่างๆเสร็จสมบูรณ์ระบบจะรูทระบบไฟล์เป็นแบบอ่าน / เขียนและเริ่มเมานต์ระบบไฟล์อื่น ๆ


0

เหตุผลหนึ่งที่ฉันคิดได้ก็คือป้องกันการทุจริตบางอย่าง ตัวอย่างเช่นคุณสามารถเมานต์ระบบไฟล์ ext4 เป็น ext2 (หรือในทางกลับกัน) และสิ่งนี้มีความปลอดภัยในโหมด ro แต่อาจทำให้การเปลี่ยนแปลงรูปแบบที่เข้ากันไม่ได้ถ้าเมา rw จาก initram

โอ้และมีอีกเหตุผลหนึ่ง: initramfs อาจไม่มี fsck แต่คุณอาจต้องตรวจสอบระบบไฟล์ก่อนทำการติดตั้ง rw

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