• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html><head><title>toybox roadmap</title>
2<!--#include file="header.html" -->
3<title>Toybox Roadmap</title>
4
5<h2>Goals and use cases</h2>
6
7<p>We have several potential use cases for a new set of command line
8utilities, and are using those to determine which commands to implement
9for Toybox's 1.0 release.</p>
10
11<p>The most interesting standards are POSIX-2008 (also known as the Single
12Unix Specification version 4) and the Linux Standard Base (version 4.1).
13The main test harness including toybox in Aboriginal Linux and if that can
14build itself using the result to build Linux From Scratch (version 6.8).
15We also aim to replace Android's Toolbox.</p>
16
17<p>At a secondary level we'd like to meet other use cases. We've analyzed
18the commands provided by similar projects (klibc, sash, sbase, embutils,
19nash, and beastiebox), along with various vendor configurations of busybox,
20and some end user requests.</p>
21
22<p>Finally, we'd like to provide a good replacement for the Bash shell,
23which was the first program Linux ever ran and remains the standard shell
24of Linux no matter what Ubuntu says. This doesn't mean including the full
25set of Bash 4.x functionality, but does involve {various,features} beyond
26posix.</p>
27
28<p>See the <a href=status.html>status page</a> for the combined list
29and progress towards implementing it.</p>
30
31<ul>
32<li><a href=#susv4>POSIX-2008/SUSv4</a></li>
33<li><a href=#sigh>Linux "Standard" Base</a></li>
34<li><a href=#dev_env>Development Environment</a></li>
35<li><a href=#android>Android Toolbox</a></li>
36<li><a href=#aosp>Building AOSP</a></li>
37<li><a href=#tizen>Tizen Core</a></li>
38<li><a href=#buildroot>buildroot</a></li>
39<li>Miscelaneous: <a href=#klibc>klibc</a>, <a href=#glibc>glibc</a>,
40<a href=#sash>sash</a>, <a href=#sbase>sbase</a>,
41<a href=#uclinux>uclinux</a>...</li>
42</ul>
43
44<hr />
45<a name="standards">
46<h2>Use case: standards compliance.</h2>
47
48<h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3>
49<p>The best standards are the kind that describe reality, rather than
50attempting to impose a new one. (I.E. a good standard should document, not
51legislate.)</p>
52
53<p>The kind of standards which describe existing reality tend to be approved by
54more than one standards body, such ANSI and ISO both approving C.  That's why
55the IEEE POSIX committee's 2008 standard, the Single Unix Specification version
564, and the Open Group Base Specification edition 7 are all the same standard
57from three sources.</p>
58
59<p>The <a href="http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html">"utilities"
60section</a>
61of these standards is devoted to the unix command line, and are the best such
62standard for our purposes.  (My earlier work on BusyBox was implemented with
63regard to SUSv3, an earlier version of this standard.)</p>
64
65<h3>Problems with the standard</h3>
66
67<p>Unfortunately, these standards describe a subset of reality, lacking any
68mention of commands such as init, login, or mount required to actually boot a
69system. It provides ipcrm and ipcs, but not ipcmk, so you can use System V IPC
70resources but not create them.</p>
71
72<p>These standards also contain a large number of commands that are
73inappropriate for toybox to implement in its 1.0 release.  (Perhaps some of
74these could be reintroduced in later releases, but not now.)</p>
75
76<p>Starting with the full "utilities" list, we first remove generally obsolete
77commands (compess ed ex pr uncompress uccp uustat uux), commands for the
78pre-CVS "SCCS" source control system (admin delta get prs rmdel sact sccs unget
79val what), fortran support (asa fort77), and batch processing support (batch
80qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub).</p>
81
82<p>Some commands are for a compiler toolchain (ar c99 cflow ctags cxref gencat
83iconv lex m4 make nm strings strip tsort yacc), which is outside of toybox's
84mandate and should be supplied externally.  (Again, some of these may be
85revisited later, but not for toybox 1.0.)</p>
86
87<p>Some commands are part of a command shell, and cannot be implemented as
88separate executables (alias bg cd command fc fg getopts hash jobs kill read
89type ulimit umask unalias wait).  These may be revisited as part of a built-in
90toybox shell, but are not exported into $PATH via symlinks.  (If you fork a
91child process and have it "cd" then exit, you've accomplished nothing.
92This is not a complete list, a shell also needs exit, if, while, for, case,
93export, set, unset, trap, exec... And for bash compatability, function and
94source.)</p>
95
96<blockquote><b>
97<span id=shell>
98alias bg cd command fc fg getopts hash jobs kill read type ulimit umask
99unalias wait exit if while for case export set unset trap exec function source
100</span>
101</b></blockquote>
102
103<p>A few other commands are judgement calls, providing command-line
104internationalization support (iconv locale localedef), System V inter-process
105communication (ipcrm ipcs), and cross-tty communication from the minicomputer
106days (talk mesg write).  The "pax" utility was supplanted by tar, "mailx" is
107a command line email client, and "lp" submits files for printing to... what
108exactly?  (cups?)  The standard defines crontab but not crond.</p>
109
110<p>Removing all of that leaves the following commands, which toybox should
111implement:</p>
112
113<blockquote><b>
114<span id=posix>
115at awk basename bc cal cat chgrp chmod chown cksum cmp comm cp
116csplit cut date dd df diff dirname du echo env expand expr false file find
117fold fuser getconf grep head id join kill link ln logger logname ls man
118mkdir mkfifo more mv newgrp nice nl nohup od paste patch pathchk printf ps
119pwd renice rm rmdir sed sh sleep sort split stty tabs tail tee test time
120touch tput tr true tty uname unexpand uniq unlink uudecode uuencode vi wc
121who xargs zcat
122</span>
123</b></blockquote>
124
125<h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3>
126
127<p>One attempt to supplement POSIX towards an actual usable system was the
128Linux Standard Base. Unfortunately, the quality of this "standard" is
129fairly low.</p>
130
131<p>POSIX allowed its standards process to be compromised
132by leaving things out, thus allowing IBM mainframes and Windows NT to drive
133a truck through the holes and declare themselves compilant. But it means what
134they DID standardize tends to be respected (if sometimes obsolete).</p>
135
136<p>The Linux Standard Base's failure mode is different, they respond to
137pressure by including special-case crap, such as allowing Red Hat to shoehorn
138RPM into the standard even though all sorts of distros (Debian, Slackware, Arch,
139Gentoo) don't use it and probably never will. This means anything in the LSB is
140at best a suggestion: arbitrary portions of this standard are widely
141ignored.</p>
142
143<p>The community perception seems to be that the Linux Standard Base is
144the best standard money can buy, I.E. the Linux Foundation is supported by
145financial donations from large companies and the LSB
146<a href=https://www.softwarefreedom.org/blog/2016/apr/11/lf/>represents the interests
147of those donors</a> more than technical merit. (The Linux Foundation, which
148maintains the LSB, isn't a 501c3. It's a 501c6, the
149same kind of legal entity as the Tobacco Institute and Microsoft's old
150"Don't Copy That Floppy" program.) Debian officially
151<a href=http://lwn.net/Articles/658809>washed its hands of LSB</a> when 5.0
152came out in 2015, and no longer even pretends to support it (which may affect
153Debian derivatives like Ubuntu and Knoppix). Toybox hasn't moved to 5.0 for
154similar reasons.</p>
155
156<p>That said, Posix by itself isn't enough, and this is the next most
157comprehensive standards effort for Linux so far, so we salvage what we can.</p>
158
159<p>The LSB specifies a <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html>list of command line
160utilities</a>:</p>
161
162<blockquote><b>
163ar at awk batch bc chfn chsh col cpio crontab df dmesg du echo egrep
164fgrep file fuser gettext grep groupadd groupdel groupmod groups
165gunzip gzip hostname install install_initd ipcrm ipcs killall lpr ls
166lsb_release m4 md5sum mknod mktemp more mount msgfmt newgrp od passwd
167patch pidof remove_initd renice sed sendmail seq sh shutdown su sync
168tar umount useradd userdel usermod xargs zcat
169</b></blockquote>
170
171<p>Where posix specifies one of those commands, LSB's deltas tend to be
172accomodations for broken tool versions which aren't up to date with the
173standard 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>
174for examples.)</p>
175
176<p>Since we've already committed to using our own judgement to skip bits of
177POSIX, and LSB's "judgement" in this regard is purely bug workarounds to declare
178various legacy tool implementations "compliant", this means we're mostly
179interested in the set of tools that aren't specified in posix at all.</p>
180
181<p>Of these, gettext and msgfmt are internationalization, install_initd and
182remove_initd weren't present in Ubuntu 10.04, lpr is out of scope,
183and lsb_release just reports information in /etc/os-release.</p>
184
185<p>This leaves:</p>
186
187<blockquote><b>
188<span id=lsb>
189chfn chsh dmesg egrep fgrep groupadd groupdel groupmod groups
190gunzip gzip hostname install killall md5sum
191mknod mktemp mount passwd pidof sendmail seq shutdown
192su sync tar umount useradd userdel usermod zcat
193</span>
194</b></blockquote>
195
196<hr />
197<a name="dev_env">
198<h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2>
199
200<p>The following commands are enough to build the <a href=http://landley.net/aboriginal/about.html>Aboriginal Linux</a> development
201environment, boot it to a shell prompt, and build <a href=http://www.linuxfromscratch.org/lfs/view/6.8/>Linux From Scratch 6.8</a> under it.</p>
202
203<p>This use case includes running init scripts and other shell scripts, running
204configure, make, and install in each package, and providing basic command line
205facilities such as a text editor. (It does not include a compiler toolchain or
206C library, those are outside the scope of this project.)</p>
207
208<blockquote><b>
209<span id=development>
210bzcat cat cp dirname echo env patch rmdir sha1sum sleep sort sync
211true uname wc which yes zcat
212awk basename chmod chown cmp cut date dd diff
213egrep expr fdisk find grep gzip head hostname id install ln ls
214mkdir mktemp mv od readlink rm sed sh tail tar touch tr uniq
215wget whoami xargs chgrp comm gunzip less logname split
216tee test time bunzip2 chgrp chroot comm cpio dmesg
217dnsdomainname ftpd ftpget ftpput gunzip ifconfig init less
218logname losetup mdev mount mountpoint nc pgrep pkill
219pwd route split stat switch_root tac umount vi
220resize2fs tune2fs fsck.ext2 genext2fs mke2fs xzcat
221</span>
222</b></blockquote>
223
224<p>Aboriginal Linux also installs bash 2.05b as #!/bin/sh and its scripts
225require bash extensions not present in shells such as busybox ash.
226This means that toysh needs to supply several bash extensions _and_ work
227when called under the name "bash".</p>
228
229<p>The <a href=http://landley.net/aboriginal>Aboriginal Linux</a>
230self-bootstrapping build still uses the following busybox commands,
231not yet supplied by toybox:</p>
232
233<blockquote><p>
234awk bunzip2 bzcat dd diff expr fdisk ftpd ftpget
235ftpput gunzip gzip less ping route sh
236sha512sum tar test tr unxz vi wget xzcat zcat
237</p></blockquote>
238
239<p>Many of those are in "pending". The remaining "difficult"
240commands are vi, awk, and sh.</p>
241
242<p>Building Linux From Scratch is not the same as building the
243<a href=https://source.android.com>Android Open Source Project</a>,
244but after toybox 1.0 focus may shift to <a href=http://landley.net/aboriginal/about.html#hairball>modifying the AOSP build</a>
245to reduce dependencies. (It's fairly likely we'll have to add at least
246a read-only git utility so repo can download the build's source code,
247but that's actually <a href=https://www.youtube.com/watch?v=P7n6G2IL6eo>not
248that hard</a>. We'll probably also need our own "make" at some point after
2491.0.)</p>
250
251<p>Note: Aboriginal Linux was
252<a href=https://landley.net/aboriginal/news.html>restarted</a> (I.E. <a href=https://github.com/landley/mkroot>replaced</a>) due to toolchain licensing issues, but the new project is a simpler implementation of the same goals,
253and when finished should provide the same test environment for toybox.
254This section needs to be rewritten whem mkroot is complete enough to build
255Linux From Scratch.</p>
256
257<p>The development methodology used a <a href=http://landley.net/aboriginal/FAQ.html#debug_logging>command logging wrapper</a>
258that intercepted each command called out of the $PATH and append the
259command line to a log file, then <a href=https://github.com/landley/aboriginal/blob/master/more/report-recorded-commands.sh>analyze</a> the result to create a
260<a href=https://landley.net/notes-2008.html#23-01-2008>list of commands</a>,
261then <a href=https://github.com/landley/aboriginal/blob/master/host-tools.sh>create a directory of symlinks</a> pointing to those commands out of the
262host $PATH. Then the new implementation can replace these commands one
263at a time, checking the results and the log output to spot any behavior
264changes.</p>
265
266<hr />
267<h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2>
268
269<p>Android has a policy against GPL in userspace, so even though BusyBox
270predates Android by many years, they couldn't use it. Instead they grabbed
271an old version of ash and implemented their own command line utility set
272called "toolbox". ash was later replaced by
273<a href="https://www.mirbsd.org/mksh.htm">mksh</a>; toolbox is being
274replaced by toybox.</p>
275
276<p>Toolbox doesn't have its own repository, instead it's part of Android's
277<a href=https://android.googlesource.com/platform/system/core>system/core
278git repository</a>. Android's Native Development Kit (their standalone
279downloadable toolchain)  has its own
280<a href=https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md>roadmap</a>, and each version has
281<a href=https://developer.android.com/ndk/downloads/revision_history>release
282notes</a>.</p>
283
284<h3>Toolbox commands:</h3>
285
286<p>According to <a href=https://android.googlesource.com/platform/system/core/+/master/toolbox/Android.mk>
287system/core/toolbox/Android.mk</a> the toolbox directory builds the
288following commands:</p>
289
290<blockquote><b>
291dd getevent newfs_msdos
292</b></blockquote>
293
294<p>The toolbox makefile also builds the BSD grep right now, because toybox
295grep is missing <code>--color</code>.</p>
296
297<h3>Other Android /system/bin commands</h3>
298
299<p>Other than the toolbox links, the currently interesting
300binaries in /system/bin are:</p>
301
302<ul>
303<li><b>arping</b> - ARP REQUEST tool (iputils)</li>
304<li><b>blkid</b> - identify block devices (e2fsprogs)</li>
305<li><b>e2fsck</b> - fsck for ext2/ext3/ext4 (e2fsprogs)</li>
306<li><b>fsck.f2fs</b> - fsck for f2fs (f2fs-tools)</li>
307<li><b>fsck_msdos</b> - fsck for FAT (BSD)</li>
308<li><b>gzip</b> - compression/decompression tool (zlib)</li>
309<li><b>ip</b> - network routing tool (iproute2)</li>
310<li><b>iptables/ip6tables</b> - IPv4/IPv6 NAT admin (iptables)</li>
311<li><b>iw</b> - wireless device config tool (iw)</li>
312<li><b>logwrapper</b> - redirect stdio to android log (Android)</li>
313<li><b>make_ext4fs</b> - make ext4 fs (Android)</li>
314<li><b>make_f2fs</b> - make f2fs fs (f2fs-tools)</li>
315<li><b>ping/ping6</b> - ICMP ECHO_REQUEST tool (iputils)</li>
316<li><b>reboot</b> - reboot (Android)</li>
317<li><b>resize2fs</b> - resize ext2/ext3/ext4 fs (e2fsprogs)</li>
318<li><b>sh</b> - mksh (BSD)</li>
319<li><b>ss</b> - socket statistics (iproute2)</li>
320<li><b>tc</b> - traffic control (iproute2)</li>
321<li><b>tracepath/tracepath6</b> - trace network path (iputils)</li>
322<li><b>traceroute/traceroute6</b> - trace network route (iputils)</li>
323</ul>
324
325<p>The names in parentheses are the source.</p>
326
327<h3>Analysis</h3>
328
329<p>For reference, combining everything listed above, we get:</p>
330
331<blockquote><b>
332arping blkid e2fsck dd fsck.f2fs fsck_msdos getevent gzip ip iptables
333ip6tables iw logwrapper make_ext4fs make_f2fs newfs_msdos ping ping6
334reboot resize2fs sh ss tc tracepath tracepath6 traceroute traceroute6
335</b></blockquote>
336
337<p>We may eventually implement all of that, but for toybox 1.0 we need to
338focus a bit. For our first pass, let's just replace all the "toolbox"
339commands.</p>
340
341<p>This means toybox should implement (or finish implementing):</p>
342<blockquote><b>
343<span id=toolbox>
344dd getevent grep gzip newfs_msdos
345</span>
346</b></blockquote>
347
348<p>Update: Android.mk is currently building the following toybox files out
349of "pending". These should be a priority for cleanup (ones marked with *
350don't have a symlink, so they're a lot less visible):</p>
351
352<blockquote><b>
353chrt dd expr getfattr* lsof modprobe more setfattr* tar tr traceroute
354</b></blockquote>
355
356<p>Android wishlist:</p>
357
358<blockquote><b>
359mtools genvfatfs mke2fs gene2fs
360</b></blockquote>
361
362<hr />
363<h2><a name=aosp /><a href="#aosp">Use case: Building AOSP</a></h2>
364
365<p>The list of external tools used to build AOSP is
366<a href="https://android.googlesource.com/platform/build/soong/+/master/ui/build/paths/config.go">here</a>.</p>
367
368<blockquote><b>
369awk basename bash bc bzip2 cat chmod cmp comm cp cut date dd diff dirname du
370echo egrep env expr find fuser getconf getopt git grep gzip head hexdump
371hostname id jar java javap ln ls lsof m4 make md5sum mkdir mktemp mv od openssl
372paste patch pgrep pkill ps pstree pwd python python2.7 python3 readlink
373realpath rm rmdir rsync sed setsid sh sha1sum sha256sum sha512sum
374sleep sort stat tar tail tee todos touch tr true uname uniq unix2dos unzip
375wc which whoami xargs xxd xz zip zipinfo
376</b></blockquote>
377
378<p>The following are already in the tree and will be used directly:</p>
379
380<blockquote><b>
381awk bzip2 jar java javap m4 make python python2.7 python3 xz
382</b></blockquote>
383
384<p>Subtracting what's already in toybox (including the following toybox toys
385that are still in pending: <code>bc dd diff expr gzip lsof tar tr</code>),
386that leaves:</p>
387
388<blockquote><b>
389bash fuser getopt git hexdump openssl pstree rsync sh todos unzip zip zipinfo
390</b></blockquote>
391
392<p>For AOSP, zip/zipinfo/unzip are likely to be libziparchive based. The
393todos callers will use unix2dos instead if it's available. git/openssl
394seem like they should just be brought in to the tree. rsync is used to
395work around a Mac <code>cp -Rf</code> bug with broken symbolic links. That
396leaves:</p>
397
398<blockquote><b>
399bash fuser getopt hexdump pstree
400</b></blockquote>
401
402<p>(Why are fuser and pstree used during the AOSP build? They're used for
403diagnostics if something goes wrong. So it's really just bash, getopt,
404and hexdump that are actually used to build.)</p>
405
406<hr />
407<h2><a name=tizen /><a href="#tizen">Use case: Tizen Core</a></h2>
408
409<p>The Tizen project has expressed a desire to eliminate GPLv3 software
410from its core system, and is installing toybox as
411<a href=https://wiki.tizen.org/wiki/Toybox>part of this process</a>.</p>
412
413<p>They have a fairly long list of new commands they'd like to see in toybox:</p>
414
415<blockquote><b>
416<span id=tizen>
417arch base64 users dir vdir unexpand shred join csplit
418hostid nproc runcon sha224sum sha256sum sha384sum sha512sum sha3sum mkfs.vfat fsck.vfat
419dosfslabel uname stdbuf pinky diff3 sdiff zcmp zdiff zegrep zfgrep zless zmore
420</span>
421</b></blockquote>
422
423<p>In addition, they'd like to use several commands currently in pending:</p>
424
425<blockquote><b>
426<span id=tizen>
427tar diff printf wget rsync fdisk vi less tr test stty fold expr dd
428</span>
429</b></blockquote>
430
431<p>Also, tizen uses a different Linux Security Module called SMACK, so
432many of the SELinux options ala ls -Z need smack alternatives in an
433if/else setup.</p>
434
435<hr /><a name=buildroot />
436<h2>buildroot:</h2>
437
438<p>The <a href=https://buildroot.org/downloads/manual/manual.html#requirement-mandatory>mandatory packages</a>
439section of the buildroot manual lists:</p>
440
441<blockquote><p>
442which sed make bash patch gzip bzip2 tar cpio unzip rsync file bc wget
443</p></blockquote>
444
445<p>(It also lists binutils gcc g++ perl python, and for debian it wants
446build-essential. And it wants file to be in /usr/bin because
447<a href=https://git.busybox.net/buildroot/tree/support/dependencies/dependencies.sh?h=2018.02.x#n84>libtool
448breaks otherwise</a>.)</p>
449
450<p>Buildroot does not support a cross toolchain that lives in "/usr/bin"
451with a prefix of "" (if you try, and chop out the test for a blank prefix,
452it dies trying to run "/usr/bin/-gcc"). But you can patch your way to
453making it work if you try.</p>
454
455<hr /><a name=klibc />
456<h2>klibc:</h2>
457
458<p>Long ago some kernel developers came up with a project called
459<a href=http://en.wikipedia.org/wiki/Klibc>klibc</a>.
460After a decade of development it still has no web page or HOWTO,
461and nobody's quite sure if the license is BSD or GPL. It inexplicably
462<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
463replacement.</p>
464
465<p>In addition to a C library even less capable than bionic (obsoleted by
466musl), klibc builds a random assortment of executables to run init scripts
467with. There's no multiplexer command, these are individual executables:</p>
468
469<blockquote><p><b>
470cat chroot cpio dd dmesg false fixdep fstype gunzip gzip halt ipconfig kill
471kinit ln losetup ls minips mkdir mkfifo mknodes
472mksyntax mount mv nfsmount nuke pivot_root poweroff readlink reboot resume
473run-init sh sha1hash sleep sync true umount uname zcat
474</b></p></blockquote>
475
476<p>To get that list, build klibc according to the instructions (I
477<a href=http://landley.net/notes-2013.html#23-01-2013>looked at</a> version
4782.0.2 and did cd klibc-*; ln -s /output/of/kernel/make/headers_install
479linux; make) then <b>echo $(for i in $(find . -type f); do file $i | grep -q
480executable && basename $i; done | grep -v '[.]g$' | sort -u)</b> to find
481executables, then eliminate the *.so files and *.shared duplicates.</p>
482
483<p>Some of those binaries are build-time tools that don't get installed,
484which removes mknodes, mksyntax, sha1hash, and fixdep from the list.
485(And sha1hash is just an unpolished sha1sum anyway.)</p>
486
487<p>The run-init command is more commonly called switch_root, nuke is just
488"rm -rf -- $@", and minips is more commonly called "ps". I'm not doing aliases
489for the oddball names.</p>
490
491<p>Yet more stale forks of dash and gzip sucked in here (see "dubious
492license terms" above), adding nothing to the other projects we've looked at.
493But we still need sh, gunzip, gzip, and zcat to replace this package.</p>
494
495<p>At the time I did the initial analysis toybox already had cat, chroot, dmesg, false,
496kill, ln, losetup, ls, mkdir, mkfifo, readlink, rm, switch_root, sleep, sync,
497true, and uname.</p>
498
499<p>The low hanging fruit is cpio, dd, ps, mv, and pivot_root.</p>
500
501<p>The "kinit" command is another gratuitous rename, it's init running as PID 1.
502The halt, poweroff, and reboot commands work with it.</p>
503
504<p>I've got mount and umount queued up already, fstype and nfsmount go with
505those. (And probably smbmount and p9mount, but this hasn't got one. Those
506are all about querying for login credentials, probably workable into the
507base mount command.)</p>
508
509<p>The ipconfig command here has a built in dhcp client, so it's ifconfig
510and dhcpcd and maybe some other stuff.</p>
511
512<p>The resume command is... weird. It finds a swap partition and reads data
513from it into a /proc file, something the kernel is capable of doing itself.
514(Even though the klibc author
515<a href=http://www.zytor.com/pipermail/klibc/2006-June/001748.html>attempted
516to remove</a> that capability from the kernel, current kernel/power/hibernate.c
517still parses "resume=" on the command line). And yet various distros seem to
518make use of klibc for this.
519Given the history of swsusp/hibernate (and
520<a href=http://lwn.net/Articles/333007>TuxOnIce</a>
521and <a href=http://lwn.net/Articles/242107>kexec jump</a>) I've lost track
522of the current state of the art here. Ah, Documentation/power/userland-swsusp.txt
523has the API docs, and <a href=http://suspend.sf.net>here's a better
524tool</a>...</p>
525
526<p>So the list of things actually in klibc are:</p>
527
528<blockquote><b>
529<span id=klibc_cmd>
530cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root
531sleep sync true uname
532
533cpio dd ps mv pivot_root
534mount nfsmount fstype umount
535sh gunzip gzip zcat
536kinit halt poweroff reboot
537ipconfig
538resume
539</span>
540</b></blockquote>
541
542<hr />
543<a name=glibc />
544<h2>glibc</h2>
545
546<p>Rather a lot of command line utilities come bundled with glibc:</p>
547
548<blockquote><b>
549catchsegv getconf getent iconv iconvconfig ldconfig ldd locale localedef
550mtrace nscd rpcent rpcinfo tzselect zdump zic
551</b></blockquote>
552
553<p>Of those, musl libc only implements ldd.</p>
554
555<p>catchsegv is a rudimentary debugger, probably out of scope for toybox.</p>
556
557<p>iconv has been <a href="#susv4">previously discussed</a>.</p>
558
559<p>iconvconfig is only relevant if iconv is user-configurable; musl uses a
560non-configurable iconv.</p>
561
562<p>getconf is a posix utility which displays several variables from
563unistd.h; it probably belongs in the development toolchain.</p>
564
565<p>getent handles retrieving entries from passwd-style databases
566(in a rather lame way) and is trivially replacable by grep.</p>
567
568<p>locale was discussed under <a href=#susv4>posix</a>.
569localedef compiles locale definitions, which musl currently does not use.</p>
570
571<p>mtrace is a perl script to use the malloc debugging that glibc has built-in;
572this is not relevant for musl, and would necessarily vary with libc. </p>
573
574<p>nscd is a name service caching daemon, which is not yet relevant for musl.
575rpcinfo and rpcent are related to rpc, which musl does not include.</p>
576
577<p>The remaining commands involve glibc's bundled timezone database,
578which seems to be derived from the <a href=http://www.iana.org/time-zones>IANA
579timezone database</a>. Unless we want to maintain our own fork of the
580standards body's database like glibc does, these are of no interest,
581but for completeness:</p>
582
583<p>tzselect outputs a TZ variable correponding to user input.
584The documentation does not indicate how to use it in a script, but it seems
585that Debian may have done so.
586zdump prints current time in each of several timezones, optionally
587outputting a great deal of extra information about each timezone.
588zic converts a description of a timezone to a file in tz format.</p>
589
590<p>None of glibc's bundled commands are currently of interest to toybox.</p>
591
592</b></blockquote>
593
594<hr />
595<a name=sash />
596<h2>Stand-Alone Shell</h2>
597
598<p>Wikipedia has <a href=http://en.wikipedia.org/wiki/Stand-alone_shell>a good
599summary of sash</a>, with links. The original Stand-Alone Shell project reached
600a stopping point, and then <a href=http://www.baiti.net/sash>"sash plus
601patches"</a> extended it a bit further. The result is a megabyte executable
602that provides 40 commands.</p>
603
604<p>Sash is a shell with built-in commands. It doesn't have a multiplexer
605command, meaning "sash ls -l" doesn't work (you have to go "sash -c 'ls -l'").
606</p>
607
608<p>The list of commands can be obtained via building it and doing
609"echo help | ./sash | awk '{print $1}' | sed 's/^-//' | xargs echo", which
610gives us:</p>
611
612<blockquote><b>
613alias aliasall ar cd chattr chgrp chmod chown cmp cp chroot dd echo ed exec
614exit file find grep gunzip gzip help kill losetup losetup ln ls lsattr mkdir
615mknod more mount mv pivot_root printenv prompt pwd quit rm rmdir setenv source
616sum sync tar touch umask umount unalias where
617</b></blockquote>
618
619<p>Plus sh because it's a shell. A dozen or so commands can only sanely be
620implemented as shell builtins (alias aliasall cd exec exit prompt quit setenv
621source umask unalias), where is an alias for which, and at triage time toybox
622already has chgrp, chmod, chown, cmp, cp, chroot, echo, help, kill, losetup,
623ln, ls, mkdir, mknod, printenv, pwd, rm, rmdir, sync, and touch.</p>
624
625<p>This leaves:</p>
626
627<blockquote><b>
628<span id=sash_cmd>
629ar chattr dd ed file find grep gunzip gzip lsattr more mount mv pivot_root
630sh sum tar umount
631</span>
632</b></blockquote>
633
634<p>(For once, this project doesn't include a fork of gzip, instead
635it sucks in -lz from the host.)</p>
636
637<hr />
638<a name=sbase />
639<h2>sbase:</h2>
640
641<p>It's <a href=http://git.suckless.org/sbase>on suckless</a> in
642<a href=http://git.suckless.org/ubase>two parts</a>. As of November 2015 it's
643implemented the following (renaming "cron" to "crond" for
644consistency, and yanking "sponge", "mesg", "pagesize", "respawn", and
645"vtallow"):</p>
646
647<blockquote><p>
648<span id=sbase_cmd>
649basename cal cat chgrp chmod chown chroot cksum cmp cols comm cp crond cut date
650dirname du echo env expand expr false find flock fold getconf grep head
651hostname join kill link ln logger logname ls md5sum mkdir mkfifo mktemp mv
652nice nl nohup od paste printenv printf pwd readlink renice rm rmdir sed seq
653setsid sha1sum sha256sum sha512sum sleep sort split strings sync tail
654tar tee test tftp time touch tr true tty uname unexpand uniq unlink uudecode
655uuencode wc which xargs yes
656</span>
657</p></blockquote>
658
659<p>and<p>
660
661<blockquote><p>
662<span id=sbase_cmd>
663chvt clear dd df dmesg eject fallocate free id login mknod mountpoint
664passwd pidof ps stat su truncate unshare uptime watch
665who
666</span>
667</p></blockquote>
668
669<hr />
670<a name=nash />
671<h2>nash:</h2>
672
673<p>Red Hat's nash was part of its "mkinitrd" package, replacement for a shell
674and utilities on the boot floppy back in the 1990's (the same general idea
675as BusyBox, developed independently). Red Hat discontinued nash development
676in 2010, replacing it with dracut (which collects together existing packages,
677including busybox).</p>
678
679<p>I couldn't figure out how to beat source code out of
680<a href=http://pkgs.fedoraproject.org/git/mkinitrd>Fedora's current git</a>
681repository. The last release version that used it was Fedora Core 12
682which 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>
683that can be unwound with "rpm2cpio mkinitrd.src.rpm | cpio -i -d -H newc
684--no-absolute-filenames" and in there is a mkinitrd-6.0.93.tar.bz2 which
685has the source.</p>
686
687<p>In addition to being a bit like a command shell, the nash man page lists the
688following commands:</p>
689
690<blockquote><p>
691access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount
692pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount
693</p></blockquote>
694
695<p>Oddly, the only occurrence of the string pivot_root in the nash source code
696is in the man page, the command isn't there. (It seems to have been removed
697when the underscoreless switchroot went in.)</p>
698
699<p>A more complete list seems to be the handlers[] array in nash.c:</p>
700
701<blockquote><p>
702access buildEnv cat cond cp daemonize dm echo exec exit find kernelopt
703loadDrivers loadpolicy mkchardevs mkblktab mkblkdevs mkdir mkdmnod mknod
704mkrootdev mount netname network null plymouth hotplug killplug losetup
705ln ls raidautorun readlink resume resolveDevice rmparts setDeviceEnv
706setquiet setuproot showelfinterp showlabels sleep stabilized status switchroot
707umount waitdev
708</p></blockquote>
709
710<p>This list is nuts: "plymouth" is an alias for "null" which is basically
711"true" (which thie above list doesn't have). Things like buildEnv and
712loadDrivers are bespoke Red Hat behavior that might as well be hardwired in
713to nash's main() without being called.</p>
714
715<p>Instead of eliminating items
716from the list with an explanation for each, I'm just going to cherry pick
717a few: the device mapper (dm, raidautorun) is probably interesting,
718hotplug (may be obsolete due to kernel changes that now load firmware
719directly), and another "resume" ala klibc.</p>
720
721<p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p>
722
723<p>Verdict: ignore</p>
724
725<hr />
726<a name=beastiebox />
727<h2>Beastiebox</h2>
728
729<p>Back in 2008, the BSD guys vented some busybox-envy
730<a href=http://beastiebox.sourceforge.net>on sourceforge</a>. Then stopped.
731Their repository is still in CVS, hasn't been touched in years, it's a giant
732hairball of existing code sucked together. (The web page says the author
733is aware of crunchgen, but decided to do this by hand anyway. This is not
734a collection of new code, it's a katamari of existing code rolled up in a
735ball.)</p>
736
737<p>Combining the set of commands listed on the web page with the set of
738man pages in the source gives us:</P>
739
740<blockquote><p>
741[ cat chmod cp csh date df disklabel dmesg echo ex fdisk fsck fsck_ffs getty
742halt hostname ifconfig init kill less lesskey ln login ls lv mksh more mount
743mount_ffs mv pfctl ping poweroff ps reboot rm route sed sh stty sysctl tar test
744traceroute umount vi wiconfig
745</p></blockquote>
746
747<p>Apparently lv is the missing link between ed and vi, copyright 1982-1997 (do
748not want), ex is another obsolete vi mode, lesskey is "used to
749specify a set of key bindings to be used with less", and csh is a shell they
750sucked in (even though they have mksh?), [ is an alias for test. Several more bsd-isms that don't have Linux
751equivalents (even in the ubuntu "install this package" search) are
752disklabel, fsck_ffs, mount_ffs, and pfctl. And wiconfig is a
753wavelan interface network card driver utility. Subtracting all that and the
754commands toybox already implements at triage time, we get:</p>
755
756<blockquote><p>
757<span id=beastiebox_cmd>
758fdisk fsck getty halt ifconfig init kill less more mount mv ping poweroff
759ps reboot route sed sh stty sysctl tar test traceroute umount vi
760</span>
761</p></blockquote>
762
763<p>Not a hugely interesting list, but eh.</p>
764
765<p>Verdict: ignore</p>
766
767<hr />
768<a name=BsdBox />
769<h2>BsdBox</h2>
770
771<p>Somebody decided to do a <a href=https://wiki.freebsd.org/AdrianChadd/BsdBox>multicall binary for freebsd</a>.</p>
772
773<p>They based it on crunchgen, a tool that glues existing programs together
774into an archive and uses the name to execute the right one. It has no
775simplification or code sharing benefits whatsoever, it's basically an
776archiver that produces executables.</p>
777
778<p>That's about where I stopped reading.</p>
779
780<p>Verdict: ignore.</p>
781
782<hr />
783<a name=slowaris />
784<h2>OpenSolaris Busybox</h2>
785
786<p>Somebody <a href=http://hub.opensolaris.org/bin/view/Project+busybox/>wrote
787a wiki page</a> saying that Busybox for OpenSolaris would be a good idea.</p>
788
789<p>The corresponding "files" tab is an auto-generated stub. The project never
790even got as far as suggesting commands to include before Oracle discontinued
791OpenSolaris.</p>
792
793<p>Verdict: ignore.</p>
794
795<hr />
796<a name=uclinux />
797<h2>uClinux</h2>
798
799<p>Long ago a hardware developer named Jeff Dionne put together a
800nommu Linux distribution, which involved rewriting a lot of command line
801utilities that relied on <a href=http://nommu.org/memory-faq.txt>features
802unavailable on nommu</a> hardware.</p>
803
804<p>In 2003 Jeff moved to Japan and handed
805the project off to people who allowed it to roll to a stop. The website
806turned into a mess of 404 links, the navigation indexes stopped being
807updated over a decade ago, and the project's CVS repository suffered a
808hard drive failure for which there were no backups. The project continued
809to put out "releases" through 2014 (you have to scroll down in the "news"
810section to find them, the "HTTP download" section in the nav bar on the
811left hasn't been updated in over a decade), which were hand-updated tarball
812snapshots mostly consisting of software from the 1990's. For example the
8132014 release still contained ipfwadm, the package which predated ipchains,
814which predated iptables, which is in the process of being replaced by
815nftables.</p>
816
817<p>Nevertheless, people still try to use this because (at least until the
818launch of <a href=http://nommu.org>nommu.org</a>) the project was viewed
819as the place to discuss, develop, and learn about nommu Linux.
820The role of uclinux.org as an educational resource kept people coming
821to it long after it had collapsed as a Linux distro.</p>
822
823<p>Starting around 0.6.0 toybox began to address nommu support with the goal
824of putting uClinux out of its misery.</p>
825
826<p>An analysis of <a href=http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20140504.tar.bz2>uClinux-dist-20140504</a> found 312 package
827subdirectories under "user".</p>
828
829<h3>Taking out the trash</h3>
830
831<p>A bunch of packages (<b>inotify-tools, input-event-demon, ipsec-tools, netifd,
832keepalived, mobile-broadband-provider-info, nuttp, readline, snort,
833snort-barnyard, socat, sqlite, sysklogd, sysstat, tcl, ubus, uci, udev,
834unionfs, uqmi, usb_modeswitch, usbutils, util-linux</b>)
835are hard to evaluate because
836uclinux has directories for them, but their source isn't actually in the
837uclinux tree. In some of these the makefiles download a git repo during
838the build, so I'm assuming you can build the external package if you really
839care. (Even when I know what these packages do, I'm skipping them
840because uclinux doesn't actually contain them, and any given snapshot
841of the build system will bitrot as external web links change over time.)</p>
842
843<p>Other packages are orphaned, meaning they're not mentioned from any Kconfig
844or Makefiles outside of their directory, so uclinux can't actually build
845them: <b>mbus</b> is an orphaned i2c test program expecting to run in some sort
846of hardwired hardware context, <b>mkeccbin</b> is an orphaned "ECC annotated
847binary file" generator (meaning it's half of a flash writer),
848<b>wsc_upnp</b> is a "Ralink WPS" driver (some sort of stale wifi chip)...</p>
849
850<p>The majority of the remaining packages are probably not of interest to
851toybox due to being so obsolete or special purpose they may not actually be
852of interest to anybody anymore. (This list also includes a lot of
853special-purpose network back-end stuff that's hard for anybody but
854datacenter admins to evaluate the current relevance of.)</p>
855
856<blockquote><b><p>
857arj asterisk boottools bpalogin br2684ctl camserv can4linux cgi_generic
858cgihtml clamav clamsmtp conntrack-tools cramfs crypto-tools cxxtest
859ddns3-client de2ts-cal debug demo diald discard dnsmasq dnsmasq2
860ethattach expat-examples ez-ipupdate fakeidentd
861fconfig ferret flatfs flthdr freeradius freeswan frob-led frox fswcert
862game gettyd gnugk haserl horch
863hostap hping httptunnel ifattach ipchains
864ipfwadm ipmasqadm ipportfw ipredir ipset iso_client
865jamvm jffs-tools jpegview jquery-ui kendin-config kismet klaxon kmod
866l2tpd lcd ledcmd ledcon lha lilo lirc lissa load loattach
867lpr lrpstat lrzsz mail mbus mgetty microwin ModemManager msntp musicbox
868nooom null openswan openvpn palmbot pam_* pcmcia-cs playrt plugdaemon pop3proxy
869potrace qspitest quagga radauth
870ramimage readprofile rdate readprofile routed rrdtool rtc-ds1302
871sendip ser sethdlc setmac setserial sgutool sigs siproxd slattach
872smtpclient snmpd net-snmp snortrules speedtouch squashfs scep sslwrap stp
873stunnel tcpblast tcpdump tcpwrappers threaddemos tinylogin tinyproxy
874tpt tripwire unrar unzoo version vpnled w3cam xl2tpd zebra
875</p></b></blockquote>
876
877<p>This stuff is all over the place: arj, lha, rar, and zoo are DOS archivers,
878ethattach describes itself as just "a network tool",
879mail is a textmode smtp mailer literally described as "Some kind of mail
880proggy" in uclinux's kconfig (as opposed to clamsmtp and smtpclient and
881so on), this gettyd isn't a generic version but specifically a
882hardwired ppp dialin utility, mgetty isn't a generic version but is combined
883with "sendfax", hostap is an intersil prism driver, wlan-ng is also an
884intersil prism dirver, null is a program to intentionally dereference a
885null pointer (in case you needed one), iso_client is a
886"Demo Application for the USB Device Driver", kendin-config is
887"for configuring the Micrel Kendin KS8995M over QSPI", speedtouch configures
888a specific brand of asdl modem, portmap is part of Anfs,
889ferret, linux-igd, and miniupnp are all upnp packages,
890lanbypass "can be used to control the LAN
891bypass switches on the Advantech x86 based hardware platforms", lcd is
892"test of lcddma device driver" (an out-of-tree Coldfire driver apparently
893lost to history, the uclinux linux-2.4.x directory has a config symbol for
894it, but nothing in the code actually _uses_ it...), qspitest is another
895coldfire thing, mii-tool-fec is
896"strictly for the FEC Ethernet driver as implemented (and modified) for
897the uCdimm5272", rtc-ds1302 and rtc-m41t11 are usermode drivers for specific
898clock chips, stunnel is basically "openssl s_client -quiet -connect",
899potrace is a bitmap to vector graphic converter, radauth performs command line
900authentication against a radius server,
901clamav, klaxon, ferret, l7-protocols, and nessus are very old network security
902software (it's got a stale snapshot of nmap too), xl2tpd is a PPP over UDP
903tunnel (rfc 2661), zebra is the package quagga replaced,
904lilo is the x86-only bootloader that predated grub (and recently discontinued
905development), lissa is a "framebuffer graphics demo" from
9061998, the squashfs package here is the out of tree patches for 2.4 kernels
907and such before the filesystem was merged upstream (as opposed to the
908squashfs-new package which is a snapshot of the userspace tool from 2011),
909load is basically "dd file /dev/spi", version is basically "cat /proc/version",
910microwin is a port of the WinCE graphics API to Linux, scep is a 2003
911implementation of an IETF draft abandoned in 2010, tpt depends on
912Andrew Morton's 15 year old unmerged "timepegs" kernel patch using the pentium
913cycle counter, vpnled controls a light that reboots systems (what?),
914w3cam is a video4linux 1.0 client (v4l2 showed up during 2.5 and support for
915the old v4l1 was removed in 2.6.38 back in 2011), busybox ate tinylogin
916over a decade ago, lrpstat is a java network monitor
917from 2001, lrzsz is zmodem/ymodem/zmodem, msntp and stp implement rfc2030
918meaning it overflows in 2036 (the package was last updated in 2000), rdate
919is rfc 868 meaning it also overflows in 2036 (which is why ntp was invented
920a few decades back), reiserfsprogs development stopped abruptly after
921Hans Reiser was convicted of murdering his wife Nina (denying it on the
922stand and then leading them to the body as part of his plea bargain during
923sentencing)...
924</p>
925
926<p>Seriously, there's a lot of crap in there. It's hard to analyze most
927of it far enough to prove it _doesn't_ do anything.</p>
928
929<h3>Non-toybox programs</h3>
930
931<p>The following software may actually still do something intelligible
932(although the package versions tend to be years out of date), but
933it's not a direction toybox has chosen to go in.</p>
934
935<p>There are several programming languages (<b>bash, lua, jamvm, tinytcl,
936perl, python</b>) in there. Maybe someone somewhere wants a 2008 release of a
937java virtual machine tested to work on nommu systems (jamvm), but it's out
938of scope for toybox.</p>
939
940<p>A bunch of benchmark programs: <b>cpu, dhrystone, mathtest, nbench, netperf,
941netpipe, and whetstone</b>.</p>
942
943<p>A bunch of web servers: <b>appWeb, boa, fnord (via tcpserver), goahead, httpd,
944mini_httpd, and thttpd</b>.</p>
945
946<p>A bunch of shells: <b>msh</b> is a clever (I.E. obfuscated) little shell,
947<b>nwsh</b> is "new shell" (that's what it called itself in 1999 anyway),
948<b>sash</b> is another shell with a bunch of builtins (ls, ps, df, cp, date, reboot,
949and shutdown, this roadmap analyzes it <a href="#sash">elsewhere</a>),
950<b>sh</b> is a very old minix shell fork, and <b>tcsh</b> is also a shell.</p>
951
952<p>Also in this category, we have:</p>
953
954<blockquote><b><p>
955dropbear jffs-tools jpegview kexec-tools bind ctorrent
956iperf iproute2 ip-sentinel iptables kexec
957nmap oggplay openssl oprofile p7zip pppd pptp play vplay
958hdparm mp3play at clock
959mtd-utils mysql logrotate brcfg bridge-utils flashw
960ebtables etherwake ethtool expect gdb gdbserver hostapd
961lm_sensors load netflash netstat-nat
962radvd recover rootloader resolveip rp-pppoe
963rsyslog rsyslogd samba smbmount squashfs-new squid ssh strace tip
964uboot-envtools ulogd usbhubctrl vconfig vixie-cron watchdogd
965wireless_tools wpa_supplicant
966</p></b></blockquote>
967
968<p>An awful lot of those are borderline: play and vplay are wav file
969audio players, there's oprofile _and_ readprofile (which just reads kernel
970profiling data from /proc/profile),
971radvd is a "routr advertisement daemon" (ipv6 stateless autoconf),
972ctorrent is a bittorent client,
973lm_sensors is hardware (heat?) monitoring,
974resolveip is dig only less so,
975rp-pppoe is ppp over ethernet,
976ebtables is an ethernet version of iptables (for bridging),
977their dropbear is from 2012, and that ssh version is from 2011
978(which means it's about nine months too _old_ to have the heartbleed bug).
979There's both ulogd and ulogd2 (no idea why), and pppd is version 2.4 but
980there's a ppd-2.3 directory also.</p>
981
982<p>Lots of flash stuff:
983flashw is a flash writer, load is an spi flash loader, netflash writes
984to flash via tftp,
985recover is also a reflash daemon intended to come up when the system can't boot,
986rootloader seems to be another reflash daemon but without dhcp.</p>
987
988<h3>Already in roadmap</h3>
989
990<p>The following packages contain commands already in the toybox roadmap:</p>
991
992<blockquote><b><p>
993agetty cal cksum cron dhcpcd dhcpcd-new dhcpd dhcp-isc dosfstools e2fsprogs
994elvis-tiny levee fdisk fileutils ftp ftpd grep hd hwclock inetd init ntp
995iputils login module-init-tools netcat shutils ntpdate lspci ping procps
996proftpd rsync shadow shutils stty sysutils telnet telnetd tftp tftpd traceroute
997unzip wget mawk net-tools
998</p></b></blockquote>
999
1000<p>There are some duplicates in there, levee is a tiny vi implementation
1001like elvis-tiny, ntp and ntpdate overlap, etc.</p>
1002
1003<p>Verdict: We don't really need to do a whole lot special for nommu
1004systems, just get the existing toybox roadmap working on nommu and
1005we're good. The uClinux project can rest in peace.</p>
1006
1007<hr />
1008<h2>Requests:</h2>
1009
1010<p>The following additional commands have been requested (and often submitted)
1011by various users. I _really_ need to clean up this section.</p>
1012
1013<p>Also:</p>
1014<blockquote><b>
1015<span id=request>
1016dig freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root
1017poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath
1018traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w
1019ntpd iwconfig iwlist rdate
1020dos2unix unix2dos catv clear
1021pmap realpath setsid timeout truncate
1022mkswap swapon swapoff
1023count oneit fstype
1024acpi blkid eject pwdx
1025sulogin rfkill bootchartd
1026arp makedevs sysctl killall5 crond crontab deluser last mkpasswd watch
1027blockdev rpm2cpio arping brctl dumpleases fsck
1028tcpsvd tftpd
1029factor fallocate fsfreeze inotifyd lspci nbd-client partprobe strings
1030base64 mix
1031reset hexedit nsenter shred
1032fsync insmod ionice lsmod lsusb rmmod vmstat xxd top iotop
1033lsof ionice compress dhcp dhcpd addgroup delgroup host iconv ip
1034ipcrm ipcs netstat openvt
1035deallocvt iorenice
1036udpsvd adduser
1037microcom tunctl chrt getfattr setfattr
1038kexec
1039</span>
1040</b></blockquote>
1041
1042<!-- #include "footer.html" -->
1043
1044