在 Linux 中使用 RAM 磁盘块设备

1) 概述

RAM 磁盘驱动程序是一种将主系统内存用作块设备的方法。 如果你需要加载模块才能访问根文件系统,则需要它用于 initrd,一个初始文件系统(参见使用初始 RAM 磁盘 (initrd))。 它也可以用于加密工作的临时文件系统,因为内容会在重启时擦除。

RAM 磁盘会随着所需空间的增加而动态增长。 它通过使用来自缓冲区缓存的 RAM 来做到这一点。 驱动程序将其正在使用的缓冲区标记为脏,以便 VM 子系统不会稍后尝试回收它们。

默认情况下,RAM 磁盘最多支持 16 个 RAM 磁盘,并且可以重新配置以支持无限数量的 RAM 磁盘(风险自负)。 只需在“块驱动程序”配置菜单中更改配置符号 BLK_DEV_RAM_COUNT 并(重新)构建内核。

要在您的系统中使用 RAM 磁盘支持,请从 /dev 目录运行 './MAKEDEV ram'。 RAM 磁盘的主设备号都是 1,次设备号从 /dev/ram0 的 0 开始,以此类推。 如果使用,现代内核会使用 /dev/ram0 作为 initrd。

新的 RAM 磁盘还能够加载压缩的 RAM 磁盘映像,从而允许将更多程序压缩到普通的安装或救援软盘中。

2) 参数

2a) 内核命令行参数

ramdisk_size=N

ramdisk 的大小。

此参数告诉 RAM 磁盘驱动程序设置大小为 N k 的 RAM 磁盘。 默认值为 4096 (4 MB)。

2b) 模块参数

rd_nr

创建的 /dev/ramX 设备。

max_part

最大分区号。

rd_size

请参见 ramdisk_size。

3) 使用“rdev”

“rdev”是一个过时、已弃用、陈旧的实用程序,可用于在 Linux 内核映像中设置启动设备。

与其使用 rdev,不如将启动设备信息放在内核命令行中,并将其从引导加载程序传递到内核。

你还可以通过在 arch/x86/boot/Makefile 中设置 FDARGS,并通过在 arch/x86/boot/Makefile 中设置 FDINITRD 来指定 initrd 映像,从而将参数传递给内核。

此处可能适用的一些内核命令行启动选项是

ramdisk_start=N
ramdisk_size=M

如果你制作一个带有 LILO 的启动磁盘,那么对于上述情况,你将使用

append = "ramdisk_start=N ramdisk_size=M"

4) 创建压缩 RAM 磁盘的示例

要创建 RAM 磁盘映像,你需要一个备用块设备在其上构建它。 这可以是 RAM 磁盘设备本身,也可以是未使用的磁盘分区(例如,未挂载的交换分区)。 在此示例中,我们将使用 RAM 磁盘设备“/dev/ram0”。

注意:此技术不应在 RAM 小于 8 MB 的机器上完成。 如果使用备用磁盘分区而不是 /dev/ram0,则此限制不适用。

  1. 确定你想要的 RAM 磁盘大小。 例如,本例中使用 2 MB。 通过写入 RAM 磁盘设备来创建它。 (此步骤目前不是必需的,但将来可能需要。)最好将该区域清零(特别是对于磁盘),以便为你即将创建的映像的未使用块实现最大压缩。

    dd if=/dev/zero of=/dev/ram0 bs=1k count=2048
    
  2. 在其上创建一个文件系统。 例如,本例中使用 ext2fs

    mke2fs -vm0 /dev/ram0 2048
    
  3. 挂载它,将你想要的文件复制到其中(例如:/etc/* /dev/* ...),然后再次卸载它。

  4. 压缩 RAM 磁盘的内容。 压缩级别约为文件所用空间的 50%。 RAM 磁盘上未使用的空间将压缩到几乎为零

    dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
    
  5. 将内核放到软盘上

    dd if=zImage of=/dev/fd0 bs=1k
    
  6. 将 RAM 磁盘映像放在内核之后,放到软盘上。 使用比内核稍大的偏移量,以便稍后可以将另一个(可能更大的)内核放到同一个软盘上,而不会与 RAM 磁盘映像重叠。 对于大小约为 350 kB 的内核,400 kB 的偏移量是合理的。 确保 ram_image.gz 的偏移量 + 大小不大于软盘上的总空间(通常为 1440 kB)

    dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
    
  7. 确保你已经在 FDARGS 和 FDINITRD 中指定了引导信息,或者使用引导加载程序将内核命令行引导选项传递给内核。

就是这样。 你现在拥有你的启动/根压缩 RAM 磁盘软盘。 有些用户可能希望使用管道组合步骤 (d) 和 (f)。

Paul Gortmaker 12/95

更新日志:

2020 年 9 月

删除“rdev”的使用

10-22-04 :

更新以反映命令行选项的更改,删除过时的引用,常规清理。 James Nelson (james4765@gmail.com)

12-95 :

原始文档