作成者別アーカイブ: tabata

OCTEON Linux Kernel Build How To

This is just a memorandum of my personal instructions to cross-build linux kernel for EdgeRouter Lite (ERLite-3).  I’ve been using ERLite-3 with the latest Linux kernels for three years.  The user land distribution I use is Debian.  It works quite well for my usage of PPPoE router at home.

The important thing is to set BFD target name “mips64-unknown-linux-gnu”.

Buinding cross binutils

$ cd binutils-x.y.z
$ mkdir build
$ cd build
$ ../configure --target=mips64-unknown-linux-gnu --prefix=/opt
$ make
$ sudo make install

Building gcc

$ cd gcc-x.y.z
$ mkdir build
$ cd build
$ ../configure --target=mips64-unknown-linux-gnu --prefix=/opt --enable-languages=c --with-float=soft --disable-threads --without-ppl --without-cloog --disable-nls --disable-plugin --disable-shared --disable-tls --disable-sjlj-exceptions --disable-libssp --disable-libmudflap --disable-libgomp --disable-libquadmath --disable-libstdc__-v3 --disable-libitm
$ make
$ sudo make install

Building Linux kernel

# cd /src/linux-3.18.9
# export ARCH=mips
# export CROSS_COMPILE=mips64-unknown-linux-gnu-
# cp ../linux-3.14.1/.config .
# make oldconfig
# make
# make modules_install INSTALL_MOD_PATH=/nfsroot
# mips64-unknown-linux-gnu-strip vmlinux

Kernel Config

Here is my kernel configuration for Linux 4.2. I hope it helps you.

ConnectBotで日本語の記号が半角になる問題の対応

ConnectBotで日本語の記号が半角になる問題の対応

いわゆるEast Asian Ambiguous Width Charactersの問題。私の場合、EmacsでSKKを使用するため、”▼”が全角でないとターミナルの表示が崩れて使い物になりません。そこで、簡単に修正できそうだったので、対応してみました。

ソースの差分

変更の概要は、接続先ホストごとの設定に、「記号の全角化」というチェックボックスを追加したことです。英語環境だと”East Asian Wide Width”という項目になります。

注意点として、AndroidマーケットからインストールしたConnectBotを予め削除しておかないと、設定項目の数の違い(SQLiteのテーブル定義の違い)から、アプリケーションを起動できません。本家ConnectBotではバージョン番号を考慮してテーブルを拡張するようになっていますが、本サイトの改変版ではそのようなテーブルの拡張は行っていないからです。

動かない、動作がおかしいなどのフィードバックをいただければ修正いたします。また、Androidのこのバージョンで動いた、という動作報告もいただければうれしいです。

余談ですが、自分用のビルドではこちらを参考にしてフォントを埋め込んでいます。

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

Running Debian on ERLite-3

Updated: 25 Oct 2015

ERLite-3

EdgeRouer Lite (ERLite-3), Cavium OCTEON SoC
MIPS64 500MHz 2-core

Binaries for Debian

These kernels are for both NFS boot and USB boot. The supported file systems are ext3, ext4, fuse and nfsroot.

Serial Console Setup

  1. Plug off the power cable.
  2. Setup your CISCO console cable.
  3. Open serial terminal such as minicom. The serial configuration is 115200bps 8N1. Don’t forget turning off HW/SW flow controls.
  4. Plug in the power cable. Then the boot loader will put messages.
  5. Send Control-C to hook the boot loader. Then you’ll see the prompt:
Octeon ubnt_e100# 

USB Stick Setup

Prior to USB boot, you have to do following steps. If you don’t want to use USB boot, please ignore this section.

  • Detach the USB stick from ERLite3.
  • Mount the USB stick on your PC. You’ll see two partitions. The first one is FAT and the second one is ext3.
  • On the first partition, replace the Linux kernel file “vmlinux.64” with new version.
  • On the second partition, erase all existing files, then extract debian rootfs.

USB Boot (single user mode)

Go to the serial console and type:

fatload usb 0 $loadaddr vmlinux.64
bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw single

You’ll see the debian init process in your serial console. Initially, password for root is blank. After creating users, you can remove “single” keyword from the boot command line.

Network Boot (single user mode)

Prior to network boot, you have to setup tftp server, NFS server and optionally DHCP server.

If you use dhcp server,

dhcp
tftpboot $loadaddr vmlinux
bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp single

Or manually, [192.168.1.1 is gw, 192.168.1.2 is tftp/nfs server, 192.168.3 is ERLite-3]

setenv serverip 192.168.1.2
setenv ipaddr 192.168.1.3
tftpboot $loadaddr vmlinux
bootoctlinux $loadaddr coremask=0x3 ip=192.168.1.3::192.168.1.1:255.255.255.0:edge:eth0:off root=/dev/nfs rw nfsroot=192.168.1.2:/nfsroot/,tcp,vers=3 single

Saving Boot Settings

After confirming boot process, you can save your favorite boot command lines.

setenv bootcmd 'dhcp;tftpboot $loadaddr vmlinux;bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp'
saveenv
printenv
reset 

Restoring Boot Settings

You can restore boot command lines with the initial value.

setenv bootcmd 'fatload usb 0 $loadaddr vmlinux.64;bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw'
saveenv
printenv
reset

Avoiding USB Problem 1

Even on official 2.6.32-UBNT kernel, you probably get many errors with any USB devices except the flash memory which comes from the board. I found that using USB1.1 HUB avoids this problem.

Actually, 2.6.32.13-UBNT is configured without CONFIG_USB_EHCI_HCD. In other words, that kernel doesn’t have USB2.0 functionality though chip supports it. [see discussion]

I guess ERLite-3 board has electric problem to support high transfer speed. For me, some CAT5e flat cables are not capable to support 1000Mbps link with ERLite-3. This suggests ERLite-3 is electrically noisy.

Avoiding USB Problem 2

In addition, you’ll get “parent hub has no TT’” errors in kernel 3.11+. Here is a one-line workaround for this problem:

*** ./drivers/staging/octeon-usb/octeon-hcd.c.orig
 --- ./drivers/staging/octeon-usb/octeon-hcd.c
 ***************
 *** 696,699 ****
 --- 696,700 ----
         }
         hcd->uses_new_polling = 1;
 +       hcd->has_tt = 1;
         priv = (struct octeon_hcd *)hcd->hcd_priv;

I’m not sure whether the device really has TT, but it works with USB devices.

For more information, see http://www.serverphorums.com/read.php?12,274616

USB Extension Example

DSC_0012My ERLite-3 has now USB1.1 hub! I punched a hole on the box. Don’t worry, I have another ERLite-3.

Suitable USB Stick

As Gentoo people says, Sandisk Cruzer Fit 16GB works for me. It costs less than $10.

Bus 001 Device 002: ID 0781:5571 SanDisk Corp. Cruzer Fit

Toolchain for Kernel

mips64-unknown-linux-gnu-” cross gcc and binutils work fine to build linux kernel. If you don’t want to build the cross toolchain by yourself, you can download it from cnusers. It takes a few days to complete registration.

Userland GCC

Debian has 32-bit userland on MIPS port. Thus by defaut, “gcc” generates 32-bit code on the platform. To compile 64-bit applications, install “gcc-multilib” and “libc6-dev-mips64” packages, then call gcc with options such as “-march=mips64r2 -mabi=64“.

Links

For Japanese users: See also this post

Any comments and questions are welcome!