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 ←これを選択
- General Configuration ->
- 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ればロードできるようになるんじゃないかと思います。