วิธีที่เหมาะสมในการจัดเตรียม chroot เพื่อกู้คืนการติดตั้ง Linux ที่เสียหายคืออะไร


52

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


ขั้นตอนที่เหมาะสมในการเตรียมสภาพแวดล้อมchrootสำหรับกระบวนการกู้คืนคืออะไร?

ในหลาย ๆ สถานการณ์การซ่อมแซมการติดตั้ง Linux ที่เสียหายนั้นทำได้ดีที่สุดจากภายในการติดตั้ง แต่ถ้าระบบไม่บู๊ตคุณจะแก้ไขจากภายในอย่างไร

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

  • ขั้นตอนพื้นฐานคืออะไร?
  • มีวิธีปฏิบัติที่ดีที่สุดที่ควรปฏิบัติตามหรือไม่?
  • ต้องพิจารณาตัวแปรใดบ้างเพื่อปรับขั้นตอนการเตรียมพื้นฐานให้เหมาะกับภารกิจการกู้คืนเฉพาะ

เนื่องจากนี่คือ Community Wiki โปรดแก้ไขคำถามนี้เพื่อปรับปรุงให้ดีขึ้น

คำตอบ:


72

นี่คือทรัพยากรบางส่วน:

"การเปลี่ยนราก" หรือ "chrooting" เป็นวิธีการซูมในส่วนหนึ่งของระบบแฟ้มของคุณเพื่อให้เช่นที่จะอ้างถึงสิ่งที่สามารถเข้าถึงได้ก่อนที่/path /mnt/path"root" ในนิพจน์ "chroot" หมายถึงระบบไฟล์รู/ทไม่ใช่ผู้ใช้รูท (แม้ว่าโดยทั่วไปคุณจะต้องมีสิทธิ์ผู้ใช้รูทเพื่อ chroot)

การจัดเตรียม

  • ขั้นตอนทั้งหมดในคู่มือนี้จะต้องดำเนินการในฐานะผู้ใช้รูท

  • เราสมมติว่าฮาร์ดดิสก์ของคุณอยู่ที่ / dev / sda1 และประเภทไฟล์คือ ext3 หากคุณไม่ทราบสถานที่และ filetype fdisk -lของฮาร์ดดิสก์ของคุณให้อ่านการส่งออกของ

  • ตรวจสอบให้แน่ใจว่าสถาปัตยกรรมของระบบที่คุณบูทด้วย (เช่นเป็น 32 บิต LiveCD) และระบบที่คุณต้องการป้อน (เช่นติดตั้งแบบ 32 บิตบนฮาร์ดไดรฟ์ของคุณ) คุณสามารถกำหนดสถาปัตยกรรมที่คุณ booted uname -mกับการใช้

  • ตรวจสอบให้แน่ใจว่าได้โหลดโมดูลเคอร์เนลใด ๆ ที่คุณต้องการ

  • ตั้งค่าเครือข่ายของคุณหากคุณต้องการ (เช่นเพื่อติดตั้งแพ็คเกจที่อัพเดต)

  • เริ่มต้นพาร์ติชัน swap ของคุณหากจำเป็น (เช่นswapon /dev/sda3)

การแสดง chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev

หาก/bootไดเรกทอรีของคุณอยู่ในพาร์ติชันที่แตกต่างจากของคุณ/และคุณต้องการจัดการไฟล์ในนั้น (เช่นหากคุณกำลังทำงานกับ GRUB, ทำการอัพเกรดเคอร์เนล ฯลฯ ) คุณจะต้องติดตั้งพาร์ติชันนั้น หากอยู่ที่ / dev / sda2 และประเภทไฟล์เป็น ext2 ให้ทำดังนี้:

mount -t ext2 /dev/sda2 /mnt/boot

ในทำนองเดียวกันสำหรับส่วนอื่น ๆ ของระบบไฟล์ของคุณ ( /var, /usr) ที่อยู่ในพาร์ติชันแยกต่างหาก แต่คุณต้องเข้าถึง โดยทั่วไปเมื่อคุณกำลัง chrooting เพื่อแก้ไขสิ่งที่คุณไม่จำเป็นต้องเข้าถึง / home ดังนั้นคุณไม่จำเป็นต้องกังวลกับมัน

(อาจเป็นไปได้ที่จะเมานต์ระบบไฟล์หลังจากที่คุณ chrooted แต่ก็ฉลาดกว่าที่จะทำเช่นนั้นก่อนเหตุผลก็คือเมื่อคุณทำมันหลังจากที่สภาพแวดล้อมที่อยู่นอก / เคอร์เนลจะไม่ทราบเกี่ยวกับระบบไฟล์ที่ติดตั้งดังนั้นหากคุณลืม เดินเท้าพวกเขาก่อนที่จะออก chroot ระบบจะไม่รู้ว่าจะติดตั้งพวกเขาเมื่อมันปิดตัวลงเช่นกันซึ่งอาจสร้างความเสียหายให้ระบบไฟล์เหล่านั้น)

