在 Linux 上创建 ram 磁盘

Fra*_*ank 84 linux ramdisk

我有一台机器有 62GB 的 RAM,而后备箱只有 7GB,所以我想我会创建一个 RAM 磁盘并在那里编译。我不是 Linux 专家。我在互联网上找到了创建 RAM 磁盘的说明:

mkfs -q /dev/ram1 8192
Run Code Online (Sandbox Code Playgroud)

但是我将 8192 更改为 16777216 以尝试分配 16GB 的 ram 磁盘。

我收到以下错误:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我受到惊吓并被保释。

sudo dmidecode --type 17 | grep Size
Run Code Online (Sandbox Code Playgroud)

显示

8x8192MB + 2048MB = 67584 MB
Run Code Online (Sandbox Code Playgroud)

du/dev804K

这是问题吗?我能克服那个/dev尺寸吗?

t-8*_*8ch 90

在 linux 上创建 ram 磁盘的最佳方法是 tmpfs。它是一个存在于 ram 中的文件系统,因此不需要 ext2。您可以使用以下命令创建 16Gb 大小的 tmpfs:

mount -o size=16G -t tmpfs none /mnt/tmpfs
Run Code Online (Sandbox Code Playgroud)

  • 您需要一个挂载点(目录)作为目标,因此在创建此目录(您可以使用任何目录,现有内容被隐藏)后,您可以使用答案中的命令挂载它。 (9认同)
  • 在我的系统上,/mnt 中什么也没有,它说:ls:无法访问 /mnt/tmpfs:没有这样的文件或目录挂载:挂载点 /mnt/tmpfs 不存在。这有什么好担心的吗?如果我只是 mkdir /mnt/tmpfs,这是否会破坏目的(通过在常规磁盘上创建 tmpfs - 请不要着火,我是这里的初学者)。 (2认同)
  • `tmpfs` 可能会使用交换区,你可能不希望在纯 RAM 磁盘中使用交换区。 (2认同)
  • @RomanSusi tmpfs 是文件类型(在 -t 之后传递)。“none”是 tmpfs 不存在的后备设备(“磁盘”) (2认同)
  • 值得注意的是,指定大小是可选的。它默认为 RAM 的一半。指定更大的大小没有任何开销,它所做的只是设置一个上限,以防止您意外使用所有 RAM 并杀死系统。 (2认同)
  • 需要更正:TMPFS 不是“创建 ram 磁盘的最佳方式”,而是“在 RAM 中创建 FS 的最佳方式”。这是一个重要的区别,因为如果您特别需要 RAM 中的磁盘 *(即设备 `/dev/foo`)*,您最好使用 RAM 磁盘又名 `brd` 模块。除了更容易设置 *(使用 TMPFS,您可以修改循环设备)* 它也比 TMPFS 上的循环设备更快 *(在我做过的某些特定测试中,它在 4.19 内核上快了 13%)*。 (2认同)

von*_*and 21

Linux在使用 RAM 方面非常有效。毫不奇怪,您几乎看不到tmpfs. 读入内存的最大部分(因此能够减慢进程速度)是工具(编译器、汇编器、链接器),并且在很长一段时间内make它们将在启动时加载到内存中并且永远不会离开它。剩下的是读取源代码(除非内存受到严重限制,否则结果的写入不会减慢您的速度)。同样,通用头文件将保留,只有用户的源代码需要阅读。这不太可能超过几兆字节。创建一个大的 RAMdisk(或什至大量使用tmpfs)可以很好地减慢速度(通过限制构建内存,RAMdisk 上的文件或tmpfs 不能直接从那里使用)。

  • @Kazark,使用特殊数据结构处理内存中的可执行文件。由于 RAMdisks 和 `tmpfs` 不常用于存储可执行文件(RAMdisks 是软盘极其缓慢的旧时代的残余,例如,`tmpfs` 用于严格的临时数据),没有人认为它足够重要添加所需的丑陋黑客。 (9认同)
  • 我曾尝试从 tmpfs (RAM) 文件系统运行我的 rails 代码,但我根本没有发现任何区别。我真的希望有明显的不同,但我对 linux 的出色表现感到失望。 (9认同)
  • 什么!它们怎么不能直接从那里使用? (2认同)
  • 真的!为何如此?(原谅我的迟钝。) (2认同)

