Linux จัดการกับพาร์ติชั่น / บูตแยกกันอย่างไร?


11

ฉันสนใจที่จะเรียนรู้เกี่ยวกับวิธีที่ Linux จัดการกับพาร์ติชันสำหรับบูตแยกต่างหาก ฉันไม่สนใจที่จะทำสิ่งนี้จริง ๆ แต่ฉันอยากจะรู้ว่ามันทำงานอย่างไรภายใต้ประทุน

พิจารณาฮาร์ดไดรฟ์sdaที่มีสองพาร์ทิชันและsda1 sda2สมมติว่าsda2เป็นrootพาร์ติชัน/ที่มีระบบปฏิบัติการ Linux

ความเข้าใจของฉันอยู่ที่บูตGRUB2, /bootติดตั้งเพื่อ เมื่อไดเร็กทอรี/bootอยู่บนพาร์ติชันแยกต่างหากsda2มันจะเกิดขึ้นได้อย่างไรก่อนที่/จะทำการเมาท์จริง?

การโต้ตอบระหว่าง BIOS, มาสเตอร์บูตเรกคอร์ดและ GRUB (หรือไฟล์/boot) เกิดขึ้นได้อย่างไรในกรณีนี้? เป็นข้อมูลที่/bootไม่ได้เชื่อมต่อกับ/ระบบไฟล์ในช่วงแรกหรือไม่?

หมายเหตุ: คำถามนี้เกี่ยวกับการติดตั้งพาร์ติชันรูท แต่ไม่ได้พูดถึงพาร์ติชันสำหรับบูตแยกต่างหาก

คำตอบ:


18

นี่คือปัญหาในความเข้าใจของคุณ:

ความเข้าใจของฉันคือ bootloader GRUB2 ติดตั้งอยู่ที่ / boot

GRUB ไม่ได้ "ติดตั้ง" ในการบู๊ต ด้วงติดตั้งไป/bootและมีการโหลดจากรหัสในการ Boot Record ปริญญาโท นี่คือภาพรวมที่เรียบง่ายของกระบวนการบูทยุคใหม่โดยสมมติว่ามีการแจกจ่าย GNU / Linux ด้วย MBR / BIOS (ไม่ใช่ GPT / UEFI):

  1. โหลด BIOS
  2. BIOS โหลดโค้ดขนาดเล็กที่อยู่ใน Master Boot Record
  3. GRUB ไม่พอดีกับ 440 ไบต์ขนาดของ Master Boot Record ดังนั้นรหัสที่โหลดจริงเพียงแยกวิเคราะห์ตารางพาร์ทิชันค้นหา/bootพาร์ติชัน (ซึ่งฉันเชื่อว่าจะถูกกำหนดเมื่อคุณติดตั้ง GRUB ไปยัง Master Boot Record) และแยกวิเคราะห์ข้อมูลระบบไฟล์ จากนั้นโหลดสเตจ 2 ด้วง (นี่คือที่ทำให้เข้าใจง่ายมา)
  4. Stage 2 GRUB โหลดทุกอย่างที่ต้องการรวมถึงการกำหนดค่า GRUB จากนั้นนำเสนอเมนู (หรือไม่ขึ้นอยู่กับการกำหนดค่าของผู้ใช้)
  5. ลำดับการบู๊ตถูกเลือก นี่อาจเป็นการหมดเวลาโดยผู้ใช้เลือกรายการเมนูหรือโดยการบูตรายการคำสั่ง
  6. ลำดับการบู๊ตเริ่มต้นดำเนินการ สิ่งนี้สามารถทำสิ่งต่าง ๆ ได้หลายอย่างเช่นการโหลดเคอร์เนลการบีบอัดไฟล์ไปยัง bootloader อื่น - แต่ลองสมมติว่าลำดับการบู๊ตเป็นมาตรฐาน GNU / Linux
  7. GRUB โหลดเคอร์เนล Linux
  8. ด้วงโหลดramdisk เริ่มต้น
  9. ramdisk เริ่มต้นติดตั้ง/ภายใต้/new_root(อาจปลดล็อคแบบเข้ารหัส) เริ่ม udev, เริ่ม Resume-from-swap เป็นต้น
  10. ramdisk เริ่มต้นใช้pivot_rootยูทิลิตี้ชุดเป็นจริง/new_root/
  11. initเริ่มต้น พาร์ติชันเริ่มเมาต์ daemons เริ่มต้นใช้งานและบูทระบบ

