execve(2)가 시스템 명령을 시작하지 않습니다.

execve(2)가 시스템 명령을 시작하지 않습니다.

적절한 플래그와 함께 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 각 실행 파일에 명령문을 추가할 때 동일한 경로가 혼동을 일으킬 수 있는지 확인하여 내 프로그램이 어떤 경로를 사용했는지 확인하고 문제 없이 잘 작동하고 예상대로 정확했는지 확인하고 싶었기 때문에 문제는 시스템 기본 명령이 작동하지 않습니다.

관련 정보