[Qemu-devel] [PATCH v4 3/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 +++ tests/qemu-iotests/group | 1 + 3 files changed, 122 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..16988d8 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + +_cleanup() +{ +rm -f "$TEST_DIR"/virtio0 +rm -f "$CONFIG_FILE" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +CONFIG_FILE="$TEST_DIR"/backup-config +SOCKET=unix:"$TEST_DIR"/backup_socket +size=128M + +_make_test_img "$size" +export QEMU_BACKUP_CONFIG="$CONFIG_FILE" +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup + +_launch_qemu -drive if=virtio,id=virtio0,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup +_cleanup_test_img + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..c60d47a --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,35 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +Successfully Added Guest +Successfully Added Drive + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 94e7648..f1f23e1 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -187,5 +187,6 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto 192 rw auto quick 194 rw auto migration quick -- 2.7.4
[Qemu-devel] [PATCH v4 1/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage will be built along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 142 2 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 337a1f6..794cac5 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -517,6 +518,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -728,16 +731,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..7ad266c --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,142 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want your backup to be made. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@itemize +@item qem
[Qemu-devel] [PATCH v4 2/3] backup: Adds Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Remove a guest python qemu-backup.py guest remove --guest List all guest configs in configuration file: python qemu-backup.py guest list Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest Restore operation python qemu-backup.py restore --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 373 ++ 1 file changed, 373 insertions(+) create mode 100755 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100755 index 000..7077f68 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,373 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] + +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) +try: +if self.config.get('general', 'version') != '1.0': +print("Version Conflict in config file", file=sys.stderr) +sys.exit(1) +except: +self.config['general'] = {'version': '1.0'} +self.write_config() + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file + ".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file + ".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +self.verify_guest_present(guest_name) +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": &quo
[Qemu-devel] [PATCH v4 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. v4: * Reorganize patch structure. * Modify commit message for backup tool commit. * Organize examples by subcommands. * Add checks for required arguments. * Adds required arguments group to mandatory arguments. * Add checks for validating socket path. Ishani Chugh (3): Add manpage for QEMU Backup Tool backup: Adds Backup Tool Test for full Backup Makefile| 14 +- contrib/backup/qemu-backup.py | 373 contrib/backup/qemu-backup.texi | 142 +++ tests/qemu-iotests/191 | 86 + tests/qemu-iotests/191.out | 35 tests/qemu-iotests/group| 1 + 6 files changed, 647 insertions(+), 4 deletions(-) create mode 100755 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH 2/3] Backup Tool: Support for Incremental Backup
Adds incremental backup functionality. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 101 +- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py index 248ca9f..7a3077a 100644 --- a/contrib/backup/qemu-backup.py +++ b/contrib/backup/qemu-backup.py @@ -24,11 +24,13 @@ from __future__ import print_function from argparse import ArgumentParser import os import errno +from string import Template from socket import error as socket_error try: import configparser except ImportError: import ConfigParser as configparser +from configparser import NoOptionError import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts', 'qmp')) @@ -41,7 +43,6 @@ class BackupTool(object): '/.config/qemu/qemu-backup-config'): if "QEMU_BACKUP_CONFIG" in os.environ: self.config_file = os.environ["QEMU_BACKUP_CONFIG"] - else: self.config_file = config_file try: @@ -129,6 +130,97 @@ class BackupTool(object): drive_list.remove(event['data']['device']) print("Backup Complete") +def _inc_backup(self, guest_name): +""" +Performs Incremental backup +""" +if guest_name not in self.config.sections(): +print ("Cannot find specified guest", file=sys.stderr) +exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +backup_cmd = {"execute": "transaction", + "arguments": {"actions": [], "properties": +{"completion-mode": "grouped"}}} +bitmap_cmd = {"execute": "transaction", "arguments": {"actions": []}} +for key in self.config[guest_name]: +if key.startswith("drive_"): +drive = key[len('drive_'):] +target = self.config.get(guest_name, key).rsplit('/', 1)[0] +inc_backup_pattern = Template('${drive}_inc_${N}') +bitmap = 'qemu_backup_'+guest_name +try: +query_block_cmd = {'execute': 'query-block'} +returned_json = connection.cmd_obj(query_block_cmd) +device_present = False +for device in returned_json['return']: +if device['device'] == drive: +device_present = True +bitmap_present = False +for bitmaps in device['dirty-bitmaps']: +if bitmap == bitmaps['name']: +bitmap_present = True +if os.path.isfile(self.config.get( + guest_name, + 'inc_'+drive)) is False: +print("Initial Backup does not exist") +bitmap_remove = {"execute": + "block-dirty" + + "-bitmap-remove", + "arguments": + {"node": drive, + "name": + "qemu_backup_" + + guest_name}} +connection.cmd_obj(bitmap_remove) +bitmap_present = False +if bitmap_present is False: +raise NoOptionError(guest_name, 'inc_'+drive) +break + +if not device_present: +print("No such drive in guest", file=sys.stderr) +sys.exit(1) +N = int(self.config.get(guest_name, drive+'_N'))+1 +target = self.config.get(guest_name, key).rsplit( +'/', 1)[0]\ ++ '/' + inc_backup_pattern.substitute(drive=drive, N=N) +os
[Qemu-devel] [PATCH 1/3] Backup Tool: Manpage for Incremental Backup
Adds command description to perform incremental backup and a full example for the same. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.texi | 18 ++ 1 file changed, 18 insertions(+) diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi index 7ad266c..8e5cb86 100644 --- a/contrib/backup/qemu-backup.texi +++ b/contrib/backup/qemu-backup.texi @@ -58,6 +58,7 @@ qemu-backup command [command options]. @item qemu-backup restore --guest guestname @item qemu-backup guest remove --guest guestname @item qemu-backup drive remove --guest guestname --id driveid +@item qemu-backup backup --inc --guest guestname @end itemize @node Command Parameters @chapter Command Parameters @@ -67,6 +68,7 @@ qemu-backup command [command options]. @item --id: id of guest or drive. @item --qmp: Path of qmp socket. @item --target: Destination path on which you want your backup to be made. +@item --inc: incremental backup (Optional). @end itemize @node Command Descriptions @@ -119,6 +121,11 @@ This command helps remove a drive which is set for backup in configuration of gi example: drive remove --guest=fedora --id=root +@item qemu-backup backup --inc --guest guestname +This command is used for making incremental backup. + +example: qemu-backup backup --inc --guest fedora + @item A full backup can be performed by following the given steps: Perform a full backup of 'vm001', which has one drive: @@ -129,6 +136,17 @@ qemu-backup add --id drive0 --guest vm001 --target /backups/vm001-drive0.img qemu-backup backup --guest vm001 +@item An incremental backup can be performed by following the given steps: + +Perform an incremental backup of 'vm001', which has one drive: + +qemu-backup guest add --guest vm001 --qmp /path/to/vm001.sock + +qemu-backup add --id drive0 --guest vm001 --target /backups/vm001-drive0.img + +qemu-backup backup --inc --guest vm001 + +qemu-backup backup --inc --guest vm001 @end itemize -- 2.7.4
[Qemu-devel] [PATCH 0/3] Backup Tool: Incremental backup
This patch series is intended to add incremental backup functionality to Backup Tool. This patch series contains three patches, 1) QEMU Backup command line tool(With Incremental backup). 2) Test for incremental backup. 3) Manpage for the tool(Incremental backup example). Based on: 1504113297-22052-1-git-send-email-chugh.ish...@research.iiit.ac.in Ishani Chugh (3): Backup Tool: Manpage for Incremental Backup Backup Tool: Support for Incremental Backup Backup Tool: Test for Incremental Backup contrib/backup/qemu-backup.py | 101 +++- contrib/backup/qemu-backup.texi | 18 +++ tests/qemu-iotests/193 | 86 ++ tests/qemu-iotests/193.out | 34 ++ tests/qemu-iotests/group| 1 + 5 files changed, 238 insertions(+), 2 deletions(-) create mode 100755 tests/qemu-iotests/193 create mode 100644 tests/qemu-iotests/193.out -- 2.7.4
[Qemu-devel] [PATCH 3/3] Backup Tool: Test for Incremental Backup
This patch is the test for incremental backup implementation in Backup tool. The test employs two basic subtests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup, writing a pattern again, creating backup and comparing with base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/193 | 86 ++ tests/qemu-iotests/193.out | 34 ++ tests/qemu-iotests/group | 1 + 3 files changed, 121 insertions(+) create mode 100755 tests/qemu-iotests/193 create mode 100644 tests/qemu-iotests/193.out diff --git a/tests/qemu-iotests/193 b/tests/qemu-iotests/193 new file mode 100755 index 000..500e5df --- /dev/null +++ b/tests/qemu-iotests/193 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test Incremental backup functionality of qemu-backup tool +# +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + + +CONFIG_FILE=$TEST_DIR/backup-config +SOCKET=unix:$TEST_DIR/backup_socket +size=128M + +_make_test_img $size +export QEMU_BACKUP_CONFIG=$CONFIG_FILE +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file=$TEST_IMG -qmp $SOCKET,server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp $SOCKET +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target $TEST_DIR/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --inc --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0_inc_0 $TEST_IMG + +rm $TEST_DIR/virtio0_inc_0 + +_launch_qemu -drive if=virtio,id=virtio0,file=$TEST_IMG -qmp $SOCKET,server,nowait +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo + +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --inc --guest adad + +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +$PYTHON ../../contrib/backup/qemu-backup.py backup --inc --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0_inc_1 $TEST_IMG +rm $TEST_DIR/virtio0_inc_0 +rm $TEST_DIR/virtio0_inc_1 +rm $CONFIG_FILE + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/193.out b/tests/qemu-iotests/193.out new file mode 100644 index 000..3a836c2 --- /dev/null +++ b/tests/qemu-iotests/193.out @@ -0,0 +1,34 @@ +QA output created by 193 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0_inc_0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Initial Backup does not exist +== Writing Pattern == +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0_inc_0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 + +Formatting '/home/ishani/Desktop/opw/qemu/tests/qemu-iotests/scratch/virtio0_inc_1', fmt=qcow2 size=134217728 backing_file=/home/ishani/Desktop/opw/qemu/tests/qemu-iotests/scratch/virtio0_inc_0 backing_fmt=qcow2 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16 +qemu-io virtio0 "write -P 0x22 0 1M" +wrote 1048
[Qemu-devel] [PATCH v3 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 343 ++ 1 file changed, 343 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..248ca9f --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,343 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] + +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) +try: +if self.config.get('general', 'version') != '1.0': +print("Version Conflict in config file", file=sys.stderr) +sys.exit(1) +except: +self.config['general'] = {'version': '1.0'} +self.write_config() + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file + ".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file + ".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.
[Qemu-devel] [PATCH v3 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage will be built along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 142 2 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..7ad266c --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,142 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want your backup to be made. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@itemize +@
[Qemu-devel] [PATCH v3 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. v3: * Added versioning in config file * Replace location by qemu-img convert in restore * Removed incremental backup documentation from manpage Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 343 contrib/backup/qemu-backup.texi | 142 + tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 tests/qemu-iotests/group| 2 + 6 files changed, 618 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH v3 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 +++ tests/qemu-iotests/group | 2 ++ 3 files changed, 123 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..16988d8 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + +_cleanup() +{ +rm -f "$TEST_DIR"/virtio0 +rm -f "$CONFIG_FILE" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +CONFIG_FILE="$TEST_DIR"/backup-config +SOCKET=unix:"$TEST_DIR"/backup_socket +size=128M + +_make_test_img "$size" +export QEMU_BACKUP_CONFIG="$CONFIG_FILE" +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup + +_launch_qemu -drive if=virtio,id=virtio0,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup +_cleanup_test_img + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..c60d47a --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,35 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +Successfully Added Guest +Successfully Added Drive + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..66fa231 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -186,4 +186,6 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH v2 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 +++ tests/qemu-iotests/group | 2 ++ 3 files changed, 123 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..16988d8 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + +_cleanup() +{ +rm -f "$TEST_DIR"/virtio0 +rm -f "$CONFIG_FILE" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +CONFIG_FILE="$TEST_DIR"/backup-config +SOCKET=unix:"$TEST_DIR"/backup_socket +size=128M + +_make_test_img "$size" +export QEMU_BACKUP_CONFIG="$CONFIG_FILE" +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup + +_launch_qemu -drive if=virtio,id=virtio0,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup +_cleanup_test_img + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..c60d47a --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,35 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +Successfully Added Guest +Successfully Added Drive + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..66fa231 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -186,4 +186,6 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH v2 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 144 2 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..68e7231 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,144 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want you
[Qemu-devel] [PATCH v2 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 335 contrib/backup/qemu-backup.texi | 144 + tests/qemu-iotests/191 | 86 +++ tests/qemu-iotests/191.out | 35 + tests/qemu-iotests/group| 2 + 6 files changed, 612 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH v2 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 335 ++ 1 file changed, 335 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..9a2ce63 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,335 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file + ".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file + ".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +drive_list = [] +for key in self.config[guest_name]: +if key.startswith("drive_"): +dr
[Qemu-devel] [PATCH 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 335 ++ 1 file changed, 335 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..c8032de --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,335 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file + ".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file + ".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +drive_list = [] +for key in self.config[guest_name]: +if key.startswith("drive_"): +dr
[Qemu-devel] [PATCH 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 +++ tests/qemu-iotests/group | 2 ++ 3 files changed, 123 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..16988d8 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + +_cleanup() +{ +rm -f "$TEST_DIR"/virtio0 +rm -f "$CONFIG_FILE" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +CONFIG_FILE="$TEST_DIR"/backup-config +SOCKET=unix:"$TEST_DIR"/backup_socket +size=128M + +_make_test_img "$size" +export QEMU_BACKUP_CONFIG="$CONFIG_FILE" +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup + +_launch_qemu -drive if=virtio,id=virtio0,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup +_cleanup_test_img + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..c60d47a --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,35 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +Successfully Added Guest +Successfully Added Drive + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..66fa231 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -186,4 +186,6 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 335 contrib/backup/qemu-backup.texi | 144 + tests/qemu-iotests/191 | 86 +++ tests/qemu-iotests/191.out | 35 + tests/qemu-iotests/group| 2 + 6 files changed, 612 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 144 2 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..68e7231 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,144 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want you
[Qemu-devel] [PATCH 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 144 2 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..68e7231 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,144 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want you
[Qemu-devel] [PATCH 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 +++ tests/qemu-iotests/group | 2 ++ 3 files changed, 123 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..16988d8 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,86 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + +_cleanup() +{ +rm -f "$TEST_DIR"/virtio0 +rm -f "$CONFIG_FILE" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +CONFIG_FILE="$TEST_DIR"/backup-config +SOCKET=unix:"$TEST_DIR"/backup_socket +size=128M + +_make_test_img "$size" +export QEMU_BACKUP_CONFIG="$CONFIG_FILE" +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup + +_launch_qemu -drive if=virtio,id=virtio0,file="$TEST_IMG" -qmp "$SOCKET",server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp "$SOCKET" +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target "$TEST_DIR"/virtio0 +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare "$TEST_DIR"/virtio0 "$TEST_IMG" +_cleanup +_cleanup_test_img + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..c60d47a --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,35 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +Successfully Added Guest +Successfully Added Drive + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..66fa231 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -186,4 +186,6 @@ 188 rw auto quick 189 rw auto 190 rw auto quick +191 rw auto 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 339 contrib/backup/qemu-backup.texi | 144 + tests/qemu-iotests/191 | 86 ++ tests/qemu-iotests/191.out | 35 + tests/qemu-iotests/group| 2 + 6 files changed, 616 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 339 ++ 1 file changed, 339 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..8c17486 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,339 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file + ".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file + ".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +drive_list = [] +for key in self.config[guest_name]: +if key.startswith("drive_"): +dr
[Qemu-devel] [PATCH 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 338 ++ 1 file changed, 338 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..b4a9efd --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,338 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file+".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file+".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +drive_list = [] +for key in self.config[guest_name]: +if key.startswith("drive_"): +dr
[Qemu-devel] [PATCH 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 78 ++ tests/qemu-iotests/191.out | 33 tests/qemu-iotests/group | 1 + 3 files changed, 112 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..fb4cde9 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,78 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + + +CONFIG_FILE=$TEST_DIR/backup-config +SOCKET=unix:$TEST_DIR/backup_socket +size=128M + +_make_test_img $size +export QEMU_BACKUP_CONFIG=$CONFIG_FILE +qemu_comm_method="monitor" +echo +_launch_qemu -drive if=virtio,file=$TEST_IMG -qmp $SOCKET,server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp $SOCKET +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target $TEST_DIR/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0 $TEST_IMG +rm $TEST_DIR/virtio0 + +_launch_qemu -drive if=virtio,id=virtio0,file=$TEST_IMG -qmp $SOCKET,server,nowait +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0 $TEST_IMG +rm $TEST_DIR/virtio0 +rm $CONFIG_FILE + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..a8b0dbb --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,33 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..bfff383 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -187,3 +187,4 @@ 189 rw auto 190 rw auto quick 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 338 contrib/backup/qemu-backup.texi | 144 + tests/qemu-iotests/191 | 78 ++ tests/qemu-iotests/191.out | 33 tests/qemu-iotests/group| 1 + 6 files changed, 604 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 ++-- contrib/backup/qemu-backup.texi | 144 2 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..68e7231 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,144 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want you
[Qemu-devel] [PATCH 1/3] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 334 ++ 1 file changed, 334 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..08570f7 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,334 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Ishani Chugh <chugh.ish...@research.iiit.ac.in> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file=os.path.expanduser('~') + + '/.config/qemu/qemu-backup-config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.dirname(self.config_file)): +os.makedirs(os.path.dirname(self.config_file)) +except: +print("Cannot create config directory", file=sys.stderr) +sys.exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file+".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file+".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':', 2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print("Cannot find specified guest", file=sys.stderr) +sys.exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +drive_list = [] +for key in self.config[guest_name]: +if key.startswith("drive_"): +dr
[Qemu-devel] [PATCH 2/3] Test for full Backup
This patch is the test for full backup implementation in Backup tool. The test employs two basic substests: 1) Backing up an empty guest and comparing it with base image. 2) Writing a pattern to the guest, creating backup and comparing with the base image. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- tests/qemu-iotests/191 | 78 ++ tests/qemu-iotests/191.out | 33 tests/qemu-iotests/group | 1 + 3 files changed, 112 insertions(+) create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 new file mode 100755 index 000..14cd094 --- /dev/null +++ b/tests/qemu-iotests/191 @@ -0,0 +1,78 @@ +#!/bin/bash +# +# Test full backup functionality of qemu-backup tool +# +# Copyright (C) 2009 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# creator +owner=chugh.ish...@research.iiit.ac.in + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt generic +_supported_proto generic +_supported_os Linux + + +CONFIG_FILE=$TEST_DIR/backup-config +SOCKET=unix:$TEST_DIR/backup_socket +size=128M + +_make_test_img $size +export QEMU_BACKUP_CONFIG=$CONFIG_FILE +qemu_comm_method="monitor" +echo +_launch_qemu -nographic -drive if=virtio,file=$TEST_IMG -qmp $SOCKET,server,nowait +$PYTHON ../../contrib/backup/qemu-backup.py guest add --guest adad --qmp $SOCKET +$PYTHON ../../contrib/backup/qemu-backup.py drive add --id virtio0 --guest adad --target $TEST_DIR/virtio0 +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0 $TEST_IMG +rm $TEST_DIR/virtio0 + +_launch_qemu -nographic -drive if=virtio,id=virtio0,file=$TEST_IMG -qmp $SOCKET,server,nowait +echo +echo "== Writing Pattern ==" +_send_qemu_cmd $QEMU_HANDLE 'qemu-io virtio0 "write -P 0x22 0 1M"' "(qemu)" | _filter_qemu_io +echo +echo "== Creating backup ==" +$PYTHON ../../contrib/backup/qemu-backup.py backup --guest adad +_send_qemu_cmd $QEMU_HANDLE 'quit' '' +wait=1 _cleanup_qemu +echo +echo "== Comparing images ==" +$QEMU_IMG compare $TEST_DIR/virtio0 $TEST_IMG +rm $TEST_DIR/virtio0 +rm $CONFIG_FILE + +echo "*** done" +status=0 \ No newline at end of file diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out new file mode 100644 index 000..a8b0dbb --- /dev/null +++ b/tests/qemu-iotests/191.out @@ -0,0 +1,33 @@ +QA output created by 191 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 + +Successfully Added Guest +Successfully Added Drive + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. + +== Writing Pattern == +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) qemu-io virtio0 "write -P 0x22 0 1M" + +== Creating backup == +Backup Started +*virtio0 +Backup Complete +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +(qemu) Formatting 'TEST_DIR/virtio0', fmt=qcow2 size=134217728 cluster_size=65536 lazy_refcounts=off refcount_bits=16 +quit + +== Comparing images == +Images are identical. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index afbdc42..bfff383 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -187,3 +187,4 @@ 189 rw auto 190 rw auto quick 192 rw auto quick +193 rw auto -- 2.7.4
[Qemu-devel] [PATCH 0/3] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains three patches, 1) QEMU Backup command line tool. 2) Test for full backup. 3) Manpage for the tool. Ishani Chugh (3): backup: QEMU Backup Tool Test for full Backup Add manpage for QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 334 contrib/backup/qemu-backup.texi | 134 tests/qemu-iotests/191 | 78 ++ tests/qemu-iotests/191.out | 33 tests/qemu-iotests/group| 1 + 6 files changed, 590 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi create mode 100755 tests/qemu-iotests/191 create mode 100644 tests/qemu-iotests/191.out -- 2.7.4
[Qemu-devel] [PATCH 3/3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 +++-- contrib/backup/qemu-backup.texi | 134 2 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 81447b1..ba1574d 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..b3daf0d --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,134 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you want you
[Qemu-devel] [PATCH 2/2] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 309 ++ 1 file changed, 309 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..9bbbdb7 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,309 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, + config_file=os.path.expanduser('~')+'/.qemu/backup/config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.expanduser('~')+'/.qemu/backup'): +os.makedirs(os.path.expanduser('~')+'/.qemu/backup') +except: +print("Cannot find the config file", file=sys.stderr) +exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file+".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file+".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':',2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print ("Cannot find specified guest", file=sys.stderr) +exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +for key in self.config[guest_name]: +if key.startswith("drive_"): +drive = key[len('drive_'):] +target = self.config[guest_name][key] +
[Qemu-devel] [PATCH 1/2] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 +++-- contrib/backup/qemu-backup.texi | 135 2 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 16a0430..500c6e8 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..ba9f9ec --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,135 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath [--tcp] +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you w
[Qemu-devel] [PATCH 0/2] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains two patches, 1) Adding Manpage for the tool 2) QEMU Backup command line tool Ishani Chugh (2): Add manpage for QEMU Backup Tool backup: QEMU Backup Tool Makefile| 14 +- contrib/backup/qemu-backup.py | 309 contrib/backup/qemu-backup.texi | 135 ++ 3 files changed, 454 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi -- 2.7.4
[Qemu-devel] [PATCH 2/2] backup: QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 309 ++ 1 file changed, 309 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..9bbbdb7 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,309 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +""" +This file is an implementation of backup tool +""" +from __future__ import print_function +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +try: +import configparser +except ImportError: +import ConfigParser as configparser +import sys +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, + config_file=os.path.expanduser('~')+'/.qemu/backup/config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.expanduser('~')+'/.qemu/backup'): +os.makedirs(os.path.expanduser('~')+'/.qemu/backup') +except: +print("Cannot find the config file", file=sys.stderr) +exit(1) +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +config_file = open(self.config_file+".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file+".tmp", self.config_file) + +def get_socket_address(self, socket_address): +""" +Return Socket address in form of string or tuple +""" +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':',2)[1] + +def _full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print ("Cannot find specified guest", file=sys.stderr) +exit(1) + +self.verify_guest_running(guest_name) +connection = QEMUMonitorProtocol( + self.get_socket_address( + self.config[guest_name]['qmp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +for key in self.config[guest_name]: +if key.startswith("drive_"): +drive = key[len('drive_'):] +target = self.config[guest_name][key] +
[Qemu-devel] [PATCH 1/2] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 15 +++-- contrib/backup/qemu-backup.texi | 135 2 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 16a0430..1826a74 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,8 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt +DOCS+=contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.info ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +510,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +723,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..ba9f9ec --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,135 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath [--tcp] +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp:
[Qemu-devel] [PATCH 0/2] QEMU Backup Tool
This patch series is intended to introduce QEMU Backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. This patch series contains two patches, 1) Adding Manpage for the tool 2) QEMU Backup command line tool Ishani Chugh (2): Add manpage for QEMU Backup Tool backup: QEMU Backup Tool Makefile| 15 +- contrib/backup/qemu-backup.py | 309 contrib/backup/qemu-backup.texi | 135 ++ 3 files changed, 455 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.py create mode 100644 contrib/backup/qemu-backup.texi -- 2.7.4
[Qemu-devel] [PATCH] QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The location of config file can be set as an environment variable QEMU_BACKUP_CONFIG. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list Restore operation python qemu-backup.py restore --guest Remove a guest python qemu-backup.py guest remove --guest Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 217 +++--- 1 file changed, 141 insertions(+), 76 deletions(-) diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py index 9c3dc53..9bbbdb7 100644 --- a/contrib/backup/qemu-backup.py +++ b/contrib/backup/qemu-backup.py @@ -1,22 +1,54 @@ #!/usr/bin/python # -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + """ This file is an implementation of backup tool """ +from __future__ import print_function from argparse import ArgumentParser import os import errno from socket import error as socket_error -import configparser +try: +import configparser +except ImportError: +import ConfigParser as configparser import sys -sys.path.append('../../scripts/qmp') +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', + 'scripts', 'qmp')) from qmp import QEMUMonitorProtocol class BackupTool(object): """BackupTool Class""" -def __init__(self, config_file='backup.ini'): -self.config_file = config_file +def __init__(self, + config_file=os.path.expanduser('~')+'/.qemu/backup/config'): +if "QEMU_BACKUP_CONFIG" in os.environ: +self.config_file = os.environ["QEMU_BACKUP_CONFIG"] +else: +self.config_file = config_file +try: +if not os.path.isdir(os.path.expanduser('~')+'/.qemu/backup'): +os.makedirs(os.path.expanduser('~')+'/.qemu/backup') +except: +print("Cannot find the config file", file=sys.stderr) +exit(1) self.config = configparser.ConfigParser() self.config.read(self.config_file) @@ -24,66 +56,70 @@ class BackupTool(object): """ Writes configuration to ini file. """ -with open(self.config_file, 'w') as config_file: -self.config.write(config_file) +config_file = open(self.config_file+".tmp", 'w') +self.config.write(config_file) +config_file.flush() +os.fsync(config_file.fileno()) +config_file.close() +os.rename(self.config_file+".tmp", self.config_file) -def get_socket_path(self, socket_path, tcp): +def get_socket_address(self, socket_address): """ Return Socket address in form of string or tuple """ -if tcp is False: -return os.path.abspath(socket_path) -return (socket_path.split(':')[0], int(socket_path.split(':')[1])) +if socket_address.startswith('tcp'): +return (socket_address.split(':')[1], +int(socket_address.split(':')[2])) +return socket_address.split(':',2)[1] -def __full_backup(self, guest_name): +def _full_backup(self, guest_name): """ Performs full backup of guest """ if guest_name not in self.config.sections(): -print ("Cannot find specified guest") -return -if self.is_guest_running(guest_name, self.config[guest_name]['qmp'], -
[Qemu-devel] [PATCH v6] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 14 +++-- contrib/backup/qemu-backup.texi | 135 2 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 16a0430..500c6e8 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,7 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +509,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +722,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..ba9f9ec --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,135 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath [--tcp] +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp: Path of qmp socket. +@item --target: Destination path on which you w
[Qemu-devel] [RFC] RFC on Backup tool
This is a Request For Comments patch for qemu backup tool. As an Outreachy intern, I am assigned to the project for creating a backup tool. qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The tool writes details of guest in a configuration file and the data is retrieved from the file while creating a backup. The usage is as follows: Add a guest python qemu-backup.py guest add --guest --qmp [--tcp] Add a drive for backup in a specified guest python qemu-backup.py drive add --guest --id [--target ] Create backup of the added drives: python qemu-backup.py backup --guest List all guest configs in configuration file: python qemu-backup.py guest list I will be obliged by any feedback. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- contrib/backup/qemu-backup.py | 244 ++ 1 file changed, 244 insertions(+) create mode 100644 contrib/backup/qemu-backup.py diff --git a/contrib/backup/qemu-backup.py b/contrib/backup/qemu-backup.py new file mode 100644 index 000..9c3dc53 --- /dev/null +++ b/contrib/backup/qemu-backup.py @@ -0,0 +1,244 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +This file is an implementation of backup tool +""" +from argparse import ArgumentParser +import os +import errno +from socket import error as socket_error +import configparser +import sys +sys.path.append('../../scripts/qmp') +from qmp import QEMUMonitorProtocol + + +class BackupTool(object): +"""BackupTool Class""" +def __init__(self, config_file='backup.ini'): +self.config_file = config_file +self.config = configparser.ConfigParser() +self.config.read(self.config_file) + +def write_config(self): +""" +Writes configuration to ini file. +""" +with open(self.config_file, 'w') as config_file: +self.config.write(config_file) + +def get_socket_path(self, socket_path, tcp): +""" +Return Socket address in form of string or tuple +""" +if tcp is False: +return os.path.abspath(socket_path) +return (socket_path.split(':')[0], int(socket_path.split(':')[1])) + +def __full_backup(self, guest_name): +""" +Performs full backup of guest +""" +if guest_name not in self.config.sections(): +print ("Cannot find specified guest") +return +if self.is_guest_running(guest_name, self.config[guest_name]['qmp'], + self.config[guest_name]['tcp']) is False: +return +connection = QEMUMonitorProtocol( + self.get_socket_path( + self.config[guest_name]['qmp'], + self.config[guest_name]['tcp'])) +connection.connect() +cmd = {"execute": "transaction", "arguments": {"actions": []}} +for key in self.config[guest_name]: +if key.startswith("drive_"): +drive = key[key.index('_')+1:] +target = self.config[guest_name][key] +sub_cmd = {"type": "drive-backup", "data": {"device": drive, +"target": target, +"sync": "full"}} +cmd['arguments']['actions'].append(sub_cmd) +print (connection.cmd_obj(cmd)) + +def __drive_add(self, drive_id, guest_name, target=None): +""" +Adds drive for backup +""" +if target is None: +target = os.path.abspath(drive_id) + ".img" + +if guest_name not in self.config.sections(): +print ("Cannot find specified guest") +return + +if "drive_"+drive_id in self.config[guest_name]: +print ("Drive already marked for backup") +return + +if self.is_guest_running(guest_name, self.config[guest_name]['qmp'], + self.config[guest_name]['tcp']) is False: +return + +connection = QEMUMonitorProtocol( + self.get_socket_path( + self.config[guest_name]['qmp'], + self.config[guest_name]['tcp'])) +connection.connect() +cmd = {'execute': 'query-block'} +
[Qemu-devel] [PATCH v5] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. The manpage wil be build along with other docs when configure is provided with --enable-docs flag in the location contrib/backup in build directory. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 15 +++-- contrib/backup/qemu-backup.texi | 135 2 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index 16a0430..1826a74 100644 --- a/Makefile +++ b/Makefile @@ -209,6 +209,8 @@ ifdef BUILD_DOCS DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8 DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 +DOCS+=contrib/backup/qemu-backup.html contrib/backup/qemu-backup.txt +DOCS+=contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.info ifdef CONFIG_VIRTFS DOCS+=fsdev/virtfs-proxy-helper.1 endif @@ -508,6 +510,8 @@ VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 +qemu-backup.8: contrib/backup/qemu-backup.texi + qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" @@ -719,16 +723,19 @@ fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi qemu-ga.8: qemu-ga.texi -html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html -info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info -pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf -txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt +html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html contrib/backup/qemu-backup.html +info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info contrib/backup/qemu-backup.info +pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf contrib/backup/qemu-backup.pdf +txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt contrib/backup/qemu-backup.txt qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \ qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \ qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \ qemu-monitor-info.texi +contrib/backup/qemu-backup.html contrib/backup/qemu-backup.pdf contrib/backup/qemu-backup.txt contrib/backup/qemu-backup.info: \ + contrib/backup/qemu-backup.texi + docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \ docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \ docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \ diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..ba9f9ec --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,135 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* List of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath [--tcp] +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup guest remove --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --inc: (Optional) For incremental backup. +@item --qmp:
[Qemu-devel] [PATCH v2] Python3 Support for qmp.py
This patch intends to make qmp.py compatible with both python2 and python3. * Python 3 does not have dict.has_key(key), use key in dict instead * Avoid line-based I/O since Python 2/3 have different character encoding behavior. Explicitly encode/decode JSON UTF-8. * Replace print by print function. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- scripts/qmp/qmp.py | 58 ++ 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/scripts/qmp/qmp.py b/scripts/qmp/qmp.py index 62d3651..58fb7d1 100644 --- a/scripts/qmp/qmp.py +++ b/scripts/qmp/qmp.py @@ -42,6 +42,7 @@ class QEMUMonitorProtocol: self.__address = address self._debug = debug self.__sock = self.__get_sock() +self.__data = b"" if server: self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.__sock.bind(self.__address) @@ -56,7 +57,7 @@ class QEMUMonitorProtocol: def __negotiate_capabilities(self): greeting = self.__json_read() -if greeting is None or not greeting.has_key('QMP'): +if greeting is None or 'QMP' not in greeting: raise QMPConnectError # Greeting seems ok, negotiate capabilities resp = self.cmd('qmp_capabilities') @@ -64,15 +65,28 @@ class QEMUMonitorProtocol: return greeting raise QMPCapabilitiesError +def __sock_readline(self): +while True: +ch = self.__sock.recv(1) +if ch is None: +if self.__data: +raise ValueError('socket closed mid-line') +return None +self.__data += ch +if ch == b'\n': +line = self.__data.decode('utf-8') +self.__data = b"" +return line + def __json_read(self, only_event=False): while True: -data = self.__sockfile.readline() +data = self.__sock_readline() if not data: return resp = json.loads(data) if 'event' in resp: if self._debug: -print >>sys.stderr, "QMP:<<< %s" % resp +print("QMP:<<< %s" % resp) self.__events.append(resp) if not only_event: continue @@ -87,10 +101,10 @@ class QEMUMonitorProtocol: @param wait (bool): block until an event is available. @param wait (float): If wait is a float, treat it as a timeout value. -@raise QMPTimeoutError: If a timeout float is provided and the timeout -period elapses. -@raise QMPConnectError: If wait is True but no events could be retrieved -or if some other error occurred. +@raise QMPTimeoutError: If a timeout float is provided and the +timeout period elapses. +@raise QMPConnectError: If wait is True but no events could be +retrieved or if some other error occurred. """ # Check for new events regardless and pull them into the cache: @@ -98,9 +112,11 @@ class QEMUMonitorProtocol: try: self.__json_read() except socket.error as err: -if err[0] == errno.EAGAIN: +if err.errno == errno.EAGAIN: # No data available pass +else: +raise self.__sock.setblocking(1) # Wait for new events, if needed. @@ -128,7 +144,6 @@ class QEMUMonitorProtocol: @raise QMPCapabilitiesError if fails to negotiate capabilities """ self.__sock.connect(self.__address) -self.__sockfile = self.__sock.makefile() if negotiate: return self.__negotiate_capabilities() @@ -143,7 +158,6 @@ class QEMUMonitorProtocol: """ self.__sock.settimeout(15) self.__sock, _ = self.__sock.accept() -self.__sockfile = self.__sock.makefile() return self.__negotiate_capabilities() def cmd_obj(self, qmp_cmd): @@ -155,16 +169,17 @@ class QEMUMonitorProtocol: been closed """ if self._debug: -print >>sys.stderr, "QMP:>>> %s" % qmp_cmd +print("QMP:>>> %s" % qmp_cmd) try: -self.__sock.sendall(json.dumps(qmp_cmd)) +command = json.dumps(qmp_cmd) +self.__sock.sendall(command.encode('UTF-8')) except socket.error as err: -if err[0] == errno.EPIPE: +if err.errno == errno.EPIPE: return -raise socket.error(err) +raise resp = self.__js
[Qemu-devel] [PATCH] Python3 Support for qmp.py
This patch intends to make qmp.py compatible with both python2 and python3. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- scripts/qmp/qmp.py | 66 +++--- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/scripts/qmp/qmp.py b/scripts/qmp/qmp.py index 62d3651..9926c36 100644 --- a/scripts/qmp/qmp.py +++ b/scripts/qmp/qmp.py @@ -13,18 +13,23 @@ import errno import socket import sys + class QMPError(Exception): pass + class QMPConnectError(QMPError): pass + class QMPCapabilitiesError(QMPError): pass + class QMPTimeoutError(QMPError): pass + class QEMUMonitorProtocol: def __init__(self, address, server=False, debug=False): """ @@ -42,6 +47,7 @@ class QEMUMonitorProtocol: self.__address = address self._debug = debug self.__sock = self.__get_sock() +self.data = b"" if server: self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.__sock.bind(self.__address) @@ -56,23 +62,35 @@ class QEMUMonitorProtocol: def __negotiate_capabilities(self): greeting = self.__json_read() -if greeting is None or not greeting.has_key('QMP'): +if greeting is None or 'QMP' not in greeting: raise QMPConnectError -# Greeting seems ok, negotiate capabilities resp = self.cmd('qmp_capabilities') if "return" in resp: return greeting raise QMPCapabilitiesError +def __sock_readline(self): +while True: +ch = self.__sock.recv(1) +if ch is None: +if self.data: +raise ValueError('socket closed mid-line') +return None +self.data += ch +if ch == b'\n': +line = self.data.decode('utf-8') +self.data = b"" +return line + def __json_read(self, only_event=False): while True: -data = self.__sockfile.readline() +data = self.__sock_readline() if not data: return resp = json.loads(data) if 'event' in resp: if self._debug: -print >>sys.stderr, "QMP:<<< %s" % resp +print("QMP:<<< %s" % resp) self.__events.append(resp) if not only_event: continue @@ -87,18 +105,18 @@ class QEMUMonitorProtocol: @param wait (bool): block until an event is available. @param wait (float): If wait is a float, treat it as a timeout value. -@raise QMPTimeoutError: If a timeout float is provided and the timeout -period elapses. -@raise QMPConnectError: If wait is True but no events could be retrieved -or if some other error occurred. +@raise QMPTimeoutError: If a timeout float is provided and the +timeout period elapses. +@raise QMPConnectError: If wait is True but no events could be +retrieved or if some other error occurred. """ # Check for new events regardless and pull them into the cache: self.__sock.setblocking(0) try: -self.__json_read() +test = self.__json_read() except socket.error as err: -if err[0] == errno.EAGAIN: +if err.errno == errno.EAGAIN: # No data available pass self.__sock.setblocking(1) @@ -128,7 +146,7 @@ class QEMUMonitorProtocol: @raise QMPCapabilitiesError if fails to negotiate capabilities """ self.__sock.connect(self.__address) -self.__sockfile = self.__sock.makefile() +self.__sockfile = self.__sock.makefile('rb') if negotiate: return self.__negotiate_capabilities() @@ -143,7 +161,7 @@ class QEMUMonitorProtocol: """ self.__sock.settimeout(15) self.__sock, _ = self.__sock.accept() -self.__sockfile = self.__sock.makefile() +self.__sockfile = self.__sock.makefile('rb') return self.__negotiate_capabilities() def cmd_obj(self, qmp_cmd): @@ -155,16 +173,17 @@ class QEMUMonitorProtocol: been closed """ if self._debug: -print >>sys.stderr, "QMP:>>> %s" % qmp_cmd +print("QMP:>>> %s" % qmp_cmd) try: -self.__sock.sendall(json.dumps(qmp_cmd)) +command = json.dumps(qmp_cmd) +self.__sock.sendall(command.encode('UTF-8')) except socket.error as err: -
[Qemu-devel] [PATCH v4] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 2 +- contrib/backup/qemu-backup.texi | 132 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index c830d7a..094f291 100644 --- a/Makefile +++ b/Makefile @@ -504,7 +504,7 @@ clean: VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 - +qemu-backup.8: contrib/backup/qemu-backup.texi qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..cdfad82 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,132 @@ +\input texinfo +@setfilename qemu-backup + +@documentlanguage en +@documentencoding UTF-8 + +@settitle QEMU Backup Tool +@copying + +Copyright @copyright{} 2017 The QEMU Project developers +@end copying +@ifinfo +@direntry +* QEMU: (QEMU-backup).Man page for QEMU Backup Tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU Backup Tool} +@sp 1 +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* list of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [ command options]. + +@node List of Commands +@chapter List of Commands +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +@item qemu-backup guest list +@item qemu-backup drive add --id driveid --guest guestname --target target +@item qemu-backup drive add --all --guest guestname --target target +@item qemu-backup drive list --guest guestname +@item qemu-backup backup [--inc] --guest guestname +@item qemu-backup restore --guest guestname +@item qemu-backup drive remove --guest guestname --id driveid +@item qemu-backup guest remove --guest guestname +@end itemize +@node Command Parameters +@chapter Command Parameters +@itemize +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --target: Destination path on which you want your backup to be made. +@item --all: Add all the drives present in a guest which are suitable for backup. +@item --inc: For incremental backup. +@item --qmp: Path of qmp socket. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@itemize +@item qemu-backup guest add --guest guestname --qmp socketpath +This command adds a guest to the configuration file given its path to qmp socket. + +example: +qemu-backup guest add --id=fedora –qmp=/var/run/qemu/fedora.sock + +@item qemu-backup guest list +This commands lists the names of guests which are added to configuration file. + +@item qemu-backup drive add --guest guestname --id driveid --target target +This command adds different drives for backup in a particular guest by giving the name of drive to be backed up and target imagefile in which we want to store the drive backup. + +example:qemu-backup drive add --guest=fedora --id=root +--target=/backup/root.img + +@item qemu-backup drive add --all --guest guestname --destination destination +This command adds all the drives of the guest for backup other than CDROM drive. Here all the backup drives will have the same names as original drives and target will be the destination folder. + +example: qemu-backup drive add --all --guest fedora --destination =/backup/fedora/ + +@item qemu-backup drive list --guest guestname +This commands gives the names of the drive present in a guest which are added for backup. + +example: qemu-backup drive list --guest=fedora + +@item qemu-backup backup --guest guestname + +This command makes the backup of the drives, in their respective given destinations. The ids of drive and their destinations are taken from the configuration file. + +example: qemu-backup backup --guest=fedora + +@item qemu-backup restore --guest guestname +This command is needed if we want to restore the backup. It will list the commands to be run for performing the same but will not perform any action. + +example: qemu-backup restore --guest=fedora + +@item qemu-backup drive remove --guest guestname --id driveid +This command helps remove a drive which is set for backup in configuration of given host. + +example: drive remove --guest=fedora --id=root + +@item qemu-backup guest remove --guest guestname +This
[Qemu-devel] [PATCH v3] Add manpage for QEMU Backup Tool
qemu-backup will be a command-line tool for performing full and incremental disk backups on running VMs. It is intended as a reference implementation for management stack and backup developers to see QEMU's backup features in action. The following commit is an initial implementation of manpage listing the commands which the backup tool will support. Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 2 +- contrib/backup/qemu-backup.texi | 139 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index c830d7a..094f291 100644 --- a/Makefile +++ b/Makefile @@ -504,7 +504,7 @@ clean: VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 - +qemu-backup.8: contrib/backup/qemu-backup.texi qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..1db63c0 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,139 @@ +@setfilename qemu-backup-tool-manpage + +@documentlanguage en +@documentencoding UTF-8 + +\input texinfo +@settitle Manpage_backup_tool 1.0 +@copying +This is a manpage for qemu_backup_tool, version 1.0. + +Copyright @copyright{} 2016 Free Software Foundation, Inc. +@end copying +@ifinfo +@direntry +* QEMU: (qemu-backup-tool-manpage).Man page for QEMU backup tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU_backup_tool} +@sp 1 +@center @titlefont{Man Page} +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* list of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [ command options]. + +@node list of Commands +@chapter list of Commands +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +@item qemu-backup guest list +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +@item qemu-backup drive list [--guest guestname] +@item qemu-backup backup [--guest guestname] +@item qemu-backup restore [--guest guestname] +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +@item qemu-backup remove [--guest guestname] +@item qemu-backup drive add [--all] [--guest guestname] [--target target] +@item qemu-backup backup [--inc] [--guest guestname] +@end itemize +@node Command Parameters +@chapter Command Parameters +@cindex chapter, first dummy +@itemize +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --target: Destination on which you want your backup to be made. +@item --all: Add all the drives present in a guest for backup except cd-rom. +@item --inc: For incremental backup. +@item --qmp: Path of qmp socket. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +This command adds a guest to the configuration file given its path to qmp socket. +example: +qemu-backup guest add --id=fedora –qmp=/var/run/qemu/fedora.sock + +@item qemu-backup guest list +This commands lists the names of guests which are added to configuration file. + +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +This command adds different drives for backup in a particular guest by giving the name of drive to be backed up and target imagefile in which we want to store the drive backup. +example: +qemu-backup drive add --guest=fedora --id=root +--target=/backup/fedora/root.img +qemu-backup drive add --guest=fedora --id=data +--target=/backup/fedora/data.img + +@item qemu-backup drive list [--guest guestname] +This commands gives the names of the drive present in a guest which are added for backup. +example: qemu-backup drive list --guest=fedora + +@item qemu-backup backup [--guest guestname] + +This command makes the backup of the drives, in their respective given destinations. The ids of drive and their destinations are taken from the configuration file. +example: qemu-backup backup --guest=fedora + +@item qemu-backup restore [--guest guestname] +This command is needed if we want to restore the backup. It will list the commands to be run for performing the same but will not perform any action. +example: qemu-backup restore --guest=fedora +cp /backup/fedora/root.img /var/run/qemu/fedora/root.img +cp /backup/fedora/data.img /var/run/qemu/fedora/data.img + +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +This command helps remove a drive which is set for backup in configuration of given host. +example:
[Qemu-devel] [PATCH v2] Add manpage for QEMU Backup Tool
Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 2 +- contrib/backup/qemu-backup.texi | 139 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index c830d7a..f42cb1d 100644 --- a/Makefile +++ b/Makefile @@ -504,7 +504,7 @@ clean: VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 - +qemu-backup.8: contrib/qemu-backup/qemu-backup.texi qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..1db63c0 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,139 @@ +@setfilename qemu-backup-tool-manpage + +@documentlanguage en +@documentencoding UTF-8 + +\input texinfo +@settitle Manpage_backup_tool 1.0 +@copying +This is a manpage for qemu_backup_tool, version 1.0. + +Copyright @copyright{} 2016 Free Software Foundation, Inc. +@end copying +@ifinfo +@direntry +* QEMU: (qemu-backup-tool-manpage).Man page for QEMU backup tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU_backup_tool} +@sp 1 +@center @titlefont{Man Page} +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* list of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + +qemu-backup command [ command options]. + +@node list of Commands +@chapter list of Commands +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +@item qemu-backup guest list +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +@item qemu-backup drive list [--guest guestname] +@item qemu-backup backup [--guest guestname] +@item qemu-backup restore [--guest guestname] +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +@item qemu-backup remove [--guest guestname] +@item qemu-backup drive add [--all] [--guest guestname] [--target target] +@item qemu-backup backup [--inc] [--guest guestname] +@end itemize +@node Command Parameters +@chapter Command Parameters +@cindex chapter, first dummy +@itemize +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --target: Destination on which you want your backup to be made. +@item --all: Add all the drives present in a guest for backup except cd-rom. +@item --inc: For incremental backup. +@item --qmp: Path of qmp socket. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +This command adds a guest to the configuration file given its path to qmp socket. +example: +qemu-backup guest add --id=fedora –qmp=/var/run/qemu/fedora.sock + +@item qemu-backup guest list +This commands lists the names of guests which are added to configuration file. + +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +This command adds different drives for backup in a particular guest by giving the name of drive to be backed up and target imagefile in which we want to store the drive backup. +example: +qemu-backup drive add --guest=fedora --id=root +--target=/backup/fedora/root.img +qemu-backup drive add --guest=fedora --id=data +--target=/backup/fedora/data.img + +@item qemu-backup drive list [--guest guestname] +This commands gives the names of the drive present in a guest which are added for backup. +example: qemu-backup drive list --guest=fedora + +@item qemu-backup backup [--guest guestname] + +This command makes the backup of the drives, in their respective given destinations. The ids of drive and their destinations are taken from the configuration file. +example: qemu-backup backup --guest=fedora + +@item qemu-backup restore [--guest guestname] +This command is needed if we want to restore the backup. It will list the commands to be run for performing the same but will not perform any action. +example: qemu-backup restore --guest=fedora +cp /backup/fedora/root.img /var/run/qemu/fedora/root.img +cp /backup/fedora/data.img /var/run/qemu/fedora/data.img + +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +This command helps remove a drive which is set for backup in configuration of given host. +example: qemu-backup remove --guest=fedora --id=root + +@item qemu-backup remove [--guest guestname] +This command removes the guest from the configuration file. +example: qemu-backup remove –guest=fedora + +@item qemu-backup drive add --all [-guest guestname] [-destination destination] +This command adds all the drives of the guest for backup other t
[Qemu-devel] [PATCH] Add manpage for QEMU Backup Tool
Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- Makefile| 2 +- contrib/backup/qemu-backup.texi | 147 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 contrib/backup/qemu-backup.texi diff --git a/Makefile b/Makefile index c830d7a..f42cb1d 100644 --- a/Makefile +++ b/Makefile @@ -504,7 +504,7 @@ clean: VERSION ?= $(shell cat VERSION) dist: qemu-$(VERSION).tar.bz2 - +qemu-backup.8: contrib/qemu-backup/qemu-backup.texi qemu-%.tar.bz2: $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)" diff --git a/contrib/backup/qemu-backup.texi b/contrib/backup/qemu-backup.texi new file mode 100644 index 000..41e2b16 --- /dev/null +++ b/contrib/backup/qemu-backup.texi @@ -0,0 +1,147 @@ + + +@setfilename qemu-backup-tool-manpage + +@documentlanguage en +@documentencoding UTF-8 + +\input texinfo +@settitle Manpage_backup_tool 1.0 +@copying +This is a manpage for qemu_backup_tool, version 1.0. + +Copyright @copyright{} 2016 Free Software Foundation, Inc. +@end copying +@ifinfo +@direntry +* QEMU: (qemu-backup-tool-manpage).Man page for QEMU backup tool. +@end direntry +@end ifinfo +@iftex +@titlepage +@sp 7 +@center @titlefont{QEMU_backup_tool} +@sp 1 +@center @titlefont{Man Page} +@sp 3 +@end titlepage +@end iftex +@ifnottex +@node Top +@top Short Sample + +@menu +* Name:: +* Synopsis:: +* list of Commands:: +* Command Parameters:: +* Command Descriptions:: +* License:: +@end menu + +@end ifnottex + +@node Name +@chapter Name + +QEMU disk backup tool. + +@node Synopsis +@chapter Synopsis + + +qemu-backup command [ command options]. + +@node list of Commands +@chapter list of Commands +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +@item qemu-backup guest list +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +@item qemu-backup drive list [--guest guestname] +@item qemu-backup backup [--guest guestname] +@item qemu-backup restore [--guest guestname] +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +@item qemu-backup remove [--guest guestname] +@item qemu-backup drive add [--all] [--guest guestname] [--target target] +@item qemu-backup backup [--inc] [--guest guestname] +@end itemize +@node Command Parameters +@chapter Command Parameters +@cindex chapter, first dummy +@itemize +@item --guest: Name of the guest. +@item --id: id of guest or drive. +@item --target: Destination on which you want your backup to be made. +@item --all: Add all the drives present in a guest for backup except cd-rom. +@item --inc: For incremental backup. +@item --qmp: Path of qmp socket. +@end itemize + +@node Command Descriptions +@chapter Command Descriptions +@cindex chapter, first dummy +@itemize +@item qemu-backup guest add [--id id] [--qmp socketpath] +This command adds a guest to the configuration file given its path to qmp socket. +example: +qemu-backup guest add --id=fedora –qmp=/var/run/qemu/fedora.sock + +@item qemu-backup guest list +This commands lists the names of guests which are added to configuration file. + +@item qemu-backup drive add [--guest guestname] [--id driveid] [--target target] +This command adds different drives for backup in a particular guest by giving the name of drive to be backed up and target imagefile in which we want to store the drive backup. +example: +qemu-backup drive add --guest=fedora --id=root +--target=/backup/fedora/root.img +qemu-backup drive add --guest=fedora --id=data +--target=/backup/fedora/data.img + +@item qemu-backup drive list [--guest guestname] +This commands gives the names of the drive present in a guest which are added for backup. +example: qemu-backup drive list --guest=fedora + +@item qemu-backup backup [--guest guestname] + +This command makes the backup of the drives, in their respective given destinations. The ids of drive and their destinations are taken from the configuration file. +example: qemu-backup backup --guest=fedora + +@item qemu-backup restore [--guest guestname] +This command is needed if we want to restore the backup. It will list the commands to be run for performing the same but will not perform any action. +example: qemu-backup restore --guest=fedora +cp /backup/fedora/root.img /var/run/qemu/fedora/root.img +cp /backup/fedora/data.img /var/run/qemu/fedora/data.img + +@item qemu-backup drive-remove [--guest guestname] [--id driveid] +This command helps remove a drive which is set for backup in configuration of given host. +example: qemu-backup remove --guest=fedora --id=root + +@item qemu-backup remove [--guest guestname] +This command removes the guest from the configuration file. +example: qemu-backup remove –guest=fedora + +@item qemu-backup drive add --all [-guest guestname] [-destination destination] +This command adds all the drives of
[Qemu-devel] [PATCH] Removed trailing newline from error_report()
Signed-off-by: Ishani Chugh <chugh.ish...@research.iiit.ac.in> --- target/arm/kvm64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index 609..a16abc8 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -940,7 +940,7 @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit) * single step at this point so something has gone wrong. */ error_report("%s: guest single-step while debugging unsupported" - " (%"PRIx64", %"PRIx32")\n", + " (%"PRIx64", %"PRIx32")", __func__, env->pc, debug_exit->hsr); return false; } @@ -965,7 +965,7 @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit) break; } default: -error_report("%s: unhandled debug exit (%"PRIx32", %"PRIx64")\n", +error_report("%s: unhandled debug exit (%"PRIx32", %"PRIx64")", __func__, debug_exit->hsr, env->pc); } -- 2.7.4