bc10-router の起動イメージとして
arago-project の beagleboard 用 arago-console-image を使用した場合、
linux kernel の version は 3.3.7 になります。
これは、{HOME}/oe/arago/conf/machine/beagleboard.conf に書かれている
PREFERRED_PROVIDER_virtual/kernel = "linux-stable"
から {HOME}/oe/arago/recipes/linux/linux-stable_3.3.bb が kernel ビルド時の設定として使用されるためです。
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git から 3.3.7 stable kernel を clone し、
beagleboard 向けに {HOME}/oe/arago/recipes/linux/linux-stable/ にある
の二つの patch を当てたものが bitbake でビルドされます。
この default の kernel を使用した場合も家庭用ルーターとしては十分な性能を得られていますが、
以下のような点に関して性能を追及するため kernel を更新し、性能に改善がみられるか確認を行いました。
Android を使用したスマートフォンなどの普及により、 Linux kernel の ARM SoC 向けソースコードは
近年開発が非常に活発になっており、kernel を更新することで Ethernet や無線LANのドライバー、無線LANサブシステム、
パワーマネージメントなどの性能向上が見込めるためです。
bc10 向けの kernel の更新は beagleboard 向けの kernel 更新と同じソースコードを利用して行います。
Beagleboard、Pandaboard など TI の OMAP/Sitara シリーズ SoC 向けのパッチを含むカーネルビルド環境を提供している
RobertCNelsonリポジトリ
https://github.com/RobertCNelson/linux-dev
から環境一式を取得します。
$ mkdir {work_dir} $ cd ~/{work_dir} $ git clone https://github.com/RobertCNelson/linux-dev.git $ cd linux-dev
作業時点での master branch がどの version の kernel をビルドする設定になっているか、version.sh を確認します。
#Kernel/Build KERNEL_REL=3.8 KERNEL_TAG=${KERNEL_REL}-rc3 BUILD=d0
2013年1月末時点で default は 3.8 の開発ブランチになっているので、すでに安定版がリリースされている 3.7 にブランチを切り替えます。
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/am33x-v3.1 remotes/origin/am33x-v3.2 remotes/origin/am33x-v3.6 remotes/origin/am33x-v3.7 remotes/origin/master $ git checkout -b am33x-v3.7 remotes/origin/am33x-v3.7
ビルド対象を切り替えたら設定ファイルの整備を行います。
予め用意されている sample をコピーし、
$ cp system.sh.sample system.sh
ARM GCC CROSS Compiler と、uImage のビルドに関する設定がコメントアウトされているのを
有効に戻し、設定を行います。
#ARM GCC CROSS Compiler: (See hints in Readme, for different gcc cross compiler versions) #CC=arm-linux-gnueabi- CC=arm-arago-linux-gnueabi- ###OPTIONAL: BUILD_UIMAGE: also build uImage vs just zImage # BUILD_UIMAGE=1 ###OPTIONAL: ZRELADDR: needed when building uImage's. # ##For TI: OMAP3/4/AM35xx ZRELADDR=0x80008000
ti-sdk-beagleboard-05.05.01.00 の Cross Toolchain へ PATH を通してから
build_kernel.sh を実行します。
$ export PATH={HOME}/ti-sdk-beagleboard-05.05.01.00/linux-devkit/bin:$PATH $ ./build_kernel.sh
実行すると {HOME}/linux-src/ に kernel ソースを git clone し、
そこから ~/{work_dir}/linux-dev/KERNEL に 3.7.2 を checkout 後、
ARM 用 OMAP 用 beagleboard 用の各種 patch を当てた上で menuconfig を行い(kernel config 用コンソールが開きます)、
config を終了して save すると(save 後の .config は bc10-router-3.7.2.config )ビルドが実行され
deploy ディレクトリに以下のようなファイルが生成されます。
$ ls -1 3.7.2-bone4.1-dtbs.tar.gz 3.7.2-bone4.1-firmware.tar.gz 3.7.2-bone4.1-headers.tar.gz 3.7.2-bone4.1-modules.tar.gz 3.7.2-bone4.1.config 3.7.2-bone4.1.uImage 3.7.2-bone4.1.zImage dtbs/ fir/ headers/ mod/
dtbs は 3.7 から ARM アーキテクチャーでも対応された DeviceTree 起動に必要なファイルですが、
今回は使用しません。
uImage(3.7.2-bone4.1.uImage)と modules(3.7.2-bone4.1-modules.tar.gz)だけを使用します。
一度 build_kernel.sh によるビルドが終わった後再度ビルドを行いたい場合は tools ディレクトリにある rebuild.sh を利用します。
$ ./tools/rebuild.sh
ビルド出来たこれらのファイルを bc10-router/arago-project で作成した bc10-router 起動イメージにコピーして使用します。
起動用SDカードは fat パーティションが /media/FAT に、ext3 パーティションが /media/EXT3 に mount されているものとします。
$ sudo -s # cp 3.7.2-bone4.1.uImage /media/FAT/uImage # tar xvfz 3.7.2-bone4.1-modules.tar.gz -C /media/EXT3
RobertCNelson リポジトリの 3.7.2 kernel への更新はこれで完了です。
arago project の default kernel は、3.3.7 stable kernel に
DVI 出力のための gpio の修正と uart のマルチプレクサの修正を加えているだけで、
bc10 を起動するのに必要な beagleboard 向けのその他の修正は
3.3.7 以降の mainline kernel にはすでに取り込まれています。
そこで、kernel.org で配布されている stable ブランチを使用して kernel を更新する手順も
確認しておきます。
まず kernel.org から最新 stable ブランチの kernel ソースコードを取得します。
$ cd ~/ $ wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.7.2.tar.bz2 $ tar xvfj linux-3.7.2.tar.bz2
ti-sdk-beagleboard-05.05.01.00 の Cross Toolchain へ PATH を通します。
$ export PATH={HOME}/ti-sdk-beagleboard-05.05.01.00/linux-devkit/bin:$PATH
kernel config はできるだけ arago project の default kernel と揃えるため、
3.3.7 をビルドした際の .config を元に作業し oldconfig を実行します。
$ cp {HOME}/oe/arago-tmp/work/beagleboard-arago-linux-gnueabi/linux-stable-3.3.7-r115/git/.config . $ make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- oldconfig
3.3.7 にはなかった 3.7.2 の新しい設定項目をどう設定するかをコンソール上で聞かれるので設定していきます。
(Y で kenrnel 組み込みにするか、N で無効にするか、m でモジュールにするか)
設定をすべて終えたら 3.7.2 向けの新しい .config が出来ています。
さらに調整したい項目がある場合は、oldconfig 完了後であれば menuconfig で設定できます。
$ make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- menuconfig
設定が完了したらビルドします。
$ make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- $ make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- uImage
ビルド完了後、kernel module を起動イメージ上へ展開する配置にするため
仮インストールします。
$ mkdir tmp_install $ make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- modules_install INSTALL_MOD_PATH=./tmp_install
完了すると tmp_install を rootfs の / として kernel modules をインストールした状態になっています。
必要なのは arch/arm/boot/uImage と tmp_install/ の lib/ 以下のファイルなので、これを
bc10-router/arago-project で作成した bc10-router 起動イメージにコピーして使用します。
起動用SDカードは fat パーティションが /media/FAT に、ext3 パーティションが /media/EXT3 に mount されているものとします。
$ sudo -s # cp arch/arm/boot/uImage /media/FAT/uImage # cd tmp_install # cp -a lib/ /media/EXT3/
kernel.org の 3.7.2 kernel への更新はこれで完了です。
arago-project の beagleboard 向け default version の 3.3.7 kernel と
Robert Nelson repositry を使用して更新した 3.7.2 kernel で
Wi-Fi のスループットに向上が見られるかを確認しました。
bc10-router をルーターモードで起動させ、
Wi-Fi アクセスポイントである bc10-router LAN 側インタフェースと
そこに W-Fi クライアントとして接続している Netbook の Wi-Fi インタフェース間でのスループットを
nuttcp で計測しました。
nuttcpによる測定
WAN側: bc10-router nuttcp -S
LAN側: PC nuttcp 192.168.30.1
# uname -a Linux bc10-router 3.3.7 #1 Mon Nov 26 22:45:08 JST 2012 armv7l unknownBogoMIPS
# cat /proc/cpuinfo | grep BogoMIPS BogoMIPS : 581.89スループット(10回計測平均)
回 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Avg. |
Mbps | 50.7863 | 55.0793 | 53.6637 | 54.0530 | 52.7941 | 55.5915 | 54.8066 | 55.8982 | 54.8012 | 56.3797 | 54.3853 |
%TX | 6 | 6 | 7 | 7 | 6 | 7 | 6 | 7 | 7 | 7 | 7 |
%RX | 23 | 25 | 24 | 24 | 24 | 25 | 25 | 25 | 25 | 25 | 25 |
retrans | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
msRTT | 1.27 | 1.62 | 1.49 | 1.40 | 1.33 | 1.35 | 1.44 | 1.40 | 1.64 | 1.92 | 1.49 |
# uname -a Linux bc10-router 3.7.2-bone4.1 #3 Wed Jan 16 14:35:07 JST 2013 armv7l unknownBogoMIPS
# cat /proc/cpuinfo | grep BogoMIPS BogoMIPS : 388.12スループット(10回計測平均)
回 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Avg. |
Mbps | 36.3708 | 37.5193 | 37.8842 | 37.2199 | 37.4805 | 37.3811 | 34.5526 | 36.7064 | 38.0515 | 38.5973 | 37.1764 |
%TX | 4 | 4 | 8 | 8 | 8 | 8 | 7 | 8 | 8 | 8 | 1 |
%RX | 25 | 27 | 38 | 27 | 26 | 27 | 25 | 27 | 26 | 26 | 10 |
retrans | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
msRTT | 1.81 | 1.92 | 1.71 | 1.73 | 1.84 | 2.08 | 1.55 | 1.96 | 2.92 | 4.16 | 0.00 |
残念ながら作業時点 2013/01/16 で最新の stable kernel である 3.7.2 への更新で
ネットワーク性能の向上は得られませんでした。
3.7 から ARM アーキテクチャでも DeviceTree に対応し、一つの kernel で複数の ARM アーキテクチャのマシンを起動できるようになるなど
ソースコードの整理や共通化が進んだ半面、SoC ごと、マシンごとの最適化という点では一旦後退が見られ
性能が得られなくなっているものと考えられます。
あくまで性能を追求するのであれば arago-project の default である 3.3.7 kernel を使うのが良いのですが、
linux kernel 更新による新機能の追加を取り込みたい、ARM アーキテクチャ向けコードの進歩を追いかけたい、といった場合には
kernel の更新を考慮しなければなりません。