2016-11-30 11 views
0

マウント、pid、ユーザネームスペースなどの新しい名前空間でクローン化されたコンテナを実装しています。 /proc,/sysおよび/tmpmountシステムコールを使用します。マウントシステムコールのsourceキーワードとtargetキーワードで混同されています

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; 
} 

はしかし、私は少し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フォルダが表示されます。何か不足していますか?

答えて

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になります。

名前空間の上に分離を実装するため、コンテナが/procumountを呼び出す場合は注意してください。ホストのprocを明らかにして、分離を破るかもしれません。 Aif`s回答にビットを追加する

0

mount manpageに従って:

マウント()は、多くの場合、デバイスを参照 パス名である(ソースによって指定されたファイルシステムを取り付けるだけでなく、することができます ディレクトリまたはファイルのパス名、またはダミー文字列)を、ターゲットのパス名で指定された場所(ディレクトリまたは ファイル)にコピーします。

tmpfsの場合は、非常にダミー文字列です。あなたは単に一時ファイルシステムを作成しています。 tmpfsは揮発性メモリに格納されており、実際にはソースを持っていない一時的なものです。

他のファイルシステムタイプの場合は、sourceが非常に重要で、どのファイルシステムをそのディレクトリにマウントするかを指定することが非常に重要です。 /dev/sda1または何がありますか。

関連する問題