先日、自宅のメインサーバがbootしなくなったことを契機にして、久々にUSBメモリから起動するFreeBSDシステムを作ってみました。 サーバーはHPのMicroserver Gen10、薄いバージョンの現行機種です。
コイツは内蔵のSATA×4台のほか、基板上にUSBを1個持っています。4台のHDDは全部RAIDZ2ストレージにしているため、PCIeインターフェースにNVMESSDのI/Fを挿して、そこから起動するようにしていました。 しかしZFS起動領域のupdateに失敗したかなんかで、起動しなくなってしまった次第です。ブート領域を書き直して復活させても良かったんですが、より汎用性を高めるためには、jail母艦としてOSをUSBで起動させ、NVMEのSSDは純粋にjail領域格納用、そしてHDDはファイルサーバ領域のストレージとしてmountすることにしました。
USBスティックメモリの選択 手元に転がっていたUSBメモリを適当に掻き集めたところ、32GBのメモリがあったのでこれを適当に使ったのですが、これがいけなかった 。 なにしろOSのインストールに時間が掛かりすぎる のです。余りにも、あまりにも遅い。遅い、遅い…。 どの製品かといえば、これ。
Windowsパソコン同士でのデータ転送用としては別段何の問題もないのですが、FreeBSDとは相性が余りにも悪いようです。 何とか我慢してインストールを終えたのですが、ここで昔、FreeBSD on USBStickmemoryを作るのに、やたらと速いメモリーがあったことを思い出し、ガラクタの山を漁ったところ…ありました。ありました!
このメモリー、大々的に謳われてはいないのですが、書き込みを禁止する物理スイッチが付いているんです。こういう機能は、余り良く分かっていない人からの「このメモリー書き込みができないぞ?不良品だ!」という問い合わせが相次いだせいか、説明書を見てもほとんど言及されていないのですが、今回のような用途にはうってつけとも言えるでしょう。
今回はファイルシステムをマウントするときにroにしただけで、物理的にRwadOnlyにはしていませんが、物理的にroに出来るのは重要な点です。
というわけで、USBメモリを/にマウントし、その他のマウントポイントは次のようになりました。
% df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/da0p2 28229340 2497740 23473256 10% / devfs 1 1 0 100% /dev /dev/nvd0p1 1937577676 258844424 1523727040 15% /jail zdata 25569827882 11315989295 14253838587 44% /jail/ほげほげ/home tmpfs 131072 88 130984 0% /var tmpfs 131072 4 131068 0% /tmp devfs 1 1 0 100% /jail/ほげほげ/dev devfs 1 1 0 100% /jail/ふがふが/dev devfs 1 1 0 100% /jail/もへもへ/dev
rc.confは次のような感じです。
% cat /etc/rc.conf apcupsd_enable="YES" apcupsd_flags="--term-on-powerfail" defaultrouter="ほげほげ" dumpdev="AUTO" hostname="ほげほげ.co.jp" jail_enable="YES" keymap="jp.kbd" ifconfig_igb0="inet ほげほげ.1 netmask 255.255.255.0" ifconfig_igb0_alias0="inet ほげほげ.2 netmask 255.255.255.255" ifconfig_igb0_alias1="inet ほげほげ.3 netmask 255.255.255.255" ifconfig_igb0_alias2="inet ほげほげ.4 netmask 255.255.255.255" ifconfig_igb0_alias3="inet ほげほげ.5 netmask 255.255.255.255" ifconfig_igb0_alias4="inet ほげほげ.6 netmask 255.255.255.255" ifconfig_igb0_alias5="inet ほげほげ.7 netmask 255.255.255.255" ifconfig_igb0_alias6="inet ほげほげ.8 netmask 255.255.255.255" ifconfig_igb0_alias7="inet ほげほげ.9 netmask 255.255.255.255" ifconfig_igb0_alias8="inet ほげほげ.10 netmask 255.255.255.255" ifconfig_lo0="inet 127.0.0.1" ifconfig_lo0_alias0="inet 127.0.0.2 netmask 0xffffffff" ifconfig_lo0_alias1="inet 127.0.0.3 netmask 0xffffffff" ifconfig_lo0_alias2="inet 127.0.0.4 netmask 0xffffffff" ifconfig_lo0_alias3="inet 127.0.0.5 netmask 0xffffffff" ifconfig_lo0_alias4="inet 127.0.0.6 netmask 0xffffffff" ifconfig_lo0_alias5="inet 127.0.0.7 netmask 0xffffffff" ifconfig_lo0_alias6="inet 127.0.0.8 netmask 0xffffffff" ifconfig_lo0_alias7="inet 127.0.0.9 netmask 0xffffffff" ifconfig_lo0_alias8="inet 127.0.0.10 netmask 0xffffffff" zfs_enable="YES" sshd_enable="YES" tmpmfs="YES" tmpsize="128m" tmpmfs_flags="-S" mfs_type="auto" clear_tmp_enable="YES" clear_tmp_X="YES" varmfs="YES" varsize="128m" varmfs_flags="-S" populate_var="AUTO" cleanvar_enable="YES" dmesg_enable="NO"
当初、/varと/tmpがUSBメモリ領域にマウントされますが、これはあんまり良くないのでmfsにしました。128MBとかで大丈夫か?と思いましたが、考えてみれば各jail領域内の/varとか/tmpとかはjail領域内(のファイルシステム上)に確保されるため、母艦側は各jail内の事は考えなくて良いことに気付きました。 そうそう、このままだと/var/emptyが無いのでsshdが起動しないため、/etc/rc.localに
% cat /etc/rc.local /bin/mkdir /var/empty /usr/sbin/sshd
こんな付け焼刃の設定もしてありますよ、っと。 そのほか、jail母艦側の/etc/master.passwdも必要最低限のアカウントを除いてコメントアウトしてあったりと、色々試してみてます。
% cat /etc/fstab #Device Mountpoint FStype Options Dump Pass# /dev/da0p2 / ufs ro 1 1 /dev/da0p3 none swap sw 0 0 /dev/nvd0p1 /jail ufs rw 0 0
あ、swap領域がUSBのままだった。まぁ後で調整すればいいか…。
以上。