You are here

Boot-CD

Uditha Atukorala's picture

TITLE: Boot-CD
LFS VERSION: All
AUTHOR: Nicholas Dille

SYNOPSIS:
How to create a bootcd from a working LFS system

HINT:
ver 1.4
25/07/2001

Contents
--------

0. Preface
1. Why create a boot cd
2. Kernel customization
3. LFS system preparation
3.1 Introduction
3.2 Linking /tmp and /var to harddisk
3.2.1 Handling of /tmp
3.2.2 Handling of /var
3.3 Linking /tmp and /var to ramdisk
3.3.1 Handling of /tmp
3.3.2 Handling of /var
3.4 Boot script(s)
4. Installation script
5. Creating a boot disk
6. Burning
7. Listings
7.1 /
7.2 /etc/init.d
7.3 /etc/rc0.d
7.4 /etc/rc1.d
7.5 /etc/rc2.d
7.6 /etc/rc3.d
7.7 /etc/rc4.d
7.8 /etc/rc5.d
7.9 /etc/rc6.d
7.10 /etc/rcS.d
7.11 /etc/inittab
8. History

1. Why create a boot cd
---------------------

Although I'm not that long with LFS I already read several threads on lfs-
discuss about people having problems compiling certain parts of an LFS sys-
tem due to beta version of gcc or other important packages shipped with
their favorite distribution.
In addition I don't like the idea of installing a "commercial" distribution
in order to install a customized LFS system. That ain't right ;-)

So I figured that we should be able to create a bootable cd with some kind
of linux system on it which will provide a proper environment for the in-
stallation.

And what fits better than LFS itself? (I'll leave that one to you ...)

It also gives some clues about automatically starting the installation
which then is left to you to hack/figure out. But we should probably start
using alfs (to give them testers?).

So that's what it's all about.

2. Kernel customization
---------------------

Since we are about to boot from a cd and use the cd image as root partition
we certainly need ISO9660 support compiled in. This part is absolutly vi-
tal!
When trying to mount the root partition the kernel does not have access to
any kind of modules (since they are on the root partition which is to be
mounted) so it has to rely on compiled-in support.

After the system has booted up we also want to partition our harddrive.
Therefore you should include any filesystems you might need during instal-
lation.

[So far I have not tested including those additional filesystems as module
but I guess that should work just fine]

3. LFS system preparation
-----------------------

3.1 Introduction
-------------

The major problem which arises when having a read-only root partition is
that some part of the system may be relying on writable access in certain
directories.

Let us have a quick look at the content of $LFS of a typical system:

drwxr-xr-x 2 root root 1603 Oct 15 22:16 bin
drwxr-xr-x 4 root root 4096 Dec 5 00:12 boot
drwxr-xr-x 8 root root 44096 Feb 11 10:02 dev
drwxr-xr-x 45 root root 5334 Feb 11 11:02 etc
drwxr-xr-x 13 root root 250 Jan 9 00:39 home
drwxr-xr-x 5 root root 1869 Jan 4 23:58 lib
drwxr-xr-x 5 root root 95 Aug 27 22:12 mnt
dr-xr-xr-x 54 root root 0 Feb 11 11:02 proc
drwx--x--x 20 root root 679 Jan 30 17:27 root
drwxr-xr-x 5 root root 5068 Jan 4 23:58 sbin
drwxrwxrwt 5 root root 200 Feb 11 10:03 tmp
drwxr-xr-x 27 root root 663 Dec 13 17:34 usr
drwxr-xr-x 26 root root 541 Sep 5 23:53 var

The following directories should not cause any problems:
bin, boot, etc, lib, root, sbin, usr
[Need explanation why no problem?]
The content of those directories should be static and seldomly changed.

Mount points for other filesystems won't cause a problem because you can
mount a filesystem with writable access on a mount point in a read-only
filesystem. I guess the kernel keeps those mappings in memory and not in
the inodes.
That means we can cancel out problems caused by: dev, home, mnt, proc.

This leaves us with tmp and var.

3.2 Linking /tmp and /var to harddisk
----------------------------------

So far I've always preferred this version since I intend to build a boot cd
that will be usable on almost every system including those with very little
ram.

3.2.1 Handling of /tmp
-----------------

As implied by the name /tmp is used for storing temporary data. Unfortuna-
tely this is not under our control whether this directory is used and,
therefore, needs some special handling.

Since there is no standardized structure for this place we can simply link
it to the tmp directory on the partition which we will use for instal-
lation.

For example, if you intend to compile you system in /lfs (which will then
be $LFS during the installation) you need to include a symlink for /tmp on
the CD pointing to /lfs/tmp.
If you decide for the symlink version of handling /tmp you will need to de-
cide which directory you will install in before burning the CD!

3.2.2 Handling of /var
-----------------

/var usually contains runtime or state stuff and may also be changed [is
that right? clumsily expressed?].

Since /var may contain mail spool directories, pid files and has a prede-
fined directory structure, we can't just link it onto our install partition
since that could be causing collisions with programs run in our chroot en-
vironment or perhaps even earlier.

Therefore we should tar /var and put it in / which you will do by executing
the following command in your CD root directory:

tar cfz var/ var.tar.gz

After bootup after we mounted our installation partition (let's say in
/lfs), we create a directory "whatever" and untar /var in "whatever".

The original /var should be a symlink to this directory, eg
var -> /lfs/whatever/var

3.3 Linking /tmp and /var to ramdisk
---------------------------------

First of all we need to create the ramdisk which I did with the following
commands:

dd if=/dev/zero of=/dev/rd/0 bs=1k count=4096
mke2fs -m 0 /dev/rd/0
mount /dev/rd/0 /rd

Please feel reminded that you need to change the device name to the proper
name on your system. This was created using devfs!

The next two sub-chapters have hardly changed since /tmp and /var are
simply linked to /rd/tmp and /rd/var

3.3.1 Handling of /tmp
-----------------

Create a link in your root directory to point /tmp to /rd/tmp/.

During bootup you need to create the directory /rd/tmp/ for the link /tmp
to not point to nirvana.

3.3.2 Handling of /var
-----------------

Create a link in your root directory to point /var to /rd/var/.
You'll also need to create a tarball of your original /var and place it in
/ which I described in 3.2.2.

During bootup you will need to unpack the tarball of /var in /rd.

3.4 Boot scripts
-------------

I stripped /etc/init.d and /etc/rc?.d off everything that is not absolutly
vital.
The only task left is loading a keymap.

Please refer to the directory listing (chapter 5) at the end of the docu-
ment.

4. Installation script
--------------------

This part is certainly up to you. You might want to include aLFS or some
compilation system which you have written yourself. Perhaps you will even
leave out this part and manually install the packages.
But anyway you will have to put the packages on the CD to have them handy
when you need them.

To give you an idea what my CD does: I put a script in /etc/init.d/install
which will be started from inittab during boot. This will ask the user some
important stuff, i.e. which partition to install on.
It will then startup the compilation.

You might even want to boot to a bash and leave out any kind of automatic
installation. This will happen if you pass an additional kernel parameter
from the bootloader "init=/bin/bash".

5. Creating a boot floppy
-----------------------

Although some of you might be tempted to ask whether I will now describe
the process to create a boot disk using grub I will not start an argument
about this. This is a question of belief ;-)

