Mount namespace

mount namespace稍微简单点,因为PID namesapce需要用到所以就先简单介绍一下。
mount namespace是用来隔离文件系统的挂载点,这样进程就只能看到自己的文件系统挂载点。新mount namespace中的挂载点是从调用者所在的mount namespace中拷贝的,但是新mount namespace创建后和原mount namespace就没啥关系了(除了shared subtree的情况),下面通过iso文件的挂载来演示。
1.创建所需的路径

1
2
3
4
5
6
7
$ sudo mkdir /demo
$ sudo chmod 777 /demo
$ cd demo
$ mkdir -p iso1/subdir1
$ mkdir -p iso2/subdir2
$ mkisofs -o 1.iso ./iso1
$ mkisofs -o 2.iso ./iso2

再准备两个目录当挂载点:

1
$ sudo mkdir /mnt/iso1 /mnt/iso2

2.在当前shell执行挂载操作:

1
$ sudo mount 1.iso /mnt/iso1

3.打开一个新shell,新shell和旧shell在同一个mount namesapce中,在新shell中执行unshare命令,新建mount namespace:

1
$ sudo unshare -m

在两个shell中分别执行readlink命令查看当前进程所在的mount namespace:

1
$ readlink /proc/$$/ns/mnt

可以看到两个shell的mount namespace是不同的。此时查看两个shell的挂载点信息是相同的:

1
2
$ mount | grep 1.iso
/demo/1.iso on /mnt/iso1 type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)

4.在新shell中执行一些mount和umount操作:

1
2
# mount 2.iso /mnt/iso2
# umount /mnt/iso1

再查看两个shell中的挂载点信息就不一样了:

1
2
$ mount | grep iso
/demo/2.iso on /mnt/iso2 type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)

这里就先介绍命令使用的方法,代码实现比较简单,和PID namespace合在一起了。

reference
https://www.cnblogs.com/sparkdev/p/9424649.html