うまくいけば、タイトルの質問が理にかなっています。Linuxコンテナーで実行されている、ホストオペレーティングシステムのオーバーヘッドの低い(したがって仮想マシンがない)コピーを作成したいと考えています。
どういうわけかzfsを使用してホストrootfsのスナップショットを作成し、それをどういうわけかlxcにフィードすることを考えています。このようにして、コンテナー内の変更はZFSのコピーオンライト機能を介してコンテナーに制限され、ホストrootfsへの将来の変更はコンテナーに伝播されません。
再帰的なディレクトリが大混乱を引き起こしているなど、考慮しなければならない潜在的な問題はありますか?
これは、ホストをテンプレートとしてすばやく使用して、たとえば、ホストに影響を与えることを心配せずにrootfsを汚染する新しいビルドツールをインストールし、ホストをコピーするために多くのドライブスペースを浪費する必要がないようにするためです。 rootfs。また、ホストを好きなようにセットアップするのにかなりの時間を費やし、プロセスのテンプレートを作成するのに数日を費やす必要はありません(必要な場合でも、すべて書き留めておくことをお勧めします)。 、それを自動化することはさらに良いです)。これはLinuxコンテナー内にあるため、一度に複数のインスタンスを実行できます。
私はこれを達成できる手動の手順を起草しました。
これらの手順では、次のことを前提としています。
/bin/bash
です。rpool
、LXDコンテナーも同じZFSプールに配置する必要があります(rpool
)。rpool/ROOT/os
ZFSデータセットにインストールされます。rpool/ROOT/os@20180516T091126CDT
。lxc storage
という名前のrpool
使用してzfs
ソースにドライバをrpool/lxd
。demo
ます。上記の要件から逸脱するたびに、手順を微調整する必要があります。
ホストオペレーティングシステムに類似したイメージを使用してLXCコンテナーを作成します。
root@node51 [~]# lxc launch images:ubuntu/18.04 demo -s rpool
Creating demo
Starting demo
コンテナを停止します。
root@node51 [~]# lxc stop demo
LXCストレージボリュームをマウントして、そこからメタデータをフェッチできるようにします。
root@node51 [~]# zfs mount rpool/lxd/containers/demo
メタデータをどこかにコピーします(のように/tmp/demo/
):
root@node51 [~]# rsync -avHXShPs --exclude rootfs/ /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ /tmp/demo/
sending incremental file list
created directory /tmp/demo
./
backup.yaml
2.05K 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6)
metadata.yaml
529 100% 516.60kB/s 0:00:00 (xfr#2, to-chk=3/6)
templates/
templates/hostname.tpl
21 100% 20.51kB/s 0:00:00 (xfr#3, to-chk=1/6)
templates/hosts.tpl
140 100% 136.72kB/s 0:00:00 (xfr#4, to-chk=0/6)
sent 3.12K bytes received 135 bytes 6.50K bytes/sec
total size is 2.74K speedup is 0.84
LXCが作成したZFSデータセットを削除します。
root@node51 [~]# zfs destroy rpool/lxd/containers/demo
ZFSデータセットをLXCが期待するのと同じ名前に複製します。
root@node51 [~]# zfs clone rpool/ROOT/os@20180516T091126CDT rpool/lxd/containers/demo
マウントポイントを元のマウントポイントに設定します。
root@node51 [~]# zfs set mountpoint=/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo rpool/lxd/containers/demo
新しいコンテナデータ用のrootfsディレクトリを作成します。
root@node51 [~]# mkdir -v /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/
mkdir: created directory '/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/'
シェルのグロブ機能を拡張して、次mv
のファイルシステムデータがすべて取得されるようにします。
root@node51 [~]# shopt -s extglob ; shopt -s dotglob
cd
コンテナのデータセットにアクセスして、今後のコマンドを少し短くします。
root@node51 [~]# cd /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]#
すべてのコンテナのデータをrootfs/
フォルダに移動します。
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv !(rootfs) rootfs/
コンテナの起動に必要ないくつかのフォルダを作成します。
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mkdir rootfs/{dev,sys,proc}
以前からバックアップしたメタデータをコンテナのデータセットに移動します。
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv /tmp/demo/* .
メタデータバックアップから空の一時ディレクトリを削除します。
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# rm -rfv /tmp/demo
removed directory '/tmp/demo'
コンテナのデータセットをアンマウントできるように、前のディレクトリに戻ります。
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# cd -
/root
コンテナのデータセットをアンマウントして、LXCが引き継ぐことができるようにします。
root@node51 [~]# zfs umount rpool/lxd/containers/demo
次回の起動時にコンテナのファイルを非特権に変換するようにLXCに指示するには、次のコマンドを実行します。
lxc config edit demo
と読む行を変更します
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
に
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":0,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":0,"Nsid":0,"Maprange":1000000000}]'
コンテナを起動します。
コンテナのrootfs内のすべてのファイルが非特権に変換されるため、これにはしばらく時間がかかります。進行状況インジケーターはありません。
root@node51 [~]# lxc start demo
コンテナを入力してください:
root@node51 [~]# lxc exec demo -- bash
ここから、ネットワーク、systemdの起動シーケンス、および/またはホストのこのLXCコンテナークローンを起動して実行するために必要なその他のことを構成できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加