Apa cara yang tepat untuk menyiapkan chroot untuk memulihkan instalasi Linux yang rusak?

52

Pertanyaan ini berkaitan dengan pertanyaan yang sering ditanyakan. Prosedur ini sering disebutkan atau dihubungkan ke luar kantor, tetapi tidak sering dinyatakan dengan jelas dan benar. Dalam suatu tujuan untuk memusatkan informasi yang berguna di satu tempat, pertanyaan ini berupaya memberikan referensi yang jelas dan benar untuk prosedur ini.


Apa langkah yang tepat untuk menyiapkan lingkungan chroot untuk prosedur pemulihan?

Dalam banyak situasi , memperbaiki instalasi Linux yang rusak paling baik dilakukan dari dalam instalasi. Tetapi jika sistem tidak mau boot, bagaimana Anda memperbaikinya dari dalam?

Mari kita asumsikan Anda berhasil boot ke sistem alternatif. Sesampai di sana, Anda perlu mengakses instalasi Anda yang rusak untuk memperbaikinya. Banyak pemulihan Bagaimana-Tos merekomendasikan menggunakan chroot untuk menjalankan program seolah-olah Anda benar-benar boot ke instalasi yang rusak.

  • Apa prosedur dasarnya?
  • Apakah ada praktik terbaik yang dapat diikuti?
  • Variabel apa yang perlu dipertimbangkan untuk menyesuaikan langkah persiapan dasar dengan tugas pemulihan tertentu?

Karena ini adalah Wiki Komunitas, silakan mengedit pertanyaan ini untuk memperbaikinya juga.

quack quixote
sumber

Jawaban:

72

Berikut ini beberapa sumber:

"Mengubah root" atau "chroot" adalah metode untuk memperbesar bagian sistem file Anda, sehingga, misalnya, /pathakan merujuk pada apa yang sebelumnya dapat diakses di /mnt/path. "Root" dalam ekspresi "chroot" merujuk ke sistem file root /, bukan ke pengguna root. (Meskipun biasanya Anda membutuhkan hak root untuk melakukan chroot.)

Persiapan

  • Semua langkah dalam panduan ini harus dilakukan sebagai pengguna root.

  • Kami menduga hard disk Anda ada di / dev / sda1 dan filetype-nya adalah ext3. Jika Anda tidak tahu lokasi dan tipe file dari disk Anda, baca output dari fdisk -l.

  • Pastikan bahwa arsitektur sistem tempat Anda mem-boot (mis. LiveCD 32bit) dan sistem yang ingin Anda masukkan (mis. Instalasi 32bit pada hard drive Anda) cocok. Anda dapat menentukan arsitektur yang Anda gunakan untuk boot uname -m.

  • Pastikan setiap modul kernel yang Anda butuhkan telah dimuat.

  • Atur jaringan Anda jika Anda membutuhkannya (mis., Untuk menginstal paket yang diperbarui).

  • Inisialisasi partisi swap Anda jika perlu (mis., swapon /dev/sda3).

Melakukan 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

Jika /bootdirektori Anda berada di partisi yang berbeda dari Anda /, dan Anda ingin memanipulasi file di dalamnya (mis., Jika Anda akan bekerja dengan GRUB, melakukan peningkatan kernel, dll.), Anda juga harus me-mount partisi itu. Jika di / dev / sda2 dan filetype-nya adalah ext2, maka lakukan:

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

Demikian pula untuk bagian-bagian lain dari sistem file Anda ( /var, /usr) yang berada di partisi terpisah tetapi Anda membutuhkan akses. Umumnya ketika Anda melakukan chroot untuk memperbaiki sesuatu, Anda tidak perlu mengakses / rumah, jadi Anda tidak perlu repot-repot melakukannya.