First you need to get grub from http://www.gnu.org and install it on your
system with the following commands:

./configure --prefix=/usr &&
make &&
make install

a) You then create an ext2 filesystem on a disk.
(Please use an empty disk or be sure that you understand that you
will loose all your data on this disk. So much for the disclaimer)

b) Mount this disk to your favorite disk-mount-directory
(lets call it $FLOPPY)

c) Create /boot and /boot/grub on your floppy:

mkdir -p $FLOPPY/boot/grub

d) Copy the grub boot loader onto the disk:

cp /usr/share/grub/i386-pc/stage* $FLOPPY/boot/grub

e) Put your kernel in $FLOPPY/boot and call it "linux"

f) Start the grub shell by executing "grub"

g) Install grub on your boot disk (still in the grub shell):

install (fd0)/boot/grub/stage1 (fd0) (fd0)/boot/grub/stage2

h) Now you need to create the file $FLOPPY/boot/grub/menu.lst with the
following content:

default 0
timeout 2

title template
root (fd0)
kernel (fd0)/boot/linux devfs=mount root=/dev/cdroms/cdrom0

If you do not use devfs, please remove "devfs=mount" from the last
line in menu.lst and replace "/dev/cdroms/cdrom0" with the name of
your cdrom device.

If you want to keep the resulting bootable cd as generic as possible you
do not need to worry about the cdrom device name since you will be able to
edit the menu entries of grub at boot time to reflect the underlying
system.

You are now ready to burn your LFS installation onto a CD which will be
able to boot using the cdrom.

6. Burning
--------

After creating a proper boot floppy with your custom kernel (see 2) put the
image in /boot.
To do this execute the following command in the root directory of your lfs
system:

dd if=/dev/floppy/0 of=boot/image bs=1024

The guys of you who are not using devfs will need to substitute
/dev/floppy/0 with /dev/fd0.

To burn the whole stuff on cd I used the following command:

mkisofs -rlDJLV "LFS" /lfscd -b boot/image -c boot/catalog \
| cdrecord -v -eject dev=/dev/cdroms/cdrom0 speed=4 -data -

Things to check:

a) Don't use -f. It causes symlinks to be ignored.

b) substitute dev=... with your cdrom device

7. Listing
--------

7.1 /
--

