1 <!--#include file="header.html" -->
2 <title>Toybox Roadmap</title>
4 <h2>Goals and use cases</h2>
6 <p>We have several potential use cases for a new set of command line
7 utilities, and are using those to determine which commands to implement
8 for Toybox's 1.0 release.</p>
10 <p>The most interesting standards are POSIX-2008 (also known as the Single
11 Unix Specification version 4) and the Linux Standard Base (version 4.1).
12 The main test harness including toybox in Aboriginal Linux and if that can
13 build itself using the result to build Linux From Scratch (version 6.8).
14 We also aim to replace Android's Toolbox.</p>
16 <p>At a secondary level we'd like to meet other use cases. We've analyzed
17 the commands provided by similar projects (klibc, sash, sbase, s6, embutils,
18 nash, and beastiebox), along with various vendor configurations of busybox,
19 and some end user requests.</p>
21 <p>Finally, we'd like to provide a good replacement for the Bash shell,
22 which was the first program Linux ever ran and remains the standard shell
23 of Linux no matter what Ubuntu says. This doesn't mean including the full
24 set of Bash 4.x functionality, but does involve {various,features} beyond
27 <p>See the <a href=status.html>status page</a> for the combined list
28 and progress towards implementing it.</p>
31 <li><a href=#susv4>POSIX-2008/SUSv4</a></li>
32 <li><a href=#sigh>Linux "Standard" Base</a></li>
33 <li><a href=#dev_env>Development Environment</a></li>
34 <li><a href=#android>Android Toolbox</a></li>
35 <li>Miscelaneous: <a href=#klibc>klibc</a>, <a href=#sash>sash</a>,
36 <a href=#sbase>sbase</a>, <a href=#s6>s6</a>...</li>
41 <h2>Use case: standards compliance.</h2>
43 <h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3>
44 <p>The best standards are the kind that describe reality, rather than
45 attempting to impose a new one. (I.E. a good standard should document, not
48 <p>The kind of standards which describe existing reality tend to be approved by
49 more than one standards body, such ANSI and ISO both approving C. That's why
50 the IEEE POSIX committee's 2008 standard, the Single Unix Specification version
51 4, and the Open Group Base Specification edition 7 are all the same standard
52 from three sources.</p>
54 <p>The <a href="http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html">"utilities"
56 of these standards is devoted to the unix command line, and are the best such
57 standard for our purposes. (My earlier work on BusyBox was implemented with
58 regard to SUSv3, an earlier version of this standard.)</p>
60 <h3>Problems with the standard</h3>
62 <p>Unfortunately, these standards describe a subset of reality, lacking any
63 mention of commands such as init, login, or mount required to actually boot a
64 system. It provides ipcrm and ipcs, but not ipcmk, so you can use System V IPC
65 resources but not create them.</p>
67 <p>These standards also contain a large number of commands that are
68 inappropriate for toybox to implement in its 1.0 release. (Perhaps some of
69 these could be reintroduced in later releases, but not now.)</p>
71 <p>Starting with the full "utilities" list, we first remove generally obsolete
72 commands (compess ed ex pr uncompress uccp uustat uux), commands for the
73 pre-CVS "SCCS" source control system (admin delta get prs rmdel sact sccs unget
74 val what), fortran support (asa fort77), and batch processing support (batch
75 qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub).</p>
77 <p>Some commands are for a compiler toolchain (ar c99 cflow ctags cxref gencat
78 iconv lex m4 make nm strings strip tsort yacc), which is outside of toybox's
79 mandate and should be supplied externally. (Again, some of these may be
80 revisited later, but not for toybox 1.0.)</p>
82 <p>Some commands are part of a command shell, and cannot be implemented as
83 separate executables (alias bg cd command fc fg getopts hash jobs kill read
84 type ulimit umask unalias wait). These may be revisited as part of a built-in
85 toybox shell, but are not exported into $PATH via symlinks. (If you fork a
86 child process and have it "cd" then exit, you've accomplished nothing.)</p>
88 <p>A few other commands are judgement calls, providing command-line
89 internationalization support (iconv locale localedef), System V inter-process
90 communication (ipcrm ipcs), and cross-tty communication from the minicomputer
91 days (talk mesg write). The "pax" utility was supplanted by tar, "mailx" is
92 a command line email client, and "lp" submits files for printing to... what
93 exactly? (cups?) The standard defines crontab but not crond.</p>
95 <p>Removing all of that leaves the following commands, which toybox should
100 at awk basename bc cal cat chgrp chmod chown cksum cmp comm cp
101 csplit cut date dd df diff dirname du echo env expand expr false file find
102 fold fuser getconf grep head id join kill link ln logger logname ls man
103 mkdir mkfifo more mv newgrp nice nl nohup od paste patch pathchk printf ps
104 pwd renice rm rmdir sed sh sleep sort split stty tabs tail tee test time
105 touch tput tr true tty uname unexpand uniq unlink uudecode uuencode vi wc
110 <h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3>
112 <p>One attempt to supplement POSIX towards an actual usable system was the
113 Linux Standard Base. Unfortunately, the quality of this "standard" is
116 <p>POSIX allowed its standards process to be compromised
117 by leaving things out, thus allowing IBM mainframes and Windows NT to drive
118 a truck through the holes and declare themselves compilant. But it means what
119 they DID standardize tends to be respected.</p>
121 <p>The Linux Standard Base's failure mode is different, they respond to
122 pressure by including special-case crap, such as allowing Red Hat to shoehorn
123 RPM on the standard even though all sorts of distros (Debian, Slackware, Arch,
124 Gentoo) don't use it and probably never will. This means anything in the LSB is
125 at best a suggestion: arbitrary portions of this standard are widely
128 <p>The LSB does specify a <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html>list of command line
132 ar at awk batch bc chfn chsh col cpio crontab df dmesg du echo egrep
133 fgrep file fuser gettext grep groupadd groupdel groupmod groups
134 gunzip gzip hostname install install_initd ipcrm ipcs killall lpr ls
135 lsb_release m4 md5sum mknod mktemp more mount msgfmt newgrp od passwd
136 patch pidof remove_initd renice sed sendmail seq sh shutdown su sync
137 tar umount useradd userdel usermod xargs zcat
140 <p>Where posix specifies one of those commands, LSB's deltas tend to be
141 accomodations for broken tool versions which aren't up to date with the
142 standard yet. (See <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/more.html>more</a> and <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/xargs.html>xargs</a>
145 <p>Since we've already committed to using our own judgement to skip bits of
146 POSIX, and LSB's "judgement" in this regard is purely bug workarounds to declare
147 various legacy tool implementations "compliant", this means we're mostly
148 interested in the set of tools that aren't specified in posix at all.</p>
150 <p>Of these, gettext and msgfmt are internationalization, install_initd and
151 remove_initd aren't present on ubuntu 10.04, lpr is out of scope, and
152 lsb_release is a distro issue (it's a nice command, but the output of
153 lsb_release -a is the name and version number of the linux distro you're
154 running, which toybox doesn't know).</p>
160 chfn chsh dmesg egrep fgrep groupadd groupdel groupmod groups
161 gunzip gzip hostname install killall md5sum
162 mknod mktemp mount passwd pidof sendmail seq shutdown
163 su sync tar umount useradd userdel usermod zcat
169 <h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2>
171 <p>The following commands are enough to build the Aboriginal Linux development
172 environment, boot it to a shell prompt, and build Linux From Scratch 6.8 under
173 it. (Aboriginal Linux currently uses BusyBox for this, thus provides a
174 drop-in test environment for toybox. We install both implementations side
175 by side, redirecting the symlinks a command at a time until the older
176 package is no longer used, and can be removed.)</p>
178 <p>This use case includes running init scripts and other shell scripts, running
179 configure, make, and install in each package, and providing basic command line
180 facilities such as a text editor. (It does not include a compiler toolchain or
181 C library, those are outside the scope of this project.)</p>
184 <span id=development>
185 bzcat cat cp dirname echo env patch rmdir sha1sum sleep sort sync
186 true uname wc which yes zcat
187 awk basename bzip2 chmod chown cmp cut date dd diff
188 egrep expr find grep gzip head hostname id install ln ls
189 mkdir mktemp mv od readlink rm sed sh tail tar touch tr uniq
190 wget whoami xargs chgrp comm gunzip less logname man split
191 tee test time bunzip2 chgrp chroot comm cpio dmesg
192 dnsdomainname ftpd ftpget ftpput gunzip ifconfig init less
193 logname losetup man mdev mount mountpoint nc pgrep pkill
194 pwd route split stat switch_root tac umount vi
198 <p>Note: Aboriginal Linux installs bash 2.05b as #!/bin/sh and its scripts
199 require bash extensions not present in shells such as busybox ash.
200 This means that toysh needs to supply several bash extensions _and_ work
201 when called under the name "bash".</p>
204 <h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2>
206 <p>Android has a policy against GPL in userspace, so even though BusyBox
207 predates Android by many years, they couldn't use it. Instead they grabbed
208 an old version of ash and implemented their own command line utility set
209 called "toolbox".</p>
211 <p>Toolbox doesn't have its own repository, instead it's part of Android's
212 <a href=https://android.googlesource.com/platform/system/core>system/core
213 git repository</a> (this analysis looked at commit 51ccef27cab58).</p>
215 <h3>Toolbox commands:</h3>
217 <p>According to core/toolbox/Android.mk the toolbox directory builds the
218 following commands:</p>
221 ls mount cat ps kill ln insmod rmmod lsmod ifconfig setconsole
222 rm mkdir rmdir reboot getevent sendevent date wipe sync umount
223 start stop notify cmp dmesg route hd dd df getprop setprop watchprops
224 log sleep renice printenv smd chmod chown newfs_msdos netstat ioctl
225 mv schedtop top iftop id uptime vmstat nandread ionice touch lsof md5 r
229 <p>If selinux is enabled, you also get:</p>
231 getenforce setenforce chcon restorecon runcon getsebool setsebool load_policy
234 <p>The Android.mk file also refers to dynarray.c and toolbox.c as library
235 code. This leaves the following apparently unused C files in toolbox/*.c, each
236 of which has a command_main() function and seems to implement a standalone
240 alarm exists lsusb readtty rotatefb setkey syren
243 <h3>Command shell (ash)</h3>
245 <p>The core/sh subdirectory contains a fork of ash 1.17, and sucks in
246 liblinenoise to provide command line history/editing.</p>
248 <h3>Other Android core commands</h3>
250 <p>Other than the toolbox and sh directories, the currently interesting
251 subdirectories in the core repository are fs_mgr, gpttool, init,
252 logcat, logwrapper, mkbootimg, netcfg, run-as, and sdcard.</p>
255 <li><b>fs_mgr</b> - subset of mount</li>
256 <li><b>gpttool</b> - subset of fdisk</li>
257 <li><b>init</b> - Android's PID 1</li>
258 <li><b>logcat</b> - read android log format</li>
259 <li><b>logwrapper</b> - redirect stdio to android log</li>
260 <li><b>mkbootimg</b> - create signed boot image</li>
261 <li><b>netcfg</b> - network configuration (sucks in libnetutils)</li>
262 <li><b>run-as</b> - subset of sudo</li>
263 <li><b>sdcard</b> - FUSE wrapper to squash UID/GID/permissions to what FAT supports.</li>
266 <p>Almost all of these reinvent an existing wheel with less functionality and a
267 different user interface. We may want to provide that interface, but
268 implementing the full commands (mount, fdisk, init, ifconfig with dhcp,
269 and sudo) come first.</p>
271 <p>Although logcat/logwrapper also reinvent a wheel, Android did so in the
272 kernel and these provide an interface to that.</p>
274 <p>Also, gpttool and mkbootimg are install tools, and sdcard looks like a
275 testing tool. These aren't a priority if android wants to use its own
276 bespoke code to install itself.</p>
280 <p>For reference, combining everything listed above, we get:</p>
283 alarm ash cat chcon chmod chown cmp cp date dd df dmesg du exists fs_mgr
285 getevent getprop getsebool gpttool grep hd id ifconfig iftop init insmod ioctl
286 ionice kill ln load_policy log logcat logwrapper ls lsmod lsof lsusb md5
287 mkbootimg mkdir mount mv nandread netcfg netstat newfs_msdos notify printenv
288 ps r readtty reboot renice restorecon rm rmdir rmmod rotatefb route run-as
289 runcon schedtop sdcard sendevent setconsole setenforce setkey setprop setsebool
290 sleep smd start stop sync syren top touch umount uptime vmstat watchdogd
294 <p>We may eventually implement all of that, but for toybox 1.0 we need to
295 focus a bit. For our first pass, let's ignore selinux, strip out the "unlisted"
296 commands except lsusb, and grab just logcat and logwrapper from the "core"
297 commands (since the rest have some full/standard version providing that
298 functionality, which we can implement a shim interface for later).</p>
300 <p>This means toybox should implement:</p>
303 cat chmod chown cmp cp date dd df dmesg du getevent getprop grep hd id ifconfig
304 iftop insmod ioctl ionice kill ln log logcat logwrapper ls lsmod lsof lsusb md5
305 mkdir mount mv nandread
306 netstat newfs_msdos notify printenv ps r reboot renice rm rmdir rmmod route
307 schedtop sendevent setconsole setprop sleep smd start stop sync top touch
308 umount uptime vmstat watchprops watchdogd wipe
312 <p>The following Toolbox commands are already covered in previous
313 sections of this analysis:</p>
316 cat chmod chown cmp cp date dd df dmesg du grep id ifconfig insmod kill ln ls
317 lsmod mkdir mount mv ps renice rm rmdir rmmod route sleep sync top touch umount
320 <p>Which leaves the following commands as new from Toolbox:</p>
323 getevent getprop hd iftop ioctl ionice log lsof nandread netstat
324 newfs_msdos notify printenv r reboot schedtop sendevent setconsole
325 setprop smd start stop top uptime vmstat watchprops watchdogd wipe
328 <hr /><a name=klibc />
331 <p>Long ago some kernel developers came up with a project called
332 <a href=http://en.wikipedia.org/wiki/Klibc>klibc</a>.
333 After a decade of development it still has no web page or HOWTO,
334 and nobody's quite sure if the license is BSD or GPL. It inexplicably
335 <a href=http://www.infoworld.com/d/data-center/perl-isnt-going-anywhere-better-or-worse-211580>requires perl to build</a>, and seems like an ideal candidate for
338 <p>In addition to a C library even less capable than bionic (obsoleted by
339 musl), klibc builds a random assortment of executables to run init scripts
340 with. There's no multiplexer command, these are individual executables:</p>
343 cat chroot cpio dd dmesg false fixdep fstype gunzip gzip halt ipconfig kill
344 kinit ln losetup ls minips mkdir mkfifo mknodes
345 mksyntax mount mv nfsmount nuke pivot_root poweroff readlink reboot resume
346 run-init sh sha1hash sleep sync true umount uname zcat
349 <p>To get that list, build klibc according to the instructions (I
350 <a href=http://landley.net/notes-2013.html#23-01-2013>looked at</a> version
351 2.0.2 and did cd klibc-*; ln -s /output/of/kernel/make/headers_install
352 linux; make) then <b>echo $(for i in $(find . -type f); do file $i | grep -q
353 executable && basename $i; done | grep -v '[.]g$' | sort -u)</b> to find
354 executables, then eliminated the *.so files and *.shared duplicates.</p>
356 <p>Some of those binaries are build-time tools that don't get installed,
357 which removes mknodes, mksyntax, sha1hash, and fixdep from the list.
358 (And sha1hash is just an unpolished sha1sum anyway.)</p>
360 <p>The run-init command is more commonly called switch_root, nuke is just
361 "rm -rf -- $@", and minips is more commonly called "ps". I'm not doing aliases
362 for the oddball names.</p>
364 <p>Yet more stale forks of dash and gzip sucked in here (see "dubious
365 license terms" above), adding nothing to the other projects we've looked at.
366 But we still need sh, gunzip, gzip, and zcat to replace this package.</p>
368 <p>By the time I did the analysis toybox already had cat, chroot, dmesg, false,
369 kill, ln, losetup, ls, mkdir, mkfifo, readlink, rm, switch_root, sleep, sync,
372 <p>The low hanging fruit is cpio, dd, ps, mv, and pivot_root.</p>
374 <p>The "kinit" command is another gratuitous rename, it's init running as PID 1.
375 The halt, poweroff, and reboot commands work with it.</p>
377 <p>I've got mount and umount queued up already, fstype and nfsmount go with
378 those. (And probably smbmount and p9mount, but this hasn't got one. Those
379 are all about querying for login credentials, probably workable into the
380 base mount command.)</p>
382 <p>The ipconfig command here has a built in dhcp client, so it's ifconfig
383 and dhcpcd and maybe some other stuff.</p>
385 <p>The resume command is... weird. It finds a swap partition and reads data
386 from it into a /proc file, something the kernel is capable of doing itself.
387 (Even though the klibc author
388 <a href=http://www.zytor.com/pipermail/klibc/2006-June/001748.html>attempted
389 to remove</a> that capability from the kernel, current kernel/power/hibernate.c
390 still parses "resume=" on the command line). And yet various distros seem to
391 make use of klibc for this>
392 Given the history of swsusp/hibernate (and
393 <a href=http://lwn.net/Articles/333007>TuxOnIce</a>
394 and <a href=http://lwn.net/Articles/242107>kexec jump</a>) I've lost track
395 of the current state of the art here. Ah, Documentation/power/userland-swsusp.txt
396 has the API docs, and <a href=http://suspend.sf.net>here's a better
399 <p>So the list of things actually in klibc are:</p>
403 cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root
404 sleep sync true uname
406 cpio dd ps mv pivot_root
407 mount nfsmount fstype umount
409 kinit halt poweroff reboot
417 <h2>Stand-Alone Shell</h2>
419 <p>Wikipedia has <a href=http://en.wikipedia.org/wiki/Stand-alone_shell>a good
420 summary of sash</a>, with links. The original Stand-Alone Shell project reached
421 a stopping point, and then <a href=http://www.baiti.net/sash>"sash plus
422 patches"</a> extended it a bit further. The result is a megabyte executable
423 that provides 40 commands.</p>
425 <p>Sash is a shell with built-in commands. It doesn't have a multiplexer
426 command, meaning "sash ls -l" doesn't work (you have to go "sash -c 'ls -l'").
429 <p>The list of commands can be obtained via building it and doing
430 "echo help | ./sash | awk '{print $1}' | sed 's/^-//' | xargs echo", which
434 alias aliasall ar cd chattr chgrp chmod chown cmp cp chroot dd echo ed exec
435 exit file find grep gunzip gzip help kill losetup losetup ln ls lsattr mkdir
436 mknod more mount mv pivot_root printenv prompt pwd quit rm rmdir setenv source
437 sum sync tar touch umask umount unalias where
440 <p>Plus sh because it's a shell. A dozen or so commands can only sanely be
441 implemented as shell builtins (alias aliasall cd exec exit prompt quit setenv
442 source umask unalias), where is an alias for which, and at triage time toybox
443 already has chgrp, chmod, chown, cmp, cp, chroot, echo, help, kill, losetup,
444 ln, ls, mkdir, mknod, printenv, pwd, rm, rmdir, sync, and touch.</p>
450 ar chattr dd ed file find grep gunzip gzip lsattr more mount mv pivot_root
455 <p>(For once, this project doesn't include a fork of gzip, instead
456 it sucks in -lz from the host.)</p>
462 <p>It's <a href=http://git.suckless.org/sbase>on suckless</a>. So far it's
467 basename cat chmod chown cksum cmp cp date dirname echo false fold grep head
468 kill ln ls mc mkdir mkfifo mv nl nohup pwd rm seq sleep sort tail tee test
469 touch true tty uname uniq wc yes
473 <p>And has a TODO list:</p>
477 cal chgrp chvt comm cut df diff du env expand expr id md5sum nice paste
478 printenv printf readlink rmdir seq sha1sum split sync test tr unexpand unlink
483 <p>At triage time, of the first list I still need to do: fold grep mc mv nl. Of
484 the second list: diff expr paste printf split test tr unexpand who.</p>
490 <p>The website <a href=http://skarnet.org/software/>skarnet</a> has a bunch
491 of small utilities as part of something called "s6". This includes the
492 <a href=http://skarnet.org/software/s6-portable-utils>s6-portabile-utils</a>
493 and the <a href=http://skarnet.org/software/s6-linux-utils>s6-linux-utils</a>.
496 <p>Both packages rely on multiple bespoke external libraries without which
497 they can't compile. The source is completely uncommented and doesn't wrap at
498 80 characters. Doing a find for *.c files brings up the following commands:</p>
502 basename cat chmod chown chroot clock cut devd dirname echo env expr false
503 format-filter freeramdisk grep halt head hiercopy hostname linkname ln
504 logwatch ls maximumtime memoryhog mkdir mkfifo mount nice nuke pause
505 pivotchroot poweroff printenv quote quote-filter reboot rename rmrf sleep
506 sort swapoff swapon sync tail test touch true umount uniquename unquote
507 unquote-filter update-symlinks
511 <p>Triage: memoryhog isn't even listed on the website nor does it have
512 a documentation file, clock seems like a subset
513 of date, devd is some sort of netlink wrapper that spawns its command line
514 every time it gets a message (maybe this is meant to implement part of
515 udev/mdev?), format-filter is sort of awk's '{print $2}' function split out
516 into its own command, hiercopy a subset of "cp -r", maximumtime is something
517 I implemented as a shell script (more/timeout.sh in Aboriginal Linux),
518 nuke isn't the same as klibc (this one's "kill SIG -1" only with hardwared
519 SIG options), pause is a program that literally waits to be killed (I
520 generally sleep 999999999 which is a little over 30 years),
521 pivotchroot is a subset of switch_root, rmrf is rm -rf...</p>
523 <p>I see "nuke" resurface, and if "rmrf" wasn't also here I might think
524 klibc had a point.</b>
527 basename cat chmod chown chroot cut dirname echo env expr false
528 freeramdisk grep halt head hostname linkname ln
529 logwatch ls mkdir mkfifo mount nice
530 pivotchroot poweroff printenv quote quote-filter reboot rename sleep
531 sort swapoff swapon sync tail test touch true umount uniquename unquote
532 unquote-filter update-symlinks
540 <p>Red Hat's nash was part of its "mkinitrd" package, replacement for a shell
541 and utilities on the boot floppy back in the 1990's (the same general idea
542 as BusyBox, developed independently). Red Hat discontinued nash development
543 in 2010, replacing it with dracut (which collects together existing packages,
544 including busybox).</p>
546 <p>I couldn't figure out how to beat source code out of
547 <a href=http://pkgs.fedoraproject.org/git/mkinitrd>Fedora's current git</a>
548 repository. The last release version that used it was Fedora Core 12
549 which has <a href=http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/mkinitrd-6.0.93-1.fc12.src.rpm>a source rpm</a>
550 that can be unwound with "rpm2cpio mkinitrd.src.rpm | cpio -i -d -H newc
551 --no-absolute-filenames" and in there is a mkinitrd-6.0.93.tar.bz2 which
554 <p>In addition to being a bit like a command shell, the nash man page lists the
555 following commands:</p>
558 access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount
559 pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount
562 <p>Oddly, the only occurrence of the string pivot_root in the nash source code
563 is in the man page, the command isn't there. (It seems to have been removed
564 when the underscoreless switchroot went in.)</p>
566 <p>A more complete list seems to be the handlers[] array in nash.c:</p>
569 access buildEnv cat cond cp daemonize dm echo exec exit find kernelopt
570 loadDrivers loadpolicy mkchardevs mkblktab mkblkdevs mkdir mkdmnod mknod
571 mkrootdev mount netname network null plymouth hotplug killplug losetup
572 ln ls raidautorun readlink resume resolveDevice rmparts setDeviceEnv
573 setquiet setuproot showelfinterp showlabels sleep stabilized status switchroot
577 <p>This list is nuts: "plymouth" is an alias for "null" which is basically
578 "true" (which thie above list doesn't have). Things like buildEnv and
579 loadDrivers are bespoke Red Hat behavior that might as well be hardwired in
580 to nash's main() without being called.</p>
582 <p>Instead of eliminating items
583 from the list with an explanation for each, I'm just going to cherry pick
584 a few: the device mapper (dm, raidautorun) is probably interesting,
585 hotplug (may be obsolete due to kernel changes that now load firmware
586 directly), and another "resume" ala klibc.</p>
588 <p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p>
590 <p>Verdict: ignore</p>
593 <a name=beastiebox />
596 <p>Back in 2008, the BSD guys vented some busybox-envy
597 <a href=http://beastiebox.sourceforge.net>on sourceforge</a>. Then stopped.
598 Their repository is still in CVS, hasn't been touched in years, it's a giant
599 hairball of existing code sucked together. (The web page says the author
600 is aware of crunchgen, but decided to do this by hand anyway. This is not
601 a collection of new code, it's a katamari of existing code rolled up in a
604 <p>Combining the set of commands listed on the web page with the set of
605 man pages in the source gives us:</P>
608 [ cat chmod cp csh date df disklabel dmesg echo ex fdisk fsck fsck_ffs getty
609 halt hostname ifconfig init kill less lesskey ln login ls lv mksh more mount
610 mount_ffs mv pfctl ping poweroff ps reboot rm route sed sh stty sysctl tar test
611 traceroute umount vi wiconfig
614 <p>Apparently lv is the missing link ed and vi, copyright 1982-1997 (do not
615 want), ex is another obsolete vi mode, lesskey is "used to
616 specify a set of key bindings to be used with less", and csh is a shell they
617 sucked in, [ is an alias for test. Several more bsd-isms that don't have Linux
618 equivalents (even in the ubuntu "install this package" search) are
619 disklabel, fsck_ffs, mount_ffs, and pfctl. And wiconfig is a wavelan interface
620 network card driver utility. Subtracting all that and the commands toybox
621 already implements at triage time, we get:</p>
624 <span id=beastiebox_cmd>
625 fdisk fsck getty halt ifconfig init kill less mksh more mount mv ping poweroff
626 ps reboot route sed sh stty sysctl tar test traceroute umount vi
630 <p>Not a hugely interesting list, but eh.</p>
632 <p>Verdict: ignore</p>
638 <p>Somebody decided to do a <a href=https://wiki.freebsd.org/AdrianChadd/BsdBox>multicall binary for freebsd</a>.</p>
640 <p>They based it on crunchgen, a tool that glues existing programs together
641 into an archive and uses the name to execute the right one. It has no
642 simplification or code sharing benefits whatsoever, it's basically an
643 archiver that produces executables.</p>
645 <p>That's about where I stopped reading.</p>
647 <p>Verdict: ignore.</p>
651 <h2>OpenSolaris Busybox</h2>
653 <p>Somebody <a href=http://hub.opensolaris.org/bin/view/Project+busybox/>wrote
654 a wiki page</a> saying that Busybox for OpenSolaris would be a good idea.</p>
656 <p>The corresponding "files" tab is an auto-generated stub. The project never
657 even got as far as suggesting commands to include before Oracle discontinued
660 <p>Verdict: ignore.</p>
665 <p>The following additional commands have been requested by various users:</p>
668 dig freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root
669 poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath
670 traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w
671 ntpd iwconfig iwlist rdate
675 <!-- #include "footer.html" -->