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