小智 9

除了tmpfsand ramfs,另一个选项是/dev/ram0块设备。在最近的 Ubuntu 版本中,此设备默认不存在,但可以通过modprobe brd.

这种方法更具可预测性,因为它创建了一个真正的ext4文件系统,并且永远不会超过您指定的限制。但是它需要更多的设置步骤,并且使用 RAM 的效率较低。

使用 brd 内核模块 (/dev/ram0)

创建和初始化 4GB RAM 磁盘:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk
Run Code Online (Sandbox Code Playgroud)

rd_nr参数指定要创建多少个 RAM 磁盘(默认情况下,它创建 16 个,即/dev/ram0通过/dev/ram15)。该rd_size参数是以千字节为单位的大小。该$(( ... ))语法允许您在 shell 中进行算术运算。

要释放 RAM 磁盘,请卸载它并删除brd内核模块:

umount /ramdisk
modprobe -r brd
Run Code Online (Sandbox Code Playgroud)

在里面创建块设备 ramfs

或者,您可以在以下内容中创建块设备ramfs

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk
Run Code Online (Sandbox Code Playgroud)

truncate命令创建一个给定大小的空文件,以便按需初始化(即消耗内存)。

要释放 RAM 磁盘,请卸载它并删除磁盘映像:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img
Run Code Online (Sandbox Code Playgroud)

tmpfs和的比较ramfs

虽然tmpfs并且ramfs比使用块设备更有效,但下面是它们的一些缺点。

tmpfs可以交换到磁盘。这样效率更高,但有时您可能需要纯 RAM 磁盘:

  • 您正在处理的文件是敏感的(例如来自加密分区的文件)。
  • 您正在进行性能测试,并且不希望磁盘 I/O 成为一个因素(SSD 写入时间可能会有很大差异)。
  • 您正在解压缩一个大文件,并且不想磨损您的 SSD。

ramfs易于设置,删除文件后可回收空间,并更有效地使用 RAM(系统不会缓冲文件,因为它知道它们在 RAM 中)。但它也有自己的缺点和惊喜:

  • df实用程序不报告空间使用情况:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
    Run Code Online (Sandbox Code Playgroud)
  • 没有大小限制参数。如果您在 ramdisk 中放入太多,您的系统将挂起。

  • 稀疏文件可能会在您最不期望的时候变得稀疏。今天早上,我将 VM 映像(150G,但在磁盘上使用了 49G)复制到ramfs(我有 128G 的 RAM)。那奏效了。但是,当我复制ramfs到了目的地,我的系统变得反应迟钝。该cp实用程序显然填补了read的漏洞,但没有填补write的漏洞。

无论tmpfsramfs行为可能不同于真正的ext4文件系统。在 RAM 中创建一个块设备并使用它进行初始化ext4可以避免这种情况。

更深入的比较:https : //www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


Ban*_*uin 6

问题是 ramdisk 的最大大小,更具体地说,可以通过 ramdisk 驱动程序访问的内存大小是在编译时配置的,可以在启动时覆盖,但一旦内核加载到内存中就保持不变。默认值可能以兆字节为单位。如果我没记错的话,在加载驱动程序时,ramdisk 的内存是保留的,所有 ramdisk 的大小都相同,默认情况下大约有 16 个 ramdisk。所以即使你不想要 16G 的 ramdisk 大小 :-)

正如另一个答案中所述, tmpfs 是您想要使用的。此外,将整个操作系统放在 ramdisk/tmpfs 中不会让您获得很多好处。只需将您的 builddir 复制到 tmpfs 并进行编译。您可能必须确保所有临时结果也写入 tmpfs 中的位置。

  • 我阅读了源代码,并通过尝试验证了它。 (6认同)