แจ้งให้ทราบว่าเคอร์เนลจะโหลดเฉพาะในขั้นตอนที่ 7. เพราะเหตุนี้มีแนวคิดของการติดตั้งจนถึงขั้นตอนที่ 7 นี่คือเหตุผลที่/bootจะต้องติดตั้งอีกครั้งในขั้นตอนที่ 9 แม้ว่า GRUB จะใช้งานแล้ว

นอกจากนี้ยังอาจใช้เพื่อดูส่วนGRUB 2ของหน้า Wikipedia บน GRUB


คุณทำให้ฉันสับสนอย่างแน่นอน นี่คือสิ่งที่ฉันกำลังมองหา ดังนั้นเริ่มแรก/bootไม่ได้อ้างถึงไดเรกทอรีที่ติดตั้งบนพาร์ติชันรูท?
jII

@ ตัวตลกที่ยอดเยี่ยม! ในกรณีนี้คุณจะยอมรับคำตอบนี้โดยคลิกที่เครื่องหมายถูกใต้ลูกศรโหวตหรือไม่
strugee

7
รหัส MBR ไม่สามารถแยกวิเคราะห์ระบบไฟล์ได้ มันโหลดอิมเมจหลักของด้วงจากเซกเตอร์ที่ไม่ได้ใช้หลังจาก MBR ก่อนพาร์ติชันแรกและรหัสนั้นจะเข้าใจวิธีการค้นหาและเมานต์ / boot พาร์ติชันเพื่อค้นหาไฟล์ config grub โมดูลเพิ่มเติมและเมล็ดของคุณ นอกจากนี้ pivot_root ยังถือว่าเป็นแฮ็คที่สกปรกและถูกแทนที่ด้วยrun-initซึ่งจะลบไฟล์ทั้งหมดใน initramfs จากนั้น chroots เข้าสู่ระบบไฟล์รูท
psusi

กระบวนการบูทแบบโมเดิร์นควรจะเป็นกระบวนการบูทแบบดั้งเดิมเนื่องจากUEFIได้รับ popurlar มากขึ้นเรื่อย ๆ ;-) @strugee
Kiwy

1
@strugee หลังจากการสนทนาในรายชื่อผู้รับจดหมาย util-linux ดูเหมือนว่าความทรงจำของฉันถูกปิดเล็กน้อย: พวกเขาหยุดการอนุญาตให้ pivot_root บน rootfs ที่แท้จริงดังนั้นจึงไม่มีใครใช้มันในระหว่างการบู๊ตอีกต่อไป แม้ว่า Systemd จะใช้มันในการปิดระบบ แต่จะไม่กลับสู่ initrd ดั้งเดิม (ซึ่งจะลบตัวเองออกเมื่อเปลี่ยนเป็นรูทจริง) แต่จะเปลี่ยนเป็นโหลดที่สดใหม่ ดูmarc.info/?l=util-linux-ng&m=139100788306216&w=2
psusi

6

คำถามที่ 1

ความเข้าใจของฉันคือ bootloader GRUB2 ติดตั้งอยู่ที่ / boot เมื่อไดเร็กทอรี / boot อยู่บนพาร์ติชันแยกต่างหาก sda2 อย่างไรมันจะเกิดขึ้นก่อน / ติดตั้งจริงได้อย่างไร

ฉันไม่คิดว่าคุณเข้าใจค่อนข้างตรงนี้ จากหน้าGNU GRUB Wikipedia :

สิ่งที่สกัดมา

เมื่อเปิดเครื่องคอมพิวเตอร์BIOSของคอมพิวเตอร์จะค้นหาอุปกรณ์ที่สามารถบู๊ตหลักที่กำหนดค่าได้ (โดยปกติคือฮาร์ดดิสก์ของคอมพิวเตอร์) และทำการโหลดและเรียกใช้งานโปรแกรมบูทสแตรปเริ่มต้นจากมาสเตอร์บูตเรคคอร์ด (MBR) MBR เป็นภาคแรกของฮาร์ดดิสก์และมีหมายเลข 0 (การนับส่วนเริ่มต้นที่ 0) เป็นเวลานานขนาดของเซกเตอร์เป็น 512 ไบต์ แต่ตั้งแต่ 2009 มีฮาร์ดดิสก์ที่มีขนาดเซกเตอร์ 4096 ไบต์เรียกว่าดิสก์รูปแบบขั้นสูง เมื่อวันที่ตุลาคม 2013 ฮาร์ดดิสก์ดังกล่าวจะยังคงเข้าถึงได้ในภาค 512 ไบต์โดยใช้การจำลอง 512e

