我有一台机器有 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在/dev给804K。
这是问题吗?我能克服那个/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)
von*_*and 21
Linux在使用 RAM 方面非常有效。毫不奇怪,您几乎看不到tmpfs. 读入内存的最大部分(因此能够减慢进程速度)是工具(编译器、汇编器、链接器),并且在很长一段时间内make它们将在启动时加载到内存中并且永远不会离开它。剩下的是读取源代码(除非内存受到严重限制,否则结果的写入不会减慢您的速度)。同样,通用头文件将保留,只有用户的源代码需要阅读。这不太可能超过几兆字节。创建一个大的 RAMdisk(或什至大量使用tmpfs)可以很好地减慢速度(通过限制构建内存,RAMdisk 上的文件或tmpfs 不能直接从那里使用)。
小智 9
除了tmpfsand ramfs,另一个选项是/dev/ram0块设备。在最近的 Ubuntu 版本中,此设备默认不存在,但可以通过modprobe brd.
这种方法更具可预测性,因为它创建了一个真正的ext4文件系统,并且永远不会超过您指定的限制。但是它需要更多的设置步骤,并且使用 RAM 的效率较低。
创建和初始化 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 磁盘:
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的漏洞。
无论tmpfs和ramfs行为可能不同于真正的ext4文件系统。在 RAM 中创建一个块设备并使用它进行初始化ext4可以避免这种情况。
更深入的比较:https : //www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
问题是 ramdisk 的最大大小,更具体地说,可以通过 ramdisk 驱动程序访问的内存大小是在编译时配置的,可以在启动时覆盖,但一旦内核加载到内存中就保持不变。默认值可能以兆字节为单位。如果我没记错的话,在加载驱动程序时,ramdisk 的内存是保留的,所有 ramdisk 的大小都相同,默认情况下大约有 16 个 ramdisk。所以即使你不想要 16G 的 ramdisk 大小 :-)
正如另一个答案中所述, tmpfs 是您想要使用的。此外,将整个操作系统放在 ramdisk/tmpfs 中不会让您获得很多好处。只需将您的 builddir 复制到 tmpfs 并进行编译。您可能必须确保所有临时结果也写入 tmpfs 中的位置。