皆さん、ルートFS関連の作業してる時に、Target is busy.
とかのエラーが発生して、仕方なく別のコンピュータにHDDを繋ぎ変えたりOSを変えたりすることってありませんか?筆者はあります。
これ、実は再起動してからブートローダで色々してやることで、一つのマシン・OSだけで完結させてやることができます。
今回はそれについて備忘録も兼ねて解説します。
やり方
1. GRUBのOS選択画面にて、LinuxなOSを選択した状態で「c」キーを押す
2. エディターが起動したら、「linux」から始まる行にUUIDがあるので、それをデタラメに弄って存在しない物にする
3. Ctrl+Xでエディタを抜ける
4. (initramfs)プロンプトが出るので、そこでいつも通りコマンドを実行してファイルシステム関連操作をする (bash特有の複雑な表現は使えないものがありかもしれません。)
解説
Linux系ディストリビューションの起動はいくつか段階を踏んで実行されますが、簡単に解説すると次のようになります。
1. BIOS/UEFIがブートローダを呼び出す
2. ブートローダがLinuxカーネルと初期RAMディスク(initrd/initramfs)をメモリに読み込み、初期RAMディスクをルートディレクトリとして起動する
3. initd/systemdが起動し、初期RAMディスクから起動に必要なカーネルモジュール等を読み込んで、ルートファイルシステムをマウントし、chrootする
4. chroot後、initd/systemdが再実行され、各種サービスを起動
この時、初期RAMディスクがルートファイルシステムをマウントすることを阻止できれば、起動処理が失敗し、復旧用シェルが起動します。その状態ではルートファイルシステムはマウントされていないので、ルートファイルシステムが未マウントの状態で、怒られずにデバイスを触ることができます。
上の手順では、「ルートファイルシステムの居場所を示したUUIDを記述した箇所」をぶっ壊すことで、ルートファイルシステムのマウントを阻止しています。
※再起動したらもとに戻ります。
以上