หากคุณติดตั้งเครือข่ายและต้องการใช้ในระบบ chrooted ให้คัดลอก/etc/resolv.confเพื่อให้คุณสามารถแก้ไขชื่อโดเมนได้:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

ตอนนี้คุณพร้อมที่จะย้ายเข้าสู่ระบบไฟล์ที่ติดตั้งแล้ว:

chroot /mnt /bin/bash

(หากสิ่งนี้ส่งคืนข้อผิดพลาดchroot: cannot run command '/bin/bash': Exec format errorโดยปกติจะระบุว่าคุณบูตด้วยสถาปัตยกรรมหนึ่ง (เช่น x86_32) และพยายามที่จะ chroot ไปยังอีก (เช่น x86_64) วิธีแก้ปัญหาคือการใช้ LiveCD ซึ่งมีสถาปัตยกรรมเดียวกับระบบที่คุณต้องการ chroot เข้า)

ณ จุดนี้คุณจะยังคงทำงานเคอร์เนลที่คุณ booted ด้วย แต่ทุกเส้นทางจะอ้างถึงสิ่งที่เคยเป็น/path/mnt/path

หากคุณกำลังทำสิ่งใดกับ GRUB คุณจะต้องแน่ใจว่า/etc/mtabไฟล์ของคุณเป็นปัจจุบัน:

grep -v rootfs /proc/mounts > /etc/mtab

การทำเช่นนี้อาจมีประโยชน์ในตอนนี้:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

ทำงานสกปรกของคุณ

ณ จุดนี้คุณสามารถทำการแก้ไขปัญหาที่คุณต้องทำ:

  • ติดตั้ง GRUB ให้เป็น MBR ของดิสก์อีกครั้ง
  • รีเซ็ตรหัสผ่านที่ลืม
  • ทำการอัพเกรดเคอร์เนล (หรือดาวน์เกรด)
  • สร้าง initramdisk ของคุณใหม่
  • แก้ไข / etc / fstab ของคุณ
  • ติดตั้งแพคเกจใหม่โดยใช้ตัวจัดการแพ็คเกจของคุณ
  • อะไรก็ตาม

การทำความสะอาด

เมื่อเสร็จแล้วให้แน่ใจว่าโปรแกรมที่ทำงานอยู่ทั้งหมดหยุดทำงาน จากนั้นออกจาก chroot:

exit

ตอนนี้ถอนติดตั้งพาร์ติชั่นทั้งหมดที่คุณติดตั้ง:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

ในที่สุดพยายามที่จะยกเลิกการต่อเชื่อมฮาร์ดไดรฟ์ของคุณ:

umount /mnt

หากคุณได้รับข้อผิดพลาดว่า / mnt (หรือพาร์ติชันอื่น ๆ ) ไม่ว่างนี่อาจหมายถึงหนึ่งในสองสิ่งต่อไปนี้:

  • โปรแกรมถูกปล่อยให้ทำงานอยู่ภายใน chroot

  • หรือบ่อยครั้งกว่า: จุดเมานท์ยังคงมีอยู่บนเมานต์นี้ ตัวอย่างเช่น / mnt / usr ยังคงเมานท์เมื่อพยายามที่จะ unmount / mnt

ในกรณีหลังให้ถอด unmount จุดยึดที่ผิดก่อน ในการรับการเตือนความจำของจุดเมานท์ปัจจุบันทั้งหมดให้รันmountโดยไม่มีพารามิเตอร์

สุดท้าย:

reboot

10
ในการเตรียมการฉันมักจะทิ้งสคริปต์chroot.shไว้ในรูทของทุกระบบที่ฉันใช้ซึ่งเนื้อหามีมากหรือน้อยตรงกับด้านบน เมื่อฉันต้องการ chroot เข้าสู่ระบบนั้นจาก LiveCD หรืออะไรสักอย่างจากนั้นฉันเพิ่งติดตั้งระบบไฟล์รูทและรันสคริปต์ chroot ไม่มี googling คลั่งสำหรับคำสั่งที่เหมาะสม
Ryan Thompson

4
คุณครับบันทึกเบคอนของฉัน - บทความที่ยอดเยี่ยม ในสถานการณ์เช่นนี้ฉันหวังว่า SO จะมีปุ่ม +1000
zelanix

1
ใช้สิ่งนี้: SHELL=/bin/bash chroot /mntหาก SHELL เริ่มต้นของ livecd ไม่ได้อยู่ในสภาพแวดล้อม chrooted (defalut zsh ของ systemrescuecd เป็นตัวอย่าง) เพื่อแก้ไขเช่น!ใน Vim
Alois Mahdal

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