BusyBox
BusyBox is a software suite that provides several Unix utilities in a single executable file. It runs in a variety of POSIX environments such as Linux, Android, and FreeBSD, although many of the tools it provides are designed to work with interfaces provided by the Linux kernel. It was specifically created for embedded operating systems with very limited resources. The authors dubbed it "The Swiss Army knife of Embedded Linux", as the single executable replaces basic functions of more than 300 common commands. It is released as free software under the terms of the GNU General Public License, version 2.

History

Origins 
Originally written by Bruce Perens in 1995 and declared complete for his intended usage in 1996, BusyBox initially aimed to put a complete bootable system on a single floppy disk that would serve both as a rescue disk and as an installer for the Debian distribution. Since that time, it has been extended to become the de facto standard core user space toolset for embedded Linux devices and Linux distribution installers. Since each Linux executable requires several kilobytes of overhead, having the BusyBox program combine over two hundred programs together often saves substantial disk space and system memory.

BusyBox was maintained by Enrique Zanardi and focused on the needs of the Debian boot-floppies installer system until early 1998, when Dave Cinege took it over for the Linux Router Project (LRP). Cinege made several additions, created a modularized build environment, and shifted BusyBox's focus into general high-level embedded systems. As LRP development slowed down in 1999, Erik Andersen, then of Lineo, Inc., took over the project and became the official maintainer between December 1999 and March 2006. During this time the Linux embedded marketplace exploded in growth, and BusyBox matured greatly, expanding both its user base and functionality. Rob Landley became the maintainer in 2005 until late 2006, then Denys Vlasenko took over as the current maintainer.

GPLv2/GPLv3 controversies 
In September 2006, after heavy discussions and controversies between project maintainer Rob Landley and Bruce Perens, the BusyBox project decided against adopting the GNU Public License Version 3 (GPLv3); the BusyBox license was clarified as being GPL-2.0-only.

Since October 2006, Denys Vlasenko has taken over maintainership of BusyBox from Rob Landley, who has started Toybox, also as a result of the license controversies.

GPL lawsuits 
In late 2007, BusyBox also came to prominence for actively prosecuting violations of the terms of its license (the GPL) in the United States District Court for the Southern District of New York.

What was claimed to be the first US lawsuit over a GPL violation concerned use of BusyBox in an embedded device. The lawsuit, case 07-CV-8205 was filed on September 20, 2007 by the Software Freedom Law Center (SFLC) on behalf of Andersen and Landley against Monsoon Multimedia Inc., after BusyBox code was discovered in a firmware upgrade and attempts to contact the company had apparently failed. The case was settled with release of the Monsoon version of the source and payment of an undisclosed amount of money to Andersen and Landley.

On November 21, 2007, the SFLC brought two similar lawsuits on behalf of Andersen and Landley against two more companies, Xterasys (case 07-CV-10455) and High-Gain Antennas (case 07-CV-10456). The Xterasys case was settled on December 17 for release of source code used and an undisclosed payment, and the High-Gain Antennas case on March 6, 2008 for active license compliance and an undisclosed payment. On December 7, 2007, a case was brought against Verizon Communications over its distribution of firmware for Actiontec routers; this case was settled March 17, 2008 on condition of license compliance, appointment of an officer to oversee future compliance with free software licenses, and payment of an undisclosed sum. Further suits were brought on June 9, 2008 against Bell Microproducts (case 08-CV-5270) and SuperMicro (case 08-CV-5269), the Super Micro case being settled on July 23, 2008. BusyBox and Bell Microproducts also settled out of court on October 17.

On December 14, 2009, a new lawsuit was filed naming fourteen defendants including Best Buy, JVC, Samsung and others.
In February 2010 Samsung released its LN52A650 TV firmware under GPLv2, which was used later as a reference by the SamyGO community project.

