了解挂载命名空间在 Linux 中的工作原理

了解挂载命名空间在 Linux 中的工作原理

我正在读关于挂载命名空间并查看:

在挂载命名空间中,您可以挂载和卸载文件系统,而不会影响主机文件系统。因此,您可以安装一组完全不同的设备(通常更少)。

我试图理解Linux命名空间,还有 LXC 之类的,但我不太明白上面这句话的意思。

我想要了解的是容器(1)如何拥有这样的文件:

/foo/a.txt
/foo/bar/b.txt

另一个容器 (2) 可以包含如下文件:

/foo/a.txt
/foo/x.txt
/foo/bar/b.txt
/foo/bar/y.txt

容器 (1) 和 (2) 的位置/foo/a.txt/foo/bar/b.txt位置相同小路,但也许它们有不同的内容:

# container (1)
cat /foo/a.txt #=> Hello from (1)

# container (2)
cat /foo/a.txt #=> Hello from (2)

这意味着物理系统上的文件(我对此一无所知)以一种方式存储,可能分散在各处。但还有一个“虚拟”文件的集中数据库在操作系统中, 像这样:

db:
  container1:
    foo:
      a.txt: Hello from a from (1)
      bar:
        b.txt: Hello from b from (1)
  container2:
    foo:
      a.txt: Hello from a from (2)
      x.txt: Hello from x from (2)
      bar:
        b.txt: Hello from b from (2)
        y.txt: Hello from y from (2)

然后有其他物理文件的操作系统数据库可能如下所示:

drive1:
  dir1:
    foo:
      a.txt
      bar:
        b.txt
  dir2:
    foo:
      a.txt
      x.txt
      bar:
        b.txt
        y.txt

因此,当您在容器中创建文件时,您实际上创建了 2 条新记录:

  1. 1 为驱动器级物理文件映射
  2. 1 为容器级虚拟文件映射

这就是我想象的工作方式。这就是我如何看到有一种方法可以(1)向用户(在 LXC 容器或 cgroup(我对此不太了解)中)呈现感觉如何一个完整的“文件系统”,其中他们可以(2)创建自己的完全可定制的目录结构(可能具有与完全不同的虚拟文件系统相同的命名文件/目录/路径),以便(3)文件来自多个不同虚拟文件系统/容器的文件不会相互覆盖。

想知道它是否是这样工作的,如果不是,它实际上是如何工作的(或者它是如何工作的概述)。

答案1

挂载命名空间的排列方式有所不同挂载的文件系统

这是非常灵活的,因为挂载可以是文件系统内子目录的绑定挂载。

# unshare --mount  # run a shell in a new mount namespace

# mount --bind /usr/bin/ /mnt/
# ls /mnt/cp
/mnt/cp

# exit  # exit the shell, and hence the mount namespace

# ls /mnt/cp
ls: cannot access '/mnt/cp': No such file or directory

您可以使用该命令列出当前的安装集findmnt

在完整的容器中,根挂载将被替换,并且您可以使用完全独立的挂载树。这涉及到一些额外的细节,比如pivot_root()系统调用。您可能不需要确切地知道如何做到这一点。一些细节可以在这里找到:如何使用 Linux 命名空间执行 chroot?

相关内容