LXCコンテナーのクローンを作成するメソッドの作成

少しの背景


昨年末、卒業証書を書き始める時が来たときユーザーam83 から記事に 出会いました 。 私は仮想化に非常に熱心なので、このトピックに関連する何かを思いつきました。 そして、一般的なファイルシステムを使用して、LXCコンテナのクローンを作成するときにディスク容量を節約する方法を作成することを考えました。



そこで、am83によって書かれた記事に基づいて、共通のファイルシステムを作成するためにいくつかの手順を実行しました。
コンテナ用のファイルシステムフレームワークの作成


次のコマンドを使用して、共通ファイルシステムの作成に必要な基本コンポーネントをインストールします。

$ apt-get install debootstrap lxc lxc-templates lxctl cgroup-lite rsync
      
      





次に、2つの制御オプションを有効にします。

ネットワーク構成で、コンテナのネットワークブリッジを有効にします。

 $ nano /etc/init/lxc-net.conf USE_LXC_BRIDGE="true"
      
      





また、システム起動時の自動実行コンテナの場合、次を有効にします。

 LXC_AUTO="true"
      
      





次のコマンドを使用して、lxc.confファイルで:

 $ nano /etc/init/lxc.conf
      
      





次に、構成ファイルを編集します。

 $ nano /etc/default/lxc
      
      





そして、次の行を追加します。

変数を紹介します:

 $ lxcRoot="/lxc"
      
      





/ lxcディレクトリを作成します。

 $ mkdir -p ${lxcRoot}
      
      





コンテナとその設定に関する情報を保存する場所と、配布データをキャッシュして多くのコンテナの作成を高速化する場所を作成します。

 $ mkdir /${lxcRoot}/lxclib /${lxcRoot}/lxccache
      
      





古いディレクトリを削除します。

 $ rm -rf /var/lib/lxc /var/cache/lxc
      
      





ディレクトリへのリンクを作成します。

 $ ln -s /${lxcRoot}/lxclib /var/lib/lxc $ ln -s /${lxcRoot}/lxccache /var/cache/lxc
      
      





hNameという名前とTrustyバージョンを持つ基本的なUbuntuベースのLXCコンテナーを作成します。

 $ lxc-create -t ubuntu -n hName -r trusty
      
      





次に、LXCコンテナの不変部分の作成を始めましょう。

作成されたコンテナのディレクトリに移動します。

 $ cd /lxc/lxclib/hName/rootfs
      
      





その中で、共通部分を持つディレクトリを作成し、それを共通と呼びます:

 $ mkdir common
      
      





不変のディレクトリを転送します:

 $ mv bin lib lib64 sbin usr common/
      
      





それらへのシンボリックリンクを作成します。

 $ ln -s common/bin $ ln -s common/sbin $ ln -s common/lib $ ln -s common/lib64 $ ln -s common/usr
      
      





LXCコンテナーの作成


システムの基本イメージを準備した後、システム内の最初のコンテナーの作成に直接進みます。 単に「Node1」と呼びます。

最初のコンテナのディレクトリを作成します。

 $ mkdir -p /lxc/lxclib/Node1/rootfs
      
      





それに行きます:

 $ cd /lxc/lxclib/Node1/rootfs
      
      





rsyncプログラムを使用して、不変部分を最初のコンテナーにコピーします。

 $ rsync --exclude=/dev/* --exclude=/common/* -avz /lxc/lxclib/hName/rootfs/* ./
      
      





次に、最初のコンテナに対して、共通部分とデバイス用の2つのディレクトリを作成します。

 $ mkdir /lxc/lxclib/Node1/rootfs/common $ mkdir /lxc/lxclib/Node1/rootfs/dev
      
      





バインドプログラムを使用してそれらをマウントします。

 $ mount --bind /lxc/lxclib/hName/rootfs/dev /lxc/lxclib/Node1/rootfs/dev $ mount --bind /lxc/lxclib/hName/rootfs/common /lxc/lxclib/Node1/rootfs/common $ mount -o remount,ro /lxc/lxclib/Node1/rootfs/common
      
      





構成ファイルとfstabファイルをベースコンテナーから最初のコンテナーにコピーします。

 $ cp /lxc/lxclib/hName/config /lxc/lxclib/Node1/ $ cp /lxc/lxclib/hName/fstab /lxc/lxclib/Node1/
      
      





最初のコンテナーの構成で名前をNode1に変更し、MACアドレスも変更します。

 $ nano /lxc/lxclib/Node1/config
      
      







クローニング方法



私が書いたスクリプトは次のとおりです。

 #!/bin/bash echo "   : " read Container cp -a /lxc/lxclib/Node1 /lxc/lxclib/${Container} mount --bind /lxc/lxclib/hName/rootfs/dev /lxc/lxclib/${Container}/rootfs/dev mount --bind /lxc/lxclib/hName/rootfs/common /lxc/lxclib/${Container}/rootfs/common mount -o remount,ro /lxc/lxclib/${Container}/rootfs/common sed -i 's/Node1/'$Container'/g' /lxc/lxclib/${Container}/config echo "   " $Container ""
      
      







標準lxc-cloneメソッドとの比較特性



これにより何が得られますか?

まず、ディスク容量を節約したかった。

ディスク上のコンテナが占有しているサイズを確認します。

 $ du –skh /lxc/lxclib/_
      
      





この図は、ベースコンテナが占有するボリュームが395メガバイトであるのに対し、私の方法でクローン化されたコンテナが占有するボリュームは141メガバイトであることを示しています。











上記のデータに基づいて、各コンテナのディスク容量を節約すると、約65%が残ります。 つまり、たとえば数百のコンテナがあるサーバーファームでこの方法を適用すると、ディスクスペースの節約が非常に顕著になります。



第二に、あまり印象的ではありませんが、それでもコンテナをコピーする速度です。

標準のクローン作成方法は、次のコマンドによって実行されます。

timeコマンドでクローン作成速度を測定します。

時間-実行コマンドの実行時間(秒単位)を表示します。 実行されたコマンドを置き換えます。

これらの図は、コンテナと私のクローンを作成する標準的な方法でのコマンドの実行時間を示しています。











上記のデータに基づいて、標準的な方法でのコンテナのクローン作成時間は12秒以上かかりますが、私のメソッドのクローン作成時間は約6秒かかります。



最後に



おそらく私のアイデアを企業の実稼働環境で使用すべきではありませんが、ミニコンピューターでこの方法を使用することを考えています。 確かに、SDカードで複数のコンテナを調達し、1つのコンテナから数百メガバイトを節約することは大きな利益になります。



All Articles