【问题标题】:how to skip dirs that are mounted twice?如何跳过安装两次的目录?
【发布时间】:2011-04-04 17:20:31
【问题描述】:

我需要递归地列出一个目录,但我想跳过已经挂载的子目录。 有两种情况:

a) 一个文件系统被挂载了两次,如下例所示:

  • “/dev/sda2”挂载在“/mnt/mnt_point1”上
  • “/dev/sda2”安装在“/mnt/mnt_point2”上 我想列出“/mnt”,但只在“/mnt/mnt_point1”中下降

b) 文件层次结构的一部分被重新挂载到其他地方,使用“mount --bind”:

  • "mount --bind /home/user/tmp/test /home/user/tmp/mounted_test"

我想列出“/home/user/tmp”,但只在“test”中下降

“statfs”和“statvfs”不提供任何信息来判断一个目录是否被挂载了两次。

一种解决方案是读取“/etc/mtab”(就像“find”命令那样)并执行一些检查,但我认为这非常昂贵(每次遇到时都必须读取 /etc/mtab一个目录;如果该文件仅在程序启动时读取,则在读取之间可能会发生挂载,因此程序将不准确)。

另一种解决方案是过滤内核事件(通过 libudev 或 Netlink)并仅在发出 MOUNT 事件时读取 /etc/mtab。

您还有其他建议吗?提前致谢。

【问题讨论】:

  • @Jens:删除了它(以及 C 标记),理由是这是一个与这两种语言都无关的问题。
  • 对于大多数 Unix 变体,您不能两次挂载同一个文件系统 - 系统不会让您挂载。当然不适用于本地文件系统; NFS 可能会有所不同。你确定 Linux 允许双挂载吗?
  • @Jonathan Leffler:是的,正如 baudolino 指出的那样,使用 -bind 选项,您甚至可以只挂载其他目录。这为您提供了一项功能,就好像您可以对目录执行“临时硬链接”之类的操作。

标签: linux


【解决方案1】:

首先阅读mtab并不像你想象的那么昂贵,如果它不改变,如果你经常访问它,linux可能会将它保存在内存中。

但出于您的目的,mtab 可能不会包含您要查找的信息。改为解析/proc/mounts

【讨论】:

  • 实际上,mtab 还包含有关“mount --bind”的信息。示例: cat /etc/mtab /dev/sda1 / ext3 rw,noatime,user_xattr,commit=0 0 0 /dev/sda2 /mnt/mnt_point1 ext3 /dev/sda2 /mnt/mnt_point2 ext3 /home/florin/tmp/to_mount /balance_trees /home/florin/tmp/to_mount/ 和 cat /proc/mounts /dev/root / ext3 /dev/root /home/florin/tmp/to_mount/ /dev/sda2 /mnt/mnt_point1 ext3 /dev/sda2 / mnt/mnt_point2 ext3 感谢您的建议。
  • @baudolino:是的,may 包含该信息,但它不能。 mount 可以被告知不要在mtab 中写入条目。 /proc/mounts 告诉你什么是真实的,不作弊。 man 页面中有一段解释了不同之处。
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多