ループデバイスでデバイスマッパーシンプロビジョニングを使用する

ループデバイスでデバイスマッパーシンプロビジョニングを使用する

読み取り専用KVM生ファイル(約100 GB)が複数あります。

これらのrawファイルをループバックデバイスとして追加しました。

次に、仮想マシンがそのディスクへの読み取り/書き込みアクセスを許可するようにスナップショットファイルを作成します。これにより、修正を挿入、テスト、スナップショットを消去、繰り返すことができます。

私のPerlスクリプトの断片:

$base_file = "/images/vmbase.raw";
$base_stats = stat($base_file);
$base_blocks = $base_stats->size / 512;
$base_size = floor($base_stats->size / 10**6);
system("dd if=/dev/zero of=/dev/shm/vmbase.snap count=1 bs=1M seek=$base_size");
$baseloop='losetup -f --show /images/vmbase.raw --read-only';
$snaploop='losetup -f --show /dev/shm/vmbase.snap';
system("dmsetup create vmdrive --table "0  snapshot $baseloop");`

これにより、というデバイスが作成され、/dev/mapper/vmdrive自分の仮想マシンに接続されます。 parted を使用して、/dev/mapper/vmdrive使用可能なパーティションを確認できます。今すぐシンプロビジョニングに切り替えて、パフォーマンスが向上することを確認することをお勧めします。

私が試したことは次のとおりです(「レシピ」を使用)。https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt)

まず、ループを使用していくつかのブロックデバイスを作成します。

元: 2GB

スナップショット:24GB

dd if=/dev/zero of=/dev/shm/vmbase.meta bs=4096 count=524288
dd if=/dev/zero of=/snaps/vmbase.snap bs=4096 count=5859385
losetup -f /images/vmbase.raw --read-only
losetup -f /dev/shm/vmbase.meta
losetup -f /snaps/vmbase.snap`

その後、プールデバイスを作成します。 (loop0for rawloop1for、metaおよびloop2for仮定snap)1MBブロックサイズと2GBを低い空き領域しきい値として使用します。

$ dmsetup create vmbase-pool \
      --table "0 20971520 thin-pool /dev/loop1 /dev/loop0 2048 2048

次に、外部ブロックデバイスのスナップショットを作成します(マイソースファイル)

$ dmsetup message /dev/mapper/vmbase-pool 0 "create_thin 0"
$ dmsnap create vmsnap \
      --table "0 20971520 thin /dev/mapper/vmbase-pool 0 /dev/loop0"

その後、/dev/mapper/vmsnapデバイスを仮想マシンに接続しましたが、起動しませんでした。 partedを使用してパーティションテーブルを印刷するとエラーが発生します。その1つは、仮想マシンの複数のコピーを同時に起動できる必要があることです。

RHEL 6.7を使用しており、カーネルは2.6.32-573.7.1です。

私はどこで間違っていますか?

ベストアンサー1

問題が発見されました。

1:仮想プールのデータバックアップボリュームは、基本ブロックデバイスのサイズと同じかそれ以上でなければなりません。データバックアップボリュームdd createコマンドは、元のスナップショットと同じブロックサイズと「$ base_size」を持つ必要があります。

2:dmsetup create Thin_poolコマンドのテーブル定義の2番目の数字は、次のコードで取得したブロックデバイスのブロック番号でなければなりません。

my $base_stats = stat($base_file);
my $base_blocks = $base_stats->size / 512;

仮想プールを生成する最終コマンドは次のとおりです。

system("dmsetup create vm-pool\
   --table \"0 $base_blocks thin-pool $meta_lodev $snap_lodev 2048 2048\"");

おすすめ記事