Added a few comments here and there
[linux_from_scratch.git] / BOOK / chapter06 / chapter06.xml
blob44ec75c9e147765f7969eefd9eae3e039e6cf003
1 <chapter id="chapter-building-system" xreflabel="Chapter 6">
2 <title>Installing basic system software</title>
3 <?dbhtml filename="chapter06.html" dir="chapter06"?>
6 <sect1 id="ch-system-introduction">
7 <title>Introduction</title>
8 <?dbhtml filename="introduction.html" dir="chapter06"?>
10 <para>In this chapter we enter the building site, and start
11 constructing our LFS system in earnest. That is, we chroot into
12 our temporary mini Linux system, create some auxiliary things,
13 and then start installing all the packages, one by one.</para>
15 <para>The installation of all this software is pretty straightforward,
16 and you will probably think it would be much shorter to give here
17 the generic installation instructions and explain in full only the
18 installation of those packages that require an alternate method.
19 Although we agree with that, we nevertheless choose to give the 
20 full instructions for each and every package, simply to minimize
21 the possibilities for mistakes.</para>
23 <para>The key to learning what makes a Linux system work is to know
24 what each package is used for and why the user (or the system) needs it.
25 For this purpose for every installed package a summary of its content is
26 given followed by concise descriptions of each program and library it
27 installed.</para>
29 <para>If you plan to use compiler optimizations in this chapter, take a look at
30 the optimization hint at <ulink url="&hints-root;optimization.txt"/>. Compiler
31 optimizations can make a program run slightly faster, but they may also cause
32 compilation difficulties and even problems when running the program. If a
33 package refuses to compile when using optimization, try to compile it without
34 optimization and see if the problem goes away. Even if the package does compile
35 when using optimization, there is the risk it may have been compiled incorrectly
36 due to complex interactions between the code and build tools. In short, the
37 small potential gains achieved in using compiler optimization are generally
38 outweighed by the risk. First time builders of LFS are encouraged to build
39 without custom optimizations. Your system will still be very fast and very
40 stable at the same time.</para>
42 <para>The order in which packages are installed in this chapter has
43 to be strictly followed, to ensure that no program gets a path referring
44 to <filename class="directory">/tools</filename> hard-wired into it.
45 For the same reason, <emphasis>do not </emphasis> compile packages
46 in parallel. Compiling in parallel may save you some time (especially on
47 dual-CPU machines), but it could result in a program containing a
48 hard-wired path to <filename class="directory">/tools</filename>,
49 which will cause the program to stop working when that directory
50 is removed.</para>
52 <para>Before the installation instructions each installation page gives some
53 information about the package: a concise description of what it contains, how
54 long it will approximately take to build it, how much disk space it needs
55 during this building process, the official download location of the package
56 (in case you just want to update a few of them), and which other packages it
57 needs in order to be built successfully. After the installation instructions
58 follows a list of programs and libraries that the package installs, together
59 with a series of short descriptions of these.</para>
61 </sect1>
63 &c6-mountproc;
65 <sect1 id="ch-system-chroot">
66 <title>Entering the chroot environment</title>
67 <?dbhtml filename="chroot.html" dir="chapter06"?>
69 <para>It is time to enter the chroot environment in order to begin building
70 and installing your final LFS system.</para>
72 <para>First check, just like earlier, that the LFS environment variable is set
73 up properly by running <userinput>echo $LFS</userinput> and making sure it
74 shows the path to your LFS partition's mount point, which is
75 <filename class="directory">/mnt/lfs</filename> if you followed our example.</para>
77 <para>As <emphasis>root</emphasis>, run the following command to enter the
78 chroot environment:</para>
80 <screen><userinput>chroot $LFS /tools/bin/env -i \
81 &nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
82 &nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
83 &nbsp;&nbsp;&nbsp;&nbsp;/tools/bin/bash --login +h</userinput></screen>
85 <para>The <emphasis>-i</emphasis> option given to the
86 <command>env</command> command will clear all variables of the chroot
87 environment. After that, only the HOME, TERM, PS1 and PATH variables are
88 set again. The TERM=$TERM construct will set the TERM variable inside chroot
89 to the same value as outside chroot; this variable is needed for programs
90 like <command>vim</command> and <command>less</command> to operate
91 properly. If you need other variables present, such as CFLAGS or CXXFLAGS,
92 this is a good place to set them again.</para>
94 <para>From this point on there's no need to use the LFS variable anymore,
95 because everything you do will be restricted to the LFS file system -- since
96 what the shell thinks is <filename class="directory">/</filename> is actually
97 the value of <filename class="directory">$LFS</filename>, which was passed to
98 the chroot command.</para>
100 <para>Notice that <filename class="directory">/tools/bin</filename> comes
101 last in the PATH. This means that a temporary tool will not be used any more
102 as soon as its final version is installed. Well, at least when the shell
103 doesn't remember the locations of executed binaries -- for this reason hashing
104 is switched off by passing the <emphasis>+h</emphasis> option to
105 <command>bash</command>.</para>
107 <para>You have to make sure all the commands in the rest of this chapter and
108 in the following chapters are run from within the chroot environment.
109 If you ever leave this environment for any reason (rebooting for example),
110 you must remember to first mount the proc and devpts file systems (discussed
111 in the previous section) <emphasis>and</emphasis> enter chroot again before
112 continuing with the installations.</para>
114 <para>Note that the bash prompt will say "I have no name!" This is normal, as
115 the <filename>/etc/passwd</filename> file has not been created yet.</para>
117 </sect1>
120 <sect1 id="ch-system-changingowner">
121 <title>Changing ownership</title>
122 <?dbhtml filename="changingowner.html" dir="chapter06"?>
124 <para>Right now the <filename class="directory">/tools</filename> directory
125 is owned by the user <emphasis>lfs</emphasis>, a user that exists only on your
126 host system. Although you will probably want to delete the
127 <filename class="directory">/tools</filename> directory once you have
128 finished your LFS system, you may want to keep it around, for example to
129 build more LFS systems. But if you keep the
130 <filename class="directory">/tools</filename> directory as it is, you end up
131 with files owned by a user ID without a corresponding account. This is
132 dangerous because a user account created later on could get this same user ID
133 and would suddenly own the <filename class="directory">/tools</filename>
134 directory and all the files therein, thus exposing these files to possible
135 malicious manipulation.</para>
137 <para>To avoid this issue, you could add the <emphasis>lfs</emphasis> user to
138 your new LFS system later on when creating the <filename>/etc/passwd</filename>
139 file, taking care to assign it the same user and group IDs as on your host
140 system. Alternatively, you can (and the book assumes you do) assign the
141 contents of the <filename class="directory">/tools</filename> directory to
142 user <emphasis>root</emphasis> by running the following command:</para>
144 <screen><userinput>chown -R 0:0 /tools</userinput></screen>
146 <para>The command uses "0:0" instead of "root:root", because
147 <userinput>chown</userinput> is unable to resolve the name "root" until the
148 password file has been created.</para>
150 </sect1>
153 <sect1 id="ch-system-creatingdirs">
154 <title>Creating directories</title>
155 <?dbhtml filename="creatingdirs.html" dir="chapter06"?>
157 <para>Let's now create some structure in our LFS file system. Let's create
158 a directory tree. Issuing the following commands will create a more or less
159 standard tree:</para>
161 <screen><userinput>mkdir -p /{bin,boot,dev/{pts,shm},etc/opt,home,lib,mnt,proc}
162 mkdir -p /{root,sbin,tmp,usr/local,var,opt}
163 for dirname in /usr /usr/local
164 &nbsp;&nbsp;&nbsp;&nbsp;do
165 &nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/{bin,etc,include,lib,sbin,share,src}
166 &nbsp;&nbsp;&nbsp;&nbsp;ln -s share/{man,doc,info} $dirname
167 &nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/{doc,info,locale,man}
168 &nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/{misc,terminfo,zoneinfo}
169 &nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/man/man{1,2,3,4,5,6,7,8}
170 done
171 mkdir /var/{lock,log,mail,run,spool}
172 mkdir -p /var/{tmp,opt,cache,lib/misc,local}
173 mkdir /opt/{bin,doc,include,info}
174 mkdir -p /opt/{lib,man/man{1,2,3,4,5,6,7,8}}</userinput></screen>
176 <para>Directories are, by default, created with permission mode 755, but this
177 isn't desirable for all directories. We will make two changes: one to the home
178 directory of <emphasis>root</emphasis>, and another to the directories for
179 temporary files.</para>
181 <screen><userinput>chmod 0750 /root
182 chmod 1777 /tmp /var/tmp</userinput></screen>
184 <para>The first mode change ensures that not just anybody can enter the
185 <filename class="directory">/root</filename> directory -- the same
186 as a normal user would do with his or her home directory.
187 The second mode change makes sure that any user can write to the
188 <filename class="directory">/tmp</filename> and
189 <filename class="directory">/var/tmp</filename> directories, but
190 cannot remove other users' files from them. The latter is prohibited
191 by the so-called "sticky bit" -- the highest bit in the 1777 bit mask.</para>
193 <sect2>
194 <title>FHS compliance note</title>
196 <para>We have based our directory tree on the FHS standard (available at
197 <ulink url="http://www.pathname.com/fhs/"/>). Besides the above created
198 tree this standard stipulates the existence of
199 <filename class="directory">/usr/local/games</filename> and
200 <filename class="directory">/usr/share/games</filename>, but we don't
201 much like these for a base system. However, feel free to make your system
202 FHS-compliant. As to the structure of the
203 <filename class="directory">/usr/local/share</filename> subdirectory, the FHS
204 isn't precise, so we created here the directories that we think are needed.</para>
206 </sect2>
208 </sect1>
211 <sect1 id="ch-system-createfiles">
212 <title>Creating essential symlinks</title>
213 <?dbhtml filename="createfiles.html" dir="chapter06"?>
215 <para>Some programs hard-wire paths to programs which don't exist yet. In
216 order to satisfy these programs, we create a number of symbolic links which
217 will be replaced by real files throughout the course of this chapter when
218 we're installing all the software.</para>
220 <screen><userinput>ln -s /tools/bin/{bash,cat,pwd,stty} /bin
221 ln -s /tools/bin/perl /usr/bin
222 ln -s /tools/lib/libgcc_s.so.1 /usr/lib
223 ln -s bash /bin/sh</userinput></screen>
225 </sect1>
228 <sect1 id="ch-system-pwdgroup">
229 <title>Creating the passwd, group and log files</title>
230 <?dbhtml filename="pwdgroup.html" dir="chapter06"?>
232 <para>In order for <emphasis>root</emphasis> to be able to login and for the 
233 name "root" to be recognized, there need to be relevant entries in the 
234 <filename>/etc/passwd</filename> and <filename>/etc/group</filename> files.</para>
236 <para>Create the <filename>/etc/passwd</filename> file by running the following 
237 command:</para>
239 <screen><userinput>cat &gt; /etc/passwd &lt;&lt; "EOF"</userinput>
240 root:x:0:0:root:/root:/bin/bash
241 <userinput>EOF</userinput></screen>
243 <para>The actual password for <emphasis>root</emphasis> (the "x" here is just a 
244 placeholder) will be set later.</para>
246 <para>Create the <filename>/etc/group</filename> file by running the following 
247 command:</para>
249 <screen><userinput>cat &gt; /etc/group &lt;&lt; "EOF"</userinput>
250 root:x:0:
251 bin:x:1:
252 sys:x:2:
253 kmem:x:3:
254 tty:x:4:
255 tape:x:5:
256 daemon:x:6:
257 floppy:x:7:
258 disk:x:8:
259 lp:x:9:
260 dialout:x:10:
261 audio:x:11:
262 <userinput>EOF</userinput></screen>
264 <para>The created groups aren't part of any standard -- they are the groups 
265 that the MAKEDEV script in the next section uses. Besides the group "root", the 
266 LSB (<ulink url="http://www.linuxbase.org"/>) recommends only a group "bin", 
267 with a GID of 1, be present. All other group names and GIDs can be chosen 
268 freely by the user, as well-written packages don't depend on GID numbers but 
269 use the group's name.</para>
271 <para>To get rid of the "I have no name!" prompt, we will start a new shell.
272 Since we installed a full Glibc in <xref linkend="chapter-temporary-tools"/>, and have just
273 created the <filename>/etc/passwd</filename> and
274 <filename>/etc/group</filename> files, user name and group name resolution
275 will now work.</para>
277 <screen><userinput>exec /tools/bin/bash --login +h</userinput></screen>
279 <para>Note the use of the <emphasis>+h</emphasis> directive. This tells
280 <command>bash</command> not to use its internal path hashing. Without this
281 directive, <command>bash</command> would remember the paths to binaries it
282 has executed. Since we want to use our newly compiled binaries as soon as
283 they are installed, we turn off this function for the duration of this
284 chapter.</para>
286 <para>The <command>login</command>, <command>agetty</command> and
287 <command>init</command> programs (and some others) use a number of log
288 files to record information such as who was logged into the system and when.
289 These programs, however, won't write to the log files if they don't already
290 exist. Initialize the log files and give them their proper permissions:</para>
292 <screen><userinput>touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
293 chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}</userinput></screen>
295 <para>The <filename>/var/run/utmp</filename> file records the users that are
296 currently logged in. The <filename>/var/log/wtmp</filename> file records all
297 logins and logouts. The <filename>/var/log/lastlog</filename> file records for
298 each user when he or she last logged in. The <filename>/var/log/btmp</filename>
299 file records the bad login attempts.</para>
301 </sect1>
304 &c6-makedev;
305 &c6-kernel;
306 &c6-manpages;
307 &c6-glibc;
310 <sect1 id="ch-system-adjustingtoolchain">
311 <title>Re-adjusting the toolchain</title>
312 <?dbhtml filename="adjustingtoolchain.html" dir="chapter06"?>
314 <para>Now that the new C libraries have been installed, it's time to re-adjust
315 our toolchain. We'll adjust it so that it will link any newly compiled program
316 against the new C libraries. Basically, this is the reverse of what we did
317 in the "locking in" stage in the beginning of the previous chapter.</para>
319 <para>The first thing to do is to adjust the linker. For this we retained the
320 source and build directories from the second pass over Binutils. Install the
321 adjusted linker by running the following from within the
322 <filename class="directory">binutils-build</filename> directory:</para>
324 <screen><userinput>make -C ld INSTALL=/tools/bin/install install</userinput></screen>
326 <note><para>If you somehow missed the earlier warning to retain the Binutils
327 source and build directories from the second pass in
328 <xref linkend="chapter-temporary-tools"/>, or otherwise accidentally deleted them or just
329 don't have access to them, don't worry, all is not lost. Just ignore the above
330 command. The result will be that the next package, Binutils, will link against
331 the Glibc libraries in <filename class="directory">/tools</filename> rather
332 than <filename class="directory">/usr</filename>. This is not ideal, however,
333 our testing has shown that the resulting Binutils program binaries should be
334 identical.</para></note>
336 <para>From now on every compiled program will link <emphasis>only</emphasis>
337 against the libraries in <filename>/usr/lib</filename> and
338 <filename>/lib</filename>. The extra
339 <emphasis>INSTALL=/tools/bin/install</emphasis> is needed because the Makefile
340 created during the second pass still contains the reference to
341 <filename>/usr/bin/install</filename>, which we obviously haven't installed yet.
342 Some host distributions contain a <filename class="symlink">ginstall</filename>
343 symbolic link which takes precedence in the Makefile and thus can cause a
344 problem here. The above command takes care of this also.</para>
346 <para>You can now remove the Binutils source and build directories.</para>
348 <para>The next thing to do is to amend our GCC specs file so that it points
349 to the new dynamic linker. Just like earlier on, we use a sed to accomplish
350 this:</para>
352 <!-- Ampersands are needed to allow cut and paste -->
354 <screen><userinput>SPECFILE=/tools/lib/gcc-lib/*/*/specs &amp;&amp;
355 sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
356 &nbsp;&nbsp;&nbsp;&nbsp;$SPECFILE &gt; newspecfile &amp;&amp;
357 mv -f newspecfile $SPECFILE &amp;&amp;
358 unset SPECFILE</userinput></screen>
360 <para>Again, cutting and pasting the above is recommended. And just like
361 before, it is a good idea to visually inspect the specs file to verify the
362 intended change was actually made.</para>
364 <important><para>If you are working on a platform where the name of the dynamic
365 linker is something other than <filename>ld-linux.so.2</filename>, you
366 <emphasis>must</emphasis> substitute <filename>ld-linux.so.2</filename> with the
367 name of your platform's dynamic linker in the above commands. Refer back to
368 <xref linkend="ch-tools-toolchaintechnotes"/> if necessary.</para></important>
370 <!-- HACK - Force some whitespace to appease tidy -->
371 <literallayout></literallayout>
373 <caution><para>It is imperative at this point to stop and ensure that the
374 basic functions (compiling and linking) of the adjusted toolchain are working
375 as expected. For this we are going to perform a simple sanity check:</para>
377 <screen><userinput>echo 'main(){}' &gt; dummy.c
378 cc dummy.c
379 readelf -l a.out | grep ': /lib'</userinput></screen>
381 <para>If everything is working correctly, there should be no errors, and the
382 output of the last command will be:</para>
384 <blockquote><screen>[Requesting program interpreter: /lib/ld-linux.so.2]</screen></blockquote>
386 <para>(Of course allowing for platform specific differences in dynamic linker
387 name). Note especially that <filename class="directory">/lib</filename> now
388 appears as the prefix of our dynamic linker. If you did not receive the output
389 as shown above, or received no output at all, then something is seriously wrong.
390 You will need to investigate and retrace your steps to find out where the
391 problem is and correct it. There is no point in continuing until this is done.
392 Most likely something went wrong with the specs file amendment above.</para>
394 <para>Once you are satisfied that all is well, clean up the test files:</para>
396 <screen><userinput>rm dummy.c a.out</userinput></screen>
397 </caution>
399 <!-- HACK - Force some whitespace to appease tidy -->
400 <literallayout></literallayout>
402 </sect1>
405 &c6-binutils;
406 &c6-gcc;
408 &c6-coreutils;
409 &c6-zlib;
410 &c6-lfs-utils;
411 &c6-findutils;
412 &c6-gawk;
413 &c6-ncurses;
414 &c6-vim;
415 &c6-m4;
416 &c6-bison;
417 &c6-less;
418 &c6-groff;
419 &c6-sed;
420 &c6-flex;
421 &c6-gettext;
422 &c6-nettools;
423 &c6-inetutils;
424 &c6-perl;
425 &c6-texinfo;
426 &c6-autoconf;
427 &c6-automake;
428 &c6-bash;
429 &c6-file;
430 &c6-libtool;
431 &c6-bzip2;
432 &c6-diffutils;
433 &c6-ed;
434 &c6-kbd;
435 &c6-e2fsprogs;
436 &c6-grep;
437 &c6-grub;
438 &c6-gzip;
439 &c6-man;
440 &c6-make;
441 &c6-modutils;
442 &c6-patch;
443 &c6-procinfo;
444 &c6-procps;
445 &c6-psmisc;
446 &c6-shadowpwd;
447 &c6-sysklogd;
448 &c6-sysvinit;
449 &c6-tar;
450 &c6-utillinux;
451 &c6-gcc-2953;
454 <sect1 id="ch-system-revisedchroot">
455 <title>Revised chroot command</title>
456 <?dbhtml filename="revisedchroot.html" dir="chapter06"?>
458 <para>From now on when you exit the chroot environment and wish to re-enter
459 it, you should run the following modified chroot command:</para>
461 <screen><userinput>chroot $LFS /usr/bin/env -i \
462 &nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
463 &nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin \
464 &nbsp;&nbsp;&nbsp;&nbsp;/bin/bash --login</userinput></screen>
466 <para>The reason being there is no longer any need to use programs from the
467 <filename class="directory">/tools</filename> directory. However, we don't
468 want to remove the <filename class="directory">/tools</filename> directory
469 just yet. There is still some use for it towards the end of the book.</para>
471 </sect1>
474 &c6-bootscripts;
475 &c6-aboutdebug;
477 </chapter>