source: postlfs/config/bootdisk.xml@ f08629c8

10.0 10.1 11.0 11.1 11.2 11.3 12.0 12.1 6.0 6.1 6.2 6.2.0 6.2.0-rc1 6.2.0-rc2 6.3 6.3-rc1 6.3-rc2 6.3-rc3 7.10 7.4 7.5 7.6 7.6-blfs 7.6-systemd 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 9.0 9.1 basic bdubbs/svn elogind gnome kde5-13430 kde5-14269 kde5-14686 kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts krejzi/svn lazarus lxqt nosym perl-modules plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition systemd-11177 systemd-13485 trunk upgradedb v5_1 v5_1-pre1 xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since f08629c8 was bde6e5a4, checked in by Igor Živković <igor@…>, 20 years ago

rescue disk typo fix

git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@1505 af4574ff-66df-0310-9fd7-8a98e5e911e0

  • Property mode set to 100644
File size: 32.6 KB
Line 
1<sect1 id="postlfs-config-bootdisk">
2<?dbhtml filename="bootdisk.html" dir="postlfs"?>
3<title>Creating a Custom Boot Disk</title>
4
5<sect2>
6<title>Decent Rescue Boot Disk Needs</title>
7<para>This section is really about creating a <emphasis>rescue</emphasis>
8diskette. As the name <emphasis>rescue</emphasis> implies, the host
9system has a problem, often lost partition information or corrupted file
10systems, that prevents it from booting and/or operating normally. For
11this reason, you <emphasis>must not</emphasis> depend on resources from
12the host being "rescued". To presume that any given partition or hard
13drive <emphasis>will</emphasis> be available is a risky presumption.</para>
14
15<para>Heeding the warning, the rescue disk created here has no
16dependency on the host system's resources, other than basic bootability
17and hardware soundness. At a minimum, the most common sorts of failures
18requiring a rescue boot disk should be addressed by the contents of the
19boot disk. This would include the common loss of partitioning (master
20boot record is lost or corrupted), file system corruption, and the need
21to allow creation and editing of files that may have been lost or
22corrupted, possibly as an effect of the other two problems.</para>
23
24<para>Additional utilities should be available to search for text or
25files, copy, move and remove files, and many other normal operations
26that might be expected to be needed when reconstructing.</para>
27</sect2>
28
29<sect2>
30<title>This Minimal Decent Rescue Disk</title>
31
32<para>The intent here is to create a "rescue boot disk" that will support
33the common operations listed above. These functions are provided by
34including selected executables from <application><ulink
35url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
36</ulink></application> and <application><ulink
37url="http://freshmeat.net/projects/e2fsprogs/">e2fsprogs</ulink></application>.
38A basic editor and rudimentary disk partitioning utility may also be
39optionally included.</para>
40
41<para>This, however, is not the limit. A minimal disk is described
42here, but you can add anything you can fit on the floppy. Furthermore,
43if one floppy is not enough to meet your needs, you can make a
44multi-diskette rescue set that means, essentially, the sky is the limit.
45This is discussed below. The number of other possible variations are
46just too numerous to mention here.</para>
47</sect2>
48
49<sect2>
50<title>Build the Rescue Boot Disk</title>
51<sect3>
52<title>Prerequisites</title>
53
54<para>You should have known-good floppy diskettes available. Some
55people prefer to use the <command>fdformat</command> command to prepare
56these because it also does a verification. See the man page for more
57details. Another good idea is to always prepare duplicates of the
58rescue diskette. Media does deteriorate.</para>
59
60<para>These instructions presume a base <acronym>LFS</acronym> install
61using ext2/ext3 file systems.</para>
62
63<para>The kernel versions 2.4.22 and 2.6 before test6 have a deficiency
64that prevents busybox and similar applications from booting correctly.
65You need to download and apply the
66<ulink url="&patch-root;/linux-2.4.22-init-1.patch">init-1</ulink>
67patch that corrects this, letting busybox be used for our
68application, and rebuild your kernel. Take care of the below kernel
69items while you are at it.</para>
70
71<para>You need to have loopback device support enabled in your host's
72kernel to use this procedure.</para>
73
74<para>You should make a custom kernel that includes only those features
75needed to rescue your system, so it will have the least size. No
76sense in building in support for things like <application>XFree86</application>,
77<application>DRI</application>, etc, as most rescues are performed from the
78command prompt. Along the same lines, if you have <xref linkend="gcc2"/>, it
79is known to produce smaller kernels. So you might want to use that
80compiler for this kernel. If you do so, don't overlook any loadable
81modules (which are not addressed here) you might need - they need to be
82compiled with same compiler used to make the kernel.</para>
83
84<para>The rescue image must include support for the file system of your
85choice (we presume ext2/3 here), ramdisk and initial ramdisk (initrd).
86Disable everything that you can in the kernel configuration. You should
87keep support for the proc file system and tempfs file system enabled
88because of their general utility. The proc file system is needed for
89the <command>mount</command> to report properly.</para>
90
91<para>If you install <emphasis>only</emphasis> the minimal set of
92components shown in this document, you will need a kernel that is 643 or
93fewer blocks in size. If you want the optional programs - a very basic
94editor, like <command>ed</command>, and rudimentary disk partitioning, like
95<command>sfdisk</command> - the kernel will need to be 595 or fewer blocks in
96size. This should not be a major problem unless your needs are fairly
97esoteric. On the system used to develop this version of the procedures, using
98only ext2 file systems and not using networking or <acronym>CD</acronym>s for
99recovery, the kernel image is only 481 blocks. And there may be more to gain - it has not been closely examined for additional gains.</para>
100
101<para>This kernel image will be called "rescueimage" hereinafter. You
102can actually name your image anything you like and just use its name
103instead in any commands that include "rescueimage".</para>
104
105<para>If you can not get your rescueimage down to the size needed to allow
106all you need on the ramdisk image, don't fret. You can always build a
107two diskette set, one boot and one root diskette. The kernel will prompt
108you to insert the root file system diskette. This will allow room for a
109compressed ramdisk image of 1440 blocks and a rescueimage of the same
110size.</para>
111
112<para>The rescueimage size limits given above are likely to vary as
113local system-specific configurations change. Use them only as a
114guideline and not as gospel. The size of rescueimage as shown by
115<command>ls -sk</command> is only an approximation because of some
116"overhead". On the system used to develop this version of these
117procedures, that command shows 488 blocks but the actual number of
118blocks written is only 480 and a fraction, which means that 481 blocks
119are actually used.</para>
120</sect3>
121
122<sect3>
123<title>Rescue Disk Build Process</title>
124
125<para>The basic process will be:</para>
126<itemizedlist>
127<listitem><para>make a mount point for a file system</para></listitem>
128<listitem><para>make an empty file to hold the file system</para></listitem>
129<listitem><para>bind the empty file to a loopback device</para></listitem>
130<listitem><para>make a 4MB file system</para></listitem>
131<listitem><para>mount the file system</para></listitem>
132<listitem><para>add components to the file system</para></listitem>
133<listitem><para>make the compressed initrd</para></listitem>
134<listitem><para>join rescueimage and initrd onto a diskette</para></listitem>
135</itemizedlist>
136
137<para>The initial ramdisk will be automatically loaded at boot time if
138setup is done correctly.</para>
139
140<para><emphasis>Make a mount point and an empty file to hold a file
141system</emphasis></para>
142
143<screen><userinput><command>mkdir -p /mnt/loop1
144dd if=/dev/zero of=/tmp/rfloppy bs=1k count=4096</command></userinput></screen>
145
146<para><emphasis>Command explanations</emphasis></para>
147
148<para><command>dd</command>: This is a generalized input-to-output copy
149utility that also has many transformation capabilities.</para>
150
151<para><parameter>if=/dev/zero</parameter>: This parameter assigns
152<command>dd</command>'s input file to a device that returns an infinite
153stream of zeroes.</para>
154
155<para><parameter>of=/tmp/rfloppy</parameter>: This parameter directs
156<command>dd</command>'s output to <filename>/tmp/rfloppy</filename>.</para>
157
158<para><parameter>bs=1k count=4096</parameter>: These parameters tell
159<command>dd</command> to read and write in "chunks" of 1024 bytes and
160process 4096 "chunks".</para>
161
162<para><emphasis>Bind the file to a loopback device, make a file system and mount it.</emphasis></para>
163
164<para>The reason these commands are used is that they work regardless of
165the version of <command>mount</command> (older ones don't have the
166<userinput>-o loop</userinput> option) or if <filename>/etc/mtab</filename>
167is symlinked to <filename class="directory">/proc</filename> (which causes mount to be
168unable to properly "unbind" a loop device, due to "lost" information).
169An alternate set of commands is provided, after these three commands,
170that you can use if you don't have either of these situations.</para>
171
172<screen><userinput><command>losetup /dev/loop1 /tmp/rfloppy
173mke2fs -m 0 -N 504 /dev/loop1
174mount -t ext2 /dev/loop1 /mnt/loop1</command></userinput></screen>
175
176<para><emphasis>Command explanations</emphasis></para>
177
178<para><command>losetup /dev/loop1 /tmp/rfloppy</command>: This
179command "binds" a loopback device to the empty file.</para>
180
181<para><command>mke2fs -m 0 -N 504 /dev/loop1</command>: This
182command makes an ext2 file system on the loopback device (which really
183means it is created in the file to which the loopback device is bound)
184and reserves no blocks. The <userinput>-N 504</userinput> parameter causes
185only 504 inodes to be allocated, leaving more space for other things needed
186in the file system.</para>
187
188<para><command>mount -t ext2 /dev/loop1 /mnt/loop1</command>: This
189mounts the file system just created, just as if it were a real device,
190like a hard drive or diskette. This allows all the normal system I/O
191commands to operate as if a real device were present.</para>
192
193<para>If your <command>mount</command> supports the
194<option>-o loop</option> option <emphasis>and</emphasis> your
195<filename>/etc/mtab</filename> is a real file, rather than a symlink to
196<filename class="directory">/proc</filename>, the three above commands can be replaced
197by these next two commands.</para>
198
199<screen><userinput><command>mke2fs -F -m 0 -N 504 /tmp/rfloppy
200mount -o loop /tmp/rfloppy /mnt/loop1</command></userinput></screen>
201
202<para><emphasis>Command explanations</emphasis></para>
203
204<para><command>mke2fs -F -m 0 -N 504 /tmp/rfloppy</command>: As before,
205a file system is made, with only 504 inodes and no reserved blocks, that
206will be bound to a loopback device. The <userinput>-F</userinput> parameter
207just suppresses an irritating question issued when
208<command>mke2fs</command> realizes that you are not accessing a
209device.</para>
210
211<para><command>mount -o loop /tmp/rfloppy /mnt/loop1</command>: This
212command tells <command>mount</command> to bind the named file to a
213loopback device it automatically selects (the first available) and mount
214the device on <filename class="directory">/mnt/loop1</filename>.</para>
215
216<para><emphasis>Add components to the file system</emphasis></para>
217
218<para><emphasis>A cautionary note:</emphasis> if you are not running in a
219<command>chroot</command> environment, be sure that you do not accidentally
220omit the <filename class="directory">/mnt/loop1</filename> reference in the commands. If
221you do so, you might replace the equivalent components on your host with
222the components that are installed by these procedures. Even if you are
223in a chroot environment, you may need to be careful if the environment
224is your freshly built <acronym>LFS</acronym> system which you intend to
225use as a host in the future.</para>
226
227<para>First, to have as much free space as possible, remove the
228<filename>lost+found</filename> directory, which is not needed because
229it is only used by <command>fsck</command>. Since <command>fsck</command>
230will never be run on this file system, it is unneeded.</para>
231
232<screen><userinput><command>rmdir /mnt/loop1/lost+found/</command></userinput></screen>
233
234<para>Now make a minimal set of directories.</para>
235
236<screen><userinput><command>mkdir /mnt/loop1/{dev,proc,etc,sbin,bin,lib,mnt,usr,var}</command></userinput></screen>
237
238<para>Add needed device files to the initrd image. If you use devfs,
239the following command works well, as you only have the devices you use
240anyway.</para>
241
242<screen><userinput><command>cp -dpR /dev/* /mnt/loop1/dev</command></userinput></screen>
243
244<para>If you used <command>MAKEDEV</command> to create your devices on
245your host, you'll want to use something similar to this longer command,
246to minimize wasting space with unneeded inodes.</para>
247
248<para><emphasis>You must modify this to suit your rescueimage configuration and
249other needs.</emphasis> For example, you may need
250<acronym>SCSI</acronym> devices and may not need
251frame buffer devices or the pseudo-terminal directory. Also, the number
252of hard drives and partitions that you include should be the minimal
253that you need. Extensive analysis has not been done on the list below,
254so there are more inodes and space to be gained by "fine tuning" this
255set.</para>
256
257<screen><userinput><command>mkdir /mnt/loop1/dev/pts
258cp -a \
259&nbsp;&nbsp;&nbsp;&nbsp;/dev/null /dev/console \
260&nbsp;&nbsp;&nbsp;&nbsp;/dev/fb[0-7] /dev/fd /dev/fd0 /dev/fd0h1440 /dev/full \
261&nbsp;&nbsp;&nbsp;&nbsp;/dev/hda* /dev/hdb* /dev/hdc* /dev/hdd* /dev/initctl /dev/kmem \
262&nbsp;&nbsp;&nbsp;&nbsp;/dev/loop[0-3] /dev/lp0 /dev/mem /dev/port \
263&nbsp;&nbsp;&nbsp;&nbsp;/dev/psaux /dev/ram \
264&nbsp;&nbsp;&nbsp;&nbsp;/dev/ram0 /dev/ram1 /dev/ram2 /dev/ram3 /dev/random /dev/rtc \
265&nbsp;&nbsp;&nbsp;&nbsp;/dev/shm /dev/stderr /dev/stdin /dev/stdout /dev/tty \
266&nbsp;&nbsp;&nbsp;&nbsp;/dev/tty[0-9] /dev/ttyS0 /dev/ttyS1 /dev/urandom /dev/zero \
267&nbsp;&nbsp;/mnt/loop1/dev</command></userinput></screen>
268
269<para><emphasis>What is needed in the <filename class="directory">/etc</filename>
270directory</emphasis></para>
271
272<para>If you choose, you can copy all or selected parts of your
273<filename>/etc/passwd</filename> and <filename>/etc/group</filename>
274files. But even if each is less than 1024 bytes, you will lose two
275inodes and two blocks of space on the initial ramdisk. This only really
276matters because of trying to squeeze everything onto a 1.44MB
277diskette. Every little bit helps. The strategy taken here is to create
278these two files as part of the rescue boot and initialization process.
279The commands that make the two files will be embedded inside the
280<filename>rcS</filename> script that <filename>linuxrc</filename>
281(really <application><ulink
282url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
283</ulink></application>) invokes after the initrd is
284loaded. This way no more inodes or blocks are used on the
285diskette to carry these files.</para>
286
287<para>Some might like to copy their <filename class="directory">/etc/rc*</filename>
288directory into the ramdisk image, but this may have no value, other
289than archival use, in a worst-case recovery scenario. If you want
290automatic initialization of the system after repair, they may have some
291value. But few people need or want this to happen. If the file system
292on the hard drives are corrupted, what good will mount scripts do? Some
293scripts may be useful, like access to a network to copy over backup data
294when the hard drive's file systems are usable again. The point is that
295you should copy only the parts that you can use because space is at a
296premium on the diskette.</para>
297
298<para>Here, only the <filename>fstab</filename> will be included. This
299is handy because it eases mounting of partitions that may be useful and
300also can be examined and used as a guide as to what is available and
301what may need reconstruction. Because it may be larger than needed, you
302should edit it to remove any useless entries and minimize commentary.
303No other editing is needed because the boot scripts are not included and
304no automatic mounting will be done using the <filename>fstab</filename>.
305If you decide to include some boot scripts that might try to mount
306things, change the <filename>fstab</filename>'s entries to
307<command>noauto</command> in the options field so they don't cause an
308attempt to mount a potentially corrupt partition. Copy it to
309<filename class="directory">/tmp</filename>, edit it as desired and then:</para>
310
311<screen><userinput><command>cp -a /tmp/fstab /mnt/loop1/etc</command></userinput></screen>
312
313<para>Now the initialization script will be added. As mentioned above,
314<command>linuxrc</command> is symlinked to <application><ulink
315url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
316</ulink></application>.
317After the kernel and initial ramdisk have been loaded, the kernel gives
318control to <command>linuxrc</command> (<application><ulink
319url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
320</ulink></application>). It wants to run an <filename class="directory">/etc/init.d/rcS</filename>
321script to do any initial setup.</para>
322
323<para>If you use devfsd, you will need to set up the
324<filename>rcS</filename> script to handle the devfsd startup. Put the
325following commands in <filename class="directory">/mnt/loop1/etc/init.d/rcS</filename>.
326You may also want to add some of the processes shown in the non-devfs
327version that follows.</para>
328
329<screen><userinput>#!/bin/sh
330mount -t devfs devfs /dev
331/sbin/devfsd /dev</userinput></screen>
332
333<para>If you don't use devfsd, but created a static <filename
334class="directory">/dev</filename>
335directory using <command>MAKEDEV</command>, or any similar process, the
336<filename>rcS</filename> script will do slightly different things.
337Also, don't forget that it is creating the
338<filename>/etc/passwd</filename> and <filename>/etc/group</filename>
339files, thus saving space on the diskette.</para>
340
341<para>The script made next will mount <filename class="directory">/proc</filename>, turn
342on swap (no harm is done if it fails), make the
343<filename>/etc/passwd</filename> and <filename>/etc/group</filename>
344files, create a log directory and turn on swapping. Create the script
345with:</para>
346
347<screen><userinput><command>mkdir -p /mnt/loop1/etc/init.d
348cat &gt;/mnt/loop1/etc/init.d/rcS &lt;&lt; EOD</command>
349#!/bin/sh
350mount -t proc proc /proc
351swapon -a
352
353echo "root:x:0:0:root:/root:/bin/bash" &gt; /etc/passwd
354
355<command>cat &gt; /etc/group &lt;&lt;EOF</command>
356root:x:0:
357bin:x:1:
358sys:x:2:
359kmem:x:3:
360tty:x:4:
361tape:x:5:
362daemon:x:6:
363floppy:x:7:
364disk:x:8:
365lp:x:9:
366dialout:x:10:
367audio:x:11:
368<command>EOF
369chmod 644 /etc/passwd /etc/group</command>
370
371mkdir /var/log
372
373<command>EOD
374chmod u+x /mnt/loop1/etc/init.d/rcS</command></userinput></screen>
375
376<para>Unless you add a lot to this script, which <emphasis>is</emphasis>
377encouraged, the above should be reasonably close to what you need.</para>
378
379<para><emphasis>Install packages</emphasis></para>
380
381<para>There are two packages that must be installed. The <application><ulink
382url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox</ulink></application>
383package incorporates the core functions that provide a shell and many
384basic utilities. A file system package, like <application><ulink
385url="http://freshmeat.net/projects/e2fsprogs/">e2fsprogs</ulink></application>, or
386a package for the file system you are using, will provide a minimal
387set of utilities for file system checking and reconstruction. The whole
388package will not be installed, but only certain needed components.</para>
389
390<para>If you use devfsd, you will also need to install that software.</para>
391
392<para>Install <application><ulink
393url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox</ulink></application>
394into the initial ramdisk image. Busybox incorporates many Unix utility
395program functions into a single small executable file.</para>
396
397<screen><userinput><command>make &amp;&amp;
398make PREFIX=/mnt/loop1 install &amp;&amp;
399&gt; /mnt/loop1/var/utmp</command></userinput></screen>
400
401<para>A <filename>var/utmp</filename> is made because <application><ulink
402url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox</ulink></application>
403needs it for the reboot command to work properly. If this file doesn't
404exist when <application><ulink
405url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox</ulink></application>
406is started, the reboot command will not work. This would be a bad thing
407for people that have no reset button available to them.</para>
408
409<para>If you use devfs to create devices on the fly and free up precious
410inodes on the floppy, you'll also install devfsd to facilitate the
411devices that <application><ulink
412url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox</ulink></application>
413expects to find. Use the following commands to do the install.</para>
414
415<screen><userinput><command>mv GNUmakefile Makefile &amp;&amp;
416make &amp;&amp;
417make PREFIX=/mnt/loop1 install &amp;&amp;</command></userinput></screen>
418
419<para><emphasis>Install part of <application>e2fsprogs</application></emphasis></para>
420
421<para>If you use the ext2 or ext3 (journaling) file system, you can use
422the commands below to install the minimal functionality that should
423allow you to get your hard drives usable again. If you use ext3, keep in
424mind that it is a part of the <application>e2fsprogs</application>
425package and you can get the components, which are mostly hard links,
426from the same places shown below. If you use some other file system,
427such as reiserfs, you should apply the <emphasis>principals</emphasis>
428you see here to install parts of that package instead.</para>
429
430<screen><userinput><command>LDFLAGS='-s'
431mkdir build &amp;&amp;
432cd build &amp;&amp;
433../configure --prefix=/mnt/loop1/usr --with-root-prefix="" \
434 --disable-swapfs --disable-debugfs \
435 --enable-dynamic-e2fsck --disable-nls --disable-evms \
436 --disable-rpath &amp;&amp;
437make LDFLAGS="$LDFLAGS" &amp;&amp;
438strip -p --strip-unneeded --remove-section=.comment \
439 -o /mnt/loop1/sbin/mke2fs misc/mke2fs &amp;&amp;
440strip -p --strip-unneeded --remove-section=.comment \
441 -o /mnt/loop1/sbin/e2fsck e2fsck/e2fsck &amp;&amp;
442chmod 555 /mnt/loop1/sbin/{mke2fs,e2fsck}
443</command></userinput></screen>
444
445<para><emphasis>Two useful utilities</emphasis></para>
446
447<para>There are two very useful utilities that any rescue disk should
448have, to help in faster and more accurate recovery. The first is a
449partitioning utility. The <command>sfdisk</command> program is
450used here because of its small size and great power. Be warned though -
451it is not what is considered to be "user friendly". But the
452<command>fdisk</command> and <command>cfdisk</command> programs are
453substantially larger or require more shared objects, like <application>ncurses
454</application>.</para>
455
456<para>The second utility is an editor. Most graphical editors are
457inherently too large and also require additional shared objects. For
458this reason, <command>ed</command> is used here. It is small, requires
459no additional shared objects and is a regex-based editor that is the
460ancestor to almost all subsequent editors that support regex-based
461editing, whether graphical or not. It is a "context editor" and offers
462powerful, but non-graphical, editing features. There are many other
463editors that may be suitable - feel free to use one of them instead.</para>
464
465<para>Read the <application>busybox</application>
466<filename>INSTALL</filename> and <filename>README</filename> files to
467see how to include a <command>vi</command> editor. It has not been
468investigated here yet, so it may or may not easily fit onto a single
469diskette image such as is made here.</para>
470
471<para>You can install these or not, but it is important for you to have
472some capability such as these offer. Exactly how you would install the
473utilities you choose will have to be determined by you.</para>
474
475<para><command>Sfdisk</command> and <command>ed</command> are installed
476by, essentially, copying them from your host. Strip is used, just to
477assure that they carry no "excess baggage", even though the base
478<acronym>LFS</acronym> install should have stripped them already. Use
479the following commands:</para>
480
481<screen><userinput><command>strip -p --strip-unneeded --remove-section=.comment \
482 -o /mnt/loop1/sbin/sfdisk /sbin/sfdisk
483strip -p --strip-unneeded --remove-section=.comment \
484 -o /mnt/loop1/bin/ed /bin/ed
485chmod 555 /mnt/loop1/sbin/sfdisk /mnt/loop1/bin/ed</command></userinput></screen>
486
487<para>Also, keeping in mind your space limitations, copy any other
488binaries and libraries you need to the image. Use the
489<command>ldd</command> command to see which libraries you will need to
490copy over for any executables. Don't forget to also strip them
491<emphasis>before</emphasis> copying them to the ramdisk image or use the
492<command>strip</command>, as above, to "copy" them.</para>
493
494<para><emphasis>Set up the lib directory</emphasis></para>
495
496<para>Once you have installed all the utilities from above and any
497additional ones you want, use the <command>ldd</command> command, as
498mentioned above, on those that were not listed in this document. If
499any additional libraries are needed, add them into the setup commands
500shown next.</para>
501
502<para>If you installed only those things shown above, the shared objects
503needed will be minimal. You can add them to the ramdisk image with:</para>
504
505<screen><userinput><command>strip -p --strip-unneeded --remove-section=.comment \
506&nbsp;&nbsp;&nbsp;&nbsp;-o /mnt/loop1/lib/libc.so.6 /lib/libc-2.3.2.so &amp;&amp;
507strip -p --strip-unneeded --remove-section=.comment \
508&nbsp;&nbsp;&nbsp;&nbsp;-o /mnt/loop1/lib/ld-linux.so.2 /lib/ld-2.3.2.so &amp;&amp;
509strip -p --strip-unneeded --remove-section=.comment \
510&nbsp;&nbsp;&nbsp;&nbsp;-o /mnt/loop1/lib/libdl.so.2 /lib/libdl-2.3.2.so &amp;&amp;
511chmod 555 /mnt/loop1/lib/{libc.so.6,ld-linux.so.2,libdl.so.2}</command></userinput></screen>
512
513<para>Note that the above commands change the names of the libraries,
514eliminating the need for the usual symlinks. If you add any additional
515shared objects, be alert for similar opportunities and also the pitfalls
516that may be present.</para>
517
518<para><emphasis>Make the compressed initrd</emphasis></para>
519
520<para>Unmount the loopback file. If you used <command>mount</command>'s
521<option>-o loop</option> option, the "bond" between the loop device
522and the file will be removed when the unmount is done. Just omit the
523<command>losetup -d /dev/loop1</command> from the following
524sequence. The <userinput>-9</userinput> parameter is used with
525<command>gzip</command> to make the smallest possible compressed image. To
526make sure it will fit on the diskette, list the file's size.</para>
527
528<screen><userinput><command>umount /mnt/loop1 &amp;&amp;
529losetup -d /dev/loop1 &amp;&amp; # Omit if mount's -o loop was used
530gzip -9 &lt; /tmp/rfloppy &gt; /tmp/rootfs.gz
531ls -l /tmp/rootfs.gz</command></userinput></screen>
532
533<para><emphasis>Join rescueimage and initrd onto a diskette</emphasis></para>
534
535<para>Now the rescueimage and initial ramdisk image will be written to
536the boot diskette. Before doing this, calculate the number of blocks
537needed for rescueimage and for <filename>/tmp/rootfs.gz</filename>
538(the initial ramdisk), individually, by dividing each
539size by 1024 and adding one if there is any remainder. Add these two
540results together. They must total 1,440 or fewer blocks. If they total
541more than this, don't worry too much. Changes to make a two-diskette
542set are presented later. Of course, you could reexamine your choices and
543try to shrink either the rescueimage or the initial ramdisk image.</para>
544
545<para>To make a single-floppy rescue, using devfs, use the following
546commands. If you use the static <filename class="directory">/dev</filename> setup, use
547<filename>/dev/fd0</filename> instead of the /dev/floppy/0.</para>
548
549<screen><userinput><command>dd if=rescueimage of=/dev/floppy/0 bs=1k
550rdev /dev/floppy/0 0,0
551rdev -R /dev/floppy/0 0</command></userinput></screen>
552
553<para><emphasis>Command explanations</emphasis></para>
554
555<para><command>rdev /dev/floppy/0 0,0</command>: sets the root file system
556the kernel will use when it boots. Because it loads an initrd, it will
557automatically set that as the root device, initially. So, the
558<option>0,0</option> gives it "no value", telling the kernel to not
559mount any other device. Some folks give <filename>/dev/fd0</filename> or
560something similar. But this has effect <emphasis>only</emphasis> when
561<command>linuxrc</command> (really <application><ulink
562url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
563</ulink></application>) exits and the normal <command>init</command>
564processes get invoked. Since this is not being done here, and the floppy
565is <emphasis>not</emphasis> a valid file system, it would be useless
566here. A hard drive would be a better choice if you are looking to
567automatically bring the system up after repair. Since <application><ulink
568url="http://www.busybox.net/downloads/busybox-0.60.4.tar.bz2">busybox
569</ulink></application> provides the <command>reboot</command> command,
570automatic initialization is not needed.</para>
571
572<para>The <command>rdev -R /dev/floppy/0 0</command> will set the
573"root flags" to zero. They have no use in this application.</para>
574
575<para>The <command>dd</command> from above showed some results, like</para>
576
577<screen> 480+1 records in
578 480+1 records out</screen>
579
580<para>In this example the rescueimage (kernel) was 480+1 blocks in size.
581Make sure that this number, which may be different for you, matches your
582calculations from above. You need to calculate a "magic number" now
583that will be inserted into rescueimage. The value consists of three
584significant parts. Two are discussed here. The third is touched upon
585later.</para>
586
587<para>Bits 0 - 10 will contain the size of rescueimage, in blocks,
588that you calculated above, and which should match the results from the
589dd above. Bit 14 (the 15th bit, which is 2 to the 14th power, or 16,384)
590is a flag that, when set to 1, tells the kernel an initial ramdisk is to
591be loaded. So for the single-floppy rescue diskette, the two numbers
59216,384 and 481 (or whatever number is right for your rescueimage size) are
593added together to produce a decimal value, like 16865. This value is
594inserted into the proper place in rescueimage by the
595<command>rdev</command> command done next.</para>
596
597<para>Insert the "magic number" into rescueimage and then write the
598root file system right after rescueimage on the floppy by executing the
599following commands, with the proper numbers inserted. Notice that the
600<command>seek</command> parameter's number must be the size, in blocks,
601of your rescueimage. If you use the static <filename class="directory">/dev</filename>
602setup, use <filename>/dev/fd0</filename> in the commands below, instead
603of <filename>/dev/floppy/0</filename>.</para>
604
605<screen><userinput><command>rdev -r /dev/floppy/0 <replaceable>16865</replaceable>
606dd if=/tmp/rootfs.gz of=/dev/floppy/0 bs=1k seek=<replaceable>481</replaceable></command></userinput></screen>
607
608<para>In this command, <command>seek</command> was used to position to
609the block following the end of the rescueimage (480+1) and begin writing the
610root file system to the floppy.</para>
611</sect3>
612</sect2>
613
614<sect2>
615<title>A Two-diskette Rescue Setup</title>
616
617<para>If you just can't live with a single-diskette rescue system, here
618is what to do to make a simple two-diskette system. Note that the
619endless possibilities presented by the availability of
620<command>linuxrc</command> and other components are not addressed
621here. Here you will just use the kernel's ability to prompt for a second
622diskette that contains the initrd image and load it.</para>
623
624<para>Modify the above instructions as follows. First a different magic
625number is needed. The 15th bit (bit 14) still needs to be set, but the
626size of the rescueimage, in blocks, is replaced with a zero. The third
627component, which was not discussed above, is now used. This is the 16th
628bit (bit 15) of the "magic number". When set, it tells the kernel to ask
629the user to insert the "root" floppy. It then loads the initrd image
630from that diskette. Because the size of the rescueimage was replaced
631by zero, the kernel starts loading from the "zero'th" block (the first
632one) on the second diskette.</para>
633
634<para>The 16th bit (bit 15) represents 2 raised to the 15th power, or
63532,768. So the new magic number is 32,768 + 16384, which is 49,152. This
636value tells the kernel to prompt for, and then load, an initial ramdisk
637image from the first block on the inserted floppy. So your first
638modification is to the command to write the "magic number" to the rescueimage
639image on the diskette.</para>
640
641<screen><userinput><command>rdev -r /dev/floppy/0 <replaceable>49152</replaceable></command></userinput></screen>
642
643<para>Note that the initrd image is <emphasis>not</emphasis> copied to
644the diskette yet. Remove the boot diskette and insert another diskette
645that will hold your root file system. Run this modified command (don't
646forget to use <filename>/dev/fd0</filename> if you don't use devfs).
647Note that no <command>seek</command> parameter is used.</para>
648
649<screen><userinput><command>dd if=/tmp/rootfs.gz of=/dev/floppy/0 bs=1k</command></userinput></screen>
650
651<para>That's all there is to it. The possibilities from here are limited only
652by your imagination and tenacity in pursuing enhancements. And your
653willingness to research available documentation. A good starting point
654is the "Documentation" directory in your kernel source tree. More help
655may be gained at
656<ulink url="http://linuxfromscratch.org/hints/news.html"><acronym>LFS </acronym> Hints</ulink>
657(please use a mirror site that is suitable) and
658<ulink url="http://www.tldp.org">TLDP</ulink>.</para>
659
660</sect2>
661</sect1>
Note: See TracBrowser for help on using the repository browser.