目次
NanoBSD は組み込みシステム向けに FreeBSD の起動イメージを作成するためのツールで、FreeBSD の一部として配布されている。これを使うことで USB メモリに FreeBSD をインストールして、ルータやファイルサーバとして運用することができる。
準備するもの
- FreeBSD 12.2 をインストールした PC(仮想マシン)
- USB メモリ(8GB以上)
NanoBSD 設定ファイルの作成
以下を /root/mynas.conf というファイル名で保存する。各設定値の意味は /usr/src/tools/tools/nanobsd/defaults.sh に書いてある。
メモリが少なくて ZFS が使えない環境のため、ZFS は無効にした。
NANO_NAME=mynas
NANO_KERNEL=GENERIC
NANO_MODULES=default
NANO_ARCH=amd64
NANO_PMAKE="make -j8"
NANO_BOOT0CFG="-o packet -s 1 -m 3 -t 18"
NANO_BOOTLOADER=boot/boot0
NANO_DRIVE=da0
PPLEVEL=3
FlashDevice generic 8g
CONF_BUILD='
WITHOUT_NETGRAPH=YES
'
CONF_INSTALL='
WITHOUT_INSTALLLIB=YES
WITHOUT_MAKE=YES
WITHOUT_TOOLCHAIN=YES
WITHOUT_INCLUDES=YES
WITHOUT_ATM=YES
WITHOUT_NETGRAPH=YES
WITHOUT_ACPI=NO
WITHOUT_FLOPPY=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_FORTRAN=YES
WITHOUT_FORTH=YES
WITHOUT_OBJC=YES
WITHOUT_HTML=YES
WITHOUT_LPR=YES
WITHOUT_MAN=YES
WITHOUT_IPX_SUPPORT=YES
WITHOUT_NCP=YES
WITHOUT_RCS=YES
WITHOUT_RCMDS=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_EXAMPLES=YES
WITHOUT_INSTALLLIB=YES
WITHOUT_CALENDAR=YES
WITHOUT_MISC=YES
WITHOUT_PPP=YES
WITHOUT_WIRELESS_SUPPORT=YES
WITHOUT_MAIL=YES
'
CONF_WORLD='
WITHOUT_CROSS_COMPILER=YES
WITHOUT_BINUTILS_BOOTSTRAP=YES
WITHOUT_BINUTILS=YES
WITHOUT_CLANG_BOOTSTRAP=YES
WITHOUT_CLANG=YES
WITHOUT_CLANG_EXTRAS=YES
WITHOUT_ELFTOOLCHAIN_BOOTSTRAP=YES
WITHOUT_ELFTOOLCHAIN=YES
WITHOUT_ELFTOOLCHAIN_TOOLS=YES
WITHOUT_GCC_BOOTSTRAP=YES
WITHOUT_GCC=YES
WITHOUT_LLD_BOOTSTRAP=YES
WITHOUT_LLD=YES
XCC=/usr/bin/cc
XCXX=/usr/bin/c++
XCPP=/usr/bin/cpp
XAS=/usr/bin/as
XAR=/usr/bin/ar
XLD=/usr/bin/ld
XNM=/usr/bin/nm
XOBJDUMP=/usr/bin/objdump
XRANLIB=/usr/bin/ranlib
XSTRINGS=/usr/bin/strings
XSTRIPBIN=/usr/bin/strip
COMPILER_TYPE=clang
WITHOUT_BIND=YES
WITHOUT_INFO=YES
WITHOUT_GAMES=YES
WITHOUT_KERBEROS=YES
WITHOUT_ZFS=YES
'
customize_cmd cust_install_files
customize_cmd cust_allow_ssh_root
cust_install_packages() {
# /dev/null がないとコケる
mount -t devfs devfs ${NANO_WORLDDIR}/dev
cust_pkgng
umount ${NANO_WORLDDIR}/dev
}
customize_cmd cust_install_packages
# ソフトウェアRAIDとジャーナリングに必要なカーネルモジュールを読み込む
cust_loader_conf() (
touch ${NANO_WORLDDIR}/boot/loader.conf
echo "beastie_disable=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_stripe_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_mirror_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_journal_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
)
customize_cmd cust_loader_conf
イメージに組み込みパッケージの準備
NanoBSD には任意のパッケージを組み込むことができる。
以下のように所定の場所にパッケージを置けば、イメージのビルド中にパッケージが自動的にインストールされる。
# pkg -d -o ./pkg pkg samba413 smartmontools
# cp -R ./pkg/All /usr/src/tools/tools/nanobsd/Pkg
イメージのビルド
以下のコマンドでイメージのビルドを実行。そこそこ時間がかかる。ビルド中のログは /usr/obj/nanobsd.mynas 以下に出力されるので、うまくいかった場合はこのディレクトリ下のログを調べて原因を調査する。
# /usr/src/tools/tools/nanobsd/nanobsd.sh -c mynas.conf
USB メモリにイメージを書き込み
完成したイメージは普通に dd で書き込むことができる。
# dd if=/usr/obj/nanobsd.mynas/_.disk.full of=/dev/da2 bs=64k status=progress
書き込み完了したら、サーバに USB メモリを指して起動。無事ログインプロンプトが表示されて、root でログインできればビルド成功である。初期状態では root はパスワード無しに設定されているため、ログインプロンプトに root とだけ入力すればログインできるはずである。
システム設定
まずは root のパスワードを変更。
# sh change_password
次にホスト名、IPアドレスを設定。SSHDも自動起動にしておく。
# sysrc hostname="mynas"
# sysrc ifconfig_em0="inet 192.168.1.10 netmask 255.255.255.0"
# sysrc sshd_enable=YES
NanoBSD では設定ファイルは /root/save_cfg スクリプトを実行しないと保存されない。実は設定ファイル保存用のパーティションが別にあり、save_cfg スクリプトを実行するたびに別パーティションに保存される仕組みになっている。
save_cfg を実行したらここで再起動して、設定が正しく保存されていることを確認する。
# sh save_cfg
# reboot
ストレージの設定
GEOM Software RAID を使用して RAID 1+0 のアレイを構築する。
なお GEOM Mirror を GPT パーティションで使う場合は、必ずパーティションを切ってそのパーティションでミラーを作らなければならない。RAID がメタデータで使う領域と GPT が使用する領域が被っているため、パーティションを切らずにミラーを組むと corrupted などのエラーに苦しめられることになる。
# gpart create -s GPT ada0
# gpart create -s GPT ada1
# gpart create -s GPT ada2
# gpart create -s GPT ada3
# gpart add -t freebsd ada0
# gpart add -t freebsd ada1
# gpart add -t freebsd ada2
# gpart add -t freebsd ada3
# gmirror label pair0 ada0s1 ada1s1
# gmirror label pair1 ada2s1 ada3s1
# gpart create -s MBR mirror/pair0
# gpart create -s MBR mirror/pair1
# gpart add -t freebsd mirror/pair0
# gpart add -t freebsd mirror/pair1
# gstripe label storage0 mirror/pair0s1 mirror/pair1s1
# gpart create -s MBR stripe/storage0
RAID アレイができたらファイルシステムを作成する。ジャーナリングを有効にするため、gjournal で初期化する。
# gjournal label stripe/storage0s1
# newfs -J stripe/storage0s1.journal
ファイルシステムができたら /etc/fstab にマウントポイントの定義を記入する。
/dev/stripe/storage0s1.journal /mnt ufs 0 2
マウントできるかテスト。
# mount /mnt
Samba の設定
Windows から共有フォルダにアクセスできるように Samba の設定をする。
まず Samba に必要なディレクトリ一式を、上記で構築・マウントしたストレージ領域に作成する。
# mkdir -p /mnt/system/samba4
# mkdir -p /mnt/system/samba4/private
# mkdir -p /mnt/system/samba4/logs
# mkdir -p /mnt/share/pub
# mkdir -p /mnt/share/jsaito
Samba にアクセスするユーザは UNIX ユーザとして事前に登録する必要がある。adduser コマンドで追加する。
Samba は独自でパスワードを管理しているため、UNIX ユーザを追加したら pdbedit コマンドで Samba 側にもユーザを登録する。なお UNIX ユーザを作成せずに登録することはできない。
# adduser
# chown -R jsaito:jsaito /mnt/share/jsaito
# pdbedit -a jsaito
Samba の設定は /usr/local/etc/smb4.conf に置く。内容は以下の通り。
[global]
workgroup = WORKGROUP
server string = My NAS (FreeBSD)
passdb backend = tdbsam:/mnt/system/samba4/passdb.tdb
private directory = /mnt/system/samba4/private
lock directory = /mnt/system/samba4
state directory = /mnt/system/samba4
cache directory = /mnt/system/samba4
log file = /mnt/system/samba4/logs/%m.log
security = user
hosts allow = 192.168.1.
interfaces = 192.168.1.10/24
map to guest = Bad User
guest account = nobody
load printers = no
max log size = 50
dns proxy = no
unix charset = UTF-8
dos charset = CP932
create mask = 600
directory mask = 700
printing = bsd
[pub]
comment = Public share folder
path = /mnt/share/pub
browseable = yes
writable = yes
read only = no
guest ok = yes
[jsaito]
comment = jsaito private share folder
path = /mnt/share/jsaito
browseable = yes
writable = yes
read only = no
guest ok = no
valid users = jsaito
設定ファイルを置いたら以下で Samba を起動。
# sysrc samba_server_enable=YES
# service samba_server start
\\192.168.1.10\pub や \\192.168.1.10\jsaito にアクセスできたら成功である。
うまくいくことを確認したら忘れずに /root/save_cfg を実行すること。忘れると再起動したときにやり直しになってしまう。
# cd /root
# sh save_cfg
NanoBSD の更新(イメージの書き換え)
NanoBSD に新たにパッケージを追加したり、カーネルをカスタマイズするなどした場合は、ビルドしたときにできた _.disk.image ファイル書き込むことで、設定を失わずにアップデートすることができる。
NanoBSD はデフォルトでは2つのパーティションがあり、起動時に好きな方のパーティションで起動することができる(YAMAHAルータのCONFIG0、CONFIG1、に似てる)。
以下のコマンドを実行すると、パーティション2の方に新しいイメージを書き込むことができる。書き込み後再起動して、ブートローダの画面で F2 キーを押せば、パーティション2で起動できる。
# sh updatep2 < /mnt/share/nanobsd/_.disk.image
このようにしておけば、もし新しいイメージで起動に失敗しても、パーティション1の方で起動すれば回復できるというわけである。
参考
- https://docs.freebsd.org/en/articles/nanobsd/
- https://gist.github.com/click0/2b3da4e45e0011db2207621ee14add34
- http://uyota.asablo.jp/blog/2009/02/19/4129461
2 Replies to “NanoBSD で NAS を作る (FreeBSD 11.2)”