由mount系统调用中的source和target关键字混淆

时间:2016-11-30 23:42:53

标签: linux mount linux-namespaces

我正在实现一个使用新命名空间克隆的容器,包括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)文件夹。我错过了什么吗?

2 个答案:

答案 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 manpage

向Aif的回答添加一点:
  

mount()附加source指定的文件系统(通常是          pathname指设备,但也可以是a的路径名          目录或文件,或虚拟字符串)到该位置(目录或          文件)由目标中的路径名指定。

tmpfs的情况下,它是一个虚拟字符串。您只是创建一个临时文件系统。 tmpfs存储在易失性存储器中,并且是临时的,而不是真正有源。

对于其他文件系统类型,source将非常重要,指定要挂载到该目录的文件系统,例如/dev/sda1或你有什么。