udevの変更とその対策
こんなニュースが来ている。
2012-03-16-udev-181-unmasking Title udev-181 unmasking Author William Hubbs <williamh@gentoo.org> Posted 2012-03-16 Revision 1 udev-181 is being unmasked on 2012-03-19. This news item is to inform you that once you upgrade to a version of udev >=181, if you have /usr on a separate partition, you must boot your system with an initramfs which pre-mounts /usr. An initramfs which does this is created by >=sys-kernel/genkernel-3.4.25.1 or >=sys-kernel/dracut-017-r1. If you do not want to use these tools, be sure any initramfs you create pre-mounts /usr. Also, if you are using OpenRC, you must upgrade to >= openrc-0.9.9. For more information on why this has been done, see the following URL: http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
カーネルからのdevice情報を監視して、適宜device fileを作ってくれたりなんだりするudev。システムのboot時にも使われるのだけれど、udevが/usr以下にあるファイルに依存しちゃうようになった。 そもそもRedHatとかFedoraとかは/binと/usr/binをマージしちゃうから、起動している時には/usrがmountされているよね?って前提になっちゃったんだと思う。あと、多くのツールがudev ruleを使って、boot時にhookをかけたりしている。たとえばalsaの設定とかが入っている。この時に使われるバイナリはもとから/usr/binとかに置かれていたわけで…
いずれにせよ、そうすると /と/usrをわけているような環境では/sbin/initが走るより前に/usrをmountしていないといけない。そうするにはinitramfsが必要なのだ…orz
initramfsを作るにはニュースにも書いてある通り、genkernelやdracutを使うといい。genkernelはGentooでkernel作ったりinitramfs作ったりするのに使われるGentooお手製ツール、もうひとつのdracutの方はinitramfsを作るためのdistroに依存しないようなツールだそうで。
genkernelは genkernel initramfs とうちこむだけで/usr/src/linuxのカーネルバージョンを見て、必要なinitramfsを作ってくれます。
dracutは dracutとするだけである程度自動的に作ってくれますが、/usr/src/linuxの中を見ているのではなく起動しているカーネルバージョンで作ってしまうので、だいたいの場合は dracut /boot/initramfs-3.3.0.img 3.3.0 とかいうふうに、出力ファイル名とカーネルバージョンを指定しちゃいましょう。
さらに
うちの環境では /usr を /storage/usrのbind mountでmountしています。 fstabには
/storage/usr /usr none bind 0 0
とか書いてあって、initramfsの中のinitはこれを見て/usrをmountしようとするわけですが、/storageがmountされてないと /storage/usrはないのでうまくいきません。
ならどうするか?というとさきに /storageをmountするように設定します。 dracutを
dracut --mount "/dev/sda3 /storage btrfs noatime,autodefrag,compress=lzo,space_cache" --filesystems btrfs,ext4 /boot/initramfs-3.3.0-next-20120330.img 3.3.0-next-20120330
こんな感じでmountするものとmount optionを指定して起動すると/usrをmountするより前にこの/storageのmountをやってくれます。