すごいすごいです busybox

busyboxはバージョン0.XXの頃にちょっと触ったぐらいで、あとはディストリのパッケージのを使うぐらいでドキュメントもろくに読んでなかったんで、機能縮小版のコマンド詰め合わせぐらいにしか思ってませんでした。

が、今回、故あってちょっと調べてビビったのでメモります。

コマンドがイッパイ

最新の1.13.3のドキュメントから抜粋します。

[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, 
basename, bbconfig, bbsh, blkid, brctl, bunzip2, busybox, bzcat, 
bzip2, cal, cat, catv, chat, chattr, chcon, chgrp, chmod, chown, 
chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, 
cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, 
deallocvt, delgroup, deluser, depmod, devfsd, devmem, df, 
dhcprelay, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg_deb, 
du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep, eject, env, 
envdir, envuidgid, ether_wake, expand, expr, fakeidentd, false, 
fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, 
fold, free, freeramdisk, fsck, fsck_minix, ftpget, ftpput, fuser, 
getenforce, getopt, getsebool, getty, grep, gunzip, gzip, halt, 
hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, 
hwclock, id, ifconfig, ifdown, ifenslave, ifup, inetd, init, 
inotifyd, insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, 
iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, 
killall5, klogd, lash, last, length, less, linux32, linux64, 
linuxrc, ln, load_policy, loadfont, loadkmap, logger, login, 
logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, 
lzmacat, makedevs, makemime, man, matchpathcon, md5sum, mdev, 
mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod, mkswap, 
mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif, 
nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, parse, 
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, 
restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, 
run_parts, runcon, runlevel, runsv, runsvdir, rx, script, sed, 
selinuxenabled, sendmail, seq, sestatus, setarch, setconsole, 
setenforce, setfiles, setfont, setkeycodes, setlogcons, 
setsebool, setsid, setuidgid, sh, sha1sum, showkey, slattach, 
sleep, softlimit, sort, split, start_stop_daemon, stat, strings, 
stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, 
sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, 
telnet, telnetd, test, tftp, tftpd, time, top, touch, tr, 
traceroute, true, tty, ttysize, tune2fs, udhcpc, udhcpd, udpsvd, 
umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, 
unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, 
watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip

cat, rm, lsあたりの定番コマンドのほかに、ネットワーク系のコマンド: arp, arping, brctl, ifenslave, nameif, nc, ping, nslookup, vconfig, wgetとかあるし、なんでかdnsd, httpd, telnetd, tftpd, udhcpd, lpd, runitとかdaemonの類いもあったりします。すげーすげー

standalone

initramfsの中の/init (shスクリプト)の中でなにげにawkとかsedとか使ってみたら、/bin下とかには存在しないのに使えちゃったので、あーきっとbusyboxなんだろうなーぐらいに思ってたんですが、今回ちょっと調べてみました。

busyboxでコマンドを実行するには、busyboxにつづけてコマンド名を指定する

$ ./busybox awk
BusyBox v1.13.3 (2009-03-09 18:40:49 JST) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE...]
(snip)

か、コマンド名のsymlinkをはります。

$ ln -s busybox awk
$ ./awk
BusyBox v1.13.3 (2009-03-09 18:40:49 JST) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE...]
(snip)

で、も1こ方法があって、
make menuconfig でこんな感じで設定して make して、

  • Busybox Settings ->
    • General Configuration ->
      • [*] exec prefers applets ←これを選択
  • Shells ->
    • [*] Standalone shell ←これを選択

できあがったbusyboxを使って、

$ busybox sh

なふうに起動したシェルでは、PATHより優先してbusyboxが持ってるコマンドが優先されるようになります。/bin/下とかのコマンドはフルパスを指定すれば実行できます。

ただ、busybox shする時点で /proc/ がマウントされていないとダメっぽいです。なのでinitなんかで、/procをマウントする前や終盤で-o moveしたあとは注意です。

gzippedなモジュールをロードできるmodprobe

@hirose31 ./busybox modprobe kvm ってやったら普通に成功しました@busybox-1.13.2。

Sadayuki Furuhashi on Twitter: "@hirose31 ./busybox modprobe kvm ってやったら普通に成功しました@busybox-1.13.2。"

がきっかけで調べてみたところ、

  • Archival Utilities ->
    • [*] Make tar, rpm, modprobe etc understand .gz data

gzip -9 hoge.ko した hoge.ko.gz をロードできるmodprobeが手に入ります。

gzip以外にも、設定次第で lzma, bz2, Z を展開できるようになるようです。

ちなみに、module-init-tools の modprobe も ./configure で

  • --enable-zlib Handle gzipped modules

というのがあるので、これをenaればロードできるようになるんじゃないかと思います。