Mercurial > hg > aboriginal
annotate www/history.html @ 977:8d6fe8ad822d
Comment tweak.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 06 Feb 2010 17:57:15 -0600 |
parents | 0da87d1ef528 |
children | 333c8f799302 |
rev | line source |
---|---|
867
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
1 <title>History of Firmware Linux</title> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
2 |
881
0da87d1ef528
Update the web page. Put the left-side nav bar back, move about page to "about.html" and make news.html the default index. Add architectures page. Note that IRC discussion is now on #edev.
Rob Landley <rob@landley.net>
parents:
867
diff
changeset
|
3 <!--#include file="header.html" --> |
0da87d1ef528
Update the web page. Put the left-side nav bar back, move about page to "about.html" and make news.html the default index. Add architectures page. Note that IRC discussion is now on #edev.
Rob Landley <rob@landley.net>
parents:
867
diff
changeset
|
4 |
867
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
5 <h1>Where did "Firmware Linux" come from? Our story so far...</h1> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
6 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
7 <p>My name is Rob Landley, and I've been working on Firmware Linux on and off |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
8 since the late 90's. It's what got me into BusyBox and uClibc, embedded |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
9 development, compiler internals, and so on. Now it's where I put together |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
10 everything else I'm doing (like toybox, tinycc, and the relocatable gcc |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
11 wrapper) to see what actually works and give it a good stress-test. "Eating |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
12 your own dogfood", and all that.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
13 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
14 <p>The following may not be interesting to anybody but me. (It's as much |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
15 autobiography as technical history of the project.) But just for |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
16 the record:</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
17 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
18 <h2>Prehistory</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
19 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
20 <p>Back in the late 90's, before linksys routers came out, I installed several |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
21 masquerading gateways by putting Red Hat on old leftover 386 machines. This |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
22 involved removing as many packages as possible from the bas install, both to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
23 get the size down (to fit it on old hard drives) and to reduce the security |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
24 exposure of all the daemons Red Hat ran by default (including a print |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
25 server and an NFS server exposed to the world, for no readily apparent |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
26 reason).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
27 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
28 <p>Back around Red Hat 6, the smallest base install was still hundreds of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
29 megabytes, and needed dozens of packages removed to get a reasonably stripped |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
30 down system. (You couldn't choose _not_ to install things like ghostscript, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
31 or printer support, only remove them after the fact.) Package dependencies |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
32 often forced me to delete stuff by hand: some packages' uninstall scripts |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
33 outright failed, others had circular dependencies in long chains through |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
34 dozens of packages, and there was no distinction between "this package |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
35 provides optional functionality" and "it won't run without this", a dependency |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
36 was a dependency as far as RPM was concerned.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
37 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
38 <p>Stripping down Linux installs was a time-consuming process that still left |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
39 behind mountains of junk doing who knows what, which I didn't understand well |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
40 enough to safely remove.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
41 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
42 <p>Stripping down a full distribution seemed like the long way around to get a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
43 minimal system. What I wanted was to build _up_ from an empty hard drive, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
44 adding only what I needed. I knew how to build packages from source to add |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
45 them to a working system, but not how to _get_ a working system in the first |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
46 place. When I went to the the third Atlanta Linux Showcase (in 1999), I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
47 pestered everyone I met to tell me how to build a complete Linux system from |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
48 source code. Lots of people thought it was a great idea, but nobody could |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
49 point me to the appropriate HOWTO. A few months later, one of the people I'd |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
50 asked emailed me about the launch of the Linux From Scratch project, and from |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
51 that I finally learned what I needed to know.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
52 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
53 <p>The LFS book linked to the <a href=http://tldp.org/HOWTO/Bootdisk-HOWTO/index.html>Linux Bootdisk HOWTO</a>, and for a while I got no further than that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
54 immensely educational resource. It explained exactly what you needed to copy |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
55 from an existing root filesystem in order to run an arbitrary app from a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
56 bootable floppy. It explained the directory layout, which configuration files |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
57 were actually necessary and what they did, the early boot process, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
58 introduced me to the ldd command with which I could track down the shared |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
59 libraries a given executable needed.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
60 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
61 <p>Around this time I also encountered |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
62 <a href=http://www.toms.net/rb/>tomsrtbt</a>, which used the old "format a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
63 1.44 megabyte floppy to to 1.7 megabytes" trick to fit an enormous amount |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
64 of Linux system onto a single bootable floppy disk. (This was also my |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
65 introduction to the BusyBox project, and later to the programming language |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
66 LUA.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
67 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
68 <p>The above approach of cherry-picking your own boot environment using |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
69 prebuilt binaries didn't scale very well, and didn't let me mix and match |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
70 components (such as substituting busybox for Red Hat's command line |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
71 utilities), so when Linux From Scratch's 3.0 release came out I cleared |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
72 a month to sit down and properly work through it, understanding what each |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
73 step was doing. I turned their instructions into a bash script as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
74 part of the learning process, because I kept screwing up steps and having to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
75 start over, only to typo an earlier step as I repeated it by hand and have to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
76 start over _again_. I joined the Automated Linux From Scratch mailing list in |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
77 hopes I could find (or help create) an official script to use, but they were |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
78 all talk and no code. (Everybody had their own automation script, but the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
79 project wanted to create something big like Gentoo and seemed to think that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
80 publishing a simple script implementing the existing Linux From Scratch |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
81 instructions was beneath them. So everybody had their own script, none of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
82 which were "official".)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
83 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
84 <p>My own script quickly evolved to remove packages like gettext and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
85 tcl/expect, things the masquerading servers I'd been assembling didn't actually |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
86 need. I poked at adding X11 (something I'd installed myself by hand back under |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
87 OS/2) and pondered running the system on my laptop someday, but the hundreds of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
88 packages I'd need to build and the constant maintenance of keeping it up to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
89 date kept that idea way down on my to-do list.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
90 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
91 <h1>FWL v0: The WebOffice version</h1> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
92 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
93 <p>Towards the end of 2000 I met the founders of a local start-up through |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
94 the Austin Linux Users Group (two Taiwanese guys named Lan and Lon), and at |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
95 the end of the year joined their start-up company "WebOffice" as employee #4. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
96 The two founders were ex-AMD hardware guys who didn't really program, who had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
97 already hired a recently retired professional tennis player to do marketing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
98 for them. They had a prototype firewall product they'd demonstrated to get |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
99 venture capital funding: a small yellow box running stock Red Hat 7. (When |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
100 they first demonstrated it to me, I diagnosed and removed the "code red" virus |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
101 from it.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
102 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
103 <p>The money wasn't great, but the project was interesting, challenging, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
104 and full of learning opportunities. Full-time Linux positions were still |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
105 somewhat rare back then, and to make up for the low salary (and the fact |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
106 they weren't offering stock options; yes I asked, they were saving it |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
107 for themselves and the VCs), I was promised that I could GPL most of the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
108 code I was working on as soon as it shipped. Back in 2000, that sounded |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
109 like a pretty good deal.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
110 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
111 <p>For a the first few months I was their only programmer, doing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
112 everything from architecture to implementation (OS, applications, web |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
113 interface, the works). I became lead developer and architect when they got a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
114 second round of VC funding they hired more developers.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
115 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
116 <p>Alas, mostly bad ones. The founders didn't know enough about |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
117 programming to choose wisely, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
118 and I wasn't consulted on most hiring decisions because I wasn't "management". |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
119 Only one actual IDIOT in the bunch, thank goodness, but they made me share |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
120 an office with him. He was another Taiwanese guy (this one named "Luan") |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
121 who the founders felt sorry for because his previous dot-com had gone under |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
122 and he'd be deported if he didn't stay employed to maintain his H1B visa. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
123 (Yes, they admitted this to me when I complained about him.) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
124 Unfortunately, not only did he not know anything of use to the company, but |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
125 he never showed any ability to learn, and after the third time "show me how |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
126 to do this" turned into him handing in my example code verbatim as his work, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
127 our working relationship deteriorated somewhat. He literally could not work |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
128 out how to write a "hello world" program by himself, and when I spent |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
129 an hour explaining things to him rather than writing example code he could |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
130 turn in he got frustrated and accused me of being obstructionist because I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
131 wouldn't do his job for him. (Of course he had an MCSE.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
132 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
133 <p>And thus began my habit of taking my laptop to places other than |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
134 my office, so I could get work done without interruption...</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
135 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
136 <p>There are reasons this company didn't survive to the present day.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
137 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
138 <h2>Yellowbox technobabble.</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
139 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
140 <p>WebOffice's proposed product was an early multi-function embedded Linux |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
141 device. It was a masquerading fireball which provided dhcp and DNS for its |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
142 private subnet. It also provided a VPN bridging multiple such subnets |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
143 (possibly from behind other existing firewalls, by bouncing connections off a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
144 public "star server"; an idea the founders of WebOffice tried to patent over |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
145 my objections). It also provided network attached storage (samba) with a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
146 web-based user account management GUI. It |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
147 also provided scheduled actions, such as automated backup. It also acted |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
148 as a video server. And it did a dozen other things I don't even remember. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
149 (Their marketing material called the project the "iLand gateway 2000". I had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
150 no say in this.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
151 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
152 <p>I called it "yellowbox" (because it was), and described it as a "swiss army |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
153 server". The hardware was a standard PC motherboard and an 8 port ethernet |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
154 switch in a small custom-designed bright yellow metal case with pretty decals |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
155 on it. Inside was a 266mhz celeron, 128 megs |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
156 of ram, a 2 gig hard drive, two network cards, and the aforementioned 8 port |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
157 100baseT ethernet switch removed from its case and screwed into a metal frame. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
158 The back of the box exposed a lot of ethernet ports (one "uplink" port and 8 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
159 switch ports, although only 7 of the switch's ports worked because the eighth |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
160 was soldered to the second internal ethernet card; they labeled it "service" |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
161 or some such because if the hole in the back of the case didn't let them |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
162 expose it to the outside world it wouldn't fit right). The only other port |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
163 was a place to plug in the power cable. The front had many blinky lights |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
164 (one of which was a blue LED, which they were very proud of and considered a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
165 big selling point).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
166 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
167 <p>Most importantly, the motherboard's video/keyboard/mouse ports weren't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
168 exposed to the outside world: it was supposed to run as a headless box |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
169 administered through the network via a web server with clever CGI. We could |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
170 plug a keyboard and monitor into it during development, but only by taking |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
171 the case off. Out in the field, it had to "just work", and would be a useless |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
172 brick if it didn't boot all the way into the OS and run our applications.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
173 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
174 <p>This was my first exposure to embedded development. The hardware was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
175 standard PC/x86, it wasn't too badly underpowered for what it did (at least |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
176 by the standards of the day), and it used wall current instead of battery |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
177 power... But it was a headless self-administering box meant to function as an |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
178 appliance to end users, which was new to me. It was also a challenge to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
179 strip down the whole OS into a small enough package that they could download |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
180 entire new OS images using the internet speeds of 2001, and then update |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
181 the new OS image without losing data or turning it into a brick.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
182 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
183 <p>WebOffice's original prototype device ran a stock Red Hat 7 intall (the one |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
184 that had the Code Red virus when they first demoed it to me after a LUG |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
185 meeting). The whole OS image took up almost a gigabyte, and that's before |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
186 they'd implemented any applications or web UI. I rebased the system on Linux |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
187 From Scratch, using my LFS 3.0 script to build the base OS and creating a new |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
188 script to build the additional packages (apache, postscript, ssh, and so on) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
189 the project used. I got the OS down under 100 megs (but not by much, it still |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
190 used glibc and gnu coreutils and so on). I then spent the next year and a half |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
191 learning how to properly strip down and secure an embedded system. I brushed |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
192 against both busybox and uClibc during this period, but couldn't get either one |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
193 to work in our project at the time. We needed more functionality than either |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
194 provided back then.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
195 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
196 <p>I implemented all the web CGI stuff in Python; a part-time web |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
197 designer would come in once a week to mock up pages using Dreamweaver, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
198 I'd take the result and make my Python code spit heavily cleaned up versions, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
199 plus actual content and minus most of the &nbsp; and similar lunacy. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
200 Getting the stylesheets to work was interesting. (Working around the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
201 way Internet Explorer treated the end-form tag as a break tag and inserted |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
202 extra vertical whitespace that didn't show up in Netscape or Konqueror |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
203 was also fun, although it _didn't_ do this if your start form tag and end |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
204 form tags were at different table levels. Yes, to make it display right |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
205 I had to make tags cross, so IE didn't think it understood the data and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
206 thus get confused and do the wrong thing. I'm not proud of this, but it |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
207 was IE.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
208 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
209 <p>I learned how to configure and administer (and automate the administration |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
210 of) apache, samba, postfix, ssh, bind, dhcpd... I created |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
211 <a href=http://dvpn.sf.net>a scalable vpn</a> (which freeswan _wasn't_, nor |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
212 was the out-of-tree patch of the day remotely reliable) by combining iptables |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
213 port forwarding with ssh and a wrapper daemon. (Again the founders |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
214 tried to patent this; I objected strenuously that it was A) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
215 obvious, B) they'd said I could GPL it when it shipped. This went on for a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
216 while).</p> |
70 | 217 |
867
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
218 <p>I also made an automated production process for WebOffice: my scripts built |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
219 a CD-rom image which, when booted (with the case off there was a spare IDE |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
220 port you could hook a cd-rom drive to), would partition and format /dev/hda |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
221 and install the final OS image on it, eject the CD, play "charge" through the PC |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
222 speaker, and power down the machine. (If something went wrong, it played |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
223 "taps" instead.) Yes, these CDs were dangerous things to leave lying around, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
224 and I made sure to label 'em as such.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
225 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
226 <p>WebOffice wanted to be able to remotely upgrade the firmware, which meant |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
227 sending a new OS image as a single file. The install had to be fairly atomic, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
228 if something went wrong during the upgrade (including a power failure, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
229 including the user switching it off because it was taking too long) the thing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
230 could easily become a brick. Obviously a traditional "extract tarball into |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
231 partition" approach was unacceptable, even before "fsck" issues came up. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
232 (The only journaling filesystem in the stock kernel at the time was reiserfs, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
233 and that was way too fiddly and overcomplicated for me to trust my data to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
234 it. I moved the data partition to ext3 when that got merged, but wanted to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
235 make the base OS partition read-only for security reasons.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
236 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
237 <p>I wound up creating a gpg-signed tarball with several files, one of which |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
238 was the new kernel to boot, one of which was the initrd (remember: this was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
239 back before initramfs), and one of which was a filesystem image to read-only |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
240 loopback mount as the new root filesystem. (For security reasons I wanted |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
241 root mounted read only, which also suggested a compressed filesystem to save |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
242 space. Squashfs didn't exist yet and the ext2 compression patches had already |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
243 bit-rotted, so I used zisofs.) The tarball also contained a file with a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
244 version string, and a file with an sha1sum of the concatenation of the other |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
245 four files.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
246 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
247 <p>Extracting a firmware tarball wrote these files into a new subdirectory |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
248 (The tar invocation extracted those specific names, so an attacker couldn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
249 write to arbitrary locations in the filesystem with a carefully crafted tarball; |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
250 yes I was paranoid while learning about security), and made use of the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
251 "lilo -R" option to switch to the new firmware. That sets the LILO command |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
252 line for the next boot only, so we left the default pointing to the old |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
253 firmware but told LILO that on the next boot it should use the new firmware. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
254 If the new firmware came up and its self-diagnostic checked out, it would |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
255 change the LILO default. If it didn't work, power cycle the box and the old |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
256 firmware would come up. (This greatly reduced the chances of turning the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
257 headless box into a brick, and you couldn't do that with grub.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
258 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
259 <p>At a technical level, there was a chicken and egg problem here: the root |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
260 filesystem was a loopback mount, but the file to loopback mount has to live |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
261 somewhere. So the system needed a writeable parition for logging and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
262 such anyway, so I made /dev/hda1 be ext3 and mounted it on /var, and put the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
263 firmware in that. So during the boot process the initrd needed to mount |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
264 /dev/hda1 onto a /temp directory, loopback mount the /temp/image file onto a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
265 /sub directory, and before doing the pivot_root into /sub it needed to move |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
266 the /temp mount into /sub/var. This turned out to be nontrivial.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
267 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
268 <p>Back under the 2.2 kernel you couldn't mount a partition in two places at |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
269 once, so mounting the same /dev/hda1 on both /tmp and /sub/var wasn't an |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
270 option. I had to use early (and buggy) 2.4 kernels to have any chance to make |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
271 this work (and also to make the VPN work, which required the undocumented |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
272 SO_ORIGINAL_DST getsockopt() existing in 2.4 but not 2.2).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
273 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
274 <p>The early 2.4 kernels sucked mightily. The memory management problems that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
275 resulted in the rik->andrea switch in 2.4.10 hit the yellowbox project kind of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
276 hard. I once drove the 2.4.7 kernel into a swap thrashing state, went to lunch |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
277 (instead of rebooting, just to see if it would recover), and it was still swap |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
278 thrashing and mostly paralyzed when I came back over an hour later. The disk |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
279 cache (especially the dentry cache) could get unbalanced until it grew to evict |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
280 all the anonymous pages and froze the system hard. (A big rsync would do that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
281 fairly reliably. Trying to avoid this I studied the md4 algorithm and the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
282 rsync description file and spent a week writing most of my own rsync |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
283 implementation in python, but A) it maxed out at about 300k/second on the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
284 processor we were using, B) it also caused the hang because it was really |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
285 a kernel issue and not an application issue.) It was frustrating, but |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
286 we persevered.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
287 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
288 <p>Mounting a partition twice and leaking one of the mount points (the old |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
289 /temp was inaccessable after the pivot_root) was kind of unclean anyway, the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
290 clean thing for the boot to do was actually move the /tmp mount to /sub/var |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
291 after mounting /sub but before the pivot_root into /sub. But when I asked |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
292 on linux-kernel how to do that, I was told that "mount --move" didn't exist |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
293 yet. A couple releases later Al Viro added it, and I was one of the first |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
294 happy users.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
295 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
296 <p>I also wanted to put the kernel, initrd, and loopback mountable root |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
297 filesystem image together into a single file, so we didn't have to extract a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
298 tarball during a firmware upgrade but could actually _boot_ into the actual |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
299 file we'd downloaded, after verifying its signature. (This avoided the problem |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
300 of successfully downloading the tarball but not having enough space left to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
301 extract it. Since zisofs, zImage, and initrd were already gzipped, compressing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
302 the firmware image for transport wasn't a priority. Keep in mind: headless box, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
303 self-administering. Even little things like this could turn into a big |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
304 problem in the field if you didn't handle them.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
305 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
306 <p>You could already use "losetup -o" to loopback mount a file at an |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
307 offset, and I made a "length" patch to LILO that let its config file tell it |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
308 to boot only the _start_ of the kernel file you fed it. But dealing with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
309 the initrd in between was a pain, which is why I eventually became an early |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
310 avid follower of initramfs, and wound up writing documentation for it when I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
311 couldn't find any and had to answer so many questions myself.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
312 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
313 <h2>The end at WebOffice</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
314 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
315 <p>The original promise that I could GPL the code I was working on (everything |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
316 except the python CGI) once it shipped never came true. Partly the founders |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
317 were ambivalent about this whole "open source" thing, wanting every competitive |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
318 advantage they could get. (They kept trying to patent obvious things I did. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
319 Their patent lawyer was a realy cool dude when he flew in from California.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
320 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
321 <p>Another contributing factor was that the founders were from Taiwan and had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
322 no idea how to address the US market. Their marketer employee #3 hadn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
323 stayed very long (not much endorsement value for a tennis player trying |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
324 to sell servers), and they themselves only ever tried to sell the device |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
325 overseas (which made demonstrating the thing somewhat difficult, and this also |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
326 meant they were shipping a VPN with cryptographic checks on firmware upgrades |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
327 to places like Turkey, back in the days of cryptographic export |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
328 regulations).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
329 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
330 <p>But the biggest problem was unending feature creep: every time the founders |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
331 saw or heard of a product that did something, we had to do that too. I had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
332 a shippable product ready a few months after I started, but they wouldn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
333 ship it. I designed the firmware upgrade mechanism so we could ship what we |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
334 had and add more later, but they felt that doing so would take focus away |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
335 from developing more features. (For about a while there they were trying to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
336 turn it into a video server. I made a python CGI |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
337 script for apache to cache large files, by downloading them from an upstream |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
338 server and sending them out as they came in as if it had been a local file all |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
339 along, while simultaneously writing them to the hard drive for other users. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
340 Of course, they tried to patent this too...)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
341 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
342 <p>The tendency towards feature creep left them vulnerable to their venture |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
343 capitalist changing their business model. Another of the VC's start-ups was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
344 paying lots of money to license the RealVideo streaming server, so the VC |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
345 convinced WebOffice to waste six months trying to reverse engineer it. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
346 (After all, our idea of offering mp4 files though Samba or Apache made us a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
347 video server, right? This was just another kind of video server...) I wasn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
348 interested in this direction and left Austin for a while to spend time with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
349 my mother (who was suffering from cancer and New Jersey) while they got this |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
350 out of their system. They hired over a half-dozen programmers to replace me |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
351 during this period, but progress on the yellow box ground to a halt anyway |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
352 (and even went backwards a bit with numerous regressions) until I came back. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
353 The quality of the new hires varied ("erratic", "mediocre", and "suck" were |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
354 all represented).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
355 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
356 <p>WebOffice ballooned to a dozen employees (over half of whom reported to me |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
357 when I came back, although I still had little say in hire/fire decisions). |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
358 The company bought itself back from the first VC by mortgaging itself to a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
359 second VC, and refocused on the original do-everything "swiss army server" |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
360 idea. But they still wouldn't just ship what they had as long as there were |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
361 more features we could add, and ultimately they burned through their venture |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
362 capital without ever sending more than a few prototypes to actual |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
363 customers.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
364 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
365 <p>WebOffice ran out of money in 2002, and instituted a round of layoffs. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
366 I continued on half-time (at half-pay) for several more months, hoping that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
367 necessity would make them focus on shipping units and bringing in revenue, but |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
368 it didn't happen. I left in November and spent the last couple months of that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
369 year in Florida watching my mother die of cancer, then driving around the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
370 country distributing her posessions to various relatives, and finally crashing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
371 on Eric Raymond's couch for a few months doing an "editing pass" on The Art of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
372 Unix Programming that expanded the book from 9 chapters to 20.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
373 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
374 <h1>FWL v1: Relaunch based on BusyBox and uClibc, and why it's called |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
375 Firmware Linux</h1> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
376 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
377 <p>When I returned to Austin in August 2003, I bought a condo near the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
378 University of Texas (and near Metro, my favorite 24 hour coffee shop with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
379 wireless internet access), enrolled in grad school, and <a href=http://landley.livejournal.com/766.html>got back into poking at Linux From Scratch</a>.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
380 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
381 <p>Linux From Scratch had reorganized itself. My old weboffice scripts had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
382 been based on LFS 3, which involved building enough of a system to chroot |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
383 into and complete the build under that. The potential downside was that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
384 bits of the host system could leak into the final target system, such as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
385 copied headers or tools build by the host's compiler.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
386 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
387 <p>In 2002 LFS 4 introduced an intermediate set of statically linked tools |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
388 in a "static" directory, which were deleted after the intermediate system |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
389 was built. In November 2003 LFS 5 renamed this temporary directory to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
390 "tools". This new approach added the temporary directory to the end of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
391 the $PATH during the chroot, rebuilt itself using the temporary system, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
392 and then discarded the entire directory to eliminate leaks of host files. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
393 This was a big enough change that it was less work to start over |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
394 from scratch than try to adapt my existing scripts.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
395 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
396 <p>Starting over also seemed like a good idea because I was unsure of the IP |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
397 status of my old scripts. Although I'd been promised repeatedly I could GPL |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
398 everything but the python CGI when the yellowbox shipped, actual shipping had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
399 never quite happened, and I didn't have that promise in writing. (I don't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
400 remember if I lost it or if I'd been without a contract all along. You could |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
401 make an argument I owned all the code I'd done outright in the second case, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
402 certainly that's what the copyright notices on the individual files said, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
403 I'd been working on early versions of those scripts before I brought them to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
404 weboffice in the first place and had never signed over those preexisting |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
405 copyrights. But I just didn't want to go there.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
406 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
407 <h2>New Goals</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
408 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
409 <p>I also wanted to take the project in new directions, further into the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
410 embedded space. WebOffice had focused on adding more and more features to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
411 a bigger and bigger image, while I personally had focused on trimming it |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
412 down and streamlining it (for example replacing the Postgresql database with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
413 a few flat text files to store configuration and user information, thus |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
414 replacing 200 megabytes of disk usage with about 90k and speeding up the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
415 relevant code considerably).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
416 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
417 <p>For the new project I had two main goals: make the bootable single file |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
418 idea work, and make the result much smaller and simpler. (I also wanted to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
419 clean up the build so it didn't require root access, package and document |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
420 it all so anyone could use it, other similar tidying steps.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
421 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
422 <p>The firmware tarball I'd implemented for WebOffice had always been a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
423 stopgap, something they could ship with quickly while I got a better solution |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
424 ready. What I really wanted was a single bootable file containing kernel, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
425 initial ram disk, and root filesystem all in one. (Putting an entire |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
426 large root filesystem into a ramdisk consumed too much memory, the root |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
427 filesystem needed a backing store it could page files in from.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
428 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
429 <p>The name Firmware Linux came from the goal of packaging an entire OS image |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
430 in a single bootable file, which could run directly and be used to atomically |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
431 upgrade embedded systems.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
432 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
433 <p>My other goal for Firmware Linux started with the desire to replace as much |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
434 of the gnu tools as possible with something smaller and simpler. The old |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
435 yellowbox images from WebOffice had weighed in at almost 100 megabytes, most |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
436 of which was glibc, coreutils, diffutils, and so on. This was clearly |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
437 crazy, my first hard drive back in 1990 was only 120 megabytes, and back under |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
438 DOS that was enormous (and a huge step up from my friend Chip's system with a 32 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
439 megabyte hard drive, which I learned to program C on). When I looked at the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
440 gnu implementation of the "cat" command and found out its source file was 833 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
441 lines of C code (just to implement _cat_), I decided the FSF sucked at this |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
442 whole "software" thing. (Ok, I discovered that reading the gcc source |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
443 at Rutgers back in 1993, but at the time I thought only GCC was a horrible |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
444 bloated mass of conflicting #ifdefs, not everything the FSF had ever touched. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
445 Back then I didn't know that the "Cathedral" in the original Cathedral and the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
446 Bazaar paper was specifically referring to the GNU project.)</p> |
70 | 447 |
867
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
448 <p>Searching for alternatives, I went back to take a closer look at busybox and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
449 uClibc. I was familiar with both from Tom's Root Boot (tomsrtbt), a popular |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
450 single floppy Linux system that packed an amazing amount of functionality into |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
451 a single specially formatted (1.7 megabyte) 3.5" floppy disk. I'd been using |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
452 tomsrtbt for years, I just hadn't tried to build anything like it myself. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
453 Compared to the tens of megabytes of gnu bloat the LFS project produced, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
454 busybox and uClibc seemed worth a look.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
455 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
456 <p><a href=http://uclibc.org/lists/uclibc/2002-September/004380.html>This |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
457 old message</a> was my first attempt at sniffing around at uClibc. I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
458 didn't get time to seriously play with it (or BusyBox) until much later.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
459 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
460 <p>It also occurred to me that if the newly introduced /tools directory was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
461 enough to build the final system, then all I needed for the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
462 system to be self-hosting was enough extra packages to rebuild /tools. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
463 If the prehistory stage had been about starting from a full distro and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
464 cutting it down, and the WebOffice version had been about starting from |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
465 ground zero and piling up lots of functionality into a 100 megabyte tarball, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
466 this new stage was about starting from an empty directory and adding as little |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
467 as possible to do what I wanted while staying small and simple.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
468 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
469 <p>So the real questions were:</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
470 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
471 <ul> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
472 <li><p>How small could I get /tools and still build the rest of LFS under it?</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
473 <li><p>What was the minimum functionality /tools needed in order to rebuild |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
474 itself from source _without_ first building a larger system?</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
475 </ul> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
476 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
477 <h2>Implementation</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
478 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
479 <p>I started by writing new scripts based on Linux From Scratch 4 (quickly |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
480 switching to LFS 5) to build a stock LFS system. I wrote a script to build |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
481 /tools, and another script run under a chroot to build a final LFS system |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
482 within tools. The second script acted as a test that the /tools created by |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
483 the first script was good enough. And once I had a known working system, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
484 I started doing a number of different things to it.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
485 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
486 <h2>Stripping down LFS 5.0</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
487 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
488 <p>The full list of Linux From Scratch 5.0 packages were: autoconf, automake, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
489 bash, binutils, bison, bzip2, coreutils, dejagnu, diffutils, e2fsprogs, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
490 ed, expect, file, findutils, flex, gawk, several fragments of gcc, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
491 gettext, glibc, grep, groff, grub, gzip, inetutils, kbd, less, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
492 libtool, the linux kernel, m4, make, MAKEDEV, man, man-pages, modutils, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
493 ncurses, net-tools, patch, perl, procinfo, procps, psmisc, sed, shadow, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
494 sysklogd, sysvinit, tar, tcl, texinfo, util-linux, vim, and zlib. There |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
495 were also two LFS-specific packages, providing boot scripts, config |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
496 files, and miscelaneous utilities.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
497 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
498 <p>I started by removing packages I didn't actually need. Tcl, expect, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
499 dejagnu hadn't been in LFS 4, so obviously it was possible to do without them. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
500 (I was already starting to view newer versions of Linux From Scratch as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
501 "bloated" compared to old versions. I could always build and run test |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
502 suites later, and rebuilding the system under itself to produce a working |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
503 result was already a fairly extensive test.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
504 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
505 <p>I could also eliminate ed (which patch can use for obsolete patch |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
506 formats, but who cares?), gettext (only needed for internationalization, which |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
507 is best done at the X11 level and not at the command line), libtool (which is |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
508 a NOP on ELF Linux systems and always has been, blame the FSF for trying to get |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
509 us to use it at all), and man (and man-pages, groff, and texinfo, which are |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
510 used to build/display documentation).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
511 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
512 <p>A bunch of development tools (autoconf, automake, binutils, bison, flex, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
513 gcc, make, and m4) wouldn't be needed on a stripped down system (such as a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
514 router) that never needed to compile anything. (Perl might be in this group as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
515 well, since it was only included because glibc needed it to build. The linux |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
516 kernel and glibc both supplied files used by the compiler, such as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
517 the headers in /usr/include, so this group depended on them even if they |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
518 had other more direct uses.) Similarly, the e2fsprogs package was used to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
519 create a filesystem, but mkisofs and such could substitute for it.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
520 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
521 <p>The kernel and grub were basic infrastructure, not really part of the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
522 root filesystem and easy to build separately. (I was still using my modified |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
523 LILO anyway.) The C library (glibc) was the next layer past that, every |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
524 userspace program had to link against it either statically or dynamically. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
525 The boot scripts, MAKEDEV, sysvinit, and modutils were all similarly low-level |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
526 infrastructure pieces to boot the system or talk to hardware. The shadow |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
527 package provided login and /etc/passwd support. The ncurses and zlib packages |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
528 were shared libraries I understood, but were both largely optional |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
529 (and gzip/zlib seemed somehow redundant). Bash was a command shell, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
530 bzip2 and gzip were compression programs, tar an archiver, vim a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
531 text editor, and sysklogd a logging daemon that wrote stuff to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
532 /var/messages.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
533 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
534 <p>That left coreutils, diffutils, file, findutils, gawk, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
535 grep, inetutils, kbd, less, net-tools, patch, procinfo, procps, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
536 psmisc, sed, and util-linux as "other stuff in the $PATH" which were only |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
537 really needed if some application (such as a package build) used them. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
538 After enough study, I felt comfortable I understood what they all did.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
539 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
540 <p>That's what chapter 6, which built the final Linux From Scratch system, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
541 contained. Chapter 5 had a much shorter list: binutils, gcc, linux (used just |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
542 for headers), glibc, tcl, expect, dejagnu, gawk, coreutils, bzip2, gzip, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
543 diffutils, findutils, make, grep, sed, gettext, ncurses, patch, tar, texinfo, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
544 bash, util-linux, and perl. And chapter 5 _had_ to contain enough to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
545 build chapter 6, and thus rebuild the entire system from source.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
546 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
547 <p>Again, tcl, expect, dejagnu, gettext, and texinfo could be discarded. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
548 (Most of those weren't even present in the earlier versions of Linux From |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
549 Scratch I'd used, they had to be optional.) That left just 19 packages. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
550 The compiler toolchain was just binutils, gcc, make, glibc, and the Linux |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
551 headers (all that autoconf, automake, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
552 lex, and bison stuff was obviously optional and could be added later from |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
553 within a working system). Perl was only used to build glibc, if that was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
554 replaced or fixed then the need for perl (at least at this stage) could go |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
555 away. Busybox claimed to provide replacements for gawk, coreutils, bzip2, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
556 gzip, findutils, grep, sed, tar, bash, and util-linux. Since busybox didn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
557 use ncurses, it should be possible to build that at the start of chapter 6. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
558 And what was diffutils doing here at all? It turns out that the perl |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
559 configure stage uses "cmp" (which it provides), so if you didn't need |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
560 perl you didn't need this.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
561 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
562 <p>Since Linux From Scratch's "chapter 6" started by rebuilding binutils and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
563 gcc (which were the big, complicated, tough packages), those obviously didn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
564 need any more than was in chapter 5 to rebuild themselves.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
565 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
566 <p>All this analysis reduced Linux From Scratch's chapter 5 to four |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
567 functional groups:</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
568 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
569 <ul> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
570 <li><p>Compiler - binutils, gcc, make, and the linux headers copied into /usr/include/linux.</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
571 <li><p>C library - glibc or similar</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
572 <li><p>Lots of posix command line utilities - everything else</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
573 <li><p>Bootloader and kernel - Linux, Lilo, etc (not necessarily part of the root filesystem at all).</p></li> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
574 </ul> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
575 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
576 <h2>Replacing packages with BusyBox and uClibc</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
577 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
578 <p>Once I ran out of obvious packages to remove, I experimented with package |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
579 substitutions, swapping out the stock Linux From Scratch packages for other |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
580 (smaller) implementations of the same functionality. The two obvious goals |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
581 (again, pursued in parallel) were to swap glibc for uClibc, and to use busybox |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
582 in place of as many other commands it could replace.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
583 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
584 <p>In theory, a self-hosting LFS chapter 5 root filesystem that could rebuild |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
585 itself directly from source could be reduced to binutils, gcc, make, uClibc, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
586 linux-headers, and an _extensively_ upgraded busybox. (Of course such a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
587 modified chapter 5 should still be able to build the unmodified chapter 6. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
588 If it couldn't, there was something wrong with it, so that was a good test.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
589 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
590 <p>Both BusyBox and uClibc were maintained by a guy named Erik Andersen, who |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
591 had started them while working for a company called Lineo and continued them |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
592 after he left (a little like the way I was continuing Firmware Linux). |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
593 In both cases he'd found a long-stalled existing project to salvage and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
594 relaunch instead of starting from scratch, but in reality he'd taken dead |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
595 projects, replaced all their existing code, and built a community around |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
596 them.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
597 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
598 <h2>BusyBox</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
599 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
600 <p>Busybox was nice because I could introduce it piecemeal. I could replace |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
601 commands one at a time, swap an existing /tools/bin binary with its |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
602 busybox equivalent and run the build to see if it worked. If it didn't, I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
603 could compare the two versions of the build against each other to see what |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
604 had changed, or try to replace a different (simpler) command.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
605 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
606 <p>The Linux From Scratch installation instructions also listed the files |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
607 installed by each package, so I could look through the lists ( |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
608 <a href=http://archive.linuxfromscratch.org/lfs-museum/5.0/LFS-BOOK-5.0-HTML/chapter06/sed.html>sed</a> had just one, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
609 <a href=http://archive.linuxfromscratch.org/lfs-museum/5.0/LFS-BOOK-5.0-HTML/chapter06/gzip.html>gzip</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
610 installed a little over a dozen, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
611 http://archive.linuxfromscratch.org/lfs-museum/5.0/LFS-BOOK-5.0-HTML/chapter06/util-linux.html>util-linux</a> installed over 60) to see what |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
612 was actually needed ("sed" yes, "cal" not so much) and what busybox did |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
613 and didn't provide already and what would need to be added or upgraded.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
614 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
615 <p>I focused on eliminating packages, which meant I started by tackling |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
616 fairly complicated commands like "bunzip" and "sed", because getting those |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
617 to work would let me drop an entire package. I quickly sent in so many |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
618 bugfixes to sed I wound up maintaining the applet, and got distracted |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
619 rewriting bunzip entirely (but my new implementation compiled to only 7k).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
620 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
621 <p>Eventually, I wound up getting busybox to replace bzip2, coreutils, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
622 e2fsprogs, file, findutils, gawk, grep, inetutils, less, modutils, net-tools, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
623 patch, procps, sed, shadow, sysklogd, sysvinit, tar, util-linux, and vim.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
624 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
625 <p>To do that, I wound up extensively upggrading (or rewriting from scratch) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
626 dozens of different busybox commands and adding several new ones from |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
627 scratch.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
628 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
629 <p>One new command was switch_root, for initramfs support. I wrote an |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
630 initramfs file for the kernel's Documentation directory because I investigated |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
631 it for FWL. (And later gave my first OLS presenation on the topic, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
632 and write an article series about it when I worked at TimeSys.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
633 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
634 <p>Another new command was mdev, which was a rewrite of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
635 <a href=http://lkml.indiana.edu/hypermail/linux/kernel/0510.3/1732.html>a shell |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
636 script</a> I used to populate /dev, which Frank Sorenson |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
637 <a href=http://lists.busybox.net/pipermail/busybox/2005-December/051458.html>ported to C</a> and I extended (adding a config file based on irc conversations |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
638 with Gentoo's Solar).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
639 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
640 <h2>uClibc</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
641 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
642 <p>Replacing glibc with uClibc took some doing, but at the time the uClibc |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
643 project was quite heavily developed and rapidly improving (coming out with 8 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
644 releases in 2002 and 8 more in 2003) so there was always something new to try. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
645 If something didn't work, they were happy to fix it.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
646 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
647 <p>uClibc version 0.9.26 (January 2004) was the breakthrough version that went |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
648 from "here are the packages known to work, anything else probably won't" to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
649 "any package you try to build against this will most likely work, please |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
650 let us know about anything that doesn't". When uClibc did finally work, it |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
651 allowed me to remove perl from /tools (which was only need to build glibc, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
652 but not required by anything else in LFS).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
653 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
654 <p>I also experimented with dynamically linking /tools, as another way to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
655 get the size down. Linux From Scratch statically linked chapter 5 for |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
656 simplicity sake, I tried to get the existing compiler to link against |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
657 the C library I just built. This was quite a learning experience. Everything |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
658 from changing the library loader path to making sure gcc could find crt0.o |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
659 at a nonstandard location was all new, and fiddly, and cryptic, and didn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
660 work. And thus began the long war between me and gcc's path logic. (Since I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
661 had static linking to fall back on, I could poke at this in parallel with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
662 my other work on the project, and didn't get it to actually _work_ for quite |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
663 some time.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
664 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
665 <p>At the time, programs were normally built against uClibc by using a wrapper |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
666 around gcc that rewrote its command line arguments to link against a different |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
667 C library. Of course I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
668 <a href=http://www.uclibc.org/lists/uclibc/2003-August/006795.html>took the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
669 wrapper apart</a> to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
670 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-September/027714.html>see |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
671 how it worked</a> and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
672 <a href=http://www.uclibc.org/lists/uclibc/2003-September/006875.html>how to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
673 make gcc link against uClibc without it</a>. What I wanted was a compiler that naturally linked |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
674 against uClibc, not an existing glibc compiler repurposed to do so.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
675 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
676 <p>Based on what the wrapper was doing and a lot of tweaking and questions |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
677 on the mailing list (which Erik graciously answered), |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
678 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027643.html>I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
679 got it working</a> around the middle of 2003.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
680 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
681 <h2>User Mode Linux</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
682 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
683 <p>The Linux From Scratch build assumed you had root access, in order to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
684 mknod devices, chroot into the temporary system (chapter 5) directory to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
685 build the final system (the chapter 6 packages), and to loopback mount files |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
686 to create system images.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
687 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
688 <p>Asking people to download random code and run it as root seemed kind |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
689 of impolite at best, and since the end result was just a file (a tarball |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
690 or a filesystem image), there was no real excuse for requiring root access. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
691 The packages built as a normal user already, in theory that was the hard |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
692 part.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
693 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
694 <p>My solution was User Mode Linux. (Of course I wrote a quick |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
695 <a href=http://landley.net/writing/docs/UML.html>User Mode Linux HOWTO</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
696 containing everything I needed to know to do what I was doing with it.)</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
697 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
698 <p>User Mode Linux was essentially an emulator, which could give me simulated |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
699 root access (enough for my needs), but without extensive setup thanks to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
700 the "hostfs", and without requiring a new source package (I already had |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
701 the Linux kernel sources, this was just another way of building them). |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
702 I first got it working in the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
703 <a href=http://landley.livejournal.com/10201.html>first got it working in |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
704 a patched 2.6.9 kernel</a>, and later integrated it into the build when I got |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
705 <a href=http://landley.livejournal.com/2005/01/21/>unpatched 2.6.11</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
706 to build a usable User Mode Linux image (although I had to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
707 <a href=http://landley.livejournal.com/12578.html>patch it a bit</a> myself |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
708 later). I could then use that to chroot (via UML's "hostfs") and loopback |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
709 mount as a normal user, and then mknod within that loopback |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
710 mount, and run the chapter 5 environment within UML to build chapter 6. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
711 Of course I wrote a quick <a href=http://landley.net/writing/docs/UML.html>User |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
712 Mode Linux HOWTO</a>.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
713 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
714 <p>Using UML was optional, and the scripts autodetected if you were running |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
715 as root and would chroot directly instead of firing up what amounted to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
716 an emulator, but |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
717 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
718 <h1>Why 2006 was a lost year</h1> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
719 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
720 <h2>The rise of buildroot</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
721 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
722 <p>Shortly after I figured out how the uClibc wrapper (and gcc in general) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
723 worked under the covers, the uClibc developers abandoned the wrapper in favor |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
724 of a new project called "buildroot".</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
725 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
726 I also took buildroot apart to see how |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
727 it worked, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
728 <a href=http://www.uclibc.org/lists/uclibc/2003-August/006674.html>wrote the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
729 first buildroot HOWTO</a> (because I tend to document everything I didn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
730 initially understand), made a number of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
731 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027542.html>design |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
732 suggestions</a>, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
733 and even <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027559.html>oftered patches</a>.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
734 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
735 <p>But I didn't really like the design of buildroot |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
736 (nested makefiles aren't the most straightforward approach to anything, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
737 its need to run as root meant that early versions |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
738 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027558.html>ate my |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
739 laptop</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
740 (<a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028413.html>twice</a>), |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
741 and it <a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028389.html>couldn't rebuild itself under itself</a>, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
742 and in general was a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
743 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-December/028610.html>constantly broken</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
744 moving target with no stable releases.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
745 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
746 <p>The buildroot project was the response to fresh gcc bloat: around |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
747 gcc 3.0 a new shared library called libgcc_s.so showed up, more or less |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
748 a dynamic version of the old libgcc.a. It contained various gcc internal |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
749 functions (such as 64 bit division on 32 bit platforms), which most nontrivial |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
750 programs wound up linking against. Unfortunately, shared libraries can link |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
751 against other shared libraries, and libgcc_s.so linked against libc.so.6. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
752 So any program that linked against this library snuck in a reference to glibc |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
753 and wouldn't load without it, even if it was otherwise linked against |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
754 uClibc.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
755 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
756 <p>This meant the gcc wraper was no longer sufficient, but since libgcc_s.so was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
757 part of gcc, the only way to get a new version of libgcc_s.so that linked |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
758 against uClibc (instead of glibc) was to download the gcc source code and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
759 build gcc itself against uClibc.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
760 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
761 <p>And that's exactly what buildroot did: built uClibc and a new compiler |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
762 out of the four source packages uClibc, binutils, gcc, and the linux |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
763 kernel for the kernel headers, hooking the whole mess together with |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
764 several ./configure options and source patches. Then it used the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
765 new uClibc compiler to build Erik's other project, BusyBox, as a test case |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
766 that it was all working correctly.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
767 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
768 <p>In order to test both static and dynamic linking, buildroot created |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
769 a new uClibc root filesystem directory containing the uClibc shared libraries, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
770 and a second instance of busybox dynamically linked against those, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
771 which you could chroot and test out the uClibc version of busybox. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
772 Since he already had the kernel source lying aorund, Eric even taught it to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
773 build a User Mode Linux binary that could do the chroot for you.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
774 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
775 <h2>Problems with buildroot</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
776 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
777 <p>Right at the start I took buildroot apart to see how it worked, and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
778 <a href=http://www.uclibc.org/lists/uclibc/2003-August/006674.html>wrote the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
779 first buildroot HOWTO</a> (because I tend to document everything I didn't |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
780 initially understand), made a number of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
781 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027542.html>design |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
782 suggestions</a>, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
783 and even <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027559.html>oftered patches</a>.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
784 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
785 <p>But I didn't really like the design of buildroot |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
786 (nested makefiles aren't the most straightforward approach to anything, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
787 its need to run as root meant that early versions |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
788 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027558.html>ate my |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
789 laptop</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
790 (<a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028413.html>twice</a>), |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
791 and it <a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028389.html>couldn't rebuild itself under itself</a>, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
792 and in general was a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
793 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-December/028610.html>constantly broken</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
794 moving target with no stable releases.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
795 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
796 <p>So I continued to work on my existing build project instead (which was |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
797 several years old by that point). Buildroot was an instructive counterexample |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
798 on many fronts: my project should not require root access to build, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
799 shell scripts were more readable than nested makefiles, releases were |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
800 important, and it's vital to have boundaries so youc an clearly state |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
801 what your project DOESN'T do.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
802 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
803 <p>I also checked in with buildroot from time to time to see what it was doing |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
804 (several patches to make various packages work with uClibc were only ever |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
805 documented by being checked into the buildroot repository, and then the uClibc |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
806 developers acted shocked I hadn't heard of them).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
807 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
808 <p>The biggest problem with buildroot was the impact it had on BusyBox and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
809 uClibc development. Although buildroot started out as just a test harness for |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
810 uClibc and busybox, it quickly grew out of hand. Since the easy way to |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
811 regression test that a package worked against uClibc was to add it to the test |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
812 suite and build it as part of the test root filesystem, lots of packages |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
813 got added fairly quickly. People packaged up and shipped the root filesystem |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
814 created by buildroot when they wanted a simple uClibc+busybox root filesystem, |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
815 and then complained when it didn't build some package they needed.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
816 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
817 <p>Within a few months, buildroot had exploded from a simple test harness into |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
818 a half-assed Linux distribution. Erik <a href=http://lists.uclibc.org/pipermail/uclibc/2003-August/027567.html>tried to avoid this</a> (he'd previously |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
819 built a <a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028364.html>uClibc-native version of Debian Woody</a> and knew perfectly well |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
820 what a real distro looked like), but buildroot |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
821 turned into a distro anyway because the project had no clear boundaries that |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
822 allowed him to say "no, this new feature is not within the project's scope".</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
823 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
824 <p>As a distro, buildroot was a deeply flawed. It had no package management |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
825 tools (such as rpm or deb or portage), nor did it have the tens of thousands of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
826 packages build descriptions in the large and carefully maintained repository |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
827 of Red Hat, Ubuntu, Gentoo, or even Slackware. For the project's first five |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
828 years, buildroot never even had a release, instead insisting users grab a |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
829 random source control snapshot and hope for the best. But a build |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
830 system, it was the focus of the development efforts of the BusyBox and uClibc |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
831 communities, and became their standard repository of knowledge about how |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
832 to build packages for all sorts of embedded environments.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
833 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
834 <h2>The fall of uClibc and BusyBox</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
835 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
836 <p>With no clear dividing line between "how to build" and "what to build", |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
837 buildroot's scope and complexity exploded, and despite its limitations as |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
838 a distro what buildroot could do was suck away an endless amount of |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
839 development time from the BusyBox and uClibc developers. By 2005, both |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
840 uClibc and BusyBox development were clearly suffering.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
841 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
842 <p>Erik started by abandoning busybox after the 1.0 release, both because |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
843 1.0 seemed like a good stopping point (since it was "done" now), and because |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
844 he just didn't have time for it anymore. Other developers (including |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
845 myself) still did new development, found bugs and fixed them, but there |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
846 was no prospect of a new release.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
847 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
848 <p>Over on the uClibc side of things, Erik held on longer but the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
849 release frequency slowed, from seven releases in 2003 (0.9.17 through 0.9.24) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
850 to two in 2004, one in 2005, and none at all in the whole year 2006.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
851 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
852 <hr> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
853 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
854 <h1>UNFINISHED BELOW HERE</h1> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
855 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
856 <pre> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
857 and |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
858 continued to work on the project with bugfixes kept accumulating, and I collected them together until |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
859 I had enough to make a bugfix release which became the official 1.01 when |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
860 Erik approved it. It turns out "he who cuts releases is the maintainer", |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
861 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
862 I stepped in cutting a 1.01 bugfix release and eventually |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
863 becoming the project's official new maintainer (because he who cuts releases is |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
864 maintainer).</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
865 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
866 <p>Over on the uClibc side of things, Erik held on longer but the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
867 release frequency slowed, from seven releases in 2003 (0.9.17 through 0.9.24) |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
868 to two in 2004, one in 2005, and none at all in the whole year 2006.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
869 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
870 <p>I didn't have time to take on </p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
871 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
872 -------- |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
873 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
874 Buildroot traffic |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
875 <a href=http://lists.uclibc.org/pipermail/uclibc/2003-November/028342.html>slowly</a> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
876 <a href=http://lists.uclibc.org/pipermail/uclibc/2005-October/033720.html>strangled</a> uClibc development discussion on the uClibc list until I gave up |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
877 and <a href=http://lists.uclibc.org/pipermail/uclibc/2006-July/036836.html>created |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
878 a new list</a> and politely kicked the buildroot traffic over there.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
879 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
880 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
881 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
882 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
883 Cake |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
884 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
885 Me suggesting new buildroot list: |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
886 http://lists.uclibc.org/pipermail/uclibc/2003-November/028342.html |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
887 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
888 Instead buildroot set off to reinvent the |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
889 wheel, maintaining their repository in |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
890 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
891 Debian's repository contained over 45,000 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
892 packages |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
893 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
894 <h2>BusyBox</h2> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
895 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
896 Mention of FWL relaunch in 2004 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
897 http://landley.livejournal.com/766.html |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
898 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
899 ---------------------------- |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
900 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
901 - tcc spawns qemu |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
902 - Busybox maintainership, timesys, relaunch to current version. |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
903 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
904 </pre> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
905 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
906 <h3>Busybox maintainership</h3> |
70 | 907 |
908 <p>When the Firmware Linux project started, busybox applets like sed and sort | |
909 weren't powerful enough to handle the "./configure; make; make install" of | |
910 packages like binutils or gcc. Busybox was usable in an embedded router or | |
911 rescue floppy, but trying to get real work done with it revealed numerous | |
912 bugs and limitations. (It hung, it segfaulted, produced the wrong output, | |
913 refused to run due to unrecognized command line options... You name it.)</p> | |
914 | |
915 <p>So I spent about 3 years improving Busybox (and pestering other people into | |
916 improving their bits), and along the way accidentally become the BusyBox | |
917 maintainer (at least until the project's crazy-uncle founder showed up and | |
918 <a href=http://lwn.net/Articles/202106/>drove me away again</a>). The result | |
919 is that in Firmware Linux, Busybox now functions as an effective replacement | |
920 for bzip2, coreutils, diffutils, e2fsprogs, file, findutils, gawk, grep, | |
921 inetutils, less, modutils, net-tools, patch, procps, sed, shadow, sysklogd, | |
922 sysvinit, tar, util-linux, and vim. I was in the process of writing a new | |
923 shell to replace bash with when I left.</p> | |
924 | |
925 <p>Firmware Linux stalled while I was BusyBox maintainer (2005-2006) due to | |
926 lack of time, and since that ended most of my spare programming time has gone | |
927 into launching toybox. But one of the main goals of toybox is to replace | |
928 BusyBox in Firmware Linux, so as toybox matures it'll naturally lead to more | |
929 of my time spent working on FWL.</p> | |
930 | |
931 <p>The server behind this website does not currently run on Firmware Linux. | |
932 Making it do so is a TODO item. After that, I'd like to get it to the point | |
933 where I can use it on my laptop. :)</p> | |
934 | |
935 <p>A snapshot of the old website is <a href=old>available here</a>.</p> | |
936 | |
867
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
937 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
938 |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
939 <p>I <a href=http://landley.livejournal.com/22566.html>started playing around |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
940 with QEMU in novemeber 2005</a>, about the same time I started keeping |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
941 a more detailed <a href=http://landley.net/notes-2005.html>technical |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
942 blog</a> on my own website, and shortly before I |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
943 <a href=http://landley.livejournal.com/24021.html>went to work for |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
944 TimeSys</a>.</p> |
fc7d646d1ebf
Unfinished update of history.html.
Rob Landley <rob@landley.net>
parents:
178
diff
changeset
|
945 |
72 | 946 <!--#include file="footer.html" --> |