うまくいけば、タイトルの質問が理にかなっています。 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
ingすることで、今後のコマンドを少し短くします。
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":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
に
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1,"Nsid":0,"Maprange":1000000000}]'
コンテナを起動します。
コンテナのrootfs内のすべてのファイルが非特権に変換されているため、これにはしばらく時間がかかります。進行状況インジケーターはありません。
root@node51 [~]# lxc start demo
コンテナを入力してください:
root@node51 [~]# lxc exec demo -- bash
ここから、ネットワーク、systemdの起動シーケンス、および/またはホストのこのLXCコンテナークローンを起動して実行するために必要なその他のことを構成できます。