/ *
* 2020/12/15 11:58 yin
*
*名前空間は、仮想化のために生まれたLinuxカーネルによって提供される機能です
* /
/ *
* nsproxy
* /
struct nsproxy { atomic_t count; struct uts_namespace * uts_ns; struct ipc_namespace * ipc_ns; struct mnt_namespace * mnt_ns; struct pid_namespace * pid_ns_for_children; struct net * net_ns; struct cgroup_namespace * cgroup_ns; }; extern struct nsproxy init_nsproxy;
/ **
名前空間
* /
メカニズムは、リソース分離のためのソリューションを提供します
名前空間は、グローバルシステムリソースの一種のカプセル化と分離であるため、異なる名前空間のプロセスは独立したグローバルシステムリソースを持ちます。
名前空間のシステムリソースを変更すると、現在の名前空間のプロセスにのみ影響し、他の名前空間のプロセスには影響しません。名前空間。
cat / proc / [pid] / ns
Linuxカーネルには現在7つの名前空間が実装およびサポートされています
名前定義説明
Cgroup CLONE_NEWCGROUP Cgroupルートディレクトリ(Linux 4.6)
IPC CLONE_NEWIPCは、プロセス間通信を分離します(Linux 2.6.19)
ネットワークCLONE_NEWNETはネットワークリソースを分離します(Linux 2.6.24)
CLONE_NEWNS分離ファイルシステムマウントポイントをマウントします(Linux 2.4.19)
PID CLONE_NEWPID分離プロセスID(Linux 2.6.24)
ユーザーCLONE_NEWUSERユーザーIDとユーザーグループIDを分離します(Linux 2.6.23で開始され、Linux 3.8で完了)
UTS CLONE_NEWUTS(UNIXタイムシェアリングシステム)名前空間は、ホスト名とドメイン名の分離を提供し、
子プロセスが独立したホスト名とドメイン名(ホスト名)を持つことを可能にします。この機能はDockerコンテナー技術で使用さ
れ、ネットワーク上にドッカーコンテナーを作成します。ホスト上のプロセスだけでなく、独立したノードとして扱われます。
/ *
* PID名前空間
* /
Linuxシステムでプロセスを作成するためのシステムコールはclone()です。
int pid = clone(main_function、stack_size、SIGCHLD、NULL);
このシステムコールは、新しいプロセスを作成し、そのプロセス番号pidを返します。
clone()システムコールを使用して新しいプロセスを作成する場合、次のように、パラメーターにCLONE_NEWPIDパラメーターを指定できます。
int pid = clone(main_function、stack_size、CLONE_NEWPID | SIGCHLD、NULL);
このとき、新しく作成されたプロセスは、PIDが1であるまったく新しいプロセススペースを「認識」します。
/ *
* Docker
* /
DockerはUTS名前空間の原則を使用し、各イメージはそれ自体が提供するサービス名でイメージのホスト名に名前を付けることができ、ホストに影響を与えないため
、ホスト名とドメイン名。
名前空間は、仮想化のために生まれたLinuxカーネルによって提供される機能です。Dockerの誕生により、コンテナ技術が爆発し、バックグラウンドで長い間静かに捧げられてきた名前空間技術もすべての人にプッシュされました。
/ *
* UTS名前空間
* /
UTS名前空間は、ホスト名とドメイン名の分離を提供します。つまり、structutsnameのnodenameとdomainnameの2つのフィールドです。異なる名前空間に独立したホスト名とドメイン名が存在する可能性があります。
では、なぜホスト名とドメイン名を分離する必要があるのでしょうか。IPアドレスの代わりにホスト名とドメイン名を使用できるため、この分離層がないと、同じホスト上の異なるコンテナーへのネットワークアクセスで問題が発生する可能性があります。
/ *
* IPC名前空間
* /
IPC名前空間は、プロセス間通信の分離です。プロセス間通信の一般的な方法には、セマフォ、メッセージキュー、共有メモリが含まれます。
IPC名前空間は、主にSystemV IPCおよびPosixメッセージキューを対象としています。これらのIPCメカニズムは、識別子を使用してさまざまなメッセージキューを区別するなど、識別子を使用します。
IPC名前空間の目標は、同じ識別子が異なる名前空間内の異なる通信メディア(セマフォ、メッセージキュー、共有メモリなど)を表すことです。
/ *
* API
* /
/ *新しいプロセスを作成し、新しい名前空間に配置します* /
int clone(int(* child_func)(void *)、void * child_stack、int flags、void * arg);
/ *現在のプロセスを既存の名前空間に追加します* /
int setns(int fd、int nstype);
/ *現在のプロセスを指定されたタイプの名前空間を終了させ、新しく作成された名前空間に追加します(新しい名前空間の作成と追加に相当)* /
int unshare(int flags);
/ * cloneとunshareの違い* /
どちらも新しい名前空間を作成して追加することです。違いは次のとおりです
。unshareは現在のプロセスを新しい名前空間に参加させること、
cloneは新しい子プロセスを作成することです。プロセスは新しい名前空間に参加しますが、現在のプロセスは変更されません