[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] flush guest page cache and suspend?

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 capabilities.

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 snapshot:

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 file=/dev/vg_virt/wtitv,if=ide,index=0,boot=on -net nic,macaddr=00:16:3e:57:45:4f,vlan=0,model=e1000 -net tap,fd=14,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -usbdevice tablet -vnc

and here's the xml config file for libvirt, same guest:

<domain type='kvm'>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='hd'/>
  <clock offset='utc'/>
    <disk type='block' device='disk'>
      <source dev='/dev/vg_virt/wtitv'/>
      <target dev='hda' bus='ide'/>
    <interface type='bridge'>
      <mac address='00:16:3e:57:45:4f'/>
      <source bridge='br1'/>
      <model type='e1000'/>
    <console type='pty'>
      <target port='0'/>
    <input type='tablet' bus='usb'/>
    <graphics type='vnc' autoport='yes'/>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]