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


52

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


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

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

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

  • 基本的な手順は何ですか?
  • 従うべきベストプラクティスは受け入れられていますか?
  • 基本的な準備手順を特定の回復タスクに適合させるには、どの変数を考慮する必要がありますか?

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

回答:


72

以下にリソースを示します。

「ルートの変更」または「chrooting」は、ファイルシステムの一部を拡大するための方法です。そのため、たとえば、/path以前はでアクセスできたものを参照します/mnt/path。「chroot」という表現の「root」は/、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)についても同様です。一般に、何かを修正するためにchrootしているとき、/ 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しようとしていることを示します。 chroot into。)

この時点で、ブートしたカーネルをまだ実行していますが、すべてのパス/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(または他のパーティション)がビジーであるというエラーが表示された場合、これは次の2つのいずれかを意味します。

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

  • またはより頻繁に:このマウント上にまだマウントポイントが存在します。たとえば、/ mntをアンマウントしようとすると、/ mnt / usrはまだマウントされています。

後者の場合、最初に問題のマウントポイントをアンマウントします。現在のすべてのマウントポイントのリマインダーを取得するにmountは、パラメーターなしで実行します。

最後に:

reboot

10
準備として、chroot.sh使用するすべてのシステムのルートに呼び出されるスクリプトを残す傾向があり、その内容はほぼ上記と一致します。LiveCDなどからそのシステムにchrootする必要があるときは、ルートファイルシステムをマウントしてchrootスクリプトを実行するだけです。適切なコマンドを探し回る必要はありません。
ライアントンプソン

4
あなたは、私のベーコンを救いました-素晴らしい記事。このような状況では、SOに+1000ボタンがあればいいのにと思います。
ゼラニクス

1
これを使用します:SHELL=/bin/bash chroot /mntlivecdのデフォルトのSHELLがchrooted環境にない場合(systemrescuecdのデフォルトのzshが例です)、たとえば!Vimで修正します。
アロイスマーダル

/run最近はを使用してもマウントする必要があることがわかったmount --bind /run /mnt/run
cengique
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.