![execve(2)가 시스템 명령을 시작하지 않습니다.](https://linux55.com/image/153343/execve(2)%EA%B0%80%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%9C%EC%9E%91%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
적절한 플래그와 함께 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로 설정한 다음 ivot_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를 시작하지 않고 프로그램이 오류 없이 실행된다는 것입니다. execve(2) 앞에 system(2) 문을 추가하면 system("ls");
적절한 파일 시스템과 현재 작업 디렉터리가 나열됩니다. 또한 execve(2) 매개변수를 execve("/bin/ls", (char*)0, NULL)
다음 매개변수 로 변경하면
execve("/bin/pstree", (char*)0, NULL)
오류가 반환됩니다.해당 파일이나 디렉터리가 없습니다.또는exec 시스템 호출을 통해 NULL argv[0]이 전달되었습니다., execve(2) 시스템 호출에서 내 프로그램을 추적하면 다음이 제공됩니다.비어 있음, 0, 비어 있음) = 17992
업데이트: 오류는 파일 시스템 이미지와 관련이 없습니다. 좀 더 테스트를 수행했으며 아래와 같이 네임스페이스를 마운트하는 데 사용한 파일 시스템은 파티션에 마운트하고 /bin을 실행한 파일 시스템이 아니라 내 시스템의 파일 시스템이었습니다. /bash 파일 시스템. 여전히 작동합니다. 간단한 C 프로그램을 만들고 컴파일했는데 잘 실행되었습니다. 그래서 bin/bash가 실행되지 못하게 하는 몇 가지 오류가 있었습니다. 이 결과를 추가로 테스트하기 위해 마운트 네임스페이스에 파일 시스템을 재사용했고, 동일한 실행 파일을 이동했습니다. 동일한 경로의 첫 번째 파일 시스템 "/"
및 동일한 경로의 두 번째 파일 시스템
내 실행 파일의 기본 시스템 경로 = /home/omar/docs/test.out
파티션 경로에서 실행 파일로 파일 시스템을 설치했습니다 = /home/omar/docs/test.out
각 실행 파일에 명령문을 추가할 때 동일한 경로가 혼동을 일으킬 수 있는지 확인하여 내 프로그램이 어떤 경로를 사용했는지 확인하고 문제 없이 잘 작동하고 예상대로 정확했는지 확인하고 싶었기 때문에 문제는 시스템 기본 명령이 작동하지 않습니다.