Cách thích hợp để chuẩn bị chroot để khôi phục cài đặt Linux bị hỏng là gì?


52

Câu hỏi này liên quan đến các câu hỏi thường được hỏi. Thủ tục thường được đề cập hoặc liên kết với ngoại vi, nhưng không thường được nêu rõ ràng và chính xác. Trong một mục tiêu để tập trung thông tin hữu ích ở một nơi, câu hỏi này tìm cách cung cấp một tài liệu tham khảo rõ ràng, chính xác cho thủ tục này.


Các bước thích hợp để chuẩn bị một môi trường chroot cho một quy trình phục hồi là gì?

Trong nhiều tình huống , sửa chữa cài đặt Linux bị hỏng được thực hiện tốt nhất từ ​​bên trong cài đặt. Nhưng nếu hệ thống không khởi động, làm thế nào để bạn khắc phục nó từ bên trong?

Giả sử bạn quản lý để khởi động vào một hệ thống thay thế. Khi đó, bạn cần truy cập vào bản cài đặt bị hỏng của mình để sửa nó. Nhiều phục hồi How-Tos khuyên bạn nên sử dụng chroot để chạy các chương trình như thể bạn thực sự đã khởi động vào bản cài đặt bị hỏng.

  • Thủ tục cơ bản là gì?
  • Có chấp nhận thực hành tốt nhất để làm theo?
  • Những biến nào cần được xem xét để điều chỉnh các bước chuẩn bị cơ bản cho một nhiệm vụ phục hồi cụ thể?

Vì đây là Community Wiki, vui lòng chỉnh sửa câu hỏi này để cải thiện nó.

Câu trả lời:


72

Dưới đây là một số tài nguyên:

"Thay đổi root" hoặc "chroot" là một phương pháp để phóng to một phần của hệ thống tập tin của bạn, do đó, ví dụ, /pathsẽ đề cập đến những gì trước đây có thể truy cập được /mnt/path. "Root" trong biểu thức "chroot" dùng để chỉ hệ thống tập tin gốc /chứ không phải người dùng root. (Mặc dù thông thường, bạn sẽ cần đặc quyền người dùng root để chroot.)

Sự chuẩn bị

  • Tất cả các bước trong hướng dẫn này sẽ phải được thực hiện như người dùng root.

  • Chúng tôi cho rằng đĩa cứng của bạn là / dev / sda1 và filetype của nó là ext3. Nếu bạn không biết vị trí và kiểu tệp của đĩa, hãy đọc đầu ra của fdisk -l.

  • Hãy chắc chắn rằng các kiến ​​trúc của hệ thống bạn đã khởi động (ví dụ: LiveCD 32 bit) và hệ thống bạn muốn nhập (ví dụ: cài đặt 32 bit trên ổ cứng của bạn) phù hợp. Bạn có thể xác định kiến ​​trúc bạn đã khởi động bằng cách sử dụng uname -m.

  • Hãy chắc chắn rằng bất kỳ mô-đun hạt nhân nào bạn cần đã được tải.

  • Thiết lập mạng của bạn nếu bạn cần nó (ví dụ: để cài đặt các gói cập nhật).

  • Khởi tạo phân vùng trao đổi của bạn nếu cần thiết (ví dụ swapon /dev/sda3:).

Thực hiện 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

Nếu /bootthư mục của bạn nằm trên một phân vùng khác với bạn /và bạn muốn thao tác các tệp trên đó (ví dụ: nếu bạn sẽ làm việc với GRUB, thực hiện nâng cấp kernel, v.v.), bạn cũng sẽ cần phải gắn phân vùng đó. Nếu nó ở / dev / sda2 và filetype của nó là ext2, thì hãy làm:

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

Tương tự như vậy đối với bất kỳ phần nào khác trong hệ thống tệp của bạn ( /var, /usr) nằm trên các phân vùng riêng biệt nhưng bạn cần truy cập. Nói chung khi bạn chroot để sửa một cái gì đó bạn sẽ không cần truy cập vào / nhà, vì vậy bạn không cần phải bận tâm đến nó.

