在 Linux 中使用 RAM 磁盘块设备¶
1) 概述¶
RAM 磁盘驱动程序是一种将主系统内存用作块设备的方式。它是 initrd 所必需的,initrd 是一种初始文件系统,如果您需要加载模块才能访问根文件系统(请参阅 使用初始 RAM 磁盘 (initrd))。它也可以用于加密工作的临时文件系统,因为内容会在重新启动时被擦除。
RAM 磁盘会随着所需空间的增加而动态增长。它通过使用来自缓冲区缓存的 RAM 来实现这一点。驱动程序将正在使用的缓冲区标记为脏,以便 VM 子系统稍后不会尝试回收它们。
默认情况下,RAM 磁盘最多支持 16 个 RAM 磁盘,并且可以重新配置为支持无限数量的 RAM 磁盘(风险自负)。只需在 Block drivers 配置菜单中更改配置符号 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,则此限制不适用。
确定您想要的 RAM 磁盘大小。例如,本示例为 2 MB。通过写入 RAM 磁盘设备来创建它。(当前不需要此步骤,但将来可能需要。)明智的做法是清零该区域(特别是对于磁盘),以便为您将要创建的镜像的未使用块实现最大程度的压缩
dd if=/dev/zero of=/dev/ram0 bs=1k count=2048
在其上创建一个文件系统。例如,本示例为 ext2fs
mke2fs -vm0 /dev/ram0 2048
挂载它,将您想要的文件复制到其中(例如:/etc/* /dev/* ...),然后再次卸载它。
压缩 RAM 磁盘的内容。压缩级别大约为文件使用的空间的 50%。RAM 磁盘上未使用的空间将压缩到几乎为零
dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz
将内核放到软盘上
dd if=zImage of=/dev/fd0 bs=1k
将 RAM 磁盘镜像放到内核之后的软盘上。使用一个比内核稍大的偏移量,这样您以后就可以将另一个(可能更大的)内核放到同一个软盘上而不会与 RAM 磁盘镜像重叠。对于大约 350 kB 大小的内核,400 kB 的偏移量是合理的。确保 ram_image.gz 的偏移量+大小不大于软盘上的总空间(通常为 1440 kB)
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
确保您已经指定了 FDARGS 和 FDINITRD 中的引导信息,或者您使用引导加载程序将内核命令行引导选项传递给内核。
就是这样。您现在有了一个引导/根压缩 RAM 磁盘软盘。一些用户可能希望通过使用管道来组合步骤 (d) 和 (f)。
Paul Gortmaker 12/95
更新日志:¶
2020 年 9 月
删除了“rdev”的使用
- 10-22-04 :
更新以反映命令行选项中的更改,删除过时的引用,进行常规清理。James Nelson (james4765@gmail.com)
- 12-95 :
原始文档