2015年3月24日火曜日

EdgeRouterLite-3をGentooで運用しはじめました+IPv6導入(OS環境構築篇)

先日,@syuu1228先生からEdgeRouterLite-3を頂く機会があったので,
自宅のネットワークを全面的に直しました.

EdgeRouterLiteとは

RJ45ポートは左から,コンソール,eth0,eth1,eth2.右横にUSBポート.

Ubiquiti社の製品,EdgeRouterシリーズの下位モデル.EdgeRouterLite-3はギガビットポートを3つ持つルーターで,この3つの使い道は特に限定されてません.
2ポートをブリッジしてWAN+LANなよくあるBBルーターでも良し,1WAN2LANなルーターでも良いし,2WANにしてロードバランスとか冗長化するのも良いかもしれません.

性能としては,OCTEONのMIPS64 500MHzのデュアルコアに,DDR2メモリが512MBと,
結構高性能です.ハードウェアスペックだけを見れば,定価10万円くらいのYAMAHA RTX1200以上の性能が出ると噂です.ポートが少ないですが…….価格はUS$100とかなりお手軽,ただし日本だと代理店が無いので
楽天から買うと2万円ぐらいになるかもしれません.

詳しくはInternetWatchのこのレビューがわかりやすいでしょう.
どっちでAzureにつなぐか? Ubiquiti Networks「EdgeRouter LITE(ERLite-3)」を試す

個人的には公式のプロダクトのページのCiscoに喧嘩売りにいってるプロモーションビデオが素敵で好きです.

環境構築

EdgeRouterLiteにGentoo入れました.
IPv6をどうしたか,が気になるかたはつづきの記事を読んで,この記事の残りはすっ飛ばして良いです.

参考リンク: MIPS/ERLite-3 Gentoo Wiki

EdgeRouterLiteはu-bootが収められてるNORメモリと,OSが収められてるUSBフラッシュメモリなストレージデバイスの2つの記憶領域を持っています.
後者はデフォルトだと2GBのものがボード上のUSBポートに挿してあり,EdgeOSというVytta,VyOSベースのOSがインストールされています.

これを別の,Gentooをインストールした大容量のUSBフラッシュメモリに挿し替えました.


私はこれを買いましたが,べつにこれでなくとも良いと思います.
Gentoo Wikiにて,いくつか動作確認済みのUSBメモリが記載されています.
が,スペースが限られるので,あんまり適当なのだと挿さらない可能性が高いです.

それでは肝心の構築の手順です.

ストレージ環境構築

まず,このフラッシュメモリデバイスはいきなりERLiteに挿さず,なにかしらのLinuxマシンに挿して,作業を行ないます.
まずはフォーマット.

fdiskをするまえに,Gentoo Wikiの情報によると元のディスクの先頭2048ブロックはバイナリが書き込んであるようなので,元のディスクから,
# dd if=/dev/sdb of=/dev/sdc bs=2048 count=1
とその部分を新たなディスクにコピーします.
本当は,先頭80ブロックに8086バイナリが入ってて,その後0x01BEからパーティションテーブルが始まってて,パーティションテーブルの後ろはzero fillされてるだけなので,よくわからないです.が,u-bootが決め打ちで最初のパーティションのアドレス読みに行く可能性高いですし,ここは何も考えず元のディスク通りにする事に.

先頭80ブロックのバイナリは http://www2.onlinedisassembler.com/odaweb/CfbHic/0#view/tab-assembly/offset/00000000 で,RaspberryPiのSDにもこれが書き込まれるようですのでもし興味ある方居れば調べると良いかも.

後にfdiskを行ないます.今回は元ディスクのパーティション構成をそのまま参考に,/bootと/を作ります.また,それに追加してswapも作成しました.swapを作らねばgccのemergeに失敗します.
1K-blocksで表記して,順番に,

/dev/sda1     140805 blocks (/boot)
/dev/sda2 28441604 blocks (/)
/dev/sda3                     残り (swap)

という風にパーティションを切り,/bootをext2,/をext4にしました.
/bootは,u-bootが読めるのがfat32かext2なので注意./については,カーネルにFSのモジュールが組み込んであればなんでも良いです.
私はbtrfsにしようとしたところ,なぜかマウントできなくなったりする現象が発生したので,止めました.

Stage3 tarball