On about August 3, 2010, BusyBox won from Westinghouse a default judgement of triple damages of $90,000 and lawyers' costs and fees of $47,865, and possession of "presumably a lot of high-def TVs" as infringing equipment in the lawsuit Software Freedom Conservancy v. Best Buy, et al., the GPL infringement case noted in the paragraph above.

No other developers, including original author Bruce Perens and maintainer Dave Cinege, were represented in these actions or party to the settlements. On December 15, 2009, Perens released a statement expressing his unhappiness with some aspects of the legal situation, and in particular alleged that the current BusyBox developers "appear to have removed some of the copyright statements of other BusyBox developers, and appear to have altered license statements".

Features 
BusyBox can be customized to provide a subset of over two hundred utilities. It can provide most of the utilities specified in the Single Unix Specification (SUS) plus many others that a user would expect to see on a Linux system. BusyBox uses the Almquist shell, also known as A Shell, ash and sh. An alternative for customization is the smaller 'hush' shell. "Msh" and "lash" used to be available.

As it is a complete bootstrap system, it will further replace the init daemon and udev (or the latter-day systemd) using itself to be called as init on startup and mdev at hotplug time.

The BusyBox website provides a full list of the utilities implemented.

Single binary 
Typical computer programs have a separate binary (executable) file for each application. BusyBox is a single binary, which is a conglomerate of many applications, each of which can be accessed by calling the single BusyBox binary with various names (supported by having a symbolic link or hard link for each different name) in a specific manner with appropriate arguments.

BusyBox benefits from the single binary approach, as it reduces the overhead introduced by the executable file format (typically ELF), and it allows code to be shared between multiple applications without requiring a library. This technique is similar to what is provided by the crunchgen command in FreeBSD, the difference being that BusyBox provides simplified versions of the utilities (for example, an ls command without file sorting ability), while a crunchgen generated sum of all the utilities would offer the fully functional versions.

Sharing of the common code, along with routines written with size-optimization in mind, can make a BusyBox system use much less storage space than a system built with the corresponding full versions of the utilities replaced by BusyBox. Research that compared GNU, BusyBox, asmutils and Perl implementations of the standard Unix commands showed that in some situations BusyBox may perform faster than other implementations, but not always.

Commands 
The official BusyBox documentation lists an overview of the available commands and their command-line options. List of BusyBox commands
 ash
 awk
 cat — Print content of one or more files to stdout. 
 chmod — Change file modes
 cp — Copy
 date — Display system date/time
 dd — Copy a file with converting and formatting
 df — Print filesystem usage statistics
 dmesg
 echo — Display a specified line of text.
 egrep
 fgrep
 getty
 grep — Search for PATTERN in each FILE or standard input.
 gunzip — Compressed file expansion.
 gzip — File compression.
 httpd — HTTP server daemon
 init
 kill — Send a signal to a process.
 ln — Create a link named LINK_NAME or DIRECTORY to the specified TARGET.
 login — Begin a new session on the system
 ls — List of files or folders
 mdev — akin to udev
 mkdir — Create a folder
 more — View FILE or standard input one screen-full at a time
 mount — Mount file systems
 mv — move file
 nc — networking Swiss army knife.
 netstat — Display networking information.
 ntpc
 ntpsync
 nvram
 pidof — List PIDs of all processes with names that match NAMEs
 ping — Send ICMP ECHO_REQUEST packets to network hosts
 ps — Report process status
 pwd — Print working directory
 realpath
 rm — Erase file
 rmdir — Remove directory
 rpm2cpio
 rstats — Copyright of BusyBox
 rtcwake
 runlevel
 run-parts
 runsv
 runsvdir
 rx
 script
 sed — Text stream editor
 setkeycodes
 setlogcons
 setsid
 setuidgid
 sh
 sha1sum — Compute and check SHA-1 message digest
 sha256sum — Compute and check SHA-512 message digest
 sleep — Suspend program execution for a specified time
 start-stop-daemon
 stat
 strings
 stty — Change and print terminal line settings
 su — Execute commands with privileges of another user account
 sulogin
 sum — Checksum and count blocks in a file
 sv
 svlogd
 swapoff
 swapon
 switch root
 sync — Write all buffered file system blocks to disk
 sysctl
 syslogd
 tac — Concatenate and print files in reverse line order
 tail — Output last of file
 tar
 taskset
 tcpsvd
 tee — Send output to multiple files
 telnet
 telnetd
 test
 tftp
 tftpd
 time
 timeout — Run a command with a time limit
 top
 touch — Update the last-modified date on the given FILE[s]
 tr — Translate or delete characters
 traceroute
 true
 tty
 ttysize
 udhcpc — Small DHCP client
 udhcpd
 udpsvd
 umount — Unmount file systems
 uname — Display system information
 uncompress
 unexpand
 uniq
 unix2dos
 unlzma
 unlzop
 unzip
 uptime — Tell how long the system has been running.
 usleep — Pause for N [microseconds]
 vconfig — VLAN (802.1q) configuration program
 vi — (visual) Edit FILE
 vlock — Virtual Console lock program
 volname — Return volume name
 watch — Execute a program periodically
 watchdog — Software watchdog daemon
 wc — Word, line, and byte or character count
 wget
 which — Shows the full path of (shell) commands
 who — Display who is on the system
 whoami — Print effective userid
 xargs — Construct argument lists and invoke utility
 yes — to print a string repetitively
 zcat — Uncompress to stdout
 zcip

