liunx mnt命名空间

Mount namespace 的作用是隔离 mount point,每个 mnt namespace 内的文件结构可以单独修改,互不影响。

当前进程所在的 mnt namespace 的所有挂载点信息记录在以下三个文件中

为接下来的操作准备两个目录,每个目录下一个文件

启一个终端

[root@k8s-nginx1 ~]# ll /proc/$$/mount*
-r--r--r-- 1 root root 0 Nov 26 13:45 /proc/4433/mountinfo
-r--r--r-- 1 root root 0 Nov 26 13:45 /proc/4433/mounts
-r-------- 1 root root 0 Nov 26 13:45 /proc/4433/mountstats

创建新的 mount namespace 和 uts namespace 并运行 bash ###

[root@k8s-nginx1 ~]# unshare --mount --uts bash
### 设置 hostname 以便于观察 ### [root@k8s
-nginx1 ~]# hostname namespace-01 && exec bash
### 查看对应 namespace 的 inode number ### [root@namespace
-01 ~]# readlink /proc/$$/ns/{uts,mnt} uts:[4026532431] mnt:[4026532430]
### 将上面创建的 namespace01 目录挂在到 /mnt ###
[root@namespace-01 ~]# mount --bind namespace01/ /mnt/

1

### 查看 /mnt 目录下的文件 ###
[root@namespace-01 ~]# ll /mnt/
total 0
-rw-r--r-- 1 root root 0 Nov 26 13:46 namespace01.txt

另启动一个终端

创建新的 mount namespace 和 uts namespace,执行 bash ###

[root@k8s-nginx1 ~]# unshare --mount --uts bash
[root@k8s-nginx1 ~]# hostname namespace-02 && exec bash
[root@namespace-02 ~]# readlink /proc/$$/ns/{uts,mnt}
uts:[4026532433]
mnt:[4026532432]
[root@namespace-02 ~]# ll /mnt/
total 0
drwxr-xr-x. 2 root root 6 Nov  6 13:52 cdrom
[root@namespace-02 ~]# mount --bind namespace02/ /mnt/
[root@namespace-02 ~]# ll /mnt/
total 0
-rw-r--r-- 1 root root 0 Nov 26 13:46 namespace02.txt

当新的 mount namespace 创建时,会从创建进程所在的 namespace 复制挂载点信息,所以 namespace01 和 namespace02 都可以看到相同的文件视图

[root@namespace-01 ~]# unshare --mount --uts bash
[root@namespace-01 ~]# hostname namespace-03 && exec bash
[root@namespace-03 ~]# readlink /proc/$$/ns/{uts,mnt}
uts:[4026532435]
mnt:[4026532434]
[root@namespace-03 ~]# ll /mnt/
total 0
-rw-r--r-- 1 root root 0 Nov 26 13:46 namespace01.txt