如何从 /etc/mtab 或 /proc/mounts 中过滤掉“有用”的挂载

如何从 /etc/mtab 或 /proc/mounts 中过滤掉“有用”的挂载

我目前正在编写一个基本的文件系统抽象(用 C++ 编写),我需要获取 Linux 上“有用”安装设备的列表。

getmntent我找到了允许getmntent_r我轻松解析的功能/etc/mtab/proc/mounts但是许多已安装的设备并不“有用”(例如/sys/fs/cgroup/net_cls:)。特别是,我试图找到与物理设备、分区或网络共享/驱动器相关的安装。

我发现的最接近的是检查mnt_fsname(设备名称)是否以 a 开头/,在我的系统中将其范围缩小到:

  • /

  • /boot

  • /run/media/[username]/0CA8-1F2D

  • /run/media/[username]/14E0-3E80

这似乎是我想要的(后两个是 USB 记忆棒上的分区)。不过,我还没有机会尝试使用它的网络共享/设备。

基本上,这应该是对类似 Windows 的“驱动器”的近似,因此我对物理设备等感兴趣,但这并不妨碍图书馆用户根据需要导航到未列出的设备。

所以基本上问题也归结为:

  • 如果挂载条目中的设备名称以 a 开头,/是否保证是物理设备、分区或网络共享?

  • 我会遗漏任何特别重要/有用的东西吗?

  • 有没有更好/更精确的方法来做到这一点?

答案1

我认为没有一个“有用的坐骑”的概念在所有情况下都有意义。您希望包括可移动物理驱动器和网络安装,并排除系统访问的文件系统,例如/dev/proc和下的文件系统/sys。用户安装的文件系统怎么样?知道文件系统是由 FUSE 提供的并不能告诉您它是什么。它可以是存档、网络挂载、目录的替代视图、磁盘映像、控制某些程序的方法……

检查设备名称是否以开头/对我来说似乎没有用。例如,它将包括绑定安装并排除网络安装。

我认为你能做的最好的事情就是不要重新发明轮子。如果不出意外,通过使用与其他人相同的机制,您将不会混淆您的用户(“为什么 X 列出该文件系统而不列出 Y???”)。此外,其他人所做的事情也有可能是有意义的。

所以我的建议是使用 Gnome 库,至少是 GTK+。 GTK+ 有一个文件打开对话框它在“Places”下显示了一些已安装的文件系统。用户可以控制那里列出的内容在某种程度上 - 如果他们能弄清楚的话, 那是。即使您不显示 GTK+ 中的文件打开对话框,也可以使用相同的“位置”列表(我不知道如何获取该列表,请查看 API 文档)。

答案2

“有用”是一个观点问题,但无论如何,这是我的看法:

  const getMount = (mountId, _parentID, _deviceNo, root, mountPoint, mountOptions, _fields, _mountSource, superOptions, blob) => (
    {
      mountId,
      // parentID,
      // deviceNo,
      root,
      mountPoint,
      mountOptions: mountOptions.split(','),
      // fields,
      // mountSource,
      superOptions: superOptions.split(','),
      blob
    })

  const mounts = fs.readFileSync('/proc/self/mountinfo', 'utf-8')
  mounts.split(/\n/)
    .filter(l => l.length > 0) // filter empty line at end
    .map((m) => getMount(...m.split(' ')))
    .filter((m) =>
      !/^\/(snap|run|sys|proc|dev)($|\/)/.test(m.mountPoint) &&
      !['mqueue', 'tmpfs'].includes(m.superOptions) &&
      !m.superOptions.includes('mqueue') &&
      !m.superOptions.includes('tmpfs') &&
      !m.mountOptions.includes('ro')
    )
    .map((l) =>
      console.log(l))

(我需要的是设备,一般来说可以从其中删除文件,因此与回收站路径相关很重要(如何计算这些是另一回事))

相关内容