source: chapter06/chapter06.xml@ 2081905

10.0 10.0-rc1 10.1 10.1-rc1 11.0 11.0-rc1 11.0-rc2 11.0-rc3 11.1 11.1-rc1 11.2 11.2-rc1 11.3 11.3-rc1 12.0 12.0-rc1 12.1 12.1-rc1 6.0 6.1 6.1.1 6.3 6.4 6.5 6.6 6.7 6.8 7.0 7.1 7.2 7.3 7.4 7.5 7.5-systemd 7.6 7.6-systemd 7.7 7.7-systemd 7.8 7.8-systemd 7.9 7.9-systemd 8.0 8.1 8.2 8.3 8.4 9.0 9.1 arm bdubbs/gcc13 ml-11.0 multilib renodr/libudev-from-systemd s6-init trunk v5_1 v5_1_1 xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/lfs-next xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/pip3 xry111/rust-wip-20221008 xry111/update-glibc
Last change on this file since 2081905 was 2081905, checked in by Alex Gronenwoud <alex@…>, 20 years ago

Simplifying the second copying of the kernel headers.

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@3229 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

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