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