2016-05-18 5 views
1

次の単純なC++プログラムは、マウントスペースの共有を解除し、USBストレージデバイス(/dev/sdd)をマウントし、入力を待ち、そのデバイスをアンマウントします。私は(-fpermissiveしてコンパイルした後に)それを実行しかしunshareシステムコールが機能しない

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

、マウントは、システム上の他のすべてのプロセスから見えます。

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

私は間違っていますか?

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

+0

おそらくあなたはそれをマウントする権利があります( '/ etc/fstab'による)が、マウントを解除するのではないでしょうか? – Alfe

+0

あなたは 'unshare()'や 'wait()'の戻り値をチェックしていません... – inetknght

+0

なぜ 'CLONE_NEWNS'を使うのですか?また、なぜumount()を呼び出さないのでしょうか? http://linux.die.net/man/2/umount – inetknght

答えて

1

は、OSのデフォルトオプションは共有を解除(2)作業を行うためにUbuntuの16に変更されたマウントが判明し、あなたは(前に共有を解除する)あなたのコードに次の行を追加する必要があります。

mount("none", "/", NULL, MS_PRIVATE | MS_REC, NULL); 
+1

ありがとうございます! 'mount(8)'と 'unshare(1)'を使ってコマンドライン上で同等のことは、 'mount --make-rprivate none/&& unshare --mount program [args]'です。 – Patrick

関連する問題