[libvirt] flush guest page cache and suspend?
marco at esiway.net
Wed Nov 4 17:16:27 UTC 2009
I'm new to this list. I've searched the archives (and google) but I
haven't found an answer.
Recently I moved to CentOS 5.4, with libvirt-0.6.3 and kvm-83. They are
rather new compared to 5.3 ones, so I'm still investigating on the new
My guests disk images are LV single devices, /dev/vg_virt/<guestname>,
usually with two partitions, the root fs and swap space.
I'd like to run backups on the node only, taking snapshots of the LVs.
I'm already doing that, actually. Everything works fine, using bacula
(with one minor glitch, but that's for another list).
Now I wonder if it makes sense to suspend the guest before creating the
virsh suspend <guestname>
lvcreate --snapshot ...
virsh resume <guestname>
... perform backup ...
lvremove -f <the snapshot>
but thinking about it a second time it seems it doesn't add anything to
the equation, the filesystem is still potentially unclean, with data to
be written still in the guest page cache. The filesystem is ext3, so
it's not that bad (recovers a consistent state from the journal, with
standard options even data-consistent, not just metadata-consistent).
Yet it's like doing a backup of a (potentially badly) crashed
filesystem. While I trust the recovery step of ext3, my feeling is that
it can't be 100% reliable. I have (rarely) seen ext3 crash and ask for
fsck at boot, journal or not (for truth's sake, I can't rule out an hard
disk problem in those cases).
So, first question: does the suspend command cause a flush in the guest
OS (details: both guest and node are CentOS 5.4, hypervisor is qemu-kvm)?
I guess not (otherwise I won't be here). So if not, what are the options
to force the sync?
Ideally, there should be a single atomic 'sync & suspend'. In practice,
I can think of some workarounds: ssh <guest> -c sync, or the very
old-fashioned way of enabling the 'sync' user and logging in from the
serial console, or issuing a sysrq-s, again on the console.
I'm interested in the latter, but I wasn't able to trigger the sysrq
from either 'virsh console <guestname>' or 'screen `virsh ttyconsole
<guestname>` (tried minicom, too). The serial console is on pty, I'm not
even sure you can generate a break on a pty. (and yes, I remembered to
sysctl -w kernel.sysrq=1 on the guest).
I know XEN has 'xm sysrq', but this is kvm. Is there anything similar? I
think it can be done if you invoke qemu-kvm from the command line with
-nographics (it multiplexes the console and the monitor lines on
stdin/out, and you can send a 'break' with C-a b I think, I've never tried).
So question 2): is there a way to send a sysrq-s to the guest?
My fallback plan is to try and map the serial line over telnet instead
of pty, and the figure out a way to send the break (which I think is
part of the telnet protocol) from the command line. I'd rather not mess
with telnet and local port assignment to the guests, if not necessary.
My really fallback plan is to revert to shutdown/snapshot/create, which
is overkill for a daily backup.
Question 3): does it _really_ make sense to try and sync the guest OS
page cache before taking the snapshot? Or is it just me being paranoid?
For reference, here's the qemu cmdline of one of the guests:
/usr/libexec/qemu-kvm -S -M pc -m 512 -smp 1 -name wtitv -uuid
445d0fe5-c1b6-4baf-a186-da1fe021158c -monitor pty -pidfile
/var/run/libvirt/qemu//wtitv.pid -boot c -drive
tap,fd=14,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb
-usbdevice tablet -vnc 127.0.0.1:0
and here's the xml config file for libvirt, same guest:
<type arch='x86_64' machine='pc'>hvm</type>
<disk type='block' device='disk'>
<target dev='hda' bus='ide'/>
<input type='tablet' bus='usb'/>
<graphics type='vnc' autoport='yes'/>
More information about the libvir-list