How to make a ram disk
Tony Harris
version 1.1, 23 Feb 2001
ram disk eenie-weenie HOWTO
If your root file system is on a device for which your kernel has no
compiled-in driver, you will need to use lilo to load
that driver as a module very early in the boot cycle.
There are only two steps:
  - make a ram disk image with mkinitrd
- modify lilo.conf to point to the image
First, I cd over to/boot:
System.map		 chain.b		  module-info-2.2.16-3ext3
System.map-2.2.16-3	 initrd-2.2.16-3.img	  vmlinux-2.2.16-3
System.map-2.2.16-3ext3  vmlinux-2.2.16-3ext3
vmlinuz                  kernel.h		  
boot.b			 map			  vmlinuz-2.2.16-3
module-info		 vmlinuz-2.2.16-3ext3     module-info-2.2.16-3
		 
Here you can see that I have a 2.2.16-3 kernel and I have added a
second kernel with ext3 support
(vmlinuz-2.2.16-3ext3). There is already a ram disk image
for my first kernel (initrd-2.2.16-3.img)
To make a new image for the second kernel, I type the following (stuff 
    I type is in bold):
/boot# mkinitrd initrd-2.2.16-3ext3.img 2.2.16-3ext3
mkinitrd is a shellscript that looks at the modules needed by my
    kernel, then makes an ext2 filesystem containing them.
If we look inside the image we see this is the case:
/boot# cat initrd-2.2.16-3ext3.img | gunzip > /tmp/myimage
/boot# file /tmp/myimage
/tmp/myimage: Linux/i386 ext2 filesystem
You do not have to look inside your image. Only making the image and
modifying lilo.conf are necessary steps. However, discussion of the
ramdisk image is provided for pedagogic purposes.
In order to look inside, I need to mount the image as though it 
 were a filesystem:
/boot# mount /tmp/myimage /mnt/tmp -t ext2 -o loop=/dev/loop3
/boot# ls /mnt/tmp
bin  dev  etc  lib  linuxrc
/boot# find /mnt/tmp
/mnt/tmp
/mnt/tmp/lib
/mnt/tmp/lib/aic7xxx.o
/mnt/tmp/bin
/mnt/tmp/bin/sh
/mnt/tmp/bin/insmod
/mnt/tmp/etc
/mnt/tmp/dev
/mnt/tmp/dev/console
/mnt/tmp/dev/null
/mnt/tmp/dev/ram
/mnt/tmp/dev/systty
/mnt/tmp/dev/tty1
/mnt/tmp/dev/tty2
/mnt/tmp/dev/tty3
/mnt/tmp/dev/tty4
/mnt/tmp/linuxrc
The most important part of this ram disk image is
aic7xxx.o, which is my scsi module.
Finally, I move on to the last step, modifying
/etc/lilo.conf:
 
Here is my entry in lilo.conf that
corresponds to the kernel and image I just created:
        image=/boot/vmlinuz-2.2.16-3ext3
	label=linux.ext3
	initrd=/boot/initrd-2.2.16-3ext3.img
	read-only
	root=/dev/hdb3
That's it. Run lilo as root and reboot. 
If you have problems, check out the kernel HOWTO. There are a couple things you need to have
covered: you need your kernel modules compiled and living in
/lib/modules and you need to have an entry for each
module in /etc/conf.modules.
Making a generic ram disk
  - Make sure ram disk support is compiled in your kernel. If you
  don't have it, see the miniroot
  HOWTO for mounting via loopback.
 
 
- Create a ramdisk device if one does not already exist in /dev:
 
 /home/tony# mknod -m 660 /dev/ram b 1 1
 /home/tony# chown root.disk /dev/ram
 
 
- Zero out the space you need on the ramdisk device:
 
 /home/tony# dd if=/dev/zero of=/dev/ram bs=1k count=4k
 
4096+0 records in
4096+0 records out
 
- Make a file system on the ram disk, specifying the size:
 /home/tony# /sbin/mkfs -t ext2 -m 0 /dev/ram 4096
 mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done
 
- Mount the ram disk as you would a regular device:
 /home/tony# mount -t ext2 /dev/ram /mnt/disk