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をやってくれます。