Add some minor text tweaks
[linux_from_scratch.git] / chapter06 / createfiles.xml
blobdcc03406290cc1471d1f5b22003be5d9676dd974
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3   "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4   <!ENTITY % general-entities SYSTEM "../general.ent">
5   %general-entities;
6 ]>
8 <sect1 id="ch-system-createfiles">
9   <?dbhtml filename="createfiles.html"?>
11   <title>Creating Essential Files and Symlinks</title>
13   <indexterm zone="ch-system-createfiles">
14     <primary sortas="e-/etc/passwd">/etc/passwd</primary>
15   </indexterm>
17   <indexterm zone="ch-system-createfiles">
18     <primary sortas="e-/etc/group">/etc/group</primary>
19   </indexterm>
21   <indexterm zone="ch-system-createfiles">
22     <primary sortas="e-/var/run/utmp">/var/run/utmp</primary>
23   </indexterm>
25   <indexterm zone="ch-system-createfiles">
26     <primary sortas="e-/var/log/btmp">/var/log/btmp</primary>
27   </indexterm>
29   <indexterm zone="ch-system-createfiles">
30     <primary sortas="e-/var/log/lastlog">/var/log/lastlog</primary>
31   </indexterm>
33   <indexterm zone="ch-system-createfiles">
34     <primary sortas="e-/var/log/wtmp">/var/log/wtmp</primary>
35   </indexterm>
37   <para>Some programs use hard-wired paths to programs which do not exist yet.
38   In order to satisfy these programs, create a number of symbolic links which
39   will be replaced by real files throughout the course of this chapter after the
40   software has been installed:</para>
42 <screen><userinput>ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin
43 ln -sv /tools/bin/{env,install,perl}                /usr/bin
44 ln -sv /tools/lib/libgcc_s.so{,.1}                  /usr/lib
45 ln -sv /tools/lib/libstdc++.{a,so{,.6}}             /usr/lib
47 install -vdm755 /usr/lib/pkgconfig
49 ln -sv bash /bin/sh</userinput></screen>
51 <!--for lib in blkid lzma mount uuid
53     ln -sv /tools/lib/lib$lib.so* /usr/lib
54 done-->
55 <!--ln -svf /tools/include/blkid    /usr/include
56 ln -svf /tools/include/libmount /usr/include
57 ln -svf /tools/include/uuid     /usr/include-->
58 <!--for pc in blkid mount uuid
60     sed 's@tools@usr@g' /tools/lib/pkgconfig/${pc}.pc \
61         > /usr/lib/pkgconfig/${pc}.pc
62 done-->
63   <variablelist>
64     <title>The purpose of each link:</title>
66     <varlistentry>
67       <term><parameter><filename>/bin/bash</filename></parameter></term>
68       <listitem>
69         <para>Many <command>bash</command> scripts specify
70         <filename>/bin/bash</filename>.</para>
71       </listitem>
72     </varlistentry>
74     <varlistentry>
75       <term><parameter><filename>/bin/cat</filename></parameter></term>
76       <listitem>
77         <para>This pathname is hard-coded into Glibc's configure script.</para>
78       </listitem>
79     </varlistentry>
81     <varlistentry>
82       <term><parameter><filename>/bin/dd</filename></parameter></term>
83       <listitem>
84         <para>The path to <filename>dd</filename> will be hard-coded into the
85         <filename>/usr/bin/libtool</filename> utility.</para>
86       </listitem>
87     </varlistentry>
89     <varlistentry>
90       <term><parameter><filename>/bin/echo</filename></parameter></term>
91       <listitem>
92         <para>This is to satisfy one of the tests in Glibc's test suite, which
93         expects <filename>/bin/echo</filename>.</para>
94       </listitem>
95     </varlistentry>
97     <varlistentry>
98       <term><parameter><filename>/usr/bin/env</filename></parameter></term>
99       <listitem>
100         <para>This pathname is hard-coded into some packages build procedures.
101         <!-- systemd  This may not be needed if we move sysd to the end--></para>
102       </listitem>
103     </varlistentry>
105     <varlistentry>
106       <term><parameter><filename>/usr/bin/install</filename></parameter></term>
107       <listitem>
108         <para>The path to <filename>install</filename> will be hard-coded into
109         the <filename>/usr/lib/bash/Makefile.inc</filename> file.</para>
110       </listitem>
111     </varlistentry>
113     <varlistentry>
114       <term><parameter><filename>/bin/ln</filename></parameter></term>
115       <listitem>
116         <para>The path to <filename>ln</filename> will be hard-coded into the
117         <filename>/usr/lib/perl5/&perl-version;/&lt;target-triplet&gt;/Config_heavy.pl</filename>
118          file.</para>
119       </listitem>
120     </varlistentry>
122     <varlistentry>
123       <term><parameter><filename>/bin/pwd</filename></parameter></term>
124       <listitem>
125         <para>Some <command>configure</command> scripts, particularly Glibc's,
126         have this pathname hard-coded.</para>
127       </listitem>
128     </varlistentry>
130     <varlistentry>
131       <term><parameter><filename>/bin/rm</filename></parameter></term>
132       <listitem>
133         <para>The path to <filename>rm</filename> will be hard-coded into the
134         <filename>/usr/lib/perl5/&perl-version;/&lt;target-triplet&gt;/Config_heavy.pl</filename>
135          file.</para>
136       </listitem>
137     </varlistentry>
139     <varlistentry>
140       <term><parameter><filename>/bin/stty</filename></parameter></term>
141       <listitem>
142         <para>This pathname is hard-coded into Expect, therefore it is needed
143         for Binutils and GCC test suites to pass.</para>
144       </listitem>
145     </varlistentry>
147     <varlistentry>
148       <term><parameter><filename>/usr/bin/perl</filename></parameter></term>
149       <listitem>
150         <para>Many Perl scripts hard-code this path to the
151         <command>perl</command> program.</para>
152       </listitem>
153     </varlistentry>
155     <varlistentry>
156       <term><parameter><filename>/usr/lib/libgcc_s.so{,.1}</filename></parameter></term>
157       <listitem>
158         <para>Glibc needs this for the pthreads library to work.</para>
159       </listitem>
160     </varlistentry>
162     <varlistentry>
163       <term><parameter><filename>/usr/lib/libstdc++{,.6}</filename></parameter></term>
164       <listitem>
165         <para>This is needed by several tests in Glibc's test suite, as well as
166         for C++ support in GMP.</para>
167       </listitem>
168     </varlistentry>
169 <!--
170     <varlistentry>
171       <term><parameter><filename>/usr/lib/libstdc++.la</filename></parameter></term>
172       <listitem>
173         <para>This prevents a <filename class="directory">/tools</filename>
174         reference that would otherwise be in
175         <filename>/usr/lib/libstdc++.la</filename> after GCC is installed.</para>
176       </listitem>
177     </varlistentry>
179     <!--<varlistentry revision="systemd">-->
180 <!--    <varlistentry>
181       <term><parameter><filename>/usr/lib/lib{blkid,lzma,mount,uuid}.{a,la,so*}</filename></parameter></term>
182       <listitem>
183         <para>These links prevent utilities from acquiring an
184         unnecessary reference to the
185         <filename class="directory">/tools</filename> directory.</para>
186       </listitem>
187     </varlistentry>-->
189     <varlistentry>
190       <term><parameter><filename>/bin/sh</filename></parameter></term>
191       <listitem>
192         <para>Many shell scripts hard-code <filename>/bin/sh</filename>.</para>
193       </listitem>
194     </varlistentry>
196   </variablelist>
198   <para>Historically, Linux maintains a list of the mounted file systems in the
199   file <filename>/etc/mtab</filename>. Modern kernels maintain this list
200   internally and exposes it to the user via the <filename
201   class="directory">/proc</filename> filesystem. To satisfy utilities that
202   expect the presence of <filename>/etc/mtab</filename>, create the following
203   symbolic link:</para>
205 <screen><userinput>ln -sv /proc/self/mounts /etc/mtab</userinput></screen>
207   <para>In order for user <systemitem class="username">root</systemitem> to be
208   able to login and for the name <quote>root</quote> to be recognized, there
209   must be relevant entries in the <filename>/etc/passwd</filename> and
210   <filename>/etc/group</filename> files.</para>
212   <para>Create the <filename>/etc/passwd</filename> file by running the following
213   command:</para>
215 <screen revision="sysv"><userinput>cat &gt; /etc/passwd &lt;&lt; "EOF"
216 <literal>root:x:0:0:root:/root:/bin/bash
217 bin:x:1:1:bin:/dev/null:/bin/false
218 daemon:x:6:6:Daemon User:/dev/null:/bin/false
219 messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
220 nobody:x:99:99:Unprivileged User:/dev/null:/bin/false</literal>
221 EOF</userinput></screen>
223 <screen revision="systemd"><userinput>cat &gt; /etc/passwd &lt;&lt; "EOF"
224 <literal>root:x:0:0:root:/root:/bin/bash
225 bin:x:1:1:bin:/dev/null:/bin/false
226 daemon:x:6:6:Daemon User:/dev/null:/bin/false
227 messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
228 systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
229 systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
230 systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
231 systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
232 systemd-network:x:76:76:systemd Network Management:/:/bin/false
233 systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
234 systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
235 systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
236 nobody:x:99:99:Unprivileged User:/dev/null:/bin/false</literal>
237 EOF</userinput></screen>
239   <para>The actual password for <systemitem class="username">root</systemitem>
240   (the <quote>x</quote> used here is just a placeholder) will be set later.</para>
242   <para>Create the <filename>/etc/group</filename> file by running the following
243   command:</para>
245 <screen revision="sysv"><userinput>cat &gt; /etc/group &lt;&lt; "EOF"
246 <literal>root:x:0:
247 bin:x:1:daemon
248 sys:x:2:
249 kmem:x:3:
250 tape:x:4:
251 tty:x:5:
252 daemon:x:6:
253 floppy:x:7:
254 disk:x:8:
255 lp:x:9:
256 dialout:x:10:
257 audio:x:11:
258 video:x:12:
259 utmp:x:13:
260 usb:x:14:
261 cdrom:x:15:
262 adm:x:16:
263 messagebus:x:18:
264 input:x:24:
265 mail:x:34:
266 kvm:x:61:
267 wheel:x:97:
268 nogroup:x:99:
269 users:x:999:</literal>
270 EOF</userinput></screen>
272 <screen revision="systemd"><userinput>cat &gt; /etc/group &lt;&lt; "EOF"
273 <literal>root:x:0:
274 bin:x:1:daemon
275 sys:x:2:
276 kmem:x:3:
277 tape:x:4:
278 tty:x:5:
279 daemon:x:6:
280 floppy:x:7:
281 disk:x:8:
282 lp:x:9:
283 dialout:x:10:
284 audio:x:11:
285 video:x:12:
286 utmp:x:13:
287 usb:x:14:
288 cdrom:x:15:
289 adm:x:16:
290 messagebus:x:18:
291 systemd-journal:x:23:
292 input:x:24:
293 mail:x:34:
294 kvm:x:61:
295 systemd-bus-proxy:x:72:
296 systemd-journal-gateway:x:73:
297 systemd-journal-remote:x:74:
298 systemd-journal-upload:x:75:
299 systemd-network:x:76:
300 systemd-resolve:x:77:
301 systemd-timesync:x:78:
302 systemd-coredump:x:79:
303 wheel:x:97:
304 nogroup:x:99:
305 users:x:999:</literal>
306 EOF</userinput></screen>
308   <para>The created groups are not part of any standard&mdash;they are groups
309   decided on in part by the requirements of the Udev configuration in this
310   chapter, and in part by common convention employed by a number of existing
311   Linux distributions. In addition, some test suites rely on specific users
312   or groups.  The Linux Standard Base (LSB, available at <ulink
313   url="http://www.linuxbase.org"/>) recommends only that, besides the group
314   <systemitem class="groupname">root</systemitem> with a Group ID (GID) of 0,
315   a group <systemitem class="groupname">bin</systemitem> with a GID of 1 be
316   present. All other group names and GIDs can be chosen freely by the system
317   administrator since well-written programs do not depend on GID numbers, but
318   rather use the group's name.</para>
320   <para>To remove the <quote>I have no name!</quote> prompt, start a new
321   shell. Since a full Glibc was installed in <xref
322   linkend="chapter-temporary-tools"/> and the
323   <filename>/etc/passwd</filename> and <filename>/etc/group</filename>
324   files have been created, user name and group name resolution will now
325   work:</para>
327 <screen role="nodump"><userinput>exec /tools/bin/bash --login +h</userinput></screen>
329   <para>Note the use of the <parameter>+h</parameter> directive. This tells
330   <command>bash</command> not to use its internal path hashing. Without this
331   directive, <command>bash</command> would remember the paths to binaries it has
332   executed. To ensure the use of the newly compiled binaries as soon as they are
333   installed, the <parameter>+h</parameter> directive will be used for the duration
334   of this chapter.</para>
336   <para>The <command>login</command>, <command>agetty</command>, and
337   <command>init</command> programs (and others) use a number of log
338   files to record information such as who was logged into the system and
339   when. However, these programs will not write to the log files if they
340   do not already exist. Initialize the log files and give them
341   proper permissions:</para>
343 <screen><userinput>touch /var/log/{btmp,lastlog,faillog,wtmp}
344 chgrp -v utmp /var/log/lastlog
345 chmod -v 664  /var/log/lastlog
346 chmod -v 600  /var/log/btmp</userinput></screen>
348   <para>The <filename>/var/log/wtmp</filename> file records all logins and
349   logouts. The <filename>/var/log/lastlog</filename> file records when each
350   user last logged in. The <filename>/var/log/faillog</filename> file records
351   failed login attempts.  The <filename>/var/log/btmp</filename> file records
352   the bad login attempts.</para>
354   <note><para>The <filename>/run/utmp</filename> file records the users that
355   are currently logged in.  This file is created dynamically in the boot
356   scripts.</para></note>
358 </sect1>