Todos os volumes Xen domU LVM são corrompidos após a reinicialização

2

Eu estou rodando um Debian Squeeze dom0, e depois de reinicializá-lo todos os 7 dos meus domUs têm corrupção de dados. Cada um é configurado como partição ext3 diretamente em um volume lvm2 separado. Nenhum dos volumes lvm será montado; todos têm superblocos ruins. Eu tentei e2fsck com cada superbloco sem sucesso. O que mais eu posso tentar?

Cada domU tem dois volumes LVM conectados a ele, um para o disco e outro para swap. O disco é montado na raiz, formatado como uma partição ext3 normal como um dispositivo xen-blk. Os volumes nunca são montados fora do sistema operacional convidado. Estou executando o Ubuntu 11.04 usando as instruções aqui . Não tenho certeza se eles não foram desligados corretamente, tudo o que sei é que eles foram corrompidos depois que eu emiti uma 'reinicialização' limpa no dom0.

Aqui está um exemplo do arquivo de configuração do Xen; o resto é o mesmo, exceto pelo nome, vcpus, memória, vif e disco.

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

Existem dois volumes lógicos do LVM conectados a cada VM. Aqui está a saída fdisk -l para o volume de disco:

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

E o volume de troca:

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)
    
por zcs 05.12.2011 / 18:30

3 respostas

1

Tente seu e2fsck a partir do dom0 e use um dispositivo de loop com um deslocamento para mapear a partição. Com sua configuração, o deslocamento seria 512, eu acho. por exemplo

losetup -o512 /dev/loop0 /dev/VolGroup00/VMNAME-disk
e2fsck -p /dev/loop0
    
por 13.12.2011 / 22:23
0

As tabelas de partições dos seus dois LVs parecem estranhas.

O "disco" LV se estende além do seu último cilindro, enquanto as métricas do "swap" LV não parecem corresponder ao LV.

Dentro do Domu xvda1 é montado como "/" e xvdb1 é seu espaço de troca, certo?

Você viu alguma mensagem de "acesso além do fim do disco" em / var / log / messages do seu DomU?

O que acontece se o seu DomU começar a trocar? Você pode forçar isso usando o comando stress .

    
por 13.01.2012 / 22:59
-1

Eu tive esse problema uma vez, só que os domUs são ext3 e dom0 é Centos6.2. Algumas partições do LVM tinham corrupções no sistema de arquivos, algumas tinham superblocos ruins, outras estavam ok. Nós suspeitamos que tinha algo a ver com o SElinux (desligamos o selinux em outro dom0 e eles estavam bem)

    
por 28.10.2012 / 11:34

Tags