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

hak8or

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

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

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

なぜ

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

Deltik

私はこれを達成できる手動の手順を起草しました。

前提条件

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

  • あなたのシェルは/bin/bashです。
  • あなたはルートです。
  • オペレーティングシステムをZFSプールにデプロイしrpool、LXDコンテナーも同じZFSプールに配置する必要があります(rpool)。
  • ホストrootfsがrpool/ROOT/osZFSデータセットにインストールされます
  • ホストrootfsのスナップショットを取り、それを呼び出しましたrpool/ROOT/os@20180516T091126CDT
  • LXDSnappyパッケージを実行しています
  • あなたはしているlxc storageという名前のrpool使用して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. 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]#
    
  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":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}]'
    
  18. コンテナを起動します。
    コンテナのrootfs内のすべてのファイルが非特権に変換されるため、これにはしばらく時間がかかります。進行状況インジケーターはありません。

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

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

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