web-dev-qa-db-ja.com

busyboxリンクを使用してinitramfsイメージを生成する方法は?

私の以前の質問 (ありがとう!)への回答によってinitramfsに誘導されたので、私はinitramfsを機能させることに取り組んできました。これで、カーネルを起動してShell Promptにドロップし、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ノードの作成方法がわかりません。

これらのパスはどちらも厄介なようです。これに対するエレガントな解決策はありますか?

7
pingswept

initramfs を生成しているのはカーネルではなく、 cpio です。したがって、本当に探しているのは、デバイスやシンボリックリンクなどを含むcpioアーカイブを構築する方法です。

メソッド2は、カーネルソースツリーの_usr/gen_init_cpio_を使用して、カーネルビルド中にcpioアーカイブをビルドします。これは確かに、最初にローカルファイルシステムにデータを入力することなくcpioアーカイブを構築するための良い方法です(すべてのデバイスを作成するにはrootである必要があります。または、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の場合、ビルドツリーにシンボリックリンクがない可能性があります。代わりに、コンパイルしたユーティリティごとにシンボリックリンクを作成する必要があります。私が考える最も簡単な方法は、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
' _ {} +
_

私のinitramfsのinitscriptの最初の数行は単純です:

busybox --install -s

シンボリックリンクを作成します。500Mhzボードでは、測定できないほど短い時間しかかかりません。非常に低いハードウェアでは長くなる可能性がありますが、管理しやすい可能性があります。 BBを更新するときに、すべての適切なリンクを作成することを忘れないで、多くの問題を保存します...

10
user6113

あなたがbusyboxシェル(ash)にいる場合、エイリアスはデフォルトで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
_
3