summaryrefslogtreecommitdiffstats
path: root/caution/qemu-snapshot-isolation.sh
blob: ae22611f1e7c174da41e1f142a6b7c71c4dcff1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash -
# libguestfs
# Copyright (C) 2011 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, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

# Test that qemu snapshots are really isolating writes from the
# underlying disk image.  If this test were to fail, you could expect
# libguestfs to cause massive disk corruption on live guests.

set -e

rm -f test1.img test2.img test3.img

truncate -s 100M test1.img
test1_md5sum="$(md5sum test1.img | awk '{print $1}')"
truncate -s 100M test2.img
test2_md5sum="$(md5sum test2.img | awk '{print $1}')"
qemu-img create -f qcow2 test3.img 100M
test3_md5sum="$(md5sum test3.img | awk '{print $1}')"

# The vitally important calls are 'add-drive-ro' and
# 'add-drive-opts ... readonly:true'.
../fish/guestfish <<'EOF'
add-drive-ro test1.img
add-drive-opts test2.img format:raw readonly:true
add-drive-opts test3.img format:qcow2 readonly:true
run

part-disk /dev/sda mbr
part-disk /dev/sdb mbr
part-disk /dev/sdc mbr

mkfs ext2 /dev/sda1
copy-size /dev/sda1 /dev/sdb1 5M
pvcreate /dev/sdc1
vgcreate VG /dev/sdc1
lvcreate LV VG 80
mkfs ext3 /dev/VG/LV

mkmountpoint /a
mount-options "" /dev/sda1 /a
mkmountpoint /b
mount-options "" /dev/sdb1 /b
mkmountpoint /c
mount-options "" /dev/VG/LV /c

write /a/test "This is a test"
write /b/test "This is a test"
write /c/test "This is a test"

# Really try hard to force writes to the disk.
umount-all
sync

EOF

# Now verify that the original disks have not been touched.
function serious_error
{
    echo
    echo
    echo "***** SERIOUS ERROR *****"
    echo "qemu's snapshot isolation does not appear to be working."
    echo "Running libguestfs could cause disk corruption on live guests."
    echo
    echo "DO NOT USE libguestfs before you have resolved this problem."
    echo
    exit 1
}

if [ "$(md5sum test1.img | awk '{print $1}')" != "$test1_md5sum" ]; then
    serious_error
fi
if [ "$(md5sum test2.img | awk '{print $1}')" != "$test2_md5sum" ]; then
    serious_error
fi
if [ "$(md5sum test3.img | awk '{print $1}')" != "$test3_md5sum" ]; then
    serious_error
fi

rm test1.img test2.img test3.img