| <html><head><title>toybox roadmap</title> |
| <!--#include file="header.html" --> |
| <title>Toybox Roadmap</title> |
| |
| <h2>Roadmap sections</h2> |
| |
| <ul> |
| <li><a href=#goals>Introduction</a></li> |
| <li><a href=#susv4>POSIX-2008/SUSv4</a></li> |
| <li><a href=#sigh>Linux "Standard" Base</a></li> |
| <li><a href=#rfc>IETF RFCs and Man Pages</a></li> |
| <li><a href=#dev_env>Development Environment</a></li> |
| <li><a href=#android>Android Toolbox</a></li> |
| <li><a href=#aosp>Building AOSP</a></li> |
| <li><a href=#tizen>Tizen Core</a></li> |
| <li><a href=#yocto>Yocto</a></li> |
| <li><a href=#fhs>Filesystem Hierachy Standard</a></li> |
| <li><a href=#buildroot>buildroot</a></li> |
| <li>Miscelaneous: <a href=#klibc>klibc</a>, <a href=#glibc>glibc</a>, |
| <a href=#sash>sash</a>, <a href=#sbase>sbase</a>, |
| <a href=#uclinux>uclinux</a>...</li> |
| <li><a href=#packages>Other Packages</a></li> |
| <li><a href=#todo>TODO list</a></li> |
| </ul> |
| |
| <a name="goals" /> |
| <h2>Introduction (Goals and use cases)</h2> |
| |
| <p>We have several potential use cases for a new set of command line |
| utilities, and are using those to determine which commands to implement |
| for Toybox's 1.0 release. Most of these have their own section in the |
| <a href=status.html>status page</a>, showing current progress towards |
| commplation.</p> |
| |
| <p>The most interesting publicly available standards are A) POSIX-2008 (also |
| known as SUSv4), B) the Linux Standard Base version 4.1, and C) the official |
| <a href=https://www.kernel.org/doc/man-pages/>Linux man pages</a>. |
| But each of those include commands we've decided not implement, exclude |
| commands or features we have, and don't always entirely match reality.</p> |
| |
| <p>The most thorough real world test (other than a large interactive |
| userbase) is using toybox as the command line in a build system such as |
| <a href=https://landley.net/aboriginal/about.html>Aboriginal |
| Linux</a>, having it rebuild itself from source code, and using the result |
| to <a href=https://github.com/landley/control-images>build Linux From Scratch</a>. |
| The current "minimal native development system" goal is to use |
| <a href=faq.html#mkroot>mkroot</a> |
| plus <a href=faq.html#cross>musl-cross-make</a> to hermetically build |
| <a href=https://source.android.com>AOSP</a>.</p> |
| |
| <p>We've also checked what commands were provided by similar projects |
| (klibc, sash, sbase, embutils, nash, beastiebox...), looked at various |
| vendor configurations of busybox, and collected end user requests.</p> |
| |
| <p>Finally, we'd like to provide a good replacement for the Bash shell, |
| which was the first program Linux ever ran (leading up to the 0.0.1 release |
| in 1991) and remains the standard shell of Linux (no matter what Ubuntu says). |
| This doesn't necessarily mean including every last Bash 5.x feature, but |
| does involve {various,features} <(beyond) posix.</p> |
| |
| <p>See the <a href=status.html>status page</a> for the categorized command list |
| and progress towards implementing it.</p> |
| |
| <hr /> |
| <a name="standards"> |
| <h2>Use case: standards compliance.</h2> |
| |
| <h3><a name=susv4 /><a href="#susv4">POSIX-2008/SUSv4</a></h3> |
| <p>The best standards describe reality rather than attempting to impose a |
| new one. I.E. "A good standard should document, not legislate." |
| Standards which document existing reality tend to be approved by |
| more than one standards body, such as ANSI and ISO both approving <a href=https://landley.net/c99-draft.html>C99</a>. That's why IEEE 1003.1-2008, |
| the Single Unix Specification version 4, and the Open Group Base Specification |
| edition 7 are all the same standard from three sources, which most people just |
| call "posix" (short for "portable operating system that works like unix"). |
| It's available <a href=https://pubs.opengroup.org/onlinepubs/9699919799>online in full</a>, and may be downloaded as a tarball. |
| Previous versions (<a href=https://pubs.opengroup.org/onlinepubs/009695399/>SUSv3</a> and |
| <a href=https://pubs.opengroup.org/onlinepubs/7990989775/>SUSv2</a>) |
| are also available.</p> |
| |
| <p>The original Posix was a collection of different standards (POSIX.1 |
| from 1988, POSIX.1b from 1993, and POSIX.1c from 1995). The unified |
| SUSv2 came out in 1997 and SUSv3 came out in 2001. |
| <a href=https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/>Posix |
| 2008</a> was then reissued in 2013 and 2018, the first was minor wordsmithing |
| with no behavioral changes, the second was to renew a ten year timeout |
| to still be considered a "current standard" by some government regulations, |
| but isn't officially a new standard. It's still posix-2008/SUSv4/Issue 7. |
| The endless committee process to produce |
| "Issue 8" has been ongoing for over 15 years now, with conference |
| calls on mondays and thursdays, mostly to discuss recent bug tracker |
| entries then publish the minutes of the meeting on the mailing list. |
| Prominent committee members have died during this time.</p> |
| |
| <h3>Why not just use posix for everything?</h3> |
| |
| <p>Unfortunately, Posix describes an incomplete subset of reality, because |
| it was designed to. It started with proprietary unix vendors collaborating to |
| describe the functionality their fragmented APIs could agree on, which was then |
| incorporated into <a href=https://nvlpubs.nist.gov/nistpubs/Legacy/FIPS/fipspub151-2-1993.pdf>US federal procurement standards</a> |
| as a <a href=https://www.youtube.com/watch?v=nwrTTXOg-KI>compliance requirement</a> |
| for things like navy contracts, giving large corporations |
| like IBM and Microsoft millions of dollars of incentive |
| to punch holes in the standard big enough to drive |
| <a href=https://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem>Windows NT</a> and |
| <a href=http://www.naspa.net/magazine/1996/May/T9605006.PDF>OS/360</a> through. |
| When open source projects like Linux started developing on the internet |
| (enabled by the 1993 relaxation of the National Science Foundation's |
| "Acceptable Use Policy" allowing everyone to connect to the internet, |
| previously restricted to approved government/military/university organizations), |
| Posix <a href=http://www.opengroup.org/testing/fips/policy_info.html>ignored |
| the upstarts</a> and Linux eventually |
| <a href=https://www.linuxjournal.com/article/3417>returned the favor</a>, |
| leaving Posix behind.</p> |
| |
| <p>The result is a "standard" that lacks any mention of commands like |
| "init" or "mount" required to actually boot a system. |
| It describes logname but not login. It provides ipcrm |
| and ipcs, but not ipcmk, so you can use System V IPC resources but not create |
| them. And widely used real-world commands such as tar and cpio (the basis |
| of initramfs and RPM) which were present in earlier |
| versions of the standard have been removed, while obsolete commands like |
| cksum, compress, sccs and uucp remain with no mention of modern counterparts |
| like crc32/sha1sum, gzip/xz, svn/git or scp/rsync. Meanwhile posix' description |
| of the commands |
| themselves are missing dozens of features, and specify silly things like ebcdic |
| support in dd or that wc should use %d (not %lld) for byte counts. So |
| we have to extensively filter posix to get a useful set of recommendations.</p> |
| |
| <h3>Analysis</h3> |
| |
| <p>Starting with the |
| <a href="http://pubs.opengroup.org/onlinepubs/9699919799.2008edition/idx/utilities.html">full "utilities" list</a>, |
| we first remove generally obsolete |
| commands (compress ed ex pr uncompress uccp uustat uux), commands for the |
| pre-CVS "SCCS" source control system (admin delta get prs rmdel sact sccs unget |
| val what), fortran support (asa fort77), and batch processing support (batch |
| qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub).</p> |
| |
| <p>Some commands are for a compiler toolchain (ar c99 cflow ctags cxref gencat |
| iconv lex m4 make nm strings strip yacc) which is out of scope for |
| toybox and should be supplied externally. (Some of these might be |
| revisited later, but not for toybox 1.0.)</p> |
| |
| <p>Some commands are part of a command shell, and can't be implemented as |
| separate executables (alias bg cd command fc fg getopts hash jobs kill read |
| type ulimit umask unalias wait). These may be implemented as part of the |
| built-in toybox shell, but are not exported into $PATH via symlinks and |
| thus are not part of toybox's main command list. (If you fork a |
| child process and have it "cd" then exit, you've accomplished nothing.) |
| Again, what posix lists as "commands" is incomplete: a shell also needs exit, if, while, |
| for, case, export, set, unset, trap, exec... (And for bash compatibility |
| function, source, declare...)</p> |
| |
| <p>A few other commands are judgement calls, providing command-line |
| internationalization support (iconv locale localedef), System V inter-process |
| communication (ipcrm ipcs), and cross-tty communication from the minicomputer |
| days (talk mesg write). The "pax" utility <a href=https://slashdot.org/story/06/09/04/1335226/debian-kicks-jrg-schilling>failed</a> to replace tar, |
| "mailx" is |
| a command line email client, and "lp" submits files for printing to... what |
| exactly? (cups?) The standard defines crontab but not crond. What is |
| pathchk supposed to be portable _to_? (Linux accepts 255 byte path components |
| with any char except NUL or / and no max length on the total path, and |
| <a href=https://yarchive.net/comp/linux/utf8.html>EXPLICITLY</a> |
| doesn't care if it's an invalid utf8 sequence.)</p> |
| |
| <p>Removing all of that leaves the following commands, which toybox should |
| implement:</p> |
| |
| <blockquote><b> |
| <span id=posix> |
| at awk basename bc cal cat chgrp chmod chown cksum cmp comm cp |
| csplit cut date dd df diff dirname du echo env expand expr false file find |
| fold fuser getconf grep head id join kill link ln logger logname ls man |
| mkdir mkfifo more mv newgrp nice nl nohup od paste patch printf ps |
| pwd renice rm rmdir sed sh sleep sort split stty tabs tail tee test time |
| touch tput tr true tsort tty uname unexpand uniq unlink uudecode uuencode vi wc |
| who xargs zcat |
| </span> |
| </b></blockquote> |
| |
| <h3><a name=sigh /><a href="#sigh">Linux Standard Base</a></h3> |
| |
| <p>One attempt to supplement POSIX towards an actual usable system was the |
| Linux Standard Base. Unfortunately, the quality of this "standard" is |
| fairly low, largely due to the Free Standards Group that maintained it |
| being consumed by <a href=https://landley.net/notes-2010.html#18-07-2010>the Linux Foundation</a> in 2007.</p> |
| |
| <p>Where POSIX allowed its standards process to be compromised |
| by leaving things out (but what |
| they DID standardize tends to be respected, if sometimes obsolete), |
| the Linux Standard Base's failure mode was different. They responded to |
| pressure by including anything their members paid them enough to promote, |
| such as allowing Red Hat to push |
| RPM into the standard even though all sorts of distros (Debian, Slackware, Arch, |
| Gentoo, Android, Alpine...) don't use it and never will. This means anything in the LSB is |
| at best a suggestion: arbitrary portions of this standard are widely |
| ignored.</p> |
| |
| <p>The <a href=https://mjg59.dreamwidth.org/39546.html>community perception</a> |
| seems to be that the Linux Standard Base is |
| the best standard money can buy: the Linux Foundation is supported by |
| financial donations from large companies and the LSB |
| <a href=https://www.softwarefreedom.org/blog/2016/apr/11/lf/>represents the interests |
| of those donors</a> regardless of technical merit. (The Linux Foundation, which |
| maintains the LSB, is NOT a 501c3. It's a 501c6, the |
| same kind of legal entity as the Tobacco Institute and |
| <a href=https://lwn.net/Articles/706585/>Microsoft's</a> |
| old "<a href=https://en.wikipedia.org/wiki/Don%27t_Copy_That_Floppy>Don't Copy That Floppy</a>" campaign.) Debian officially |
| <a href=http://lwn.net/Articles/658809>washed its hands of LSB</a> by |
| refusing to adopt release 5.0 in 2015, and no longer even pretends to support |
| it (which affects Debian derivatives like Ubuntu and Knoppix). Toybox has |
| stayed on 4.1 for similar reasons.</p> |
| |
| <p>That said, Posix by itself isn't enough, and this is the next most |
| comprehensive standards effort for Linux so far, so we salvage what we can. |
| A lot of historical effort went into producing the standard before the |
| Linux Foundation took over.</p> |
| |
| <h3>Analysis</h3> |
| |
| <p>LSB 4.1 specifies a <a href=http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html>list of command line |
| utilities</a>:</p> |
| |
| <blockquote><b> |
| ar at awk batch bc chfn chsh col cpio crontab df dmesg du echo egrep |
| fgrep file fuser gettext grep groupadd groupdel groupmod groups |
| gunzip gzip hostname install install_initd ipcrm ipcs killall lpr ls |
| lsb_release m4 md5sum mknod mktemp more mount msgfmt newgrp od passwd |
| patch pidof remove_initd renice sed sendmail seq sh shutdown su sync |
| tar umount useradd userdel usermod xargs zcat |
| </b></blockquote> |
| |
| <p>Where posix specifies one of those commands, LSB's deltas tended to be |
| accomodations for broken tool versions which ween't up to date with the |
| 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> |
| for examples.)</p> |
| |
| <p>Since we've already committed to using our own judgement to skip bits of |
| POSIX, and LSB's "judgement" in this regard is purely bug workarounds to declare |
| various legacy tool implementations "compliant", this means we're mostly |
| interested in the set of LSB tools that aren't mentioned in posix.</p> |
| |
| <p>Of these, gettext and msgfmt are internationalization, install_initd and |
| remove_initd weren't present even in Ubuntu 10.04, lpr is out of scope, |
| lsb_release just reports information in /etc/os-release, and sendmail's |
| turned into a pile of cryptographic verification and DNS shenanigans due |
| to spammers.</p> |
| |
| <p>This leaves:</p> |
| |
| <blockquote><b> |
| <span id=lsb> |
| chfn chsh dmesg egrep fgrep groupadd groupdel groupmod groups |
| gunzip gzip hostname install killall md5sum |
| mknod mktemp mount passwd pidof seq shutdown |
| su sync tar umount useradd userdel usermod zcat |
| </span> |
| </b></blockquote> |
| |
| <h3><a name=rfc /><a href="#rfc">IETF RFCs and Man Pages</a></h3> |
| |
| <p>They're very nice, but there's thousands of them. The signal to noise |
| ratio here is terrible.</p> |
| |
| <p>Discussion of standards wouldn't be complete without the Internet |
| Engineering Task Force's "<a href=https://www.rfc-editor.org/in-notes/rfc-index.txt>Request For Comments</a>" collection and Michael Kerrisk's |
| <a href=https://www.kernel.org/doc/man-pages/>Linux man-pages project</a>... |
| except these aren't standards, they're collections of documentation with |
| low barriers to inclusion. They're not saying "you should support |
| X", they're saying "if you do, here's how". |
| Thus neither really helps us select which commands to include.</p> |
| |
| <p>The man pages website includes the commands in git, yum, perf, postgres, |
| flatpack... Great for examining the features of a command you've |
| already decided to include, useless for deciding _what_ to include.</p> |
| |
| <p>The RFCs are more about protocols than commands. The noise level is |
| extremely high: there's thousands of RFCs, many describing a proposed idea |
| that never took off, and less than 1% of the resulting documents are |
| currently relevant to toybox. The documents are numbered based on the |
| order they were received, with no real attempt at coherently indexing |
| the result. As with man pages they can be <a href=https://www.ietf.org/rfc/rfc0610.txt>long and complicated</a> or |
| <a href=https://www.ietf.org/rfc/rfc1951.txt>terse and impenetrable</a>, |
| have developed a certain amount of <a href=https://www.ietf.org/rfc/rfc8179.txt>bureaucracy</a> over the years, and often the easiest way to understand what |
| they <a href=https://www.ietf.org/rfc/rfc4330.txt>document</a> is to find an <a href=https://www.ietf.org/rfc/rfc1769.txt>earlier version</a> to read first. |
| (This is an example of the greybeard community problem, where all current |
| documentation was written by people who don't remember NOT already knowing |
| this stuff and the resources they originally learned from are long gone.)</p> |
| |
| <p>That said, RFC documents can be useful (especially for networking protocols) |
| and the four URL templates the recommended starting files |
| for new commands (hello.c and skeleton.c in the toys/example directory) |
| provide point to example posix, lsb, man, and rfc pages online.</p> |
| |
| <hr /> |
| <a name="dev_env"> |
| <h2><a href="#dev_env">Use case: provide a self-hosting development environment</a></h2> |
| |
| <p>Once upon a time, the following commands were enough to build the <a href=http://landley.net/aboriginal/about.html>Aboriginal Linux</a> development |
| environment, 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> |
| |
| <blockquote><b> |
| <span id=development> |
| bzcat cat cp dirname echo env patch rmdir sha1sum sleep sort sync |
| true uname wc which yes zcat |
| awk basename chmod chown cmp cut date dd diff |
| egrep expr fdisk find grep gzip head hostname id install ln ls |
| mkdir mktemp mv od readlink rm sed sh tail tar touch tr uniq |
| wget whoami xargs chgrp comm gunzip less logname split |
| tee test time bunzip2 chgrp chroot comm cpio dmesg |
| dnsdomainname ftpget ftpput gunzip ifconfig init |
| logname losetup mdev mount mountpoint nc pgrep pkill |
| pwd route split stat switch_root tac umount vi |
| resize2fs tune2fs fsck.ext2 genext2fs mke2fs xzcat |
| </span> |
| </b></blockquote> |
| |
| <p>This use case includes running init scripts and other shell scripts, running |
| configure, make, and install in each package, and providing basic command line |
| facilities such as a text editor. (It does not include a compiler toolchain or |
| C library, those are outside the scope of the toybox project, although mkroot |
| has a <a href=https://landley.net/code/qcc>potential follow-up project</a>. |
| For now we use distro toolchains, |
| <a href=https://github.com/richfelker/musl-cross-make>musl-cross-make</a>, |
| and the Android NDK for build testing.) |
| That build system also installed bash 2.05b as #!/bin/sh and its scripts |
| required bash extensions not present in shells such as busybox ash. |
| To replace that, toysh needs to supply several bash extensions _and_ work |
| when called under the name "bash".</p> |
| |
| <p>The above command list was collected using a command line recording wrapper |
| (mkroot/record-commands and toys/example/logpath.c) which mkroot/mkroot.sh |
| also uses to populate root/build/log/*-commands.txt. Try |
| <b>awk '{print $1}' root/build/log/*-commands.txt | sort -u | grep -v musl | xargs</b> |
| after building a mkroot target to see the list of commands called out |
| of the $PATH during that build.</p> |
| |
| <h3>Stages and moving targets</h3> |
| |
| <p>The development environment use case has two stages, achieving: |
| 1) a bootable system that can rebuild itself from source, and 2) |
| a build environment capable |
| of bootstrapping up to arbitrary complexity (by building |
| Linux From Scratch and Beyond Linux From Scratch under the resulting |
| system, or the Android Open Source Project). To accomplish just the first |
| goal (a minimal system that can rebuild _itself_ from source), the old |
| build still needs the following busybox commands for which toybox does |
| not yet supply adequate replacements:</p> |
| |
| <blockquote><b> |
| awk diff expr fdisk gzip less route sh tr unxz vi xzcat |
| </b></blockquote> |
| |
| <p>All of those except awk and less have partial implementations |
| in "pending".</p> |
| |
| <p>In 2017 Aboriginal Linux development ended, replaced by a much simpler |
| project ("mkroot") designed to use an existing cross+native toolchain (such as |
| <a href=https://github.com/richfelker/musl-cross-make>musl-cross-make</a> |
| or the Android NDK) instead of building its own cross and native compilers |
| from source. In 2019 the still-incomplete |
| mkroot was merged into toybox as the "make root" target (which runs |
| mkroot/mkroot.sh). This is intended |
| as a simpler way of providing essentially the same build environment, and doesn't |
| significantly affect the rest of this analysis (although the "rebuild itself |
| from source" test should now include building musl-cross-make under either |
| mkroot or toybox's "make airlock" host environment).</p> |
| |
| <p>Building Linux From Scratch is not the same as building the |
| <a href=https://source.android.com>Android Open Source Project</a>, |
| but after toybox 1.0 we plan to try |
| <a href=http://landley.net/aboriginal/about.html#hairball>modifying the AOSP build</a> |
| to reduce dependencies. (It's fairly likely we'll have to add at least |
| a read-only git utility so repo can download the build's source code, |
| but that's actually <a href=https://www.youtube.com/watch?v=I-lGyn3PHP4>not |
| that hard</a>. We'll probably also need our own "make" at some point after |
| 1.0, which is its own moving target thanks to cmake and ninja and so on.) |
| The ongoing Android <a href=http://lists.landley.net/pipermail/toybox-landley.net/2018-January/009330.html>hermetic build</a> work is already advancing |
| this goal.</p> |
| |
| <hr /> |
| <h2><a name=android /><a href="#android">Use case: Replacing Android Toolbox</a></h2> |
| |
| <p>Android has a policy against GPL in userspace, so even though BusyBox |
| predates Android by many years, they couldn't use it. Instead they grabbed |
| an old version of ash (later replaced by |
| <a href="https://www.mirbsd.org/mksh.htm">mksh</a>) |
| and implemented their own command line utility set |
| called "toolbox" (which toybox has already mostly replaced).</p> |
| |
| <p>Toolbox doesn't have its own repository, instead it's part of Android's |
| <a href=https://android.googlesource.com/platform/system/core>system/core |
| git repository</a>. Android's Native Development Kit (their standalone |
| downloadable toolchain) has its own |
| <a href=https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md>roadmap</a>, and each version has |
| <a href=https://developer.android.com/ndk/downloads/revision_history>release |
| notes</a>.</p> |
| |
| <h3>Toolbox commands:</h3> |
| |
| <p>According to <a href=https://android.googlesource.com/platform/system/core/+/master/toolbox/Android.bp> |
| system/core/toolbox/Android.bp</a> the toolbox directory builds the |
| following commands:</p> |
| |
| <blockquote><b> |
| getevent getprop modprobe setprop start |
| </b></blockquote> |
| |
| <p>getprop/setprop/start were in toybox and moved back because they're so |
| tied to non-public system interfaces. modprobe shares the implementation |
| used in init. getevent is a board bringup tool built with a python script |
| that pulls all the constants from the latest kernel headers.</p> |
| |
| <h3>Other Android /system/bin commands</h3> |
| |
| <p>Other than the toolbox links, the currently interesting |
| binaries in /system/bin are:</p> |
| |
| <ul> |
| <li><b>arping</b> - ARP REQUEST tool (iputils)</li> |
| <li><b>blkid</b> - identify block devices (e2fsprogs)</li> |
| <li><b>e2fsck</b> - fsck for ext2/ext3/ext4 (e2fsprogs)</li> |
| <li><b>fsck.f2fs</b> - fsck for f2fs (f2fs-tools)</li> |
| <li><b>fsck_msdos</b> - fsck for FAT (BSD)</li> |
| <li><b>gzip</b> - compression/decompression tool (zlib)</li> |
| <li><b>ip</b> - network routing tool (iproute2)</li> |
| <li><b>iptables/ip6tables</b> - IPv4/IPv6 NAT admin (iptables)</li> |
| <li><b>iw</b> - wireless device config tool (iw)</li> |
| <li><b>logwrapper</b> - redirect stdio to android log (Android)</li> |
| <li><b>make_ext4fs</b> - make ext4 fs (Android)</li> |
| <li><b>make_f2fs</b> - make f2fs fs (f2fs-tools)</li> |
| <li><b>ping/ping6</b> - ICMP ECHO_REQUEST tool (iputils)</li> |
| <li><b>reboot</b> - reboot (Android)</li> |
| <li><b>resize2fs</b> - resize ext2/ext3/ext4 fs (e2fsprogs)</li> |
| <li><b>sh</b> - mksh (BSD)</li> |
| <li><b>ss</b> - socket statistics (iproute2)</li> |
| <li><b>tc</b> - traffic control (iproute2)</li> |
| <li><b>tracepath/tracepath6</b> - trace network path (iputils)</li> |
| <li><b>traceroute/traceroute6</b> - trace network route (iputils)</li> |
| </ul> |
| |
| <p>The names in parentheses are the upstream source of the command.</p> |
| |
| <h3>Analysis</h3> |
| |
| <p>For reference, combining everything listed above that's still "fair game" |
| for toybox, we get:</p> |
| |
| <blockquote><b> |
| arping blkid e2fsck dd fsck.f2fs fsck_msdos gzip ip iptables |
| ip6tables iw logwrapper make_ext4fs make_f2fs modpobe newfs_msdos ping ping6 |
| reboot resize2fs sh ss tc tracepath tracepath6 traceroute traceroute6 |
| </b></blockquote> |
| |
| <p>We may eventually implement all of that, but for toybox 1.0 we need to |
| focus a bit. If Android has an acceptable external package, and the command |
| isn't needed for system bootstrapping, replacing the external package is |
| not a priority.</p> |
| |
| <p>However, several commands toybox plans to implement anyway could potentially |
| replace existing Android versions, so we should take into account Android's use |
| cases when doing so. This includes:</p> |
| <blockquote><b> |
| <span id=toolbox> |
| getevent gzip modprobe newfs_msdos sh |
| </span> |
| </b></blockquote> |
| |
| <p>Update: <a href=https://android.googlesource.com/platform/system/core/+/master/system/core/Android.bp> |
| external/toybox/Android.bp</a> has symlinks for the following toys out |
| of "pending". (The toybox modprobe is also built for the device, but |
| it isn't actually used and is only there for sanity checking against |
| the libmodprobe-based implementation.) These should be a priority for |
| cleanup:</p> |
| |
| <blockquote><b> |
| diff expr getopt tr brctl getfattr lsof modprobe more stty traceroute vi |
| </b></blockquote> |
| |
| <p>Android wishlist:</p> |
| |
| <blockquote><b> |
| mtools genvfatfs mke2fs gene2fs |
| </b></blockquote> |
| |
| <hr /> |
| <h2><a name=aosp /><a href="#aosp">Use case: Building AOSP</a></h2> |
| |
| <p>The list of external tools used to build AOSP was |
| <a href="https://android.googlesource.com/platform/build/soong/+/master/ui/build/paths/config.go">here</a>, |
| but as they're switched over to toybox they disappear and reappear |
| <a href="https://android.googlesource.com/platform/prebuilts/build-tools/+/refs/heads/master/path/linux-x86/">here</a>.</p> |
| |
| <blockquote><b> |
| awk basename bash bc bzip2 cat chmod cmp comm cp cut date dd diff dirname dlv du |
| echo egrep env expr find fuser getconf getopt git grep gzip head hexdump |
| hostname id jar java javap ln ls lsof m4 make md5sum mkdir mktemp mv od openssl |
| paste patch pgrep pkill ps pstree pwd python python2.7 python3 readlink |
| realpath rm rmdir rsync sed setsid sh sha1sum sha256sum sha512sum |
| sleep sort stat tar tail tee touch tr true uname uniq unix2dos unzip |
| wc which whoami xargs xxd xz zip zipinfo |
| </b></blockquote> |
| |
| <p>The following are already in the tree and will be used directly:</p> |
| |
| <blockquote><b> |
| awk bc bzip2 jar java javap m4 make python python2.7 python3 xz |
| </b></blockquote> |
| |
| <p>Subtracting what's already in toybox (including the following toybox toys |
| that are still in pending: <code>diff expr gzip lsof tr</code>), |
| that leaves:</p> |
| |
| <blockquote><b> |
| bash fuser git hexdump openssl pstree rsync sh unzip zip zipinfo |
| </b></blockquote> |
| |
| <p>For AOSP, zip/zipinfo/unzip are likely to be libziparchive based. |
| git/openssl seem like they should just be brought in to the tree. rsync is |
| used to work around a Mac <code>cp -Rf</code> bug with broken symbolic links. |
| That leaves:</p> |
| |
| <blockquote><b> |
| bash fuser hexdump pstree |
| </b></blockquote> |
| |
| <p>(Why are fuser and pstree used during the AOSP build? They're used for |
| diagnostics if something goes wrong. So it's really just bash and hexdump |
| that are actually used to build.)</p> |
| |
| <hr /> |
| <h2><a name=tizen /><a href="#tizen">Use case: Tizen Core</a></h2> |
| |
| <p>A side effect of the Linux Foundation following the money to the |
| exclusion of all else is they "support" their donors' myriad often |
| contradictory pet projects with elaborate announcements and press releases. |
| Long ago when Nokia's Maemo merged |
| with Intel's Moblin to form <a href=https://www.linuxfoundation.org/press-release/linux-foundation-to-host-meego-project/>MeeGo</a>, there were believable <a href=https://www.linuxfoundation.org/press-release/public-support-for-the-meego-project/>statements</a> |
| about unifying fragmented vendor efforts. Then MeeGo merged with |
| <a href=http://en.wikipedia.org/wiki/LiMo_Foundation>LiMo</a> to |
| <a href=notes-2012.html#16-05-2012>form Tizen</a>, |
| which became a Samsung-only project (that <a href=https://www.androidheadlines.com/2021/05/samsung-tvs-continue-use-tizen-os.html>still ships</a> |
| inside <a href=https://twitter.com/cstross/status/1453747613686288385>televisions</a>, |
| but was otherwise subsumed into <a href=https://www.theverge.com/2021/5/18/22440483/samsung-smartwatch-google-wearos-tizen-watch>Android GO</a>).</p> |
| |
| <p>Along the way, the Tizen project expressed a desire to eliminate GPLv3 software |
| from its core system, and in installing toybox as |
| <a href=https://wiki.tizen.org/wiki/Toybox>part of this process</a>.</p> |
| |
| <p>They had a fairly long list of new commands they wanted to see in toybox:</p> |
| |
| <blockquote><b> |
| <span id=tizen_cmd> |
| arch base64 users unexpand shred join csplit |
| hostid nproc runcon sha224sum sha256sum sha384sum sha512sum sha3sum mkfs.vfat fsck.vfat |
| dosfslabel uname pinky diff3 sdiff zcmp zdiff zegrep zfgrep zless zmore |
| </span> |
| </b></blockquote> |
| |
| <p>In addition, they wanted to use several commands then in pending:</p> |
| |
| <blockquote><b> |
| <span id=tizen> |
| tar diff printf wget rsync fdisk vi less tr test stty fold expr dd |
| </span> |
| </b></blockquote> |
| |
| <p>Also, tizen uses a different Linux Security Module called SMACK, so |
| many of the SELinux options ala ls -Z needed smack alternatives in an |
| if/else setup. We added lib/lsm.h to abstract this, but haven't heard |
| from Tizen in years and have started implementing SELinux support without |
| Smack support in places like tar.c. At some point, lib/lsm.h may go away |
| due to lack of expressed interest.</p> |
| |
| <hr /> |
| <h2><a name=yocto /><a href="#yocto">Use case: Yocto</a></h2> |
| |
| <p>Another project the Linux Foundation is paid to appreciate is Yocto, |
| which was designed to fix the ongoing proprietary fragmentation problem |
| (now in Linux build systems instead of vendor unix forks) by being the |
| build system equivalent of a glue trap. While proclaiming that having the |
| "minimum level of standardization" contributes to a "strong ecosystem", |
| Yocto uses a "<a href=https://www.yoctoproject.org/software-overview/layers/>layered</a>" |
| design where everybody who touches it is encouraged to add more and more layers |
| of metadata on top of what came before, until they wind up <a href=https://github.com/varigit/variscite-bsp-platform>using repo</a> just to manage |
| the layers (let alone their contents). But -- and this is the |
| important bit -- all these dispirate forks are called "yocto" and built on |
| top of giant piles of code the Linux Foundation can take credit for |
| since they filed the serial numbers off OpenEmbedded. (And THEN users |
| are encouraged to check the result into their own repository as one |
| big initial commit, discarding all layers and history.)</p> |
| |
| <p>Yocto's "core-image-minimal" target (only 3,106 build steps in the 3.3 |
| release, which includes building host versions of gnome packages and |
| <a href=https://landley.net/notes-2019.html#06-02-2019>something called</a> |
| the "uninative binary shim") builds a busybox-based system with the following commands:</p> |
| |
| <blockquote><b> |
| <span id=yocto_cmd> |
| addgroup adduser ascii sh awk base32 basename blkid bunzip2 bzcat bzip2 cat |
| chattr chgrp chmod chown chroot chvt clear cmp cp cpio crc32 cut date dc dd |
| deallocvt delgroup deluser depmod df diff dirname dmesg dnsdomainname du |
| dumpkmap dumpleases echo egrep env expr false fbset fdisk fgrep find flock |
| free fsck fstrim fuser getopt getty grep groups gunzip gzip head hexdump |
| hostname hwclock id ifconfig ifdown ifup insmod ip kill killall klogd less |
| ln loadfont loadkmap logger logname logread losetup ls lsmod lzcat md5sum |
| mesg microcom mkdir mkfifo mknod mkswap mktemp modprobe more mount mountpoint |
| mv nc netstat nohup nproc nslookup od openvt patch pgrep pidof pivot_root |
| printf ps pwd rdate readlink realpath reboot renice reset resize rev rfkill |
| rm rmdir rmmod route run-parts sed seq setconsole setsid sh sha1sum sha256sum |
| shuf sleep sort start-stop-daemon stat strings stty sulogin swapoff swapon |
| switch_root sync sysctl syslogd tail tar tee telnet test tftp time top touch |
| tr true ts tty udhcpc udhcpd umount uname uniq unlink unzip uptime users |
| usleep vi watch wc wget which who whoami xargs xzcat yes zcat |
| </span> |
| </b></blockquote> |
| |
| <p>Nobody seems entirely sure why.</p> |
| |
| <a name="fhs" /> |
| <hr /><a href=fhs>Filesystem Hierachy Standard</a> |
| <h2>Filesystem Hierarchy Standard:</h2> |
| |
| <p>Another standard taken over by the Linux Foundation. (At least the |
| links to this one didn't <a href=http://lanana.org/>go 404</a> the |
| instant they took it over). Of historical interest due to what it |
| managed to achieve before they chased away the hobbyists maintaining it. |
| Only one version (3.0 in 2015) has been released since the Linux Foundation |
| absorbed the FHS. The previous release, Version 2.3, was released in 2004. |
| The Linux Foundation did not retain earlier versions. The contents of |
| the relevant sections appear identical between the two versions, in the |
| 11 years between releases the Linux Foundation just added section numbers.</p> |
| |
| <p><a href=https://refspects.linuxfoundation.org/FHS_3.0/fhs-3.0.html>FHS 3.0</a> |
| section 3.4.2 requires commands to be in the /bin directory, and then 3.4.3 |
| has an optional list, |
| and then 3.16.2 and 3.16.3 similarly cover /sbin. There are linux |
| specific sections in 6.1.2 and 6.1.6 but everything in them is obsolete.</p> |
| |
| <p>The /bin options include csh but not bash, and ed but not vi. |
| The /sbin options have "update" which seems obsolete (filesystem |
| buffers haven't needed a userspace process to flush them for DECADES), |
| "fastboot" and "fasthalt" (reboot and halt have -nf), and |
| fsck.* and mkfs.* that don't actually specify any specific filesystems. |
| Removing that gives us:</p> |
| |
| <blockquote><b> |
| <span id=fhs_cmd> |
| cat chgrp chmod chown cp date dd df dmesg echo false hostname kill ln |
| login ls mkdir mknod more mount mv ps pwd rm rmdir sed sh stty su sync true |
| umount uname tar cpio gzip gunzip zcat netstat ping |
| shutdown fdisk getty halt ifconfig init mkswap reboot route swapon swapoff |
| </span> |
| </b></blockquote> |
| |
| <hr /><a name=buildroot /> |
| <h2>buildroot:</h2> |
| |
| <p>If a toybox-based development environment is to support running |
| buildroot under it, the <a href=https://buildroot.org/downloads/manual/manual.html#requirement-mandatory>mandatory packages</a> |
| section of the buildroot manual lists:</p> |
| |
| <blockquote><p><b> |
| which sed make bash patch gzip bzip2 tar cpio unzip rsync file bc wget |
| </b></p></blockquote> |
| |
| <p>(It also lists binutils gcc g++ perl python, and for debian it wants |
| the build-essential meta-package. And it wants file to be in /usr/bin because |
| <a href=https://git.busybox.net/buildroot/tree/support/dependencies/dependencies.sh?h=2018.02.x#n84>libtool |
| breaks otherwise</a>.)</p> |
| |
| <p>Oddly, buildroot can't NOT cross compile. Buildroot does not support a cross toolchain that lives in "/usr/bin" |
| with a prefix of "". If you try, and chop out the test for a blank prefix, |
| it dies trying to run "/usr/bin/-gcc". In theory you can modify any open source |
| project to do anything if you rewrite enough of it, but buildroot's developers |
| explicitly do not support this usage model.</p> |
| |
| <hr /><a name=klibc /> |
| <h2>klibc:</h2> |
| |
| <p>Long ago some kernel developers came up with a project called |
| <a href=http://en.wikipedia.org/wiki/Klibc>klibc</a>. |
| After a decade of development it still has no web page or HOWTO, |
| and nobody's quite sure if the license is BSD or GPL. It inexplicably |
| <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 |
| replacement.</p> |
| |
| <p>In addition to a C library less general-purpose than old versions of bionic |
| (let alone musl), klibc builds a random assortment of executables to run init scripts |
| with. There's no multiplexer command, these are individual executables:</p> |
| |
| <blockquote><p><b> |
| cat chroot cpio dd dmesg false fixdep fstype gunzip gzip halt ipconfig kill |
| kinit ln losetup ls minips mkdir mkfifo mknodes |
| mksyntax mount mv nfsmount nuke pivot_root poweroff readlink reboot resume |
| run-init sh sha1hash sleep sync true umount uname zcat |
| </b></p></blockquote> |
| |
| <p>To get that list, build klibc according to the instructions (I |
| <a href=http://landley.net/notes-2013.html#23-01-2013>looked at</a> version |
| 2.0.2 and did cd klibc-*; ln -s /output/of/kernel/make/headers_install |
| linux; make) then <b>echo $(for i in $(find . -type f); do file $i | grep -q |
| executable && basename $i; done | grep -v '[.]g$' | sort -u)</b> to find |
| executables, then eliminate the *.so files and *.shared duplicates.</p> |
| |
| <p>Some of those binaries are build-time tools that don't get installed, |
| which removes mknodes, mksyntax, sha1hash, and fixdep from the list. |
| (And sha1hash is just an unpolished sha1sum anyway.)</p> |
| |
| <p>The run-init command is more commonly called switch_root, nuke is just |
| "rm -rf -- $@", and minips is more commonly called "ps": I'm not doing aliases |
| for these oddball names. |
| The "kinit" command is another gratuitous rename, it's init running as PID 1. |
| The halt, poweroff, and reboot commands work with it. |
| Yet more stale forks of dash and gzip got sucked in here (see "dubious |
| license terms" above).</p> |
| |
| <p>In theory "blkid" or "file" handle fstype (and df for mounted filesystems), |
| but we could do fstype. We should also implement nfsmount, and probably smbmount |
| and p9mount even though this hasn't got one. (The reason these aren't |
| in the base "mount" command is they interactively query login credentials.) |
| The ipconfig command here has a built in dhcp client, so it's ifconfig |
| and dhcpcd and maybe some other stuff.</p> |
| |
| <p>The resume command is... weird. It finds a swap partition and reads data |
| from it into a /proc file, something the kernel is capable of doing itself. |
| (Even though the klibc author |
| <a href=http://www.zytor.com/pipermail/klibc/2006-June/001748.html>attempted |
| to remove</a> that capability from the kernel, current kernel/power/hibernate.c |
| still parses "resume=" on the command line). And yet various distros seem to |
| make use of klibc for this. |
| Given the history of swsusp/hibernate (and |
| <a href=http://lwn.net/Articles/333007>TuxOnIce</a> |
| and <a href=http://lwn.net/Articles/242107>kexec jump</a>...) I've lost track |
| of the current state of the art here. Ah, Documentation/power/userland-swsusp.txt |
| has the API docs, and <a href=http://suspend.sf.net>here's a better |
| tool</a>...</p> |
| |
| <p>This gives us a klibc command list:</p> |
| |
| <blockquote><b> |
| <span id=klibc_cmd> |
| cat chroot dmesg false kill ln losetup ls mkdir mkfifo readlink rm switch_root |
| sleep sync true uname |
| |
| cpio dd ps mv pivot_root |
| mount nfsmount fstype umount |
| sh gunzip gzip zcat |
| kinit halt poweroff reboot |
| ipconfig |
| resume |
| </span> |
| </b></blockquote> |
| |
| <hr /> |
| <a name=glibc /> |
| <h2>glibc</h2> |
| |
| <p>Rather a lot of command line utilities come bundled with glibc:</p> |
| |
| <blockquote><b> |
| catchsegv getconf getent iconv iconvconfig ldconfig ldd locale localedef |
| mtrace nscd rpcent rpcinfo tzselect zdump zic |
| </b></blockquote> |
| |
| <p>Of those, musl libc only implements ldd. Of the rest:</p> |
| |
| <ul> |
| <li><b>catchsegv</b> is a rudimentary debugger, probably out of scope for toybox.</li> |
| <li><b>iconv</b> has been <a href="#susv4">previously discussed</a>.</li> |
| <li><b>iconvconfig</b> is only relevant if iconv is user-configurable; musl uses a |
| non-configurable iconv now that utf8+unicode exist.</li> |
| <li><b>getconf</b> is a posix utility which displays several variables from |
| unistd.h; it probably belongs in the development toolchain.</li> |
| <li><b>getent</b> handles retrieving entries from passwd-style databases |
| (in a rather lame way) and is trivially replacable by grep.</li> |
| <li><b>locale</b> was discussed under <a href=#susv4>posix</a>.</li> |
| <li><b>localedef</b> compiles locale definitions, which musl currently does not use.</li> |
| <li><b>mtrace</b> is a perl script to use the malloc debugging that glibc has built-in; |
| this is not relevant for musl, and would necessarily vary with libc.</li> |
| <li><b>nscd</b> is a name service caching daemon, which is not yet relevant for musl.</li> |
| <li><b>rpcinfo</b> and <b>rpcent</b> are related to the Remote Procedure Calls |
| layer (an old sun technology used by some userspace NFS implementations), |
| which musl does not include and debian does not install by default.</li> |
| </ul> |
| |
| <p>The remaining commands involve glibc's bundled timezone database, |
| which seems to be derived from the <a href=http://www.iana.org/time-zones>IANA |
| timezone database</a>. Unless we want to maintain our own fork of the |
| standards body's database like glibc does, these are of no interest, |
| but for completeness:</p> |
| |
| <ul> |
| <li><b>tzselect</b> outputs a TZ variable correponding to user input. |
| The documentation does not indicate how to use it in a script, but it seems |
| that Debian may have done so.</li> |
| <li><b>zdump</b> prints current time in each of several timezones, optionally |
| outputting a great deal of extra information about each timezone.</li> |
| <li><b>zic</b> converts a description of a timezone to a file in tz format.</li> |
| </ul> |
| |
| <p>We implemented getconf and iconv, and I could see maybe arguing for ncsd. |
| The rest are not relevant to toybox.</p> |
| |
| </b></blockquote> |
| |
| <hr /> |
| <a name=sash /> |
| <h2>Stand-Alone Shell</h2> |
| |
| <p>Wikipedia has <a href=http://en.wikipedia.org/wiki/Stand-alone_shell>a good |
| summary of sash</a>, with links. The original Stand-Alone Shell project reached |
| a stopping point, and then <a href=http://www.baiti.net/sash>"sash plus |
| patches"</a> extended it a bit further. The result is a megabyte executable |
| that provides 40 commands.</p> |
| |
| <p>Sash is a shell with built-in commands. It doesn't have a multiplexer |
| command, meaning "sash ls -l" doesn't work (you have to go "sash -c 'ls -l'"). |
| </p> |
| |
| <p>The list of commands can be obtained via building it and doing |
| "echo help | ./sash | awk '{print $1}' | sed 's/^-//' | xargs echo", which |
| gives us:</p> |
| |
| <blockquote><b> |
| alias aliasall ar cd chattr chgrp chmod chown cmp cp chroot dd echo ed exec |
| exit file find grep gunzip gzip help kill losetup losetup ln ls lsattr mkdir |
| mknod more mount mv pivot_root printenv prompt pwd quit rm rmdir setenv source |
| sum sync tar touch umask umount unalias where |
| </b></blockquote> |
| |
| <p>Plus sh because it's a shell. A dozen or so commands can only sanely be |
| implemented as shell builtins (alias aliasall cd exec exit prompt quit setenv |
| source umask unalias), and where is an alias for which.</p> |
| |
| <p>This leaves:</p> |
| |
| <blockquote><b> |
| <span id=sash_cmd> |
| chgrp chmod chown cmp cp chroot echo find grep help kill losetup |
| ln ls mkdir mknod mount mv pivot_root printenv pwd rm rmdir sync tar touch umount |
| ar chattr dd ed file gunzip gzip lsattr more sh |
| </span> |
| </b></blockquote> |
| |
| <p>(For once, this project doesn't include a fork of gzip, instead |
| it sucks in -lz from the host.)</p> |
| |
| <hr /> |
| <a name=sbase /> |
| <h2>sbase:</h2> |
| |
| <p>It's <a href=http://git.suckless.org/sbase>on suckless</a> in |
| <a href=http://git.suckless.org/ubase>two parts</a>. As of November 2015 it's |
| implemented the following (renaming "cron" to "crond" for |
| consistency, and yanking "sponge", "mesg", "pagesize", "respawn", and |
| "vtallow"):</p> |
| |
| <blockquote><p> |
| <span id=sbase_cmd> |
| basename cal cat chgrp chmod chown chroot cksum cmp comm cp crond cut date |
| dirname du echo env expand expr false find flock fold getconf grep head |
| hostname join kill link ln logger logname ls md5sum mkdir mkfifo mktemp mv |
| nice nl nohup od paste printenv printf pwd readlink renice rm rmdir sed seq |
| setsid sha1sum sha256sum sha512sum sleep sort split strings sync tail |
| tar tee test tftp time touch tr true tty uname unexpand uniq unlink uudecode |
| uuencode wc which xargs yes |
| </span> |
| </p></blockquote> |
| |
| <p>and<p> |
| |
| <blockquote><p> |
| <span id=sbase_cmd> |
| chvt clear dd df dmesg eject fallocate free id login mknod mountpoint |
| passwd pidof ps stat su truncate unshare uptime watch |
| who |
| </span> |
| </p></blockquote> |
| |
| <hr /> |
| <a name=nash /> |
| <h2>nash:</h2> |
| |
| <p>Red Hat's nash was part of its "mkinitrd" package, replacement for a shell |
| and utilities on the boot floppy back in the 1990's (the same general idea |
| as BusyBox, developed independently). Red Hat discontinued nash development |
| in 2010, replacing it with dracut (which collects together existing packages, |
| including busybox).</p> |
| |
| <p>I couldn't figure out how to beat source code out of |
| <a href=http://pkgs.fedoraproject.org/git/mkinitrd>Fedora's current git</a> |
| repository. The last release version that used it was Fedora Core 12 |
| 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> |
| that can be unwound with "rpm2cpio mkinitrd.src.rpm | cpio -i -d -H newc |
| --no-absolute-filenames" and in there is a mkinitrd-6.0.93.tar.bz2 which |
| has the source.</p> |
| |
| <p>In addition to being a bit like a command shell, the nash man page lists the |
| following commands:</p> |
| |
| <blockquote><p> |
| access echo find losetup mkdevices mkdir mknod mkdmnod mkrootdev mount |
| pivot_root readlink raidautorun setquiet showlabels sleep switchroot umount |
| </p></blockquote> |
| |
| <p>Oddly, the only occurrence of the string pivot_root in the nash source code |
| is in the man page, the command isn't there. (It seems to have been removed |
| when the underscoreless switchroot went in.)</p> |
| |
| <p>A more complete list seems to be the handlers[] array in nash.c:</p> |
| |
| <blockquote><p> |
| access buildEnv cat cond cp daemonize dm echo exec exit find kernelopt |
| loadDrivers loadpolicy mkchardevs mkblktab mkblkdevs mkdir mkdmnod mknod |
| mkrootdev mount netname network null plymouth hotplug killplug losetup |
| ln ls raidautorun readlink resume resolveDevice rmparts setDeviceEnv |
| setquiet setuproot showelfinterp showlabels sleep stabilized status switchroot |
| umount waitdev |
| </p></blockquote> |
| |
| <p>This list is nuts: "plymouth" is an alias for "null" which is basically |
| "true" (which the above list doesn't have). Things like buildEnv and |
| loadDrivers are bespoke Red Hat behavior that might as well be hardwired in |
| to nash's main() without being called.</p> |
| |
| <p>Instead of eliminating items |
| from the list with an explanation for each, I'm just going to cherry pick |
| a few: the device mapper (dm, raidautorun) is probably interesting, |
| hotplug (may be obsolete due to kernel changes that now load firmware |
| directly), and another "resume" ala klibc.</p> |
| |
| <p>But mostly: I don't care about this one. And neither does Red Hat anymore.</p> |
| |
| <p>Verdict: ignore</p> |
| |
| <hr /> |
| <a name=beastiebox /> |
| <h2>Beastiebox</h2> |
| |
| <p>Back in 2008, the BSD guys vented some busybox-envy |
| <a href=http://beastiebox.sourceforge.net>on sourceforge</a>. Then stopped. |
| Their repository is still in CVS, hasn't been touched in years, it's a giant |
| hairball of existing code sucked together. (The web page says the author |
| is aware of crunchgen, but decided to do this by hand anyway. This is not |
| a collection of new code, it's a katamari of existing code rolled up in a |
| ball.)</p> |
| |
| <p>Combining the set of commands listed on the web page with the set of |
| man pages in the source gives us:</P> |
| |
| <blockquote><p> |
| [ cat chmod cp csh date df disklabel dmesg echo ex fdisk fsck fsck_ffs getty |
| halt hostname ifconfig init kill less lesskey ln login ls lv mksh more mount |
| mount_ffs mv pfctl ping poweroff ps reboot rm route sed sh stty sysctl tar test |
| traceroute umount vi wiconfig |
| </p></blockquote> |
| |
| <p>Apparently lv is the missing link between ed and vi, copyright 1982-1997 (do |
| not want), ex is another obsolete vi mode, lesskey is "used to |
| specify a set of key bindings to be used with less", and csh is a shell they |
| sucked in (even though they have mksh?), [ is an alias for test. Several more bsd-isms that don't have Linux |
| equivalents (even in the ubuntu "install this package" search) are |
| disklabel, fsck_ffs, mount_ffs, and pfctl. And wiconfig is a |
| wavelan interface network card driver utility. Subtracting all that and the |
| commands toybox already implements at triage time, we get:</p> |
| |
| <blockquote><p> |
| <span id=beastiebox_cmd> |
| fdisk fsck getty halt ifconfig init kill less more mount mv ping poweroff |
| ps reboot route sed sh stty sysctl tar test traceroute umount vi |
| </span> |
| </p></blockquote> |
| |
| <p>Not a hugely interesting list, but eh.</p> |
| |
| <p>Verdict: ignore</p> |
| |
| <hr /> |
| <a name=BsdBox /> |
| <h2>BsdBox</h2> |
| |
| <p>Somebody decided to do a <a href=https://wiki.freebsd.org/AdrianChadd/BsdBox>multicall binary for freebsd</a>.</p> |
| |
| <p>They based it on crunchgen, a tool that glues existing programs together |
| into an archive and uses the name to execute the right one. It has no |
| simplification or code sharing benefits whatsoever, it's basically an |
| archiver that produces executables.</p> |
| |
| <p>That's about where I stopped reading.</p> |
| |
| <p>Verdict: ignore.</p> |
| |
| <hr /> |
| <a name=slowaris /> |
| <h2>OpenSolaris Busybox</h2> |
| |
| <p>Somebody <a href=http://hub.opensolaris.org/bin/view/Project+busybox/>wrote |
| a wiki page</a> saying that Busybox for OpenSolaris would be a good idea.</p> |
| |
| <p>The corresponding "files" tab is an auto-generated stub. The project never |
| even got as far as suggesting commands to include before Oracle discontinued |
| OpenSolaris.</p> |
| |
| <p>Verdict: ignore.</p> |
| |
| <hr /> |
| <a name=uclinux /> |
| <h2>uClinux</h2> |
| |
| <p>Long ago a hardware developer named Jeff Dionne put together a |
| nommu Linux distribution, which involved rewriting a lot of command line |
| utilities that relied on <a href=http://nommu.org/memory-faq.txt>features |
| unavailable on nommu</a> hardware.</p> |
| |
| <p>In 2003 Jeff moved to Japan and handed |
| the project off to people who allowed it to roll to a stop. The website |
| turned into a mess of 404 links, the navigation indexes stopped being |
| updated over a decade ago, and the project's CVS repository suffered a |
| hard drive failure for which there were no backups. The project continued |
| to put out "releases" through 2014 (you have to scroll down in the "news" |
| section to find them, the "HTTP download" section in the nav bar on the |
| left hasn't been updated in over a decade), which were hand-updated tarball |
| snapshots mostly consisting of software from the 1990's. For example the |
| 2014 release still contained ipfwadm, the package which predated ipchains, |
| which predated iptables, which is in the process of being replaced by |
| nftables.</p> |
| |
| <p>Nevertheless, people still try to use this because the project was viewed |
| as the place to discuss, develop, and learn about nommu Linux. |
| The role of uclinux.org as an educational resource kept people coming |
| to it long after it had collapsed as a Linux distro.</p> |
| |
| <p>Starting around 0.6.0 toybox began to address nommu support with the goal |
| of putting uClinux out of its misery.</p> |
| |
| <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 |
| subdirectories under "user".</p> |
| |
| <h3>Taking out the trash</h3> |
| |
| <p>A bunch of packages (<b>inotify-tools, input-event-demon, ipsec-tools, netifd, |
| keepalived, mobile-broadband-provider-info, nuttp, readline, snort, |
| snort-barnyard, socat, sqlite, sysklogd, sysstat, tcl, ubus, uci, udev, |
| unionfs, uqmi, usb_modeswitch, usbutils, util-linux</b>) |
| are hard to evaluate because |
| uclinux has directories for them, but their source isn't actually in the |
| uclinux tree. In some of these the makefiles download a git repo during |
| the build, so I'm assuming you can build the external package if you really |
| care. (Even when I know what these packages do, I'm skipping them |
| because uclinux doesn't actually contain them, and any given snapshot |
| of the build system will bitrot as external web links change over time.)</p> |
| |
| <p>Other packages are orphaned, meaning they're not mentioned from any Kconfig |
| or Makefiles outside of their directory, so uclinux can't actually build |
| them: <b>mbus</b> is an orphaned i2c test program expecting to run in some sort |
| of hardwired hardware context, <b>mkeccbin</b> is an orphaned "ECC annotated |
| binary file" generator (meaning it's half of a flash writer), |
| <b>wsc_upnp</b> is a "Ralink WPS" driver (some sort of stale wifi chip)...</p> |
| |
| <p>The majority of the remaining packages are probably not of interest to |
| toybox due to being so obsolete or special purpose they may not actually be |
| of interest to anybody anymore. (This list also includes a lot of |
| special-purpose network back-end stuff that's hard for anybody but |
| datacenter admins to evaluate the current relevance of.)</p> |
| |
| <blockquote><b><p> |
| arj asterisk boottools bpalogin br2684ctl camserv can4linux cgi_generic |
| cgihtml clamav clamsmtp conntrack-tools cramfs crypto-tools cxxtest |
| ddns3-client de2ts-cal debug demo diald discard dnsmasq dnsmasq2 |
| ethattach expat-examples ez-ipupdate fakeidentd |
| fconfig ferret flatfs flthdr freeradius freeswan frob-led frox fswcert |
| game gettyd gnugk haserl horch |
| hostap hping httptunnel ifattach ipchains |
| ipfwadm ipmasqadm ipportfw ipredir ipset iso_client |
| jamvm jffs-tools jpegview jquery-ui kendin-config kismet klaxon kmod |
| l2tpd lcd ledcmd ledcon lha lilo lirc lissa load loattach |
| lpr lrpstat lrzsz mail mbus mgetty microwin ModemManager msntp musicbox |
| nooom null openswan openvpn palmbot pam_* pcmcia-cs playrt plugdaemon pop3proxy |
| potrace qspitest quagga radauth |
| ramimage readprofile rdate readprofile routed rrdtool rtc-ds1302 |
| sendip ser sethdlc setmac setserial sgutool sigs siproxd slattach |
| smtpclient snmpd net-snmp snortrules speedtouch squashfs scep sslwrap stp |
| stunnel tcpblast tcpdump tcpwrappers threaddemos tinylogin tinyproxy |
| tpt tripwire unrar unzoo version vpnled w3cam xl2tpd zebra |
| </p></b></blockquote> |
| |
| <p>This stuff is all over the place: arj, lha, rar, and zoo are DOS archivers, |
| ethattach describes itself as just "a network tool", |
| mail is a textmode smtp mailer literally described as "Some kind of mail |
| proggy" in uclinux's kconfig (as opposed to clamsmtp and smtpclient and |
| so on), this gettyd isn't a generic version but specifically a |
| hardwired ppp dialin utility, mgetty isn't a generic version but is combined |
| with "sendfax", hostap is an intersil prism driver, wlan-ng is also an |
| intersil prism dirver, null is a program to intentionally dereference a |
| null pointer (in case you needed one), iso_client is a |
| "Demo Application for the USB Device Driver", kendin-config is |
| "for configuring the Micrel Kendin KS8995M over QSPI", speedtouch configures |
| a specific brand of asdl modem, portmap is part of Anfs, |
| ferret, linux-igd, and miniupnp are all upnp packages, |
| lanbypass "can be used to control the LAN |
| bypass switches on the Advantech x86 based hardware platforms", lcd is |
| "test of lcddma device driver" (an out-of-tree Coldfire driver apparently |
| lost to history, the uclinux linux-2.4.x directory has a config symbol for |
| it, but nothing in the code actually _uses_ it...), qspitest is another |
| coldfire thing, mii-tool-fec is |
| "strictly for the FEC Ethernet driver as implemented (and modified) for |
| the uCdimm5272", rtc-ds1302 and rtc-m41t11 are usermode drivers for specific |
| clock chips, stunnel is basically "openssl s_client -quiet -connect", |
| potrace is a bitmap to vector graphic converter, radauth performs command line |
| authentication against a radius server, |
| clamav, klaxon, ferret, l7-protocols, and nessus are very old network security |
| software (it's got a stale snapshot of nmap too), xl2tpd is a PPP over UDP |
| tunnel (rfc 2661), zebra is the package quagga replaced, |
| lilo is the x86-only bootloader that predated grub (and recently discontinued |
| development), lissa is a "framebuffer graphics demo" from |
| 1998, the squashfs package here is the out of tree patches for 2.4 kernels |
| and such before the filesystem was merged upstream (as opposed to the |
| squashfs-new package which is a snapshot of the userspace tool from 2011), |
| load is basically "dd file /dev/spi", version is basically "cat /proc/version", |
| microwin is a port of the WinCE graphics API to Linux, scep is a 2003 |
| implementation of an IETF draft abandoned in 2010, tpt depends on |
| Andrew Morton's 15 year old unmerged "timepegs" kernel patch using the pentium |
| cycle counter, vpnled controls a light that reboots systems (what?), |
| w3cam is a video4linux 1.0 client (v4l2 showed up during 2.5 and support for |
| the old v4l1 was removed in 2.6.38 back in 2011), busybox ate tinylogin |
| over a decade ago, lrpstat is a java network monitor |
| from 2001, lrzsz is zmodem/ymodem/zmodem, msntp and stp implement rfc2030 |
| meaning it overflows in 2036 (the package was last updated in 2000), rdate |
| is rfc 868 meaning it also overflows in 2036 (which is why ntp was invented |
| a few decades back), reiserfsprogs development stopped abruptly after |
| Hans Reiser was convicted of murdering his wife Nina (denying it on the |
| stand and then leading them to the body as part of his plea bargain during |
| sentencing)... |
| </p> |
| |
| <p>Seriously, there's a lot of crap in there. It's hard to analyze most |
| of it far enough to prove it _doesn't_ do anything.</p> |
| |
| <h3>Non-toybox programs</h3> |
| |
| <p>The following software may actually still do something intelligible |
| (although the package versions tend to be years out of date), but |
| it's not a direction toybox has chosen to go in.</p> |
| |
| <p>There are several programming languages (<b>bash, lua, jamvm, tinytcl, |
| perl, python</b>) in there. Maybe someone somewhere wants a 2008 release of a |
| java virtual machine tested to work on nommu systems (jamvm), but it's out |
| of scope for toybox.</p> |
| |
| <p>A bunch of benchmark programs: <b>cpu, dhrystone, mathtest, nbench, netperf, |
| netpipe, and whetstone</b>.</p> |
| |
| <p>A bunch of web servers: <b>appWeb, boa, fnord (via tcpserver), goahead, httpd, |
| mini_httpd, and thttpd</b>.</p> |
| |
| <p>A bunch of shells: <b>msh</b> is a clever (I.E. obfuscated) little shell, |
| <b>nwsh</b> is "new shell" (that's what it called itself in 1999 anyway), |
| <b>sash</b> is another shell with a bunch of builtins (ls, ps, df, cp, date, reboot, |
| and shutdown, this roadmap analyzes it <a href="#sash">elsewhere</a>), |
| <b>sh</b> is a very old minix shell fork, and <b>tcsh</b> is also a shell.</p> |
| |
| <p>Also in this category, we have:</p> |
| |
| <blockquote><b><p> |
| dropbear jffs-tools jpegview kexec-tools bind ctorrent |
| iperf iproute2 ip-sentinel iptables kexec |
| nmap oggplay openssl oprofile p7zip pppd pptp play vplay |
| hdparm mp3play at clock |
| mtd-utils mysql logrotate brcfg bridge-utils flashw |
| ebtables etherwake ethtool expect gdb gdbserver hostapd |
| lm_sensors load netflash netstat-nat |
| radvd recover rootloader resolveip rp-pppoe |
| rsyslog rsyslogd samba smbmount squashfs-new squid ssh strace tip |
| uboot-envtools ulogd usbhubctrl vconfig vixie-cron watchdogd |
| wireless_tools wpa_supplicant |
| </p></b></blockquote> |
| |
| <p>An awful lot of those are borderline: play and vplay are wav file |
| audio players, there's oprofile _and_ readprofile (which just reads kernel |
| profiling data from /proc/profile), |
| radvd is a "routr advertisement daemon" (ipv6 stateless autoconf), |
| ctorrent is a bittorent client, |
| lm_sensors is hardware (heat?) monitoring, |
| resolveip is dig only less so, |
| rp-pppoe is ppp over ethernet, |
| ebtables is an ethernet version of iptables (for bridging), |
| their dropbear is from 2012, and that ssh version is from 2011 |
| (which means it's about nine months too _old_ to have the heartbleed bug). |
| There's both ulogd and ulogd2 (no idea why), and pppd is version 2.4 but |
| there's a ppd-2.3 directory also. We used to be interested in ftpd/proftpd |
| as a way of uploading files out of a vm, but support for that has waned |
| over the years and there are lots of alternatives.</p> |
| |
| <p>Lots of flash stuff: |
| flashw is a flash writer, load is an spi flash loader, netflash writes |
| to flash via tftp, |
| recover is also a reflash daemon intended to come up when the system can't boot, |
| rootloader seems to be another reflash daemon but without dhcp.</p> |
| |
| <h3>Already in roadmap</h3> |
| |
| <p>The following packages contain commands already in the toybox roadmap:</p> |
| |
| <blockquote><b><p> |
| agetty cal cksum cron dhcpcd dhcpcd-new dhcpd dhcp-isc dosfstools e2fsprogs |
| elvis-tiny levee fdisk fileutils ftp grep hd hwclock inetd init ntp |
| iputils login module-init-tools netcat shutils ntpdate lspci ping procps |
| rsync shadow shutils stty sysutils telnet telnetd tftp tftpd traceroute |
| unzip wget mawk net-tools |
| </p></b></blockquote> |
| |
| <p>There are some duplicates in there, levee is a tiny vi implementation |
| like elvis-tiny, ntp and ntpdate overlap, etc.</p> |
| |
| <p>Verdict: We don't really need to do a whole lot special for nommu |
| systems, just get the existing toybox roadmap working on nommu and |
| we're good. The uClinux project can rest in peace.</p> |
| |
| <hr /> |
| <h2>Requests:</h2> |
| |
| <p>The following additional commands have been requested (and often submitted) |
| by various users. I _really_ need to clean up this section.</p> |
| |
| <p>Also:</p> |
| <blockquote><b> |
| <span id=request> |
| dig freeramdisk getty halt hexdump hwclock klogd modprobe ping ping6 pivot_root |
| poweroff readahead rev sfdisk sudo syslogd taskset telnet telnetd tracepath |
| traceroute unzip usleep vconfig zip free login modinfo unshare netcat help w |
| iwconfig iwlist rdate |
| dos2unix unix2dos clear |
| pmap realpath setsid timeout truncate |
| mkswap swapon swapoff |
| count oneit fstype |
| acpi blkid eject pwdx |
| sulogin rfkill bootchartd |
| arp makedevs sysctl killall5 crond crontab deluser last mkpasswd watch |
| blockdev rpm2cpio arping brctl dumpleases fsck |
| tcpsvd tftpd |
| factor fallocate fsfreeze inotifyd lspci nbd-client partprobe strings |
| base32 base64 mix |
| reset hexedit nsenter shred |
| fsync insmod ionice lsmod lsusb rmmod vmstat xxd top iotop |
| lsof ionice compress dhcp dhcpd addgroup delgroup host iconv ip |
| ipcrm ipcs netstat openvt |
| deallocvt iorenice |
| udpsvd adduser |
| microcom tunctl chrt getfattr setfattr |
| kexec |
| ascii crc32 devmem fmt i2cdetect i2cdump i2cget i2cset i2ctransfer mcookie prlimit sntp ulimit uuidgen dhcp6 ipaddr iplink iproute iprule iptunnel cd exit toysh bash traceroute6 |
| blkdiscard rtcwake |
| watchdog |
| pwgen readelf unicode |
| rsync |
| linux32 hd strace |
| gpiodetect gpiofind gpioget gpioinfo gpioset httpd uclampset |
| nbd-server |
| </span> |
| </b></blockquote> |
| |
| <hr /> |
| <a name=packages /> |
| <h2>Other packages</h2> |
| |
| <p>System administrators have <a href=https://github.com/landley/toybox/issues/168#issuecomment-583725500>asked</a> what other Linux packages toybox commands |
| replace, so they can annotate alternatives in their package management system.</p> |
| |
| <p>This section uses the package definitions from Chapter 6 of |
| <a href=http://www.linuxfromscratch.org/lfs/downloads/9.0/LFS-BOOK-9.0-NOCHUNKS.html>Linux From Scratch 9.0</a>). Each package lists what we currently |
| replace, pending commands [in square brackets], and what we DON'T plan to |
| implement.</p> |
| |
| <p>Each "see also" note means the listed package also installs the listed shared |
| libraries. (While toybox contains equivalent functionality to a lot of these |
| shared libraries in its lib/ directory, it does not currently provide a shared |
| library interface.)</p> |
| |
| <h3>Packages toybox plans to provide complete-ish replacements for:</h3> |
| <ul> |
| <li><b>file</b>: file (see also: libmagic)</li> |
| <li><b>m4</b>: [m4]</li> |
| <li><b>bc</b>: [bc] [dc]</li> |
| <li><b>bison</b>: [yacc] (not: bison, see also: liby)</li> |
| <li><b>flex</b>: [lex] (not: flex flex++, see also: libfl)</li> |
| <li><b>make</b>: [make]</li> |
| <li><b>sed</b>: sed</li> |
| <li><b>grep</b>: grep egrep fgrep</li> |
| <li><b>bash</b>: bash sh (not: bashbug)</li> |
| <li><b>diffutils</b>: cmp [diff] [diff3] [sdiff]</li> |
| <li><b>gawk</b>: [awk] (not: gawk gawk-5.0.1)</li> |
| <li><b>findutils</b>: find xargs (not: locate updatedb)</li> |
| <li><b>less</b>: less (not: lessecho lesskey)</li> |
| <li><b>gzip</b>: zcat [gzip] [gunzip] [zcmp] [zdiff] [zegrep] [zfgrep] [zgrep] [zless] [zmore] |
| (not: gzexe uncompress zforce znew)</li> |
| <li><b>patch</b>: patch</li> |
| <li><b>tar</b>: tar</li> |
| <li><b>procps-ng</b>: free pgrep pidof pkill ps sysctl top uptime vmstat w watch |
| [pmap] [pwdx] [slabtop] |
| (not: tload, see also libprocps)</li> |
| <li><b>sysklogd</b>: [klogd] [syslogd]</li> |
| <li><b>sysvinit</b>: [init] halt poweroff reboot killall5 [shutdown] |
| (not telinit runlevel fstab-decode bootlogd)</li> |
| <li><b>man</b>: man (but not accessdb apropos catman lexgrog mandb manpath whatis, |
| see also libman libmandb)</li> |
| <li><b>vim</b>: vi xxd (but not ex, rview, rvim, view, vim, vimdiff, vimtutor)</li> |
| <li><b>sysvinit</b>: [init] halt poweroff reboot killall5 [shutdown] |
| (not telinit runlevel fstab-decode bootlogd)</li> |
| <li><b>kmod</b>: insmod lsmod rmmod modinfo [modprobe] |
| (not: depmod kmod)</li> |
| <li><b>attr</b>: [getfattr] setfattr (not: attr, see also: libattr)</li> |
| <li><b>shadow</b>: [chfn] [chpasswd] [chsh] [groupadd] [groupdel] [groupmod] |
| [newusers] passwd [su] [useradd] [userdel] [usermod] |
| [lastlog] [login] [newgidmap] [newuidmap] |
| (not: chage expiry faillog groupmems grpck logoutd newgrp nologin pwck sg |
| vigr vipw, grpconv grpunconv pwconv pwunconv, chgpasswd gpasswd)</li> |
| <li><b>psmisc</b>: killall [fuser] [pstree] [peekfd] [prtstat] |
| (not: pslog pstree.x11)</li> |
| <li><b>inetutils</b>: dnsdomainname [ftp] hostname ifconfig ping ping6 [telnet] [tftp] [traceroute] (not: talk)</li> |
| <li><b>coreutils</b>: [ base32 base64 basename cat chgrp chmod chown chroot cksum comm cp cut date |
| dd df dirname du echo env expand factor false fmt fold groups head hostid id install |
| link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od |
| paste printenv printf pwd readlink realpath rm rmdir seq sha1sum shred |
| sleep sort split stat sync tac tail tee test timeout touch true truncate |
| tty uname uniq unlink wc who whoami yes |
| [expr] [fold] [join] [numfmt] [runcon] [sha224sum] [sha256sum] [sha384sum] |
| [sha512sum] [stty] [b2sum] [tr] [unexpand] |
| (not: basenc chcon csplit dir dircolors pathchk |
| pinky pr ptx shuf stdbuf sum tsort users vdir, see also libstdbuf)</li> |
| <li><b>util-linux</b>: blkid blockdev cal chrt dmesg eject fallocate flock hwclock |
| ionice kill logger losetup mcookie mkswap more mount mountpoint nsenter |
| pivot_root prlimit rename renice rev setsid swapoff swapon switch_root taskset |
| umount unshare uuidgen |
| [addpart] [fdisk] [findfs] [findmnt] [fsck] [fsfreeze] [fstrim] [getopt] |
| [hexdump] [linux32] [linux64] [lsblk] [lscpu] [lsns] [setarch] |
| (not: agetty blkdiscard blkzone cfdisk chcpu chmem choom col |
| colcrt colrm column ctrlaltdel delpart fdformat fincore fsck.cramfs |
| fsck.minix ipcmk ipcrm ipcs isosize last lastb ldattach look lsipc |
| lslocks lslogins lsmem mesg mkfs mkfs.bfs mkfs.cramfs mkfs.minix namei partx |
| raw readprofile resizepart rfkill rtcwake script scriptreplay |
| setterm sfdisk sulogin swaplabel ul |
| uname26 utmpdump uuidd uuidparse wall wdctl whereis wipefs |
| i386 x86_64 zramctl)</li> |
| </ul> |
| |
| <p>Commentary: toybox init doesn't do runlevels, man and vim are just the |
| relevant commands without the piles of strange overgrowth, and if you want |
| to call a toybox binary by another name you can create a symlink to a |
| symlink. If somebody really wants to argue for "gzexe" or similar, be |
| my guest, but there's a lot of obsolete crap in shadow, coreutils, |
| util-linux...</p> |
| |
| <p>No idea why LFS is installing inetutils instead of net-tools |
| (which contains arp route ifconfig mii-tool nameif netstat and rarp that |
| toybox does or might implement, and plipconfig slattach that it probably won't.)</p> |
| |
| <h3>Packages toybox plans to provide partial replacements for:</h3> |
| |
| <p>Toybox provides replacements for some binaries from these packages, |
| but there are other useful binaries which this package provides that toybox |
| currently considers out of scope for the project:</p> |
| |
| <ul> |
| <li><b>binutils</b>: strings [ar] [nm] [readelf] [size] [objcopy] [strip] |
| (not c++filt, dwp, elfedit, gprof. The following commands belong |
| in <a href=/code/qcc>qcc</a>: addr2line as ld objdump ranlib)</li> |
| <li><b>bzip2</b>: bunzip2 bzcat [bzcmp] [bzdiff] [bzegrep] [bzfgrep] [bzgrep] [bzless] |
| [bzmore] (not: bzip2, bzip2recover, see also libbz2)</li> |
| <li><b>xz</b>: [xzcat] [lzcat] [lzcmp] [lzdiff] [lzegrep] [lzfgrep] [lzgrep] |
| [lzless] [lzmadec, lzmainfo] [lzmore] [unlzma] [unxz] [xzcat] |
| [xzcmp] [xzdec] [xzdiff] [xzegrep] [xzfgrep] [xzgrep] [xzless] [xzmore] |
| (not: compression side, see also: liblzma)</li> |
| <li><b>ncurses</b>: clear reset (not: everything else, see also: libcurses)</li> |
| <li><b>e2fsprogs</b>: chattr lsattr [e2fsck] [mkfs.ext2] [mkfs.ext3] |
| [fsck.ext2] [fsck.ext3] [e2label] [resize2fs] [tune2fs] |
| (not badblocks compile_et debugfs dumpe2fse2freefrag e2image |
| e2mmpstatus e2scrub e2scrub_all e2undo e4crypt e4defrag filefrag |
| fsck.ext4 logsave mk_cmds mkfs.ext4 mklost+found)</li> |
| </ul> |
| |
| <p>Toybox provides several decompressors but compresses to a single format |
| (deflate, ala gzip/zlib). Our e2fsprogs doesn't currently plan to support |
| ext4 or defrag. The "qcc" reference is because someday an external project to glue |
| QEMU's <a href=https://git.qemu.org/?p=qemu.git;a=blob;f=tcg/README;h=bfa2e4ed246c;hb=HEAD>Tiny Code Generator</a> |
| to Fabrice Bellard's old <a href=http://landley.net/hg/tinycc>Tiny C Compiler</a> |
| making a multicall binary that does cc/ld/as for all the targets QEMU |
| supports (then use the |
| <a href=https://github.com/JuliaComputing/llvm-cbe>LLVM C Backend</a> |
| to compile LLVM itself to C for use as a modern replacement for |
| <a href=https://en.wikipedia.org/wiki/Cfront>cfront</a> to bootstrap |
| C++ code) is under consideration |
| as a successor project to toybox. Until then things like objdump -d |
| (requiring target-specific disassembly for an unbounded number of architectures) |
| are out of scope for toybox. (This means drawing the line somewhere between |
| architecture-specific support in file and strace, and including a full |
| assembler for each architecture.)</p> |
| </span> |
| |
| <h3>Packages from LFS ch6 toybox does NOT plan to replace:</h3> |
| |
| <blockquote><p><b> |
| linux-api-headers man-pages glibc zlib readline gmp mpfr mpc gcc pkg-config |
| ncurses acl libcap psmisc iana-etc libtool gdbm gperf expat perl XML::Parser |
| intltool autoconf automake gettext libelf libffi openssl python ninja meson |
| check groff grub libpipeline texinfo |
| </b></p></blockquote> |
| |
| <p>That said, we do implement our own zlib and readline replacements, and |
| presumably _could_ export them as library bindings. Plus we provide |
| our own version of a bunch of the section 1 man pages (as command help). |
| Possibly libcap and acl are interesting?</p> |
| |
| <h3>Misc</h3> |
| |
| <p>The kbd package has over a dozen commands, we only implement chvt. The |
| iproute2 package implements over a dozen commands, there's an "ip" in |
| pending but I'm not a fan (ifconfig and route and such should be extended |
| to work properly). We don't implement eudev, but toybox's maintainer |
| created busybox mdev way back when (which replaces it) and plans to do a |
| new one for toybox as soon as we work out what subset is still needed now that |
| devtmpfs is available.</p> |
| |
| <hr /><a name=todo /><h2>TODO list</h2> |
| |
| <ul> |
| <li><p>Fill out "development" command list (finish toysh, implement awk, etc.)</p></li> |
| |
| <p><li>Handle "pending" directory. |
| <ul> |
| <li>Cleanup and promote the "pending" commands used to run mkroot.</li> |
| <ul><li>Enabled by $PENDING in mkroot.sh (sh route)</li></ul> |
| |
| <li>Cleanup and promote the "pending" commands used to build mkroot.</li> |
| <ul><li>In scripts/install.sh the $PENDING list symlinked from the host $PATH |
| into "make airlock" directory (expr git tr bash sh gzip awk bison flex make).</li></ul> |
| <li>Cleanup and promote all $PENDING commands used by android |
| <ul><li><b>grep pending Android.bp</b> |
| in <a href=https://android.googlesource.com/platform/external/toybox>their repo</a> |
| (diff expr tr brctl getfattr lsof modprobe more stty traceroute vi)</li></ul> |
| </li> |
| |
| <li>Cleanup/promote/delete remaining "pending" commands</li> |
| <ul><li>Once empty, remove toys/pending and maybe collape together other |
| directories into just toys/*.c (with "default n" meaning examples, and |
| a "posix_defconfig" target alongside macos/bsd/android).</li></ul> |
| |
| </ul></li></p> |
| |
| <li><p>Replace kconfig/ with a new implementation (menu/def/yes/no/old).</p></li> |
| |
| <p><li>Automate Linux From Scratch build. |
| <ul> |
| |
| <li>Automate the <a href=https://linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-12.0-NOCHUNKS.html>existing build</a> |
| <ul> |
| <li>create chroot directory from host (chapters 4-6)</li> |
| <li>setup/launch chroot directory (start of chapter 7)</li> |
| <li>build in chroot directory (chapters 7-10)</li> |
| </ul> |
| </li> |
| |
| <li>Add record-commands support (both inside and outside chroot)</li> |
| <li>Build host->chroot part with PATH=$PWD/airlock (moving one command over at a time) |
| <ul><li>Set up native compiler, enumerate/build/install "temp stuff" toybox |
| doesn't provide yet (make, busybox commands, etc).</li></ul> |
| </li> |
| |
| <li>Run host->chroot build under mkroot, with airlock built+packaged for |
| target (toybox, native compiler, temp stuff from busybox or "make")</li> |
| <li>Run chroot build to completion in chroot under mkroot (kernel etc smoketest)</li> |
| <li>Run chroot build outside chroot (keeping toybox at start of $PATH) |
| to prove toybox commands sufficient to build ALL packages</li> |
| <li>Package LFS build (mkroot/packages/lfs) |
| |
| <ul> |
| <li>host/chroot/target build scripts</li> |
| <li><a href=http://ftp.osuosl.org/pub/lfs/lfs-packages/>download</a> and |
| setup packages.</li> |
| <li>Note: I already did this <a href=https://github.com/landley/control-images/tree/master/images/lfs-bootstrap/mnt>long ago</a> for LFS 6.7.</li> |
| </li> |
| </ul> |
| |
| </ul></p> |
| |
| <li><p>1.0 release</p></li> |
| |
| <li><p>Tackle AOSP build.</p></li> |
| </ul> |
| |
| <!-- #include "footer.html" --> |
| |