我正在实现一个使用新命名空间克隆的容器,包括mount,pid,用户命名空间等。孩子的第一步是安装几个重要的点,例如/proc
,/sys
和/tmp
使用mount
系统调用。
if(::mount("proc", "/proc", "proc", 0, NULL)==-1) {
printf("Failed on mount: %s\n", strerror(errno));
return -1;
}
if(::mount("sysfs", "/sys", "sysfs", 0, NULL)==-1) {
printf("Failed on mount: %s\n", strerror(errno));
return -1;
}
if(::mount("tmp", "/tmp", "tmpfs", 0, NULL)==-1) {
printf("Failed on mount: %s\n", strerror(errno));
return -1;
}
但是,我对传递给source
的参数列表中的mount
字段感到有些困惑。
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
来源的确切含义是什么?例如,挂载/tmp
似乎与源char字符串无关。即使使用/tmp
,我仍然可以看到在新命名空间下创建的新::mount(nullptr, "/tmp", "tmpfs", 0, NULL)
文件夹。我错过了什么吗?
答案 0 :(得分:0)
它应该与您的/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
。
并且因为您在命名空间之上实现隔离,所以请注意容器是否在umount
上调用/proc
。它可能会揭示主持人的过程,从而打破孤立。
答案 1 :(得分:0)
mount()附加source指定的文件系统(通常是 pathname指设备,但也可以是a的路径名 目录或文件,或虚拟字符串)到该位置(目录或 文件)由目标中的路径名指定。
在tmpfs
的情况下,它是一个虚拟字符串。您只是创建一个临时文件系统。 tmpfs
存储在易失性存储器中,并且是临时的,而不是真正有源。
对于其他文件系统类型,source
将非常重要,指定要挂载到该目录的文件系统,例如/dev/sda1
或你有什么。