USB接続の外付けHDDではまる

LABEL=USBHDD   /mnt/usbhdd ext4        defaults,noatime,nodiratime,noauto  0 0

となっていたのを、これでは起動時にfsckが走らないではないか、ということで

LABEL=USBHDD   /mnt/usbhdd ext4        defaults,noatime,nodiratime,noauto  0 5

とした。そしたら起動しなくなった(^o^)/。 原因はおそらく、fsckかける段階ではまだ、USB接続のHDDをうまく扱えないから(モジュールとかの関係だと思われる)。 っていうかオプションにnoautoしてる時点でそれに気づくべきだった。 /etc/rc.localに

(sleep 10 && /bin/mount /mnt/usbhdd) &

とあって、気持的にはautoだった。 完全に忘れていた。

initramfs に usb のモジュール読み込むように設定すればよい?

/etc/mkinitcpio.confのHOOKにusbを追加してみた。

HOOKS="base udev autodetect sata filesystems usb keymap usbinput"

その後

% sudo mkinitcpio -p kernel26

として、initramfs再構築。再起動してみた。 fallbackのイメージならマウントできた。 通常のautodetect入りのイメージではマウントできず(デバイスが存在しないと怒られる)。 おそらく、何かのモジュールが読み込まれていない? 原因不明。

udev使ってオートマウントする

udev – ArchWiki /etc/udev/rules/11-media-auto-mount.rules

KERNEL!="sd[b-z]*", GOTO="media_auto_mount_end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="media_auto_mount_end"

# Global mount options
ACTION=="add", ENV{mount_options}="noatime,nodiratime,users"
# Filesystem specific options
ACTION=="add", PROGRAM=="/sbin/blkid -o value -s TYPE %E{device}", RESULT=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002"

# Get label
ACTION=="add", PROGRAM=="/sbin/blkid -o value -s LABEL %E{device}", ENV{dir_name}="%c"
# use basename to correctly handle labels such as ../mnt/foo
ACTION=="add", PROGRAM=="/usr/bin/basename '%E{dir_name}'", ENV{dir_name}="%c"
ACTION=="add", ENV{dir_name}!="?*", ENV{dir_name}="usb-%k"

ACTION=="add", ENV{dir_name}=="?*", RUN+="/bin/mkdir -p '/media/%E{dir_name}'", RUN+="/bin/mount -o %E{mount_options} /dev/%k '/media/%E{dir_name}'"
ACTION=="remove", ENV{dir_name}=="?*", RUN+="/bin/umount -l '/media/%E{dir_name}'", RUN+="/bin/rmdir '/media/%E{dir_name}'"

LABEL="media_auto_mount_end"

udevの文法は好きになれない。 これで万事OKかと思いきや、うまくLABELを取得できない。 もう、面倒なので結局、はじめの/etc/rc.localで対応することにした。

More Reading