Posted on Fri Aug 31 23:01:13 +0900 2012 by nabeken
FuguitaはOpenBSDのLiveCDディストリビューションの1つです。 今回はFuguitaをOpenBSDのビルドシステムへ組込み、amd64でビルドしてみました。 その上で、OpenBSD 4.9からOpenBSD5.1へ移行しました(upgradeではない)。
PCルータでは可動部をできるだけ減らすためハードディスクの代わりにUSBメモリを使うことがあります。 しかし、 http://www.openbsd.org/faq/faq14.html#flashmemPortable にもあるようにUSBメモリは品質のバラツキが激しいと言われています。 そのまま使うと24時間つけっぱなしによる断続的な書き込みに耐えられず、ファイルシステムが破損する ことがあります。
断続的な書き込みが行なわれているファイルを特定し、原因となるプログラムの設定変更もできます。 もっと効果的な手段はUSBメモリ後、ルートファイルシステムをメモリファイルシステム(mfs)に切り替える ことです。これにより、USBメモリへの書き込みは設定変更時の永続化時のみになり高寿命化が期待できます。
PCルータは1度設定すればほとんど設定変更もないためメモリファイルシステムと相性はよいと思います。
FuguIta はOpenBSDのLiveCDディストリビューションの1つです。現在はi386版のみ配布されています。 今回は技術的興味もあり、amd64版で動くようにportしてみました。それが MyFuguita です。
今回はOpenBSDの標準ビルドシステム(/usr/src/distrib)に統合するすることでamd64へポートしました。 ビルドシステムへ載せることで、アーキテクチャ非依存の部分はISOイメージ作成部分に吸収できました。
FuguIta(およびMyFuguIta)のインスール方法などはそれぞれのページを参照してください。
つらつらと書きます。
RAMDISK内のバイナリはcrunched binaryと呼ばれるものになっている
1つのバイナリに複数のバイナリを埋め込み、ハードリンクを張る手法です。ディスク容量とinodeの節約のためと思われます。 (RAMDISKは埋め込められる容量に上限があるので重要な手法です)
RAMDISKの/sbin/initはsingle-user mode用にビルドされている
RAMDISK埋め込み時は /usr/src/distrib/special/init でビルドしたものを使っているようです。 ここでビルドする際はブート時のモードが single-user モード固定になっています。したがって、起動時 に自動的に /etc/rc は実行されません。これに気がつくまでかなり時間がかかりました。 (RAMDISK使用時、インストーラーは /.profile 経由で起動しているようです)
MyFuguitaでは /usr/dest/sbin/init をコピーするようにしました。
RAMDISKにどのファイルをコピーするか
RAMDISKにどのファイルをコピーするかはすべてリストで管理されています。 /usr/src/distrib/amd64/ramdisk_cd/list.local がその一例です。
MyFuguitaの主な成果物はこのリストファイルです。MyFuguitaでは共通リストはincludeせずに、 コピーしてカスタマイズしています。(special/initを使わない、など)
https://github.com/nabeken/myfuguita/blob/master/distrib/amd64/fuguita_cd/list
GENERICにいくつか足す
FuguItaは/dev/vnd5が必要なので数を増やしておく (vnd 6くらいに)
GENERICにはrd(RAMDISK)が含まれていないので入れておく(pseudo-device rd 1)
GENERICにRAMDISK埋め込み用の設定を入れておく
option RAMDISK_HOOKS option MINIROOTSIZE=4480 config bsd root on rd0a swap on rd0b and wd0b and sd0b
PPPoEを喋らせるので option PPPOE_TERM_UNKNOWN_SESSIONS も追加
最終的なconfigはgithubに置いてあります。MP用になっていませんが、適宜足せばできます。 このconfigはGENERICを埋め込んでいますが、本来はincludeした上で不必要なものを rmoption するほうがよいです。今後修正予定です。
https://github.com/nabeken/myfuguita/blob/master/sys/arch/amd64/conf/FUGUITA
FuguItaは /boottmp/usbfadm を使うことでメモリファイルシステム上のファイルをUSBメモリへ 永続化することができます。シャットダウン時に自動的に実行するようにしました。 (本来は設定変更時に明示的にやるほうがいいとは思うのですが…)
# cat /etc/rc.shutdown export PATH=$PATH:/usr/local/bin # rsyncは/usr/local/binにあるため、通しておく cat <<EOF | /boottmp/usbfadm # usbfadmは引数で制御できないっぽいのでやや強引に sync y q EOF
前回の記事 https://projects.tsuntsun.net/~nabeken/diary/OpenBSD/h61m-usb3-and-openbsd49.html からネットワークの構成変更を実施し、VLANによる論理分割を実施しました。今後を考え、2物理NICでも 対応できるようにtrunk接続し、VLANを切るようにしました。
gw0は物理NICが3つあるので、ONU向け、サーバ側、クライアント側で3つ。gw1は物理NICが2つしかないので、 ONU向けに1物理NIC、サーバ側とクライアント側は1物理NICからVLANで切り出しました。
これでようやく、gw0, gw1の冗長構成に…と言いたかったのですが、carp, pfsync, サービス切り替えの 検証ができず、また次回となりそうです。
gw1の物理構成図:
-------------- The Internet -------------- | | (pppoe0 on re0) | | | | | +-----+ | | | gw1 |-----[vlan103/re1]-------| +-------+ | +-----+ |--------| rt57i |--------| クライアント | | +-------+ | | (vlan101/re1) | | | ------------- サーバ
vlan101側をcarp0、vlan103側をcarp1にして構成します。carp周りの設定はI/F名以外は前回の記事通りです。 今回はひとまず、筐体に問題が発生したら都度ケーブルを差し替える運用としました。
PCルータ更新に合わせて、3G回線による安価(月額980円)なバックアップ回線を用意しました。 何かあったとき、新幹線代が往復3万以上なことを考えると十分元は取れます。 (もともとDebianを入れたThinkpadにデータカードを刺してイオンSIMで運用していましたが、今回から OpenBSD箱から直接バックアップ回線に流せるようにしました)
最近はIIJやDTIからも安価な3Gサービスがでていますが、今回はbmobileがイオン限定で販売している イオンSIM にSIMフリーのモバイルWiFiルーターを組合せて安上がりなリモートメンテナンス環境を作りました。
データカードを直接刺す場合、バックアップ回線の恩恵を受けられるのは同時に1台です(ルーティングとか考えない場合)。 丁度、以前購入したSIMフリーなモバイルWiFiルーター bmobile WiFi が余っていたのと、 USBの無線LANアダプタ GW-USNano2 が870円で、かつOpenBSDでも問題なく動くことがわかったので急遽OpenBSD + urtwn(8)で構成しました (GW-USNano2は2つ購入し、gw0とgw1に装着)。
urtwn0 at uhub0 port 1 "Planex Communications Inc. GW-USNano2" rev 2.00/2.00 addr 3 urtwn0: MAC/BB RTL8188CUS, RF 6052 1T1R, address 00:XX:XX:YY:ZZ:XX
(おまけ:GW-USNano2-GはUSNano2と同じです。パッケージだけ異なるようです。)
端末に払い出されるIPアドレスはプライベートIPアドレスです。さくらのVPS上のOpenVPNに接続し、 外部からのバックアップ回線経由のIPv6到達性を用意しました。
gw1のネットワーク構成図:
------------------------------------------------------------------------------------------- The Internet ------------------------------------------------------------------------------------------- | | | | (OpenVPN) | | | | | +---------+ | | bm WiFi | (pppoe0 on re0) | | +---------+ | | | | +-----+ | | [urtwn0]----| gw1 |-----[vlan103/re1]-------| +-------+ | +-----+ |--------| rt57i |--------| クライアント | | +-------+ | | (vlan101/re1) | | | ------------- サーバ
VPNサーバ(X.X.X.X)への通信だけbmobile WiFi(Y.Y.Y.Y)を経由させます。
# route add -host X.X.X.X Y.Y.Y.Y
今後はリモートからgw0/gw1を切り替えながら作業することが可能になります。 回線障害時にも威力を発揮してくれると期待しています。
L3的にはcarpで冗長化ができます。しかし、L3以外にも考えることはあります。 例えば…
PPPoE
切り替えがおきたら、新masterで再接続する必要がある 旧masterでは再接続を止める必要がある。
NAT
pfsyncを使い、状態を同期する必要がある。 できれば専用の線がほしい。(たぶんVLANになるけど)
gre
切り替えがおきたら、新masterで再接続する必要がある (最悪、起動しっぱなしでもPPPoE再接続のタイミングで効果を発揮する)
OpenVPN
切り替えがおきたら、新masterで起動する必要がある (0.0.0.0で待ち受けて起動しっぱなしにしておいて、pfでPPPoEからのみにする手もある。)
Quagga, Bird
設定ファイルでは、I/Fにcarpを指定している。そのため、BACKUP状態では動かないはず。 検証が必要。
設定の同期
2台のマシン間で設定を同期する必要がある。完全に一致するわけではないので工夫が必要。 USBメモリという特性上、ネットワーク越しにバックアップも取らなければならない。 (usbfadmでsync時にネットワーク越しにもrsyncできればよさそう)