LVM - удивительно полезный инструмент, однако, похоже, ему все еще не хватает поддержки для создания снимков диска, который уже является снимком. Я сделал сценарий для автоматической обработки, но столкнулся с некоторыми проблемами.
Тестирую скрипт на чистом Xen-боксе (с этого момента:тестовый ящик). После создания ящика я создал новый том LVM и добавил его в тестовый ящикдиски. В тестовый ящик сам по себе он отображается как обычное блочное устройство, поэтому я не думаю, что LVM Dom0 должен мешать процессу тестирования.
На тестовый ящик, я создал новый раздел, используя следующие команды:
# Using the data in the other tables i determined
# where i could begin my new device sectors
dmsetup table
# Create the new device without a table
dmsetup create base --notable
# Put the table into the device...
echo '0 4194304 linear 202:2 0' | dmsetup load base
dmsetup resume base
mkfs.ext2 /dev/mapper/base
Чтобы было ясно, второй целевой аргумент '202: 2' - это второе устройство, которое я добавил к машине с тестовыми окнами, я дважды проверил его следующим образом:
ls /dev -l | grep 'xvda2'
Возвращение:
brw-rw ---- 1 корневой диск 202, 2 мая 3 17:01 xvda2
Я написал эту функцию, чтобы сделать снимок:
function create_dm_snapshot {
banner "0: Checking if block devices don't allready exist, original device should exist...";
device_exists $base_path$original;
[ $? -eq 0 ] || error 'The source (original) device should exist';
device_exists $base_path$snapshot_origin $base_path$snapshot $base_path$cow;
[ $? -eq 0 ] && error "They allready exist pls use the 'remove' function";
echo "Done checking.";
banner "1: Suspending the original device.";
suspend_dev $original || error "Failed suspending original device";
banner "2: Creating snapshot-origin.";
create_dev $snapshot_origin || error "Failed creating snapshot-origin";
banner "3: Read original table into snapshot-origin.";
dmsetup table $original | dmsetup load $snapshot_origin ||
error 'Failed loading original table into snapshot-origin';
echo "Done reading.";
banner "4: Resume snapshot-origin.";
resume_dev $snapshot_origin || error 'Could not resume snapshot-origin';
banner "5: Create snapshot device.";
create_dev $snapshot || error 'Failed to create snapshot device';
banner "6: Create COW-device.";
#TODO: check total sector count device
create_dev $cow ;
target_device=$( dmsetup table $original | awk '{print $4}' );
last_table=$( dmsetup table | grep "$target_device" | awk '{print $6}' | sort -g | tail -n 1 );
begin_sector_args=( $( dmsetup table | grep -E $target_device".*"$last_table"|"$last_table".*"$target_device | awk '{print $2 " " $3 " " $6}' ) );
begin_sector=$( expr ${begin_sector_args[1]} - ${begin_sector_args[0]} + ${begin_sector_args[2]} );
table="0 $size linear $target_device $begin_sector";
echo $table | dmsetup load $cow;
resume_dev $cow;
banner "7: Calculate rowcount in snapshot-origin";
snapshot_origin_size=$( blockdev --getsz $base_path$snapshot_origin ) ||
error 'Could not determine rowcount';
echo "Snapshot size: $snapshot_origin_size";
banner "8: Load snapshot table.";
table="0 $snapshot_origin_size snapshot $base_path$snapshot_origin $base_path$cow p 64";
[ $verbose ] && echo "Table: $table";
echo $table | dmsetup load $snapshot || error 'Failed loading snapshot table';
echo "Done loading.";
banner "9: Reload original device table.";
table="0 $snapshot_origin_size snapshot-origin $base_path$snapshot_origin";
[ $verbose ] && echo "Table: $table";
echo $table | dmsetup load $original || error 'Failed reloading original table';
echo "Done reloading.";
banner "10: Resume frozen tables.";
resume_dev $snapshot $original || error 'Could not resume devices';
echo "Done resuming.";
}
На шаге 8 (баннер «8: ...) скрипт завершается неудачно со следующей ошибкой:
device-mapper: reload ioctl failed: Нет такого устройства или адреса
Команда не удалась
,
dmsetup table
Результаты в следующей таблице данных:
dm.base.snapshot_origin: 0 4194304 линейный 202: 2 0
база: 0 4194304 линейная 202: 2 0
dm.base.snapshot:
dm.base.cow: 0 4096 линейная 202: 2 4194304
Поскольку я не смог определить причину ошибки, последний шаг, который я сделал, - это заглянул в свой dmesg ...
dmesg | tail
Giving me:
PM: замораживание устройств завершено через 0,080 мсек.
приостановка xenstore ...
PM: позднее замораживание устройств завершается через 0,019 мсек.
PM: раннее восстановление устройств завершено через 0,035 мсек.
PM: восстановление устройств завершено через 32,367 мсек.
Установочная способность до 10485760
Установка емкости на 104857600
device-mapper: постоянный снимок: недопустимый или поврежденный снимок
device-mapper: table: 254: 2: snapshot: не удалось прочитать метаданные снимка
device-mapper: ioctl: ошибка добавления цели в таблицу
Мне не удалось выяснить, что вызвало повреждение снимка.
тестирование скрипта на чистом Xen-боксе
Это не гарантирует, что экспортированный диск (диски) будет содержать только нули в незаписанных областях. Таким образом, ядро может обнаружить то, чего на самом деле нет. Вам следует перезаписать первую часть тома COW (я не знаю, сколько нужно, но первых 4 МиБ должно быть достаточно. О, ваш объем COW не превышает даже 4 Мбайт:
dd if=/dev/zero of=/dev/mapper/dm.base.cow bs=4K count=1024
Может быть, есть минимальный размер для объемов COW, а ваш просто слишком мал?