ในด้วงรุ่น 2ต่อไปนี้จะเกิดขึ้น:

สิ่งที่สกัดมา

การบูทคอมพิวเตอร์

เมื่อเปิดเครื่องแล้วสิ่งต่อไปนี้จะเกิดขึ้น:

  • ฮาร์ดแวร์เริ่มต้นตั้งค่า CPU เป็นโหมดจริง (ไม่มีหน่วยความจำเสมือน) และข้ามไปยังตำแหน่งคงที่ 0xFFFF0 (เดินสายในวงจร CPU)
  • ดังนั้นรหัส BIOS ที่เก็บใน ROM หรือหน่วยความจำแฟลชจะถูกแมปกับตำแหน่งนั้น
  • รหัส BIOS จะดูข้อมูลการกำหนดค่า BIOS เพื่อดูว่าอุปกรณ์การบู๊ตเครื่องใดอยู่ โดยปกติข้อมูลการกำหนดค่า BIOS นี้สามารถแก้ไขได้โดยกดลำดับพิเศษบางอย่างหลังจากเปิดเครื่องทำให้โปรแกรมการกำหนดค่า BIOS ทำงาน เหนือสิ่งอื่นใดอุปกรณ์สำหรับบู๊ตสามารถเลือกได้ที่นี่
  • รหัส BIOS โหลด MBR ของอุปกรณ์การบูตลงใน RAM จำไว้ว่า MBR นั้นมีขนาดเพียง 512 ไบต์! ข้อมูลที่โหลดนั้นแน่นอนว่าเป็นโปรแกรมและข้อมูลที่ติดตั้งด้วงแบบไดนามิกและเขียนไว้ที่นั่นเมื่อโปรแกรม grub-install ถูกดำเนินการ
  • รหัส BIOS จะข้ามไปยังที่อยู่เริ่มต้นของ MBR ที่โหลด (เช่นรหัส Grub จะทำงานเป็นครั้งแรกนับตั้งแต่เปิดเครื่อง)
  • รหัส MBR ของ Grub จะโหลดเซกเตอร์เดียวที่มีที่อยู่แบบมีสายเข้าในบล็อก MBR จากนั้นจะวนซ้ำ (คู่ที่อยู่ len) คู่ในเซกเตอร์นั้นโหลดข้อมูลทั้งหมดจากดิสก์ลงในหน่วยความจำ (เช่นโหลดเนื้อหาของไฟล์/boot/grub/core.imgหรือคัดลอก "ฝัง") รหัส MBR แล้วกระโดดไปรหัสโหลดคือ“รัน” core.imgโปรแกรมใน
  • ตามที่อธิบายไว้ในส่วน“ การติดตั้งด้วง” เคล็ดลับในการฝังที่อยู่บล็อกดิสก์ดิบทำให้สามารถจัดเก็บcore.imgในพื้นที่ที่ไม่ได้อยู่ในพาร์ติชันและไม่เคยฟอร์แมตเป็นระบบไฟล์เลย (“ การฝัง”) และในกรณีนี้หากcore.imgมีการแก้ไขตราบใดที่เวอร์ชั่นใหม่“ ฝังตัว” ในตำแหน่งเดียวกันรหัส MBR ไม่จำเป็นต้องได้รับการอัพเดต
  • หรือเป็นไปได้ที่core.imgจะอยู่ในระบบไฟล์จริงและสำหรับ Grub เพื่ออ่านcore.imgเนื้อหาไฟล์โดยไม่ต้องมีไดรเวอร์สำหรับระบบไฟล์นั้น อย่างไรก็ตามในกรณีนี้หากcore.imgมีการแก้ไขบล็อกแรกของไฟล์อาจได้รับที่อยู่ใหม่บนดิสก์ หากเกิดเหตุการณ์เช่นนี้ MBR จะต้องได้รับการอัปเดตให้ชี้ไปที่ตำแหน่งใหม่นี้ อย่างไรก็ตามตามcore.imgปกติแล้วจะได้รับการอัพเดตด้วยการรันการติดตั้งด้วงนี่ไม่ใช่ปัญหา
  • โปรดทราบว่าในทางทฤษฎีหากcore.imgอยู่บนอุปกรณ์ที่แตกต่างจาก MBR และเพิ่มฮาร์ดแวร์ใหม่แล้วเรคคอร์ด MBR ที่สร้างโดย Grub อาจไม่สามารถโหลดcore.imgไฟล์ได้อย่างถูกต้อง รหัสอุปกรณ์ซึ่งcore.imgจะพบเซกเตอร์แรกของนั้นจะมีสายเข้าใน MBR ไม่ใช่การค้นหา อย่างไรก็ตามไม่มีวิธีแก้ปัญหาสำหรับเรื่องนี้; ไม่มีวิธีการฝังเทียบเท่าของคำสั่ง Grub“ ค้นหา” ลงใน MBR 512- ไบต์ ปัญหานี้ไม่น่าจะเกิดขึ้น โดยปกติแล้วcore.imgมันจะถูกฝังอยู่ในอุปกรณ์เดียวกันกับ MBR และเมื่อcore.imgโหลดเสร็จแล้วมันสามารถใช้ search.mod เพื่อค้นหา/boot/grubไฟล์เพิ่มเติมทั้งหมดและดังนั้นจึงไม่คุ้มค่ากับการจัดเรียงฮาร์ดแวร์ใหม่
  • core.imgตอนนี้โค้ดที่เรียกใช้งานจะเริ่มต้นโมดูลทั้งหมดที่มีอยู่ภายใน (เชื่อมโยงเข้าcore.img); หนึ่งในโมดูลเหล่านี้จะเป็นไดรเวอร์ระบบไฟล์ที่มีความสามารถในการอ่านระบบไฟล์ที่ไดเรกทอรี/boot/grubใช้งานอยู่
  • นอกจากนี้ยังลงทะเบียนชุดคำสั่งในตัว: set, unset, ls, insmod
  • หากมีการเชื่อมโยง“ ไฟล์กำหนดค่า” core.imgสิ่งนี้จะถูกส่งไปยังตัวแยกวิเคราะห์สคริปต์แบบบิลด์อินเพื่อการประมวลผล คำสั่งการเขียนสคริปต์ในไฟล์กำหนดค่าสามารถเรียกใช้คำสั่งในตัวหรือลิงก์ได้เท่านั้น สถานการณ์ง่าย ๆ (เช่นการบูตคอมพิวเตอร์เดสก์ท็อปทั่วไปจากไดรฟ์ในเครื่อง) ไม่จำเป็นต้องมีไฟล์ปรับแต่ง สิ่งอำนวยความสะดวกนี้ใช้สำหรับการบู๊ตผ่าน pxe, nfs จากระยะไกลหรือเมื่อ/boot/grubอยู่ในอุปกรณ์ LVM
  • Core.imgตอนนี้โหลดไฟล์“/boot/grub/normal.mod”จากดิสก์แบบไดนามิกและข้ามไปยังฟังก์ชั่นรายการ โปรดทราบว่าขั้นตอนนี้ต้องมีการตั้งค่าไดรเวอร์ระบบไฟล์ที่เหมาะสม (เช่นในตัว)

     เอสเอสของกระบวนการบูต

