busyboxリンクでinitramfsイメージを生成するには?

busyboxリンクでinitramfsイメージを生成するには?

initramfsに渡された答え私の前の質問(ありがとう!) 私はinitramfsが正常に動作するように努めてきました。これで、カーネルを起動してbusyboxコマンドを実行できるシェルプロンプトに入ります。本当に素敵なことです。

ここで詰まっている部分があります。 initramfs イメージを生成するには(少なくとも)2つの方法があります。

  1. 圧縮する事前に構築されたディレクトリ階層のパスをカーネルに渡す
  2. 含めるファイルをカーネルに渡してリストします。

2番目の方法はもう少しきれいに見え、使い続けています。

ちなみに、これまでのファイル一覧は次のとおりです。

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

残念ながら、私はbusyboxに他のすべてのコマンドのエイリアスとして機能する長いリンクのリストが必要であることを知りました。ファイルリストに追加できるように、これらすべてのコマンドのリストを生成する方法はありますか?

または、方法1に切り替えて事前に構築されたディレクトリ階層を使用できますが、この場合は/ devノードを作成する方法がわかりません。

どちらの道も混乱しているようです。エレガントな解決策はありますか?

答え1

私のinitramfsのinitscriptの最初の数行は簡単です。

busybox --install -s

あなたのためのシンボリックリンクを作成してください。 500Mhzのマザーボードでは、時間が非常に短く、ハードウェアが非常に低い場合は時間がかかりますが、管理が可能な場合があります。 BBを更新するときに正しいリンクをすべて作成する必要があることに注意してください。これにより、多くの問題を回避できます。

答え2

カーネルによって生成されないファイルシステムの初期化、それCPIO。したがって、実際に必要なのは、デバイス、シンボリックリンクなどを含むcpioアーカイブを構築する方法です。

方法 2 では、カーネルのusr/gen_init_cpio構築プロセス中にカーネルソースツリーを使用して cpio アーカイブを構築します。これは実際にローカルファイルシステムを最初に埋めることなくcpioアーカイブを構築するのに最適な方法です(この方法を使用するには、すべてのデバイスを作成するにはルートが必要かまだ作成されているかわからないfakerootまたはFUSEファイルシステムを使用する必要があります)。

欠落しているのは、入力ファイルをgen_init_cpioビルド段階で生成することだけです。たとえば、シェルでは:

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 …

ビルドツリーに存在するbusyboxへのシンボリックリンクを反映するには、次の方法を使用できます(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 )

すべてのシンボリックリンクをコピーする方法は次のとおりです。

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

busyboxの場合、ビルドツリーにシンボリックリンクがなく、代わりにコンパイルする各ユーティリティに対してシンボリックリンクを作成したい場合があります。私が考える最も簡単な方法は、.*.o.cmdビジボックスビルドツリーでファイルを見ることです。生成された各コマンドには1つのファイルがあります。

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
' _ {} +

答え3

ビジボックスシェルを使用している場合は、デフォルトのIIRCによってエイリアスがコマンドとして実行されるため、エイリアスについて心配する必要はありません。とにかくbusybox --helpサポートされているコマンドのリストを提供してください。私の場合は、次のようになります。

% 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

最初の方法では、mknod(1)コマンドを使用して生成します。たとえば、

# mknod /my/dir/with/initrd/dev/console -m 644 c 5 0

答え4

現在のbusybox(例:1.36.0)は、busybox.links使用時にファイルを生成しますmake install。オプション2で使用してシンボリックリンクを作成できます。あなたがしなければならないことは繰り返すだけです:

...
make install
cat "busybox.links" | while read s; do
    echo "slink $s /bin/busybox 777 0 0" >> initramfs.conf; 
done
cat initramfs.conf

関連情報