Un Librepensador

Vive y deja vivir en libertad, igualdad y fraternidad.

 

RHEL cambiar LVM de root de single path a multipath [solved] 


RHEL cambiar LVM de root de single path a multipath [solved]
RHEL Change LVM boot from single path to multipath [solved]

Tras varios dias de una exhaustiva investigación y con la ayuda del soporte de RHEL no habiamos conseguido cambiar el arranque de una máquina ya instalada en single path con el arranque en una LUN a multipath sin tener que reinstalar.
Investigando e investigando, mi equipo y yo destripamos el initrd para ver como demonios lo solucionabamos.
Total, que juntando las piezas de TODO google, mas TODO RHEL, EUREKA, tenemos un método infalible para convertir el arranque de single path a multipath sobre root en un LVM sin cargarnos nada... Allá van los pasos:

1. Coger el initrd de la máquina en cuestión y copiarselo a un directorio de trabajo.
2. Descomprimirlo con esto:
gunzip < ../initrd-2.6.18-164.el5.img | cpio -i --make-directories
3. Trastear en los ficheros... aqui viene lo interesante: Varias cosas importantes, lo primero, copiar todos los archivos en el bin que va a necesitar para arrancar, alla van, bueno, mejor os pongo el arbol con el contenido del initrd descomprimido:  
|-- bin
|   |-- dmraid
|   |-- dmsetup
|   |-- insmod
|   |-- kpartx
|   |-- lvm
|   |-- modprobe -> /sbin/nash
|   |-- mpath_prio_alua
|   |-- mpath_prio_emc
|   |-- mpath_prio_hds_modular
|   |-- mpath_prio_hp_sw
|   |-- mpath_prio_intel
|   |-- mpath_prio_netapp
|   |-- mpath_prio_ontap
|   |-- mpath_prio_rdac
|   |-- mpath_prio_tpc
|   |-- mpath_prio_weighted
|   |-- multipath
|   |-- nash
|   `-- scsi_id
|-- dev
|   |-- console
|   |-- mapper
|   |-- null
|   |-- ptmx
|   |-- ram -> ram1
|   |-- ram0
|   |-- ram1
|   |-- rtc
|   |-- systty
|   |-- tty
|   |-- tty0
|   |-- tty1
|   |-- tty10
|   |-- tty11
|   |-- tty12
|   |-- tty2
|   |-- tty3
|   |-- tty4
|   |-- tty5
|   |-- tty6
|   |-- tty7
|   |-- tty8
|   |-- tty9
|   |-- ttyS0
|   |-- ttyS1
|   |-- ttyS2
|   |-- ttyS3
|   `-- zero
|-- etc
|   |-- lvm
|   |   `-- lvm.conf
|   |-- multipath.conf
|   `-- scsi_id.config
|-- init
|-- lib
|   |-- dm-log.ko
|   |-- dm-mem-cache.ko
|   |-- dm-message.ko
|   |-- dm-mirror.ko
|   |-- dm-mod.ko
|   |-- dm-multipath.ko
|   |-- dm-raid45.ko
|   |-- dm-region_hash.ko
|   |-- dm-round-robin.ko
|   |-- dm-snapshot.ko
|   |-- dm-zero.ko
|   |-- ehci-hcd.ko
|   |-- ext3.ko
|   |-- firmware
|   |-- jbd.ko
|   |-- ohci-hcd.ko
|   |-- qla2xxx.ko
|   |-- scsi_dh.ko
|   |-- scsi_mod.ko
|   |-- scsi_transport_fc.ko
|   |-- sd_mod.ko
|   |-- shpchp.ko
|   |-- uhci-hcd.ko
|   `-- usb-storage.ko
|-- proc
|-- sbin -> bin
|-- sys
|-- sysroot
`-- var
    `-- lib
        `-- multipath
            `-- bindings
En el lib observareis que tengo el qla2xxx.ko, esto es porque tengo Qlogic, si teneis emulex u otra cosa, pues ya sabeis, se pone el módulo correspondiente. Vale, ahora lo divertido, hay que buscar las LUN que teneis en single path de arranque y swap y coger sus WWID, esto, depende de vuestra instalacion, lo podeis mirar directamente en la cabina de discos o sacarlas con comandos linux. En este caso hablamos de que el arranque es LVM, por lo que la unidad fisica de disco hay que buscarla bajo el... como ? asi:
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda rootvg lvm2 a- 5.88G 448.00M
Ok, ya sabemos en que unidad esta el ROOTVG, vale, ahora a por su wwid:
# scsi_id -g -u -s /block/sda
y sale un numero como este:
450a98000572d456e4c4aba644c711234
APUNTADLO poniendo que este el boot LVM, que esto es el meollo de la cuestión Tambien tenemos que apuntar el numero del swap:
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb        partition       4192924 0       -1
Y ahora a por su wwid:
# scsi_id -g -u -s /block/sdb
450a98000572d456e4c4aba644c711444
APUNTADLO poniendo que este es el de swap. Vale, ahora a editar ficheros con vuestro editor favorito, el primero (todos los paths son a partir de directorio que ha creado la descompresion del initrd, el arbolito que he puesto antes):
# vi ./etc/multipath.conf
Se pone esto:
defaults {
user_friendly_names yes
}

blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^(hd|xvd|vd)[a-z]*"
wwid "*"
}

# Make sure our multipath devices are enabled.

blacklist_exceptions {
wwid "450a98000572d456e4c4aba644c711234"
wwid "450a98000572d456e4c4aba644c711444"
}
O sea, los wwid que habeis apuntado... El siguiente fichero:
# vi ./var/lib/multipath/bindings

# Multipath bindings, Version : 1.0
#
# Format:
# alias wwid
#
# ESTE ES EL ROOT
mpath1 450a98000572d456e4c4aba644c711234
#
# ESTE ES EL SWAP
mpath0 450a98000572d456e4c4aba644c711444

os lo imaginais, ¿ no ? Ok, a por otro fichero:
# vi ./init
(si, si, es un script, jejeje), os lo pongo entero porque este no lo teneis, los drivers de las HBA poned los vuestros:
#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/urandom c 1 9
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading scsi_transport_fc.ko module"
insmod /lib/scsi_transport_fc.ko
echo "Loading qla2xxx.ko module"
insmod /lib/qla2xxx.ko
echo "Loading shpchp.ko module"
insmod /lib/shpchp.ko
echo "Loading usb-storage.ko module"
insmod /lib/usb-storage.ko
echo Waiting for driver initialization.
stabilized /proc/bus/usb/devices
echo "Loading dm-mod.ko module"
insmod /lib/dm-mod.ko
echo "Loading dm-log.ko module"
insmod /lib/dm-log.ko
echo "Loading dm-mirror.ko module"
insmod /lib/dm-mirror.ko
echo "Loading dm-zero.ko module"
insmod /lib/dm-zero.ko
echo "Loading dm-snapshot.ko module"
insmod /lib/dm-snapshot.ko
echo "Loading scsi_dh.ko module"
insmod /lib/scsi_dh.ko
echo "Loading dm-multipath.ko module"
insmod /lib/dm-multipath.ko
echo "Loading dm-round-robin.ko module"
insmod /lib/dm-round-robin.ko
echo "Loading dm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko
echo "Loading dm-region_hash.ko module"
insmod /lib/dm-region_hash.ko
echo "Loading dm-message.ko module"
insmod /lib/dm-message.ko
echo "Loading dm-raid45.ko module"
insmod /lib/dm-raid45.ko
echo Waiting for driver initialization.
stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
echo Creating multipath devices
/bin/multipath -v 0 450a98000572d456e4c4aba644c711234
dmsetup ls --target multipath --exec 'kpartx -a -p p'
echo Scanning and configuring dmraid supported devices
echo Scanning logical volumes
lvm vgscan --ignorelockingfailure
echo Activating logical volumes
lvm vgchange -ay --ignorelockingfailure  rootvg
resume /dev/mapper/mpath0p1
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/sdc
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
Buscar la linea que pone
/bin/multipath -v 0 450a98000572d456e4c4aba644c711234
y cambiais el wwid por el vuestro de la lun de LVM de boot root, ok ? Vale, ya teneis la estructura del initrd, ahora a crear un initrd. Os meteis en el directorio en cuestion donde teneis el arbol y poneis:
find . | cpio --create --'format=newc' | gzip > ../initrd-mpath-2.6.18-164.el5.img
luego copiad esta imagen al directorio /boot. Esto crea una imagen de RamDisk arrancable por el kernel de esta version, ahora, si sabeis algo de grub y tal os imaginareis lo que viene. Os vais al directorio /boot/grub y cambiad el device.map asi:
# cat /boot/grub/device.map
(hd0)     /dev/mapper/mpath1
(hd10)     /dev/sdk
La primera linea es importante, tiene que coincidir con el var/lib/multipath/bindings del initrd que hemos creado. La segunda linea os juro por la virgen que no tengo ni idea de para que sirve, pero no molesta. :-) Vale, ahora editamos el menu.lst y que quede parecido a esto:
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/rootvg/lv_root
        initrd /initrd-2.6.18-164.el5.img
title RHEL Multipathboot (2.6.18-164.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/rootvg/lv_root
        initrd /initrd-mpath-2.6.18-164.el5.img
title Other
        rootnoverify (hd10,4)
        chainloader +1
Ok, la opcion 1 la he puesto por defecto, vale... pues eso, Ahora una cosa importante, antes de reiniciar hay que cepillarse el /etc/blkid/blkid.tab, porque si no el RHEL se aprende el camino, y va por donde no es. Este fichero te lo puedes cargar tranquilamente ya que lo regenera al arrancar, lo malo es que si existe de antes peta, ya que no ve los mismos caminos que teniamos y se pierde. Total, si lo habeis hecho todo bien, reiniciad y cuando arranque el comando pvs os mostrara algo parecido a esto:
PV         VG     Fmt  Attr PSize  PFree
  /dev/dm-2  rootvg lvm2 a-    5.88G 448.00M
y el swapon -s esto:
Filename                                Type            Size    Used    Priority
/dev/dm-1         partition       4192924 0       -1

Hala,

** Ah, se me olvidaba, el
./etc/scsi_id.config
tiene que tener esto.
vendor="ATA",options=-p 0x80
¿ Porqué ? no sé, pero funciona... :-)

2 comentarios:
Esto es lo que estaba buscando, muchas gracias tio

envíado por Anonymous Anónimo el 07 octubre, 2011 13:00  Enlace a este comentario.
 
Por estas cosas (entre otras que tu conoces) me lamento de haber dejado tu equipo :-)

Buen trabajo!!!!

envíado por Anonymous Anónimo el 07 octubre, 2011 13:24  Enlace a este comentario.
 
Envíanos tu comentario.