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が実行されないようにするいくつかのエラーがありました。この結果をさらにテストするために、マウントネームスペースにファイルシステムを再利用し、同じ実行ファイルを移動しました。同じパスの最初のファイルシステム"/"と同じパスの2番目のファイルシステム 私の実行可能ファイルのデフォルトシステムパス= /home/omar/docs/test.out パーティションパスから実行可能ファイルとしてファイルシステムをインストールしました= /home/omar/docs/test.out 各実行可能ファイルにステートメントを追加するときに同じパスが混乱を引き起こす可能性があることを確認して、私のプログラムがどのパスを使用したかを確認し、問題なく正常に動作し、期待どおりに正確であることを確認したかったので、問題はシステム基本コマンドが機能するしません。

関連情報