fdisk -l 显示 16 个 ram 磁盘 /dev/ram0 ... /ram15

Rud*_*diC 18 ram

自从我升级到 15.10 以来,fdisk -l报告了 16 个 ram 磁盘 ( /dev/ram0... /dev/ram15)。我有点不确定这些是做什么用的。删除它们是否安全?如果没有,我怎样才能摆脱那个 fdisk 输出?

A.B*_*.B. 13

这在 Linux 系统上是完全正常的。对于需要 RAM 磁盘的情况,这是一种准备操作。它们中的每一个都有 64 MiB 的大小,这是一个非常低的值。如有必要,大小将自动增加。

为什么 Wily 中突然有 16 个可用的 RAM 磁盘,这很难解释。

我已经测试了以下默认 RAM 磁盘:

  • CentOS 7 – 没有 RAM 磁盘
  • Fedora 23 – 没有 RAM 磁盘
  • Ubuntu 14.04 – 没有 RAM 磁盘
  • Raspbian Jessie – 16 个 RAM磁盘 (4MiB)

来源

RAM 磁盘驱动程序是一种将主系统内存用作块设备的方法。initrd 需要它,如果您需要加载模块以访问根文件系统,则使用初始文件系统(请参阅文档/initrd.txt)。它还可用于加密工作的临时文件系统,因为内容在重新启动时会被擦除。

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

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

  • 请注意,如果您从不向它们写入任何内容,它们不会占用任何内存。似乎已经改变的是内核过去没有在 /proc/partitions 中列出 ramdisk,但现在这样做了,所以 fdisk -l 报告它们。 (4认同)

小智 12

不知道为什么 fdisk 突然报告 /dev/ram。

但是,您可以告诉 fdisk 仅报告特定设备。

fdisk -l /dev/sd*
Run Code Online (Sandbox Code Playgroud)

将列出真实的驱动器。

或者,您也可以使用 parted 和 lsblk。

此处分离了一个驱动器的输出。

Model: ATA Samsung SSD 840 (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 1      2096kB  120GB   120GB   extended               boot
 7      2097kB  26.2GB  26.2GB  logical   ext4
 5      26.2GB  36.7GB  10.5GB  logical   ext4
 6      36.7GB  47.2GB  10.5GB  logical   ext4
Run Code Online (Sandbox Code Playgroud)

对应的 lsblk 输出

    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 111.8G  0 disk 
??sda1   8:1    0     1K  0 part 
??sda5   8:5    0   9.8G  0 part /mnt/Links
??sda6   8:6    0   9.8G  0 part 
??sda7   8:7    0  24.4G  0 part /
Run Code Online (Sandbox Code Playgroud)


小智 9

我知道这个线程很旧,但我最近才遇到它。安装 Slackware 14.2 后,我在 fdisk -l. 我进一步调查了一下,发现在 fdisk(以及其他)所属的“util-linux”包中,fdisk 认为是块设备的选择发生了重大变化。在 util-linux 包版本 2.21 中,此决定基于报告的磁盘几何结构,而在当前版本 2.72 中,解析 /proc/partitions 的输出。根据我在互联网上的搜索,从内核 2.4 开始,Linux 中就存在 ramdisk,fdisk 只是没有显示它们。由于我对列出的许多“磁盘”都不是真正的磁盘感到恼火,因此我为fdisk做了一个补丁:

    diff -Nur util-linux-2.27.1_ori/disk-utils/fdisk-list.c util-linux-2.27.1_fdisk-no-ram-disks/disk-utils/fdisk-list.c
--- util-linux-2.27.1_ori/disk-utils/fdisk-list.c   2015-10-06 08:59:51.572589724 +0200
+++ util-linux-2.27.1_fdisk-no-ram-disks/disk-utils/fdisk-list.c    2016-08-16 15:55:14.840952091 +0200
@@ -312,6 +312,10 @@
        if (devno <= 0)
            continue;

+       /* dont list RAM disks */
+       if (strstr(line, "ram") && devno >= 256)
+           continue;
+
        if (sysfs_devno_is_lvm_private(devno) ||
            sysfs_devno_is_wholedisk(devno) <= 0)
            continue;
Run Code Online (Sandbox Code Playgroud)

也许这对其他人有帮助...


小智 5

约翰内斯的帖子是正确的。ram-disk 在内核中已经存在很长时间了,改变的是 fdisk 的行为。我没有修补 fdisk,而是编写了一个简单的 perl 脚本(5 行代码,6 行注释)来处理这个问题。我把它放进去~/bin/fdisk-l,现在我只记得不要fdisk和之间放一个空格-l

#! /usr/bin/perl -w
# Run fdisk -l and filter out the 16 /dev/ram devices.
# Sun Mar 5 16:13:45 2017. Jeff Norden, jeff(at)math.tntech.edu

$_=`sudo fdisk -l`;  #include sudo we don't have to be root

# weed out ram disks. The seemingly contradictory s (single) and m (multiline)
# flags allow "." to match "\n" and "^" to match at all beginning-of-lines.
s|^Disk /dev/ram.*?\n\n\n||smg;

# Do better than blank lines separating devices. Handle odd cases when there
# are more than two blank lines between devices or none at the end.
$hrule= '='x60 . "\n";
s/(\n\n\n+)|(\n+$)/\n$hrule/g;
print($hrule, $_);
Run Code Online (Sandbox Code Playgroud)

截至 2017 年 4 月,当前 Ubuntu 内核默认不再显示 ram 磁盘,因此此问题已解决。参见:https : //bugs.launchpad.net/ubuntu/+source/linux/+bug/1593293