少しの背景
昨年末、卒業証書を書き始める時が来たとき、ユーザーam83 からの記事に 出会いました 。 私は仮想化に非常に熱心なので、このトピックに関連する何かを思いつきました。 そして、一般的なファイルシステムを使用して、LXCコンテナのクローンを作成するときにディスク容量を節約する方法を作成することを考えました。
そこで、am83によって書かれた記事に基づいて、共通のファイルシステムを作成するためにいくつかの手順を実行しました。
次のコマンドを使用して、共通ファイルシステムの作成に必要な基本コンポーネントをインストールします。
次に、2つの制御オプションを有効にします。
ネットワーク構成で、コンテナのネットワークブリッジを有効にします。
また、システム起動時の自動実行コンテナの場合、次を有効にします。
次のコマンドを使用して、lxc.confファイルで:
次に、構成ファイルを編集します。
そして、次の行を追加します。
変数を紹介します:
/ lxcディレクトリを作成します。
コンテナとその設定に関する情報を保存する場所と、配布データをキャッシュして多くのコンテナの作成を高速化する場所を作成します。
古いディレクトリを削除します。
ディレクトリへのリンクを作成します。
hNameという名前とTrustyバージョンを持つ基本的なUbuntuベースのLXCコンテナーを作成します。
次に、LXCコンテナの不変部分の作成を始めましょう。
作成されたコンテナのディレクトリに移動します。
その中で、共通部分を持つディレクトリを作成し、それを共通と呼びます:
不変のディレクトリを転送します:
それらへのシンボリックリンクを作成します。
システムの基本イメージを準備した後、システム内の最初のコンテナーの作成に直接進みます。 単に「Node1」と呼びます。
最初のコンテナのディレクトリを作成します。
それに行きます:
rsyncプログラムを使用して、不変部分を最初のコンテナーにコピーします。
次に、最初のコンテナに対して、共通部分とデバイス用の2つのディレクトリを作成します。
バインドプログラムを使用してそれらをマウントします。
構成ファイルとfstabファイルをベースコンテナーから最初のコンテナーにコピーします。
最初のコンテナーの構成で名前をNode1に変更し、MACアドレスも変更します。
コンテナ用のファイルシステムフレームワークの作成
次のコマンドを使用して、共通ファイルシステムの作成に必要な基本コンポーネントをインストールします。
$ 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つのコンテナから数百メガバイトを節約することは大きな利益になります。