4

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

私の C プログラムはとても単純です。メインはクローンを呼び出します

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

args は、実行するコマンドを含むチャット配列です。

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

execvp に渡されるコマンドが である場合、mount出力に /mytmp マウント ポイントが含まれmount、プログラムの終了後にコマンドを再度実行すると、/mytmp が表示されないことが予想されます。それは起こっていません。execvp が呼び出されたときと、mount を実行した後に表示されます。

MS_PRIVATE フラグを付けてマウントしてみましたunshare(CLONE_FS);

また、子プロセスから /proc をアンマウントしようとすると、get resource is busy エラーが発生するという同様の問題がありました。私は、新しい名前空間でそれが起こるべきではないと考えました。

4

1 に答える 1

1

これは私にとって2つの問題に帰着しました。

まず、使用しているUbuntu(16.04.1 LTS)またはutil-linuxパッケージのバージョンが/マウント名前空間を共有し、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 のアンマウントです。システムが 2 回マウントされたため、これは機能しませんでした/proc/sys/fs/binfmt_misc。ここでの議論は、私にそれを確認するよう促しました。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;
}
于 2016-10-05T03:58:05.877 に答える