OpenWRT のクロスコンパイル環境構築のまとめ

ここでは,OpenWRT向けのクロスコンパイル環境を CentOS on VMware 上で構築する手順をまとめます.VMでなくても構いません.

CentOS 6.2 の導入

ここでは,OpenWRTのファームウェアをコンパイルするOSとして,CentOS 6.2を用意し,CentOSへ,SSH等で,リモート接続した上で,OpenWRTをコンパイル,実機への導入を行う環境を整えます.そのため,CentOSは,最低限の環境で十分です.開発環境は,VM上で十分ですが,コンパイルには,インターネット接続環境や高速なCPUがあった方が楽なので,CentOS環境は,実機や,VMwareESXなどのハイパワーなVM環境でもよいとおもいます.

ここでは,Windows 7 / VMware Workstation 8.x に,CentOS6.2 を導入して,構築を進めます.VMware Playerでも問題ありません.

まず,CentOS6.2(64bit/amd)のminimum install のisoファイル(CentOS-6.2-x86_64-minimal.iso) を入手して,VM上でCentOS6.2をインストールします.ディスクサイズは,20GB,メモリーは,1GB程度で十分.そして,CentOSでインストールするパッケージは,minimumで十分です.

インストールが終わったら,yum update と,VMware toolsをインストールしておきます.以下の例では,インストール後,アカウント作成(adduserやvipwなどで)&パスワード設定し,Windowsアプリ Rlogin.exeを利用して,sshにて接続して作業した例です.