フォーマットが終わったら,/にするパーティションを,/mnt/ERLiteにmountしたものとして作業を進めます.
http://distfiles.gentoo.org/experimental/mips/stages/mips64r2/2014/stage3-mips64r2_multilib-20140904.tar.bz2
からstage3のtarballと,
http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
からportage treeのtarballをDLし,どちらもを/mnt/ERLiteに展開します.
# tar xvf stage3*.tar.bz2 -C /mnt/ERLite
# tar xvf portage-latest.tar.bz2 -C /mnt/ERLite/usr

Linux kernel

仕上げにカーネルを準備します./bootにするパーティションを/mnt/ERLite-kernelにmountしたもとのします.
まず,MIPS64のクロスコンパイラを用意しましょう.mips*elと,末尾にelが付くものはリトルエンディアン用なので使えません.Gentoo Linuxなら,
# emerge crossdev && crosdev -t mips64-unknow-linux-gnu
とするだけです.
ArchLinuxならば,
$ yaourt -S cross-mips64-linux-gnu-gcc
とすればインストールできます.(できるようになりました)
Archのほうはこれでインストールできなかったら私ががんばってPKGBUILD修正します.

次にビルド.
https://github.com/xypron/kernel-edgerouter/tree/master/config 
こちらにERLite用にコンフィグを作っている方が居られるので,これをそのまま使わせてもらいましょう.
つまり,
# wget https://raw.githubusercontent.com/xypron/kernel-edgerouter/master/config/config-3.18
# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.9.tar.xz
# tar xvf linux-3.18.9.tar.xz
# cp config-3.18 linux-3.18.9/.config
# cd linux-3.18.9
# ARCH=mips CROSS_COMPILE=mips64-unknown-linux-gnu- make
# ARCH=mips CROSS_COMPILE=mips64-unknown-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/ERLite-kernel
# cp vmlinux /mnt/ERLite-kernel/vmlinux.64
# md5sum vmlinux > /mnt/ERLite-kernel/vmlinux.64.md5
これでインストール完了です. ArchLinuxで,上記のようにyaourtでgccを作成していた場合は,CROSS_COMPILEにmips64-unknown-linux-gnu-ではなく,mips64-linux-gnu-を指定する必要があります.

ただし,GCCとカーネルの準備はやや面倒です.
そこで,私の環境で使ってるビルド済みのカーネル(3.18.9)をここに置いておきます.
https://drive.google.com/file/d/0BwiUnMv7MhiJQ0lBRklXRktndEE/view?usp=sharing
これを,/にするパーティションを/mnt/ERLiteに,/bootにするパーティションを/mnt/ERLite/bootにmountした上で,
# tar xvf erlite-3-kernel.tar.bz2 -C /mnt/ERLite
とすればカーネル導入のための一切が省略できるかとおもいます.

システムコンフィグ

Gentoo Wikiには記載ありませんが,stage3を展開した後に,/etc/fstabを自分のパーティションに合わせたり,/etc/conf.d/以下に自分の好みでキーマップや環境変数を変更するといった,若干のシステムコンフィグをしておきましょう.
/etc/inittabでシリアルコンソールの設定もしておきましょう.

ブートローダー

ではブートローダーです.u-bootの設定を変更するために,RJ45な端子を持つシリアルコンソールケーブルが必要です.


既にUSB to RS-232Cなケーブルを持ってる人は,ノーブランドで300円ぐらいのRJ45 to RS-232CもAmazonにありますが,私はそれをポチったらシンガポールからの発送になり一ヶ月くらい待つハメになりました.オススメしません.
そして,これをPCに接続し,minicom等を用いてシリアルコンソールを開きます.
ERLite-3からUSBフラッシュメモリは外して置いてください.

シリアルの設定は,ボーレートが115200,データが8bit,ストップビットが1bit,パリティビットは無し.フロー制御もソフトウェア/ハードウェアどちらも無し.

そして電源を入れるとシリアルにu-bootのプロンプトが表示されるので,
> setenv bootcmd "ext2load usb 0 $loadaddr vmlinux.64;bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom) net.ifnames=0 console=ttyS0,115200 panic=5"
> saveenv
としましょう.u-bootの操作はうっかりするとERLite-3が文鎮化する可能性があるのでお気をつけ下さい.
また,このbootcmdの最初に指定されてるext2loadは,/bootがfat32ならfatloadに,ext2ならext2loadにしましょう.ただ,体感的にはfatloadのほうが動作が速く感じました.

OS環境構築終了

ひとまずこれでGentoo環境は構築完了です.あとは,nano以外を使う方は好みのエディタをインストールしたりすると良いでしょう.また,とりあえずsshdを入れて適当にIPアドレスの設定だけはしておくとコンソールケーブルに繋げなくて良くなるので便利です.ここから,ルーターを構築します.

つづき