. che giấu chúng trước khi thoát khỏi chroot, hệ thống sẽ không biết cách khắc phục chúng khi tắt máy. Điều này có thể làm hỏng các hệ thống tập tin đó.)

Nếu bạn đã thiết lập mạng của mình và muốn sử dụng nó trong hệ thống chroot, hãy sao chép /etc/resolv.confđể bạn có thể giải quyết các tên miền:

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

Bây giờ bạn đã sẵn sàng để chuyển sang hệ thống tập tin được gắn kết:

chroot /mnt /bin/bash

(Nếu điều này trả về lỗi chroot: cannot run command '/bin/bash': Exec format error, điều này thường chỉ ra rằng bạn đã khởi động với một kiến ​​trúc (ví dụ x86_32) và đang cố gắng chroot vào một kiến ​​trúc khác (ví dụ: x86_64). chroot vào.)

Tại thời điểm này, bạn vẫn đang chạy kernel mà bạn đã khởi động, nhưng tất cả các đường dẫn /pathsẽ đề cập đến những gì đã từng /mnt/path.

Nếu bạn sẽ làm bất cứ điều gì với GRUB, bạn sẽ cần chắc chắn rằng /etc/mtabtệp của bạn được cập nhật:

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

Nó cũng có thể hữu ích tại thời điểm này để làm:

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

Làm công việc bẩn thỉu của bạn

Tại thời điểm này, bạn có thể thực hiện bất kỳ khắc phục sự cố nào bạn cần làm:

  • đặt lại GRUB vào MBR của đĩa của bạn
  • đặt lại mật khẩu đã quên
  • thực hiện nâng cấp kernel (hoặc hạ cấp)
  • xây dựng lại initramdisk của bạn
  • sửa lỗi / etc / fstab của bạn
  • cài đặt lại các gói bằng trình quản lý gói của bạn
  • bất cứ điều gì

Dọn dẹp

Khi bạn kết thúc, đảm bảo rằng tất cả các chương trình đang chạy đã dừng. Sau đó thoát khỏi chroot:

exit

Bây giờ ngắt kết nối tất cả các phân vùng bạn đã gắn kết:

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

Cuối cùng cố gắng để ngắt kết nối ổ cứng của bạn:

umount /mnt

Nếu bạn gặp lỗi nói rằng / mnt (hoặc bất kỳ phân vùng nào khác) đang bận, điều này có thể có nghĩa là một trong hai điều sau:

  • Một chương trình đã bị bỏ lại chạy bên trong chroot.

  • Hoặc thường xuyên hơn: một điểm gắn kết vẫn tồn tại trên giá treo này. Ví dụ: / mnt / usr vẫn được gắn kết khi cố gắng ngắt kết nối / mnt.

Trong trường hợp sau, chỉ cần ngắt điểm gắn kết vi phạm trước. Để nhận được lời nhắc về tất cả các điểm gắn kết hiện tại, hãy chạy mountkhông có tham số.

Cuối cùng:

reboot

10
Để chuẩn bị, tôi có xu hướng để lại một tập lệnh được gọi chroot.shtrong thư mục gốc của mọi hệ thống mà tôi sử dụng, có nội dung ít nhiều khớp với phần trên. Khi tôi cần chroot vào hệ thống đó từ LiveCD hoặc một cái gì đó, sau đó tôi chỉ cần gắn hệ thống tập tin gốc và chạy tập lệnh chroot. Không còn googling điên cuồng cho các lệnh đúng.
Ryan Thompson

4
Bạn, thưa ngài, đã cứu thịt xông khói của tôi - viết tuyệt vời. Trong những tình huống như thế này, tôi ước SO có nút +1000.
zelanix

1
Sử dụng điều này: SHELL=/bin/bash chroot /mntnếu SHELL mặc định của livecd không ở trong môi trường chroot (zal defalut zsh của systemrescuecd là một ví dụ) để sửa, ví dụ như !trong Vim.
Alois Mahdal

Tôi phát hiện ra rằng bạn cũng cần phải gắn kết /runnhững ngày này với mount --bind /run /mnt/run.
báo cáo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.