2012年03月07日
buildrootでuclibcでなくeglibcでルートファイルシステムを作る
前回はbuildrootでuclibcを使ったルートファイルシステムを作りました。buildrootは長らくuclibc専用でしたが、最近はToolchainにcrosstool-NGを指定することで、glibcやeglibcを使うこともできるようになっています。今回はeglibcでルートファイルシステムを作ってみます。
ダウンロードとコンフィグ
$ wget http://buildroot.uclibc.org/downloads/buildroot-2012.02.tar.bz2 $ tar xvf buildroot-2012.02.tar.bz2 $ cd buildroot-2012.02/ $ make menuconfig
ここまでは前回と同じ。以下の項目を変更しました。
Target Architecture (arm) Target Architecture Variant (cortex-A9) Build options ---> (8) Number of jobs to run simultaneously Toolchain ---> Toolchain type (Crosstool-NG toolchain) Crosstool-NG C library (eglibc) (toolchain/toolchain-crosstool-ng/crosstool-ng.config-eglibc) crosstool-NG configuration file to use [*] Enable C++ support Kernel Headers (Linux 2.6.35.x kernel headers) ---> System configuration ---> (ttyS1) Port to run getty (login prompt) on
これで一度ビルドします。
$ make 2>&1 |tee make.log
しかし、これでできたルートファイルシステムを起動すると、"Too old kernel" というエラーで動きません。crosstools-ngがLinux 3.0.4 用にコンフィグされているためです。
crosstools-ngのコンフィグを変更する
toolchain/toolchain-crosstool-ng/crosstool-ng.config-eglibc を手で書き換えてもなんとかなりそうですが、自動生成されているものを手で書き換えるのはトラブルの元です。
試行錯誤の末、以下のようにすれば、crosstools-ng用のコンフィグファイルを変更できることがわかりました。
$ cd output/build/host-crosstool-ng-1.13.4/ $ ./ct-ng help $ cp ../../../toolchain/toolchain-crosstool-ng/crosstool-ng.config-eglibc .config $ ./ct-ng oldconfig $ ./ct-ng menuconfig $ cp .config ../../../toolchain/toolchain-crosstool-ng/crosstool-ng.config-eglibc
./ct-ng menuconfig のときに使用するカーネルのバージョンに2.6.35を指定しました。eglibcのバージョンも2.12から2.11に変更しました。
再度ビルド
トップディレクトリに戻り、先ほどビルドしたoutputディレクトリを消すか、renameしてから再度ビルドします。
$ cd - $ mv output output.old $ make 2>&1 |tee make.log
$ cd output/images/ $ ls -l -h total 3.7M -rw-r--r-- 1 koba koba 3.7M 2012-03-06 18:55 rootfs.tar
前回のuclibcのときの2倍以上のサイズです。
NFSrootでKZM-A9-Dualボードで動かしてみる
$ sudo mkdir -p /export/buildroot/eglibc/root $ sudo tar xvf rootfs.tar -C /export/buildroot/eglibc/root/
カーネルのブートパラメータ。NFSサーバを192.168.1.26とすると
root=/dev/nfs nfsroot=192.168.1.26:/export/buildroot/eglibc/root ip=dhcp \ noinitrd init=/linuxrc mem=129M@0x40000000 mem=256M@0x50000000 \ debug console=ttyS1,115200n8n video=qfb rootwait rw
init=/linuxrc を追加するのを忘れずに。 init= は追加しなくても、/sbin/init を見つけ出して起動してくれます。
起動ログ。
... [ 3.110000] Sending DHCP requests .., OK [ 5.180000] IP-Config: Got DHCP answer from 0.0.0.0, my address is 192.168.1.125 [ 5.180000] IP-Config: Complete: [ 5.190000] device=eth0, addr=192.168.1.125, mask=255.255.255.0, gw=192.168.1.62, [ 5.190000] host=192.168.1.125, domain=kmckk.jp, nis-domain=(none), [ 5.200000] bootserver=0.0.0.0, rootserver=192.168.1.26, rootpath= [ 5.210000] Looking up port of RPC 100003/2 on 192.168.1.26 [ 5.220000] Looking up port of RPC 100005/1 on 192.168.1.26 [ 5.230000] VFS: Mounted root (nfs filesystem) on device 0:12. [ 5.230000] Freeing init memory: 120K Starting logging: OK Initializing random number generator... done. Starting network... ip: RTNETLINK answers: File exists Welcome to Buildroot buildroot login:
前回と同様にrootでパスワード無しでログインできます。
# ls -l /lib total 2212 -rwxr-xr-x 1 root root 114008 Mar 6 2012 ld-2.11.3.so lrwxrwxrwx 1 root root 12 Mar 6 2012 ld-linux.so.3 -> ld-2.11.3.so -rwxr-xr-x 1 root root 1107260 Mar 6 2012 libc-2.11.3.so lrwxrwxrwx 1 root root 14 Mar 6 2012 libc.so.6 -> libc-2.11.3.so -rwxr-xr-x 1 root root 34240 Mar 6 2012 libcrypt-2.11.3.so lrwxrwxrwx 1 root root 18 Mar 6 2012 libcrypt.so.1 -> libcrypt-2.11.3.so -rwxr-xr-x 1 root root 9672 Mar 6 2012 libdl-2.11.3.so lrwxrwxrwx 1 root root 15 Mar 6 2012 libdl.so.2 -> libdl-2.11.3.so -rwxr-xr-x 1 root root 42552 Mar 6 2012 libgcc_s.so.1 -rwxr-xr-x 1 root root 591328 Mar 6 2012 libm-2.11.3.so lrwxrwxrwx 1 root root 14 Mar 6 2012 libm.so.6 -> libm-2.11.3.so -rwxr-xr-x 1 root root 67412 Mar 6 2012 libnsl-2.11.3.so lrwxrwxrwx 1 root root 16 Mar 6 2012 libnsl.so.1 -> libnsl-2.11.3.so -rwxr-xr-x 1 root root 17900 Mar 6 2012 libnss_dns-2.11.3.so lrwxrwxrwx 1 root root 20 Mar 6 2012 libnss_dns.so.2 -> libnss_dns-2.11.3.so -rwxr-xr-x 1 root root 42548 Mar 6 2012 libnss_files-2.11.3.so lrwxrwxrwx 1 root root 22 Mar 6 2012 libnss_files.so.2 -> libnss_files-2.11.3.so -rwxr-xr-x 1 root root 84336 Mar 6 2012 libpthread-2.11.3.so lrwxrwxrwx 1 root root 20 Mar 6 2012 libpthread.so.0 -> libpthread-2.11.3.so -rwxr-xr-x 1 root root 63196 Mar 6 2012 libresolv-2.11.3.so lrwxrwxrwx 1 root root 19 Mar 6 2012 libresolv.so.2 -> libresolv-2.11.3.so -rwxr-xr-x 1 root root 26500 Mar 6 2012 librt-2.11.3.so lrwxrwxrwx 1 root root 15 Mar 6 2012 librt.so.1 -> librt-2.11.3.so -rwxr-xr-x 1 root root 9708 Mar 6 2012 libutil-2.11.3.so lrwxrwxrwx 1 root root 17 Mar 6 2012 libutil.so.1 -> libutil-2.11.3.so #
libcの実体が libc-2.11.3.so であることが確認できました。