Ubuntuで名前空間をマウントしようとしています。これまでは、次のように空のインストール名前空間を作成できます。
# mkdir test
# unshare --mount
# mount none test -t tmpfs
# cd test
# pivot_root . .
# cd / <--- test becomes /
LXC
Ubuntuコンテナを確認すると、mount
コマンドに次のように表示されます。
マウントネームスペースは最初にマウントポイントのコピーを取得するため、/dev/sda1
コンテナの内部はグローバルであると仮定します(/dev/sda1
コンテナの起動後に内部がないため)、コンテナの内部にあるものはルートファイルシステムに対応します。 LXCに精通している人がコンテナに入る前にLXCが実行するインストール作業を説明できますか?/dev/sda1
/
pivot_root
答え1
LXCが実際に何をしているのかを見るために、新しいコンテナを作成して次のように起動プロセスを追跡しましょうstrace(1)
。
[root@localhost /]# lxc-create -n testcontainer -t debian
[root@localhost /]# strace -e trace=clone,chdir,mount,pivot_root,execve \
-f -o lxclog \
lxc-start -n testcontainer
結果トレースが記録されます。ルックログファイル内の最も関連性の高い部分は次のとおりです(重要でないいくつかの呼び出しを省略して楕円を追加しました)。
14671 clone(child_stack=0x7fff9379eb80, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWNET|SIGCHLD) = 14677
<...>
14677 mount("/var/lib/lxc/testcontainer/rootfs", "/usr/lib64/lxc/rootfs", 0x7fe4c2d10eac, MS_BIND|MS_REC, NULL) = 0
<...>
14677 chdir("/usr/lib64/lxc/rootfs") = 0
14677 pivot_root(".", "/usr/lib64/lxc/rootfs/lxc_putold") = 0
14677 chdir("/")
<...>
14677 execve("/sbin/init", ["/sbin/init"], [/* 1 var */]) = 0
lxc-start
まず、(PID 14671)(PID 14677)を使用して新しいプロセスを作成し、clone(2)
それを新しいインストール名前空間(CLONE_NEWNS
フラグ)に配置します。次に、この新しいマウントネームスペース内のコンテナのルートファイルシステム(/var/lib/lxc/testcontainer/rootfs)はインストール(MS_BIND
フラグ)にバインドされています。/usr/lib64/lxc/rootfs、新しいルートになります。最後に、コンテナの初期化が完了すると、プロセス14677はコンテナのinit
。
ここで重要なのは、コンテナのマウントネームスペースのルートディレクトリがそのディレクトリのバインドマウントであることです。ホストに属するルートFS。そのため、コンテナのルートマウントは依然として/dev/sda1出力のソースとしてmount(8)
。ただし、表示されていない違いがありますmount(8)
。これを確認するには、findmnt(8)
コンテナ内で次のことを試してください。
root@testcontainer:~# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1[/var/lib/lxc/testcontainer/rootfs]
findmnt(8)
これをホストシステムの出力と比較します。
[root@localhost /]# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1
ご注意ください、源泉同じですが、コンテナ内にはバインドマウントされたソースディレクトリも表示できます。