今回は、Gentooでカーネルオプションを変更後にシステムが起動してこず、ちょっと焦ったのでその復旧方法と便利なスクリプト(diffconfig)をメモしておきます。
Gentooで何かパッケージを入れる際に/usr/src/linux配下でmake menuconfigでカーネルの設定を行ってオプションを有効化する必要があったりします。また、「なんかうまく動作しないな?」的な時にもカーネルのオプションで不足してるものがないか確認して手探りでカーネルのコンフィグをいじったりもします(<-ちゃんとドキュメントみて有効化したほうがよいです。私はざるなのでとりあえずそれっぽそうなのを有効化したりしてます)
そんな感じであれこれコンフィグをいじっていたらシステムが起動してこなくなくなったので原因究明は一旦置いておいて、以下の手順で復旧を行いました。多分また同じような過ちを繰り返すと思うので自分用にメモ。
ちなみにエラーは以下のようにrootデバイスをうまく読み込めなくなるという現象でした。UUIDも一致してたし、パーティション名でルートデバイスを指定してもダメでした。謎い。
!! Unable to resolve root: UUID=xxxxxxxxxx !! Could not find the root block device in UUID=xxxxxxxx
1, システム起動時に不具合が発生するカーネルと別のカーネルで起動を試みる
GRUBの起動画面で他のカーネルを選択して起動できるか試してみます。うまくいけばそのままブートしてシステムにログインできます。別カーネルがない場合はliveCDからブートして、Gentooのインストール時と同様にchrootしてシステムに入ることで代替できるかもです。
2, カーネルコンフィグのバックアップファイルで既存の.configを上書きする
色々いじっておかしくなったカーネルコンフィグを捨てて、今まで起動していた設定でうわがきします。私の環境だと以下の感じで設定ファイルのバックアップが作成されていました。
// カーネルコンフィグのバックアップを確認 hiro-gentoo /usr/src/linux # ll .config* -rw-r--r-- 1 root root 131696 4月 26 23:03 .config -rw-r--r-- 1 root root 131696 3月 6 00:22 .config--2020-03-05--15-22-05.bak -rw-r--r-- 1 root root 131696 3月 6 00:28 .config--2020-03-05--15-28-04.bak -rw-r--r-- 1 root root 131718 3月 6 19:05 .config--2020-03-06--10-05-16.bak -rw-r--r-- 1 root root 131449 3月 6 19:47 .config--2020-03-06--10-47-12.bak -rw-r--r-- 1 root root 110432 3月 6 23:07 .config--2020-03-06--14-07-02.bak -rw-r--r-- 1 root root 131494 3月 9 12:17 .config--2020-03-09--03-17-11.bak -rw-r--r-- 1 root root 131696 3月 9 12:28 .config--2020-03-09--03-28-30.bak -rw-r--r-- 1 root root 131696 4月 26 23:03 .config.old
// うまく起動していたファイルで上書き hiro-gentoo /usr/src/linux # cat .config--2020-03-09--03-28-30.bak > .config
3, カーネルをビルドして再起動
make -j17 make modules_install make install genkernel --install initramfs grub-mkconfig -o /boot/grub/grub.cfg rebootとりあえずこれで起動したのでひと安心です。
また、色々調べてたらカーネルコンフィグは以下のようにdiffをとることが出きることを知りました。便利だったので今度不具合が起こったら不具合のトリガーを確認する手がかりになるかなと思いました。
hiro-gentoo /usr/src/linux # /usr/src/linux/scripts/diffconfig .config--2020-03-09--03-17-11.bak .config BRIDGE m -> y BRIDGE_VLAN_FILTERING n -> y CRYPTO_AEAD m -> y CRYPTO_BLKCIPHER m -> y CRYPTO_CBC m -> y CRYPTO_CTR m -> y CRYPTO_CTS n -> y CRYPTO_DRBG m -> y CRYPTO_DRBG_MENU m -> y CRYPTO_ECB m -> y CRYPTO_JITTERENTROPY m -> y CRYPTO_NULL m -> y CRYPTO_RNG m -> y CRYPTO_RNG_DEFAULT m -> y CRYPTO_SEQIV m -> y CRYPTO_SHA256 m -> y CRYPTO_XTS m -> y EXT4_DEBUG n -> y EXT4_ENCRYPTION n -> y FS_ENCRYPTION n -> y IPV6 m -> y IRQ_BYPASS_MANAGER m -> y KVM m -> y KVM_AMD m -> y KVM_INTEL m -> y LLC m -> y STP m -> y TUN m -> y USB_SERIAL_BELKIN n -> m USB_SERIAL_CP210X n -> m USB_SERIAL_CYBERJACK n -> m USB_SERIAL_CYPRESS_M8 n -> m USB_SERIAL_DEBUG n -> m USB_SERIAL_DIGI_ACCELEPORT n -> m USB_SERIAL_EDGEPORT n -> m USB_SERIAL_EDGEPORT_TI n -> m USB_SERIAL_EMPEG n -> m USB_SERIAL_F81232 n -> m USB_SERIAL_F8153X n -> m USB_SERIAL_FTDI_SIO n -> m USB_SERIAL_GARMIN n -> m USB_SERIAL_IPAQ n -> m USB_SERIAL_IR n -> m USB_SERIAL_IUU n -> m USB_SERIAL_KEYSPAN n -> m USB_SERIAL_KEYSPAN_PDA n -> m USB_SERIAL_KLSI n -> m USB_SERIAL_KOBIL_SCT n -> m USB_SERIAL_MCT_U232 n -> m USB_SERIAL_METRO n -> m USB_SERIAL_MOS7715_PARPORT n -> y USB_SERIAL_MXUPORT n -> m USB_SERIAL_OPTICON n -> m USB_SERIAL_PL2303 n -> m USB_SERIAL_QCAUX n -> m USB_SERIAL_QT2 n -> m USB_SERIAL_QUALCOMM n -> m USB_SERIAL_SAFE n -> m USB_SERIAL_SIERRAWIRELESS n -> m USB_SERIAL_SIMPLE n -> m USB_SERIAL_SPCP8X5 n -> m USB_SERIAL_SSU100 n -> m USB_SERIAL_SYMBOL n -> m USB_SERIAL_TI n -> m USB_SERIAL_UPD78F0730 n -> m USB_SERIAL_VISOR n -> m USB_SERIAL_WISHBONE n -> m USB_SERIAL_XIRCOM n -> m USB_SERIAL_XSENS_MT n -> m VHOST_NET n -> y VLAN_8021Q m -> y VLAN_8021Q_GVRP n -> y VLAN_8021Q_MVRP n -> y +EXT4_FS_ENCRYPTION y +GARP y +KEXEC_FILE n +MRP y +RPCSEC_GSS_KRB5 m +SUNRPC_GSS m +USB_SERIAL_SAFE_PADDED y +VHOST y参考: https://wiki.gentoo.org/wiki/Kernel/Configuration/ja