5

今日のLinux カーネルの名前空間にはいくつかの問題があります。具体的には、一意の PID 名前空間内の PID をグローバル PID 名前空間内のPID に関連付けることです。

次のいずれかを実行できる必要があります。

a)名前空間によって割り当てられた PID を使用して、グローバル スコープからプロセスを強制終了します

また

b)名前空間固有の PID をグローバル PID に変換して、グローバル スコープから PID を削除できるようにする

また

c) PID 名前空間内のプロセスがグローバル PID を報告できるようにします。これにより、グローバル スコープから PID を強制終了できます。

名前空間シナリオで PID 情報を含むプロセス構造については、ここでいくつかの議論があります。ユーザーランドアプリケーションからこれらの構造にアクセスできるかどうか、またはカーネルハックを介してサポートを追加する必要があるかどうかはわかりません。

なんで? 現在ネットワーク名前空間を使用しているアプリケーションがあります。PID 名前空間のサポートを追加しています。現在の仕組みは次のとおりです。

PID 名前空間の導入前: メイン アプリケーションは現在、別のネットワーク名前空間で bash コンソールを起動します。次に、その bash コンソールを使用してプログラムを開始し、それらのプログラムに現在の PID を報告させます。メイン アプリケーションがそのネットワーク名前空間内のサブプロセスを強制終了したい場合は、報告された PID を強制終了するよう OS に指示するだけです。

PID 名前空間あり (壊れた状態): メイン アプリケーションは現在、別のネットワークと PID 名前空間で bash コンソールを起動します。次に、その bash コンソールを使用してプログラムを開始し、それらのプログラムに現在の PID を報告させます。ただし、報告された現在の PID は、グローバル PID 名前空間では有効ではありません (グローバル名前空間の PID が 56000 の場合、10 になる可能性があります)。その結果、メイン アプリケーションは、そのネットワーク + PID 名前空間でサブプロセスを強制終了できません。

いつものように、どんな指導も大歓迎です

4

1 に答える 1

0

アプローチは、pidキューでターゲットpidに一致するプロセス記述子を検索することです。レポートシェルが同じワークスペースにある場合、システムコールを作成して他のプロセスの「プロセス記述子」を取得し、ある種のforループを作成できます/proc/< pid> でプロセスの説明を見つける

こちらもご覧ください: http://lkml.indiana.edu/hypermail/linux/kernel/0707.0/1701.html 特に、この部分:

/*
 * the helpers to get the pid's id seen from different namespaces
 *
 * pid_nr() : global id, i.e. the id seen from the init namespace;
 * pid_vnr() : virtual id, i.e. the id seen from the namespace this pid
 * belongs to. this only makes sence when called in the
 * context of the task that belongs to the same namespace;
 * pid_nr_ns() : id seen from the ns specified.
 *
 * see also task_xid_nr() etc in include/linux/sched.h
 */

static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
-    nr = pid->nr;
+    nr = pid->numbers[0].nr;
return nr;
}

それが役に立てば幸い!

よろしくお願いします!

于 2013-12-07T06:12:25.717 に答える