我正在实现一个容器,该容器使用新的命名空间克隆,包括mount,pid,用户命名空间等。孩子要做的第一步是使用系统调用挂载几个重要的点,例如/proc
、/sys
和/tmp
mount
。
if(::mount("proc", "/proc", "proc", 0, NULL)==-1) {
printf("Failed on mount: %sn", strerror(errno));
return -1;
}
if(::mount("sysfs", "/sys", "sysfs", 0, NULL)==-1) {
printf("Failed on mount: %sn", strerror(errno));
return -1;
}
if(::mount("tmp", "/tmp", "tmpfs", 0, NULL)==-1) {
printf("Failed on mount: %sn", strerror(errno));
return -1;
}
但是,我对传递给mount
的参数列表中的source
字段有点困惑。
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
来源到底是什么意思?例如,挂载/tmp
似乎与源字符字符串无关。即使使用::mount(nullptr, "/tmp", "tmpfs", 0, NULL)
,我仍然可以看到在新命名空间下创建的新/tmp
文件夹。我错过了什么吗?
它只是应该匹配参数,例如/etc/fstab
文件中提供的参数。例如,在我的 fstab 上,我有:
# <file system> <mount point> <type> <options> <dump> <pass>
...
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
但这些例子有点不同,因为它们的性质。事实上,proc 和 sysfs 都不是通用文件系统。因此,如果您安装硬盘驱动器,则源将更加直接,例如/dev/sda1
。
而且,由于您要在命名空间之上实现隔离,因此请注意容器是否在/proc
上调用umount
。它可能会显示主机的进程,从而打破隔离。
给 Aif 的答案补充一点: 根据挂载手册页:
mount() 附加由 source 指定的文件系统(通常是 引用设备的路径名,但也可以是 目录或文件,或虚拟字符串)到位置(目录或 文件),由目标中的路径名指定。
在tmpfs
的情况下,它在很大程度上是一个虚拟字符串。您只是在创建一个临时文件系统。tmpfs
存储在易失性存储器中,是暂时的,并没有真正的来源。
对于其他文件系统类型,source
将非常重要,指定要挂载到该目录的文件系统,例如/dev/sda1
什么的。