Examples 
Programs included in BusyBox can be run simply by adding their name as an argument to the BusyBox executable:

/bin/busybox ls

More commonly, the desired command names are linked (using hard or symbolic links) to the BusyBox executable; BusyBox reads argv[0] to find the name by which it is called, and runs the appropriate command, for example just

/bin/ls

after /bin/ls is linked to /bin/busybox. This works because the first argument passed to a program is the name used for the program call, in this case the argument would be "/bin/ls". BusyBox would see that its "name" is "ls" and act like the "ls" program.

Appliances and reception
BusyBox is used by several operating systems running on embedded systems and is an essential component of distributions such as OpenWrt, OpenEmbedded (including the Yocto Project) and Buildroot. The Sharp Zaurus utilizes BusyBox extensively for ordinary Unix-like tasks performed on the system's shell.

BusyBox is also an essential component of VMware ESXi, and Alpine Linux, both of which are not embedded distributions.

It is necessary for several root applications on Android and is also preinstalled with some "1 Tap Root" solutions such as Kingo Root.

Controversy over Toybox 
Toybox was started early 2006 under the GPL-2.0-only license by former BusyBox maintainer Rob Landley as a result of the controversies around GPLv3/GPLv2 discussions. At the end of 2011 it was relicensed under the BSD-2-Clause license after the project went dormant. In March 2013, it was relicensed again under the 0BSD license. On January 11, 2012, Tim Bird, a Sony employee, suggested creating an alternative to BusyBox which would not be under the GNU General Public License. He suggested it be based on the dormant Toybox. In January 2012 the proposal of creating a BSD licensed alternative to the GPL licensed BusyBox project drew harsh criticism from Matthew Garrett for taking away the only relevant tool for copyright enforcement of the Software Freedom Conservancy group. The starter of BusyBox based lawsuits, Rob Landley, responded that this was intentional as he came to the conclusion that the lawsuits resulted not in the hoped for positive outcomes and he wanted to stop them "in whatever way I see fit".

See also 

 GNU Core Utilities
 util-linux, iproute2, ethtool
 sbase and ubase intended to form a base system similar to busybox but much smaller. MIT license
 9base port of various original Plan 9 tools for Unix. MIT license
 The Heirloom Toolchest is a collection of standard Unix utilities derived from original Unix material
 Linux on embedded systems
 Linux for mobile devices

References

Further reading

External links 

 

Command shells
Embedded Linux
Free computer programming tools
Free software programmed in C
Unix software