source: chapter06/chapter06.xml@ b6f86141

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 b6f86141 was b6f86141, checked in by Greg Schafer <greg@…>, 20 years ago

Moved log file creation from Shadow to "Creating the passwd
and group files" and renamed that section accordingly.
Closes 741.

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

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