Wie generiere ich ein initramfs-Image mit Busybox-Links?

7

Nachdem ich durch eine Antwort auf meine frühere Frage an initramfs verwiesen wurde (danke!), Habe ich daran gearbeitet, initramfs zum Laufen zu bringen. Ich kann jetzt den Kernel booten und zu einer Shell-Eingabeaufforderung wechseln, wo ich Busybox-Befehle ausführen kann, was großartig ist.

Hier stecke ich fest - es gibt (mindestens) zwei Methoden zum Generieren von initramfs-Bildern:

  1. Durch Übergeben des Kernels einen Pfad zu einer vorkomprimierten Verzeichnishierarchie, die komprimiert werden soll
  2. Durch Übergeben des Kernels den Namen einer Datei, in der die einzuschließenden Dateien aufgelistet sind.

Die zweite Methode schien etwas sauberer zu sein, also habe ich sie benutzt.

Nur als Referenz, hier ist meine bisherige Dateiliste:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox /home/brandon/rascal-initramfs/bin/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init /home/brandon/rascal-initramfs/init.sh 755 0 0

Leider habe ich erfahren, dass Busybox eine lange Liste von Links benötigt, um als Aliase für all seine verschiedenen Befehle zu dienen. Gibt es eine Möglichkeit, die Liste aller dieser Befehle zu generieren, damit ich sie meiner Dateiliste hinzufügen kann?

Alternativ könnte ich mithilfe der vorgefertigten Verzeichnishierarchie zu Methode 1 wechseln, bin mir jedoch nicht sicher, wie die / dev-Knoten in diesem Fall erstellt werden sollen.

Beide Wege scheinen chaotisch. Gibt es dafür eine elegante Lösung?

pingswept
quelle
Haben Sie die Antwort von user6113 berücksichtigt? Es scheint eine gute Antwort auf Ihre Frage zu sein.
Léo Léopold Hertz 준영

Antworten:

4

Es ist nicht der Kernel, der die initramfs generiert , sondern cpio . Was Sie also wirklich suchen, ist eine Möglichkeit, ein CPIO-Archiv zu erstellen, das Geräte, symbolische Links usw. enthält.

Ihre Methode 2 verwendet usr/gen_init_cpioim Kernel-Quellbaum das CPIO-Archiv während des Kernel-Builds. Dies ist in der Tat eine gute Möglichkeit, ein cpio-Archiv zu erstellen, ohne zuerst das lokale Dateisystem füllen zu müssen (für die Erstellung aller Geräte müsste root sein oder fakeroot oder ein FUSE-Dateisystem verwenden, von dem ich nicht sicher bin, ob es bereits geschrieben wurde).

Alles, was Sie vermissen, ist das Generieren der Eingabedatei gen_init_cpioals Erstellungsschritt. ZB in der Schale:

INITRAMFS_SOURCE_DIR=/home/brandon/rascal-initramfs
exec >initramfs_source.txt
echo "dir /bin 755 0 0"
echo "file /bin/busybox $INITRAMFS_SOURCE_DIR/bin/busybox 755 0 0"
for x in sh ls cp …; do echo "slink /bin/$x busybox 777 0 0" done
# etc …

Wenn Sie die symbolischen Links zur Busybox widerspiegeln möchten, die in Ihrem Build-Baum vorhanden sind, haben Sie folgende Möglichkeiten (ich nehme an, Sie bauen auf Linux):

( cd "$INITRAMFS_SOURCE_DIR/bin" &&
  for x in *; do
    if [ "$(readlink "$x")" = busybox ]; then
      echo "slink /bin/$x busybox 777 0 0"
    fi
  done )

Hier ist eine Möglichkeit, alle Ihre symbolischen Links zu kopieren:

find "$INITRAMFS_SOURCE_DIR" -type l -printf 'slink %p %l 777 0 0\n'

Bei Busybox verfügt Ihr Build-Baum möglicherweise nicht über die Symlinks. Stattdessen möchten Sie für jedes Dienstprogramm, in dem Sie kompiliert haben, einen erstellen. Der einfachste Weg, den ich mir vorstellen kann, besteht darin, in Ihrem Busybox-Build-Baum nach .*.o.cmdDateien zu suchen : eine pro generiertem Befehl.