(インストール完了後,起動,#はroot , %または,$は一般権限)
(基本整備)
#yum update
# mount -o ro -t iso9660 /dev/sr0 /mnt
% cd ~ ; tar xvfz /mnt/VMwareTools-*.tar.gz
% cd vmware-tools-distrib
# ./vmware-install.pl
# vmware-toolbox-cmd timesync enable
↓(設定と開発環境整備)
# yum groupinstall "Development tools"
# yum install zlib-devel  ncurses-devel wget
# yum install system-config-network-tui.noarch system-config-firewall-tui.noarch
# yum install tftp

(おまけ) firewall/ NIC のIP設定などは,system-config-network / system-config-firewall などで設定すると楽です.もちろん,/etc/sysconfig/network-scripts/ifcfg-*を編集する方法でもよいです.ONBOOT=Yesを忘れないでね.

seLinux は,/etc/sysconfig/selinuxを編集して設定します.

Subversion によるOpenWRT sourceのチェックアウト

OpenWRTは,開発トラック(trunk)と安定版,リリース版があります.リリース版には,コードネーム Backfire や,kamikazeがあり,末尾に,リリースバージョン番号が付与されています.安定版(stable)には,バージョン番号がついていません.開発トラックは,trunkです.最新の情報は,ここを参照してください.以下のURLは変更される場合があります.

ここでは,ホームディレクト下の OpenWRTディレクトリに展開することを想定して話を進めます.

なお,WZR-HP-AG300Hは,開発トラック(trunk)から対応しています.kamikazeやbackfireは対応していません.

開発トラックは,以下のように checkout(co)できます.

cd ~
mkdir OpenWRT ; cd OpenWRT; mkdir trunk
svn co svn://svn.openwrt.org/openwrt/trunk
(ソースを構成するファイルがダラダラと表示)
リビジョン 32646 をチェックアウトしました。

コードネーム backfire や,kamikaze(8.0系,7.0系)は,それぞれ以下のようにcheckout(co)できます.

以下の例では,まだ,backfireがstable版であるため,末尾に数字がありません.リリースされれば,backfire_10.03として,公開されると思われます.
cd ~
mkdir OpenWRT ; cd OpenWRT; mkdir backfire
svn co svn://svn.openwrt.org/openwrt/branches/backfire
cd ~/OpenWRT; mkdir kamikaze_{8,7}

cd kamikaze_8
svn co svn://svn.openwrt.org/openwrt/branches/8.09

cd ~/OpenWRT/kamikaze_7
svn co svn://svn.openwrt.org/openwrt/tags/kamikaze_7.09

以上で,ソースファイル入手は完了です.

クロスコンパイルする

基本ツールの導入確認と,menuconfigの実行

開発トラックとbackfireを例にします.コンパイルには種々のツール,ライブラリが必要ですが,先の作業で,忘れている可能性があるのは,zlib/ncurses/wgetでしょう.忘れてたら, yum install zlib-devel  ncurses-devel wgetです.まず,SVNでチェックアウト後に作成されているbackfireディレクトリ内に移動して,make menuconfigを実行します.menuconfigにて,コンパイルの対象ハードなどのターゲットを指定します.

% cd ~/OpenWRT/backfire/backfire
% ls
BSDmakefile LICENSE README feeds.conf.default package scripts tmp tools
Config.in Makefile docs include rules.mk target toolchain
% make menuconfig

なにか足らないときは,make menuconfig のエラー停止時に,不足しているパッケージが表示されますので,yum installします.すべて充足していると,以下のようなメニュー画面が表示されます.

        menu-1

開発版ならば,以下の通りです.

% cd ~/OpenWRT/trunk/trunk
% ls
% make menuconfig

        trunk-1   

menuconfigでの設定(一般編)

WZR-HP-AG300H系の設定を例にします.開発版trunk でのmenuconfigでは,ターゲットとなる箱のCPUや機能の選択を行います.今回の例である,WZR-HP-AG300Hは,http://wiki.openwrt.org/toh/buffalo/wzr-hp-ag300h にあるように,CPUが,Atheros AR7161@680MHz,メモリーが 128MiB ,フラッシュメモリーが32MiB です.よって,Target Systemを選択,Enterし, Atheros AR71xx/AR7240/AR913xを選択し,スペースを押します.

        menu-2

Target Profileは,Buffalo WZR-HP-AG300H を指定します.もし,Buffalo WZR-HP-AG300Hが選択できないなら,menuconfigしたsourceが開発トラックである trunkではないです.backfireとかkamikazeじゃないですか?再確認しましょう.

そして,Exitを選ぶと,

        menu-3

とでますので,Yesして終了します.設定内容は,".config"ファイルを閲覧すれば確認できます.

(より高度な設定は,詳細編をみてください.)

makeする

menuconfig後は,makeを実行します.インターネットへの接続が必要です(各種アプリケーションのクロスコンパイルするためにソースファイルをダウンロードするからです).特に最初は,各種ソースファイルのダウンロード,tools,toolchain(gccを含め多数)をmakeするので,お時間が余計にかかります.make に要する時間は,Corei7 2.13GHzを 1CPU(つまり,1core 1スレッド=1/4の計算資源)を 割り当てたVMの場合,1時間30分程度(timeの結果参照)です.この結果を見ればわかるように,ダウンロード(dlフォルダ内にダウンロード)に要する時間が大きいので,うまく工夫してください.

また,make時に V=数字,オプションで,コンパイル状況がわかります.最初は,make V=99 として,全部の作業ログをみるのがよいとおもいます.また,エラー時も,Vオプションにて,エラーを表示できますので,原因調査ができます.特に,trunk版は,makeが通らない場合があるので,make V=99を推奨します.

マルチコアの場合は,make -j [CPU]+1 でより短時間で,makeできるかもしれません.make menuconfigで,Global build settings内の,「[*] Compile certain packages parallelized」と「( ) Number of package submake jobs (2-512)」で,CPU利用効率をたかめることができるかもしれません.

*** End of OpenWrt configuration.
*** Execute 'make' to build the OpenWrt or try 'make help'.

% time make
make[1] world
make[2] tools/install
make[3] -C tools/gmp compile
make[3] -C tools/gmp install
(略)
make[2] toolchain/install
make[3] -C toolchain/binutils prepare
make[3] -C toolchain/binutils compile
make[3] -C toolchain/binutils install
make[3] -C toolchain/gcc prepare
(略)
make[2] package/rootfs-prepare
make[3] package/preconfig
make[2] target/install
make[3] -C target/linux compile
make[3] -C target/linux install
make[2] package/index

real 84m35.504s
user 44m10.126s
sys 10m33.358s

2回目以降で,tools類やダウンロードがない場合のコンパイルに要するお時間は以下の通り,1/3程度の30分です.

% make clean
% time make
(略)
make[2] target/install
make[3] -C target/linux install
make[2] package/index

real 28m10.476s
user 24m19.436s
sys 3m41.162s

コンパイルしたバイナリーは,bin/アーキテクチャ名/の配下に用意されます.例えば,tftp でアップロードするなら,*-tftp.binを送りつけます.なお,ファイル名中のjffs2,squashfsは,イメージのファイルシステムの違いです.以下は,backfireで,WZR-HP-G300NH向けのmakeを行った例です.

% ls bin/ar71xx/
md5sums
openwrt-ar71xx-root.jffs2-128k
openwrt-ar71xx-root.jffs2-64k
openwrt-ar71xx-root.squashfs
openwrt-ar71xx-root.squashfs-4k
openwrt-ar71xx-rootfs.tar.gz
openwrt-ar71xx-uImage-gzip.bin
openwrt-ar71xx-uImage-lzma.bin
openwrt-ar71xx-vmlinux.bin
openwrt-ar71xx-vmlinux.elf
openwrt-ar71xx-vmlinux.gz
openwrt-ar71xx-vmlinux.lzma
openwrt-ar71xx-wzr-hp-g300nh-jffs2-sysupgrade.bin
openwrt-ar71xx-wzr-hp-g300nh-jffs2-tftp.bin
openwrt-ar71xx-wzr-hp-g300nh-squashfs-sysupgrade.bin
openwrt-ar71xx-wzr-hp-g300nh-squashfs-tftp.bin
packages/

開発版trunkだと,以下のような感じです.

% ls bin/ar71xx/
md5sums
openwrt-ar71xx-generic-root.jffs2-128k
openwrt-ar71xx-generic-root.jffs2-64k
openwrt-ar71xx-generic-root.squashfs
openwrt-ar71xx-generic-root.squashfs-64k
openwrt-ar71xx-generic-rootfs.tar.gz
openwrt-ar71xx-generic-uImage-gzip.bin
openwrt-ar71xx-generic-uImage-lzma.bin
openwrt-ar71xx-generic-vmlinux.bin
openwrt-ar71xx-generic-vmlinux.elf
openwrt-ar71xx-generic-vmlinux.gz
openwrt-ar71xx-generic-vmlinux.lzma
openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-factory.bin
openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-sysupgrade.bin
openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-tftp.bin
openwrt-ar71xx-generic-wzr-hp-ag300h-squashfs-factory.bin
openwrt-ar71xx-generic-wzr-hp-ag300h-squashfs-sysupgrade.bin
openwrt-ar71xx-generic-wzr-hp-ag300h-squashfs-tftp.bin
packages

make errorでとまったら?

開発版 trunkでは,よくあることです.まずは,

make V=99

にて,エラーで停止する部分を確認します.ファイルの入手で失敗(mirror 見つからないとか)している場合は,インターネットへの接続を確認してください.

patch FAILの場合は,FAILしたファイルの .rejを確認し,patchを見直して,patchを手で当てなおします.

たとえば,以下のように 2012.7.7 の trunk版リビジョン32646だと,ar9kドライバのpatchでFAILします.trunk/package/mac80211/patches/568-ath9k_fix_ar9340_tx_gain.patchを以下で置き換えます.Fail部分が,WZRに無関係なのと,感覚的にあまり,patchの残骸だとおもいましたので,削除しただけです.

 trunk/package/mac80211/patches/568-ath9k_fix_ar9340_tx_gain.patch

--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
@@ -605,7 +605,7 @@ static void ar9003_tx_gain_table_mode2(s
5);
else if (AR_SREV_9340(ah))
INIT_INI_ARRAY(&ah->iniModesTxGain,
- ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
+ ar9340Modes_low_ob_db_tx_gain_table_1p0,
ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
5);
else if (AR_SREV_9485_11(ah))

ソースファイルをcoしなおしている場合などは,make dirclean してから,tool/toolchainを作り直したほうが良いです.コンフィグも消し去りたい場合は,make distcleanです.

make dirclean

ファームウェアの投入

ファームウェアのアップデートは,稼働しているOpenWRT上でアップグレードする方法,tftpにて,boot loaderからアップロードする方法があります.

まずは,OpenWRT上でアップグレードする方法です.

ファームウェアをscp で送るか,OpenWRTからwgetなどでOpenWRT筐体へ送り込みます.この場合は,*-sysupgrade.binとなっているファイルを使います.ファイルシステム(↓参照)は,お好みのを選択してください.通常は,jffs2でよいでしょう.

ファイル名の命名規則は以下の通りです.

openwrt - ar71xx - generic - wzr-hp-ag300h - jffs2 - sysupgrade .bin
    アーキテクチャ名   サブターゲット名   ターゲットプロファイル名   rootファイルシステム   ファームウェアの形式  
                squashfs   factory: WebUI, DD-WRT WEBUIからのアップデート用  
                jffs2
  sysupgrade:  sysupgradeコマンドで設定保持してアップデート,オプション次第で,初期化可  
                    tftp: bootloaderでtftpで読み込む用  

% cd ~/OpenWRT/trunk/trunk/bin/ar71xx/  ←ディストリビューション,CPU/プロファイル,ターゲットにあわせる.
% scp openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-factory.bin root@192.168.1.1:~ ←もちろんIPも環境に合わせる
root@192.168.1.1's password:
openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-factory.bin 39% 1520KB 217.7KB/s 00:10 ETA

Windows用 Rloginにて,WZRへ SSH接続して,ファームをドラッグアンドドロップでSCPして転送する例
winscp

アップロード(又は,ダウンロードした)ファームウェアのchecksumを確認します.CentOS側,OpenWRT側共にmd5sumsコマンドでMD5出力が一致するか確認します.

% md5sums  openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-sysupgrade.bin  (アップロードしたファイル名を指定)
500340e5dae358ccb66669d23841d28d openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-sysupgrade.bin

一致すれば,アップグレードを行います.以下のsysupgradeコマンドを使います.

# sysupgrade -v openwrt-ar71xx-generic-wzr-hp-ag300h-jffs2-sysupgrade.bin
Saving config files...
etc/sysctl.conf
etc/shells
etc/shadow
etc/rc.local
etc/profile
etc/passwd
etc/inittab
etc/hosts
etc/group
etc/firewall.user
etc/dropbear/dropbear_rsa_host_key
etc/dropbear/dropbear_dss_host_key
etc/config/wireless
etc/config/ubootenv
etc/config/system
etc/config/network
etc/config/firewall
etc/config/dropbear
etc/config/dhcp
Sending TERM to remaining processes ... dnsmasq ntpd syslogd klogd hotplug2 ubusd netifd
Sending KILL to remaining processes ...
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...

Writing from <stdin> to firmware ...
Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...TRX header not found
Error fixing up TRX header Upgrade completed
Rebooting system...

アップグレードが完了すると,自動的に再起動がかかります.ファイルシステムのゴミ掃除がおこなわれるため,少々お時間がかかります.シリアルをみておけば,状況がわかります.起動に要する時間は,2-3分程度です.

[ 17.600000] jffs2_scan_eraseblock(): End of filesystem marker found at 0x230000
[ 17.610000] jffs2_build_filesystem(): unlocking the mtd device... done.
[ 17.620000] jffs2_build_filesystem(): erasing all blocks after the end marker...
(ここでお時間必要)
[ 116.540000] ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[ 118.530000] br-lan: port 1(eth0) entered forwarding state

BusyBox v1.19.4 (2012-07-09 00:07:10 JST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

 _______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M

tftpでアップグレードする場合は,-tftp.binファイルを,OpenWRT化したときと同様の手法で導入します.

すでにDD-WRTなどにあるWEB上の「ファームウェアアップデート機能」でアップデートする場合は,-factory.binファイルを使います.