web-dev-qa-db-ja.com

おそらくzfsを使用して、ホストのルートファイルシステムを継承するLinuxコンテナを作成するにはどうすればよいですか?

うまくいけば、タイトルの質問が理にかなっています。 Linuxコンテナーで実行されている、ホストオペレーティングシステムのオーバーヘッドの低い(したがって仮想マシンがない)コピーを作成したいと考えています。

どういうわけかzfsを使用してホストrootfsのスナップショットを作成し、それをどういうわけかlxcにフィードすることを考えています。このようにして、コンテナー内の変更はZFSのコピーオンライト機能を介してコンテナーに制限され、ホストrootfsへの将来の変更はコンテナーに伝播されません。

再帰的なディレクトリが大混乱を引き起こしているなど、考慮しなければならない潜在的な問題はありますか?

なぜ

これは、ホストをテンプレートとしてすばやく使用して、たとえば、ホストに影響を与えることを心配せずにrootfsを汚染する新しいビルドツールをインストールし、ホストをコピーするために多くのドライブスペースを浪費する必要がないようにするためです。 rootfs。また、私はホストを好きなようにセットアップするのにかなりの時間を費やし、プロセスのテンプレートを作成するのに数日を費やす必要はありません(必要な場合でも、すべて書き留めておくことをお勧めします)。 、それを自動化することはさらに良いです)。これはLinuxコンテナにあるので、一度に複数のインスタンスを実行できます。

4
hak8or

これを実現できる手動手順を作成しました。

前提条件

これらの手順では、次のことを前提としています。

  • あなたのシェルは/bin/bashです。
  • あなたはルートです。
  • オペレーティングシステムをZFSプールrpoolにデプロイし、LXDコンテナーも同じZFSプール(rpool)に配置する必要があります。
  • ホストrootfsはrpool/ROOT/osZFSデータセットにインストールされます。
  • ホストrootfsのスナップショットを取り、それをrpool/ROOT/os@20180516T091126CDTと呼びました。
  • LXDの Snappy パッケージを実行しています。
  • ソースlxc storagerpoolドライバーを使用して、zfsという名前のrpool/lxdがあります。
  • demoという非特権コンテナを作成するとします。

上記の要件から逸脱するたびに、手順を微調整する必要があります。

指示

  1. ホストオペレーティングシステムに類似したイメージを使用してLXCコンテナーを作成します。

    root@node51 [~]# lxc launch images:ubuntu/18.04 demo -s rpool
    Creating demo
    Starting demo
    
  2. コンテナを停止します。

    root@node51 [~]# lxc stop demo
    
  3. LXCストレージボリュームをマウントして、そこからメタデータをフェッチできるようにします。

    root@node51 [~]# zfs mount rpool/lxd/containers/demo
    
  4. メタデータをどこかにコピーします(/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
    
  5. LXCが作成したZFSデータセットを削除します。

    root@node51 [~]# zfs destroy rpool/lxd/containers/demo
    
  6. ZFSデータセットをLXCが期待するのと同じ名前に複製します。

    root@node51 [~]# zfs clone rpool/ROOT/os@20180516T091126CDT rpool/lxd/containers/demo
    
  7. マウントポイントを元のマウントポイントに設定します。

    root@node51 [~]# zfs set mountpoint=/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo rpool/lxd/containers/demo
    
  8. 新しいコンテナデータ用の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/'
    
  9. シェルのグロブ機能を拡張します 次のmvがすべてのファイルシステムデータを確実に取得するようにします。

    root@node51 [~]# shopt -s extglob ; shopt -s dotglob
    
  10. コンテナのデータセットにcdingすることで、今後のコマンドを少し短くします。

    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]#
    
  11. すべてのコンテナのデータをrootfs/フォルダに移動します。

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv !(rootfs) rootfs/
    
  12. コンテナの起動に必要ないくつかのフォルダを作成します。

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mkdir rootfs/{dev,sys,proc}
    
  13. 以前からバックアップしたメタデータをコンテナのデータセットに移動します。

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv /tmp/demo/* .
    
  14. メタデータバックアップから空の一時ディレクトリを削除します。

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# rm -rfv /tmp/demo
    removed directory '/tmp/demo'
    
  15. コンテナのデータセットをアンマウントできるように、前のディレクトリに戻ります。

    root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# cd -
    /root
    
  16. コンテナのデータセットをアンマウントして、LXCが引き継ぐことができるようにします。

    root@node51 [~]# zfs umount rpool/lxd/containers/demo
    
  17. 次回の起動時にコンテナのファイルを非特権に変換するように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}]'
    
  18. コンテナを起動します。
    コンテナのrootfs内のすべてのファイルが非特権に変換されているため、これにはしばらく時間がかかります。進行状況インジケーターはありません。

    root@node51 [~]# lxc start demo
    
  19. コンテナを入力してください:

    root@node51 [~]# lxc exec demo -- bash
    

    ここから、ネットワーク、systemdの起動シーケンス、および/またはホストのこのLXCコンテナークローンを起動して実行するために必要なその他のことを構成できます。

3
Deltik