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 であることが確認できました。



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード