1

次の単純な C++ プログラムは、マウント スペースの共有を解除し、USB ストレージ デバイス ( /dev/sddにあります) をマウントし、入力を待ってから、そのデバイスをアンマウントしようとします。

#include <iostream>
#include <stdio.h>
#include <exception>
#include <algorithm>
#include <vector>
#include <limits> 
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    unshare(CLONE_NEWNS);

    pid_t pid = fork();

    if (0 == pid)
    {
        char * mount_args[] = {"/bin/mount", "--make-rprivate", "/dev/sdd", "/mnt", "-o,ro", "-o,noexec", NULL};

        if (0 > execv("/bin/mount", mount_args))
        {
            perror("execv: ");
            exit(1);
        }
        //this line will never be reached.
        return 0;
    }
    else if (0 < pid)
    {
        //parent process!
        int status = -1;
        wait(&status);

        if (0 == status)
        {
            std::cout << "press ENTER to continue....";
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

            char * umount_args[] = {"/bin/umount", "/mnt", NULL};
            if (0 > execv("/bin/umount", umount_args))
            {
                perror("execv: ");
                exit(1);
            }
        }
        return status;
    }
    else
    {
        //fork error!
        perror("fork!\n");
        exit(1);
    }
    return 0;
}

ただし、実行すると ( -fpermissiveでコンパイルした後)、システム上の他のすべてのプロセスからマウントが表示されます。

マウントが他のユーザー空間プロセスから見えないようにするという私の目標は、明らかに達成されていません。

私は何を間違っていますか?

編集: このコードは Ubuntu 16.04 (カーネル バージョン 4.4) では機能しません。Ubuntu 14.04 (カーネルバージョン 4.2) で動作します - これは何か関係があるのでしょうか?

4

1 に答える 1

1

OS のデフォルトのマウント オプションが Ubuntu 16 で変更されたことが判明しました。unshare(2) を機能させるには、次の行をコードに追加する必要があります (unshare の前に):

mount("none", "/", NULL, MS_PRIVATE | MS_REC, NULL);
于 2016-05-24T07:53:31.653 に答える