检测Linux和Mac OS X上安装的驱动器

Detecting mounted drives on Linux and Mac OS X

本文关键字:安装 驱动器 OS Linux Mac 检测      更新时间:2023-10-16

我正在使用QDir::drives()来获取驱动器列表。它在Windows上运行良好,但在Linux和Mac上只返回一个项目"/",即root。这是预期的行为,但我如何才能获得Mac和Linux上的驱动器列表?

也欢迎非-Qt本地API解决方案。

关于"驱动器"定义的澄清:我想得到一个在Finder或Linux内置文件管理器中可以作为"驱动器"查看的装载点列表。

就文件系统而言,Unix/Linux中没有驱动器的概念(我不能保证MacOSX,但我认为它是一样的)。最接近的可能是装载点,但普通应用程序不应该为它们而烦恼,因为在文件系统根目录/下所有的装载点都已经可用(因此就是您观察到的QDir::drives()的行为)。

如果您真的想知道哪些挂载点在使用,可以解析mount命令的输出(不带任何参数),或者至少在Linux上解析/etc/mtab文件的内容。不过,请注意,装载点可能会变得非常快(循环设备、FUSE文件系统、网络共享等),因此,我不建议使用它们,除非您的应用程序设计用于管理它们。

请记住,在Unix-y操作系统上,装载点通常是系统管理员的问题,而不是最终用户的问题,除非我们谈论的是可移动介质或临时网络共享。


编辑:根据注释中的说明,在Linux上,您应该使用getmntentgetmntent_r来解析/etc/mtab文件的内容,从而获得所有装载点和相应设备的列表。

之后的技巧是确定要显示哪些(可移动?网络共享?)。我知道/sys/block/...可以帮上忙,但我不知道所有的细节,所以你必须多挖一点。

例如,要检查安装在/media/usb0/上的/dev/sdd1(USB密钥)是否是可移动设备,可以执行以下操作(注意我如何使用设备名称sdd,而不是分区名称sdd1):

$ cat /sys/block/sdd/removable
1

与我的主硬盘相反:

$ cat /sys/block/sda/removable
0

希望这能让你走上正轨。

对于OS X,磁盘仲裁框架可用于列出和监视驱动器和装载点

在任何一个平台上,取消mountshell命令的输出都是一种选择——不过,您对驱动器的定义是什么?物理介质、可移动驱动程序、网络卷?你需要做大量的过滤。

在MacOSX上,可移动介质、网络卷和辅助硬盘驱动器的装载点始终位于/Volumes/下,因此,如果您对驱动器的定义很宽泛,那么简单地枚举该目录中的项目就可以了。这应该是相当安全的,因为它们都是自动安装的。

在Linux上,根据所使用的特定发行版,有多种位置。/mnt/是传统的,但也有其他的。

在linux中,获取当前安装的驱动器信息的方法是解析mtab文件。glibc提供了一个宏_PATH_MNTTAB来定位这个文件。看见http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-信息

如果您知道有问题的驱动器的格式,您可以使用df命令从控制台输出驱动器列表,也可以通过编程将其作为系统命令输出。例如,要查找所有ext4驱动器:

df -t ext4

如果您对多种类型感兴趣,您可以简单地在同一命令中添加其他格式:

df -t ext4 -t tmpfs

这将向您返回驱动器的物理位置、内存量、已用内存量、可用内存量、使用百分比以及它在文件系统上的安装位置。

df将向您显示系统上安装的所有驱动器,但有些驱动器并不是您真正想要的,比如临时文件系统等。

不确定这是否适用于OSX,但它确实适用于我的Ubuntu 12.04发行版。

另一种方法是检查"卷"

df-H|grep"/Volumes"

我知道这是旧的,但它没有提到我最终在macos中使用的getfsstat。您可以使用getfsstat获得装载列表(其中包括大多数磁盘)。详见man 2 getfsstat