UTS名前空間分離が機能しないのはなぜですか?

UTS名前空間分離が機能しないのはなぜですか?

1. 別の子 UTS 名前空間でシェルプロセスを開始します。

sudo unshare -f --mount-proc -u /bin/bash

2. このプロセスでホスト名を変更する

hostnamectl set-hostname newhostname

3. さまざまなシェルの変更の監視

$ hostname
newhostname

予想される結果

プロセスは、親名前空間に古いホスト名を保持します。

結果は

新しいUTS名前空間でホスト名を変更すると、親名前空間のホスト名も変更されます。


なぜこれが起こるのですか?私はUbuntu 20.04、カーネルバージョン5.10.23-xanmod1(uname -r)を使用しています。

ベストアンサー1

hostnamectl次はシステムsethostname(2)環境であり、システムコールを実行しません。それは尋ねたシステムソケットを通してこれを行います/run/dbus/system_bus_socket。 〜のようにシステム名前空間を変更せずに初期名前空間でこれを実行し、古いUTS名前空間の名前(実行時の初期名)を指定された新しい名前に変更し、新しいUTS名前空間の名前を変更しないでください(OPの宣言に似ています)。反対):古いホスト名。ファイルの/etc/hostname変更などの他の副作用もあります。

これはを使用して確認できますstrace。その中には何もありませんが、sethostname(2)目立つシステム関連の要素があります。

newfstatat(AT_FDCWD, "/run/systemd/system/", {st_mode=S_IFDIR|0755, st_size=40, ...}, AT_SYMLINK_NOFOLLOW) = 0

上記の呼び出しが成功しない場合(unshare -f -u -m /bin/bashaを使用してすべてオーバーライドする)、次のような結果が得られます。/runmount -t tmpfs tmpfs /run

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

ダイアログボックスは後で次のように開いたソケットで完了します。

connect(3, {sa_family=AF_UNIX, sun_path="/run/dbus/system_bus_socket"}, 30) = 0

hostnameこの環境では、読み取りに低レベルの「レガシー」コマンドを使用する必要があります。またはホスト名を変更してください。システムコールを直接呼び出しますsethostname(2)。新しいUTS名前空間の名前を変更し、古い(初期)UTS名前空間を変更しないでください。

hostname newhostname

新しいUTS名前空間に影響を与えるには、hostnamectl(LXCを使用して開始されたコンテナ全体と同様に)1つ以上のunshareコマンド、つまりまったく新しいUTSインスタンスが必要です。システムエコシステムは新しい環境に存在する必要があります。これには、複数の追加の名前空間と多くの追加の定型句をインポートまたは共有解除する必要があります。

おすすめ記事