buildrootは組み込みLinux環境を作成するためのツールです。Makefileといくつかのpatchのセットから構成されています。
本稿では以下のURLにあるbeagleboard-xm用にカスタムされたbuildrootを使用し、ビルド環境の構築とビルド手順を記載します。
ビルド環境構築に使用するホストOSはUbuntu 10.04(64bit)です。
追加パッケージ、設定変更とビルド環境の構築手順について記載します。
ビルド環境構築手順の大まかな手順はbuildrootの取得、Toolchainの取得とbc10用ファイルの配置です。
buildrootの取得(git clone)は以下のURLに記載されている手順で行います。
ビルド環境構築のために以下の各パッケージを導入します。
ssh vim git-core build-essential curl ia32-libs diffstat cvs subversion chrpath texi2html texinfo libncurses5-dev bison flex gettext
Ubuntuデフォルトのshellはdashで、そのままmakeを実行するとエラーが起こるため、
以下のコマンドを実行しデフォルトshellをbashに変更します。
$ sudo dpkg-reconfigure dash
「dash を /bin/sh インストールしますか?」と聞かれるので「No」or 「いいえ」を選択します。
これで shell は bash に変更されます。
gitコマンドを使用しbuildrootを取得します。
$ cd ${HOME} $ mkdir work_router $ cd work_router $ git clone https://github.com/MaxGalemin/buildroot.git
TIのWebサイトからToolchainを適当なディレクトリにダウンロードしインストールします。
インストール先を指定しなければ${HOME}/ti-sdk-beagleboard-05.05.01.00
以下にToolchainが展開されます。
$ wget http://software-dl.ti.com/dsps/dsps_public_sw/am_bu/sdk/BeagleBoardSDK/latest/exports/ti-sdk-beagleboard-05.05.01.00-Linux-x86-Install $ chmod +x ti-sdk-beagleboard-05.05.01.00-Linux-x86-Install
consoleでインストールするため --mode consoleオプションを付けて実行します。
$ ./ti-sdk-beagleboard-05.05.01.00-Linux-x86-Install --mode console
インストールしたToolchainのPATHをbashrcの末尾に設定します。
$ vi ${HOME}/.bashrc PATH=${HOME}/ti-sdk-beagleboard-05.05.01.00/linux-devkit/bin:$PATH $ source ${HOME}/.bashrc
buildrootのデフォルトToolchainはCodeSourceryの2011.03ですが
本稿ではbc10-router/arago-projectで使用しているTIが配布しているToolchain
ti-sdk-beagleboard-05.05.01.00を使用しています。
bc10用のconfigファイルは
があります。それぞれ適当なディレクトリにダウンロードしてください。
各ファイルの配置は以下のとおりです。
boardディレクトリにbc10ディレクトリを作成してください。
kernel-patchesディレクトリはbuildroot/board/beagleboard/xm/kernel-patchesを
コピーします。
busybox-1.19.x.configは同名のファイルが存在しますので元のファイルを適当な名前に
リネームしてください。
work_router/ `- buildroot/ |- board/ | `-bc10/ | |- kernel-patches/ | `- linux-3.2.8.config |- configs/ | `- bc10_defconfig `-package/ `- busybox/ `- busybox-1.19.x.config (bc10用編集済みbusyboxのconfigファイル)
配置完了後、make bc10_defconfig、make menuconfigコマンドを実行して
各設定が以下のようになっていることを確認してください。
特にToolchain Pathは上記の設定が記載されていること(インストール先が異なる場合は適宜変更をしてください)、
KernelのCustom kernel patches、Configuration file pathのディレクトリ指定が
board/bc10/を設定している事を確認してください。
$ cd ~/work_router/buildroot $ make bc10_defconfig $ make menuconfig Toolchain ---> |- Toolchain type(External toolchain) |- Toolchain (Custom toolchain) |- (${HOME}/ti-sdk-beagleboard-05.05.01.00/linux-devkit) Toolchain Path |- ($(ARCH)-arago-linux-gnueabi) Toolchain prefix |- External toolchain C library (glibc) ... |- [*] Toolchain has C++ support? ... Package Selection for the target ---> ... |- (package/busybox/busybox-1.19.x.config) BusyBox configuration file to use? ... Kernel ---> ... |- (board/bc10/kernel-patches) Custom kernel patches ... |- (board/bc10/linux-3.2.8.config) Configuration file path ...
TIのToolchainを使用した際、CodeSourcery2011.03のToolchainとは
バージョンなど幾つもの異なる点があるためエラーが起こる箇所が何点かあります。
その点を予め修正、変更しビルドを実行します。
基本的にbc10-router/arago-projectで使用しているバージョンに合わせる
方法で修正、変更を行います。
buildrootのlibtoolのバージョンを2.2.10からbc10-router/arago-projectで
使用している2.2.6bに変更します。
これは2.2.10のままではホストPCのlibtoolが2.2.6bでその上で生成されたlibtoolと
ライブラリのバージョン不一致が起こる事を防ぐためです。
$ cd ${HOME}/work_router/buildroot $ vi package/libtool/libtool.mk - LIBTOOL_VERSION = 2.2.10 + # LIBTOOL_VERSION = 2.2.10 + LIBTOOL_VERSION = 2.2.6b LIBTOOL_SOURCE = libtool-$(LIBTOOL_VERSION).tar.gz
ncursesのバージョンを5.7から5.9に変更します。
これも同様にTIのToolchainでのビルド時にエラーが起こる事を回避するためです。
$ cd ${HOME}/work_router/buildroot $ vi package/ncurses/ncurses.mk --- ncurses.mk_orig 2012-12-21 17:10:01.570116798 +0900 +++ ncurses.mk 2012-12-21 15:30:30.220956375 +0900 @@ -23,27 +23,52 @@ # USA # TARGETS -NCURSES_VERSION = 5.7 +#NCURSES_VERSION = 5.7 +NCURSES_VERSION = 5.9 NCURSES_SITE = $(BR2_GNU_MIRROR)/ncurses NCURSES_INSTALL_STAGING = YES NCURSES_DEPENDENCIES = host-ncurses +HOSTCPPFLAGS += "-D_GNU_SOURCE" + NCURSES_CONF_OPT = \ + --enable-widec \ + --without-progs \ --with-shared \ - --without-cxx \ - --without-cxx-binding \ --without-ada \ - --without-progs \ - --without-tests \ + --enable-hard-tabs \ + --enable-xmc-glitch \ + --enable-colorfgbg \ --disable-big-core \ - --without-profile \ - --disable-rpath \ - --enable-echo \ - --enable-const \ - --enable-overwrite \ - --enable-broken_linker \ + --disable-rpath-hack \ + --with-ticlib \ + --with-termlib=tinfo \ + --enable-sigwinch \ + --enable-pc-files \ + --with-build-cc="${HOSTCC}" \ + --with-build-cpp="${HOSTCPP}" \ + --with-build-ld="${HOSTLD}" \ + --with-build-cflags="${HOSTCFLAGS}" \ + --with-build-cppflags='${HOSTCPPFLAGS}' \ + --with-build-ldflags='${HOSTLDFLAGS}' \ --disable-static +#NCURSES_CONF_OPT = \ +# --with-shared \ +# --without-cxx \ +# --without-cxx-binding \ +# --without-ada \ +# --without-progs \ +# --without-tests \ +# --disable-big-core \ +# --without-profile \ +# --disable-rpath \ +# --enable-echo \ +# --enable-const \ +# --enable-overwrite \ +# --enable-broken_linker \ +# --disable-static + ifneq ($(BR2_ENABLE_DEBUG),y) NCURSES_CONF_OPT += --without-debug endif @@ -99,7 +124,7 @@ endif define NCURSES_INSTALL_TARGET_CMDS mkdir -p $(TARGET_DIR)/usr/lib - cp -dpf $(NCURSES_DIR)/lib/libncurses.so* $(TARGET_DIR)/usr/lib/ + cp -dpf $(NCURSES_DIR)/lib/* $(TARGET_DIR)/usr/lib/ $(NCURSES_INSTALL_TARGET_PANEL) $(NCURSES_INSTALL_TARGET_FORM) $(NCURSES_INSTALL_TARGET_MENU) @@ -120,6 +145,32 @@ define NCURSES_INSTALL_TARGET_CMDS $(NCURSES_INSTALL_TARGET_DEVFILES) endef # NCURSES_INSTALL_TARGET_CMDS + + + +# define NCURSES_INSTALL_TARGET_CMDS +# mkdir -p $(TARGET_DIR)/usr/lib +# cp -dpf $(NCURSES_DIR)/lib/libncurses.so* $(TARGET_DIR)/usr/lib/ +# $(NCURSES_INSTALL_TARGET_PANEL) +# $(NCURSES_INSTALL_TARGET_FORM) +# $(NCURSES_INSTALL_TARGET_MENU) +# ln -snf /usr/share/terminfo $(TARGET_DIR)/usr/lib/terminfo +# mkdir -p $(TARGET_DIR)/usr/share/terminfo/x +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/x/xterm $(TARGET_DIR)/usr/share/terminfo/x +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/x/xterm-color $(TARGET_DIR)/usr/share/terminfo/x +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/x/xterm-xfree86 $(TARGET_DIR)/usr/share/terminfo/x +# mkdir -p $(TARGET_DIR)/usr/share/terminfo/v +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/v/vt100 $(TARGET_DIR)/usr/share/terminfo/v +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/v/vt102 $(TARGET_DIR)/usr/share/terminfo/v +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/v/vt200 $(TARGET_DIR)/usr/share/terminfo/v +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/v/vt220 $(TARGET_DIR)/usr/share/terminfo/v +# mkdir -p $(TARGET_DIR)/usr/share/terminfo/a +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/a/ansi $(TARGET_DIR)/usr/share/terminfo/a +# mkdir -p $(TARGET_DIR)/usr/share/terminfo/l +# cp -dpf $(STAGING_DIR)/usr/share/terminfo/l/linux $(TARGET_DIR)/usr/share/terminfo/l +# $(NCURSES_INSTALL_TARGET_DEVFILES) +# endef # NCURSES_INSTALL_TARGET_CMDS +
udev-181でもTIのToolchain使用時にエラーが起こります、またbc10-router/arago-projectで
使用しているudevは165でダウンロード元サイトには100以前と170以降しか
アーカイブされていないため、バージョンは181のままでエラーを回避するpatchを
package/udev/udev-181-define-trigger-happy.patchという名前で作成します。
patchの内容は以下の通りです。
$ vi package/udev/udev-181-define-trigger-happy.patch diff -Naur udev-181.orig/src/udev-builtin-input_id.c udev-181/src/udev-builtin-input_id.c --- udev-181.orig/src/udev-builtin-input_id.c 2012-03-05 11:41:10.000000000 -0500 +++ udev-181/src/udev-builtin-input_id.c 2012-03-05 11:46:31.000000000 -0500 @@ -30,6 +30,10 @@ #include "udev.h" +#ifndef BTN_TRIGGER_HAPPY +#define BTN_TRIGGER_HAPPY 0x2c0 +#endif + /* we must use this kernel-compatible implementation */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
上記の手順まで完了後ビルドを実行します。
$ make
ビルド完了後、work_router/buildroot/output/imagesに以下の各ファイルが
作成されます。
MLO rootfs.tar u-boot.img uEnv.txt uImage
uboot用環境設定ファイルuEnv.txtは上記までの手順で作成されますが、
以下の内容に変更します。
--- __uEnv.txt_orig 2012-12-18 15:20:53.344986130 +0900 +++ uEnv.txt 2012-12-18 15:21:06.901053349 +0900 @@ -1,3 +1,2 @@ -mpurate=1000 -dvimode=1024x768MR-16@60 -uenvcmd=mmc init; run loaduimagefat; run mmcboot +mmcroot=/dev/mmcblk0p2 rw +uenvcmd=run loaduimagefat; run mmcboot
bc10/booting 起動用SDカードの作成の手順で作成されたSDカードを
使用する前提で記載しています。FAT32、Ext3それぞれのディレクトリ名は
/media/FAT,/media/EXT3とします。
上記までで作成したファイルをそれぞれのディレクトリにコピー、展開をします。
$ cp MLO /media/FAT $ cp u-boot.img /media/FAT $ cp uImage /media/FAT $ sudo tar xvf rootfs.tar -C /media/EXT3
以上で、SDへの書き込みは完了です。
本buildrootを用いてbc10を起動した際の幾つかのトピックを記載します。
本buildrootではデフォルトのshell は bash 、sshdは dropbear を使用しています。
外部から本buildrootに(root、作成したユーザともに)ssh経由でアクセスしようとした際、
以下のような警告がログに表示され、loginすることができません。
authpriv.warn dropbear[780]: User 'root' has invalid shell, rejected
これはdropbear/svr-auth.c内のshellをチェックする箇所が/bin/shに固定されているために
起こる問題です。/etc/passwdの該当ユーザのshellを以下のように /bin/bash から /bin/sh へ
変更し再起動を行うことで login が可能になります。
$ vi dropbear-2012.55/svr-auth.c 254行目~ /* check that the shell is set */ usershell = ses.authstate.pw_shell; if (usershell[0] == '\0') { /* empty shell in /etc/passwd means /bin/sh according to passwd(5) */ usershell = "/bin/sh"; } ...<略> endusershell(); TRACE(("no matching shell")) dropbear_log(LOG_WARNING, "User '%s' has invalid shell, rejected", ses.authstate.pw_name); send_msg_userauth_failure(0, 1); return DROPBEAR_FAILURE;
[root@bc10-router ~]# vi /etc/passwd root:x:0:0:root:/root:/bin/sh ...
起動に無線LANモジュールを読み込まないため、ログイン後以下のように
モジュールを読み込むことで無線LANデバイスの認識が完了します。
# modprobe rt2800usb [ 38.027832] cfg80211: Calling CRDA to update world regulatory domain [ 38.291656] usb 1-2.4: reset high-speed USB device number 4 using ehci-omap [ 38.486846] usbcore: registered new interface driver rt2800usb # ifconfig -a ...<略> wlan0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
2012/12/21 初稿掲載
2012/12/25 bc10起動後の設定についてを追加、bc10用のconfig配置のbc10_defconfig、linux-3.2.8.configの更新
2013/01/07 構成変更、文言修正