chapter06.xml 18 KB

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