diff options
authorDenys Vlasenko <>2011-03-08 10:04:50 (GMT)
committerDenys Vlasenko <>2011-03-08 10:04:50 (GMT)
commitf21b8252036901b7ef2188c3d341141181f8f12d (patch)
parentcc7de179d4c2160022e170a2aa7f0282d18c28fa (diff)
Expand "How can I get started using Busybox" based on Rob's email
Signed-off-by: Denys Vlasenko <>
1 files changed, 137 insertions, 29 deletions
diff --git a/FAQ.html b/FAQ.html
index dc02735..22361f8 100644
--- a/FAQ.html
+++ b/FAQ.html
@@ -1,6 +1,6 @@
<!--#include file="header.html" -->
-<h3>Frequently Asked Questions</h3>
+<h1>Frequently Asked Questions</h1>
This is a collection of some of the more frequently asked questions
about Busybox. Some of the questions even have answers. If you
@@ -108,36 +108,144 @@ have additions to this FAQ document, we would love to add them,
<hr />
<h2><a name="getting_started">How can I get started using Busybox?</a></h2>
-<p> If you just want to try out Busybox without installing it, download the
- tarball, extract it, run "make defconfig", and then run "make".
+<h3>Obtaining and testing Busybox</h3>
+<p> First, download a prebuilt binary version from
+ <a href=""></a>
+ and save it under the name "busybox". The "busybox-i686" version should
+ run on both 32-bit and 64-bit x86 PCs, and the armv4tl version is the
+ most generic arm version (for smartphones), so those are probably good
+ starting points.
- This will create a Busybox binary with almost all features enabled. To try
- out a Busybox applet, type "./busybox [appletname] [options]", for
- example "./busybox ls -l" or "./busybox cat LICENSE". Type "./busybox"
- to see a command list, and "./busybox appletname --help" to see a brief
- usage message for a given applet.
+<p> This is a statically linked version of the busybox "multiplexer", a
+ single command that can perform multiple actions, the way a swiss army
+ knife has multiple blades. To try it out, give busybox the command line
+ you'd like it to execute:
- Busybox uses the name it was invoked under to determine which applet is
- being invoked. (Try "mv Busybox ls" and then "./ls -l".) Installing
- Busybox consists of creating symlinks (or hardlinks) to the Busybox
- binary for each applet in Busybox, and making sure these links are in
- the shell's command $PATH. The special applet name "Busybox" (or with
- any optional suffix, such as "Busybox-static") uses the first argument
- to determine which applet to run, as shown above.
+ ./busybox ls -l
+ ./busybox ps
+ ./busybox seq 1 5
+<p> To get a list of the commands supported by this instance of busybox, run
+ it without any arguments, or use the "--list" or :
+ ./busybox
+<p> To see what an individual command does, use the --help option to that
+ command:
+ ./busybox zcip --help
+<h3>Installing Busybox</h3>
+<p> If the busybox executable is renamed to one of the commands it supports,
+ it will act as that command automatically:
+ ln -s busybox pwd
+ ./pwd
+<p> This allows you to create a bunch of symlinks or hardlinks to the
+ busybox executable, add them to your $PATH, and let a single busybox
+ provide a standard set of command line tools. The --list option to
+ busybox gives the list of supported commands in an easily scriptable
+ form. (The --list-full option gives full paths, such as usr/sbin/test,
+ to help create a busybox-based root filesystem.)
+ mkdir bbdir
+ for i in $(busybox --list)
+ do
+ ln -s busybox bbdir/$i
+ done
+<p> To launch busybox's built in command shell with the $PATH giving access
+ to just busybox's built-in commands:
+ PATH=$(pwd)/bbdir bbdir/sh
+<h3>Building Busybox from source</h3>
+<p> The prebuilt binaries are based on the default configuration of busybox,
+ which enables all functionality except special purpose things like
+ selinux or debugging support which would reduce the portability of the
+ resulting binary.
+<p> To build a defconfig busybox from source, download the source code from
+ <a href=""></a>
+<p> Then configure and build it:
+ make defconfig
+ make
+<p> This should result in a new "busybox" binary.
+<p> Busybox uses the same "menuconfig" infrastructure as the Linux kernel.
+ you can start with "make defconfig" to enable almost everything, or
+ "make allnoconfig" to disable everything, and then alter the selection
+ with "make menuconfig" (which uses tab, cursor up and down, space, and
+ escape keys to navigate, and the forward slash key to search for symbol
+ name).
+<h3>Cross compiling busybox</h3>
+<p> Obtain and install a cross compiler for your target. (A few prebuilt
+ ones are available from
+ <a href=""></a>.
+ See also the buildroot and crosstool-ng projects.)
+ Add the cross compiler to your $PATH.
+<p> Cross compilers use prefixed tool names to avoid blocking the host's
+ existing compiler, thus the tools your cross compiler provides are
+ probably named things like "armv4tl-cc", "armv4tl-ld", and
+ "armv4tl-strip". In this case, "armv4tl-" would be the prefix.
+<p> So to build busybox with that cross compiler, go:
+ make CROSS_COMPILE=armv4tl-
+<p> (Note the trailing dash, if that's part of the prefix. This is a make
+ variable override preventing busybox from using its default value, which
+ is why it has to come on the make command line instead of as an
+ environment variable.)
+<p> To build a static version, set the environment variable
+ "LDFLAGS=--static". And of course you can do a parallel SMP build with
+ make's -j options. So to build a static cross compiled version of
+ busybox using a parallel build:
+ LDFLAGS="--static" make -j 4 CROSS_COMPILE="armv4tl-"
+<h3>Standalone shell</h3>
Busybox also has a feature called the
<a name="standalone_shell">"standalone shell"</a>, where the Busybox
shell runs any built-in applets before checking the command path. This
- feature is also enabled by "make allyesconfig", and to try it out run
- the command line "PATH= ./busybox ash". This will blank your command path
+ feature is not enabled by "make defconfig". To try it out, set
+ in .config (using text editor, or by running "make menuconfig" and
+ setting these options interactively), rebuild Busybox, then run
+ the command line "PATH= ./busybox ash".
+ This will blank your command search path
and run Busybox as your command shell, so the only commands it can find
(without an explicit path such as /bin/ls) are the built-in Busybox ones.
- This is another good way to see what's built into Busybox.
- Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH
- to be set appropriately, depending on whether or not /proc/self/exe is
+ Note that the standalone shell also requires CONFIG_BUSYBOX_EXEC_PATH
+ to be set appropriately, and the default value, /proc/self/exe, would work
+ only if /proc filesystem is mounted.
available or not. If you do not have /proc, then point that config option
to the location of your Busybox binary, usually /bin/busybox.
(So if you set it to /proc/self/exe, and happen to be able to chroot into
@@ -276,14 +384,14 @@ test -f cross-compiler-armv5l.tar.bz2 \
rm -rf cross-compiler-armv5l
tar xf cross-compiler-armv5l.tar.bz2
-test -f Busybox-1.17.2.tar.bz2 \
+test -f busybox-1.17.2.tar.bz2 \
|| wget
-rm -rf Busybox-1.17.2
-tar xf Busybox-1.17.2.tar.bz2
+rm -rf busybox-1.17.2
+tar xf busybox-1.17.2.tar.bz2
-cd Busybox-1.17.2
+cd busybox-1.17.2
@@ -470,7 +578,7 @@ text somewhere on the company's web site:
to the same directory and apply the patch with this command:<br>
- patch -p1 &lt;Busybox-1.6.2.patch<br>
+ patch -p1 &lt;busybox-1.6.2.patch<br>
Now you can build Busybox with these commands:<br>
export ARCH=arm<br>
make CROSS_COMPILE=arm-linux-uclibc-<br>
@@ -657,14 +765,14 @@ int main(int argc, char *argv)
tar xvjf sources/busybox-x.x.x.tar.bz2
- cd Busybox-x.x.x
+ cd busybox-x.x.x
make allnoconfig
make include/bb_config.h
echo "CONFIG_SED=y" >> .config
echo "#undef ENABLE_SED" >> include/bb_config.h
echo "#define ENABLE_SED 1" >> include/bb_config.h
- mv Busybox sed
+ mv busybox sed
export PATH=`pwd`:"$PATH"