(Mungkin juga untuk me-mount filesystem setelah Anda melakukan chroot, tetapi lebih pintar untuk melakukannya sebelumnya. Alasannya adalah ketika Anda melakukannya setelah itu, lingkungan luar / kernel tidak akan tahu tentang filesystem yang di-mount, jadi jika Anda lupa untuk umount mereka sebelum keluar dari chroot, sistem tidak akan tahu untuk me-umount mereka ketika dimatikan, ini juga dapat merusak sistem file tersebut.)

Jika Anda telah mengatur jaringan Anda dan ingin menggunakannya dalam sistem chroot, salin /etc/resolv.confagar Anda dapat menyelesaikan nama domain:

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

Sekarang Anda siap untuk pindah ke sistem file yang terpasang:

chroot /mnt /bin/bash

(Jika ini mengembalikan kesalahan chroot: cannot run command '/bin/bash': Exec format error, ini biasanya menunjukkan bahwa Anda mem-boot dengan satu arsitektur (mis. X86_32) dan mencoba melakukan chroot ke arsitektur lainnya (mis. X86_64). Solusinya adalah menggunakan LiveCD yang memiliki arsitektur yang sama dengan sistem yang Anda inginkan. chroot menjadi.)

Pada titik ini, Anda masih menjalankan kernel yang Anda boot dengan, tetapi semua path /pathakan merujuk pada apa yang dulu /mnt/path.

Jika Anda akan melakukan sesuatu dengan GRUB, Anda harus memastikan /etc/mtabfile Anda terbaru:

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

Mungkin juga bermanfaat saat ini untuk melakukan:

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

Kerjakan pekerjaan kotor Anda

Pada titik ini, Anda dapat melakukan pemecahan masalah apa pun yang perlu Anda lakukan:

  • resintall GRUB ke MBR disk Anda
  • atur ulang kata sandi yang terlupakan
  • melakukan peningkatan kernel (atau downgrade)
  • bangun kembali initramdisk Anda
  • perbaiki / etc / fstab Anda
  • instal ulang paket menggunakan manajer paket Anda
  • Masa bodo

Membersihkan

Setelah selesai, pastikan semua program yang berjalan telah berhenti. Lalu keluar dari chroot:

exit

Sekarang unmount semua partisi yang Anda mount:

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

Akhirnya coba unmount hard drive Anda:

umount /mnt

Jika Anda mendapatkan kesalahan dengan mengatakan bahwa / mnt (atau partisi lain) sedang sibuk, ini bisa berarti satu dari dua hal:

  • Program dibiarkan berjalan di dalam chroot.

  • Atau lebih sering: titik pemasangan masih ada pada pemasangan ini. Sebagai contoh, / mnt / usr masih di-mount ketika mencoba meng-unmount / mnt.

Dalam kasus terakhir, cukup lepaskan dahulu mount point yang menyinggung terlebih dahulu. Untuk mendapatkan pengingat dari semua titik pemasangan saat ini, jalankan mounttanpa parameter.

Akhirnya:

reboot
dubiousjim
sumber
10
Sebagai persiapan, saya cenderung meninggalkan skrip yang disebut chroot.shroot dari setiap sistem yang saya gunakan, yang isinya kurang lebih sama dengan yang di atas. Ketika saya perlu chroot ke sistem itu dari LiveCD atau sesuatu, maka saya hanya me-mount sistem file root dan menjalankan skrip chroot. Tidak ada lagi googling panik untuk perintah yang tepat.
Ryan Thompson
4
Anda, Pak, menyelamatkan daging saya - tulisan yang cemerlang. Dalam situasi seperti ini, saya berharap SO memiliki tombol +1000.
zelanix
1
Gunakan ini: SHELL=/bin/bash chroot /mntjika SHELL default livecd tidak ada di lingkungan chroot (defresut zsh contohnya systemrescuecd) sebagai contoh) untuk memperbaiki mis !di Vim.
Alois Mahdal
Saya menemukan bahwa Anda juga perlu melakukan mount /runhari ini mount --bind /run /mnt/run.
cengique