source: chapter06/chapter06.xml@ c76accc

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 c76accc was c76accc, checked in by Alex Gronenwoud <alex@…>, 20 years ago

Miscellaneous adjustments.

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

  • Property mode set to 100644
File size: 19.5 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 some of the
259groups that the <command>make_devices</command> script in the next section
260uses. The LSB (<ulink url="http://www.linuxbase.org">Linux Standard
261Base</ulink>) recommends only that, beside the group "root" with a GID of 0, a
262group "bin" with a GID of 1 be present. All other group names and GIDs can
263be chosen freely by the system administrator, since well-written packages don't
264depend on GID numbers but use the group's name.</para>
265
266<para>To get rid of the "I have no name!" prompt, we will start a new shell.
267Since we installed a full Glibc in <xref linkend="chapter-temporary-tools"/>,
268and have just created the <filename>/etc/passwd</filename> and
269<filename>/etc/group</filename> files, user name and group name resolution
270will now work.</para>
271
272<screen><userinput>exec /tools/bin/bash --login +h</userinput></screen>
273
274<para>Note the use of the <emphasis>+h</emphasis> directive. This tells
275<command>bash</command> not to use its internal path hashing. Without this
276directive, <command>bash</command> would remember the paths to binaries it
277has executed. Since we want to use our newly compiled binaries as soon as
278they are installed, we turn off this function for the duration of this
279chapter.</para>
280
281<para>The <command>login</command>, <command>agetty</command> and
282<command>init</command> programs (and some others) use a number of log
283files to record information such as who was logged into the system and when.
284These programs, however, won't write to the log files if they don't already
285exist. Initialize the log files and give them their proper permissions:</para>
286
287<screen><userinput>touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
288chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}</userinput></screen>
289
290<para>The <filename>/var/run/utmp</filename> file records the users that are
291currently logged in. The <filename>/var/log/wtmp</filename> file records all
292logins and logouts. The <filename>/var/log/lastlog</filename> file records for
293each user when he or she last logged in. The <filename>/var/log/btmp</filename>
294file records the bad login attempts.</para>
295
296</sect1>
297
298
299&c6-makedev;
300&c6-kernel-headers;
301&c6-manpages;
302&c6-glibc;
303
304
305<sect1 id="ch-system-adjustingtoolchain">
306<title>Re-adjusting the toolchain</title>
307<?dbhtml filename="adjustingtoolchain.html" dir="chapter06"?>
308
309<para>Now that the new C libraries have been installed, it's time to re-adjust
310our toolchain. We'll adjust it so that it will link any newly compiled program
311against the new C libraries. Basically, this is the reverse of what we did
312in the "locking in" stage in the beginning of the previous chapter.</para>
313
314<para>The first thing to do is to adjust the linker. For this we retained the
315source and build directories from the second pass over Binutils. Install the
316adjusted linker by running the following from within the
317<filename class="directory">binutils-build</filename> directory:</para>
318
319<screen><userinput>make -C ld INSTALL=/tools/bin/install install</userinput></screen>
320
321<note><para>If you somehow missed the earlier warning to retain the Binutils
322source and build directories from the second pass in
323<xref linkend="chapter-temporary-tools"/>, or otherwise accidentally deleted them or just
324don't have access to them, don't worry, all is not lost. Just ignore the above
325command. The result will be that the next package, Binutils, will link against
326the Glibc libraries in <filename class="directory">/tools</filename> rather
327than <filename class="directory">/usr</filename>. This is not ideal, however,
328our testing has shown that the resulting Binutils program binaries should be
329identical.</para></note>
330
331<para>From now on every compiled program will link <emphasis>only</emphasis>
332against the libraries in <filename>/usr/lib</filename> and
333<filename>/lib</filename>. The extra
334<emphasis>INSTALL=/tools/bin/install</emphasis> is needed because the Makefile
335created during the second pass still contains the reference to
336<filename>/usr/bin/install</filename>, which we obviously haven't installed yet.
337Some host distributions contain a <filename class="symlink">ginstall</filename>
338symbolic link which takes precedence in the Makefile and thus can cause a
339problem here. The above command takes care of this also.</para>
340
341<para>You can now remove the Binutils source and build directories.</para>
342
343<para>The next thing to do is to amend our GCC specs file so that it points
344to the new dynamic linker. Just like earlier on, we use a sed to accomplish
345this:</para>
346
347<!-- Ampersands are needed to allow cut and paste -->
348
349<screen><userinput>SPECFILE=/tools/lib/gcc-lib/*/*/specs &amp;&amp;
350sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
351&nbsp;&nbsp;&nbsp;&nbsp;$SPECFILE &gt; newspecfile &amp;&amp;
352mv -f newspecfile $SPECFILE &amp;&amp;
353unset SPECFILE</userinput></screen>
354
355<para>Again, cutting and pasting the above is recommended. And just like
356before, it is a good idea to visually inspect the specs file to verify the
357intended change was actually made.</para>
358
359<important><para>If you are working on a platform where the name of the dynamic
360linker is something other than <filename>ld-linux.so.2</filename>, you
361<emphasis>must</emphasis> substitute <filename>ld-linux.so.2</filename> with the
362name of your platform's dynamic linker in the above commands. Refer back to
363<xref linkend="ch-tools-toolchaintechnotes"/> if necessary.</para></important>
364
365<!-- HACK - Force some whitespace to appease tidy -->
366<literallayout></literallayout>
367
368<caution><para>It is imperative at this point to stop and ensure that the
369basic functions (compiling and linking) of the adjusted toolchain are working
370as expected. For this we are going to perform a simple sanity check:</para>
371
372<screen><userinput>echo 'main(){}' &gt; dummy.c
373cc dummy.c
374readelf -l a.out | grep ': /lib'</userinput></screen>
375
376<para>If everything is working correctly, there should be no errors, and the
377output of the last command will be:</para>
378
379<blockquote><screen>[Requesting program interpreter: /lib/ld-linux.so.2]</screen></blockquote>
380
381<para>(Of course allowing for platform specific differences in dynamic linker
382name). Note especially that <filename class="directory">/lib</filename> now
383appears as the prefix of our dynamic linker. If you did not receive the output
384as shown above, or received no output at all, then something is seriously wrong.
385You will need to investigate and retrace your steps to find out where the
386problem is and correct it. There is no point in continuing until this is done.
387Most likely something went wrong with the specs file amendment above.</para>
388
389<para>Once you are satisfied that all is well, clean up the test files:</para>
390
391<screen><userinput>rm dummy.c a.out</userinput></screen>
392</caution>
393
394<!-- HACK - Force some whitespace to appease tidy -->
395<literallayout></literallayout>
396
397</sect1>
398
399
400&c6-binutils;
401&c6-gcc;
402
403&c6-coreutils;
404&c6-zlib;
405&c6-lfs-utils;
406&c6-findutils;
407&c6-gawk;
408&c6-ncurses;
409&c6-vim;
410&c6-m4;
411&c6-bison;
412&c6-less;
413&c6-groff;
414&c6-sed;
415&c6-flex;
416&c6-gettext;
417&c6-nettools;
418&c6-inetutils;
419&c6-perl;
420&c6-texinfo;
421&c6-autoconf;
422&c6-automake;
423&c6-bash;
424&c6-file;
425&c6-libtool;
426&c6-bzip2;
427&c6-diffutils;
428&c6-ed;
429&c6-kbd;
430&c6-e2fsprogs;
431&c6-grep;
432&c6-grub;
433&c6-gzip;
434&c6-man;
435&c6-make;
436&c6-modutils;
437&c6-patch;
438&c6-procinfo;
439&c6-procps;
440&c6-psmisc;
441&c6-shadow;
442&c6-sysklogd;
443&c6-sysvinit;
444&c6-tar;
445&c6-utillinux;
446&c6-gcc-2953;
447
448
449<sect1 id="ch-system-revisedchroot">
450<title>Revised chroot command</title>
451<?dbhtml filename="revisedchroot.html" dir="chapter06"?>
452
453<para>From now on when you exit the chroot environment and wish to re-enter
454it, you should run the following modified chroot command:</para>
455
456<screen><userinput>chroot $LFS /usr/bin/env -i \
457&nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
458&nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin \
459&nbsp;&nbsp;&nbsp;&nbsp;/bin/bash --login</userinput></screen>
460
461<para>The reason being there is no longer any need to use programs from the
462<filename class="directory">/tools</filename> directory. However, we don't
463want to remove the <filename class="directory">/tools</filename> directory
464just yet. There is still some use for it towards the end of the book.</para>
465
466</sect1>
467
468
469&c6-bootscripts;
470&c6-aboutdebug;
471
472</chapter>
473
Note: See TracBrowser for help on using the repository browser.