Adapt snapshot_fns to work with ZFS

This commit is contained in:
Yuriy Taraday 2015-07-22 14:30:04 +03:00
parent 6cef6c9b0e
commit b1462d6c6a
1 changed files with 48 additions and 27 deletions

View File

@ -1,23 +1,51 @@
# vim syntax=sh
lvm_snapshot() {
STATE_PATH="/vms/state"
zfs_snapshot() {
local volume=$1 snapname=$2
sudo lvcreate -sn $volume-$snapname -l 100%ORIGIN vms/$volume
sudo zfs snapshot vms/$volume@$snapname
sudo zfs clone vms/$volume@$snapname vms/$volume-$snapname
sudo zfs promote vms/$volume-$snapname
}
lvm_revert() {
zfs_revert() {
local volume=$1 snapname=$2
sudo lvconvert --merge vms/$volume-$snapname -i 5
sudo lvcreate -sn $volume-$snapname -l 100%ORIGIN vms/$volume # keep snapshot around
sudo zfs destroy vms/$volume
sudo zfs clone vms/$volume-$snapname@$snapname vms/$volume
}
zfs_discard() {
local volume=$1 snapname=$2
clones="$(sudo zfs get -H clones vms/$volume-$snapname@$snapname | cut -f3)"
case $clones in
"" )
sudo zfs destroy vms/$volume-$snapname@$snapname
sudo zfs destroy vms/$volume-$snapname
;;
vms/$volume )
sudo zfs promote vms/$volume
sudo zfs destroy vms/$volume-$snapname
sudo zfs destroy vms/$volume@$snapname
;;
* )
echo "Can't remove snapshot vms/$volume-$snapname@$snapname since it has clones: $clones"
esac
}
virsh_all() {
local action=$1
shift
echo "$@" | xargs -P0 -n1 virsh $action | sed -n '/./p'
}
snapshot_vms() {
local snapname=$1 domain snap_arg
shift
sudo mkdir -p "$STATE_PATH"
sudo chown libvirt-qemu:kvm "$STATE_PATH"
virsh_all suspend "$@"
for domain; do
virsh suspend $domain
done
for domain; do
lvm_snapshot $domain $snapname
zfs_snapshot $domain $snapname
snap_arg=""
case $domain in
fuel )
@ -25,47 +53,40 @@ snapshot_vms() {
;;
compute-* )
snap_arg="--diskspec hdb,snapshot=no"
lvm_snapshot $domain-ceph $snapname
zfs_snapshot $domain-ceph $snapname
;;
esac
virsh snapshot-create-as $domain $domain-$snapname --atomic --memspec /var/lib/libvirt/qemu/save/$domain-$snapname --diskspec hda,snapshot=no $snap_arg
done
for domain; do
virsh resume $domain
virsh snapshot-create-as $domain $domain-$snapname --atomic --memspec "$STATE_PATH/$domain-$snapname" --diskspec hda,snapshot=no $snap_arg
done
virsh_all resume "$@"
}
revert_vms() {
local snapname=$1 domain
shift
virsh_all destroy "$@"
for domain; do
virsh destroy $domain
done
for domain; do
lvm_revert $domain $snapname
zfs_revert $domain $snapname
case $domain in
compute-* )
lvm_revert $domain-ceph $snapname
zfs_revert $domain-ceph $snapname
;;
esac
virsh restore /var/lib/libvirt/qemu/save/$domain-$snapname --paused
done
for domain; do
virsh resume $domain
virsh restore "$STATE_PATH/$domain-$snapname" --paused
done
virsh_all resume "$@"
}
discard_snapshots() {
local snapname=$1 domain
shift
for domain; do
sudo lvremove -f vms/$domain-$snapname
rm -f "$STATE_PATH/$domain-$snapname"
zfs_discard $domain $snapname
case $domain in
compute-* )
sudo lvremove -f vms/$domain-ceph-$snapname
zfs_discard $domain-ceph $snapname
;;
esac
virsh snapshot-delete $domain $domain-$snapname --metadata
sudo rm -f /var/lib/libvirt/qemu/save/$domain-$snapname
done
}