source: chapter06/chapter06.xml@ f89de33

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

Cleaning up the revision of chroot and reboot sections.

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

  • Property mode set to 100644
File size: 27.0 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
64<sect1 id="ch-system-proc">
65<title>Mounting the proc and devpts file systems</title>
66<?dbhtml filename="proc.html" dir="chapter06"?>
67
68<para>In order for certain programs to function properly, the
69<emphasis>proc</emphasis> and <emphasis>devpts</emphasis> file systems must be
70available within the chroot environment. The proc file system is the process
71information pseudo file system through which the kernel provides information
72about the status of the system. And the devpts file system is nowadays the most
73common way pseudo terminals (PTYs) are implemented. Since kernel version 2.4, a
74file system can be mounted as many times and in as many places as you like,
75thus it's not a problem that these file systems are already mounted on your
76host system, especially so because they are virtual file systems.</para>
77
78<para>First become <emphasis>root</emphasis>, as only <emphasis>root</emphasis>
79can mount file systems in unusual places. Then check again that the LFS
80environment variable is set correctly by running <userinput>echo
81$LFS</userinput> and making sure it shows the path to your LFS partition's
82mount point, which is <filename class="directory">/mnt/lfs</filename> if you
83followed our example.</para>
84
85<para>Now make the mount points for these filesystems:</para>
86
87<screen><userinput>mkdir -p $LFS/{proc,dev/pts}</userinput></screen>
88
89<para>Mount the <emphasis>proc</emphasis> file system with:</para>
90
91<screen><userinput>mount proc $LFS/proc -t proc</userinput></screen>
92
93<para>And mount the <emphasis>devpts</emphasis> file system with:</para>
94
95<screen><userinput>mount devpts $LFS/dev/pts -t devpts</userinput></screen>
96
97<para>This last command might fail with an error like:</para>
98
99<blockquote><screen>filesystem devpts not supported by kernel</screen></blockquote>
100
101<para>The most likely cause for this is that your host system's kernel was
102compiled without support for the devpts file system (you can check which file
103systems your kernel supports with <command>cat /proc/filesystems</command>,
104for example). A few PTYs are needed to be able to run the suites for Binutils
105and GCC later on. If your kernel does not support devpts, do not worry, there
106is another way to get them working inside the chroot environment. We'll cover
107this shortly in the <xref linkend="ch-system-MAKEDEV"/> section.</para>
108
109<para>Remember that if for any reason you stop working on your LFS, and start
110again later, it's important to check that these file systems are mounted again
111before entering the chroot environment, otherwise problems could occur.</para>
112
113</sect1>
114
115
116<sect1 id="ch-system-chroot">
117<title>Entering the chroot environment</title>
118<?dbhtml filename="chroot.html" dir="chapter06"?>
119
120<para>It is time to enter the chroot environment in order to begin building
121and installing your final LFS system. Still as <emphasis>root</emphasis> run
122the following command to enter the small world that is, at the moment,
123populated with only the temporary tools:</para>
124
125<screen><userinput>chroot $LFS /tools/bin/env -i \
126&nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
127&nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
128&nbsp;&nbsp;&nbsp;&nbsp;/tools/bin/bash --login +h</userinput></screen>
129
130<para>The <emphasis>-i</emphasis> option given to the
131<command>env</command> command will clear all variables of the chroot
132environment. After that, only the HOME, TERM, PS1 and PATH variables are
133set again. The TERM=$TERM construct will set the TERM variable inside chroot
134to the same value as outside chroot; this variable is needed for programs
135like <command>vim</command> and <command>less</command> to operate
136properly. If you need other variables present, such as CFLAGS or CXXFLAGS,
137this is a good place to set them again.</para>
138
139<para>From this point on there's no need to use the LFS variable anymore,
140because everything you do will be restricted to the LFS file system -- since
141what the shell thinks is <filename class="directory">/</filename> is actually
142the value of <filename class="directory">$LFS</filename>, which was passed to
143the chroot command.</para>
144
145<para>Notice that <filename class="directory">/tools/bin</filename> comes
146last in the PATH. This means that a temporary tool will not be used any more
147as soon as its final version is installed. Well, at least when the shell
148doesn't remember the locations of executed binaries -- for this reason hashing
149is switched off by passing the <emphasis>+h</emphasis> option to
150<command>bash</command>.</para>
151
152<para>You have to make sure all the commands in the rest of this chapter and
153in the following chapters are run from within the chroot environment.
154If you ever leave this environment for any reason (rebooting for example),
155you must remember to first mount the proc and devpts file systems (discussed
156in the previous section) <emphasis>and</emphasis> enter chroot again before
157continuing with the installations.</para>
158
159<para>Note that the bash prompt will say "I have no name!" This is normal, as
160the <filename>/etc/passwd</filename> file has not been created yet.</para>
161
162</sect1>
163
164
165<sect1 id="ch-system-changingowner">
166<title>Changing ownership</title>
167<?dbhtml filename="changingowner.html" dir="chapter06"?>
168
169<para>Right now the <filename class="directory">/tools</filename> directory
170is owned by the user <emphasis>lfs</emphasis>, a user that exists only on your
171host system. Although you will probably want to delete the
172<filename class="directory">/tools</filename> directory once you have
173finished your LFS system, you may want to keep it around, for example to
174build more LFS systems. But if you keep the
175<filename class="directory">/tools</filename> directory as it is, you end up
176with files owned by a user ID without a corresponding account. This is
177dangerous because a user account created later on could get this same user ID
178and would suddenly own the <filename class="directory">/tools</filename>
179directory and all the files therein, thus exposing these files to possible
180malicious manipulation.</para>
181
182<para>To avoid this issue, you could add the <emphasis>lfs</emphasis> user to
183your new LFS system later on when creating the <filename>/etc/passwd</filename>
184file, taking care to assign it the same user and group IDs as on your host
185system. Alternatively, you can (and the book assumes you do) assign the
186contents of the <filename class="directory">/tools</filename> directory to
187user <emphasis>root</emphasis> by running the following command:</para>
188
189<screen><userinput>chown -R 0:0 /tools</userinput></screen>
190
191<para>The command uses "0:0" instead of "root:root", because
192<userinput>chown</userinput> is unable to resolve the name "root" until the
193password file has been created.</para>
194
195</sect1>
196
197
198<sect1 id="ch-system-creatingdirs">
199<title>Creating directories</title>
200<?dbhtml filename="creatingdirs.html" dir="chapter06"?>
201
202<para>Let's now create some structure in our LFS file system. Let's create
203a directory tree. Issuing the following commands will create a more or less
204standard tree:</para>
205
206<screen><userinput>mkdir -p /{bin,boot,dev/{pts,shm},etc/opt,home,lib,mnt,proc}
207mkdir -p /{root,sbin,tmp,usr/local,var,opt}
208for dirname in /usr /usr/local
209&nbsp;&nbsp;&nbsp;&nbsp;do
210&nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/{bin,etc,include,lib,sbin,share,src}
211&nbsp;&nbsp;&nbsp;&nbsp;ln -s share/{man,doc,info} $dirname
212&nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/{doc,info,locale,man}
213&nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/{misc,terminfo,zoneinfo}
214&nbsp;&nbsp;&nbsp;&nbsp;mkdir $dirname/share/man/man{1,2,3,4,5,6,7,8}
215done
216mkdir /var/{lock,log,mail,run,spool}
217mkdir -p /var/{tmp,opt,cache,lib/misc,local}
218mkdir /opt/{bin,doc,include,info}
219mkdir -p /opt/{lib,man/man{1,2,3,4,5,6,7,8}}</userinput></screen>
220
221<para>Directories are, by default, created with permission mode 755, but this
222isn't desirable for all directories. We will make two changes: one to the home
223directory of <emphasis>root</emphasis>, and another to the directories for
224temporary files.</para>
225
226<screen><userinput>chmod 0750 /root
227chmod 1777 /tmp /var/tmp</userinput></screen>
228
229<para>The first mode change ensures that not just anybody can enter the
230<filename class="directory">/root</filename> directory -- the same
231as a normal user would do with his or her home directory.
232The second mode change makes sure that any user can write to the
233<filename class="directory">/tmp</filename> and
234<filename class="directory">/var/tmp</filename> directories, but
235cannot remove other users' files from them. The latter is prohibited
236by the so-called "sticky bit" -- the highest bit in the 1777 bit mask.</para>
237
238<sect2>
239<title>FHS compliance note</title>
240
241<para>We have based our directory tree on the FHS standard (available at
242<ulink url="http://www.pathname.com/fhs/"/>). Besides the above created
243tree this standard stipulates the existence of
244<filename class="directory">/usr/local/games</filename> and
245<filename class="directory">/usr/share/games</filename>, but we don't
246much like these for a base system. However, feel free to make your system
247FHS-compliant. As to the structure of the
248<filename class="directory">/usr/local/share</filename> subdirectory, the FHS
249isn't precise, so we created here the directories that we think are needed.</para>
250
251</sect2>
252
253</sect1>
254
255
256<sect1 id="ch-system-createfiles">
257<title>Creating essential symlinks</title>
258<?dbhtml filename="createfiles.html" dir="chapter06"?>
259
260<para>Some programs hard-wire paths to programs which don't exist yet. In
261order to satisfy these programs, we create a number of symbolic links which
262will be replaced by real files throughout the course of this chapter when
263we're installing all the software.</para>
264
265<screen><userinput>ln -s /tools/bin/{bash,cat,pwd,stty} /bin
266ln -s /tools/bin/perl /usr/bin
267ln -s /tools/lib/libgcc_s.so.1 /usr/lib
268ln -s bash /bin/sh</userinput></screen>
269
270</sect1>
271
272
273<sect1 id="ch-system-pwdgroup">
274<title>Creating the passwd, group and log files</title>
275<?dbhtml filename="pwdgroup.html" dir="chapter06"?>
276
277<para>In order for <emphasis>root</emphasis> to be able to login and for the
278name "root" to be recognized, there need to be relevant entries in the
279<filename>/etc/passwd</filename> and <filename>/etc/group</filename> files.</para>
280
281<para>Create the <filename>/etc/passwd</filename> file by running the following
282command:</para>
283
284<screen><userinput>cat &gt; /etc/passwd &lt;&lt; "EOF"</userinput>
285root:x:0:0:root:/root:/bin/bash
286<userinput>EOF</userinput></screen>
287
288<para>The actual password for <emphasis>root</emphasis> (the "x" here is just a
289placeholder) will be set later.</para>
290
291<para>Create the <filename>/etc/group</filename> file by running the following
292command:</para>
293
294<screen><userinput>cat &gt; /etc/group &lt;&lt; "EOF"</userinput>
295root:x:0:
296bin:x:1:
297sys:x:2:
298kmem:x:3:
299tty:x:4:
300tape:x:5:
301daemon:x:6:
302floppy:x:7:
303disk:x:8:
304lp:x:9:
305dialout:x:10:
306audio:x:11:
307<userinput>EOF</userinput></screen>
308
309<para>The created groups aren't part of any standard -- they are some of the
310groups that the <command>make_devices</command> script in the next section
311uses. The LSB (<ulink url="http://www.linuxbase.org/">Linux Standard
312Base</ulink>) recommends only that, beside the group "root" with a GID of 0, a
313group "bin" with a GID of 1 be present. All other group names and GIDs can
314be chosen freely by the system administrator, since well-written packages don't
315depend on GID numbers but use the group's name.</para>
316
317<para>To get rid of the "I have no name!" prompt, we will start a new shell.
318Since we installed a full Glibc in <xref linkend="chapter-temporary-tools"/>,
319and have just created the <filename>/etc/passwd</filename> and
320<filename>/etc/group</filename> files, user name and group name resolution
321will now work.</para>
322
323<screen><userinput>exec /tools/bin/bash --login +h</userinput></screen>
324
325<para>Note the use of the <emphasis>+h</emphasis> directive. This tells
326<command>bash</command> not to use its internal path hashing. Without this
327directive, <command>bash</command> would remember the paths to binaries it
328has executed. Since we want to use our newly compiled binaries as soon as
329they are installed, we turn off this function for the duration of this
330chapter.</para>
331
332<para>The <command>login</command>, <command>agetty</command> and
333<command>init</command> programs (and some others) use a number of log
334files to record information such as who was logged into the system and when.
335These programs, however, won't write to the log files if they don't already
336exist. Initialize the log files and give them their proper permissions:</para>
337
338<screen><userinput>touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
339chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}</userinput></screen>
340
341<para>The <filename>/var/run/utmp</filename> file records the users that are
342currently logged in. The <filename>/var/log/wtmp</filename> file records all
343logins and logouts. The <filename>/var/log/lastlog</filename> file records for
344each user when he or she last logged in. The <filename>/var/log/btmp</filename>
345file records the bad login attempts.</para>
346
347</sect1>
348
349
350&c6-makedev;
351&c6-kernel-headers;
352&c6-manpages;
353&c6-glibc;
354
355
356<sect1 id="ch-system-readjusting">
357<title>Re-adjusting the toolchain</title>
358<?dbhtml filename="readjusting.html" dir="chapter06"?>
359
360<para>Now that the new and final C libraries have been installed, it's time to
361adjust our toolchain again. We'll adjust it so that it will link any newly
362compiled program against these new libraries. This is in fact the same thing we
363did in the "Adjusting" phase in the beginning of the previous chapter, even
364though it looks like the reverse: then we guided the chain from the host's
365<filename class="directory">/{,usr/}lib</filename> to the new
366<filename class="directory">/tools/lib</filename>, now we guide it from that
367same <filename class="directory">/tools/lib</filename>
368to the LFS's <filename class="directory">/{,usr/}lib</filename>.</para>
369
370<para>First we adjust the linker. For this we retained the
371source and build directories from the second pass over Binutils. Install the
372adjusted linker by running the following from within the
373<filename class="directory">binutils-build</filename> directory:</para>
374
375<screen><userinput>make -C ld INSTALL=/tools/bin/install install</userinput></screen>
376
377<note><para>If you somehow missed the earlier warning to retain the Binutils
378source and build directories from the second pass in
379<xref linkend="chapter-temporary-tools"/>, or otherwise accidentally deleted them or just
380don't have access to them, don't worry, all is not lost. Just ignore the above
381command. The result will be that the next package, Binutils, will link against
382the C libraries in <filename class="directory">/tools</filename> rather
383than in <filename class="directory">/{,usr/}lib</filename>. This is not ideal,
384however, our testing has shown that the resulting Binutils program binaries
385should be identical.</para></note>
386
387<para>From now on every compiled program will link <emphasis>only</emphasis>
388against the libraries in <filename>/usr/lib</filename> and
389<filename>/lib</filename>. The extra
390<emphasis>INSTALL=/tools/bin/install</emphasis> is needed because the Makefile
391created during the second pass still contains the reference to
392<filename>/usr/bin/install</filename>, which we obviously haven't installed yet.
393Some host distributions contain a <filename class="symlink">ginstall</filename>
394symbolic link which takes precedence in the Makefile and thus can cause a
395problem here. The above command takes care of this also.</para>
396
397<para>You can now remove the Binutils source and build directories.</para>
398
399<para>The next thing to do is to amend our GCC specs file so that it points
400to the new dynamic linker. Just like earlier on, we use a sed to accomplish
401this:</para>
402
403<!-- Ampersands are needed to allow cut and paste -->
404
405<screen><userinput>SPECFILE=/tools/lib/gcc-lib/*/*/specs &amp;&amp;
406sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
407&nbsp;&nbsp;&nbsp;&nbsp;$SPECFILE &gt; newspecfile &amp;&amp;
408mv -f newspecfile $SPECFILE &amp;&amp;
409unset SPECFILE</userinput></screen>
410
411<para>Again, cutting and pasting the above is recommended. And just like
412before, it is a good idea to visually inspect the specs file to verify the
413intended change was actually made.</para>
414
415<important><para>If you are working on a platform where the name of the dynamic
416linker is something other than <filename>ld-linux.so.2</filename>, you
417<emphasis>must</emphasis> substitute <filename>ld-linux.so.2</filename> with the
418name of your platform's dynamic linker in the above commands. Refer back to
419<xref linkend="ch-tools-toolchaintechnotes"/> if necessary.</para></important>
420
421<!-- HACK - Force some whitespace to appease tidy -->
422<literallayout></literallayout>
423
424<caution><para>It is imperative at this point to stop and ensure that the
425basic functions (compiling and linking) of the adjusted toolchain are working
426as expected. For this we are going to perform a simple sanity check:</para>
427
428<screen><userinput>echo 'main(){}' &gt; dummy.c
429cc dummy.c
430readelf -l a.out | grep ': /lib'</userinput></screen>
431
432<para>If everything is working correctly, there should be no errors, and the
433output of the last command will be:</para>
434
435<blockquote><screen>[Requesting program interpreter: /lib/ld-linux.so.2]</screen></blockquote>
436
437<para>(Of course allowing for platform specific differences in dynamic linker
438name). Note especially that <filename class="directory">/lib</filename> now
439appears as the prefix of our dynamic linker. If you did not receive the output
440as shown above, or received no output at all, then something is seriously wrong.
441You will need to investigate and retrace your steps to find out where the
442problem is and correct it. There is no point in continuing until this is done.
443Most likely something went wrong with the specs file amendment above.</para>
444
445<para>Once you are satisfied that all is well, clean up the test files:</para>
446
447<screen><userinput>rm dummy.c a.out</userinput></screen>
448</caution>
449
450<!-- HACK - Force some whitespace to appease tidy -->
451<literallayout></literallayout>
452
453</sect1>
454
455
456&c6-binutils;
457&c6-gcc;
458
459&c6-coreutils;
460&c6-zlib;
461&c6-lfs-utils;
462&c6-findutils;
463&c6-gawk;
464&c6-ncurses;
465&c6-vim;
466&c6-m4;
467&c6-bison;
468&c6-less;
469&c6-groff;
470&c6-sed;
471&c6-flex;
472&c6-gettext;
473&c6-nettools;
474&c6-inetutils;
475&c6-perl;
476&c6-texinfo;
477&c6-autoconf;
478&c6-automake;
479&c6-bash;
480&c6-file;
481&c6-libtool;
482&c6-bzip2;
483&c6-diffutils;
484&c6-ed;
485&c6-kbd;
486&c6-e2fsprogs;
487&c6-grep;
488&c6-grub;
489&c6-gzip;
490&c6-man;
491&c6-make;
492&c6-modutils;
493&c6-patch;
494&c6-procinfo;
495&c6-procps;
496&c6-psmisc;
497&c6-shadow;
498&c6-sysklogd;
499&c6-sysvinit;
500&c6-tar;
501&c6-utillinux;
502&c6-gcc-2953;
503
504
505<sect1 id="ch-system-aboutdebug">
506<title>About debugging symbols</title>
507<?dbhtml filename="aboutdebug.html" dir="chapter06"?>
508
509<para>Most programs and libraries are, by default, compiled with debugging
510symbols included (with <command>gcc</command>'s <emphasis>-g</emphasis>
511option). This means that, when debugging a program or library that was compiled
512with debugging information included, the debugger can give you not only memory
513addresses but also the names of the routines and variables.</para>
514
515<para>The inclusion of these debugging symbols, however, enlarges a program or
516library significantly. To get an idea of the amount of space these symbols
517occupy, have a look at the following:</para>
518
519<itemizedlist>
520
521<listitem><para>a bash binary
522with debugging symbols: 1200 KB</para></listitem>
523
524<listitem><para>a bash binary
525without debugging symbols: 480 KB</para></listitem>
526
527<listitem><para>Glibc and GCC files (/lib and /usr/lib)
528with debugging symbols: 87 MB</para></listitem>
529
530<listitem><para>Glibc and GCC files
531without debugging symbols: 16 MB</para></listitem>
532
533</itemizedlist>
534
535<para>Sizes may vary somewhat, depending on which compiler was used and which C
536library, but when comparing programs with and without debugging symbols the
537difference will generally be a factor between 2 and 5.</para>
538
539<para>As most people will probably never use a debugger on their system
540software, a lot of disk space can be regained by removing these symbols. For
541your convenience, the next section shows how to strip all debugging symbols
542from all programs and libraries. Information on other ways of optimizing your
543system can be found in the hint at <ulink
544url="&hints-root;optimization.txt"/>.</para>
545
546</sect1>
547
548
549<sect1 id="ch-system-strippingagain">
550<title>Stripping again</title>
551<?dbhtml filename="strippingagain.html" dir="chapter06"?>
552
553<para>If you are not a programmer and don't plan to do any debugging on your
554system software, you can shrink your system by about 200 MB by removing the
555debugging symbols from binaries and libraries. This causes no inconvenience
556other than not being able to debug the software fully any more.</para>
557
558<para>Most people who use the command mentioned below don't experience any
559problems. But it is easy to make a typo and render your new system unusable, so
560before running the strip command it is probably a good idea to make a backup of
561the current situation.</para>
562
563<para>If you are going to perform the stripping, special care is needed to
564ensure you're not running any of the binaries that are about to be stripped.
565If you're not sure whether you entered chroot with the command given in
566<xref linkend="ch-system-chroot"/>, then now exit from chroot and reenter it
567with the following commands:</para>
568
569<screen><userinput>logout; chroot $LFS /tools/bin/env -i \
570&nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
571&nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin \
572&nbsp;&nbsp;&nbsp;&nbsp;/tools/bin/bash --login</userinput></screen>
573
574<para>Now you can safely strip the binaries and libraries:</para>
575
576<screen><userinput>/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
577&nbsp;&nbsp;&nbsp;-exec /tools/bin/strip --strip-debug '{}' ';'</userinput></screen>
578
579<para>A large number of files will be reported as having their file format not
580recognized. These warnings can be safely ignored, they just mean that those
581files are scripts instead of binaries, no harm is done.</para>
582
583<para>If you are really tight on disk space, you may want to use
584<emphasis>--strip-all</emphasis> on the binaries in
585<filename>/{,usr/}{bin,sbin}</filename> to gain several more megabytes. But do
586<emphasis>not</emphasis> use this option on libraries: they would be
587destroyed.</para>
588
589</sect1>
590
591
592<sect1 id="ch-system-revisedchroot">
593<title>Cleaning up</title>
594<?dbhtml filename="revisedchroot.html" dir="chapter06"?>
595
596<para>From now on, when you exit the chroot environment and wish to reenter
597it, you should use the following modified chroot command:</para>
598
599<screen><userinput>chroot $LFS /usr/bin/env -i \
600&nbsp;&nbsp;&nbsp;&nbsp;HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
601&nbsp;&nbsp;&nbsp;&nbsp;PATH=/bin:/usr/bin:/sbin:/usr/sbin \
602&nbsp;&nbsp;&nbsp;&nbsp;/bin/bash --login</userinput></screen>
603
604<para>The reason for this is that, since the programs in <filename
605class="directory">/tools</filename> are no longer needed, you may want to
606delete the whole directory and regain the space. Before actually deleting the
607directory, exit from chroot and reenter it with the above command. Also, before
608removing <filename class="directory">/tools</filename>, you may want to tar it
609up and store it in a safe place, in case you want build another LFS system
610soon.</para>
611
612<note><para>Removing <filename class="directory">/tools</filename> will also
613remove the temporary copies of Tcl, Expect and DejaGnu, which were used for
614running the toolchain tests. If you want to use these programs later on, you
615will need to recompile and re-install them. The installation instructions are
616the same as in <xref linkend="chapter-temporary-tools"/>, apart from changing
617the prefix from <emphasis>/tools</emphasis> to <emphasis>/usr</emphasis>. The
618BLFS book discusses a slightly different approach to installing Tcl, see <ulink
619url="&blfs-root;"/>.</para></note>
620
621<para>You may also want to move the packages and patches stored in <filename
622class="directory">/sources</filename> to a more usual location, such as
623<filename class="directory">/usr/src/packages</filename>, and remove the
624directory -- or simply delete the whole directory if you've burned its contents
625on a CD).</para>
626
627</sect1>
628
629</chapter>
630
Note: See TracBrowser for help on using the repository browser.