Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 1 | <!--#include file="header.html" --> |
| 2 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 3 | <h3>Frequently Asked Questions</h3> |
| 4 | |
| 5 | This is a collection of some of the more frequently asked questions |
| 6 | about BusyBox. Some of the questions even have answers. If you |
| 7 | have additions to this FAQ document, we would love to add them, |
| 8 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 9 | <h2>General questions</h2> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 10 | <ol> |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 11 | <li><a href="#getting_started">How can I get started using BusyBox?</a></li> |
| 12 | <li><a href="#configure">How do I configure busybox?</a></li> |
Bernhard Reutner-Fischer | 8936a19 | 2007-06-08 07:19:06 +0000 | [diff] [blame] | 13 | <li><a href="#build">How do I build BusyBox with a cross-compiler?</a></li> |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 14 | <li><a href="#build_system">How do I build a BusyBox-based system?</a></li> |
| 15 | <li><a href="#kernel">Which Linux kernel versions are supported?</a></li> |
| 16 | <li><a href="#arch">Which architectures does BusyBox run on?</a></li> |
| 17 | <li><a href="#libc">Which C libraries are supported?</a></li> |
| 18 | <li><a href="#commercial">Can I include BusyBox as part of the software on my device?</a></li> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 19 | <li><a href="#external">Where can I find other small utilities since busybox does not include the features I want?</a></li> |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 20 | <li><a href="#demanding">I demand that you to add <favorite feature> right now! How come you don't answer all my questions on the mailing list instantly? I demand that you help me with all of my problems <em>Right Now</em>!</a></li> |
| 21 | <li><a href="#helpme">I need help with BusyBox! What should I do?</a></li> |
| 22 | <li><a href="#contracts">I need you to add <favorite feature>! Are the BusyBox developers willing to be paid in order to fix bugs or add in <favorite feature>? Are you willing to provide support contracts?</a></li> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 23 | </ol> |
Rob Landley | de7f9b7 | 2005-07-31 04:27:19 +0000 | [diff] [blame] | 24 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 25 | <h2>Troubleshooting</h2> |
| 26 | <ol> |
| 27 | <li><a href="#bugs">I think I found a bug in BusyBox! What should I do?!</a></li> |
Rob Landley | 95718b3 | 2006-08-16 22:13:56 +0000 | [diff] [blame] | 28 | <li><a href="#backporting">I'm using an ancient version from the dawn of time and something's broken. Can you backport fixes for free?</a></li> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 29 | <li><a href="#init">Busybox init isn't working!</a></li> |
| 30 | <li><a href="#sed">I can't configure busybox on my system.</a></li> |
| 31 | <li><a href="#job_control">Why do I keep getting "sh: can't access tty; job control turned off" errors? Why doesn't Control-C work within my shell?</a></li> |
| 32 | </ol> |
| 33 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 34 | <h2>Misc. questions</h2> |
| 35 | <ol> |
| 36 | <li><a href="#tz">How do I change the time zone in busybox?</a></li> |
| 37 | </ol> |
| 38 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 39 | <h2>Programming questions</h2> |
| 40 | <ol> |
| 41 | <li><a href="#goals">What are the goals of busybox?</a></li> |
| 42 | <li><a href="#design">What is the design of busybox?</a></li> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 43 | <li><a href="#source">How is the source code organized?</a> |
| 44 | <ul> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 45 | <li><a href="#source_applets">The applet directories.</a></li> |
| 46 | <li><a href="#source_libbb">The busybox shared library (libbb)</a></li> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 47 | </ul> |
| 48 | </li> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 49 | <li><a href="#optimize">I want to make busybox even smaller, how do I go about it?</a></li> |
| 50 | <li><a href="#adding">Adding an applet to busybox</a></li> |
| 51 | <li><a href="#standards">What standards does busybox adhere to?</a></li> |
| 52 | <li><a href="#portability">Portability.</a></li> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 53 | <li><a href="#tips">Tips and tricks.</a> |
| 54 | <ul> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 55 | <li><a href="#tips_encrypted_passwords">Encrypted Passwords</a></li> |
| 56 | <li><a href="#tips_vfork">Fork and vfork</a></li> |
| 57 | <li><a href="#tips_short_read">Short reads and writes</a></li> |
| 58 | <li><a href="#tips_memory">Memory used by relocatable code, PIC, and static linking.</a></li> |
| 59 | <li><a href="#tips_kernel_headers">Including Linux kernel headers.</a></li> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 60 | </ul> |
| 61 | </li> |
Bernhard Reutner-Fischer | 20a55b7 | 2008-08-21 13:32:14 +0000 | [diff] [blame] | 62 | <li><a href="#who">Who are the BusyBox developers?</a></li> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 63 | </ol> |
| 64 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 65 | |
| 66 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 67 | <h1>General questions</h1> |
| 68 | |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 69 | <hr /> |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 70 | <h2><a name="getting_started">How can I get started using BusyBox?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 71 | |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 72 | <p> If you just want to try out busybox without installing it, download the |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 73 | tarball, extract it, run "make defconfig", and then run "make". |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 74 | </p> |
| 75 | <p> |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 76 | This will create a busybox binary with almost all features enabled. To try |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 77 | out a busybox applet, type "./busybox [appletname] [options]", for |
| 78 | example "./busybox ls -l" or "./busybox cat LICENSE". Type "./busybox" |
| 79 | to see a command list, and "busybox appletname --help" to see a brief |
| 80 | usage message for a given applet. |
| 81 | </p> |
| 82 | <p> |
| 83 | BusyBox uses the name it was invoked under to determine which applet is |
| 84 | being invoked. (Try "mv busybox ls" and then "./ls -l".) Installing |
| 85 | busybox consists of creating symlinks (or hardlinks) to the busybox |
Rob Landley | 3d283dd | 2005-11-03 22:11:00 +0000 | [diff] [blame] | 86 | binary for each applet in busybox, and making sure these links are in |
| 87 | the shell's command $PATH. The special applet name "busybox" (or with |
| 88 | any optional suffix, such as "busybox-static") uses the first argument |
| 89 | to determine which applet to run, as shown above. |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 90 | </p> |
| 91 | <p> |
Denis Vlasenko | f7996f3 | 2007-01-11 17:20:00 +0000 | [diff] [blame] | 92 | BusyBox also has a feature called the |
Bernhard Reutner-Fischer | 32f3ebf | 2006-12-10 13:40:16 +0000 | [diff] [blame] | 93 | <a name="standalone_shell">"standalone shell"</a>, where the busybox |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 94 | shell runs any built-in applets before checking the command path. This |
| 95 | feature is also enabled by "make allyesconfig", and to try it out run |
| 96 | the command line "PATH= ./busybox ash". This will blank your command path |
| 97 | and run busybox as your command shell, so the only commands it can find |
| 98 | (without an explicit path such as /bin/ls) are the built-in busybox ones. |
Bernhard Reutner-Fischer | d591a36 | 2006-08-20 17:35:13 +0000 | [diff] [blame] | 99 | This is another good way to see what's built into busybox. |
| 100 | Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH |
| 101 | to be set appropriately, depending on whether or not /proc/self/exe is |
| 102 | available or not. If you do not have /proc, then point that config option |
| 103 | to the location of your busybox binary, usually /bin/busybox. |
| 104 | (So if you set it to /proc/self/exe, and happen to be able to chroot into |
| 105 | your rootfs, you must mount /proc beforehand.) |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 106 | </p> |
Bernhard Reutner-Fischer | 32f3ebf | 2006-12-10 13:40:16 +0000 | [diff] [blame] | 107 | <p> |
| 108 | A typical indication that you set CONFIG_BUSYBOX_EXEC_PATH to proc but |
| 109 | forgot to mount proc is: |
| 110 | <pre> |
| 111 | $ /bin/echo $PATH |
| 112 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11 |
| 113 | $ echo $PATH |
| 114 | /bin/sh: echo: not found |
| 115 | </pre> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 116 | |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 117 | <hr /> |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 118 | <h2><a name="configure">How do I configure busybox?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 119 | |
Rob Landley | ac4c92d | 2006-05-11 17:21:13 +0000 | [diff] [blame] | 120 | <p> Busybox is configured similarly to the linux kernel. Create a default |
| 121 | configuration and then run "make menuconfig" to modify it. The end |
| 122 | result is a .config file that tells the busybox build process what features |
| 123 | to include. So instead of "./configure; make; make install" the equivalent |
| 124 | busybox build would be "make defconfig; make; make install". |
| 125 | </p> |
| 126 | |
| 127 | <p> Busybox configured with all features enabled is a little under a megabyte |
| 128 | dynamically linked on x86. To create a smaller busybox, configure it with |
| 129 | fewer features. Individual busybox applets cost anywhere from a few |
| 130 | hundred bytes to tens of kilobytes. Disable unneeded applets to save, |
| 131 | space, using menuconfig. |
| 132 | </p> |
| 133 | |
| 134 | <p>The most important busybox configurators are:</p> |
| 135 | |
| 136 | <ul> |
| 137 | <li><p>make <b>defconfig</b> - Create the maximum "sane" configuration. This |
| 138 | enables almost all features, minus things like debugging options and features |
| 139 | that require changes to the rest of the system to work (such as selinux or |
| 140 | devfs device names). Use this if you want to start from a full-featured |
| 141 | busybox and remove features until it's small enough.</p></li> |
| 142 | <li><p>make <b>allnoconfig</b> - Disable everything. This creates a tiny version |
| 143 | of busybox that doesn't do anything. Start here if you know exactly what |
| 144 | you want and would like to select only those features.</p></li> |
| 145 | <li><p>make <b>menuconfig</b> - Interactively modify a .config file through a |
| 146 | multi-level menu interface. Use this after one of the previous two.</p></li> |
| 147 | </ul> |
| 148 | |
| 149 | <p>Some other configuration options are:</p> |
| 150 | <ul> |
| 151 | <li><p>make <b>oldconfig</b> - Update an old .config file for a newer version |
| 152 | of busybox.</p></li> |
| 153 | <li><p>make <b>allyesconfig</b> - Select absolutely everything. This creates |
| 154 | a statically linked version of busybox full of debug code, with dependencies on |
| 155 | selinux, using devfs names... This makes sure everything compiles. Whether |
| 156 | or not the result would do anything useful is an open question.</p></li> |
| 157 | <li><p>make <b>allbareconfig</b> - Select all applets but disable all sub-features |
| 158 | within each applet. More build coverage testing.</p></li> |
| 159 | <li><p>make <b>randconfig</b> - Create a random configuration for test purposes.</p></li> |
| 160 | </ul> |
| 161 | |
| 162 | <p> Menuconfig modifies your .config file through an interactive menu where you can enable or disable |
| 163 | busybox features, and get help about each feature. |
| 164 | |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 165 | <p> |
| 166 | To build a smaller busybox binary, run "make menuconfig" and disable the |
| 167 | features you don't need. (Or run "make allnoconfig" and then use |
| 168 | menuconfig to add just the features you need. Don't forget to recompile |
| 169 | with "make" once you've finished configuring.) |
| 170 | </p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 171 | |
| 172 | <hr /> |
Bernhard Reutner-Fischer | 8936a19 | 2007-06-08 07:19:06 +0000 | [diff] [blame] | 173 | <h2><a name="build">How do I build BusyBox with a cross-compiler?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 174 | |
Bernhard Reutner-Fischer | 8936a19 | 2007-06-08 07:19:06 +0000 | [diff] [blame] | 175 | <p> |
| 176 | To build busybox with a cross-compiler, specify CROSS_COMPILE=<prefix>. |
| 177 | </p> |
| 178 | <p> |
| 179 | CROSS_COMPILE specifies the prefix used for all executables used |
| 180 | during compilation. Only gcc and related binutils executables |
| 181 | are prefixed with $(CROSS_COMPILE) in the makefiles. |
| 182 | CROSS_COMPILE can be set on the command line: |
Bernhard Reutner-Fischer | 6887e77 | 2008-08-21 13:37:47 +0000 | [diff] [blame] | 183 | </p> |
Bernhard Reutner-Fischer | 8936a19 | 2007-06-08 07:19:06 +0000 | [diff] [blame] | 184 | <pre> |
| 185 | make CROSS_COMPILE=arm-linux-uclibcgnueabi- |
| 186 | </pre> |
Bernhard Reutner-Fischer | 6887e77 | 2008-08-21 13:37:47 +0000 | [diff] [blame] | 187 | <p> |
Bernhard Reutner-Fischer | 8936a19 | 2007-06-08 07:19:06 +0000 | [diff] [blame] | 188 | Alternatively CROSS_COMPILE can be set in the environment. |
| 189 | Default value for CROSS_COMPILE is not to prefix executables. |
| 190 | </p> |
Bernhard Reutner-Fischer | 6887e77 | 2008-08-21 13:37:47 +0000 | [diff] [blame] | 191 | <p> |
| 192 | To store the cross-compiler in your .config, set the variable |
| 193 | CONFIG_CROSS_COMPILER_PREFIX accordingly in menuconfig or by |
| 194 | editing the .config file. |
| 195 | </p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 196 | |
| 197 | <hr /> |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 198 | <h2><a name="build_system">How do I build a BusyBox-based system?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 199 | |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 200 | <p> |
| 201 | BusyBox is a package that replaces a dozen standard packages, but it is |
| 202 | not by itself a complete bootable system. Building an entire Linux |
| 203 | distribution from source is a bit beyond the scope of this FAQ, but it |
| 204 | understandably keeps cropping up on the mailing list, so here are some |
| 205 | pointers. |
| 206 | </p> |
| 207 | <p> |
| 208 | Start by learning how to strip a working system down to the bare essentials |
| 209 | needed to run one or two commands, so you know what it is you actually |
| 210 | need. An excellent practical place to do |
| 211 | this is the <a href="http://www.tldp.org/HOWTO/Bootdisk-HOWTO/">Linux |
| 212 | BootDisk Howto</a>, or for a more theoretical approach try |
| 213 | <a href="http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html">From |
| 214 | PowerUp to Bash Prompt</a>. |
| 215 | </p> |
| 216 | <p> |
| 217 | To learn how to build a working Linux system entirely from source code, |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 218 | the place to go is the <a href="http://www.linuxfromscratch.org/">Linux |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 219 | From Scratch</a> project. They have an entire book of step-by-step |
| 220 | instructions you can |
| 221 | <a href="http://www.linuxfromscratch.org/lfs/view/stable/">read online</a> |
| 222 | or |
| 223 | <a href="http://www.linuxfromscratch.org/lfs/downloads/stable/">download</a>. |
| 224 | Be sure to check out the other sections of their main page, including |
| 225 | Beyond Linux From Scratch, Hardened Linux From Scratch, their Hints |
| 226 | directory, and their LiveCD project. (They also have mailing lists which |
| 227 | are better sources of answers to Linux-system building questions than |
| 228 | the busybox list.) |
| 229 | </p> |
| 230 | <p> |
| 231 | If you want an automated yet customizable system builder which produces |
| 232 | a BusyBox and uClibc based system, try |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 233 | <a href="http://buildroot.uclibc.org/">buildroot</a>, which is |
Rob Landley | a253e73 | 2006-02-14 08:29:48 +0000 | [diff] [blame] | 234 | another project by the maintainer of the uClibc (Erik Andersen). |
| 235 | Download the tarball, extract it, unset CC, make. |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 236 | For more instructions, see the website. |
| 237 | </p> |
| 238 | |
Rob Landley | d48633f | 2006-03-09 18:03:21 +0000 | [diff] [blame] | 239 | <hr /> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 240 | <h2><a name="kernel">Which Linux kernel versions are supported?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 241 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 242 | <p> |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 243 | Full functionality requires Linux 2.4.x or better. (Earlier versions may |
| 244 | still work, but are no longer regularly tested.) A large fraction of the |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 245 | code should run on just about anything. While the current code is fairly |
| 246 | Linux specific, it should be fairly easy to port the majority of the code |
| 247 | to support, say, FreeBSD or Solaris, or Mac OS X, or even Windows (if you |
| 248 | are into that sort of thing). |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 249 | </p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 250 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 251 | <hr /> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 252 | <h2><a name="arch">Which architectures does BusyBox run on?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 253 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 254 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 255 | BusyBox in general will build on any architecture supported by gcc. |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 256 | Kernel module loading for 2.4 Linux kernels is currently |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 257 | limited to ARM, CRIS, H8/300, x86, ia64, x86_64, m68k, MIPS, PowerPC, |
| 258 | S390, SH3/4/5, Sparc, v850e, and x86_64 for 2.4.x kernels. |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 259 | </p> |
| 260 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 261 | With 2.6.x kernels, module loading support should work on all architectures. |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 262 | </p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 263 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 264 | <hr /> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 265 | <h2><a name="libc">Which C libraries are supported?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 266 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 267 | <p> |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 268 | On Linux, BusyBox releases are tested against uClibc (0.9.27 or later) and |
| 269 | glibc (2.2 or later). Both should provide full functionality with busybox, |
| 270 | and if you find a bug we want to hear about it. |
| 271 | </p> |
Mike Frysinger | d505e3e | 2005-10-29 08:03:54 +0000 | [diff] [blame] | 272 | <p> |
Rob Landley | 380ad12 | 2005-09-23 16:52:09 +0000 | [diff] [blame] | 273 | Linux-libc5 is no longer maintained (and has no known advantages over |
| 274 | uClibc), dietlibc is known to have numerous unfixed bugs, and klibc is |
| 275 | missing too many features to build BusyBox. If you require a small C |
| 276 | library for Linux, the busybox developers recommend uClibc. |
| 277 | </p> |
| 278 | <p> |
| 279 | Some BusyBox applets have been built and run under a combination |
| 280 | of newlib and libgloss (see |
| 281 | <a href="http://www.busybox.net/lists/busybox/2005-March/013759.html">this thread</a>). |
| 282 | This is still experimental, but may be supported in a future release. |
| 283 | </p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 284 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 285 | <hr /> |
Mike Frysinger | 86097b3 | 2005-09-15 01:37:36 +0000 | [diff] [blame] | 286 | <h2><a name="commercial">Can I include BusyBox as part of the software on my device?</a></h2> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 287 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 288 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 289 | Yes. As long as you <a href="http://busybox.net/license.html">fully comply |
| 290 | with the generous terms of the GPL BusyBox license</a> you can ship BusyBox |
| 291 | as part of the software on your device. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 292 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 293 | |
| 294 | <hr /> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 295 | <h2><a name="external">Where can I find other small utilities since busybox |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 296 | does not include the features i want?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 297 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 298 | <p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 299 | we maintain such a <a href="tinyutils.html">list</a> on this site! |
| 300 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 301 | |
| 302 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 303 | <h2><a name="demanding">I demand that you to add <favorite feature> right now! How come you don't answer all my questions on the mailing list instantly? I demand that you help me with all of my problems <em>Right Now</em>!</a></h2> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 304 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 305 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 306 | You have not paid us a single cent and yet you still have the product of |
| 307 | many years of our work. We are not your slaves! We work on BusyBox |
| 308 | because we find it useful and interesting. If you go off flaming us, we |
| 309 | will ignore you. |
| 310 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 311 | <hr /> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 312 | <h2><a name="helpme">I need help with BusyBox! What should I do?</a></h2> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 313 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 314 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 315 | If you find that you need help with BusyBox, you can ask for help on the |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 316 | BusyBox mailing list at busybox@busybox.net.</p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 317 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 318 | <p> In addition to the mailing list, Erik Andersen (andersee), Manuel Nova |
| 319 | (mjn3), Rob Landley (landley), Mike Frysinger (SpanKY), Bernhard Fischer |
| 320 | (blindvt), and other long-time BusyBox developers are known to hang out |
| 321 | on the uClibc IRC channel: #uclibc on irc.freenode.net. There is a |
| 322 | <a href="http://ibot.Rikers.org/%23uclibc/">web archive of |
| 323 | daily logs of the #uclibc IRC channel</a> going back to 2002. |
| 324 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 325 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 326 | <p> |
Rob Landley | a253e73 | 2006-02-14 08:29:48 +0000 | [diff] [blame] | 327 | <b>Please do not send private email to Rob, Erik, Manuel, or the other |
| 328 | BusyBox contributors asking for private help unless you are planning on |
| 329 | paying for consulting services.</b> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 330 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 331 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 332 | <p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 333 | When we answer questions on the BusyBox mailing list, it helps everyone |
| 334 | since people with similar problems in the future will be able to get help |
| 335 | by searching the mailing list archives. Private help is reserved as a paid |
| 336 | service. If you need to use private communication, or if you are serious |
| 337 | about getting timely assistance with BusyBox, you should seriously consider |
| 338 | paying for consulting services. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 339 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 340 | |
| 341 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 342 | <h2><a name="contracts">I need you to add <favorite feature>! Are the BusyBox developers willing to be paid in order to fix bugs or add in <favorite feature>? Are you willing to provide support contracts?</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 343 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 344 | <p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 345 | Yes we are. The easy way to sponsor a new feature is to post an offer on |
| 346 | the mailing list to see who's interested. You can also email the project's |
| 347 | maintainer and ask them to recommend someone. |
| 348 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 349 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 350 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 351 | <h1>Troubleshooting</h1> |
| 352 | |
| 353 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 354 | <h2><a name="bugs">I think I found a bug in BusyBox! What should I do?</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 355 | |
| 356 | <p> |
| 357 | If you simply need help with using or configuring BusyBox, please submit a |
| 358 | detailed description of your problem to the BusyBox mailing list at <a |
Bernhard Reutner-Fischer | 557f9c4 | 2008-08-21 11:54:23 +0000 | [diff] [blame] | 359 | href="mailto:busybox@busybox.net">busybox@busybox.net</a>. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 360 | Please do not send email to individual developers asking |
| 361 | for private help unless you are planning on paying for consulting services. |
| 362 | When we answer questions on the BusyBox mailing list, it helps everyone, |
| 363 | while private answers help only you... |
| 364 | </p> |
| 365 | |
| 366 | <p> |
Rob Landley | 95718b3 | 2006-08-16 22:13:56 +0000 | [diff] [blame] | 367 | Bug reports and new feature patches sometimes get lost when posted to the |
| 368 | mailing list, because the developers of BusyBox are busy people and have |
| 369 | only so much they can keep in their brains at a time. You can post a |
| 370 | polite reminder after 2-3 days without offending anybody. If that doesn't |
| 371 | result in a solution, please use the |
| 372 | <a href="http://bugs.busybox.net/">BusyBox Bug |
| 373 | and Patch Tracking System</a> to submit a detailed explanation and we'll |
| 374 | get to it as soon as we can. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 375 | </p> |
| 376 | |
Rob Landley | 95718b3 | 2006-08-16 22:13:56 +0000 | [diff] [blame] | 377 | <p> |
| 378 | Note that bugs entered into the bug system without being mentioned on the |
| 379 | mailing list first may languish there for months before anyone even notices |
| 380 | them. We generally go through the bug system when preparing for new |
| 381 | development releases, to see what fell through the cracks while we were |
| 382 | off writing new features. (It's a fast/unreliable vs slow/reliable thing. |
| 383 | Saves retransits, but the latency sucks.) |
| 384 | </p> |
| 385 | |
| 386 | <hr /> |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 387 | <h2><a name="backporting">I'm using an ancient version from the dawn of time and something's broken. Can you backport fixes for free?</a></h2> |
Rob Landley | 95718b3 | 2006-08-16 22:13:56 +0000 | [diff] [blame] | 388 | |
| 389 | <p>Variants of this one get asked a lot.</p> |
| 390 | |
| 391 | <p>The purpose of the BusyBox mailing list is to develop and improve BusyBox, |
| 392 | and we're happy to respond to our users' needs. But if you're coming to the |
| 393 | list for free tech support we're going to ask you to upgrade to a current |
| 394 | version before we try to diagnose your problem.</p> |
| 395 | |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 396 | <p>If you're building BusyBox 0.50 with uClibc 0.9.19 and gcc 1.27 there's a |
Rob Landley | 95718b3 | 2006-08-16 22:13:56 +0000 | [diff] [blame] | 397 | fairly large chance that whatever problem you're seeing has already been fixed. |
| 398 | To get that fix, all you have to do is upgrade to a newer version. If you |
| 399 | don't at least _try_ that, you're wasting our time.</p> |
| 400 | |
| 401 | <p>The volunteers are happy to fix any bugs you point out in the current |
| 402 | versions because doing so helps everybody and makes the project better. We |
| 403 | want to make the current version work for you. But diagnosing, debugging, and |
| 404 | backporting fixes to old versions isn't something we do for free, because it |
| 405 | doesn't help anybody but you. The cost of volunteer tech support is using a |
| 406 | reasonably current version of the project.</p> |
| 407 | |
| 408 | <p>If you don't want to upgrade, you have the complete source code and thus |
| 409 | the ability to fix it yourself, or hire a consultant to do it for you. If you |
| 410 | got your version from a vendor who still supports the older version, they can |
| 411 | help you. But there are limits as to what the volunteers will feel obliged to |
| 412 | do for you.</p> |
| 413 | |
| 414 | <p>As a rule of thumb, volunteers will generally answer polite questions about |
| 415 | a given version for about three years after its release before it's so old |
| 416 | we don't remember the answer off the top of our head. And if you want us to |
| 417 | put any _effort_ into tracking it down, we want you to put in a little effort |
| 418 | of your own by confirming it's still a problem with the current version. It's |
| 419 | also hard for us to fix a problem of yours if we can't reproduce it because |
| 420 | we don't have any systems running an environment that old.</p> |
| 421 | |
| 422 | <p>A consultant will happily set up a special environment just to reproduce |
| 423 | your problem, and you can always ask on the list if any of the developers |
| 424 | have consulting rates.</p> |
| 425 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 426 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 427 | <h2><a name="init">Busybox init isn't working!</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 428 | |
Mike Frysinger | 77dbe73 | 2005-04-17 04:32:22 +0000 | [diff] [blame] | 429 | <p> |
Rob Landley | c5e4ab7 | 2006-06-29 04:59:11 +0000 | [diff] [blame] | 430 | Init is the first program that runs, so it might be that no programs are |
| 431 | working on your new system because of a problem with your cross-compiler, |
| 432 | kernel, console settings, shared libraries, root filesystem... To rule all |
| 433 | that out, first build a statically linked version of the following "hello |
| 434 | world" program with your cross compiler toolchain: |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 435 | </p> |
| 436 | <pre> |
| 437 | #include <stdio.h> |
Mike Frysinger | 77dbe73 | 2005-04-17 04:32:22 +0000 | [diff] [blame] | 438 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 439 | int main(int argc, char *argv) |
| 440 | { |
| 441 | printf("Hello world!\n"); |
| 442 | sleep(999999999); |
| 443 | } |
| 444 | </pre> |
| 445 | |
| 446 | <p> |
| 447 | Now try to boot your device with an "init=" argument pointing to your |
| 448 | hello world program. Did you see the hello world message? Until you |
| 449 | do, don't bother messing with busybox init. |
| 450 | </p> |
| 451 | |
| 452 | <p> |
| 453 | Once you've got it working statically linked, try getting it to work |
| 454 | dynamically linked. Then read the FAQ entry <a href="#build_system">How |
Rob Landley | c5e4ab7 | 2006-06-29 04:59:11 +0000 | [diff] [blame] | 455 | do I build a BusyBox-based system?</a>, and the |
| 456 | <a href="/downloads/BusyBox.html#item_init">documentation for BusyBox |
| 457 | init</a>. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 458 | </p> |
Mike Frysinger | 77dbe73 | 2005-04-17 04:32:22 +0000 | [diff] [blame] | 459 | |
| 460 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 461 | <h2><a name="sed">I can't configure busybox on my system.</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 462 | |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 463 | <p> |
| 464 | Configuring Busybox depends on a recent version of sed. Older |
| 465 | distributions (Red Hat 7.2, Debian 3.0) may not come with a |
| 466 | usable version. Luckily BusyBox can use its own sed to configure itself, |
| 467 | although this leads to a bit of a chicken and egg problem. |
| 468 | You can work around this by hand-configuring busybox to build with just |
| 469 | sed, then putting that sed in your path to configure the rest of busybox |
| 470 | with, like so: |
| 471 | </p> |
| 472 | |
| 473 | <pre> |
| 474 | tar xvjf sources/busybox-x.x.x.tar.bz2 |
| 475 | cd busybox-x.x.x |
| 476 | make allnoconfig |
| 477 | make include/bb_config.h |
| 478 | echo "CONFIG_SED=y" >> .config |
| 479 | echo "#undef ENABLE_SED" >> include/bb_config.h |
| 480 | echo "#define ENABLE_SED 1" >> include/bb_config.h |
| 481 | make |
| 482 | mv busybox sed |
| 483 | export PATH=`pwd`:"$PATH" |
| 484 | </pre> |
| 485 | |
| 486 | <p>Then you can run "make defconfig" or "make menuconfig" normally.</p> |
| 487 | |
| 488 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 489 | <h2><a name="job_control">Why do I keep getting "sh: can't access tty; job control turned off" errors? Why doesn't Control-C work within my shell?</a></h2> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 490 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 491 | <p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 492 | Job control will be turned off since your shell can not obtain a controlling |
| 493 | terminal. This typically happens when you run your shell on /dev/console. |
| 494 | The kernel will not provide a controlling terminal on the /dev/console |
| 495 | device. Your should run your shell on a normal tty such as tty1 or ttyS0 |
| 496 | and everything will work perfectly. If you <em>REALLY</em> want your shell |
| 497 | to run on /dev/console, then you can hack your kernel (if you are into that |
| 498 | sortof thing) by changing drivers/char/tty_io.c to change the lines where |
| 499 | it sets "noctty = 1;" to instead set it to "0". I recommend you instead |
| 500 | run your shell on a real console... |
| 501 | </p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 502 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 503 | <hr /> |
| 504 | <h1>Misc. questions</h1> |
| 505 | |
| 506 | <hr /> |
| 507 | <h2><a name="tz">How do I change the time zone in busybox?</a></h2> |
| 508 | |
| 509 | <p>Busybox has nothing to do with the timezone. Please consult your libc |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 510 | documentation. (<a href="http://google.com/search?q=uclibc+glibc+timezone">http://google.com/search?q=uclibc+glibc+timezone</a>).</p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 511 | |
| 512 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 513 | <h1>Development</h1> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 514 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 515 | <hr /> |
| 516 | <h2><a name="goals">What are the goals of busybox?</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 517 | |
| 518 | <p>Busybox aims to be the smallest and simplest correct implementation of the |
| 519 | standard Linux command line tools. First and foremost, this means the |
| 520 | smallest executable size we can manage. We also want to have the simplest |
| 521 | and cleanest implementation we can manage, be <a href="#standards">standards |
| 522 | compliant</a>, minimize run-time memory usage (heap and stack), run fast, and |
| 523 | take over the world.</p> |
| 524 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 525 | <hr /> |
| 526 | <h2><a name="design">What is the design of busybox?</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 527 | |
| 528 | <p>Busybox is like a swiss army knife: one thing with many functions. |
| 529 | The busybox executable can act like many different programs depending on |
| 530 | the name used to invoke it. Normal practice is to create a bunch of symlinks |
| 531 | pointing to the busybox binary, each of which triggers a different busybox |
| 532 | function. (See <a href="FAQ.html#getting_started">getting started</a> in the |
| 533 | FAQ for more information on usage, and <a href="BusyBox.html">the |
| 534 | busybox documentation</a> for a list of symlink names and what they do.) |
| 535 | |
| 536 | <p>The "one binary to rule them all" approach is primarily for size reasons: a |
| 537 | single multi-purpose executable is smaller then many small files could be. |
| 538 | This way busybox only has one set of ELF headers, it can easily share code |
| 539 | between different apps even when statically linked, it has better packing |
| 540 | efficiency by avoding gaps between files or compression dictionary resets, |
| 541 | and so on.</p> |
| 542 | |
| 543 | <p>Work is underway on new options such as "make standalone" to build separate |
| 544 | binaries for each applet, and a "libbb.so" to make the busybox common code |
| 545 | available as a shared library. Neither is ready yet at the time of this |
| 546 | writing.</p> |
| 547 | |
| 548 | <a name="source"></a> |
| 549 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 550 | <hr /> |
| 551 | <h2><a name="source_applets">The applet directories</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 552 | |
| 553 | <p>The directory "applets" contains the busybox startup code (applets.c and |
| 554 | busybox.c), and several subdirectories containing the code for the individual |
| 555 | applets.</p> |
| 556 | |
| 557 | <p>Busybox execution starts with the main() function in applets/busybox.c, |
Denis Vlasenko | 8f8f268 | 2006-10-03 21:00:43 +0000 | [diff] [blame] | 558 | which sets the global variable applet_name to argv[0] and calls |
Denis Vlasenko | e4f2d06 | 2007-04-11 17:03:19 +0000 | [diff] [blame] | 559 | run_applet_and_exit() in applets/applets.c. That uses the applets[] array |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 560 | (defined in include/busybox.h and filled out in include/applets.h) to |
| 561 | transfer control to the appropriate APPLET_main() function (such as |
| 562 | cat_main() or sed_main()). The individual applet takes it from there.</p> |
| 563 | |
| 564 | <p>This is why calling busybox under a different name triggers different |
| 565 | functionality: main() looks up argv[0] in applets[] to get a function pointer |
| 566 | to APPLET_main().</p> |
| 567 | |
| 568 | <p>Busybox applets may also be invoked through the multiplexor applet |
Denis Vlasenko | 82d38da | 2007-10-10 14:38:47 +0000 | [diff] [blame] | 569 | "busybox" (see busybox_main() in libbb/appletlib.c), and through the |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 570 | standalone shell (grep for STANDALONE_SHELL in applets/shell/*.c). |
| 571 | See <a href="FAQ.html#getting_started">getting started</a> in the |
| 572 | FAQ for more information on these alternate usage mechanisms, which are |
| 573 | just different ways to reach the relevant APPLET_main() function.</p> |
| 574 | |
| 575 | <p>The applet subdirectories (archival, console-tools, coreutils, |
| 576 | debianutils, e2fsprogs, editors, findutils, init, loginutils, miscutils, |
| 577 | modutils, networking, procps, shell, sysklogd, and util-linux) correspond |
| 578 | to the configuration sub-menus in menuconfig. Each subdirectory contains the |
| 579 | code to implement the applets in that sub-menu, as well as a Config.in |
| 580 | file defining that configuration sub-menu (with dependencies and help text |
| 581 | for each applet), and the makefile segment (Makefile.in) for that |
| 582 | subdirectory.</p> |
| 583 | |
| 584 | <p>The run-time --help is stored in usage_messages[], which is initialized at |
| 585 | the start of applets/applets.c and gets its help text from usage.h. During the |
| 586 | build this help text is also used to generate the BusyBox documentation (in |
| 587 | html, txt, and man page formats) in the docs directory. See |
| 588 | <a href="#adding">adding an applet to busybox</a> for more |
| 589 | information.</p> |
| 590 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 591 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 592 | <h2><a name="source_libbb"><b>libbb</b></a></h2> |
| 593 | |
| 594 | <p>Most non-setup code shared between busybox applets lives in the libbb |
| 595 | directory. It's a mess that evolved over the years without much auditing |
| 596 | or cleanup. For anybody looking for a great project to break into busybox |
| 597 | development with, documenting libbb would be both incredibly useful and good |
| 598 | experience.</p> |
| 599 | |
| 600 | <p>Common themes in libbb include allocation functions that test |
| 601 | for failure and abort the program with an error message so the caller doesn't |
| 602 | have to test the return value (xmalloc(), xstrdup(), etc), wrapped versions |
| 603 | of open(), close(), read(), and write() that test for their own failures |
| 604 | and/or retry automatically, linked list management functions (llist.c), |
Denis Vlasenko | 67b23e6 | 2006-10-03 21:00:06 +0000 | [diff] [blame] | 605 | command line argument parsing (getopt32.c), and a whole lot more.</p> |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 606 | |
| 607 | <hr /> |
Rob Landley | c7a3e1b | 2005-07-31 04:25:00 +0000 | [diff] [blame] | 608 | <h2><a name="optimize">I want to make busybox even smaller, how do I go about it?</a></h2> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 609 | |
Rob Landley | c7a3e1b | 2005-07-31 04:25:00 +0000 | [diff] [blame] | 610 | <p> |
| 611 | To conserve bytes it's good to know where they're being used, and the |
| 612 | size of the final executable isn't always a reliable indicator of |
| 613 | the size of the components (since various structures are rounded up, |
| 614 | so a small change may not even be visible by itself, but many small |
| 615 | savings add up). |
| 616 | </p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 617 | |
| 618 | <p> The busybox Makefile builds two versions of busybox, one of which |
| 619 | (busybox_unstripped) has extra information that various analysis tools |
| 620 | can use. (This has nothing to do with CONFIG_DEBUG, leave that off |
| 621 | when trying to optimize for size.) |
| 622 | </p> |
| 623 | |
| 624 | <p> The <b>"make bloatcheck"</b> option uses Matt Mackall's bloat-o-meter |
| 625 | script to compare two versions of busybox (busybox_unstripped vs |
| 626 | busybox_old), and report which symbols changed size and by how much. |
Rob Landley | d244bc1 | 2006-05-27 21:30:34 +0000 | [diff] [blame] | 627 | To use it, first build a base version with <b>"make baseline"</b>. |
| 628 | (This creates busybox_old, which should have the original sizes for |
| 629 | comparison purposes.) Then build the new version with your changes |
| 630 | and run "make bloatcheck" to see the size differences from the old |
| 631 | version. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 632 | </p> |
Rob Landley | c7a3e1b | 2005-07-31 04:25:00 +0000 | [diff] [blame] | 633 | <p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 634 | The first line of output has totals: how many symbols were added or |
| 635 | removed, how many symbols grew or shrank, the number of bytes added |
| 636 | and number of bytes removed by these changes, and finally the total |
| 637 | number of bytes difference between the two files. The remaining |
| 638 | lines show each individual symbol, the old and new sizes, and the |
| 639 | increase or decrease in size (which results are sorted by). |
| 640 | </p> |
| 641 | <p> |
| 642 | The <b>"make sizes"</b> option produces raw symbol size information for |
| 643 | busybox_unstripped. This is the output from the "nm --size-sort" |
| 644 | command (see "man nm" for more information), and is the information |
| 645 | bloat-o-meter parses to produce the comparison report above. For |
| 646 | defconfig, this is a good way to find the largest symbols in the tree |
| 647 | (which is a good place to start when trying to shrink the code). To |
| 648 | take a closer look at individual applets, configure busybox with just |
| 649 | one applet (run "make allnoconfig" and then switch on a single applet |
| 650 | with menuconfig), and then use "make sizes" to see the size of that |
| 651 | applet's components. |
| 652 | </p> |
| 653 | <p> |
| 654 | The "showasm" command (in the scripts directory) produces an assembly |
| 655 | dump of a function, providing a closer look at what changed. Try |
| 656 | "scripts/showasm busybox_unstripped" to list available symbols, and |
| 657 | "scripts/showasm busybox_unstripped symbolname" to see the assembly |
| 658 | for a sepecific symbol. |
Rob Landley | c7a3e1b | 2005-07-31 04:25:00 +0000 | [diff] [blame] | 659 | </p> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 660 | |
Rob Landley | c7a3e1b | 2005-07-31 04:25:00 +0000 | [diff] [blame] | 661 | <hr /> |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 662 | <h2><a name="adding">Adding an applet to busybox</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 663 | |
| 664 | <p>To add a new applet to busybox, first pick a name for the applet and |
| 665 | a corresponding CONFIG_NAME. Then do this:</p> |
| 666 | |
| 667 | <ul> |
| 668 | <li>Figure out where in the busybox source tree your applet best fits, |
| 669 | and put your source code there. Be sure to use APPLET_main() instead |
| 670 | of main(), where APPLET is the name of your applet.</li> |
| 671 | |
| 672 | <li>Add your applet to the relevant Config.in file (which file you add |
| 673 | it to determines where it shows up in "make menuconfig"). This uses |
| 674 | the same general format as the linux kernel's configuration system.</li> |
| 675 | |
| 676 | <li>Add your applet to the relevant Makefile.in file (in the same |
| 677 | directory as the Config.in you chose), using the existing entries as a |
| 678 | template and the same CONFIG symbol as you used for Config.in. (Don't |
| 679 | forget "needlibm" or "needcrypt" if your applet needs libm or |
| 680 | libcrypt.)</li> |
| 681 | |
| 682 | <li>Add your applet to "include/applets.h", using one of the existing |
| 683 | entries as a template. (Note: this is in alphabetical order. Applets |
| 684 | are found via binary search, and if you add an applet out of order it |
| 685 | won't work.)</li> |
| 686 | |
| 687 | <li>Add your applet's runtime help text to "include/usage.h". You need |
| 688 | at least appname_trivial_usage (the minimal help text, always included |
| 689 | in the busybox binary when this applet is enabled) and appname_full_usage |
| 690 | (extra help text included in the busybox binary with |
| 691 | CONFIG_FEATURE_VERBOSE_USAGE is enabled), or it won't compile. |
| 692 | The other two help entry types (appname_example_usage and |
| 693 | appname_notes_usage) are optional. They don't take up space in the binary, |
| 694 | but instead show up in the generated documentation (BusyBox.html, |
| 695 | BusyBox.txt, and the man page BusyBox.1).</li> |
| 696 | |
| 697 | <li>Run menuconfig, switch your applet on, compile, test, and fix the |
| 698 | bugs. Be sure to try both "allyesconfig" and "allnoconfig" (and |
| 699 | "allbareconfig" if relevant).</li> |
| 700 | |
| 701 | </ul> |
| 702 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 703 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 704 | <h2><a name="standards">What standards does busybox adhere to?</a></h2> |
| 705 | |
| 706 | <p>The standard we're paying attention to is the "Shell and Utilities" |
| 707 | portion of the <a href="http://www.opengroup.org/onlinepubs/009695399/">Open |
| 708 | Group Base Standards</a> (also known as the Single Unix Specification version |
| 709 | 3 or SUSv3). Note that paying attention isn't necessarily the same thing as |
| 710 | following it.</p> |
| 711 | |
| 712 | <p>SUSv3 doesn't even mention things like init, mount, tar, or losetup, nor |
| 713 | commonly used options like echo's '-e' and '-n', or sed's '-i'. Busybox is |
| 714 | driven by what real users actually need, not the fact the standard believes |
| 715 | we should implement ed or sccs. For size reasons, we're unlikely to include |
| 716 | much internationalization support beyond UTF-8, and on top of all that, our |
| 717 | configuration menu lets developers chop out features to produce smaller but |
| 718 | very non-standard utilities.</p> |
| 719 | |
| 720 | <p>Also, Busybox is aimed primarily at Linux. Unix standards are interesting |
| 721 | because Linux tries to adhere to them, but portability to dozens of platforms |
| 722 | is only interesting in terms of offering a restricted feature set that works |
| 723 | everywhere, not growing dozens of platform-specific extensions. Busybox |
| 724 | should be portable to all hardware platforms Linux supports, and any other |
| 725 | similar operating systems that are easy to do and won't require much |
| 726 | maintenance.</p> |
| 727 | |
| 728 | <p>In practice, standards compliance tends to be a clean-up step once an |
| 729 | applet is otherwise finished. When polishing and testing a busybox applet, |
| 730 | we ensure we have at least the option of full standards compliance, or else |
| 731 | document where we (intentionally) fall short.</p> |
| 732 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 733 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 734 | <h2><a name="portability">Portability.</a></h2> |
| 735 | |
| 736 | <p>Busybox is a Linux project, but that doesn't mean we don't have to worry |
| 737 | about portability. First of all, there are different hardware platforms, |
| 738 | different C library implementations, different versions of the kernel and |
| 739 | build toolchain... The file "include/platform.h" exists to centralize and |
| 740 | encapsulate various platform-specific things in one place, so most busybox |
| 741 | code doesn't have to care where it's running.</p> |
| 742 | |
| 743 | <p>To start with, Linux runs on dozens of hardware platforms. We try to test |
| 744 | each release on x86, x86-64, arm, power pc, and mips. (Since qemu can handle |
| 745 | all of these, this isn't that hard.) This means we have to care about a number |
| 746 | of portability issues like endianness, word size, and alignment, all of which |
| 747 | belong in platform.h. That header handles conditional #includes and gives |
| 748 | us macros we can use in the rest of our code. At some point in the future |
| 749 | we might grow a platform.c, possibly even a platform subdirectory. As long |
| 750 | as the applets themselves don't have to care.</p> |
| 751 | |
| 752 | <p>On a related note, we made the "default signedness of char varies" problem |
| 753 | go away by feeding the compiler -funsigned-char. This gives us consistent |
| 754 | behavior on all platforms, and defaults to 8-bit clean text processing (which |
| 755 | gets us halfway to UTF-8 support). NOMMU support is less easily separated |
| 756 | (see the tips section later in this document), but we're working on it.</p> |
| 757 | |
| 758 | <p>Another type of portability is build environments: we unapologetically use |
| 759 | a number of gcc and glibc extensions (as does the Linux kernel), but these have |
| 760 | been picked up by packages like uClibc, TCC, and Intel's C Compiler. As for |
| 761 | gcc, we take advantage of newer compiler optimizations to get the smallest |
| 762 | possible size, but we also regression test against an older build environment |
| 763 | using the Red Hat 9 image at "http://busybox.net/downloads/qemu". This has a |
| 764 | 2.4 kernel, gcc 3.2, make 3.79.1, and glibc 2.3, and is the oldest |
| 765 | build/deployment environment we still put any effort into maintaining. (If |
| 766 | anyone takes an interest in older kernels you're welcome to submit patches, |
| 767 | but the effort would probably be better spent |
| 768 | <a href="http://www.selenic.com/linux-tiny/">trimming |
| 769 | down the 2.6 kernel</a>.) Older gcc versions than that are uninteresting since |
| 770 | we now use c99 features, although |
| 771 | <a href="http://fabrice.bellard.free.fr/tcc/">tcc</a> might be worth a |
| 772 | look.</p> |
| 773 | |
| 774 | <p>We also test busybox against the current release of uClibc. Older versions |
| 775 | of uClibc aren't very interesting (they were buggy, and uClibc wasn't really |
| 776 | usable as a general-purpose C library before version 0.9.26 anyway).</p> |
| 777 | |
| 778 | <p>Other unix implementations are mostly uninteresting, since Linux binaries |
| 779 | have become the new standard for portable Unix programs. Specifically, |
| 780 | the ubiquity of Linux was cited as the main reason the Intel Binary |
| 781 | Compatability Standard 2 died, by the standards group organized to name a |
| 782 | successor to ibcs2: <a href="http://www.telly.org/86open/">the 86open |
| 783 | project</a>. That project disbanded in 1999 with the endorsement of an |
| 784 | existing standard: Linux ELF binaries. Since then, the major players at the |
| 785 | time (such as <a |
Bernhard Reutner-Fischer | beea4b8 | 2008-08-21 12:42:39 +0000 | [diff] [blame] | 786 | href="http://www-03.ibm.com/servers/aix/products/aixos/linux/index.html">AIX</a>, <a |
| 787 | href="http://www.sun.com/software/solaris/ds/linux_interop.jsp#3">Solaris</a>, and |
| 788 | <a href="http://www.onlamp.com/pub/a/bsd/2000/03/17/linuxapps.html">FreeBSD</a>) |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 789 | have all either grown Linux support or folded.</p> |
| 790 | |
| 791 | <p>The major exceptions are newcomer MacOS X, some embedded environments |
| 792 | (such as newlib+libgloss) which provide a posix environment but not a full |
| 793 | Linux environment, and environments like Cygwin that provide only partial Linux |
| 794 | emulation. Also, some embedded Linux systems run a Linux kernel but amputate |
| 795 | things like the /proc directory to save space.</p> |
| 796 | |
| 797 | <p>Supporting these systems is largely a question of providing a clean subset |
| 798 | of BusyBox's functionality -- whichever applets can easily be made to |
| 799 | work in that environment. Annotating the configuration system to |
| 800 | indicate which applets require which prerequisites (such as procfs) is |
| 801 | also welcome. Other efforts to support these systems (swapping #include |
| 802 | files to build in different environments, adding adapter code to platform.h, |
| 803 | adding more extensive special-case supporting infrastructure such as mount's |
| 804 | legacy mtab support) are handled on a case-by-case basis. Support that can be |
| 805 | cleanly hidden in platform.h is reasonably attractive, and failing that |
| 806 | support that can be cleanly separated into a separate conditionally compiled |
| 807 | file is at least worth a look. Special-case code in the body of an applet is |
| 808 | something we're trying to avoid.</p> |
| 809 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 810 | <hr /> |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 811 | <h2><a name="tips">Programming tips and tricks.</a></h2> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 812 | |
| 813 | <p>Various things busybox uses that aren't particularly well documented |
| 814 | elsewhere.</p> |
| 815 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 816 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 817 | <h2><a name="tips_encrypted_passwords">Encrypted Passwords</a></h2> |
| 818 | |
| 819 | <p>Password fields in /etc/passwd and /etc/shadow are in a special format. |
| 820 | If the first character isn't '$', then it's an old DES style password. If |
| 821 | the first character is '$' then the password is actually three fields |
| 822 | separated by '$' characters:</p> |
| 823 | <pre> |
| 824 | <b>$type$salt$encrypted_password</b> |
| 825 | </pre> |
| 826 | |
| 827 | <p>The "type" indicates which encryption algorithm to use: 1 for MD5 and 2 for SHA1.</p> |
| 828 | |
| 829 | <p>The "salt" is a bunch of ramdom characters (generally 8) the encryption |
| 830 | algorithm uses to perturb the password in a known and reproducible way (such |
| 831 | as by appending the random data to the unencrypted password, or combining |
| 832 | them with exclusive or). Salt is randomly generated when setting a password, |
| 833 | and then the same salt value is re-used when checking the password. (Salt is |
| 834 | thus stored unencrypted.)</p> |
| 835 | |
| 836 | <p>The advantage of using salt is that the same cleartext password encrypted |
| 837 | with a different salt value produces a different encrypted value. |
| 838 | If each encrypted password uses a different salt value, an attacker is forced |
| 839 | to do the cryptographic math all over again for each password they want to |
| 840 | check. Without salt, they could simply produce a big dictionary of commonly |
| 841 | used passwords ahead of time, and look up each password in a stolen password |
| 842 | file to see if it's a known value. (Even if there are billions of possible |
| 843 | passwords in the dictionary, checking each one is just a binary search against |
| 844 | a file only a few gigabytes long.) With salt they can't even tell if two |
| 845 | different users share the same password without guessing what that password |
| 846 | is and decrypting it. They also can't precompute the attack dictionary for |
| 847 | a specific password until they know what the salt value is.</p> |
| 848 | |
| 849 | <p>The third field is the encrypted password (plus the salt). For md5 this |
| 850 | is 22 bytes.</p> |
| 851 | |
| 852 | <p>The busybox function to handle all this is pw_encrypt(clear, salt) in |
| 853 | "libbb/pw_encrypt.c". The first argument is the clear text password to be |
| 854 | encrypted, and the second is a string in "$type$salt$password" format, from |
| 855 | which the "type" and "salt" fields will be extracted to produce an encrypted |
| 856 | value. (Only the first two fields are needed, the third $ is equivalent to |
| 857 | the end of the string.) The return value is an encrypted password in |
| 858 | /etc/passwd format, with all three $ separated fields. It's stored in |
| 859 | a static buffer, 128 bytes long.</p> |
| 860 | |
| 861 | <p>So when checking an existing password, if pw_encrypt(text, |
| 862 | old_encrypted_password) returns a string that compares identical to |
| 863 | old_encrypted_password, you've got the right password. When setting a new |
| 864 | password, generate a random 8 character salt string, put it in the right |
| 865 | format with sprintf(buffer, "$%c$%s", type, salt), and feed buffer as the |
| 866 | second argument to pw_encrypt(text,buffer).</p> |
| 867 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 868 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 869 | <h2><a name="tips_vfork">Fork and vfork</a></h2> |
| 870 | |
| 871 | <p>On systems that haven't got a Memory Management Unit, fork() is unreasonably |
| 872 | expensive to implement (and sometimes even impossible), so a less capable |
| 873 | function called vfork() is used instead. (Using vfork() on a system with an |
| 874 | MMU is like pounding a nail with a wrench. Not the best tool for the job, but |
| 875 | it works.)</p> |
| 876 | |
| 877 | <p>Busybox hides the difference between fork() and vfork() in |
| 878 | libbb/bb_fork_exec.c. If you ever want to fork and exec, use bb_fork_exec() |
| 879 | (which returns a pid and takes the same arguments as execve(), although in |
| 880 | this case envp can be NULL) and don't worry about it. This description is |
| 881 | here in case you want to know why that does what it does.</p> |
| 882 | |
| 883 | <p>Implementing fork() depends on having a Memory Management Unit. With an |
| 884 | MMU then you can simply set up a second set of page tables and share the |
| 885 | physical memory via copy-on-write. So a fork() followed quickly by exec() |
| 886 | only copies a few pages of the parent's memory, just the ones it changes |
| 887 | before freeing them.</p> |
| 888 | |
| 889 | <p>With a very primitive MMU (using a base pointer plus length instead of page |
| 890 | tables, which can provide virtual addresses and protect processes from each |
| 891 | other, but no copy on write) you can still implement fork. But it's |
| 892 | unreasonably expensive, because you have to copy all the parent process' |
| 893 | memory into the new process (which could easily be several megabytes per fork). |
| 894 | And you have to do this even though that memory gets freed again as soon as the |
| 895 | exec happens. (This is not just slow and a waste of space but causes memory |
| 896 | usage spikes that can easily cause the system to run out of memory.)</p> |
| 897 | |
| 898 | <p>Without even a primitive MMU, you have no virtual addresses. Every process |
| 899 | can reach out and touch any other process' memory, because all pointers are to |
| 900 | physical addresses with no protection. Even if you copy a process' memory to |
| 901 | new physical addresses, all of its pointers point to the old objects in the |
| 902 | old process. (Searching through the new copy's memory for pointers and |
| 903 | redirect them to the new locations is not an easy problem.)</p> |
| 904 | |
| 905 | <p>So with a primitive or missing MMU, fork() is just not a good idea.</p> |
| 906 | |
| 907 | <p>In theory, vfork() is just a fork() that writeably shares the heap and stack |
| 908 | rather than copying it (so what one process writes the other one sees). In |
| 909 | practice, vfork() has to suspend the parent process until the child does exec, |
| 910 | at which point the parent wakes up and resumes by returning from the call to |
| 911 | vfork(). All modern kernel/libc combinations implement vfork() to put the |
| 912 | parent to sleep until the child does its exec. There's just no other way to |
| 913 | make it work: the parent has to know the child has done its exec() or exit() |
| 914 | before it's safe to return from the function it's in, so it has to block |
| 915 | until that happens. In fact without suspending the parent there's no way to |
| 916 | even store separate copies of the return value (the pid) from the vfork() call |
| 917 | itself: both assignments write into the same memory location.</p> |
| 918 | |
| 919 | <p>One way to understand (and in fact implement) vfork() is this: imagine |
| 920 | the parent does a setjmp and then continues on (pretending to be the child) |
| 921 | until the exec() comes around, then the _exec_ does the actual fork, and the |
| 922 | parent does a longjmp back to the original vfork call and continues on from |
| 923 | there. (It thus becomes obvious why the child can't return, or modify |
| 924 | local variables it doesn't want the parent to see changed when it resumes.) |
| 925 | |
| 926 | <p>Note a common mistake: the need for vfork doesn't mean you can't have two |
| 927 | processes running at the same time. It means you can't have two processes |
| 928 | sharing the same memory without stomping all over each other. As soon as |
| 929 | the child calls exec(), the parent resumes.</p> |
| 930 | |
| 931 | <p>If the child's attempt to call exec() fails, the child should call _exit() |
| 932 | rather than a normal exit(). This avoids any atexit() code that might confuse |
| 933 | the parent. (The parent should never call _exit(), only a vforked child that |
| 934 | failed to exec.)</p> |
| 935 | |
| 936 | <p>(Now in theory, a nommu system could just copy the _stack_ when it forks |
| 937 | (which presumably is much shorter than the heap), and leave the heap shared. |
| 938 | Even with no MMU at all |
| 939 | In practice, you've just wound up in a multi-threaded situation and you can't |
| 940 | do a malloc() or free() on your heap without freeing the other process' memory |
| 941 | (and if you don't have the proper locking for being threaded, corrupting the |
| 942 | heap if both of you try to do it at the same time and wind up stomping on |
| 943 | each other while traversing the free memory lists). The thing about vfork is |
| 944 | that it's a big red flag warning "there be dragons here" rather than |
| 945 | something subtle and thus even more dangerous.)</p> |
| 946 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 947 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 948 | <h2><a name="tips_sort_read">Short reads and writes</a></h2> |
| 949 | |
| 950 | <p>Busybox has special functions, bb_full_read() and bb_full_write(), to |
| 951 | check that all the data we asked for got read or written. Is this a real |
| 952 | world consideration? Try the following:</p> |
| 953 | |
| 954 | <pre>while true; do echo hello; sleep 1; done | tee out.txt</pre> |
| 955 | |
| 956 | <p>If tee is implemented with bb_full_read(), tee doesn't display output |
| 957 | in real time but blocks until its entire input buffer (generally a couple |
| 958 | kilobytes) is read, then displays it all at once. In that case, we _want_ |
| 959 | the short read, for user interface reasons. (Note that read() should never |
| 960 | return 0 unless it has hit the end of input, and an attempt to write 0 |
| 961 | bytes should be ignored by the OS.)</p> |
| 962 | |
| 963 | <p>As for short writes, play around with two processes piping data to each |
| 964 | other on the command line (cat bigfile | gzip > out.gz) and suspend and |
| 965 | resume a few times (ctrl-z to suspend, "fg" to resume). The writer can |
| 966 | experience short writes, which are especially dangerous because if you don't |
| 967 | notice them you'll discard data. They can also happen when a system is under |
| 968 | load and a fast process is piping to a slower one. (Such as an xterm waiting |
| 969 | on x11 when the scheduler decides X is being a CPU hog with all that |
| 970 | text console scrolling...)</p> |
| 971 | |
| 972 | <p>So will data always be read from the far end of a pipe at the |
| 973 | same chunk sizes it was written in? Nope. Don't rely on that. For one |
Denis Vlasenko | f7996f3 | 2007-01-11 17:20:00 +0000 | [diff] [blame] | 974 | counterexample, see <a href="http://www.faqs.org/rfcs/rfc896.html">rfc 896 |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 975 | for Nagle's algorithm</a>, which waits a fraction of a second or so before |
| 976 | sending out small amounts of data through a TCP/IP connection in case more |
| 977 | data comes in that can be merged into the same packet. (In case you were |
| 978 | wondering why action games that use TCP/IP set TCP_NODELAY to lower the latency |
| 979 | on their their sockets, now you know.)</p> |
| 980 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 981 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 982 | <h2><a name="tips_memory">Memory used by relocatable code, PIC, and static linking.</a></h2> |
| 983 | |
| 984 | <p>The downside of standard dynamic linking is that it results in self-modifying |
| 985 | code. Although each executable's pages are mmaped() into a process' address |
| 986 | space from the executable file and are thus naturally shared between processes |
| 987 | out of the page cache, the library loader (ld-linux.so.2 or ld-uClibc.so.0) |
| 988 | writes to these pages to supply addresses for relocatable symbols. This |
| 989 | dirties the pages, triggering copy-on-write allocation of new memory for each |
| 990 | processes' dirtied pages.</p> |
| 991 | |
| 992 | <p>One solution to this is Position Independent Code (PIC), a way of linking |
| 993 | a file so all the relocations are grouped together. This dirties fewer |
| 994 | pages (often just a single page) for each process' relocations. The down |
| 995 | side is this results in larger executables, which take up more space on disk |
| 996 | (and a correspondingly larger space in memory). But when many copies of the |
| 997 | same program are running, PIC dynamic linking trades a larger disk footprint |
| 998 | for a smaller memory footprint, by sharing more pages.</p> |
| 999 | |
| 1000 | <p>A third solution is static linking. A statically linked program has no |
| 1001 | relocations, and thus the entire executable is shared between all running |
| 1002 | instances. This tends to have a significantly larger disk footprint, but |
| 1003 | on a system with only one or two executables, shared libraries aren't much |
| 1004 | of a win anyway.</p> |
| 1005 | |
| 1006 | <p>You can tell the glibc linker to display debugging information about its |
| 1007 | relocations with the environment variable "LD_DEBUG". Try |
| 1008 | "LD_DEBUG=help /bin/true" for a list of commands. Learning to interpret |
| 1009 | "LD_DEBUG=statistics cat /proc/self/statm" could be interesting.</p> |
| 1010 | |
| 1011 | <p>For more on this topic, here's Rich Felker:</p> |
| 1012 | <blockquote> |
| 1013 | <p>Dynamic linking (without fixed load addresses) fundamentally requires |
| 1014 | at least one dirty page per dso that uses symbols. Making calls (but |
| 1015 | never taking the address explicitly) to functions within the same dso |
| 1016 | does not require a dirty page by itself, but will with ELF unless you |
| 1017 | use -Bsymbolic or hidden symbols when linking.</p> |
| 1018 | |
| 1019 | <p>ELF uses significant additional stack space for the kernel to pass all |
| 1020 | the ELF data structures to the newly created process image. These are |
| 1021 | located above the argument list and environment. This normally adds 1 |
| 1022 | dirty page to the process size.</p> |
| 1023 | |
| 1024 | <p>The ELF dynamic linker has its own data segment, adding one or more |
| 1025 | dirty pages. I believe it also performs relocations on itself.</p> |
| 1026 | |
| 1027 | <p>The ELF dynamic linker makes significant dynamic allocations to manage |
| 1028 | the global symbol table and the loaded dso's. This data is never |
| 1029 | freed. It will be needed again if libdl is used, so unconditionally |
| 1030 | freeing it is not possible, but normal programs do not use libdl. Of |
| 1031 | course with glibc all programs use libdl (due to nsswitch) so the |
| 1032 | issue was never addressed.</p> |
| 1033 | |
| 1034 | <p>ELF also has the issue that segments are not page-aligned on disk. |
| 1035 | This saves up to 4k on disk, but at the expense of using an additional |
| 1036 | dirty page in most cases, due to a large portion of the first data |
| 1037 | page being filled with a duplicate copy of the last text page.</p> |
| 1038 | |
| 1039 | <p>The above is just a partial list of the tiny memory penalties of ELF |
| 1040 | dynamic linking, which eventually add up to quite a bit. The smallest |
| 1041 | I've been able to get a process down to is 8 dirty pages, and the |
| 1042 | above factors seem to mostly account for it (but some were difficult |
| 1043 | to measure).</p> |
| 1044 | </blockquote> |
| 1045 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 1046 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1047 | <h2><a name="tips_kernel_headers"></a>Including kernel headers</h2> |
| 1048 | |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 1049 | <p>The "linux" or "asm" directories of /usr/include |
| 1050 | contain Linux kernel |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1051 | headers, so that the C library can talk directly to the Linux kernel. In |
| 1052 | a perfect world, applications shouldn't include these headers directly, but |
| 1053 | we don't live in a perfect world.</p> |
| 1054 | |
| 1055 | <p>For example, Busybox's losetup code wants linux/loop.c because nothing else |
| 1056 | #defines the structures to call the kernel's loopback device setup ioctls. |
| 1057 | Attempts to cut and paste the information into a local busybox header file |
| 1058 | proved incredibly painful, because portions of the loop_info structure vary by |
| 1059 | architecture, namely the type __kernel_dev_t has different sizes on alpha, |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 1060 | arm, x86, and so on. Meaning we either #include <linux/posix_types.h> or |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1061 | we hardwire #ifdefs to check what platform we're building on and define this |
| 1062 | type appropriately for every single hardware architecture supported by |
| 1063 | Linux, which is simply unworkable.</p> |
| 1064 | |
| 1065 | <p>This is aside from the fact that the relevant type defined in |
| 1066 | posix_types.h was renamed to __kernel_old_dev_t during the 2.5 series, so |
| 1067 | to cut and paste the structure into our header we have to #include |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 1068 | <linux/version.h> to figure out which name to use. (What we actually |
| 1069 | do is |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1070 | check if we're building on 2.6, and if so just use the new 64 bit structure |
| 1071 | instead to avoid the rename entirely.) But we still need the version |
| 1072 | check, since 2.4 didn't have the 64 bit structure.</p> |
| 1073 | |
| 1074 | <p>The BusyBox developers spent <u>two years</u> trying to figure |
| 1075 | out a clean way to do all this. There isn't one. The losetup in the |
| 1076 | util-linux package from kernel.org isn't doing it cleanly either, they just |
| 1077 | hide the ugliness by nesting #include files. Their mount/loop.h |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 1078 | #includes "my_dev_t.h", which #includes <linux/posix_types.h> |
| 1079 | and <linux/version.h> just like we do. There simply is no alternative. |
| 1080 | </p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1081 | |
| 1082 | <p>Just because directly #including kernel headers is sometimes |
| 1083 | unavoidable doesn't me we should include them when there's a better |
| 1084 | way to do it. However, block copying information out of the kernel headers |
| 1085 | is not a better way.</p> |
| 1086 | |
Denis Vlasenko | 153cd69 | 2007-07-13 15:26:53 +0000 | [diff] [blame] | 1087 | <hr /> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1088 | <h2><a name="who">Who are the BusyBox developers?</a></h2> |
| 1089 | |
| 1090 | <p>The following login accounts currently exist on busybox.net. (I.E. these |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 1091 | people can commit <a href="http://busybox.net/downloads/patches/">patches</a> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1092 | into subversion for the BusyBox, uClibc, and buildroot projects.)</p> |
| 1093 | |
| 1094 | <pre> |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 1095 | aldot :Bernhard Reutner-Fischer |
Denis Vlasenko | abfc4cf | 2006-11-18 16:30:04 +0000 | [diff] [blame] | 1096 | andersen :Erik Andersen - uClibc and BuildRoot maintainer. |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1097 | bug1 :Glenn McGrath |
| 1098 | davidm :David McCullough |
Denis Vlasenko | abfc4cf | 2006-11-18 16:30:04 +0000 | [diff] [blame] | 1099 | gkajmowi :Garrett Kajmowicz - uClibc++ maintainer |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1100 | jbglaw :Jan-Benedict Glaw |
| 1101 | jocke :Joakim Tjernlund |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 1102 | landley :Rob Landley |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1103 | lethal :Paul Mundt |
| 1104 | mjn3 :Manuel Novoa III |
| 1105 | osuadmin :osuadmin |
| 1106 | pgf :Paul Fox |
| 1107 | pkj :Peter Kjellerstedt |
| 1108 | prpplague :David Anders |
| 1109 | psm :Peter S. Mazinger |
| 1110 | russ :Russ Dill |
| 1111 | sandman :Robert Griebl |
| 1112 | sjhill :Steven J. Hill |
| 1113 | solar :Ned Ludd |
| 1114 | timr :Tim Riker |
| 1115 | tobiasa :Tobias Anderberg |
| 1116 | vapier :Mike Frysinger |
Bernhard Reutner-Fischer | 5f52150 | 2008-08-21 11:52:12 +0000 | [diff] [blame] | 1117 | vda :Denys Vlasenko - BusyBox maintainer |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1118 | </pre> |
| 1119 | |
| 1120 | <p>The following accounts used to exist on busybox.net, but don't anymore so |
Bernhard Reutner-Fischer | b5d701d | 2008-08-21 12:52:45 +0000 | [diff] [blame] | 1121 | I can't ask /etc/passwd for their names. Rob Wentworth |
| 1122 | <robwen at gmail.com> asked Google and recovered the names:</p> |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1123 | |
| 1124 | <pre> |
Denis Vlasenko | abfc4cf | 2006-11-18 16:30:04 +0000 | [diff] [blame] | 1125 | aaronl :Aaron Lehmann |
| 1126 | beppu :John Beppu |
| 1127 | dwhedon :David Whedon |
| 1128 | erik :Erik Andersen |
Denis Vlasenko | f7996f3 | 2007-01-11 17:20:00 +0000 | [diff] [blame] | 1129 | gfeldman :Gennady Feldman |
Denis Vlasenko | abfc4cf | 2006-11-18 16:30:04 +0000 | [diff] [blame] | 1130 | jimg :Jim Gleason |
| 1131 | kraai :Matt Kraai |
| 1132 | markw :Mark Whitley |
| 1133 | miles :Miles Bader |
| 1134 | proski :Pavel Roskin |
| 1135 | rjune :Richard June |
| 1136 | tausq :Randolph Chung |
| 1137 | vodz :Vladimir N. Oleynik |
Rob Landley | b73d2bf | 2006-05-11 15:00:32 +0000 | [diff] [blame] | 1138 | </pre> |
| 1139 | |
| 1140 | |
Eric Andersen | 6c4a6b1 | 2004-10-08 10:50:08 +0000 | [diff] [blame] | 1141 | <br> |
| 1142 | <br> |
| 1143 | <br> |
| 1144 | |
| 1145 | <!--#include file="footer.html" --> |