このサーバーなんですが、4年間、頑張ってきた ソケットAM1な、Sempron 3850 + AM1M-S2H を引退させました。
AM1M-S2H の最後の雄姿 (ほこりまみれ)
引導を渡したのは、RaspberryPI 4 8GB です。
とうとう、x86からarmにしてしまいました。
色々、不安がありましたが、他の RaspberryPI で、FreeBSDを使ってみると安定していたので、決断しました。
最大の魅力は、消費電力の差ですね。
AM1M-S2H + Sempron 3850
RaspberryPI 4
20Wから5W に落ちてくれました。地球に優しいよね
SSDを1つ追加しても、6Wぐらいですかね。
最大の目標である省電力化が簡単に達成でき、とても満足です。
x86アーキテクチャだと、どうしてもマザーボードだけで、10Wぐらい消費してしまうし、電源のロスも大きかったですからね。
どうやっても、10W未満なんて到達できませんでした。
しかも、ZFSを使って、ミラー構成にしようものなら、なかなか安定的にそこそこ性能なものが構築出来ませんよ。
サーバーの要件しては、ストレージの二重化だけは外せなかったです。
RaspberryPI 4は、USB3.0 が実装されて、LAN が Gigaとなりました。
これで、普通にNASとしての機能が整ったといった所です。
しかも、8GBモデルがあるそうな
ZFSを使う場合、4GBでも寂しい状況なので、これは朗報です。
ということで、RaspberryPI 4 が、発売されてから目を付けていたのですが、FreeBSDで、安定動作するかわかりませんでした。
情報を追いかけていると、8GBモデルでも起動可能になったということで、テストがてら入手しました。
しかーし、実際にセットアップしてみると、なんとHDMIにコンソール出力出来ないではありませんか。
と思ったのですが、逆側のHDMI端子だったようでした
直接、コンソール入出力は面倒くさいので、ネット接続出来るようにしてしまいましょう。
ルートをZFSにしてやろうと試みたのですが、ブートログを確認するとルートマウントしてから 外付けUSBが認識されていました。
ということは、USBストレージからZFSブート出来ないと想像されます
SDカードをZFSにすりゃー良いのでしょうけど、なんかあったらわけわからんな状況になるので、今回は断念しました。
ということで、ルートは、UFSで、大事な箇所だけUSBストレージなZFSで行くことにしました
この辺りは、また、今度、調査していきます。
多少の誤算がありましたが、目論んでいることが出来そうなので、頑張ってシステムを構築していきましょう。
今回のお話は、FreeBSD 13.0 arm64 となります。
まずは、USBでSSDを接続するのですが、アマゾンから良き物を漁りましょう。
選んだ物は、これです。
Yottamaster HDDケース USB3.1 GEN-1 USB-C接続
USB-Cで接続するとか、かっこ良いですよね どうでも良いことですけど
パッケージには、A変換ケーブルが入っているので、問題無しでした。
こいつを2つ買って、USB3.0端子に差し込めば、ミラー化出来ます。
SSDは、適当に手持ちのやつを用意して下さい。
da0とda1を適当にzfs化してやります。
gpart destroy -F da0
gpart create -s GPT da0
gpart add -t freebsd-zfs -l pisys0 -s 110G da0
zpool create tank gpt/pisys0
gpart destroy -F da1
gpart create -s GPT da1
gpart add -t freebsd-zfs -l pisys1 -s 110G da0
zpool attach tank gpt/pisys0 gpt/pisys1
zpool status で、tankが存在すれば成功です。
起動時にzpool.cacheを作っておかないとマウントしないのですが、作ってもマウントしませんでした。
たぶん、USBストレージの認識するシーケンスの問題でしょう。
ということで、強制的に認識させるスクリプトをしかけておきます。
/etc/rc.local
#!/bin/sh
# Try to mount the ZFS USB filesystems at boot time
done="no"
for i in 1 2
do if [ -c "/dev/da0" -a $done = "no" ]
then logger "Mounting the ZFS stuff"
zpool import -a
done="yes"; break
else
logger "Waiting for /dev/da0"; sleep 30
fi
done
これで、起動時にマウントします。
/tmp が小さいので、消しちゃうか、でかくしときましょう
/etc/fstab
tmpfs /tmp tmpfs rw,mode=1777,size=1024m 0 0
とりあえず、これだけやれば、普通に使えるはずです。
なんとか、普通に使える状態になったので、パッケージを導入していったのですが、やはりamd64環境とは異なり、armならではの問題にぶつかることがありました。
Redmineのセットアップ中
リンクエラーが発生
armは、dtraceがリンク出来ないらしので、環境変数に以下をセットします。
setenv RUBY_CONFIGURE_OPTS "--disable-dtrace"
sqlite3用のモジュールが構築失敗しました。
sqlite3のincludeとlibの場所を明示してあげないといけなくなっていたので、bundlerの失敗後、単独でセットアップを行いましょう。
gem install sqlite3 -v '1.4.2' --source 'https://rubygems.org/' -- --with-sqlite3-include=/usr/local/include --with-sqlite3-lib=/usr/local/lib
PHP74のセットアップ中
最初、portsで構築していたのですが、依存関係で詰んだので、pkgに変更しました。
zlibが必要だったので、以下にてインストールすると、良い感じでセットアップ出来ました。
pkg install php74-zlib
MariaDBを使う必要があったので、php74-pdo_mysqlをpkgでインストールしたのですが、接続出来ませんでした。
pkg版のphp74は、native接続されないようで、このオプション不一致から接続出来ないようです。
なので、portsからセットアップします。
/usr/ports/databases/php74-pdo_mysql
/usr/ports/databases/php74-mysqli
make config にて、mysql native オプションを外してビルドして下さい。
make
make install
そんなこんなで、中の上ぐらいの成功を果たした勇姿です。
ウルトラ コンパクト かつ 省エネ マシンになりました
最後に
RaspberryPI 4 の発熱問題ですが、マジでやばいです。
ちょっと、舐めていました
ちょっとしたヒートシンクだけで良いだろうと、小さいヒートシンクをチップに載せてmakeとかしていたら、熱暴走らしい症状が連発しました。
これは、やばいということで、でかいヒートシンク(アルミヒートシンクケース)を購入したのですが、これでも足りない状況でした。
ビルド中に全コアが100%になることが多いので、結局、ヒートシンクが熱々になり逃がす熱量を上回る発熱が発生しているようでした。
以下にて、CPU温度が測れます。
sysctl -a | grep temperature
最終的に、ヒートシンク上に小型FANを装着(両面テープにて)してなんとか凌げたのですが、最初からそれなりの対策をしておいた方が良いですよ。 まじで
ルートシステムは、SDということで、安いSDを使いました。バックアップも安いのを買って、ddでコピーしとけば良いかな
不具合
出来上がったシステムですが、一点だけ問題があります。
なぜか、USB SSDを2つ接続している状態だとブード出来ません。
1つだけ接続すると問題無く起動するので、ブートしてルートマウントしてからUSB接続するようにしています。
ブート成功時
ブート失敗時は、usb mass storageのスキャン中に deviceの追加に失敗しているようです。
これが原因で、次の起動方法に移行している感じですね