Files
oldlinux-files/study/boot/Bootdisk-HOWTO/bootdisk-howto-v102/Bootdisk-HOWTO-5.html
2024-02-19 00:25:23 -05:00

376 lines
15 KiB
HTML

<HTML>
<HEAD>
<TITLE>The Linux Bootdisk HOWTO: FAQ</TITLE>
</HEAD>
<BODY>
<A HREF="Bootdisk-HOWTO-4.html"><IMG SRC="prev.gif" ALT="Previous"></A>
<A HREF="Bootdisk-HOWTO-6.html"><IMG SRC="next.gif" ALT="Next"></A>
<A HREF="Bootdisk-HOWTO.html#toc5"><IMG SRC="toc.gif" ALT="Contents"></A>
<HR>
<H2><A NAME="s5">5. FAQ</A></H2>
<H2><A NAME="ss5.1">5.1 Q. How can I make a boot disk with a XXX driver?</A></H2>
<P>The easiest way is to obtain a Slackware kernel from your nearest
Slackware mirror site. Slackware kernels are generic kernels which atttempt
to include drivers for as many devices as possible, so if you have a
SCSI or IDE controller, chances are that a driver for it is included
in the Slackware kernel.</P>
<P>Go to the a1 directory and select either IDE or SCSI
kernel depending on the type of controller you have. Check the xxxxkern.cfg
file for the selected kernel to see the drivers which have been included
in that kernel. If the device you want is in that list, then the
corresponding kernel should boot your computer. Download the xxxxkern.tgz
file and copy it to your boot diskette as described above in the section
on making boot disks.</P>
<P>You must then check the root device in the kernel, using the rdev
command:
<BLOCKQUOTE><CODE>
<PRE>
rdev zImage
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Rdev will then display the current root device in the kernel. If this
is not the same as the root device you want, then use rdev to change it.
For example, the kernel I tried was set to /dev/sda2, but my root
scsi partition is /dev/sda8. To use a root diskette, you would have
to use the command:
<BLOCKQUOTE><CODE>
<PRE>
rdev zImage /dev/fd0
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>If you want to know how to set up a Slackware root disk as well,
that's outside the scope of this HOWTO, so I suggest you check the
Linux Install Guide or get the Slackware distribution. See the section
in this HOWTO titled "References".</P>
<H2><A NAME="ss5.2">5.2 Q. How do I update my boot floppy with a new kernel?</A></H2>
<P>Just copy the kernel to your boot diskette using the dd command for
a boot diskette without a filesystem, or the cp command for a
boot/root disk. Refer to the section in this HOWTO titled "Boot"
for details on creating a boot disk. The description applies equally
to updating a kernel on a boot disk.</P>
<H2><A NAME="ss5.3">5.3 Q. How do I remove LILO so that I can use DOS to boot again?</A></H2>
<P>This is not really a Bootdisk topic, but it is asked so often, so: the
answer is, use the DOS command:
<BLOCKQUOTE><CODE>
<PRE>
FDISK /MBR
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>MBR stands for Master Boot Record, and it replaces the boot sector
with a clean DOS one, without affecting the partition table. Some
purists disagree with this, but even the author of LILO, Werner
Almesberger, suggests it. It is easy, and it works.</P>
<P>You can also use the dd command to copy the backup saved by LILO
to the boot sector - refer to the LILO documentation if you wish
to do this.</P>
<H2><A NAME="ss5.4">5.4 Q. How can I boot if I've lost my kernel AND my boot disk?</A></H2>
<P>If you don't have a boot disk standing by, then probably
the easiest method is to obtain a Slackware kernel for your
disk controller type (IDE or SCSI) as described above for "How do I
make a boot disk with a XXX driver?". You can then boot your
computer using this kernel, then repair whatever damage there is.</P>
<P>The kernel you get may not have the root device set to the disk
type and partition you want. For example, Slackware's generic
scsi kernel has the root device set to /dev/sda2, whereas my
root Linux partition happens to be /dev/sda8. In this case the
root device in the kernel will have to be changed.</P>
<P>You can still change the root device and ramdisk settings in the kernel
even if all you have is a kernel, and some other operating system,
such as DOS.</P>
<P>Rdev changes kernel settings by changing the
values at fixed offsets in the kernel file, so you can do the same
if you have a hex editor available on whatever systems you do still
have running - for example, Norton Utilities Disk Editor under DOS.
You then need to check and if necessary change the values in the
kernel at the following offsets:
<BLOCKQUOTE><CODE>
<PRE>
0x01F8 Low byte of RAMDISK size
0x01F9 High byte of RAMDISK size
0x01FC Root minor device number - see below
0X01FD Root major device number - see below
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>The ramdisk size is the number of blocks of ramdisk to create.
If you want to boot from a root diskette then set this to decimal
1440, which is 0x05A0, thus set offset 0x01F8 to 0xA0 and
offset 0x01F9 to 0x05. This will allocate enough space for
a 1.4Mb diskette.</P>
<P>The major and minor device numbers must be set to the device
you want to mount your root filesystem on. Some useful values
to select from are:
<BLOCKQUOTE><CODE>
<PRE>
device major minor
/dev/fd0 2 0 1st floppy drive
/dev/hda1 3 1 partition 1 on 1st IDE drive
/dev/sda1 8 1 partition 1 on 1st scsi drive
/dev/sda8 8 8 partition 8 on 1st scsi drive
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Once you have set these values then you can write the file to
a diskette using either Norton Utilities Disk Editor, or a program called
rawrite.exe. This program is included
in several distributions, including the SLS and Slackware distributions.
It is a DOS program which writes a file to the "raw" disk, starting
at the boot sector, instead of writing it to the file system. If you use
Norton Utilities, then you must write the file to a physical disk
starting at the beginning of the disk.</P>
<H2><A NAME="ss5.5">5.5 Q. How can I make extra copies of boot/root diskettes?</A></H2>
<P>It is never desirable to have just one set of rescue disks - 2 or 3
should be kept in case one is unreadable.</P>
<P>The easiest way of making copies of any diskettes, including
bootable and utility diskettes, is to use the dd command to copy the
contents of the original diskette to a file on your hard drive, and
then use the same command to copy the file back to a new diskette.
Note that you do not need to, and should not, mount the diskettes,
because dd uses the raw device interface.</P>
<P>To copy the original, enter the command:
<BLOCKQUOTE><CODE>
<PRE>
dd if=devicename of=filename
where devicename the device name of the diskette
drive
and filename the name of the file where you
want to copy to
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>For example, to copy from /dev/fd0 to a temporary file called
/tmp/diskette.copy, I would enter the command:
<BLOCKQUOTE><CODE>
<PRE>
dd if=/dev/fd0 of=/tmp/diskette.copy
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Omitting the "count" parameter, as we have done here, means that the
whole diskette of 2880 (for a high-density) blocks will be copied.</P>
<P>To copy the resulting file back to a new diskette, insert the new
diskette and enter the reverse command:
<BLOCKQUOTE><CODE>
<PRE>
dd if=filename of=devicename
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Note that the above discussion assumes that you have only one diskette
drive. If you have two of the same type, then you can copy diskettes
using a command like:
<BLOCKQUOTE><CODE>
<PRE>
dd if=/dev/fd0 of=/dev/fd1
</PRE>
</CODE></BLOCKQUOTE>
</P>
<H2><A NAME="ss5.6">5.6 Q. How can I boot without typing in "ahaxxxx=nn,nn,nn" every time?</A></H2>
<P>Where a disk device cannot be autodetected it is necessary to supply
the kernel with a command device parameter string, such as:
<BLOCKQUOTE><CODE>
<PRE>
aha152x=0x340,11,3,1
</PRE>
</CODE></BLOCKQUOTE>
This parameter string can be supplied in several ways using LILO:
<UL>
<LI>By entering it on the command line every time the system
is booted via LILO. This is boring, though.</LI>
<LI>By using the LILO "lock" keyword to make it store the
command line as the default command line, so that LILO will use
the same options every time it boots.</LI>
<LI>By using the APPEND statement in the lilo config file. Note that
the parameter string must be enclosed in quotes.</LI>
</UL>
</P>
<P>For example, a sample command line using the above parameter string
would be:
<BLOCKQUOTE><CODE>
<PRE>
zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock
</PRE>
</CODE></BLOCKQUOTE>
This would pass the device parameter string through, and also ask the
kernel to set the root device to /dev/sda1 and save the whole command
line and reuse it for all future boots.</P>
<P>A sample APPEND statement is:
<BLOCKQUOTE><CODE>
<PRE>
APPEND = &quot;aha152x=0x340,11,3,1&quot;
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Note that the parameter string must NOT be enclosed in quotes on the
command line, but it MUST be enclosed in quotes in the APPEND statement.</P>
<P>Note also that for the parameter string to be acted on, the kernel
must contain the driver for that disk type. If it does not, then there
is nothing listening for the parameter string, and you will have to
rebuild the kernel to include the required driver. For details on
rebuilding the kernel, cd to /usr/src/linux and read the README, and
read the Linux FAQ and Installation HOWTO. Alternatively you could
obtain a generic kernel for the disk type and install that.</P>
<P>Readers are strongly urged to read the LILO documentation before
experimenting with LILO installation. Incautious use of the "BOOT"
statement can damage partitions.</P>
<H2><A NAME="ss5.7">5.7 Q. How can I create an oversize ramdisk filesystem?</A></H2>
<P>An oversize ramdisk filesystem is a filesystem in a ramdisk larger
than the size of the root disk it was loaded from. This can be
extremely useful when using Ftape, which requires exclusive use
of the floppy disk controller (see the Ftape HOWTO for details.)</P>
<P>Two things are required: create an oversize file system on the
root diskette, and then patch the kernel so that it will not
try to load blocks off the end of the diskette.</P>
<P>To create an oversize filesystem, two methods are possible:
<UL>
<LI>Use the "blocks" e2fsck parameter to specify the size of
filesystem that you eventually want in the ramdisk. For example:
<BLOCKQUOTE><CODE>
<PRE>
mke2fs /dev/fd0 3000
</PRE>
</CODE></BLOCKQUOTE>
will create a filesystem on the diskette of 3000 1Kb blocks. The
diskette only has 1440 blocks, but mke2fs does not care about this.
E2fs will care about it if you try to use more than 1440 blocks
of data (allowing for blocks used as inodes and reserved etc),
but up to this point it is quite safe. You will soon find out if
you try to load too much on the diskette because an I/O error will result.</LI>
<LI>Create a partition on your hard disk as large as the filesystem
you want on the ramdisk. Then create a filesystem on it and load in
the files you want. Then use dd to copy only the first 1440 blocks
to diskette, and then check that there was nothing in the uncopied
part of the filesystem. For example:
<BLOCKQUOTE><CODE>
<PRE>
dd if=/dev/hdb of=/dev/fd0 bs=1024 count=1440
dd if=/dev/hdb of=tailpart bs=1024 skip=1440
cmp -l tailparm /dev/zero
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
Of the two, I prefer the first method - it appears easier and safer.</P>
<P>The second thing required to get an oversized filesystem is to get the
kernel to stop loading at the end of the physical diskette when it
tries to load the root diskette into ramdisk. To do this, a simple
patch can be applied to the ramdisk driver, which should be found in
/usr/src/linux/drivers/block/ramdisk.c. The following patch has been
contributed by Bruce Elliot. It is for kernel version 1.2.0, but it
should be fairly easy to apply to later versions. Even if the patch
will not apply, the code is not complex, so the patch could easily
be modified until it worked.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
=================================================================
X--- ramdisk.c~ Mon Jan 23 13:04:09 1995
X+++ ramdisk.c Mon May 29 00:54:52 1995
X@@ -113,6 +113,7 @@
X (struct ext2_super_block *)&amp;sb;
X int block, tries;
X int i = 1;
X+ int fblocks;
X int nblocks;
X char *cp;
X
X@@ -168,12 +169,16 @@
X nblocks, rd_length &gt;&gt; BLOCK_SIZE_BITS);
X return;
X }
X- printk(&quot;RAMDISK: Loading %d blocks into RAM disk&quot;, nblocks);
X+ fblocks = blk_size[MAJOR(ROOT_DEV)][MINOR(ROOT_DEV)];
X+ if (fblocks &gt; nblocks)
X+ fblocks = nblocks;
X+ printk(&quot;RAMDISK: Loading %d blocks into %d block filesystem &quot;
X+ &quot;in RAM disk&quot;, fblocks, nblocks);
X
X /* We found an image file system. Load it into core! */
X cp = rd_start;
X- while (nblocks) {
X- if (nblocks &gt; 2)
X+ while (fblocks) {
X+ if (fblocks &gt; 2)
X bh = breada(ROOT_DEV, block, BLOCK_SIZE, 0, PAGE_SIZE);
X else
X bh = bread(ROOT_DEV, block, BLOCK_SIZE);
X@@ -184,7 +189,7 @@
X }
X (void) memcpy(cp, bh-&gt;b_data, BLOCK_SIZE);
X brelse(bh);
X- if (!(nblocks-- & 15)) printk(&quot;.&quot;);
X+ if (!(fblocks-- & 15)) printk(&quot;.&quot;);
X cp += BLOCK_SIZE;
X block++;
X i++;
=================================================================
</PRE>
</CODE></BLOCKQUOTE>
With this patch, the kernel stops loading at the end of the
physical diskette, leaving a filesystem larger than the disk.</P>
<P>Some warnings: I have been able to create stable ramdisk filesystems
in this fashion of 3500 blocks, but if I try 3600 or more then the
kernel collapses with an error something like "fixup table corrupt".
I have not been able to track down why, but obviously something is
overflowing. Up to 3500 blocks, though, I have had no problems.</P>
<H2><A NAME="ss5.8">5.8 Q. At boot time, I get error <CODE>A: cannot execute B</CODE>. Why?</A></H2>
<P>There are several cases of program names being hardcoded in various
utilities. These cases do not occur everywhere, but they may explain
why an executable apparently cannot be found on your system even though
you can see that it is there. You can find out if a given program
has the name of another hardcoded by using the "strings" command and
piping the output through grep.</P>
<P>Known examples of hardcoding are:
<UL>
<LI>Shutdown in some versions has <CODE>/etc/reboot</CODE> hardcoded, so
<CODE>reboot</CODE> must be placed in the /etc directory.</LI>
<LI>Init has caused problems for at least one person, with the kernel
being unable to find init. </LI>
</UL>
To fix these problems, either move the programs to the correct directory,
or change configuration files (e.g. inittab) to point to the correct
directory. If in doubt, put programs in the same directories as they
are on your hard disk, and use the same inittab and <CODE>/etc/rc.d</CODE>
files as they appear on your hard disk.</P>
<HR>
<A HREF="Bootdisk-HOWTO-4.html"><IMG SRC="prev.gif" ALT="Previous"></A>
<A HREF="Bootdisk-HOWTO-6.html"><IMG SRC="next.gif" ALT="Next"></A>
<A HREF="Bootdisk-HOWTO.html#toc5"><IMG SRC="toc.gif" ALT="Contents"></A>
</BODY>
</HTML>