หมายเหตุ:เมื่อคุณเห็นเมนู GRUB2 ทั่วไปที่คุณเลือก OS / เคอร์เนลที่จะบูตคุณจะอ้างอิง/boot/grubไดเรกทอรีของระบบณ จุดนี้

                                         ss ของด้วงด้วง

อ้างอิง


มีคนควรแก้ไขรายการวิกิพีเดียนั้นเพราะมันผิด ด่าน 1 / 1.5 / 2 ใช้ได้กับด้วงแบบดั้งเดิมเท่านั้น พวกเขาทำเสร็จแล้วในการเขียน grub2 และคุณจะไม่พบการอ้างอิงถึงข้อกำหนดเหล่านั้นในเอกสารทางการของ Grub 2
psusi

@psusi - ขอบคุณสำหรับการชี้แจง ฉันสับสนเล็กน้อยเมื่อเห็นพวกเขาพูดถึงที่นั่นด้วยเนื่องจากฉันได้ยินเหมือนกันว่า 1 / 1.5 / 2 หายไป ฉันไม่รู้ว่าใครจะขอให้แก้ไขบทความ Wikipedia ฉันไม่รู้สึกว่ามีคุณสมบัติเพียงพอที่จะแก้ไขโพสต์ดังกล่าว บางทีการแจ้งเตือนทีม GRUB2 อาจเป็นสิ่งที่ดีที่สุดต่อไป
slm

