0

我正在实现一个容器,该容器使用新的命名空间进行克隆,包括挂载、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似乎与源字符字符串无关。即使/tmp使用::mount(nullptr, "/tmp", "tmpfs", 0, NULL). 我错过了什么吗?

4

2 回答 2

0

在 Aif 的回答中添加一点:根据安装手册页

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

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

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

于 2016-12-14T22:14:04.600 回答
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。它可能会揭示主机的进程,从而打破隔离。

于 2016-12-14T22:07:57.360 回答