Running Debian on ERLite-3 (JP)

この記事はRunning Debian on ERLite-3 (EN)の翻訳と補足である。[2015/05/12更新]

ERLite-3

EdgeRouter LiteでひたすらDebian/MIPSを動かし続ける趣味のページ。

バイナリ

はじめに

MIPS実機の入手性は年々低くなっており、教育機関ではシミュレータで代用されることもしばしばである。そこで紹介したいのがこのERLite-3(EdgeRouter Lite-3)。わずか100ドルという低価格で、2コアのMIPS64プロセッサ、Cavium OCTEON CN5020を搭載している。

OCTEONというと聞いたことがないかもしれないが、日本でもYAMAHA RTX1200にCN5010が採用されており実績がある。最近ではLinuxカーネルのメインラインにOCTEONサポートが取り込まれ、3.11からは特にパッチを必要とせずに動作する。

ERLite-3のソフトウェアであるEdgeOSはVyattaをベースとしており、apt-getでDebian squeezeのパッケージを利用可能であるという利点がある。ところが、実際に使ってみるとわかる事柄として、

  • 付属のUSBメモリが遅い (後で気づくが、USB1.1相当の転送速度らしい)
  • USBポートに癖があり、付属品以外のUSBデバイスを利用できない (ごく少数動くUSBメモリが報告されている)
  • NFSを利用したいが、付属カーネルはNFSやFUSEが無効である
  • EdgeOSのまま利用するとユーザubntを無効にできない (公開ホストとして問題)

といった、ルータとして利用する上では問題ないが、MIPSボードとして利用する上での制約がある。このため、NFSとFUSEを有効にした最新のカーネルをビルドすることにした。また、USBの問題に関しても調査を行って、簡単な回避策をとった。これらの情報を共有するため、まとまりはないがこのページに残しておく。

USBブート

次の手順でUSBメモリの内容を置き換える。vmlinuxとrootfsはこのページの先頭にある。

  • USBメモリのFATパーティションにあるカーネルvmlinux.64を差し替える
  • USBメモリのExt3パーティションにあるファイルを削除し、rootfsを展開する(※suで)
  • 注意: USBメモリをアンマウントする際に念のためsyncする。数分待たされる。

NFSROOT (DHCP+TFTP+NFS diskless)

ERLite-3にはブートローダのu-bootが搭載されており、TFTPを用いてネットワーク経由でカーネルをロードできる。DHCP+TFTP+NFSという構成は定番なので、 nfsroot, dhcpd, tftpd などのキーワードで検索すれば詳細な情報が得られる。

NFSサーバとなるマシンがDebian や Ubuntu であれば、次のパッケージをインストールして設定すればよい。

  • isc-dhcp-server (u-bootの設定によっては必要ない)
  • nfs-kernel-server (rootfsを提供するために使う)
  • tftpd (カーネルをネットワーク経由でロードするために使う)

u-bootコンソールの操作

ブートローダを操作することで、USBメモリやTFTPサーバから自由にカーネルをロードすることができる。

  • Cisco互換RJ45コンソールケーブル(500円くらい) 115200bps 8N1の設定
  • 下記の表示のタイミングでCtrl-Cを送信する
USB: (port 0)
  • 自動起動がキャンセルされ、u-bootのプロンプトに落ちる
Octeon ubnt_e100#
  • USBメモリからカーネルをロードする場合
# fatload usb 0 $loadaddr vmlinux.64
# bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw single
  • dhcp + tftp + nfsrootでカーネルをロードする場合
# dhcp
# tftpboot $loadaddr vmlinux
# bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp single
  • シングルユーザでの設定を終えた後、自動起動を設定するには、下記のようにbootcmdを保存する
# setenv bootcmd 'dhcp;tftpboot $loadaddr vmlinux;bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp'
# saveenv
  • なお、DHCPサーバはなくてもよい。その場合、TFTPサーバと通信するために下記のようなIPアドレスの設定と、rootパスの設定を行う。
# setenv serverip x.x.x.x
# setenv ipaddr y.y.y.y
# tftpboot $loadaddr vmlinux
# bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=y.y.y.y::gateway:mask:edge:eth0:off nfsroot=x.x.x.x:/nfsroot/,tcp,vers=3
  • もし出荷時の設定に戻したければ、下記のコマンドを実行する
# setenv bootcmd 'bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw rootsqimg=squashfs.img rootsqwdir=w mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)'
# saveenv

USBポートの問題

付属のUSBメモリ以外のUSBデバイスを接続するとI/Oエラーが発生して利用できないことが知られている。この現象はブートローダの段階から発生し、カーネル起動後でも直ることがない。

