在循环设备上使用设备映射器精简配置

在循环设备上使用设备映射器精简配置

我有几个只读的 KVM 原始文件(大约 100GB)。

我将这些原始文件添加为环回设备。

然后,我创建一个快照文件以允许虚拟机对其磁盘进行读/写访问。这允许我插入修改、测试、擦除快照并重复。

我的 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 rawloop1formetaloop2for 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打印分区表时出现错误。其中一部分是我需要能够同时启动虚拟机的多个副本。

我使用的是 RHEL 6.7,内核为 2.6.32-573.7.1

我哪里错了?

答案1

发现问题。

1:精简池的数据备份卷需要与基本块设备大小相同或更大。数据支持卷 dd 创建命令应与我的原始快照具有相同的块大小和“$base_size”。

2:dmsetup create Thin_pool命令的表定义中的第二个数字应该是块设备的块数,通过以下代码获得:

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\"");

相关内容