(Gentoo)カーネルビルド後の不具合と復旧

投稿者: | 2020年4月27日
皆さんこんにちは。
今回は、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