~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

Fuguita 5.1をamd64化してPCルータにした (あるいは4.9から5.1への移行)

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ではない)。

USBメモリブートについて

PCルータでは可動部をできるだけ減らすためハードディスクの代わりにUSBメモリを使うことがあります。 しかし、 http://www.openbsd.org/faq/faq14.html#flashmemPortable にもあるようにUSBメモリは品質のバラツキが激しいと言われています。 そのまま使うと24時間つけっぱなしによる断続的な書き込みに耐えられず、ファイルシステムが破損する ことがあります。

USBメモリブート後、メモリファイルシステムへ移行する

断続的な書き込みが行なわれているファイルを特定し、原因となるプログラムの設定変更もできます。 もっと効果的な手段はUSBメモリ後、ルートファイルシステムをメモリファイルシステム(mfs)に切り替える ことです。これにより、USBメモリへの書き込みは設定変更時の永続化時のみになり高寿命化が期待できます。

PCルータは1度設定すればほとんど設定変更もないためメモリファイルシステムと相性はよいと思います。

メリット
  • 1度ブートすればシャットダウン時の設定保存以外USBメモリへの書き込みが一切発生しない
  • メモリファイルシステムなので動作中の読み込み/書き込みはそこそこ速い(めちゃめちゃ速いわけではないようです)
デメリット
  • ログなどはシャットダウンすると消えてしまうため別途syslogサーバが必要
  • もともと実装メモリ容量が小さい場合は増設を検討する必要がある

FuguIta

FuguIta はOpenBSDのLiveCDディストリビューションの1つです。現在はi386版のみ配布されています。 今回は技術的興味もあり、amd64版で動くようにportしてみました。それが MyFuguita です。

今回はOpenBSDの標準ビルドシステム(/usr/src/distrib)に統合するすることでamd64へポートしました。 ビルドシステムへ載せることで、アーキテクチャ非依存の部分はISOイメージ作成部分に吸収できました。

FuguIta(およびMyFuguIta)のインスール方法などはそれぞれのページを参照してください。

port時の諸問題

つらつらと書きます。

  1. RAMDISK内のバイナリはcrunched binaryと呼ばれるものになっている

    1つのバイナリに複数のバイナリを埋め込み、ハードリンクを張る手法です。ディスク容量とinodeの節約のためと思われます。 (RAMDISKは埋め込められる容量に上限があるので重要な手法です)

  2. RAMDISKの/sbin/initはsingle-user mode用にビルドされている

    RAMDISK埋め込み時は /usr/src/distrib/special/init でビルドしたものを使っているようです。 ここでビルドする際はブート時のモードが single-user モード固定になっています。したがって、起動時 に自動的に /etc/rc は実行されません。これに気がつくまでかなり時間がかかりました。 (RAMDISK使用時、インストーラーは /.profile 経由で起動しているようです)

    MyFuguitaでは /usr/dest/sbin/init をコピーするようにしました。

  3. 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

  4. 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

シャットダウン時に自動的にUSBメモリへ永続化する

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

冗長化まであと1、2歩というところでの4.9 to 5.1

前回の記事 http://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名以外は前回の記事通りです。 今回はひとまず、筐体に問題が発生したら都度ケーブルを差し替える運用としました。

(おまけ)安価な3G回線によるバックアップ回線の構築

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以外にも考えることはあります。 例えば…

  1. PPPoE

    切り替えがおきたら、新masterで再接続する必要がある 旧masterでは再接続を止める必要がある。

  2. NAT

    pfsyncを使い、状態を同期する必要がある。 できれば専用の線がほしい。(たぶんVLANになるけど)

  1. gre

    切り替えがおきたら、新masterで再接続する必要がある (最悪、起動しっぱなしでもPPPoE再接続のタイミングで効果を発揮する)

  2. OpenVPN

    切り替えがおきたら、新masterで起動する必要がある (0.0.0.0で待ち受けて起動しっぱなしにしておいて、pfでPPPoEからのみにする手もある。)

  3. Quagga, Bird

    設定ファイルでは、I/Fにcarpを指定している。そのため、BACKUP状態では動かないはず。 検証が必要。

  4. 設定の同期

    2台のマシン間で設定を同期する必要がある。完全に一致するわけではないので工夫が必要。 USBメモリという特性上、ネットワーク越しにバックアップも取らなければならない。 (usbfadmでsync時にネットワーク越しにもrsyncできればよさそう)

更新履歴

  • 初稿 (Fri, 31 Aug 2012 23:01:13 +0900)