Changeset efe6586


Ignore:
Timestamp:
09/20/2003 08:56:07 PM (21 years ago)
Author:
Larry Lawrence <larry@…>
Branches:
10.0, 10.1, 11.0, 11.1, 11.2, 11.3, 12.0, 12.1, 12.2, 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, gimp3, 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_0, v5_0-pre1, v5_1, v5_1-pre1, xry111/for-12.3, xry111/intltool, xry111/llvm18, xry111/soup3, xry111/spidermonkey128, xry111/test-20220226, xry111/xf86-video-removal
Children:
ed510ac
Parents:
b94cd51
Message:

expanded bootdisk writeup

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • postlfs/config/bootdisk.xml

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