Я пытаюсь реализовать контейнер, и для этого я создаю процесс, используя системный вызов clone (2) с соответствующими флагами:
if ((child_pid = clone(child_main, process_struct.Stack + process_struct.StackPtr,
CLONE_NEWCGROUP
|CLONE_NEWIPC
|CLONE_NEWNET
|CLONE_NEWNS
|CLONE_NEWPID
|CLONE_NEWUTS
|SIGCHLD, &process_struct, checkpoint)) == -1){
fprintf(stderr,"Failed...%m \n");
exit(EXIT_FAILURE);
}else{
fprintf(stderr,"Done\n");
waitpid(child_pid, NULL, 0);
}
внутри child_main (). Я изменяю имя хоста дляпространство имен процесса, также я установил пространство имен монтирования, я установил иерархию файловой системы Linux на раздел, как при обычной установке Linux (я сделал это, чтобы создать чистый образ файловой системы, очищенный от моих файлов и двоичных файлов), а затем я установил распространениевведите MS_UNBINDABLE, затем я pivot_root (2), чтобы изменить корневой каталог моего процесса.
const int child_main(struct process *process_struct, int *checkpoint){
char c;
fprintf(stderr,"=> IPC setup...");
//double check the IPC
close(checkpoint[1]);
fprintf(stderr,"Done\n");
if ( sethostname(process_struct->Hostname,
strlen(process_struct->Hostname)) || mounting(process_struct)){
return -1;
}
// startup the IPC pipes
read(checkpoint[0], &c, 1);
if(execve("/bin/bash", (char*)0, NULL) == -1 ){
fprintf(stderr,"--> Launching process Failed %m\n");
return -1;
}
return 0;
}
Проблема состоит в том, что моя система переходит через execve (2) и не запускает / bin / bash ипрограмма течет без ошибок.Когда я добавляю оператор system (2) перед execve (2): system("ls");
, он перечисляет соответствующую файловую систему и текущий рабочий каталог.Также, когда я изменяю параметры execve (2) на: execve("/bin/ls", (char*)0, NULL)
или execve("/bin/pstree", (char*)0, NULL)
или любой другой параметр, он возвращает ошибку: Нет такого файла или каталога или A NULL argv [0] был передан через системный вызов exec , также когда я связываю свою программу с системным вызовом execve (2), он дает: NULL, 0, NULL) = 17992
Ошибка не имеет ничего общего с образом файловой системы, я выполнил больше тестов и, как следствие, я использовал для моих имен монтирования пространства файловой системы моей системы, а не той, которую я установил в разделе, и запуск / bin / bash по-прежнему не выполняетсяЯ создал простую C-программу и скомпилировал ее, и она работала нормально, поэтому есть что-то не так, что препятствует выполнению bin / bash, для дальнейшей проверки этих результатов я повторно использовал для своих пространств имен монтирования файловую систему из моей, которую я переместил так жеисполняемый файл для файловой системы сначала под "/"
и второй по тому же пути мой основной системный путь к исполняемому файлу = /home/omar/docs/test.out
моя смонтированная файловая система изпуть к разделу к исполняемому файлу = /home/omar/docs/test.out
, так как я хотел проверить, не мог ли тот же путь вызвать путаницу при добавлении к каждому исполняемому файлу комментария, чтобы можно было определить, какой путь выбрала моя программа, и он работал нормально без каких-либопроблема и правильно, как и ожидалось, поэтому проблема только в том, что основные системные команды не будут работать.