2016-05-18 4 views
1

Следующая простая программа на C++ пытается развязать пространство монтирования, подключить запоминающее устройство USB (расположенное по адресу /dev/sdd), ждет ввода, а затем umounts это устройство.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; 
} 

Однако, когда я запускаю его (после компиляции с -fpermissive) монтирование видно из любого другого процесса в системе.

Моя цель, когда мои монстры невидимы для других процессов в пользовательском пространстве, явно не достигнута.

Что я делаю неправильно?

Редактировать: этот код не работает на Ubuntu 16.04 (версия ядра 4.4). Он работает на Ubuntu 14.04 (версия ядра 4.2) - может быть, это имеет к этому какое-то отношение?

+0

Может быть, вы имеете право монтировать его (в соответствии с '/ etc/fstab'), но не для его размонтирования? – Alfe

+0

Вы не проверяете возвращаемое значение 'unshare()', а не 'wait()' ... – inetknght

+0

Почему вы используете 'CLONE_NEWNS'? Кроме того, почему _not_ вызов 'umount()'? http://linux.die.net/man/2/umount – inetknght

ответ

1

Оказывается, ОС по умолчанию параметр монтирования изменилось в Ubuntu 16. Для того, чтобы сделать работу отменить общий доступ (2), необходимо добавить следующую строку в ваш код (до до закрыть доступ):

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

Спасибо за это! Эквивалент в командной строке, используя 'mount (8)' и 'unshare (1)', это: 'mount --make-rprivate none/&& unshare --mount program [args]'. – Patrick

Смежные вопросы