概要
サーバ、PC等を運用している途中、ディスクが壊れてファイルシステムが破損してしまうという事が起こる。その時、起動に影響のないパーティションであればそのまま復旧も可能だろうが、/領域みたいな箇所である場合は、レスキューモードで起動してあげる必要があるため、その方法を記載する。
エラーの確認
ディスクが復旧したのにサーバがうまく動作しない場合があるとする。たとえばdocker-build時に以下のようなエラーがでる。ERROR: failed to solve: failed to register layer: mkdir /usr/local/lib/python3.10/lib2to3/pgen2: structure needs cleaningこれはディスク等の領域に問題が起こっている場合に起こりうるエラーである。
これは、対象のサーバ上で以下のようなコマンドでカーネルのdmsegからエラー有無を確認できる。ここから事象をディスクのxfsエラーであると確定する。また、対象のディスクをアンマウント後、xfs_repairコマンドを実行するようにと言われている。
dmesg | grep -i xfs
[2235933.427395] XFS (sda3): Metadata CRC error detected at xfs_inobt_read_verify+0x1a/0xc0 [xfs], xfs_inobt block 0x9d4e8710 [2235934.025478] XFS (sda3): Unmount and run xfs_repair [2235934.305206] XFS (sda3): First 128 bytes of corrupted metadata buffer:
ISO入りのUSBファイルの作成。
まずは故障したOSと同じISOイメージを使ったUSBファイルを作成する。
ISOイメージは任意のPC(ここではLinuxとする)に既に置いてあるものとする。
任意のPCに起動用のUSBを刺した後、以下のコマンドでどの名前で認識されているか確認する。
lsblk
コマンド等でUSBのブロックを確認する。
その後以下のコマンドで起動用のUSBを作成する。
- ifがISOファイル
- ofはUSBファイル
sudo dd if=/path/to/CentOS-7-x86_64-DVD-2009 of=/dev/sdX bs=4M
数分待つと、USBにISPファイルが書き込まれる
レスキューモードで起動
その後、USBファイルを故障機に刺し、リブートさせる。
USBかilo image mountで起動ディスクを読めるようにしておく。
今回はUSBボートを行うため、3番を選んで起動させる。
Rescue a CentOS8 Stream systemを選択

ファイルシステムの修復
2番を押してTTY2を起動を行う。(shellの起動を行う。)
その後、以下のコマンドで復旧対象のデバイスブロックが存在する事を確認する。
lsblk
また、mountコマンドで現在のボリュームのマウント状況を確認する。
mount
そして、以下のコマンドで修復予定のファイルシステムをアンマウントする。
(故障している場合はもうアンマウントできないといわれる可能性もある。)
umount /dev/ブロック名
その後、以下のコマンドで修復する。
xfs_repair /dev/sda3
うまくいかない場合は、再度アンマウントされている事を確認後以下のコマンドを実行する。今回はこれを実行した。
xfs_repair -L /dev/sda3
その時のエラー文は以下のような形。

その後以下のコマンドを実行して再マウントする。
(事前にdfコマンド等で使用している領域を確認する事)
mount /dev/修復したブロック /(元のマウント場所)
その後、以下のコマンドでマウントできている事を確認する。df -hの場合のみ、/ でマウントしている箇所がレスキューモード用のマウントの位置になっている可能性がある。
mount
lsblk
df -h
その後再起動を実行し、さらにUSBを抜く。
reboot
その後、OSが立ち上がるまで待つ。


