Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | 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" |
Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 9 | 4) An Example of Creating a Compressed RAM Disk |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |
Mauro Carvalho Chehab | 8c27ceff3 | 2016-10-18 10:12:27 -0200 | [diff] [blame] | 17 | in order to access the root filesystem (see Documentation/admin-guide/initrd.rst). It can |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | |
Randy Dunlap | 1810732 | 2007-10-16 23:29:29 -0700 | [diff] [blame] | 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. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 33 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | The new RAM disk also has the ability to load compressed RAM disk images, |
Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 35 | allowing one to squeeze more programs onto an average installation or |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | rescue floppy disk. |
| 37 | |
| 38 | |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 39 | 2) Parameters |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 | --------------------------------- |
| 41 | |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 42 | 2a) Kernel Command Line Parameters |
| 43 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 44 | ramdisk_size=N |
| 45 | ============== |
| 46 | |
| 47 | This parameter tells the RAM disk driver to set up RAM disks of N k size. The |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 48 | default is 4096 (4 MB). |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 | |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 50 | 2b) Module parameters |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 51 | |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 52 | rd_nr |
| 53 | ===== |
| 54 | /dev/ramX devices created. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 55 | |
Fabian Frederick | f5abc8e7 | 2014-01-23 15:55:27 -0800 | [diff] [blame] | 56 | max_part |
| 57 | ======== |
| 58 | Maximum partition number. |
| 59 | |
| 60 | rd_size |
| 61 | ======= |
| 62 | See ramdisk_size. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 | |
| 64 | 3) Using "rdev -r" |
| 65 | ------------------ |
| 66 | |
| 67 | The usage of the word (two bytes) that "rdev -r" sets in the kernel image is |
| 68 | as follows. The low 11 bits (0 -> 10) specify an offset (in 1 k blocks) of up |
| 69 | to 2 MB (2^11) of where to find the RAM disk (this used to be the size). Bit |
| 70 | 14 indicates that a RAM disk is to be loaded, and bit 15 indicates whether a |
| 71 | prompt/wait sequence is to be given before trying to read the RAM disk. Since |
| 72 | the RAM disk dynamically grows as data is being written into it, a size field |
| 73 | is not required. Bits 11 to 13 are not currently used and may as well be zero. |
| 74 | These numbers are no magical secrets, as seen below: |
| 75 | |
Wanlong Gao | 25eb650 | 2011-06-13 17:53:53 +0800 | [diff] [blame] | 76 | ./arch/x86/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF |
| 77 | ./arch/x86/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000 |
| 78 | ./arch/x86/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 79 | |
Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 80 | Consider a typical two floppy disk setup, where you will have the |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 81 | kernel on disk one, and have already put a RAM disk image onto disk #2. |
| 82 | |
| 83 | Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk |
| 84 | starts at an offset of 0 kB from the beginning of the floppy. |
| 85 | The command line equivalent is: "ramdisk_start=0" |
| 86 | |
| 87 | You want bit 14 as one, indicating that a RAM disk is to be loaded. |
| 88 | The command line equivalent is: "load_ramdisk=1" |
| 89 | |
| 90 | You want bit 15 as one, indicating that you want a prompt/keypress |
| 91 | sequence so that you have a chance to switch floppy disks. |
| 92 | The command line equivalent is: "prompt_ramdisk=1" |
| 93 | |
| 94 | Putting that together gives 2^15 + 2^14 + 0 = 49152 for an rdev word. |
| 95 | So to create disk one of the set, you would do: |
| 96 | |
Wanlong Gao | 25eb650 | 2011-06-13 17:53:53 +0800 | [diff] [blame] | 97 | /usr/src/linux# cat arch/x86/boot/zImage > /dev/fd0 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 98 | /usr/src/linux# rdev /dev/fd0 /dev/fd0 |
| 99 | /usr/src/linux# rdev -r /dev/fd0 49152 |
| 100 | |
| 101 | If you make a boot disk that has LILO, then for the above, you would use: |
| 102 | append = "ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1" |
| 103 | Since the default start = 0 and the default prompt = 1, you could use: |
| 104 | append = "load_ramdisk=1" |
| 105 | |
| 106 | |
Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 107 | 4) An Example of Creating a Compressed RAM Disk |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 108 | ---------------------------------------------- |
| 109 | |
| 110 | To create a RAM disk image, you will need a spare block device to |
| 111 | construct it on. This can be the RAM disk device itself, or an |
Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 112 | unused disk partition (such as an unmounted swap partition). For this |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 113 | example, we will use the RAM disk device, "/dev/ram0". |
| 114 | |
| 115 | Note: This technique should not be done on a machine with less than 8 MB |
| 116 | of RAM. If using a spare disk partition instead of /dev/ram0, then this |
| 117 | restriction does not apply. |
| 118 | |
| 119 | a) Decide on the RAM disk size that you want. Say 2 MB for this example. |
| 120 | Create it by writing to the RAM disk device. (This step is not currently |
| 121 | required, but may be in the future.) It is wise to zero out the |
| 122 | area (esp. for disks) so that maximal compression is achieved for |
| 123 | the unused blocks of the image that you are about to create. |
| 124 | |
| 125 | dd if=/dev/zero of=/dev/ram0 bs=1k count=2048 |
| 126 | |
| 127 | b) Make a filesystem on it. Say ext2fs for this example. |
| 128 | |
| 129 | mke2fs -vm0 /dev/ram0 2048 |
| 130 | |
| 131 | c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...) |
| 132 | and unmount it again. |
| 133 | |
| 134 | d) Compress the contents of the RAM disk. The level of compression |
| 135 | will be approximately 50% of the space used by the files. Unused |
| 136 | space on the RAM disk will compress to almost nothing. |
| 137 | |
| 138 | dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz |
| 139 | |
| 140 | e) Put the kernel onto the floppy |
| 141 | |
| 142 | dd if=zImage of=/dev/fd0 bs=1k |
| 143 | |
| 144 | f) Put the RAM disk image onto the floppy, after the kernel. Use an offset |
| 145 | that is slightly larger than the kernel, so that you can put another |
| 146 | (possibly larger) kernel onto the same floppy later without overlapping |
| 147 | the RAM disk image. An offset of 400 kB for kernels about 350 kB in |
| 148 | size would be reasonable. Make sure offset+size of ram_image.gz is |
| 149 | not larger than the total space on your floppy (usually 1440 kB). |
| 150 | |
| 151 | dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400 |
| 152 | |
| 153 | g) Use "rdev" to set the boot device, RAM disk offset, prompt flag, etc. |
| 154 | For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would |
| 155 | have 2^15 + 2^14 + 400 = 49552. |
| 156 | |
| 157 | rdev /dev/fd0 /dev/fd0 |
| 158 | rdev -r /dev/fd0 49552 |
| 159 | |
| 160 | That is it. You now have your boot/root compressed RAM disk floppy. Some |
| 161 | users may wish to combine steps (d) and (f) by using a pipe. |
| 162 | |
| 163 | -------------------------------------------------------------------------- |
| 164 | Paul Gortmaker 12/95 |
| 165 | |
| 166 | Changelog: |
| 167 | ---------- |
| 168 | |
| 169 | 10-22-04 : Updated to reflect changes in command line options, remove |
| 170 | obsolete references, general cleanup. |
| 171 | James Nelson (james4765@gmail.com) |
| 172 | |
| 173 | |
| 174 | 12-95 : Original Document |