对挂载系统调用中的源和目标关键字感到困惑



我正在实现一个容器,该容器使用新的命名空间克隆,包括mount,pid,用户命名空间等。孩子要做的第一步是使用系统调用挂载几个重要的点,例如/proc/sys/tmpmount

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什么的。

相关内容

  • 没有找到相关文章

最新更新