春先、ReadyNASが壊れて IODATA のNASユニットを中古で買って Alpine Linux でNASを組んだ。
USB でブートし、RAM上で運用している。職場のNASはミラーリングされたHDDを ext4 でフォーマットしてあったのでカーネルをアップデートしてもすぐに使うことができた。順調に稼働している。
しかし、調子こいて家のNASも同じようにUSBブートで組んだのだが、カーネルをアップデートしたらHDDがマウントできなくなった。zfsでフォーマットしてあったからだ。Boot USB の boot ディレクトリに modloop-lts というファイルがあるのだが、update-kernel だけでは、ここに zfs modules が組み込まれないからだと分かった。
対処法は、run alpine linux as ramdisk/iso/usb with zfs modules (modloop) に書いてあった。
$ mkdir /tmp/a
$ cd /tmp/a
$ unsquashfs /media/sd**/boot/modloop-lts
$ mv squashfs-root/ lib
$ tar -xzvf /etc/apk/cache/zfs-lts-*.apk
$ depmod -b /tmp/a
$ mksquashfs lib/ modloop-lts -noappend -always-use-fragments
$ mount -o rw,remount /media/sd**
# do backup but not as /filename or /boot/filename, alpine will be use it)
$ mv /tmp/a/modloop-lts /media/sd**/boot/modloop-lts
$ sync
$ mount -o ro,remount /media/sd**
# disable modloop signature verification
$ vi /etc/init.d/modloop
--- /etc/init.d/modloop
+++ /etc/init.d/modloop
@@ -31,7 +31,7 @@
IFS="$oifs"
for line; do
img=${line%%:*}
- verify_modloop "$img" || eerror "Failed to verify signature of $img!"
+# verify_modloop "$img" || eerror "Failed to verify signature of $img!"
mount "$img" -o loop,ro /.modloop || continue
if [ -d /.modloop/modules/$kver ]; then
return 0
@@ -88,7 +88,7 @@
ebegin "Mounting modloop $modloop"
if [ -n "$modloop" ]; then
- verify_modloop "$modloop" || eerror "Failed to verify signature of $img!"
+# verify_modloop "$modloop" || eerror "Failed to verify signature of $img!"
mount -o loop,ro $modloop /.modloop
eend $? || return 1
else
$ lbu add /etc/init.d/modloop
$ lbu ci
$ reboot
これでうまく行きました!つまり、
- squashfsで固められているmodloop-ltsファイルを展開し名前を本来のlibにかえる
- zfs-ltsパッケージを展開して zfs kernel modules を加える
- depmod で依存関係を整理
- もう一度squashfsで固めて新しい modloop-lts を作り、USBの/bootフォルダに書き込む
- 起動スクリプトを変更して、modloop の signature が違ってもスルーするよう改変する
なのだ!

ピンバック: USBで運用するAlpineLinuxのkernelアプデ – つれづれなるままに