Neue uClibc-Chroot-Umgebung und Artikeldownload

Etwa neun Monate ist es her, dass ich die letzte Chroot-Umgebung bereitgestellt habe. Zwar ist uClibc noch immer auf dem Stand 0.9.29, doch Busybox hat gewaltige Fortschritte gemacht und ist in Version 1.9.1 erhältlich. Viele Applets verhalten sich nun kompatibler zu den GNU-Tools, es sind neue dazugekommen und problematische aussortiert worden. Insgesamt ist der Bau des “4MB-Mini-Linux” mit der neuen Busybox jetzt deutlich einfacher.

Downloads


Kurz und bündig zum Einsatz

Das RootFS ist als Chroot-Umgebung für i686 oder AMD64 gedacht. Wenn Sie einen Kernel vorbereiten oder einen Xen-Kernel zur Hand haben, können Sie auch direkt vom RootFS booten — your mileage may vary.

  • Zuerst wird entpackt:

    tar xvjf uclibc-chroot-20080316.tar.bz2

  • Mounten Sie jetzt ein paar typische Verzeichnisse im Chroot:

    mount -o bind /tmp uclibc-chroot/tmp
    mount -o bind /dev uclibc-chroot/dev
    mount -t proc none uclibc-chroot/proc

    Sollten Sie im Chroot Netzwerkzugriff benötigen, kopieren Sie die /etc/resolv.conf des Hosts in die Chroot-Umgebung.

  • Jetzt wechseln Sie in den Chroot-Käfig:

    chroot uclibc-chroot /bin/bash

    Unter AMD64 kann es nützlich sein, mit setarch den im Chroot gestarteten Programmen eine andere Architektur vorzugaukeln

    setarch i386 chroot uclibc-chroot /bin/bash

Gehen Sie wie folgt vor, um im Chroot eine Busybox 1.9.1 zu bauen. Zunächst außerhalb des Chroots:

  • Entpacken und konfigurieren im gemeinsamen /tmp:

    cd /tmp
    wget http://busybox.net/downloads/busybox-1.9.1.tar.bz2
    tar xvjf busybox-1.9.1.tar.bz2
    cd busybox-1.9.1.tar.bz2
    wget -O .config http://cdprojekte.mattiasschlenker.de/Public/Chroot-Umgebungen/uclibc-chroot-20080316.src/.config-busybox-static
    make oldconfig

  • Sie können die Konfiguration nun anpassen:

    make menuconfig

  • Vergessen Sie nicht, möglicherweise vorhandene Binaries, die gegen glibc gelinkt sind, aufzuräumen

    make clean

Im Chroot findet das eigentliche Bauen statt:

  • Zuerst kompilieren:

    make

  • Dann Installation in _install:

    make install

Bei unveränderter Verwendung meiner .config-busybox-static sollte ein etwa 800k großes, statisch gelinktes Binary die Folge sein, das auch unter einem glibc-Linux (normales Server- oder Desktoplinux) läuft. Sie können mit diesem Binary und einem Kernel bereits ohne zusätzliche Bibliotheken ein Minilinux auf Initrd erstellen.

Hinweise zum Selbstbau der Chroot-Umgebung

Prinzipiell ist der Selbstbau mit den Buildroot-Scripten von uClibc.org recht einfach zu bewerkstelligen. Man konfiguriert mit make menuconfig die gewünschte Toolchain und die im Ziel enthaltenen Pakete und baut schließlich mit make. Das uClibc-Root-Filesystem lässt sich auf die unterschiedlichsten Architekturen anpassen, mit Bootloader und Kernel ausstatten. Sogar viele X11-Pakete sind mittlerweile an Bord, so dass Embedded-Entwickler recht flott zu einem RootFS für Entwicklungsboards kommen. Dazu gibt es ein kleines README, in dem Detaileinstellungen der verwendeten Busybox etc. erklärt sind — unbedingt lesen. Dennoch wird nicht alles auf Anhieb klappen. Mir sind folgende Probleme aufgefallen:

  • Im RootFS fehlen trotz angewählter Toolchain im Target die uClibc-Header. Die manuell in der .config gesetzte Variable BR2_CROSS_TOOLCHAIN_TARGET_UTILS=y schuf Abhilfe.
  • Das ar im RootFS war dennoch ein Softlink auf die Busybox. Das fehlende ar (es war gebaut worden) fand find . -name ar -type f ldd entlarvte dann unter den gefundenen Binaries das für uClibc crosscompilierte.
  • Gcc 4.2.1 war ein Griff ins Klo, er produzierte nur Binaries, die abschmierten. Zum Debuggen hatte ich keine Lust, probierte also zunächst mal Gcc 4.1.2. Mit dem klappte alles und der im RootFS installierte Gcc 4.1.2 produziert auch lauffähige Binaries.
  • Hin und wieder können Quellcodes nicht heruntergeladen werden. Auf diese Tools verzichtete ich. Schlimmstenfalls müssen die fehlenden Programme im Chroot mit den dort enthaltenen Tools nachinstalliert werden.

Quellcodes und Konfigurationen

Sie können meine Konfigurationsdateien verwenden, um selbst ein RootFS zu erstellen. Bitte vergessen Sie nicht, ein make oldconfig durchzuführen, wenn Sie mit einem anderen Snapshot als vom 16. März 2008 arbeiten.