この記事は、名前空間に関する以前の記事、最もよく使用されている7つのLinux名前空間、および名前空間、マウント名前空間、PID名前空間を使用した手動でのLinuxコンテナの構築に関するシリーズに基づいています。この記事では、UTS名前空間とそのコンテナーとの関係について説明します。
カジュアルなオブザーバーは、Unixタイムシェアリングシステム(UTS)の名前空間を誤解することがよくあります。これは、その名前が目的と一致しなくなったことが主な理由です。その名前にもかかわらず、UTS名前空間は実際にはホスト名とNISドメインを制御します。マンページでUTS名前付けを説明する方法は次のとおりです。
これらの識別子は、
sethostname(2)
を使用して設定されます およびsetdomainname(2)
、uname(2)
を使用して取得できます 、gethostname(2)
、およびgetdomainname(2)
。これらの識別子に加えられた変更は、同じUTS名前空間内の他のすべてのプロセスには表示されますが、他のUTS名前空間内のプロセスには表示されません。
これは、一部の最新のツール(systemdなど)が期待する変更を引き起こさない可能性があることを意味します。
ご想像のとおり、プロセスに異なるホスト名を持たせたい場合は、いくつかのユースケースがあります。たとえば、Webサーバーは、ホスト名が提供しているSSL証明書と一致しない場合に警告をスローする傾向があります。一方、一部のプロセスでは、ホスト名をネットワークプロセスにアタッチする場合があります。ホスト名が正しくないと、接続の失敗や拒否、またはその他の無数の問題が発生する可能性があります。
それでは、いくつかの例を見てみましょう。
UTS名前空間を探索する
UTS名前空間は次のコマンドで呼び出すことができます:
$ unshare --uts /bin/bash
ただし、新しい名前空間に入ると、 hostnamectl set-hostname
を使用していることに気付くかもしれません。 新しい名前空間のホスト名は変更されません。
# unshare --uts
# hostname
bastion.stratus.lab
# hostnamectl set-hostname tux
# hostname
bastion.stratus.lab
ただし、新しいシェルを開くと、ホスト名が実際に変更されています。
[user@host ~]$ ssh root@bastion
Last login: Tue Dec 7 08:17:48 2021 from 192.168.99.198
[root@tux ~]# hostname
tux
どうしてこれなの? Systemdはsethostname
を実行しません システムコール。代わりに、systemdはソケットに接続してタスクを完了します。ソケットは古い名前空間に関連付けられているため、古い名前空間のホスト名は調整されますが、新しい名前空間は調整されません。
ルート名前空間の使用
私のマウント名前空間の記事では、次のように書いています:
新しい名前空間内にいるので、ホストからの元のマウントポイントが表示されない可能性があります。ただし、そうではありません。この理由は、systemdがデフォルトで、すべての新しい名前空間とマウントポイントを再帰的に共有するためです。
たまたま、systemdはその情報の多くを / run
から取得しています。 、ここで作成した名前空間に共有されます。
名前空間のマウントの記事で、 tmpfs
をマウントします 古い名前空間と共有したくないディレクトリの新しい名前空間に移動します。
次のオプションを使用して新しい名前空間をマウントすることで、ほとんどのsystemd呼び出しを無効にできます。
$ unshare --mount --uts /bin/bash
次に、 / run
を再マウントします :
$ mount -t tmpfs tmpfs /run
プロセス全体は次のようになります:
# unshare --fork --mount --uts /bin/bash
# mount -t tmpfs tmpfs /run
# hostnamectl set-hostname bastion.stratus.lab
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
# hostname tux
# hostname
tux
ボックスに新しいシェルを開くことでこれを確認できます:
[user@host ~]$ ssh root@bastion
Last login: Tue Dec 7 08:33:04 2021 from 192.168.99.198
[root@bastion ~]# hostname
bastion.stratus.lab
lsns
を使用して、適切な名前空間を見つけることができます コマンド:
[root@bastion ~]# lsns |grep uts
4026531838 uts 133 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532479 mnt 2 11507 root unshare --fork --mount --uts /bin/bash
4026532480 uts 2 11507 root unshare --fork --mount --uts /bin/bash
次に、 nsenter
を使用して名前空間を入力できます コマンド:
[root@bastion ~]# nsenter -t 11507 -a
[root@tux /]#
ユーザー名前空間の使用
ユーザー名前空間の記事で、非特権ユーザーとして名前空間を作成する際の追加の考慮事項について説明します。
新しいユーザー名前空間を作成すると、現在のユーザーはユーザー nobodyにマップされます 。これは、デフォルトでは、ユーザーIDマッピングが行われていないためです。マッピングが定義されていない場合、名前空間は単にシステムのルールを使用して、未定義のユーザーを処理する方法を決定します。
ユーザーマッピングの詳細については、その記事に戻って参照してください。この場合、ルートが必要です ユーザーは自動的にマッピングされます。このようにして、新しい名前空間に「ルート」があります。 (ここでも、名前空間と権限の説明については、ユーザーの名前空間の記事を参照してください。)
組み合わせたレッスンをCentOSStream9ホストで実践すると、次のことがわかります。
ocp@bastion ~ $ unshare --map-root-user --user --mount --uts --fork /bin/bash
root@bastion ~ $ hostnamectl set-hostname tux
Could not set static hostname: Interactive authentication required.
これは、 polkit
の方法によるものです RHELファミリーのディストリビューションで構成されています。他のディストリビューションは必ずしもこのエラーをスローしません。 Arch Linux(特別な polkit
なし 構成)、たとえば、コンテナがホスト名を変更できるようにします。したがって、ディストリビューションに関係なく、 / run
を再マウントすることをお勧めします。 。
lsns
の出力に注意することが重要です -fork
を使用すると読みやすくなる場合があります 名前空間を作成するとき。
がない場合の外観は次のとおりです。 -フォークコード> フラグ:
[root@bastion ~]# lsns |grep uts
4026531838 uts 135 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532414 uts 1 11962 ocp /bin/bash
そして -フォークコード> フラグ:
[root@bastion ~]# lsns |grep uts
4026531838 uts 134 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532412 user 2 11939 ocp unshare --map-root-user --user --mount --uts --fork /bin/bash
-fork
このシナリオでは厳密には必要ありません。新しいPID名前空間が必要な場合に役立つか、必要になることもあります(詳細については、私のPID名前空間の記事を参照してください)。
まとめ
UTS名前空間は、最も複雑なLinux名前空間ではありません。ただし、特にコンテナのコンテキストでは非常に便利です。
UTS名前空間を最大限に活用するには、少なくとも、ルート名前空間を使用する場合はマウント名前空間と組み合わせ、非特権ユーザーから生成する場合はマウント名前空間とユーザー名前空間を組み合わせます。
[中間のLinuxチートシートをダウンロードして、重要なコマンドをすぐに利用できるようにします。 ]
次の記事では、ネット名前空間と、それを使用して名前空間に独自のIPとポートスペースを持たせる方法について説明します。