我目前正在编写一个基本的文件系统抽象(用 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))
(我需要的是设备,一般来说可以从其中删除文件,因此与回收站路径相关很重要(如何计算这些是另一回事))