試行錯誤しているうちにわかったことは、

  1. USB1.1ハブを挟むとUSBデバイスが正常動作する。ただしUSB1.1で。 [これを利用]
  2. lsusb -vの結果、full speedしかサポートしていないように見える
  3. そもそも製品の仕様としてUSBの記述がなく、2GB Flashとなっている

以上のことから、少なくともUbiquiti社は、このボードでUSB2.0を利用できるとは考えていないようである。また、USB1.1ハブさえ入手できれば、USB1.1モードでUSBポートを利用できることがわかった。

入手性のよろしくないUSB1.1ハブであるが、手元にない場合は、USBキーボードについているハブや、KVMスイッチのUSB切り替え器などがUSB1.1専用である可能性があり、試してみるとよいかもしれない。

この問題の原因がOCTEONのチップにあるのか、プリント基板の配線にあるのか、はたまたLinuxのドライバにあるのか、まだわからないが、部分的な回避策は以上である。一言で言うと、ダメな子ほどかわいい

DSC_0012

USB1.1ハブを取り付けられたERLite-3の図。裏側にニッパーで穴を開けてケーブルを通した。

USBメモリの入手

その後、 https://wiki.gentoo.org/wiki/MIPS/ERLite-3 の情報により、Sandisk Cruzer FitというUSBメモリがそのまま利用可能であるということがわかった。

最新カーネルでのUSBの問題

最新のLinuxカーネルでは”parent hub has no TT“というUSB関連のエラーが発生する。これに対するworkaroundはこちらの英文ページに書いた。

時刻の設定

  • ntpでntp.nict.jpに合わせるなどする

運用実績

安定性を確認するため、付属のUSBメモリをDebianに書き換えて、SSHゲートウェイとして実際に運用している。今のところ問題なく動作しており、消費電力は7Wから8W程度である。

どこで買えるの?

アメリカのamazon.comにはたくさん取り扱いがあるが、日本には発送してくれない。参考までに私が購入したショップを紹介する。

  • ttp://import.buy.com/ja/product/252512866/
  • 個人輸入なので自己責任で!

楽天アカウントで決済可能で、到着までは15日だった。ebayで購入するのと同じくらいの覚悟は必要だと思われる。このほかに実際に入手できたショップをご存じの方は、コメント欄で教えていただければ幸いである。

余談

Cavium社のOCTEONプロセッサは、cnMIPSという独自の実装を元に、ルータ用のマルチコアプロセッサとして発展してきた。[1][2][3] 一方、他の半導体ベンダは、MIPS Technologies社の24KのようなIPコアを利用してSoCを製造している。両者はまったく別の実装であるものの、Cavium社がMIPS Technologies社からMIPS64 ISAのライセンスを受けることで、ISAレベルでの互換性を保っている。

Cavium社の独自仕様については、OCTEON Executiveというハードウェア抽象化レイヤのライブラリを用意することで、様々なOSへの移植を容易にしている。これは位置付けと名前がWindows NTのExecutiveというレイヤに似ている。OCTEON Executiveの一部のソースコードは、FreeBSDやLinuxにマージされている。より詳しく知りたい場合、cnusers.orgに情報がある。

伝統的にMIPSと名の付くプロセッサでは、パイプラインの外側にある割り込み等の処理を、まるごと「コプロセッサ0」という形骸化した部分に押しつけて設計してきた。この部分の仕様は歴代のプロセッサで変遷しており、Cavium社による実装もまた別物らしい。例えばOpenBSDをOCTEONに移植する際には、このように違って見えたそうだ。

他のMIPS系SoCで入手性のそこそこよいものとして、「ARMじゃない」Androidとして一部で有名なIngenicのJZシリーズがある。他にも、AtherosのSoCを使ったWi-Fiルータがあり、入手性はそこそこよい反面、技適マークの問題がある。あと、SoCではなくプロセッサと言うべきだが、RMSのマシンとして知る人ぞ知るLemote YeeloongのLoongsonがある。

最後に、本稿ではあまり触れなかったが、出荷時に搭載されているEdgeOSは十分に実用的で魅力的なシステムである。本来のルータとしての用途では、EdgeOSの利用を勧めたい。

参考書籍

  • マイクロプロセッサ・アーキテクチャ入門, 中森 章 著

Computer Organization and Design”だけだともやもやするところ、例えば、キャッシュメモリが非同期式でなく同期式のとき、パイプラインの構成はどうなるのか?、といった現実的な問題に対して、わかりやすく答えを用意している本。

  • See MIPS Run, Second Edition, Dominic Sweetman著

MIPSにおける割り込みや特権命令の動作を知りたいときに読むとよい。組み込み系エンジニアや、カーネルのプログラマにとって有益なリファレンスである。

コメントを残す

メールアドレスが公開されることはありません。

*