drwxr-xr-x 2 root root 35 Feb 9 21:10 alfs
drwxr-xr-x 2 root root 1250 Feb 9 20:10 bin
drwxr-xr-x 3 root root 295 Feb 10 14:05 boot
drwxr-xr-x 3 root root 54 Feb 9 17:33 dev
drwxr-xr-x 12 root root 795 Feb 12 13:48 etc
drwxr-xr-x 2 root root 35 Feb 9 17:33 home
drwxr-xr-x 3 root root 2494 Feb 9 20:52 lib
drwxr-xr-x 2 root root 35 Feb 9 17:33 mnt
drwxr-xr-x 2 root root 35 Feb 9 17:33 proc
drwxr-x--- 2 root root 64 Feb 9 18:13 root
drwxr-xr-x 2 root root 1272 Feb 9 20:10 sbin
lrwxrwxrwx 1 root root 8 Feb 10 21:57 tmp -> alfs/tmp
drwxr-xr-x 14 root root 346 Feb 9 20:10 usr
lrwxrwxrwx 1 root root 14 Feb 10 21:57 var -> alfs/00-rw/var
-rw-r--r-- 1 root root 1043 Feb 10 21:56 var.tar.gz

7.2 /etc/init.d
------------

This directory contains a new script "install" which goes through the in-
stallation procedure and should be specific for your setup.

-rwxr-xr-- 1 root root 1734 Jan 26 02:05 checkfs
-rwxr-xr-- 1 root root 1118 Jan 26 02:05 ethnet
-rwxr-xr-- 1 root root 867 Feb 2 02:46 fcron
-rwxr-xr-- 1 root root 4940 Jan 26 02:05 functions
-rwxr-xr-- 1 root root 83 Jan 26 02:05 halt
-rwxr-xr-x 1 root root 988 Feb 12 13:51 install
-rwxr-xr-- 1 root root 200 Jan 26 02:05 loadkeys
-rwxr-xr-- 1 root root 725 Jan 26 02:05 localnet
-rwxr-xr-- 1 root root 355 Jan 26 02:05 mountfs
-rwxr-xr-- 1 root root 4219 Jan 26 02:05 rc
-rwxr-xr-- 1 root root 235 Jan 26 02:05 rcS
-rwxr-xr-- 1 root root 123 Jan 26 02:05 reboot
-rwxr-xr-- 1 root root 276 Jan 26 02:05 sendsignals
-rwxr-xr-- 1 root root 338 Jan 26 02:05 setclock
-rwxr-xr-- 1 root root 1062 Jan 26 02:05 sysklogd
-rwxr-xr-- 1 root root 696 Jan 26 02:05 template
-rwxr-xr-- 1 root root 234 Jan 26 02:05 umountfs

7.3 /etc/rc0.d
-----------

lrwxrwxrwx 1 root root 21 Feb 12 13:44 S80sendsignals
-> ../init.d/sendsignals
lrwxrwxrwx 1 root root 14 Feb 12 13:44 S99halt -> ../init.d/halt

7.4 /etc/rc1.d
-----------

[empty]

7.5 /etc/rc2.d
-----------

[empty]

7.6 /etc/rc3.d
-----------

[empty]

7.7 /etc/rc4.d
-----------

[empty]

7.8 /etc/rc5.d
-----------

[empty]

7.9 /etc/rc6.d
-----------

lrwxrwxrwx 1 root root 21 Feb 12 13:44 S80sendsignals
-> ../init.d/sendsignals
lrwxrwxrwx 1 root root 16 Feb 12 13:44 S99reboot -> ../init.d/reboot

7.10 /etc/rcS.d
-----------

lrwxrwxrwx 1 root root 18 Jan 26 02:11 S30loadkeys
-> ../init.d/loadkeys

7.11 /etc/inittab
-------------

Please note that I replaced the definition for an agetty on vc/1 with the
install script /etc/init.d/install which will only be run once (keyword
"once").
I also removed 4 of the 5 remaining agetty definitions since this installa-
tion will run automatically.

# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/init.d/rcS

l0:0:wait:/etc/init.d/rc 0
l1:S1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

ft:06:respawn:/sbin/sulogin

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S1:respawn:/sbin/sulogin
1:2345:respawn:/sbin/agetty vc/1 9600
2:2345:respawn:/sbin/agetty vc/2 9600

# End /etc/inittab

8. History
--------

2001-07-25 released version 1.4:
According to Gerard's suggestion I added a few lines describing
how to get the boot image off the floppy and place it in the
lfs tree for the boot cd.
Corrections: - The most important was a fix to the instruction
of creating a boot disk where i misspelled the
command to install grub on the floppy.
- I deleted/changed some instructions leftover
from my original CD in 4 and 7.11
Additions: - Added some further description to 3.2.1, 3.2.2

2001-06-22 released version 1.3:
I added instructions to create a grub based boot disk.

2001-03-10 released version 1.2:
After I got several mail from people asking for a new version
of this howto with some hints how to create the cd with ram-
disk support.

2001-02-12 released version 1.0