All Xen domU LVM volumes corrupt after reboot

Posted by zcs on Server Fault See other posts from Server Fault or by zcs
Published on 2011-12-05T17:30:15Z Indexed on 2012/10/28 11:06 UTC
Read the original article Hit count: 519

Filed under:
|

I'm running a Debian Squeeze dom0, and after rebooting it all 7 of my domUs have data corruption. Each is setup as ext3 partition directly on a separate lvm2 volume. None of the lvm volumes will mount; all have bad superblocks. I've tried e2fsck with each superblock to no avail. What else can I try?

Each domU has two LVM volumes connected to it, one for the disk and one for swap. The disk is mounted at root, formatted as a normal ext3 partition as a xen-blk device. The volumes are never mounted outside of the guest OS. I'm running Ubuntu 11.04 using the instructions here. I'm not sure that they didn't shutdown properly, all I know is they were corrupt after I issues a clean 'reboot' on the dom0.

Here's a sample Xen config file; the rest are the same except for name, vcpus, memory, vif and disk.

name = 'load1'
vcpus = 2
memory = 512
vif = ['bridge=prbr0', 'bridge=eth0']
disk = ['phy:/dev/VolGroup00/load1-disk,xvda,w','phy:/dev/VolGroup00/load1-swap,xvdb,w']
#============================================================================
# Debian Installer specific variables
def check_bool(name, value):
    value = str(value).lower()
    if value in ('t', 'tr', 'tru', 'true'):
        return True
    return False
global var_check_with_default
def var_check_with_default(default, var, val):
    if val:
        return val
    return default
xm_vars.var('install', use='Install Debian, default: false', check=check_bool)
xm_vars.var("install-method",
        use='Installation method to use "cdrom" or "network" (default: network)',
        check=lambda var, val: var_check_with_default('network', var, val))

# install-method == "network"
xm_vars.var("install-mirror",
        use='Debian mirror to install from (default: http://archive.ubuntu.com/ubuntu)',
        check=lambda var, val: var_check_with_default('http://archive.ubuntu.com/ubuntu', var, val))
xm_vars.var("install-suite",
        use='Debian suite to install (default: natty)',
        check=lambda var, val: var_check_with_default('natty', var, val))

# install-method == "cdrom"
xm_vars.var("install-media",
        use='Installation media to use (default: None)',
        check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-cdrom-device",
        use='Installation media to use (default: xvdd)',
        check=lambda var, val: var_check_with_default('xvdd', var, val))

# Common options
xm_vars.var("install-arch",
        use='Debian mirror to install from (default: amd64)',
        check=lambda var, val: var_check_with_default('amd64', var, val))
xm_vars.var("install-extra",
        use='Extra command line options (default: None)',
        check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-installer",
        use='Debian installer to use (default: network uses install-mirror; cdrom uses /install.ARCH)',
        check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-kernel",
        use='Debian installer kernel to use (default: uses install-installer)',
        check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-ramdisk",
        use='Debian installer ramdisk to use (default: uses install-installer)',
        check=lambda var, val: var_check_with_default(None, var, val))

xm_vars.check()

if not xm_vars.env.get('install'):
    bootloader="/usr/sbin/pygrub"
elif xm_vars.env['install-method'] == "network":
    import os.path
    print "Install Mirror: %s" % xm_vars.env['install-mirror']
    print "Install Suite: %s" % xm_vars.env['install-suite']
    if xm_vars.env['install-installer']:
        installer = xm_vars.env['install-installer']
    else:
        installer = xm_vars.env['install-mirror']+"/dists/"+xm_vars.env['install-suite'] + \
                "/main/installer-"+xm_vars.env['install-arch']+"/current/images"
    print "Installer: %s" % installer
    print
    print "WARNING: Installer kernel and ramdisk are not authenticated."
    print

if xm_vars.env.get('install-kernel'):
    kernelurl = xm_vars.env['install-kernel']
else:
    kernelurl = installer + "/netboot/xen/vmlinuz"

if xm_vars.env.get('install-ramdisk'):
    ramdiskurl = xm_vars.env['install-ramdisk']
else:
    ramdiskurl = installer + "/netboot/xen/initrd.gz"

import urllib
class MyUrlOpener(urllib.FancyURLopener):
    def http_error_default(self, req, fp, code, msg, hdrs):
        raise IOError("%s %s" % (code, msg))
urlopener = MyUrlOpener()

try:
    print "Fetching %s" % kernelurl
    kernel, _ = urlopener.retrieve(kernelurl)
    print "Fetching %s" % ramdiskurl
    ramdisk, _ = urlopener.retrieve(ramdiskurl)
except IOError, _:
    raise

elif xm_vars.env['install-method'] == "cdrom":
    arch_path = { 'i386': "/install.386",
              'amd64': "/install.amd" }

    if xm_vars.env['install-media']:
        print "Install Media: %s" % xm_vars.env['install-media']
    else:
        raise OptionError("No installation media given.")

    if xm_vars.env['install-installer']:
        installer = xm_vars.env['install-installer']
    else:
        installer = arch_path[xm_vars.env['install-arch']]

    print "Installer: %s" % installer

    if xm_vars.env.get('install-kernel'):
        kernelpath = xm_vars.env['install-kernel']
    else:
        kernelpath = installer + "/xen/vmlinuz"

    if xm_vars.env.get('install-ramdisk'):
        ramdiskpath = xm_vars.env['install-ramdisk']
else:
    ramdiskpath = installer + "/xen/initrd.gz"

    disk.insert(0, 'file:%s,%s:cdrom,r' % (xm_vars.env['install-media'],
                                       xm_vars.env['install-cdrom-device']))

    bootloader="/usr/sbin/pygrub"
    bootargs="--kernel=%s --ramdisk=%s" % (kernelpath, ramdiskpath)
    print "From CD"
else:
    print "WARNING: Unknown install-method: %s." % xm_vars.env['install-method']

if xm_vars.env.get('install'):
    # Figure out command line
    if xm_vars.env['install-extra']:
        extras=[xm_vars.env['install-extra']]
    else:
        extras=[]

# Reboot will just restart the installer since this file is not
# reparsed, so halt and restart that way.
    extras.append("debian-installer/exit/always_halt=true")
extras.append("--")
extras.append("quiet")

console="hvc0"
try:
    if len(vfb) >= 1:
        console="tty0"
except NameError, e:
    pass

extras.append("console="+ console)

extra = str.join(" ", extras)
print "command line is \"%s\"" % extra root

There are two LVM logical volumes connected to each VM. Here's the fdisk -l output for the disk volume:

Disk /dev/VolGroup00/VMNAME-disk: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00029c01

                    Device Boot      Start         End      Blocks   Id  System
/dev/VolGroup00/VMNAME-disk1               1        1045     8386560   83  Linux

And the swap volume:

Disk /dev/VolGroup00/VMNAME-swap: 536 MB, 536870912 bytes
37 heads, 35 sectors/track, 809 cylinders
Units = cylinders of 1295 * 512 = 663040 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004faae

                Device Boot      Start         End      Blocks   Id  System
/dev/VolGroup00/VMNAME-swap1               2         809      522240   82  Linux swap / Solaris
Partition 1 has different physical/logical beginnings (non-Linux?):
     phys=(0, 32, 33) logical=(1, 21, 19)
Partition 1 has different physical/logical endings:
     phys=(65, 36, 35) logical=(808, 4, 28)

© Server Fault or respective owner

Related posts about xen

Related posts about lvm