| 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 | 
 | 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 |  | 
| 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 |  | 
 | 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 | 
| Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 52 | default is 1024 (BLOCK_SIZE). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Wanlong Gao | 25eb650 | 2011-06-13 17:53:53 +0800 | [diff] [blame] | 67 | ./arch/x86/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK     0x07FF | 
 | 68 | ./arch/x86/kernel/setup.c:#define RAMDISK_PROMPT_FLAG          0x8000 | 
 | 69 | ./arch/x86/kernel/setup.c:#define RAMDISK_LOAD_FLAG            0x4000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 |  | 
| Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 71 | Consider a typical two floppy disk setup, where you will have the | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Wanlong Gao | 25eb650 | 2011-06-13 17:53:53 +0800 | [diff] [blame] | 88 | 	/usr/src/linux# cat arch/x86/boot/zImage > /dev/fd0 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 98 | 4) An Example of Creating a Compressed RAM Disk | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Nathan Scott | 086626a | 2006-07-14 00:24:10 -0700 | [diff] [blame] | 103 | unused disk partition (such as an unmounted swap partition). For this | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |