web-dev-qa-db-ja.com

壊れたLinuxインストールを回復するためにchrootを準備するための適切な方法は何ですか?

この質問はよく寄せられる質問に関連しています。この手順は頻繁に言及されているか、またはオフサイトにリンクされていますが、明確かつ正しく記述されていないことがよくあります。この質問では、有用な情報を一箇所に集中させることを目的として、この手順について明確で正しい参照を提供しようとしています。


復旧手順のためにchroot環境を準備するための適切な手順は何ですか?

多くの状況 では、壊れたLinuxインストールを修復するのが最善の方法です。インストールしかし、システムが起動しない場合は、どのように内部から修正するのですか?

あなたが代替システムを起動することに成功したと仮定しましょう。そこに来たら、あなたはそれを修正するためにあなたの壊れたインストールにアクセスする必要があります。多くの リカバリHow-Tos の使用をお勧めします chroot は、あたかも実際に壊れたインストールで起動したかのようにプログラムを実行するためのものです。

  • 基本的な手順は何ですか?
  • 従うべきベストプラクティスはありますか?
  • 基本的な準備手順を特定の復旧作業に適応させるためには、どのような変数を考慮する必要がありますか。

これはコミュニティWikiなので、この質問も自由に編集して改善してください。

50
quack quixote

ここにいくつかのリソースがあります:

"rootの変更"や "chrooting"はファイルシステムの一部をズームインする方法です。例えば、/pathは以前は/mnt/pathでアクセス可能だったものを参照します。式 "chroot"の "root"は、rootユーザーではなく、ルートファイルシステム/を参照します。 (ただし、通常chrootするにはrootユーザー特権が必要になります。)

準備

  • このガイドのすべての手順は、rootユーザーとして実行する必要があります。

  • あなたのハードディスクは/ dev/sda1にあり、ファイルタイプはext3だとします。ディスクの場所とファイルタイプがわからない場合は、fdisk -lの出力を読んでください。

  • 起動したシステムのアーキテクチャ(例:32ビットLiveCD)と入力したいシステム(例:ハードドライブ上の32ビットインストール)が一致していることを確認してください。 uname -mを使用して起動したアーキテクチャを判断できます。

  • 必要なカーネルモジュールがロードされていることを確認してください。

  • 必要に応じてネットワークを設定します(たとえば、アップデートパッケージのインストールなど)。

  • 必要に応じてスワップパーティションを初期化します(例: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にアクセスする必要はないでしょうから、それを気にする必要はありません。

(chrootした後にファイルシステムをマウントすることも可能ですが、事前に行うのが賢い方法です。それをした後は、外部/カーネル環境がマウントされたファイルシステムを認識しないため、忘れた場合chrootを終了する前にそれらをアンマウントしても、システムはシャットダウン時にそれらをアンマウントすることを知りません。これはそれらのファイルシステムにダメージを与える可能性があります。)

ネットワークを設定し、それをchrootシステムで使用したい場合は、ドメイン名を解決できるように/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を返す場合、これは通常あなたが1つのアーキテクチャ(たとえばx86_32)で起動し、別のアーキテクチャ(たとえばx86_64)に移行しようとしていることを示します。にchrootします。)

この時点では、起動したカーネルをまだ実行していますが、すべてのパス/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

あなたの汚い仕事をする

この時点で、必要なトラブルシューティングは何でも実行できます。

  • あなたのディスクのMBRにresintall GRUB
  • 忘れたパスワードをリセットする
  • カーネルのアップグレード(またはダウングレード)を実行する
  • 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(または他のパーティション)がビジーであるというエラーが表示された場合、これは2つのうちの1つを意味します。

  • プログラムがchroot内で実行されたままになりました。

  • もっと頻繁に:このマウントにはまだマウントポイントが存在します。たとえば、/ mntをマウント解除しようとしても、/ mnt/usrはマウントされたままです。

後者の場合は、まず問題のあるマウントポイントをアンマウントしてください。現在のすべてのマウントポイントを思い出させるには、パラメータなしでmountを実行します。

最後に:

reboot
71
dubiousjim