2016-11-30 22 views
0

我正在實現一個容器,該容器使用包括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似乎與源字符串沒有任何關係。即使使用::mount(nullptr, "/tmp", "tmpfs", 0, NULL),我仍然可以在新的名稱空間下看到新的/tmp文件夾。我錯過了什麼嗎?

回答

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

而且由於您要在名稱空間之上實施隔離,所以請注意容器是否在/proc上調用umount。它可能會揭示主持人的過程,從而打破隔離。

0

至位添加到Aif`s答案:根據mount manpage

安裝()附着由源規定(其通常是 路徑名指的是設備的文件系統,但也可以是 目錄或文件的路徑名或虛擬字符串)添加到目標中的路徑名指定的位置(目錄或 文件)。

tmpfs的情況下,它是非常多的虛擬字符串。您只需創建a臨時文件系統。 tmpfs存儲在易失性存儲器中,並且是暫時的,而不是真的有源。

對於其他文件系統類型,source將是非常重要的,指定您要安裝到該目錄的文件系統,例如, /dev/sda1或你有什麼。