仅列出绑定安装

l0b*_*0b0 32 linux mount bind-mount

而不是使用mount | grep,我想使用mount -l -t bind,但这不起作用,并-t none显示所有坐骑。

Gil*_*il' 34

绑定挂载不是文件系统类型,也不是挂载文件系统的参数;它们是装载操作的参数。据我所知,就内核而言,以下命令序列导致基本相同的系统状态:

mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Run Code Online (Sandbox Code Playgroud)

所以要记住什么坐骑是绑定安装的唯一办法是在日志mount留在命令/etc/mtab。绑定挂载操作由bind挂载选项指示(这会导致文件系统类型被忽略)。但是mount无法选择仅列出使用一组特定选项安装的文件系统。因此,您需要自己进行过滤。

mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Run Code Online (Sandbox Code Playgroud)

请注意,/etc/mtab仅当它是由mount. 一些发行版设置/etc/mtab为符号链接/proc/mounts/proc/mounts大部分等同于/etc/mtab但确实有一些差异,其中之一是不跟踪绑定安装。

内核保留但未在 中/proc/mounts显示的一条信息是挂载点仅显示已挂载文件系统上目录树的一部分。在实践中,这主要发生在绑定安装上:

mount --bind /mnt/one/sub /mnt/partial
Run Code Online (Sandbox Code Playgroud)

/proc/mounts,对于条目/mnt/one/mnt/partial具有相同的设备,相同的文件系统类型和相同的选项。该信息/mnt/partial只能说明真实扎根在文件系统的一部分/sub是可见的每个进程的安装点信息/proc/$pid/mountinfo(第4栏)。那里的条目如下所示:

12 34 56:78 / /mnt/one rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
12 34 56:78 /sub /mnt/partial rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
Run Code Online (Sandbox Code Playgroud)

  • @Gilles 实际上,您只需使用`findmnt | 就可以做到这一点。fgrep [` as [在此处解释](http://unix.stackexchange.com/a/33586/11052)。 (5认同)

小智 32

也许这可以解决问题:

findmnt | grep  "\["
Run Code Online (Sandbox Code Playgroud)

例子:

$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep  "\["
? ??/tmp/foo                     /dev/sda2[/media] ext4            rw,relatime,data=ordered
Run Code Online (Sandbox Code Playgroud)

  • findmnt 使用`/proc/self/mountinfo`,所以你也可以直接检查那里。 (2认同)

cg9*_*909 14

事后内核不处理与普通挂载不同的绑定挂载。唯一的不同在于mount运行时发生的情况。

当您挂载文件系统(例如使用mount -t ext4 /dev/sda1 /mnt)时,内核(稍微简化)执行三个步骤:

  1. 内核查找指定文件系统类型的文件系统驱动程序(如果您省略-t或使用-t auto mount为您猜测类型并将猜测类型提供给内核)
  2. 内核指示文件系统驱动程序使用源路径和任何提供的选项访问文件系统。此时文件系统仅由主要:次要编号对标识。
  3. 文件系统绑定到一个路径(挂载点)。内核还在这里使用了一些挂载选项。(nodev例如是挂载点上的一个选项,而不是文件系统上的选项。您可以有一个绑定安装nodev和一个没有绑定安装)

如果您执行绑定安装(例如使用mount --bind /a /b),则会发生以下情况:

  1. 内核解析哪个文件系统包含源路径和从挂载点到目录的相对路径。
  2. 文件系统使用选项和相对路径绑定到新的挂载点。

(我会跳过mount --move,因为它与问题无关。)

这与在 Linux 上创建文件的方式非常相似:

  1. 内核决定哪个文件系统负责应该在其中创建文件的目录。
  2. 在文件系统中创建一个新文件。此时文件只有一个 inode 编号。
  3. 新文件链接到目录中的文件名。

如果您进行硬链接,则会发生以下情况:

  1. 内核解析源文件的 inode 编号。
  2. 该文件链接到目标文件名。

如您所见,创建的文件和硬链接无法区分:

$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second
Run Code Online (Sandbox Code Playgroud)

但是,由于您可以通过比较 inode 编号来识别文件的所有硬链接,因此您可以通过比较主要:次要挂载数来识别文件系统的所有挂载。

您可以使用findmnt -o TARGET,MAJ:MIN或直接查看/proc/self/mountinfo有关详细信息,请参阅 Linux 内核文档)来执行此操作。

以下 Python 脚本列出了所有绑定安装。它假定到已挂载文件系统根目录的相对路径最短的最旧挂载点是原始挂载点。

$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second
Run Code Online (Sandbox Code Playgroud)

  • 最好实用的答案!通过专业:次要进行识别非常酷 (2认同)