1 |
62 |
marcus.erl |
Using the RAM disk block device with Linux
|
2 |
|
|
------------------------------------------
|
3 |
|
|
|
4 |
|
|
Contents:
|
5 |
|
|
|
6 |
|
|
1) Overview
|
7 |
|
|
2) Kernel Command Line Parameters
|
8 |
|
|
3) Using "rdev -r"
|
9 |
|
|
4) An Example of Creating a Compressed RAM Disk
|
10 |
|
|
|
11 |
|
|
|
12 |
|
|
1) Overview
|
13 |
|
|
-----------
|
14 |
|
|
|
15 |
|
|
The RAM disk driver is a way to use main system memory as a block device. It
|
16 |
|
|
is required for initrd, an initial filesystem used if you need to load modules
|
17 |
|
|
in order to access the root filesystem (see Documentation/initrd.txt). It can
|
18 |
|
|
also be used for a temporary filesystem for crypto work, since the contents
|
19 |
|
|
are erased on reboot.
|
20 |
|
|
|
21 |
|
|
The RAM disk dynamically grows as more space is required. It does this by using
|
22 |
|
|
RAM from the buffer cache. The driver marks the buffers it is using as dirty
|
23 |
|
|
so that the VM subsystem does not try to reclaim them later.
|
24 |
|
|
|
25 |
|
|
The RAM disk supports up to 16 RAM disks by default, and can be reconfigured
|
26 |
|
|
to support an unlimited number of RAM disks (at your own risk). Just change
|
27 |
|
|
the configuration symbol BLK_DEV_RAM_COUNT in the Block drivers config menu
|
28 |
|
|
and (re)build the kernel.
|
29 |
|
|
|
30 |
|
|
To use RAM disk support with your system, run './MAKEDEV ram' from the /dev
|
31 |
|
|
directory. RAM disks are all major number 1, and start with minor number 0
|
32 |
|
|
for /dev/ram0, etc. If used, modern kernels use /dev/ram0 for an initrd.
|
33 |
|
|
|
34 |
|
|
The new RAM disk also has the ability to load compressed RAM disk images,
|
35 |
|
|
allowing one to squeeze more programs onto an average installation or
|
36 |
|
|
rescue floppy disk.
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
2) Kernel Command Line Parameters
|
40 |
|
|
---------------------------------
|
41 |
|
|
|
42 |
|
|
ramdisk_size=N
|
43 |
|
|
==============
|
44 |
|
|
|
45 |
|
|
This parameter tells the RAM disk driver to set up RAM disks of N k size. The
|
46 |
|
|
default is 4096 (4 MB) (8192 (8 MB) on S390).
|
47 |
|
|
|
48 |
|
|
ramdisk_blocksize=N
|
49 |
|
|
===================
|
50 |
|
|
|
51 |
|
|
This parameter tells the RAM disk driver how many bytes to use per block. The
|
52 |
|
|
default is 1024 (BLOCK_SIZE).
|
53 |
|
|
|
54 |
|
|
|
55 |
|
|
3) Using "rdev -r"
|
56 |
|
|
------------------
|
57 |
|
|
|
58 |
|
|
The usage of the word (two bytes) that "rdev -r" sets in the kernel image is
|
59 |
|
|
as follows. The low 11 bits (0 -> 10) specify an offset (in 1 k blocks) of up
|
60 |
|
|
to 2 MB (2^11) of where to find the RAM disk (this used to be the size). Bit
|
61 |
|
|
14 indicates that a RAM disk is to be loaded, and bit 15 indicates whether a
|
62 |
|
|
prompt/wait sequence is to be given before trying to read the RAM disk. Since
|
63 |
|
|
the RAM disk dynamically grows as data is being written into it, a size field
|
64 |
|
|
is not required. Bits 11 to 13 are not currently used and may as well be zero.
|
65 |
|
|
These numbers are no magical secrets, as seen below:
|
66 |
|
|
|
67 |
|
|
./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF
|
68 |
|
|
./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000
|
69 |
|
|
./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000
|
70 |
|
|
|
71 |
|
|
Consider a typical two floppy disk setup, where you will have the
|
72 |
|
|
kernel on disk one, and have already put a RAM disk image onto disk #2.
|
73 |
|
|
|
74 |
|
|
Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk
|
75 |
|
|
starts at an offset of 0 kB from the beginning of the floppy.
|
76 |
|
|
The command line equivalent is: "ramdisk_start=0"
|
77 |
|
|
|
78 |
|
|
You want bit 14 as one, indicating that a RAM disk is to be loaded.
|
79 |
|
|
The command line equivalent is: "load_ramdisk=1"
|
80 |
|
|
|
81 |
|
|
You want bit 15 as one, indicating that you want a prompt/keypress
|
82 |
|
|
sequence so that you have a chance to switch floppy disks.
|
83 |
|
|
The command line equivalent is: "prompt_ramdisk=1"
|
84 |
|
|
|
85 |
|
|
Putting that together gives 2^15 + 2^14 + 0 = 49152 for an rdev word.
|
86 |
|
|
So to create disk one of the set, you would do:
|
87 |
|
|
|
88 |
|
|
/usr/src/linux# cat arch/i386/boot/zImage > /dev/fd0
|
89 |
|
|
/usr/src/linux# rdev /dev/fd0 /dev/fd0
|
90 |
|
|
/usr/src/linux# rdev -r /dev/fd0 49152
|
91 |
|
|
|
92 |
|
|
If you make a boot disk that has LILO, then for the above, you would use:
|
93 |
|
|
append = "ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1"
|
94 |
|
|
Since the default start = 0 and the default prompt = 1, you could use:
|
95 |
|
|
append = "load_ramdisk=1"
|
96 |
|
|
|
97 |
|
|
|
98 |
|
|
4) An Example of Creating a Compressed RAM Disk
|
99 |
|
|
----------------------------------------------
|
100 |
|
|
|
101 |
|
|
To create a RAM disk image, you will need a spare block device to
|
102 |
|
|
construct it on. This can be the RAM disk device itself, or an
|
103 |
|
|
unused disk partition (such as an unmounted swap partition). For this
|
104 |
|
|
example, we will use the RAM disk device, "/dev/ram0".
|
105 |
|
|
|
106 |
|
|
Note: This technique should not be done on a machine with less than 8 MB
|
107 |
|
|
of RAM. If using a spare disk partition instead of /dev/ram0, then this
|
108 |
|
|
restriction does not apply.
|
109 |
|
|
|
110 |
|
|
a) Decide on the RAM disk size that you want. Say 2 MB for this example.
|
111 |
|
|
Create it by writing to the RAM disk device. (This step is not currently
|
112 |
|
|
required, but may be in the future.) It is wise to zero out the
|
113 |
|
|
area (esp. for disks) so that maximal compression is achieved for
|
114 |
|
|
the unused blocks of the image that you are about to create.
|
115 |
|
|
|
116 |
|
|
dd if=/dev/zero of=/dev/ram0 bs=1k count=2048
|
117 |
|
|
|
118 |
|
|
b) Make a filesystem on it. Say ext2fs for this example.
|
119 |
|
|
|
120 |
|
|
mke2fs -vm0 /dev/ram0 2048
|
121 |
|
|
|
122 |
|
|
c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...)
|
123 |
|
|
and unmount it again.
|
124 |
|
|
|
125 |
|
|
d) Compress the contents of the RAM disk. The level of compression
|
126 |
|
|
will be approximately 50% of the space used by the files. Unused
|
127 |
|
|
space on the RAM disk will compress to almost nothing.
|
128 |
|
|
|
129 |
|
|
dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
|
130 |
|
|
|
131 |
|
|
e) Put the kernel onto the floppy
|
132 |
|
|
|
133 |
|
|
dd if=zImage of=/dev/fd0 bs=1k
|
134 |
|
|
|
135 |
|
|
f) Put the RAM disk image onto the floppy, after the kernel. Use an offset
|
136 |
|
|
that is slightly larger than the kernel, so that you can put another
|
137 |
|
|
(possibly larger) kernel onto the same floppy later without overlapping
|
138 |
|
|
the RAM disk image. An offset of 400 kB for kernels about 350 kB in
|
139 |
|
|
size would be reasonable. Make sure offset+size of ram_image.gz is
|
140 |
|
|
not larger than the total space on your floppy (usually 1440 kB).
|
141 |
|
|
|
142 |
|
|
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
|
143 |
|
|
|
144 |
|
|
g) Use "rdev" to set the boot device, RAM disk offset, prompt flag, etc.
|
145 |
|
|
For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would
|
146 |
|
|
have 2^15 + 2^14 + 400 = 49552.
|
147 |
|
|
|
148 |
|
|
rdev /dev/fd0 /dev/fd0
|
149 |
|
|
rdev -r /dev/fd0 49552
|
150 |
|
|
|
151 |
|
|
That is it. You now have your boot/root compressed RAM disk floppy. Some
|
152 |
|
|
users may wish to combine steps (d) and (f) by using a pipe.
|
153 |
|
|
|
154 |
|
|
--------------------------------------------------------------------------
|
155 |
|
|
Paul Gortmaker 12/95
|
156 |
|
|
|
157 |
|
|
Changelog:
|
158 |
|
|
----------
|
159 |
|
|
|
160 |
|
|
10-22-04 : Updated to reflect changes in command line options, remove
|
161 |
|
|
obsolete references, general cleanup.
|
162 |
|
|
James Nelson (james4765@gmail.com)
|
163 |
|
|
|
164 |
|
|
|
165 |
|
|
12-95 : Original Document
|