You must be the root user for many of these operations and that means you can really mess up your system if you are careless or hasty.
If possible, you should already have made a boot disk set based on rote instructions that came with your Linux distribution.
You cannot depend on instructions that are appropriate for my system also being appropriate for your system. (My system has a Matrox Millennium video card with 8 MB VRAM and an Adaptec 2940UW SCSI Adapter.)
The Bootdisk-HOWTO, CD-Writing HOWTO, man mkisofs, and man cdrecord as well as the Linux kernel source code in linux/init/main.c, linux/fs/super.c, linux/drivers/block/rd.c, and linux/drivers/block/genhd.c provided the background information needed to assemble the following instructions. You should read those HOWTOs and man pages, using the following as a specific implementation example.
Craig Van Degrift / craig@yosemitefoothills.com / content last revised February 27, 2000These notes assume that you are familiar with making the two diskette rescue system; they skip through steps that are similar to those described there.
An "El Torito" style of bootable CD-ROM contains an implanted image of a bootable floppy diskette. This image is extracted by the system BIOS at boot time and used as if it were an ordinary boot diskette. The boot image includes an initial compressed ramdisk image that is loaded into RAM by the Lilo loader as the root filesystem. A script is then run that fills our this root filesystem with additional program files from the CD-ROM's filesystem. Even though the root ramdisk image uncompresses to a 32-MB ext2 filesystem, it compresses very tightly because it only needs to contain the files necessary to support this copying process.
First, I set up a working directory /boot/bootCD for the assembly of the boot image bootImage. That directory contains the following:
/boot/bootCD: total 3014 -rwxr--r-- 1 root root 2048 Dec 19 17:28 boot.catalog -rw-r--r-- 1 root root 1474560 Dec 18 00:40 bootImage -rw-r--r-- 1 root root 498 Dec 17 23:30 bootImage_lilo.conf -rwxr-xr-x 1 root root 372 Dec 17 23:19 finishBootImage -rwxr-xr-x 1 root root 426 Dec 18 00:26 finishRootImage drwxr-xr-x 4 root root 1024 Dec 18 00:39 mnt_boot drwxr-xr-x 2 root root 1024 Dec 9 13:55 mnt_new drwxr-xr-x 2 root root 1024 Dec 9 13:55 mnt_old -rw-r--r-- 1 root root 790912 Dec 18 00:37 rootfs_new.gz -rw-r--r-- 1 root root 792663 Dec 18 00:36 rootfs_old.gz -rwxr-xr-x 1 root root 1456 Dec 17 01:25 startBootImage -rwxr-xr-x 1 root root 433 Dec 17 23:24 startRootImage
This directory has a mount point mnt_boot and two helper scripts, startBootImage and finishBootImage, which form the boot diskette image, bootImage. It also has two mount points, mnt_new, and mnt_old, and two scripts, startRootImage and finishRootImage for working with the ramdisk root filesystem.
The scripts may be extracted from this WWW page, and the rootfs_new.gz and lilo.conf files that I used may be extracted from this 1440-KB bootImage file by mounting it as a loop filesystem (mount -t ext2 -o loop) and copying them. Be sure to understand the contents of these files and adapt them as needed to your own system. For example, these files use libc.so.5 and your system might use glibc, libc.so.6. Similarly, the scripts assume bzImage and other files are to be found in places that are likely to be different from your system.
bootImage, custom-tailored for my system, contains the following files:
.: total 1395 drwxr-xr-x 2 root root 1024 Feb 18 11:27 boot drwxr-xr-x 2 root root 1024 Feb 18 11:20 dev -rw-r--r-- 1 root root 499 Feb 18 11:20 lilo.conf -rw-r--r-- 1 root root 872565 Feb 18 11:26 rootfs_new.gz -rw-r--r-- 1 root root 542597 Feb 18 11:20 vmlinuz-2.2.14 ./boot: total 16 -rw-r--r-- 1 root root 4540 Feb 18 11:20 boot.b -rw-r--r-- 1 root root 612 Feb 18 11:20 chain.b -rw------- 1 root root 9728 Feb 18 11:27 map ./dev: total 0 brw-rw-rw- 1 root disk 2, 0 Feb 18 11:20 fd0 brw-r--r-- 1 root root 2, 2 Feb 18 11:20 fd1 cr-xr-xr-x 1 root root 1, 3 Feb 18 11:20 null br--r----- 1 root disk 11, 0 Feb 18 11:20 scd0 br--r----- 1 root disk 11, 1 Feb 18 11:20 scd1 brw-rw---- 1 root disk 8, 0 Feb 18 11:20 sda brw-rw---- 1 root disk 8, 1 Feb 18 11:20 sda1 brw-rw---- 1 root disk 8, 2 Feb 18 11:20 sda2 brw-rw---- 1 root disk 8, 3 Feb 18 11:20 sda3 brw-rw---- 1 root disk 8, 4 Feb 18 11:20 sda4 brw-rw---- 1 root disk 8, 5 Feb 18 11:20 sda5 brw-rw---- 1 root disk 8, 6 Feb 18 11:20 sda6 brw-rw---- 1 root disk 8, 16 Feb 18 11:20 sdb brw-rw---- 1 root disk 8, 17 Feb 18 11:20 sdb1 brw-rw---- 1 root disk 8, 18 Feb 18 11:20 sdb2 brw-rw---- 1 root disk 8, 19 Feb 18 11:20 sdb3 brw-rw---- 1 root disk 8, 20 Feb 18 11:20 sdb4 brw-rw---- 1 root disk 8, 21 Feb 18 11:20 sdb5 brw-rw---- 1 root disk 8, 22 Feb 18 11:20 sdb6
This is very similar to the "boot" diskette of the Two-diskette set described earlier. The lilo.conf here is:
boot = /dev/fd0 install = /boot/bootCD/mnt_boot/boot/boot.b map = /boot/bootCD/mnt_boot/boot/map backup = /dev/null compact prompt default = Linux_on_CD image = /boot/bootCD/mnt_boot/vmlinuz-2.2.14 label = Linux_on_CD initrd = /boot/bootCD/mnt_boot/rootfs_new.gz root = /dev/ram0 vga = 0x012c append = "ramdisk_size=32768 init=/preinit" image = /boot/vmlinuz-2.2.14 label = Linux_on_sdb5 root = /dev/sdb5 other = /dev/sda label = Boot_Manager loader = /boot/bootCD/mnt_boot/boot/chain.b
The main difference is the inclusion of an initrd=... line to tell the Lilo map installer program /sbin/lilo that there is a compressed root filesystem image rootfs_new.gz that will need to be loaded into a special ramdisk area (/dev/initrd which is known to the operating system). The Lilo loader places this image in ram and informs the kernel of its existence. The kernel then moves it to /dev/ram0 and mounts it as the root filesystem.
If we were making a Linux install CD, the code in rootfs_new.gz would probe the system hardware and construct a module-oriented kernel and supporting files on a hard disk specified by the root=... parameter. But, our intention here is to make a fancy CD-ROM-based rescue and manipulation system that floats in RAM above the hard disks without disturbing them. We therefore specify root=/dev/ram0, telling the kernel that the initial ramdisk in /dev/ram0 is to be our final root filesystem, not just a temporary one.
The kernel boot parameters in append=... set the maximum size for ramdisks to the size chosen for our root ramdisk and also tells the kernel that the first program to run shall be /preinit, a shell script that fills out the root ramdisk with files from elsewhere on the CD-ROM. As it terminates, /preinit starts up the normal /sbin/init program.
The remaining items in this lilo.conf have been discussed earlier in connection with the two-diskette rescue system.
In order to have plenty of read-write room in the ramdisk root filesystem, I have compressed a 32 MB ext2 filesystem along with the necessary starter files to form rootfs_new.gz. Specifically it contains:
.: total 24 -rw-r--r-- 1 root root 129 Nov 22 01:37 .bashrc drwxr-xr-x 2 root root 1024 Feb 17 23:27 backup drwxr-xr-x 2 root root 1024 Feb 17 23:27 biglinux drwxr-xr-x 2 root root 1024 Feb 18 01:02 bin drwxr-xr-x 2 root root 1024 Feb 17 23:27 cdrom drwxr-xr-x 2 root root 2048 Feb 18 00:55 dev drwxr-xr-x 2 root root 1024 Feb 17 23:27 dos drwxr-xr-x 13 root root 1024 Feb 18 03:26 etc drwxr-xr-x 2 root root 1024 Feb 17 23:27 extra -rw-r--r-- 1 root root 0 Feb 17 23:12 fastboot drwxr-xr-x 2 root root 1024 Feb 17 23:27 floppy drwxr-xr-x 2 root root 1024 Feb 17 23:27 floppyB drwxr-xr-x 3 root root 1024 Feb 18 00:33 lib drwxr-xr-x 2 root root 1024 Feb 17 23:27 os2 -rwxr-xr-x 1 root root 2884 Feb 18 11:24 preinit drwxr-xr-x 2 root root 1024 Sep 5 17:57 proc drwxr-xr-x 2 root root 1024 Dec 7 09:53 root drwxr-xr-x 2 root root 1024 Dec 17 12:40 sbin drwxr-xr-x 2 root root 1024 Feb 17 23:27 tinyos2 drwxr-xr-x 2 root root 1024 Nov 8 21:25 tmp drwxr-xr-x 2 root root 1024 Feb 17 23:30 usr drwxr-xr-x 7 root root 1024 Feb 18 03:19 var ./backup: total 0 ./biglinux: total 0 ./bin: total 687 -rwxr-xr-x 1 root root 461720 Jan 12 01:28 bash -rwxr-xr-x 1 root root 9668 Aug 9 1999 cat -rwxr-xr-x 1 root root 32176 Feb 5 06:45 cp -rwxr-xr-x 1 root root 25712 Nov 23 10:28 date -rwxr-xr-x 1 root root 6300 Nov 23 10:28 env -rwxr-xr-x 1 root root 10296 Dec 4 05:41 hostname -rwxr-xr-x 1 root root 9552 Nov 23 10:28 id -rwxr-xr-x 1 root root 18832 Feb 5 06:45 ln -rwxr-xr-x 1 root root 13088 Feb 5 06:45 mkdir -rwsr-xr-x 1 root root 65360 Feb 5 10:14 mount lrwxrwxrwx 1 root root 4 Feb 18 11:26 reset -> tset lrwxrwxrwx 1 root root 4 Feb 18 11:26 sh -> bash -rwxr-xr-x 1 root root 5952 Nov 23 10:28 sleep -rwxr-xr-x 1 root root 29200 Jan 26 15:56 tset ./cdrom: total 0 ./dev: total 0 lrwxrwxrwx 1 root root 4 Feb 18 11:26 cdrom -> scd0 lrwxrwxrwx 1 root root 4 Feb 18 11:26 console -> tty0 brw-rw-rw- 1 root disk 2, 0 Sep 7 10:17 fd0 brw-rw-rw- 1 root disk 2, 1 Sep 7 10:18 fd1 brw-rw---- 1 root disk 7, 0 Nov 9 00:05 loop0 brw-rw---- 1 root disk 7, 1 Nov 9 00:05 loop1 brw-rw---- 1 root disk 7, 2 Nov 9 00:05 loop2 brw-rw---- 1 root disk 7, 3 Nov 9 00:05 loop3 brw-rw---- 1 root disk 7, 4 Nov 9 00:05 loop4 brw-rw---- 1 root disk 7, 5 Nov 9 00:05 loop5 brw-rw---- 1 root disk 7, 6 Nov 9 00:05 loop6 brw-rw---- 1 root disk 7, 7 Nov 9 00:05 loop7 cr-xr-xr-x 1 root root 1, 3 Nov 9 00:14 null brwxrwx--- 1 root disk 1, 0 Nov 9 12:30 ram0 brwxrwx--- 1 root disk 1, 1 Sep 5 17:53 ram1 brwxrwx--- 1 root disk 1, 2 Nov 9 12:26 ram2 brwxrwx--- 1 root disk 1, 3 Nov 9 12:26 ram3 brwxrwx--- 1 root disk 1, 4 Nov 9 12:26 ram4 brwxrwx--- 1 root disk 1, 5 Nov 9 12:26 ram5 brwxrwx--- 1 root disk 1, 6 Nov 9 12:26 ram6 brwxrwx--- 1 root disk 1, 7 Nov 9 12:31 ram7 brw-rw-r-- 1 root disk 11, 0 Sep 3 19:12 scd0 brw-rw---- 1 root disk 8, 0 Sep 3 19:12 sda brw-rw---- 1 root disk 8, 1 Sep 3 19:12 sda1 brw-rw---- 1 root disk 8, 2 Sep 3 19:12 sda2 brw-rw---- 1 root disk 8, 3 Sep 3 19:12 sda3 brw-rw---- 1 root disk 8, 4 Sep 3 19:12 sda4 brw-rw---- 1 root disk 8, 5 Sep 3 19:12 sda5 brw-rw---- 1 root disk 8, 6 Sep 3 19:12 sda6 brw-rw---- 1 root disk 8, 7 Sep 3 19:12 sda7 brw-rw---- 1 root disk 8, 8 Sep 3 19:12 sda8 brw-rw---- 1 root disk 8, 16 Sep 3 19:12 sdb brw-rw---- 1 root disk 8, 17 Sep 3 19:12 sdb1 brw-rw---- 1 root disk 8, 18 Sep 3 19:12 sdb2 brw-rw---- 1 root disk 8, 19 Sep 3 19:12 sdb3 brw-rw---- 1 root disk 8, 20 Sep 3 19:12 sdb4 brw-rw---- 1 root disk 8, 21 Sep 3 19:12 sdb5 brw-rw---- 1 root disk 8, 22 Sep 3 19:12 sdb6 brw-rw---- 1 root disk 8, 23 Sep 3 19:12 sdb7 brw-rw---- 1 root disk 8, 24 Sep 3 19:12 sdb8 crw------- 1 root root 21, 0 Nov 7 19:45 sg0 crw------- 1 root root 21, 1 Nov 7 19:45 sg1 crw------- 1 root root 21, 10 Nov 7 19:45 sg10 crw------- 1 root root 21, 11 Nov 7 19:45 sg11 crw------- 1 root root 21, 12 Nov 7 19:45 sg12 crw------- 1 root root 21, 13 Nov 7 19:45 sg13 crw------- 1 root root 21, 14 Nov 7 19:45 sg14 crw------- 1 root root 21, 15 Nov 7 19:45 sg15 crw------- 1 root root 21, 16 Nov 7 19:45 sg16 crw------- 1 root root 21, 2 Nov 7 19:45 sg2 crw------- 1 root root 21, 3 Nov 7 19:45 sg3 crw------- 1 root root 21, 4 Nov 7 19:45 sg4 crw------- 1 root root 21, 5 Nov 7 19:45 sg5 crw------- 1 root root 21, 6 Nov 7 19:45 sg6 crw------- 1 root root 21, 7 Nov 7 19:45 sg7 crw------- 1 root root 21, 8 Nov 7 19:45 sg8 crw------- 1 root root 21, 9 Nov 7 19:45 sg9 crw-rw---- 1 root tty 4, 0 Sep 2 17:02 tty0 crw-rw---- 1 root tty 4, 1 Nov 12 18:09 tty1 crw-rw---- 1 root tty 4, 2 Nov 12 18:09 tty2 crw-rw---- 1 root tty 4, 3 Nov 12 18:09 tty3 crw-rw---- 1 root tty 4, 4 Nov 12 18:09 tty4 crw-rw---- 1 root tty 4, 5 Nov 12 18:09 tty5 crw-rw---- 1 root tty 4, 6 Nov 12 18:09 tty6 crw-rw---- 1 root tty 4, 7 Nov 12 18:09 tty7 crw-r--r-- 1 root root 1, 9 Nov 12 18:17 urandom crw------- 1 root sys 7, 0 Sep 8 18:53 vcs0 crw------- 1 root sys 7, 1 Sep 8 18:53 vcs1 crw------- 1 root sys 7, 2 Sep 8 18:53 vcs2 crw------- 1 root sys 7, 3 Sep 8 18:53 vcs3 crw------- 1 root sys 7, 4 Sep 8 18:53 vcs4 crw------- 1 root sys 7, 5 Sep 8 18:53 vcs5 crw------- 1 root sys 7, 6 Sep 8 18:53 vcs6 crw------- 1 root sys 7, 128 Sep 8 18:53 vcsa crw------- 1 root sys 7, 129 Sep 8 18:53 vcsa1 crw------- 1 root sys 7, 130 Sep 8 18:53 vcsa2 crw------- 1 root sys 7, 131 Sep 8 18:53 vcsa3 crw------- 1 root sys 7, 132 Sep 8 18:53 vcsa4 crw------- 1 root sys 7, 133 Sep 8 18:53 vcsa5 crw------- 1 root sys 7, 134 Sep 8 18:53 vcsa6 crw-rw-rw- 1 root root 1, 5 Nov 9 00:05 zero ./dos: total 0 ./etc: total 25 -rw-r--r-- 1 root root 82 Feb 11 13:58 bash.bashrc drwxr-xr-x 2 root root 1024 Feb 9 14:24 default -rw-r--r-- 1 root root 967 Feb 18 02:31 fstab -rw-r--r-- 1 root root 488 Feb 11 04:30 group -rw-r--r-- 1 root root 74 Nov 8 23:49 hexdump.fmt -rw-r--r-- 1 root root 6 Feb 6 02:30 hostname drwxr-xr-x 2 root root 1024 Feb 18 03:28 init.d -rw-r--r-- 1 root root 634 Feb 14 19:04 inittab -rw-r--r-- 1 root root 37 Feb 11 04:30 issue -rw-r--r-- 1 root root 1 Feb 11 04:40 ld.so.cache -rw-r--r-- 1 root root 1 Feb 11 04:44 ld.so.conf -rw-r--r-- 1 root root 39 Feb 10 15:17 mtab -rw-r--r-- 1 root root 1400 Feb 14 11:34 passwd -rw-r--r-- 1 root root 378 Feb 18 03:26 profile drwxr-xr-x 2 root root 1024 Feb 14 17:54 rc0.d drwxr-xr-x 2 root root 1024 Feb 14 17:55 rc1.d drwxr-xr-x 2 root root 1024 Feb 11 04:09 rc2.d drwxr-xr-x 2 root root 1024 Feb 14 17:56 rc3.d drwxr-xr-x 2 root root 1024 Feb 14 17:57 rc4.d drwxr-xr-x 2 root root 1024 Feb 14 17:57 rc5.d drwxr-xr-x 2 root root 1024 Feb 14 17:59 rc6.d drwxr-xr-x 2 root root 1024 Feb 14 19:02 rcS.d drwxr-xr-x 3 root root 1024 Feb 15 03:49 terminfo -rw-r--r-- 1 root root 11 Feb 11 06:01 timezone ./etc/default: total 2 -rw-r--r-- 1 root root 92 Nov 5 09:04 devpts -rwxr--r-- 1 root root 589 Feb 9 14:24 rcS ./etc/init.d: total 28 -rwxr-xr-x 1 root root 1934 Feb 14 18:17 bootmisc.sh -rwxr-xr-x 1 root root 731 Feb 11 04:05 checkfs.sh -rwxr-xr-x 1 root root 2943 Feb 11 04:05 checkroot.sh -rwxr-xr-x 1 root root 1087 Feb 11 04:05 devpts.sh -rwxr-xr-x 1 root root 281 Feb 11 04:05 halt -rwxr-xr-x 1 root root 132 Feb 11 04:05 hostname.sh -rwxr-xr-x 1 root root 395 Feb 11 04:05 isapnp -rwxr-xr-x 1 root root 583 Feb 18 03:28 mountall.sh -rwxr-xr-x 1 root root 1013 Feb 11 04:05 procps.sh -rwxr-xr-x 1 root root 2213 Feb 11 04:05 rc -rwxr-xr-x 1 root root 1190 Feb 11 04:05 rcS -rwxr-xr-x 1 root root 197 Feb 11 04:05 reboot -rwxr-xr-x 1 root root 252 Feb 11 04:05 rmnologin -rwxr-xr-x 1 root root 349 Feb 11 04:05 sendsigs -rwxr-xr-x 1 root root 476 Feb 11 04:05 single -rwxr-xr-x 1 root root 1471 Feb 11 04:05 sysklogd -rwxr-xr-x 1 root root 488 Feb 11 04:05 umountfs -rwxr-xr-x 1 root root 96 Nov 12 17:09 update -rwxr-xr-x 1 root root 1128 Feb 11 04:05 urandom ./etc/rc0.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 K90sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 18 Feb 18 11:26 S20sendsigs -> ../init.d/sendsigs lrwxrwxrwx 1 root root 17 Feb 18 11:26 S30urandom -> ../init.d/urandom lrwxrwxrwx 1 root root 18 Feb 18 11:26 S40umountfs -> ../init.d/umountfs lrwxrwxrwx 1 root root 14 Feb 18 11:26 S90halt -> ../init.d/halt ./etc/rc1.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 K90sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 16 Feb 18 11:26 S20single -> ../init.d/single ./etc/rc2.d: total 0 lrwxrwxrwx 1 root root 19 Feb 18 11:26 S99rmnologin -> ../init.d/rmnologin ./etc/rc3.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 S10sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 19 Feb 18 11:26 S99rmnologin -> ../init.d/rmnologin ./etc/rc4.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 S10sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 19 Feb 18 11:26 S99rmnologin -> ../init.d/rmnologin ./etc/rc5.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 S10sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 19 Feb 18 11:26 S99rmnologin -> ../init.d/rmnologin ./etc/rc6.d: total 0 lrwxrwxrwx 1 root root 18 Feb 18 11:26 K90sysklogd -> ../init.d/sysklogd lrwxrwxrwx 1 root root 18 Feb 18 11:26 S20sendsigs -> ../init.d/sendsigs lrwxrwxrwx 1 root root 17 Feb 18 11:26 S30urandom -> ../init.d/urandom lrwxrwxrwx 1 root root 18 Feb 18 11:26 S40umountfs -> ../init.d/umountfs lrwxrwxrwx 1 root root 16 Feb 18 11:26 S90reboot -> ../init.d/reboot ./etc/rcS.d: total 0 lrwxrwxrwx 1 root root 22 Feb 18 11:26 S10checkroot.sh -> ../init.d/checkroot.sh lrwxrwxrwx 1 root root 16 Feb 18 11:26 S15isapnp -> ../init.d/isapnp lrwxrwxrwx 1 root root 20 Feb 18 11:26 S30checkfs.sh -> ../init.d/checkfs.sh lrwxrwxrwx 1 root root 19 Feb 18 11:26 S30procps.sh -> ../init.d/procps.sh lrwxrwxrwx 1 root root 19 Feb 18 11:26 S35devpts.sh -> ../init.d/devpts.sh lrwxrwxrwx 1 root root 21 Feb 18 11:26 S35mountall.sh -> ../init.d/mountall.sh lrwxrwxrwx 1 root root 21 Feb 18 11:26 S40hostname.sh -> ../init.d/hostname.sh lrwxrwxrwx 1 root root 21 Feb 18 11:26 S55bootmisc.sh -> ../init.d/bootmisc.sh lrwxrwxrwx 1 root root 17 Feb 18 11:26 S55urandom -> ../init.d/urandom ./etc/terminfo: total 1 drwxr-xr-x 2 root root 1024 Feb 15 03:49 l ./etc/terminfo/l: total 2 -rw-r--r-- 1 root root 1563 Feb 15 03:49 linux ./extra: total 0 ./floppy: total 0 ./floppyB: total 0 ./lib: total 1195 -rwxr-xr-x 1 root root 83939 Feb 7 18:13 ld-2.1.3.so lrwxrwxrwx 1 root root 11 Feb 18 11:26 ld-linux.so.2 -> ld-2.1.3.so -rwxr-xr-x 1 root root 886932 Feb 7 18:13 libc-2.1.3.so lrwxrwxrwx 1 root root 13 Feb 18 11:26 libc.so.6 -> libc-2.1.3.so -rw-r--r-- 1 root root 9372 Feb 7 18:13 libdl-2.1.3.so lrwxrwxrwx 1 root root 14 Feb 18 11:26 libdl.so.2 -> libdl-2.1.3.so lrwxrwxrwx 1 root root 17 Feb 18 11:26 libncurses.so.5 -> libncurses.so.5.0 -rw-r--r-- 1 root root 232780 Jan 26 15:56 libncurses.so.5.0 drwxr-xr-x 3 root root 1024 Nov 8 18:04 terminfo ./lib/terminfo: total 1 drwxr-xr-x 2 root root 1024 Nov 8 18:04 l ./lib/terminfo/l: total 2 -rw-r--r-- 1 root root 1549 Nov 8 18:04 linux ./os2: total 0 ./proc: total 0 ./root: total 2 -rw-r--r-- 1 root root 810 Feb 18 02:34 .bashrc -rw-r--r-- 1 root root 141 Dec 7 08:29 .profile ./sbin: total 0 ./tinyos2: total 0 ./tmp: total 0 ./usr: total 0 ./var: total 5 drwxr-xr-x 3 root root 1024 Feb 17 23:26 lib drwxr-xr-x 2 root root 1024 Feb 18 02:41 lock drwxr-xr-x 2 root root 1024 Feb 18 03:19 log drwxr-xr-x 2 root root 1024 Nov 12 17:50 run drwxr-xr-x 3 root root 1024 Dec 7 08:49 state ./var/lib: total 1 drwxr-xr-x 2 root root 1024 Feb 17 23:26 locate ./var/lib/locate: total 0 ./var/lock: total 0 ./var/log: total 0 ./var/run: total 1 -rw------- 1 root root 512 Nov 12 15:59 random-seed -rw-r--r-- 1 root root 0 Nov 12 01:59 utmp ./var/state: total 1 drwxr-xr-x 2 root root 1024 Dec 7 08:50 misc ./var/state/misc: total 0 -rw-r--r-- 1 root root 0 Dec 7 08:50 locatedb
These basic directories and files form the nucleus of our root filesystem. (Actually, some of these could also be loaded instead by /preinit, but they are included here because there was still room available after the bare essential files had been included.)
This is very similar to the root diskette of the two-diskette boot system except that quite a few files have been purged so that, when compressed, this can fit together with the kernel, map, etc., into the single 1440-KB boot image bootImage being stashed in the CD-ROM as its "El Torito" boot image.
As we noted above, the kernel has been instructed by the init=/preinit appended boot parameter to start up a shell (/bin/sh -> /bin/bash) and run /preinit which may be either a program or a shell script and must have execute permission. In our case, /preinit is a script and has the following contents:
#!/bin/sh mount -t iso9660 -o ro /dev/scd0 /cdrom || mount -t ext2 -o ro /dev/sdb5 /cdrom cp -a /cdrom/boot/bootCD/sbin/e2fsck /sbin cp -a /cdrom/boot/bootCD/sbin/fdisk /sbin cp -a /cdrom/boot/bootCD/sbin/halt /sbin cp -a /cdrom/boot/bootCD/sbin/init /sbin cp -a /cdrom/boot/bootCD/sbin/killall5 /sbin cp -a /cdrom/boot/bootCD/sbin/ldconfig /sbin cp -a /cdrom/boot/bootCD/sbin/mingetty /sbin cp -a /cdrom/boot/bootCD/sbin/mke2fs /sbin cp -a /cdrom/boot/bootCD/sbin/reboot /sbin cp -a /cdrom/boot/bootCD/sbin/shutdown /sbin cp -a /cdrom/boot/bootCD/sbin/sulogin /sbin cp -a /cdrom/boot/bootCD/sbin/telinit /sbin cp -a /cdrom/boot/bootCD/sbin/update /sbin cp -a /cdrom/boot/bootCD/bin/chgrp /bin cp -a /cdrom/boot/bootCD/bin/chmod /bin cp -a /cdrom/boot/bootCD/bin/chown /bin cp -a /cdrom/boot/bootCD/bin/dd /bin cp -a /cdrom/boot/bootCD/bin/df /bin cp -a /cdrom/boot/bootCD/bin/dmesg /bin cp -a /cdrom/boot/bootCD/bin/grep /bin cp -a /cdrom/boot/bootCD/bin/gunzip /bin cp -a /cdrom/boot/bootCD/bin/gzip /bin cp -a /cdrom/boot/bootCD/bin/ls /bin cp -a /cdrom/boot/bootCD/bin/mknod /bin cp -a /cdrom/boot/bootCD/bin/mv /bin cp -a /cdrom/boot/bootCD/bin/ps /bin cp -a /cdrom/boot/bootCD/bin/rm /bin cp -a /cdrom/boot/bootCD/bin/rmdir /bin cp -a /cdrom/boot/bootCD/bin/sed /bin cp -a /cdrom/boot/bootCD/bin/stty /bin cp -a /cdrom/boot/bootCD/bin/tar /bin cp -a /cdrom/boot/bootCD/bin/umount /bin cp -a /cdrom/boot/bootCD/bin/uname /bin cp -a /cdrom/boot/bootCD/lib/libcom_err* /lib cp -a /cdrom/boot/bootCD/lib/libcrypt* /lib cp -a /cdrom/boot/bootCD/lib/libe2p* /lib cp -a /cdrom/boot/bootCD/lib/libext2fs* /lib cp -a /cdrom/boot/bootCD/lib/libnss_db* /lib cp -a /cdrom/boot/bootCD/lib/libnss_files* /lib cp -a /cdrom/boot/bootCD/lib/libproc* /lib cp -a /cdrom/boot/bootCD/lib/libuuid* /lib mke2fs /dev/ram1 mount -t ext2 /dev/ram1 /usr mkdir /usr/bin /usr/sbin /usr/lib /usr/lib/locate cp -a /cdrom/boot/bootCD/usr/sbin/chroot /usr/sbin cp -a /cdrom/boot/bootCD/usr/bin/cdrecord /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/dircolors /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/du /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/find /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/free /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/hexdump /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/less /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/locate /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/mkisofs /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/setterm /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/sort /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/tput /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/updatedb /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/vi /usr/bin cp -a /cdrom/boot/bootCD/usr/bin/vim /usr/bin cp -a /cdrom/boot/bootCD/usr/lib/locate/bigram /usr/lib/locate cp -a /cdrom/boot/bootCD/usr/lib/locate/code /usr/lib/locate cp -a /cdrom/boot/bootCD/usr/lib/locate/frcode /usr/lib/locate umount /cdrom exec /sbin/init
These mount the CD-ROM and load the remaining programs from it. At the end, the CD-ROM is unmounted and control is transferred over to /sbin/init using an exec shell command so that /sbin/init will take over as Process 1.
Because my machine has lots of RAM, this script sets up a second ramdisk device, /dev/ram1 and mounts it to be /usr. Thus, my ram-based system has, in effect, 64 MB of ramdisk space to work with.
Finally, as mentioned earlier, all of this is coordinated by the four shell scripts, each set executable with "chmod +x ..." commands. The first, startBootImage, creates from scratch the 1440-KB boot diskette image:
#!/bin/sh # # startBootImage - a shell script to assemble all of the "El Torito" # boot image except for the initial ramdisk. # dd if=/dev/zero of=bootImage bs=1k count=1440 mke2fs -m 0 -F /boot/bootCD/bootImage mount -t ext2 -o loop /boot/bootCD/bootImage mnt_boot cd /boot/bootCD/mnt_boot rm -rf lost+found mkdir dev cd dev mknod null c 1 3; chmod 555 null ; chown root:root null mknod fd0 b 2 0; chmod 666 fd0 ; chown root:disk fd0 mknod fd1 b 2 2; chmod 666 fd0 ; chown root:disk fd0 mknod sda b 8 0; chmod 660 sda ; chown root:disk sda mknod sda1 b 8 1; chmod 660 sda1 ; chown root:disk sda1 mknod sda2 b 8 2; chmod 660 sda2 ; chown root:disk sda2 mknod sda3 b 8 3; chmod 660 sda3 ; chown root:disk sda3 mknod sda4 b 8 4; chmod 660 sda4 ; chown root:disk sda4 mknod sda5 b 8 5; chmod 660 sda5 ; chown root:disk sda5 mknod sda6 b 8 6; chmod 660 sda6 ; chown root:disk sda6 mknod sdb b 8 16; chmod 660 sdb ; chown root:disk sdb mknod sdb1 b 8 17; chmod 660 sdb1 ; chown root:disk sdb1 mknod sdb2 b 8 18; chmod 660 sdb2 ; chown root:disk sdb2 mknod sdb3 b 8 19; chmod 660 sdb3 ; chown root:disk sdb3 mknod sdb4 b 8 20; chmod 660 sdb4 ; chown root:disk sdb4 mknod sdb5 b 8 21; chmod 660 sdb5 ; chown root:disk sdb5 mknod sdb6 b 8 22; chmod 660 sdb6 ; chown root:disk sdb6 mknod scd0 b 11 0; chmod 440 scd0 ; chown root:disk scd0 mknod scd1 b 11 1; chmod 440 scd1 ; chown root:disk scd1 cd .. mkdir boot cd boot cp /boot/boot.b . cp /boot/chain.b . cd .. cp /boot/vmlinuz-2.2.14 . cp /boot/bootCD/bootImage_lilo.conf lilo.conf ls -AlR
A second script, startRootImage, is analogous to the script start of the 2-diskette boot system but begins with a 32-MB, zeroed ext2 filesystem.
#!/bin/sh # # startRootImage - a shell script to prepare for editing of initial ramdisk # cd /boot/bootCD mv /boot/bootCD/rootfs_new.gz /boot/bootCD/rootfs_old.gz dd if=/dev/zero of=/boot/bootCD/rootfs_new bs=1k count=32768 mke2fs -m 0 -F /boot/bootCD/rootfs_new gunzip /boot/bootCD/rootfs_old.gz mount -o loop /boot/bootCD/rootfs_new /boot/bootCD/mnt_new mount -o loop /boot/bootCD/rootfs_old /boot/bootCD/mnt_old rmdir /boot/bootCD/mnt_new/lost+found df
This prepares for editing the self-filling filesystem with the /preinit script. You edit rootfs_old (mounted on mnt_old) according to your needs, making sure that its compressed image together with the kernel, map, etc. can still fit into the boot diskette image. This limits it to about 900 KB when compressed. The version shown here is 790 KB.
Finally, you can start finishing up. First you wrap up rootfs_old with the script finishRootImage:
#!/bin/sh # # finishRootImage - a shell script to finish up after editing an initial ramdisk # cd /boot/bootCD/mnt_old cp -a . /boot/bootCD/mnt_new cd .. df umount /boot/bootCD/mnt_new /boot/bootCD/mnt_old gzip -v9 /boot/bootCD/rootfs_new gzip -v9 /boot/bootCD/rootfs_old ls -Al echo "***************************************************" echo "******* Don't forget to run finishBootImage *******" echo "******* with a diskette in /dev/fd0 *******" echo "***************************************************"
Next, bootImage is completed by placing a diskette in /dev/fd0 and running the script finishBootImage:
# Finish making bootImage cp /boot/bootCD/rootfs_new.gz /boot/bootCD/mnt_boot umount /boot/bootCD/bootImage dd if=/boot/bootCD/bootImage of=/dev/fd0 bs=1k count=1440 mount -t ext2 /dev/fd0 /boot/bootCD/mnt_boot /sbin/lilo -C /boot/bootCD/mnt_boot/lilo.conf ls -R /boot/bootCD/mnt_boot umount /boot/bootCD/mnt_boot dd if=/dev/fd0 of=/boot/bootCD/bootImage bs=1k count=1440
It is strange that we apparently need to use an actual diskette at this point, but that seems to be required in order to give /sbin/lilo a chance to stash the boot sector in the first sector of the image. Lilo doesn't seem to know how to do this with a mounted loop filesystem. Anyway, it doesn't hurt to have such a diskette around if for some reason you find yourself using a CD and/or SCSI BIOS that doesn't support the "El Torito" system. The diskette itself can be booted and will copy the programs it needs from the CD-ROM. You end up with the same RAM-based Linux system either way.
We now finally have created the 1440-KB boot Image. In this particular case, I am making a bootable backup of my entire Linux system. I boot from a rescue disk (or CD) into a Linux system completely in RAM and package my quiescent hard disk Linux installation (/mnt/biglinux) into a CD-ROM filesystem by using the utility mkisofs. The complete command with arguments suitable for this on my system is:
mkisofs -D -R -v -d -L -b boot/bootCD/bootImage \ -c boot/bootCD/boot.catalog \ -o /mnt/extra/biglinux.isofs \ /mnt/biglinux
Here, besides the boot image specification (-b boot/bootCD/bootImage), we are required to specify a place where a "catalog" is placed ( -c boot/bootCD/boot.catalog), a hard disk file path for the temporary several-hundred MB CD-ROM filesystem file (/mnt/extra/biglinux.isofs), and the path to the files being written (/mnt/biglinux). The files written to the CD-ROM must, of course, include the files to be loaded by /preinit as well as the boot image and catalog files.
This large CD-ROM image file, biglinux.isofs is finally placed onto the CD-ROM itself by cdrecord using an instruction something like:
cdrecord -v speed=2 dev=0,6,0 -data /mnt/extra/biglinux.isofs
On my system, the CD writer is on my only (0th) SCSI chain, has a unit id of 6 and a logical unit number of 0 -- hence the dev=0,6,0 specification.
It might be necessary to reset your motherboard BIOS to look for a boot from the SCSI system, and the SCSI BIOS to look for a bootable CD-ROM before checking the fixed disks.
If all is well, the next time you reboot with this CD-ROM in your drive, you will find yourself running a complete Linux system in RAM. You will be, in effect, safely floating above your hard disk partitions able to examine, tweek, and back them up while they are inactive.
Last updated: April 10, 2006
Contact Craig Van Degrift if you have problems or questions with this web site.