jessieにアップグレードした際に起動周りで色々問題が起きたのでメモ。
一部解決、かなり未解決。
段階的に修正していくしかなさそう。
→解決
#grub-install /dev/sda
#update-grub
で改善した(他に色々作業していたので、別の処置で改善した可能性も)
→解決
jessieではgrubにsystemdとsysvinitが両方登録される。
wheezy時代には起動していたカーネルのsystemd版は起動しない。sysvinit版だと起動する。
jessieからinit周りがsystemdに切り替わるため、init.dでカスタマイズしたサービスが動かないとは聞いていたが起動しないとは想定外。
原因はfstabにあった。
どうやら、systemdではfstabの記述を厳密に解釈するらしい。usb外付けで繋いでいたドライブ(今は繋いでいない)のoptionsが
defaults
になっていた。
user,noauto
に修正して改善。
→未解決解決
wheezyで入っていた3.2.0-4-686-paeは起動するのだが、3.16.0-4-686-paeで起動しない。
gave up waiting for root device
alert /dev/disk/by-uuid/~~ does not exist
が出る。
busyboxのシェルであれこれ試してみると、
・/dev/disk/by-uuid/が無い
・そもそも/dev/sda1が無い
・cat /proc/modules は空
全くドライバが読めていないっぽい。
起動するカーネル(3.2.0-4-686-pae)のinitrdは12MB
起動しないカーネル(3.16.0-4-686-pae)のinitrdは4MB
lsinitramfsでのぞくと、3.16の方は/lib/modules/3.16.0-4-686-pae/kernel配下がまるごと無い
update-initramfs -uで症状変わらず
起動オプションrootdelay=90等で症状変わらず
depmod -a 3.16.0-4-686-paeでも症状変わらず
ここで今回の調査は断念。
initramfs-toolsのバグだか考慮漏れだかに当たっているような気がしている。
自分でカーネル作り直せば確実なのは分かっているが、そもそも管理コストを下げるためにカーネルもdebian標準にしたいというのが方針なので、しばらく標準でのinitrd正常化方策を探すことにする。といってもかなり色々試してはいるので、調べ方変えるか時間に解決してもらうかじゃないとちょっと無理そう。
[2015/07/28 追記]
時間が取れたので、ひたすら人力で調べてみた。
まずupdate-initramfs内で呼び出しているmkinitramfsを直に叩いてみるが、やはりmodulesが抜ける。
#mkinitramfs -o /boot/initrd.img-3.16.0-4-686-pae.new 3.16.0-4-686-pae
mkinitramfsをたどっていくと、/usr/share/initramfs-tools/hook-functions内のmanual_add_modulesでmodprobeの結果を元にループを回している箇所がある。ここが3.2では動いているのに3.16では動いていない。はて。
スクリプト内で使用しているコマンドをログインシェルで叩いてみるが、いずれのバージョンも問題がない。
#modprobe --all --set-version=3.2.0-4-686-pae --ignore-install --quiet --show-depends eql
insmod /lib/modules/3.2.0-4-686-pae/kernel/drivers/net/eql.ko
#modprobe --all --set-version=3.16.0-4-686-pae --ignore-install --quiet --show-depends eql
insmod /lib/modules/3.16.0-4-686-pae/kernel/drivers/net/eql.ko
とすると、mkinitfamfs内の環境変数が原因か。
で、調べたところ、
#export PATH=/usr/bin:/sbin:/bin
で動きが変わることが分かった。げーっ。実行ファイルゴースト問題だー。
結局のところ、modprobeもdepmodも/sbinと/usr/local/sbinの両方にありログインシェルでは/usr/local/sbinを見ていた。
/usr/local/sbinの方のタイムスタンプは2004年、うぉう。
あとは推測だが、aptでカーネルイメージを入れた際に/usr/local/sbinの古いdepmodを呼んでしまうようだ。古いdepmodは、/lib/modules/<< version >>/modules.dep.binを生成しない。同じく/usr/local/sbinの古いmodprobeはこれで動くのだが、新しい/sbinのmodprobeは
#/sbin/modprobe --all --set-version=3.16.0-4-686-pae --ignore-install --show-depends eql
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file '/lib/modules/3.16.0-4-686-pae/modules.dep.bin'
となってしまう(quiet無しだとエラーが出る。ありだと何も出ない)。
3.2は何かのタイミングで新しいmodprobeを発火するタイミングがあった模様で、modules.dep.binがいた。そんな状態で良く動いてたな。
ということで、depmodもmodprobeも新しい方を使ってやればよい。
#/sbin/depmod -v 3.16.0-4-686-pae
これで
/lib/modules/3.16.0-4-686-pae/modules.dep.bin
ができた。
あとはこれでinitrdを作ってやる。
#update-initramfs -u -k 3.16.0-4-686-pae
丸々と太った健康そうな16MBのinitrdができた。
うーん、やっぱりwoodyのアップグレード&アップグレードじゃ限界あるなあ。
→未解決
grub起動時にオプションをeで変えると、
unaligned pointer 0x8
が出る。
GRUBのバグかなあ。
ということで、しばらくwheezy時代のsysvinitカーネルを使用する。systemdにするためには洗い出しが必要なので3.16が動くようになってからにしたい。
/etc/default/grub
GRUB_DEFAULT="Debian GNU/Linux, with Linux 3.2.0-4-686-pae (sysvinit)"
最初上記形式で書いたが、update-grubしたらwarningが出たので、
/etc/default/grub
GRUB_DEFAULT="gnulinux-advanced-~~>gnulinux-3.2.0-4-686-pae-init-sysvinit-~~"
に変更して、update-grub。
これでとりあえず再起動しても特に操作せずに起動するようになった。
うーん、サーバつぶした方がいいんだろうか。
こういうドハマリは維持意欲を削ぐ。
このサーバはwoodyからの10年選手なので64bit化も含め再インストール時期ではあるのだが……