Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 1 | <!--#include file="header.html" --> |
| 2 | <title>Toybox Roadmap</title> |
| 3 | |
| 4 | <h2>Goals and use cases</h2> |
| 5 | |
| 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> |
| 9 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 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> |
| 15 | |
| 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> |
| 20 | |
| 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 |
| 25 | posix.</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 26 | |
| 27 | <p>See the <a href=status.html>status page</a> for the combined list |
| 28 | and progress towards implementing it.</p> |
| 29 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 30 | <ul> |
| 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>, |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 36 | <a href=#sbase>sbase</a>, <a href=#s6>s6</a>...</li> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 37 | </ul> |
| 38 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 39 | <hr /> |
| 40 | <a name="standards"> |
| 41 | <h2>Use case: standards compliance.</h2> |
| 42 | |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 43 | <h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 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 |
| 46 | legislate.)</p> |
| 47 | |
| 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> |
| 53 | |
Rob Landley | 62f0021 | 2012-12-06 15:15:30 -0600 | [diff] [blame] | 54 | <p>The <a href="http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html">"utilities" |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 55 | section</a> |
| 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> |
| 59 | |
| 60 | <h3>Problems with the standard</h3> |
| 61 | |
| 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> |
| 66 | |
| 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> |
| 70 | |
| 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> |
| 76 | |
| 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> |
| 81 | |
| 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> |
| 87 | |
| 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> |
| 94 | |
| 95 | <p>Removing all of that leaves the following commands, which toybox should |
| 96 | implement:</p> |
| 97 | |
| 98 | <blockquote><b> |
| 99 | <span id=posix> |
| 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 |
| 106 | who xargs zcat |
| 107 | </span> |
| 108 | </b></blockquote> |
| 109 | |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 110 | <h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 111 | |
| 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 |
| 114 | fairly low.</p> |
| 115 | |
| 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> |
| 120 | |
| 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 |
Rob Landley | 62f0021 | 2012-12-06 15:15:30 -0600 | [diff] [blame] | 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 |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 125 | at best a suggestion: arbitrary portions of this standard are widely |
| 126 | ignored.</p> |
| 127 | |
| 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 |
| 129 | utilities</a>:</p> |
| 130 | |
| 131 | <blockquote><b> |
| 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 |
| 138 | </b></blockquote> |
| 139 | |
| 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> |
| 143 | for examples.)</p> |
| 144 | |
| 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> |
| 149 | |
| 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> |
| 155 | |
| 156 | <p>This leaves:</p> |
| 157 | |
| 158 | <blockquote><b> |
| 159 | <span id=lsb> |
| 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 |
| 164 | </span> |
| 165 | </b></blockquote> |
| 166 | |
| 167 | <hr /> |
| 168 | <a name="dev_env"> |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 169 | <h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 170 | |
| 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> |
| 177 | |
| 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> |
| 182 | |
| 183 | <blockquote><b> |
| 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 |
| 195 | </span> |
| 196 | </b></blockquote> |
| 197 | |
| 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> |
| 202 | |
| 203 | <hr /> |
Rob Landley | 571b070 | 2012-11-13 16:13:45 -0600 | [diff] [blame] | 204 | <h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 205 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 210 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 214 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 215 | <h3>Toolbox commands:</h3> |
| 216 | |
| 217 | <p>According to core/toolbox/Android.mk the toolbox directory builds the |
| 218 | following commands:</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 219 | |
| 220 | <blockquote><b> |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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 |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 226 | cp du grep watchdogd |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 227 | </b></blockquote> |
| 228 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 229 | <p>If selinux is enabled, you also get:</p> |
| 230 | <blockquote><b> |
| 231 | getenforce setenforce chcon restorecon runcon getsebool setsebool load_policy |
| 232 | </b></blockquote> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 233 | |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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 |
| 237 | command:</p> |
| 238 | |
| 239 | <blockquote><b> |
| 240 | alarm exists lsusb readtty rotatefb setkey syren |
| 241 | </b></blockquote> |
| 242 | |
| 243 | <h3>Command shell (ash)</h3> |
| 244 | |
| 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> |
| 247 | |
| 248 | <h3>Other Android core commands</h3> |
| 249 | |
| 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> |
| 253 | |
| 254 | <ul> |
| 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> |
| 264 | </ul> |
| 265 | |
| 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> |
| 270 | |
| 271 | <p>Although logcat/logwrapper also reinvent a wheel, Android did so in the |
| 272 | kernel and these provide an interface to that.</p> |
| 273 | |
| 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> |
| 277 | |
| 278 | <h3>Analysis</h3> |
| 279 | |
| 280 | <p>For reference, combining everything listed above, we get:</p> |
| 281 | |
| 282 | <blockquote><b> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 283 | alarm ash cat chcon chmod chown cmp cp date dd df dmesg du exists fs_mgr |
| 284 | getenforce |
| 285 | getevent getprop getsebool gpttool grep hd id ifconfig iftop init insmod ioctl |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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 |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 290 | sleep smd start stop sync syren top touch umount uptime vmstat watchdogd |
| 291 | watchprops wipe |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 292 | </b></blockquote> |
| 293 | |
| 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> |
| 299 | |
| 300 | <p>This means toybox should implement:</p> |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 301 | <blockquote><b> |
| 302 | <span id=toolbox> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 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 |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 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 |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 308 | umount uptime vmstat watchprops watchdogd wipe |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 309 | </span> |
Rob Landley | c26ca6e | 2013-01-31 04:05:56 -0600 | [diff] [blame] | 310 | </b></blockquote> |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 311 | |
| 312 | <p>The following Toolbox commands are already covered in previous |
| 313 | sections of this analysis:</p> |
| 314 | |
| 315 | <blockquote><b> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 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 |
Rob Landley | fdc10c9 | 2012-10-16 17:09:30 -0500 | [diff] [blame] | 318 | </b></blockquote> |
| 319 | |
| 320 | <p>Which leaves the following commands as new from Toolbox:</p> |
| 321 | |
| 322 | <blockquote><b> |
| 323 | getevent getprop hd iftop ioctl ionice log lsof nandread netstat |
| 324 | newfs_msdos notify printenv r reboot schedtop sendevent setconsole |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 325 | setprop smd start stop top uptime vmstat watchprops watchdogd wipe |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 326 | </b></blockquote> |
| 327 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 328 | <hr /><a name=klibc /> |
Rob Landley | 934b2d3 | 2013-05-10 18:54:14 -0500 | [diff] [blame^] | 329 | <h2>klibc:</h2> |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 330 | |
| 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 |
| 336 | replacement.</p> |
| 337 | |
| 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> |
| 341 | |
| 342 | <blockquote><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 |
| 347 | </p></blockquote> |
| 348 | |
| 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> |
| 355 | |
| 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> |
| 359 | |
| 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> |
| 363 | |
| 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> |
| 367 | |
| 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, |
| 370 | true, and uname.</p> |
| 371 | |
| 372 | <p>The low hanging fruit is cpio, dd, ps, mv, and pivot_root.</p> |
| 373 | |
| 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> |
| 376 | |
| 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> |
| 381 | |
| 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> |
| 384 | |
| 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 |
| 397 | tool</a>...</p> |
| 398 | |
| 399 | <p>So the list of things actually in klibc are:</p> |
| 400 | |
| 401 | <blockquote><b> |
| 402 | <span id=klibc_cmd /> |
| 403 | cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root |
| 404 | sleep sync true uname |
| 405 | |
| 406 | cpio dd ps mv pivot_root |
| 407 | mount nfsmount fstype umount |
| 408 | sh gunzip gzip zcat |
| 409 | kinit halt poweroff reboot |
| 410 | ipconfig |
| 411 | resume |
| 412 | </span> |
| 413 | </b></blockquote> |
| 414 | |
| 415 | <hr /> |
| 416 | <a name=sash /> |
| 417 | <h2>Stand-Alone Shell</h2> |
| 418 | |
| 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> |
| 424 | |
| 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'"). |
| 427 | </p> |
| 428 | |
| 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 |
| 431 | gives us:</p> |
| 432 | |
| 433 | <blockquote><b> |
| 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 |
| 438 | </b></blockquote> |
| 439 | |
| 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> |
| 445 | |
| 446 | <p>This leaves:</p> |
| 447 | |
| 448 | <blockquote><b> |
| 449 | <span id=sash_cmd> |
| 450 | ar chattr dd ed file find grep gunzip gzip lsattr more mount mv pivot_root |
| 451 | sh sum tar umount |
| 452 | </span> |
| 453 | </b></blockquote> |
| 454 | |
| 455 | <p>(For once, this project doesn't include a fork of gzip, instead |
| 456 | it sucks in -lz from the host.)</p> |
| 457 | |
| 458 | <hr /> |
| 459 | <a name=sbase /> |
| 460 | <h2>sbase:</h2> |
| 461 | |
| 462 | <p>It's <a href=http://git.suckless.org/sbase>on suckless</a>. So far it's |
| 463 | implemented:</p> |
| 464 | |
| 465 | <blockquote><p> |
| 466 | <span id=sbase_cmd /> |
| 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 |
| 470 | </span> |
| 471 | </p></blockquote> |
| 472 | |
| 473 | <p>And has a TODO list:</p> |
| 474 | |
| 475 | <blockquote><p> |
| 476 | <span id=sbase_cmd /> |
| 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 |
| 479 | who |
| 480 | </span> |
| 481 | </p></blockquote> |
| 482 | |
| 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> |
| 485 | |
| 486 | <hr /> |
| 487 | <a name=s6 /> |
| 488 | <h2>s6</h2> |
| 489 | |
| 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>. |
| 494 | </p> |
| 495 | |
| 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> |
| 499 | |
| 500 | <blockquote><b> |
| 501 | <span id=s6> |
| 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 |
| 508 | </span> |
| 509 | </b></blockquote> |
| 510 | |
| 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> |
| 522 | |
| 523 | <p>I see "nuke" resurface, and if "rmrf" wasn't also here I might think |
| 524 | klibc had a point.</b> |
| 525 | |
| 526 | <blockquote> |
| 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 |
| 533 | </blockquote> |
| 534 | |
| 535 | |
| 536 | <hr /> |
| 537 | <a name=nash /> |
| 538 | <h2>nash:</h2> |
| 539 | |
| 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> |
| 545 | |
| 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 |
| 552 | has the source.</p> |
| 553 | |
| 554 | <p>In addition to being a bit like a command shell, the nash man page lists the |
| 555 | following commands:</p> |
| 556 | |
| 557 | <blockquote><p> |
| 558 | access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount |
| 559 | pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount |
| 560 | </p></blockquote> |
| 561 | |
| 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> |
| 565 | |
| 566 | <p>A more complete list seems to be the handlers[] array in nash.c:</p> |
| 567 | |
| 568 | <blockquote><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 |
| 574 | umount waitdev |
| 575 | </p></blockquote> |
| 576 | |
| 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> |
| 581 | |
| 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> |
| 587 | |
| 588 | <p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p> |
| 589 | |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 590 | <p>Verdict: ignore</p> |
| 591 | |
Rob Landley | 9a69a92 | 2013-02-23 18:32:08 -0600 | [diff] [blame] | 592 | <hr /> |
| 593 | <a name=beastiebox /> |
| 594 | <h2>Beastiebox</h2> |
| 595 | |
| 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 |
| 602 | ball.)</p> |
| 603 | |
| 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> |
| 606 | |
| 607 | <blockquote><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 |
| 612 | </p></blockquote> |
| 613 | |
| 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> |
| 622 | |
| 623 | <blockquote><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 |
| 627 | </span> |
| 628 | </p></blockquote> |
| 629 | |
| 630 | <p>Not a hugely interesting list, but eh.</p> |
| 631 | |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 632 | <p>Verdict: ignore</p> |
| 633 | |
| 634 | <hr /> |
| 635 | <a name=BsdBox /> |
| 636 | <h2>BsdBox</h2> |
| 637 | |
| 638 | <p>Somebody decided to do a <a href=https://wiki.freebsd.org/AdrianChadd/BsdBox>multicall binary for freebsd</a>.</p> |
| 639 | |
| 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> |
| 644 | |
| 645 | <p>That's about where I stopped reading.</p> |
| 646 | |
| 647 | <p>Verdict: ignore.</p> |
| 648 | |
| 649 | <hr /> |
| 650 | <a name=slowaris /> |
| 651 | <h2>OpenSolaris Busybox</h2> |
| 652 | |
| 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> |
| 655 | |
| 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 |
| 658 | OpenSolaris.</p> |
| 659 | |
| 660 | <p>Verdict: ignore.</p> |
| 661 | |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 662 | <hr /> |
| 663 | <h2>Requests:</h2> |
| 664 | |
| 665 | <p>The following additional commands have been requested by various users:</p> |
| 666 | <blockquote><b> |
| 667 | <span id=request> |
| 668 | freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root |
Rob Landley | ca04c7f | 2013-03-27 22:34:28 -0500 | [diff] [blame] | 669 | poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath |
| 670 | traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w |
Rob Landley | 934b2d3 | 2013-05-10 18:54:14 -0500 | [diff] [blame^] | 671 | ntpd |
Rob Landley | 8f90d3a | 2012-07-21 23:58:40 -0500 | [diff] [blame] | 672 | </span> |
| 673 | </b></blockquote> |
| 674 | |
| 675 | <!-- #include "footer.html" --> |
| 676 | |