はじめに
この実験では、Linux でカーネル名前空間 (kernel namespaces) が有効になっているかどうかを確認する方法を学びます。プロセスの分離とコンテナ化に不可欠な名前空間の存在を特定し、検証するさまざまな方法を調査します。
まず、lsns コマンドを使用してシステム上のさまざまな名前空間をリストアップし、そのタイプと関連するプロセスを理解します。次に、/proc/self/ns ディレクトリ内の名前空間リンクを調べて、プロセスが特定の名前空間にどのようにリンクされているかを確認します。最後に、ネットワークの分離を管理する一般的なツールである ip netns コマンドを使用して、ネットワーク名前空間 (network namespaces) を具体的に検証します。
lsns で名前空間をリストアップする
このステップでは、lsns コマンドを使用してシステム上に存在する名前空間 (namespaces) をリストアップする方法を学びます。名前空間は、プロセス、ネットワークインターフェイス、マウントポイントなど、さまざまなシステムリソースの分離を提供する Linux の基本的な概念です。この分離は、コンテナなどの技術の鍵となります。
lsns コマンドは util-linux パッケージの一部で、システム上の名前空間に関する情報をリストアップするために使用されます。
まず、util-linux パッケージがインストールされていることを確認しましょう。通常はインストールされていますが、確認するのが良い習慣です。これには apt を使用できます。
まだ開いていない場合は、ターミナルを開きます。デスクトップの左側にある Xfce Terminal アイコンを見つけることができます。
次に、パッケージリストを更新するために、以下のコマンドを入力して Enter キーを押します。
sudo apt update
Enter キーを押すと、次のような出力が表示される場合があります。
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
...
次に、util-linux をインストールしましょう。以下のコマンドを入力して Enter キーを押します。
sudo apt install util-linux
パッケージがすでにインストールされていることを示す出力が表示される場合がありますが、問題ありません。インストールされる場合は、進行状況バーと確認メッセージが表示されます。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
util-linux is already the newest version (x.xx.x-xu).
0 upgraded, 0 newly installed, 0 to remove and xx not upgraded.
これで lsns が利用可能であることが確定しました。名前空間をリストアップするために使用しましょう。以下のコマンドを入力して Enter キーを押します。
lsns
次のような出力が表示され、さまざまなタイプの名前空間とそれに関連付けられたプロセスが示されます。
NS TYPE NPROCS PID PPID CMD
4026531835 cgroup 1 1 0 /sbin/init
4026531836 pid 1 1 0 /sbin/init
4026531837 user 1 1 0 /sbin/init
4026531838 uts 1 1 0 /sbin/init
4026531839 ipc 1 1 0 /sbin/init
4026531840 mnt 1 1 0 /sbin/init
4026531841 net 1 1 0 /sbin/init
4026532720 cgroup 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532721 pid 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532722 user 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532723 uts 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532724 ipc 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532725 mnt 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
4026532726 net 10 700 699 /usr/lib/xfce4/xfconf/xfconfd
...
出力には、NS (名前空間 ID)、TYPE (名前空間のタイプ、例:cgroup、pid、user、uts、ipc、mnt、net)、NPROCS (名前空間内のプロセス数)、PID (プロセス ID)、PPID (親プロセス ID)、CMD (コマンド) などの列が表示されます。
このコマンドにより、システム上でアクティブな名前空間とその中で実行されているプロセスの概要が得られます。
Continue をクリックして次のステップに進みます。
/proc/self/ns 内の名前空間リンクを確認する
前のステップでは、lsns を使用してシステム上の名前空間 (namespaces) のリストを確認しました。次に、実行中のプロセスがこれらの名前空間とどのように関連しているかを調べてみましょう。
Linux のすべてのプロセスには、/proc/<pid>/ns/ の下に特別なディレクトリがあり、そのプロセスが属する名前空間へのシンボリックリンクが含まれています。/proc/self/ ディレクトリは、現在実行中のプロセス (この場合はターミナルセッション) の /proc/<pid>/ ディレクトリへのシンボリックリンクです。
現在のターミナルプロセスの名前空間リンクを確認するために、/proc/self/ns/ ディレクトリの内容をリストアップしましょう。
ターミナルに以下のコマンドを入力して Enter キーを押します。
ls -l /proc/self/ns/
次のような出力が表示されます。
total 0
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 cgroup -> "cgroup:[4026532720]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 ipc -> "ipc:[4026532724]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 mnt -> "mnt:[4026532725]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 net -> "net:[4026532726]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 pid -> "pid:[4026532721]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 user -> "user:[4026532722]"
lrwxrwxrwx 1 labex labex 0 Jul 24 09:00 uts -> "uts:[4026532723]"
各行は異なるタイプの名前空間 (cgroup、ipc、mnt、net、pid、user、uts) を表し、カーネルの内部表現にある実際の名前空間ファイルを指すシンボリックリンク (->) です。角括弧内の数字 (例:[4026532720]) は、その特定の名前空間の一意の ID で、前のステップの lsns コマンドの出力で見たものです。
これにより、現在のターミナルプロセスがいくつかの異なる名前空間の一部であり、特定のシステムリソースに対して独自の分離されたビューを持っていることがわかります。
/proc/<pid>/ns/ を理解することは、実行中のプロセスの名前空間構成をデバッグおよび検査するために、特にコンテナ化された環境では重要です。
Continue をクリックして次に進みます。
ip netns でネットワーク名前空間を確認する
前のステップでは、一般的な名前空間 (namespaces) とプロセスの名前空間リンクの確認方法を学びました。今回は、ネットワーク名前空間 (network namespaces) に特化し、ip コマンドを使用してそれらを管理する方法を見ていきましょう。
ネットワーク名前空間は、ネットワークインターフェイス、IP アドレス、ルーティングテーブル、ファイアウォールルールなど、プロセスに対して個別のネットワークスタックを提供します。これは、コンテナや仮想ネットワークで使用されるようなネットワークトラフィックの分離に不可欠です。
ip コマンドは、Linux でのネットワーク構成に非常に強力なユーティリティです。ip netns サブコマンドは、ネットワーク名前空間の管理に特化しています。
現在構成されているネットワーク名前空間をリストアップするには、ip netns に list オプションを使用します。
ターミナルに以下のコマンドを入力して Enter キーを押します。
ip netns list
多くの場合コンテナである典型的な LabEx 環境では、最初はこのコマンドで明示的に作成されたネットワーク名前空間が何もリストされないことがあります。出力は空になるかもしれません。
これは、ターミナルが実行されている主なネットワーク名前空間がデフォルトのものであり、ip netns list は通常、明示的に作成されて登録された名前空間を表示するためです。
ただし、前のステップで行ったように、/proc/self/ns/net シンボリックリンクを調べることで、現在のプロセスが属するネットワーク名前空間を確認することができます。ip netns コマンドは、特定の分離目的で作成する可能性のある 名前付き ネットワーク名前空間を管理するためのものです。
この入門実験では新しいネットワーク名前空間を作成しませんが、ip netns list がそれらを確認するためのコマンドであることを理解することは、将来的なネットワーク分離の学習に重要です。
これで、lsns を使用して名前空間を調査し、/proc 内のプロセス固有の名前空間リンクを調べ、ネットワーク名前空間をリストアップするコマンドを学びました。
Continue をクリックして実験を完了します。
まとめ
この実験では、Linux でアクティブなカーネル名前空間 (kernel namespaces) を確認する方法を学びました。まず、lsns コマンドを使用してシステム上に存在する様々な名前空間をリストアップしました。名前空間はシステムリソースの分離を提供し、コンテナ技術の基礎となっていることを理解しました。また、lsns を含む util-linux パッケージが apt を使用してインストールされていることを確認しました。
lsns で名前空間をリストアップした後、提供された内容では完全に詳細が記載されていない次のステップでは、/proc/self/ns ディレクトリ内の名前空間リンクを確認し、ip netns コマンドを使用してネットワーク名前空間を具体的に検証することになります。これらの方法は、異なるタイプのカーネル名前空間の存在と状態を調査および確認するための代替手段を提供します。



