获取挂载点的Linux函数

Posted

技术标签:

【中文标题】获取挂载点的Linux函数【英文标题】:Linux function to get mount points 【发布时间】:2012-03-06 01:11:19 【问题描述】:

标准 Linux 库中是否有一个函数(或接口;ioctl、netlink 等)可以直接从内核返回当前挂载而不解析 /proc? strace挂载命令,好像解析/proc中的文件

【问题讨论】:

***.com/questions/5095976/mount-system-call @Satish 挂载文件系统 - 它不返回 当前挂载 为什么要避开/proc/ ??在linux下,这是检索此类信息的首选方式!而且也很简单!! 【参考方案1】:

请参阅答案底部的说明,了解此答案中使用的推理。

您是否有任何理由不使用getmntent libc 库调用?我确实意识到它与“一体式”系统调用不同,但它应该允许您获取相关信息。

#include <stdio.h>
#include <stdlib.h>
#include <mntent.h>

int main(void)

  struct mntent *ent;
  FILE *aFile;

  aFile = setmntent("/proc/mounts", "r");
  if (aFile == NULL) 
    perror("setmntent");
    exit(1);
  
  while (NULL != (ent = getmntent(aFile))) 
    printf("%s %s\n", ent->mnt_fsname, ent->mnt_dir);
  
  endmntent(aFile);

澄清

考虑到 OP 澄清了尝试在没有安装 /proc 的情况下尝试执行此操作,我将澄清一下:

/proc 之外没有 工具可用于从 linux 内核获取已挂载文件系统的完全限定列表。没有系统调用,没有ioctl。 /proc 接口是约定的接口。

话虽如此,如果您没有安装 /proc,您将不得不解析 /etc/mtab 文件 - 将 /etc/mtab 而不是 /proc/mounts 传递给初始的 setmntent 调用。

mountunmount 命令在文件/etc/mtab 中维护当前安装的文件系统列表,这是一个商定的协议。这在几乎所有linux/unix/bsd 这些命令的手册页中都有详细说明。因此,如果您没有/proc,您可以在某种程度上 依赖此文件的内容。不能保证它是事实的来源,但约定是这些事情的约定。

所以,如果您没有/proc,您可以在下面的getmntent libc 库调用中使用/etc/mtab 来获取文件系统列表;否则你可以使用/proc/mounts/proc/self/mountinfo 之一(现在推荐使用/proc/mounts)。

【讨论】:

我有一个嵌入式系统,可以在启动过程中使用此信息;在挂载 /proc 之前。 dfmount 都使用/proc/self/mountinfo 而不是/proc/mounts,但结果是一样的。 请记住,getmntent 不是线程安全的。有getmntent_r(GNU 扩展)。 是的,非常清楚 *ent 调用的整个 API 集群的所有限制。现在首选从每个进程的 mountinfo 文件中读取。【参考方案2】:

没有系统调用来列出这些信息;相反,您可以在文件 /etc/mtab

中找到它

【讨论】:

mtab 只是大多数系统上 /proc/mounts 的符号链接。 @tMC: /proc/mounts 是一个实现细节。 /etc/mtab 是一个标准文件,您几乎可以在任何类 Unix 系统上找到它。我没有检查,但我认为这是标准的一部分。所以你可以依靠它。而且我不会说“在大多数系统上”。在我的 Ubuntu 和 OpenSuSE 系统中,它是一个纯文件。我确实有/proc/mounts,但它是一个链接:-) 我可以确认 /etc/mtab 不是文件,而是 Raspbian Jessie 上的 /proc/mounts 的链接。

以上是关于获取挂载点的Linux函数的主要内容,如果未能解决你的问题,请参考以下文章

linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)

Linux0.11 根文件系统挂载

linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid 目

Linux挂载命令

Linux系统编程 --进程间通信 -共享内存

检测 linux 上的绑定挂载