find /path/to/busybox/build/tree -name '.*.cmd' -exec sh -c '
    for x; do
      x=${x##*/.}
      echo "slink /bin/${x%%.*} busybox 777 0 0"
    done
' _ {} +
Gilles 'SO - hör auf böse zu sein'
quelle
Fehlt dir eigentlich nicht der gepostete Schritt? Dh kurz nach 'Nur als Referenz, hier ist meine Dateiliste bis jetzt:'?
Maciej Piechotka
1
@Maciej: Guter Punkt, ich hatte nicht daran gedacht, die Frage so zu interpretieren, aber es ist trotzdem eine gute Idee, die Funktionen der ausführbaren Busybox mit der initramfs-Generation abzugleichen.
Gilles 'SO - hör auf böse zu sein'
10

Die ersten Zeilen des Initscript in meinen Initramfs sind einfach:

busybox --install -s

Erstellt die Symlinks für Sie. Es dauert auf meinem 500-MHz-Board nur unermesslich wenig Zeit, möglicherweise länger bei sehr geringer Hardware, aber wahrscheinlich überschaubar. Spart eine Reihe von Problemen, bei denen Sie daran denken, beim Aktualisieren von BB die richtigen Links zu erstellen ...


quelle
3

Wenn Sie sich in der Busybox-Shell (Asche) befinden, müssen Sie sich keine Gedanken über Aliase machen, da diese standardmäßig als Befehle IIRC ausgeführt werden. Wie auch immer, busybox --helpgibt eine Liste der unterstützten Befehle. In meinem Fall sind sie:

% busybox --help
BusyBox v1.17.4 (2010-11-25 12:49:55 GMT) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: function [arguments]...

    BusyBox is a multi-call binary that combines many common Unix
    utilities into a single executable.  Most people will create a
    link to busybox for each function they wish to use and BusyBox
    will act like whatever it was invoked as.

Currently defined functions:
    [, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk,
    basename, bb, bbconfig, bbsh, beep, blkid, bootchartd, brctl, bunzip2,
    bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown,
    chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy,
    cp, cpio, crond, cryptpw, cttyhack, cut, date, dd, deallocvt, delgroup,
    deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg,
    dnsdomainname, dos2unix, dpkg-deb, du, dumpkmap, dumpleases, echo, ed,
    egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, false,
    fbset, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs,
    flash_eraseall, flash_lock, flash_unlock, flashcp, flock, free,
    freeramdisk, fsck, fsck.minix, fsync, ftpd, fuser, getopt, getty, grep,
    gunzip, gzip, halt, hd, hdparm, head, hexdump, hostname, httpd,
    hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, init, insmod,
    install, ionice, ip, ipaddr, ipcrm, ipcs, iplink, iproute, iprule,
    iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less,
    linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login,
    logread, losetup, lpq, lpr, ls, lsattr, lsmod, lspci, lsusb, lzcat,
    lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg,
    microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix,
    mkfs.reiser, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo,
    modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice,
    nmeter, nohup, nslookup, ntpd, openvt, passwd, patch, pgrep, pidof,
    ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, poweroff,
    printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead,
    readlink, readprofile, realpath, reboot, reformime, renice, reset,
    resize, rev, rm, rmdir, rmmod, route, rtcwake, run-parts, runlevel,
    runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch,
    setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh,
    sha1sum, sha256sum, sha512sum, showkey, sleep, smemcap, softlimit,
    sort, split, start-stop-daemon, stat, strings, stty, su, sum, sv,
    svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail,
    tar, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top,
    touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl,
    tune2fs, ubiattach, ubidetach, udhcpc, udhcpd, umount, uname,
    uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip,
    uptime, usleep, vconfig, vi, vlock, volname, wall, watch, watchdog, wc,
    wget, which, who, whoami, xargs, xz, xzcat, yes, zcat, zcip

Bei der ersten Methode erstellen Sie per mknod(1)Befehl. Zum Beispiel:

# mknod /my/dir/with/initrd/dev/console -m 644 c 5 0
Maciej Piechotka
quelle
Im Fall des OP wird dies busybox --helpwahrscheinlich nur zu busybox: cannot execute binary file... Die meisten eingebetteten Entwicklungen werden übergreifend kompiliert. Wir wissen, dass Pingswept für Arm kompiliert wird, und er kompiliert wahrscheinlich auf i386 oder amd64.
Gilles 'SO - hör auf böse zu sein'
Ja, das ist tatsächlich wahr. Ich kann busybox --help ausführen, sobald ich den Kernel auf der ARM-Karte gestartet habe. Das ist nützlich, aber es hilft nicht so sehr beim Generieren des initramfs-Images.
Pingswept
@ Gilles: Ich nahm an, dass jemand, der den Kernel überkompiliert, darüber nachdachte und zum Beispiel im Emulator lief. @pingswept: Möglicherweise hilft die obige Liste.
Maciej Piechotka
Bei der Arbeit hat unsere automatisierte Build-Umgebung keinen Zugriff auf einen Emulator. Ich denke, das ist die Norm in der eingebetteten Entwicklung.
Gilles 'SO - hör auf böse zu sein'