次の単純な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)で動作します - これは何か関係がありますか?
おそらくあなたはそれをマウントする権利があります( '/ etc/fstab'による)が、マウントを解除するのではないでしょうか? – Alfe
あなたは 'unshare()'や 'wait()'の戻り値をチェックしていません... – inetknght
なぜ 'CLONE_NEWNS'を使うのですか?また、なぜumount()を呼び出さないのでしょうか? http://linux.die.net/man/2/umount – inetknght