私の以前の質問 (ありがとう!)への回答によってinitramfsに誘導されたので、私はinitramfsを機能させることに取り組んできました。これで、カーネルを起動してShell Promptにドロップし、busyboxコマンドを実行できます。これはすばらしいことです。
ここで私は立ち往生しています-initramfsイメージを生成する方法は(少なくとも)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ノードの作成方法がわかりません。
これらのパスはどちらも厄介なようです。これに対するエレガントな解決策はありますか?
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を更新するときに、すべての適切なリンクを作成することを忘れないで、多くの問題を保存します...
あなたが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
_