@psusi - นี่คือการอ้างอิง ถึงขั้นตอนที่ถูกตัดออก เอกสารสำหรับ GRUB2: gnu.org/software/grub/manual/grub.html ... "ไฟล์รูปภาพ (ดูภาพ) ที่ประกอบขึ้นเป็น GRUB ได้รับการจัดระเบียบใหม่ขั้นตอนที่ 1 ขั้นตอนที่ 1.5 และขั้นตอนที่ 2 ไม่มีอีกแล้ว"
slm

6

Linux (เคอร์เนล) ไม่สนใจว่าคุณมีพาร์ติชั่นการบูตกี่ตัว โหลดเคอร์เนลจากดิสก์เป็นงานของ bootloader (เช่นgrub, grub2, lilo) และเครื่องมือเหล่านี้ยังไม่สนใจเกี่ยวกับจำนวนของสถานที่ตั้งที่เคอร์เนลอาจอยู่ พวกเขาสนใจเฉพาะตำแหน่งเท่านั้น

ตัวอย่างเช่นพาร์ทิชันบูตของฉันคือ/dev/md1ซึ่งเป็นกระจก mdadm RAID รับการสนับสนุนจากพาร์ทิชันทางกายภาพและ/dev/sde1 /dev/sdf1ฉันสามารถเมานต์เหล่านี้ได้หากต้องการและนับเป็นเทคนิคที่มีพาร์ติชั่นสำหรับบู๊ตสองตัวแม้ว่าพวกเขาควรมีข้อมูลเดียวกัน

การมีสองพาร์ติชั่นสำหรับ / boot สำหรับฉันเป็นปัญหาความพร้อมใช้งาน แต่พวกเขาอาจแตกต่างกัน / พาร์ติชันสำหรับบูตอย่างเท่าเทียมกัน ขั้นตอนต่อไปคือ bootloader รู้ได้อย่างไร? นี่คือวิธี:

menuentry 'Linux 3.10.17 (sde) kernel-3.10.17-g' {
        root=hd0,1
        linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3
        initrd /boot/initrd-3.10.17-g
}

menuentry 'Linux 3.10.17 (sdf) kernel-3.10.17-g' {
        root=hd1,1
        linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3 
        initrd /boot/initrd-3.10.17-g
}

นี่คือข้อความที่ตัดตอนมาจากgrub2การตั้งค่าและคุณจะทราบว่าแตกต่างเพียงอย่างเดียวroot=hd0,1และroot=hd1,1ซึ่งสร้างที่พาร์ทิชันบูตที่อ้างอิงรายการ


ทีนี้เดินไปถึงคุณด้วยการบูทเพื่อให้คุณสามารถเข้าใจสิ่งที่เกิดขึ้นที่นี่

  • BIOS อ่าน MBR จากปริมาณการบูตและข้ามไปยัง bootloader
  • bootloader (เช่นgrub2) มีการกำหนดค่าให้ทราบว่าอุปกรณ์และพาร์ทิชันใดมีเคอร์เนลของคุณ Grub2 เข้าถึงพาร์ติชันนี้โดยตรงและโหลดเคอร์เนลของคุณลงในหน่วยความจำ
  • bootloader ของคุณจะกระโดดเข้าสู่เคอร์เนลและเคอร์เนลบูทเครื่องของคุณ

bootloader ไม่สนใจว่าคุณมีพาร์ติชั่นการบู๊ตกี่ตัว, มันจะสนใจว่ามันอยู่ที่ไหนและคุณต้องบอกข้อมูลนั้น.

เคอร์เนลไม่สนใจจำนวนพาร์ติชันสำหรับบูตที่คุณมีเนื่องจากไม่จำเป็นต้องเห็นพาร์ติชัน (คุณเพียง แต่ต้องให้มันพร้อมใช้งานเพื่อเพิ่มเมล็ดใหม่)

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