|
|
Using the RAM disk block device with Linux
|
Using the RAM disk block device with Linux
|
------------------------------------------
|
------------------------------------------
|
|
|
Contents:
|
Contents:
|
|
|
1) Overview
|
1) Overview
|
2) Kernel Command Line Parameters
|
2) Kernel Command Line Parameters
|
3) Using "rdev -r" With New Kernels
|
3) Using "rdev -r" With New Kernels
|
4) An Example of Creating a Compressed ramdisk
|
4) An Example of Creating a Compressed ramdisk
|
|
|
|
|
1) Overview
|
1) Overview
|
-----------
|
-----------
|
|
|
As of kernel v1.3.48, the ramdisk driver was substantially changed.
|
As of kernel v1.3.48, the ramdisk driver was substantially changed.
|
|
|
The older versions would grab a chunk of memory off the top before
|
The older versions would grab a chunk of memory off the top before
|
handing the remainder to the kernel at boot time. Thus a size parameter
|
handing the remainder to the kernel at boot time. Thus a size parameter
|
had to be specified via "ramdisk=1440" or "rdev -r /dev/fd0 1440" so
|
had to be specified via "ramdisk=1440" or "rdev -r /dev/fd0 1440" so
|
that the driver knew how much memory to grab.
|
that the driver knew how much memory to grab.
|
|
|
Now the ramdisk dynamically grows as more space is required. It does
|
Now the ramdisk dynamically grows as more space is required. It does
|
this by using RAM from the buffer cache. The driver marks the buffers
|
this by using RAM from the buffer cache. The driver marks the buffers
|
it is using with a new "BH_Protected" flag so that the kernel does
|
it is using with a new "BH_Protected" flag so that the kernel does
|
not try to reuse them later. This means that the old size parameter
|
not try to reuse them later. This means that the old size parameter
|
is no longer used, new command line parameters exist, and the behavior
|
is no longer used, new command line parameters exist, and the behavior
|
of the "rdev -r" or "ramsize" (usually a symbolic link to "rdev")
|
of the "rdev -r" or "ramsize" (usually a symbolic link to "rdev")
|
command has changed.
|
command has changed.
|
|
|
Also, the new ramdisk supports up to 16 ramdisks out of the box, and can
|
Also, the new ramdisk supports up to 16 ramdisks out of the box, and can
|
be reconfigured in rd.c to support up to 255 ramdisks. To use multiple
|
be reconfigured in rd.c to support up to 255 ramdisks. To use multiple
|
ramdisk support with your system, run 'mknod /dev/ramX b 1 X' and chmod
|
ramdisk support with your system, run 'mknod /dev/ramX b 1 X' and chmod
|
(to change it's permissions) it to your liking. The default /dev/ram(disk)
|
(to change it's permissions) it to your liking. The default /dev/ram(disk)
|
uses minor #1, so start with ram2 and go from there.
|
uses minor #1, so start with ram2 and go from there.
|
|
|
The old "ramdisk=" has been changed to "ramdisk_size="
|
The old "ramdisk=" has been changed to "ramdisk_size="
|
to make it clearer. The original "ramdisk=" has been kept around
|
to make it clearer. The original "ramdisk=" has been kept around
|
for compatibility reasons, but it will probably be removed in 2.1.x.
|
for compatibility reasons, but it will probably be removed in 2.1.x.
|
|
|
The new ramdisk also has the ability to load compressed ramdisk images,
|
The new ramdisk also has the ability to load compressed ramdisk images,
|
allowing one to squeeze more programs onto an average installation or
|
allowing one to squeeze more programs onto an average installation or
|
rescue floppy disk.
|
rescue floppy disk.
|
|
|
Notes: You may have "dev/ram" or "/dev/ramdisk" or both. They are
|
Notes: You may have "dev/ram" or "/dev/ramdisk" or both. They are
|
equivalent from the standpoint of this document. Also, the new ramdisk
|
equivalent from the standpoint of this document. Also, the new ramdisk
|
is a config option. When running "make config", make sure you enable
|
is a config option. When running "make config", make sure you enable
|
ramdisk support for the kernel you intend to use the ramdisk with.
|
ramdisk support for the kernel you intend to use the ramdisk with.
|
|
|
|
|
2) Kernel Command Line Parameters
|
2) Kernel Command Line Parameters
|
---------------------------------
|
---------------------------------
|
|
|
ramdisk_start=NNN
|
ramdisk_start=NNN
|
=================
|
=================
|
|
|
To allow a kernel image to reside on a floppy disk along with a compressed
|
To allow a kernel image to reside on a floppy disk along with a compressed
|
ramdisk image, the "ramdisk_start=" command was added. The kernel
|
ramdisk image, the "ramdisk_start=" command was added. The kernel
|
can't be included into the compressed ramdisk filesystem image, because
|
can't be included into the compressed ramdisk filesystem image, because
|
it needs to be stored starting at block zero so that the BIOS can load the
|
it needs to be stored starting at block zero so that the BIOS can load the
|
bootsector and then the kernel can bootstrap itself to get going.
|
bootsector and then the kernel can bootstrap itself to get going.
|
|
|
Note: If you are using an uncompressed ramdisk image, then the kernel can
|
Note: If you are using an uncompressed ramdisk image, then the kernel can
|
be a part of the filesystem image that is being loaded into the ramdisk,
|
be a part of the filesystem image that is being loaded into the ramdisk,
|
and the floppy can be booted with LILO, or the two can be separate as
|
and the floppy can be booted with LILO, or the two can be separate as
|
is done for the compressed images.
|
is done for the compressed images.
|
|
|
If you are using a two-disk boot/root setup (kernel on #1, ramdisk image
|
If you are using a two-disk boot/root setup (kernel on #1, ramdisk image
|
on #2) then the ramdisk would start at block zero, and an offset of
|
on #2) then the ramdisk would start at block zero, and an offset of
|
zero would be used. Since this is the default value, you would not need
|
zero would be used. Since this is the default value, you would not need
|
to actually use the command at all.
|
to actually use the command at all.
|
|
|
If instead, you have a "zImage" of about 350k, and a "fs_image.gz" of
|
If instead, you have a "zImage" of about 350k, and a "fs_image.gz" of
|
say about 1MB, and you want them both on the same disk, then you
|
say about 1MB, and you want them both on the same disk, then you
|
would use an offset. If you stored the "fs_image.gz" onto the floppy
|
would use an offset. If you stored the "fs_image.gz" onto the floppy
|
starting at an offset of 400kB, you would use "ramdisk_start=400".
|
starting at an offset of 400kB, you would use "ramdisk_start=400".
|
|
|
|
|
load_ramdisk=N
|
load_ramdisk=N
|
==============
|
==============
|
|
|
This parameter tells the kernel whether it is to try to load a
|
This parameter tells the kernel whether it is to try to load a
|
ramdisk image or not. Specifying "load_ramdisk=1" will tell the
|
ramdisk image or not. Specifying "load_ramdisk=1" will tell the
|
kernel to load a floppy into the ramdisk. The default value is
|
kernel to load a floppy into the ramdisk. The default value is
|
zero, meaning that the kernel should not try to load a ramdisk.
|
zero, meaning that the kernel should not try to load a ramdisk.
|
|
|
|
|
prompt_ramdisk=N
|
prompt_ramdisk=N
|
================
|
================
|
|
|
This parameter tells the kernel whether or not to give you a prompt
|
This parameter tells the kernel whether or not to give you a prompt
|
asking you to insert the floppy containing the ramdisk image. In
|
asking you to insert the floppy containing the ramdisk image. In
|
a single floppy configuration the ramdisk image is on the same floppy
|
a single floppy configuration the ramdisk image is on the same floppy
|
as the kernel that just finished loading/booting and so a prompt
|
as the kernel that just finished loading/booting and so a prompt
|
is not needed. In this case one can use "prompt_ramdisk=0". In a
|
is not needed. In this case one can use "prompt_ramdisk=0". In a
|
two floppy configuration, you will need the chance to switch disks,
|
two floppy configuration, you will need the chance to switch disks,
|
and thus "prompt_ramdisk=1" can be used. Since this is the default
|
and thus "prompt_ramdisk=1" can be used. Since this is the default
|
value, it doesn't really need to be specified.
|
value, it doesn't really need to be specified.
|
|
|
ramdisk_size=N
|
ramdisk_size=N
|
==============
|
==============
|
|
|
This parameter tells the ramdisk driver to set up ramdisks of Nk size. The
|
This parameter tells the ramdisk driver to set up ramdisks of Nk size. The
|
default is 4096 (4MB).
|
default is 4096 (4MB).
|
|
|
3) Using "rdev -r" With New Kernels
|
3) Using "rdev -r" With New Kernels
|
-----------------------------------
|
-----------------------------------
|
|
|
The usage of the word (two bytes) that "rdev -r" sets in the kernel image
|
The usage of the word (two bytes) that "rdev -r" sets in the kernel image
|
has changed. The low 11 bits (0 -> 10) specify an offset (in 1k blocks)
|
has changed. The low 11 bits (0 -> 10) specify an offset (in 1k blocks)
|
of up to 2MB (2^11) of where to find the ramdisk (this used to be the
|
of up to 2MB (2^11) of where to find the ramdisk (this used to be the
|
size). Bit 14 indicates that a ramdisk is to be loaded, and bit 15
|
size). Bit 14 indicates that a ramdisk is to be loaded, and bit 15
|
indicates whether a prompt/wait sequence is to be given before trying
|
indicates whether a prompt/wait sequence is to be given before trying
|
to read the ramdisk. Since the ramdisk dynamically grows as data is
|
to read the ramdisk. Since the ramdisk dynamically grows as data is
|
being written into it, a size field is no longer required. Bits 11
|
being written into it, a size field is no longer required. Bits 11
|
to 13 are not presently used and may as well be zero. These numbers
|
to 13 are not presently used and may as well be zero. These numbers
|
are no magical secrets, as seen below:
|
are no magical secrets, as seen below:
|
|
|
./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF
|
./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF
|
./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000
|
./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000
|
./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000
|
./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000
|
|
|
Consider a typical two floppy disk setup, where you will have the
|
Consider a typical two floppy disk setup, where you will have the
|
kernel on disk one, and have already put a ramdisk image onto disk #2.
|
kernel on disk one, and have already put a ramdisk image onto disk #2.
|
|
|
Hence you want to set bits 0 to 13 as zero, meaning that your ramdisk
|
Hence you want to set bits 0 to 13 as zero, meaning that your ramdisk
|
starts at an offset of zero kB from the beginning of the floppy.
|
starts at an offset of zero kB from the beginning of the floppy.
|
The command line equivalent is: "ramdisk_start=0"
|
The command line equivalent is: "ramdisk_start=0"
|
|
|
You want bit 14 as one, indicating that a ramdisk is to be loaded.
|
You want bit 14 as one, indicating that a ramdisk is to be loaded.
|
The command line equivalent is: "load_ramdisk=1"
|
The command line equivalent is: "load_ramdisk=1"
|
|
|
You want bit 15 as one, indicating that you want a prompt/keypress
|
You want bit 15 as one, indicating that you want a prompt/keypress
|
sequence so that you have a chance to switch floppy disks.
|
sequence so that you have a chance to switch floppy disks.
|
The command line equivalent is: "prompt_ramdisk=1"
|
The command line equivalent is: "prompt_ramdisk=1"
|
|
|
Putting that together gives 2^15 + 2^14 + 0 = 49152 for an rdev word.
|
Putting that together gives 2^15 + 2^14 + 0 = 49152 for an rdev word.
|
So to create disk one of the set, you would do:
|
So to create disk one of the set, you would do:
|
|
|
/usr/src/linux# cat arch/i386/boot/zImage > /dev/fd0
|
/usr/src/linux# cat arch/i386/boot/zImage > /dev/fd0
|
/usr/src/linux# rdev /dev/fd0 /dev/fd0
|
/usr/src/linux# rdev /dev/fd0 /dev/fd0
|
/usr/src/linux# rdev -r /dev/fd0 49152
|
/usr/src/linux# rdev -r /dev/fd0 49152
|
|
|
If you make a boot disk that has LILO, then for the above, you would use:
|
If you make a boot disk that has LILO, then for the above, you would use:
|
append = "ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1"
|
append = "ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1"
|
Since the default start = 0 and the default prompt = 1, you could use:
|
Since the default start = 0 and the default prompt = 1, you could use:
|
append = "load_ramdisk=1"
|
append = "load_ramdisk=1"
|
|
|
|
|
4) An Example of Creating a Compressed ramdisk
|
4) An Example of Creating a Compressed ramdisk
|
----------------------------------------------
|
----------------------------------------------
|
|
|
To create a ramdisk image, you will need a spare block device to
|
To create a ramdisk image, you will need a spare block device to
|
construct it on. This can be the ramdisk device itself, or an
|
construct it on. This can be the ramdisk device itself, or an
|
unused disk partition (such as an unmounted swap partition). For this
|
unused disk partition (such as an unmounted swap partition). For this
|
example, we will use the ramdisk device, "/dev/ram".
|
example, we will use the ramdisk device, "/dev/ram".
|
|
|
Note: This technique should not be done on a machine with less than 8MB
|
Note: This technique should not be done on a machine with less than 8MB
|
of RAM. If using a spare disk partition instead of /dev/ram, then this
|
of RAM. If using a spare disk partition instead of /dev/ram, then this
|
restriction does not apply.
|
restriction does not apply.
|
|
|
a) Decide on the ramdisk size that you want. Say 2MB for this example.
|
a) Decide on the ramdisk size that you want. Say 2MB for this example.
|
Create it by writing to the ramdisk device. (This step is not presently
|
Create it by writing to the ramdisk device. (This step is not presently
|
required, but may be in the future.) It is wise to zero out the
|
required, but may be in the future.) It is wise to zero out the
|
area (esp. for disks) so that maximal compression is achieved for
|
area (esp. for disks) so that maximal compression is achieved for
|
the unused blocks of the image that you are about to create.
|
the unused blocks of the image that you are about to create.
|
|
|
dd if=/dev/zero of=/dev/ram bs=1k count=2048
|
dd if=/dev/zero of=/dev/ram bs=1k count=2048
|
|
|
b) Make a filesystem on it. Say ext2fs for this example.
|
b) Make a filesystem on it. Say ext2fs for this example.
|
|
|
mke2fs -vm0 /dev/ram 2048
|
mke2fs -vm0 /dev/ram 2048
|
|
|
c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...)
|
c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...)
|
and unmount it again.
|
and unmount it again.
|
|
|
d) Compress the contents of the ramdisk. The level of compression
|
d) Compress the contents of the ramdisk. The level of compression
|
will be approximately 50% of the space used by the files. Unused
|
will be approximately 50% of the space used by the files. Unused
|
space on the ramdisk will compress to almost nothing.
|
space on the ramdisk will compress to almost nothing.
|
|
|
dd if=/dev/ram bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
|
dd if=/dev/ram bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
|
|
|
e) Put the kernel onto the floppy
|
e) Put the kernel onto the floppy
|
|
|
dd if=zImage of=/dev/fd0 bs=1k
|
dd if=zImage of=/dev/fd0 bs=1k
|
|
|
f) Put the ramdisk image onto the floppy, after the kernel. Use an offset
|
f) Put the ramdisk image onto the floppy, after the kernel. Use an offset
|
that is slightly larger than the kernel, so that you can put another
|
that is slightly larger than the kernel, so that you can put another
|
(possibly larger) kernel onto the same floppy later without overlapping
|
(possibly larger) kernel onto the same floppy later without overlapping
|
the ramdisk image. An offset of 400kB for kernels about 350kB in
|
the ramdisk image. An offset of 400kB for kernels about 350kB in
|
size would be reasonable. Make sure offset+size of ram_image.gz is
|
size would be reasonable. Make sure offset+size of ram_image.gz is
|
not larger than the total space on your floppy (usually 1440kB).
|
not larger than the total space on your floppy (usually 1440kB).
|
|
|
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
|
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
|
|
|
g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc.
|
g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc.
|
For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would
|
For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would
|
have 2^15 + 2^14 + 400 = 49552.
|
have 2^15 + 2^14 + 400 = 49552.
|
|
|
rdev /dev/fd0 /dev/fd0
|
rdev /dev/fd0 /dev/fd0
|
rdev -r /dev/fd0 49552
|
rdev -r /dev/fd0 49552
|
|
|
That is it. You now have your boot/root compressed ramdisk floppy. Some
|
That is it. You now have your boot/root compressed ramdisk floppy. Some
|
users may wish to combine steps (d) and (f) by using a pipe.
|
users may wish to combine steps (d) and (f) by using a pipe.
|
|
|
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
Paul Gortmaker 12/95
|
Paul Gortmaker 12/95
|
|
|