2016-10-05 8 views
2

ここで何が起こっているのか少し混乱します。私はguideに続き、CLONE_NEWNSフラグを設定してcloneを呼び出した後に新しいマウントポイントが追加されました。マウントポイントは、子プロセスに対してのみ存在するはずです。私は新しいファイルシステムの名前空間を変更しようとしています。親のものに影響するようです。CLONE_NEWNSでclone()を実行した後mount()でエフェクトを親に設定

私のCプログラムはかなり簡単です。メインはクローンを呼び出す

pid_t pid = clone(child_exec,c_stack, SIGCHLD | CLONE_NEWNS | CLONE_NEWPID ,args); 

argsはexecコマンドを含むチャット配列です。

int child_exec(void *arg) 
{ 
     int err =0; 
     char **commands = (char **)arg; 
     mount("none", "/mytmp", "tmpfs", 0, "");  
     execvp(commands[0],commands); 
     return 0; 
} 

EXECVPに渡されるコマンドは、Iが出力/マウントポイントを、プログラムが出てくるmytmp /見えないために出た後再度コマンドを実行しているmount mytmp含むように期待するmountある場合。それは起こっていない。私はexecvpが呼び出されたときとマウントされた後にそれを見る。

私はMS_PRIVATEフラグでマウントし、unshare(CLONE_FS);

を使用してみましたまた、私は子プロセスからの/ procをアンマウントしようとしたとのgetリソースがビジーエラーで同様の問題がありました。私は新しい名前空間で起こってはならないと思った。

+0

ことになりました。あなたは何かを尋ねるのではなく、起こったことを説明しているだけです。 – immibis

+0

明確ではありませんか?私は親に影響を与えずに新しいファイルシステムの名前空間を操作しようとしています。 – Matthew

+0

あなたがしようとしていることは明らかです。あなたが質問していないので、あなたが何の質問をしているのかははっきりしていません。 – immibis

答えて

1

これは2つの問題になりました。

まず、Ubuntu(16.04.1 LTS)またはutil-linuxパッケージのバージョンのようです。私は/ mount名前空間を共有していて、CLONE_NEWNSはその設定を伝播しています。私/マウントは共有されました。私は/ proc/self/mountinfoと/ proc/1/mountinfoでこれを確認しました。私はこの回答からsudo mount --make-private -o remount /を試して、上記のパッケージをアップグレードしました。 https://unix.stackexchange.com/questions/246312/why-is-my-bind-mount-visible-outside-its-mount-namespace。これにより、私は親の名前空間に影響を与えずに余分なマウントを行うことができました。

2番目の問題は/ procをアンマウントすることでした。私のシステムには/proc/sys/fs/binfmt_miscが2回マウントされているため、これは機能しませんでした。ここでの議論は私にそれを確認するよう促した。 http://linux-kernel.vger.kernel.narkive.com/aVUicig1/umount-proc-after-clone-newns-in-2-6-25

私の最後のchild_execコードは、この質問には疑問はありません

int child_exec(void *arg) 
{ 
     int err =0; 
     char **commands = (char **)arg; 
     printf("child...%s\n",commands[0]); 
//  if(unshare(CLONE_NEWNS) <0) 
//    printf("unshare issue?\n"); 
     if (umount("/proc/sys/fs/binfmt_misc") <0) 
       printf("error unmount bin: %s\n",strerror(errno)); 
     if (umount("/proc/sys/fs/binfmt_misc") <0) 
       printf("error unmount bin: %s\n",strerror(errno)); 
     if (umount("/proc") <0) 
       printf("error unmount: %s\n",strerror(errno)); 
     if (mount("proc", "/proc", "proc",0, NULL) <0) 
       printf("error mount: %s\n",strerror(errno)); 
     execvp(commands[0],commands); 
     return 0; 
} 
関連する問題