如何更改 Linux ramdisk (/dev/ram0 - /dev/ram15) 的数量和大小?

Kev*_* S. 30 linux ramdisk

使用 Linux,当我启动时,我自动拥有 16 个 16MB ramdisk,但是,我想创建一个非常大的 ramdisk 来测试一些软件。

我发现我可以使用内核引导参数调整系统上已有的 ramdisk 的大小,ramdisk_size但是,这会使所有 16 个 ramdisk (/dev/ram0 - /dev/ram15) 达到指定的大小。所以如果我想创建一个 1GB 的 ramdisk,我需要 16GB 的内存。

基本上,我想创建一个 10GB 的 ramdisk,即 /dev/ram0。我该怎么做?我假设有一个内核启动参数,但我还没有找到它。

Kev*_* S. 20

内核编译时间

您可以在.config文件中设置两个内核配置选项:

CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10485760
Run Code Online (Sandbox Code Playgroud)

这将我的内核配置为在启动时创建一个 10G 的 ramdisk。

笔记:

  • CONFIG_BLK_DEV_RAM_SIZE 在 KB 中。
  • 不要指定比计算机中实际拥有的 RAM 多的内存。
  • menuconfig设备驱动程序->块设备下查看。

开机时间

您可以通过内核引导参数指定您创建的 ram 磁盘的大小ramdisk_size。例如:

kernel /vmlinuz-2.6.32.24 ro root=LABEL=/ rhgb quiet ramdisk_size=10485760
Run Code Online (Sandbox Code Playgroud)

现在我可以启动我的机器并在上面创建一个文件系统,安装它并像块设备一样使用它。

# mkfs.xfs /dev/ram0
# mount /dev/ram0 /mnt/ramdisk
Run Code Online (Sandbox Code Playgroud)

资料来源:

  1. http://www.vanemery.com/Linux/Ramdisk/ramdisk.html [已死]
  2. https://www.kernel.org/doc/Documentation/blockdev/ramdisk.txt


Ign*_*ams 16

您应该为此使用tmpfs

mount -t tmpfs -o size=10g none /mnt/point
Run Code Online (Sandbox Code Playgroud)

  • 我很欣赏这个答案,通常 tmpfs 可以解决问题,但我需要在我写入的内存部分创建一个 xfs 文件系统。 (3认同)

小智 8

在启动后制作一个大内存磁盘而不会弄乱内核参数。使用 tmpfs,创建一个文件,通过循环挂载,然后通过文件系统挂载:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
cd ..
mount /dev/loop0 temp2/
Run Code Online (Sandbox Code Playgroud)

通过多个不同的层可能会有一点性能损失......但至少它有效。


小智 6

另一种选择是使用循环设备(与前面提到的 mount 的 looppack 功能相反):

dd if=dev/zero of=myfs.img bs=1M count=1024
losetup /dev/loop0 myfs.img
mkfs.xfs /dev/loop0
Run Code Online (Sandbox Code Playgroud)

现在 /dev/loop 是一个合法的块设备,您的应用程序将像物理设备或 ramdisk 一样对其进行操作,但它是文件支持的。您可以挂载在某处,或者让您的应用程序对实现标准块 ioctls 的设备节点进行操作。保存您的系统内存并有助于保留测试用例等。

(您甚至可以 fdisk myfs.img,在其上创建分区并使用 --offset 和 --sizelimit 和 losstup 将每个 /dev/loopX 指向映像中的特定分区,因此 loop0、loop1 变得就像 sdc1、sdc2 等)