ezekiel_25_17_

“El camino del hombre recto esta por todos lados
rodeado por las injusticias de los egoístas
y la tiranía de los hombres malos.
Bendito sea aquel pastor que en nombre de la caridad
y de la buena voluntad saque a los débiles del Valle de la Oscuridad
por que es el autentico guardián de su hermano
y el descubridor de los niños perdidos.
Y os aseguro que vendré a castigar con gran venganza
y furiosa cólera a aquellos que pretendan envenenar y destruir a mis hermanos,
y tu sabrás que mi nombre es Yahvé cuando caiga mi venganza sobre ti”
Ezequiel 25,17

Uno de los aspectos que se buscan en una solución computacional, es que los datos estén siempre disponibles y sean confiables. Bajo este concepto, una de las principales preocupaciones como SysAdmin, es mantener el sistema operativo en buenas condiciones, seguro y con la mejor optimización de recursos posible. Para asegurar la disponibilidad y funcionalidad del sistema operativo existen diversos métodos, uno de los más recurridos es utilizar discos con más de una vía de acceso (ej: un disco accesado mediante dos canales diferentes de fibra óptica), esta técnica con tolerancia a fallos y mejora del rendimiento es conocida comúnmente como multipathing:

diagram

Esta técnica provee al disco, al menos, de dos accesos diferentes: path1path2. Cuando uno de los canales no esta disponible, el disco se puede acceder por el otro canal, sin perder funcionalidad.

Por lo general, cuando un equipo es entregado, debería seguir las recomendaciones mínimas de instalación y administración (o eso quisiéramos 🙁 ); y en caso, contrario, nuestra primer labor es llevarlo al punto donde la administración sea estándar con nuestros demás equipos.

Bajo este concepto, y siempre siguiendo Las Tres Leyes del SysAdmin, imaginemos que nos entregan un server de reciente asignación y observamos que el sistema operativo se encuentra en volúmenes lógicos, pero únicamente sobre un volumen físico:

[root@server ~]# df -h
Filesystem                      Size Used Avail Use% Mounted on
/dev/sda1                       500M 153M 295M  35%  /boot
/dev/mapper/vg_root-lv_root      10G 5.5G 4.5G  62%  /
/dev/mapper/vg_root-lv_home      10G 533M 9.4G   6%  /home
/dev/mapper/vg_root-lv_opt       10G 843M 9.1G   9%  /opt
/dev/mapper/vg_root-lv_tmp       10G 871M 9.1G  10%  /tmp
/dev/mapper/vg_root-lv_usr       10G 995M 9G    11%  /usr
/dev/mapper/vg_root-lv_usrlocal  10G 115M 9.8G   2%  /usr/local
/dev/mapper/vg_root-lv_var       10G 3.7G 6.3G  41%  /var
[root@server ~]# 
[root@server ~]# vgs
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sda2 not /dev/sdc2
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sdd2 not /dev/sda2
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sdc2 not /dev/sdb2
 VG      #PV #LV #SN Attr   VSize   VFree
 vg_root   1   7   0 wz--n- 263.28g 97.28g 
[root@server ~]# 
[root@server ~]# pvs
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sda2 not /dev/sdc2
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sdd2 not /dev/sda2
 Found duplicate PV eeuXgciHmayKUcMWfydf1KYLXBCph7Yo: using /dev/sdc2 not /dev/sdb2
 PV        VG      Fmt  Attr PSize   PFree
 /dev/sda2 vg_root lvm2 a--  263.28g 97.28g 
[root@server ~]#

El cual, al examinar los discos, se observa que los dispositivos mencionados como duplicados son del mismo tamaño, mismos sectores y mismas particiones:

[root@server ~]# fdisk -l | grep GB | grep 322.1
Disk /dev/sda: 322.1 GB, 322122547200 bytes
Disk /dev/sdb: 322.1 GB, 322122547200 bytes
Disk /dev/sdc: 322.1 GB, 322122547200 bytes
Disk /dev/sde: 322.1 GB, 322122547200 bytes
[root@server ~]# fdisk -l | grep "*" | grep -v sectors
/dev/sda1 * 2048 1026047 1024000 500M 83 Linux
/dev/sdb1 * 2048 1026047 1024000 500M 83 Linux
/dev/sdc1 * 2048 1026047 1024000 500M 83 Linux
/dev/sdd1 * 2048 1026047 1024000 500M 83 Linux
[root@server ~]#

Esto quiere decir que el mismo disco es accesado por 4 canales (paths) diferentes.

Entonces, para tenerlo con multipathing, primeramente instalamos y activamos el paquete:

[root@server ~]# yum install -y device-mapper-multipath
...
Installed:
 device-mapper-multipath.x86_64 0:0.4.9-87.el6 

Dependency Installed:
 device-mapper-multipath-libs.x86_64 0:0.4.9-87.el6 libaio.x86_64 0:0.3.107-10.el6 

Complete!
[root@server ~]# mpathconf --enable
[root@server ~]# chkconfig multipathd on
[root@server ~]# chkconfig multipathd --list
multipathd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@server ~]# service multipathd start
Starting multipathd daemon: [ OK ]
[root@server ~]# service multipathd status
multipathd (pid 1573) is running...
[root@server ~]#

Es necesario editar el archivo /etc/multipath.conf, agregando una excepción a la blacklist de multipath. Para esto debemos ubicar el WWID de nuestro disco, utilizando el comando vgscan -vvv:

[root@server ~]# vgscan -vvv | grep sda2 | grep by-id
 /dev/sda2: Aliased to /dev/disk/by-id/scsi-380000970000198701457533030364320-part2 in device cache (preferred name)
[root@server ~]#

Este WWID lo agregamos en el/etc/multipath.conf:

[root@server ~]# egrep -v '^#|^$' /etc/multipath.conf
defaults {
 find_multipaths yes
 user_friendly_names yes
 failback immediate
}
blacklist_exceptions {
 wwid 380000970000198701457533030364320
}
[root@server ~]#

Debido a que nuestro filesystem raíz (/) esta alojado en un volumen lógico, es necesario también, agregar un filtro a los nombres de los dispositivos de multipath en el archivo de configuración de los volúmenes lógicos (/etc/lvm/lvm.conf):

[root@server ~]vi /etc/lvm/lvm.conf
...
filter = [ "a|/dev/mapper/mpath.*|", "r|.*|" ]
...
preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath" ]
...
[root@server ~]#

Por cuestión de seguridad, para que no lea la configuración anterior de los volúmenes lógicos, eliminamos la caché de lvm:

[root@server ~]# rm -rf /etc/lvm/cache/.cache

Con estos cambios, es necesario reconstruir el initramfs, el filesystem virtual que ayuda al sistema a cargar y montar el fs raíz (/), para lo cual utilizamos la herramienta dracut, indicándole que queremos utilizar un disco con multipath y un volumen lógico:

[root@server ~]# dracut --force --add "multipath lvm" --include /etc/multipath /etc/multipath --lvmconf -v

Cuando ha terminado de reconstruir el initramfs, tenemos que reiniciar el equipo para verificar que el filesystem raíz (/) esta ahora bajo el control de multipath:

[root@server ~]# multipath -ll
mpatha (380000970000198701457533030364320) dm-0 EMC,SYMMETRIX
size=300G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
 |- 1:0:0:0 sda 8:0 active ready running
 |- 3:0:0:0 sdc 8:96 active ready running
 |- 2:0:0:0 sdb 8:48 active ready running
 `- 4:0:0:0 sdd 8:144 active ready running
[root@server ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 300G 0 disk
└─mpatha (dm-0) 253:2 0 300G 0 mpath
 ├─mpathap1 (dm-2) 253:3 0 10M 0 part
 ├─mpathap2 (dm-3) 253:4 0 1G 0 part /boot
 └─mpathap3 (dm-4) 253:5 0 263.3G 0 part
 ├─vg_root-lv_opt (dm-7) 253:8 0 10G 0 lvm /opt
 ├─vg_root-lv_var (dm-8) 253:9 0 10G 0 lvm /var
 ├─vg_root-lv_home (dm-9) 253:10 0 10G 0 lvm /home
 ├─vg_root-lv_usrlocal (dm-10) 253:11 0 10G 0 lvm /usr/local
 ├─vg_root-lv_root (dm-5) 253:6 0 10G 0 lvm /
 ├─vg_root-lv_swap (dm-6) 253:7 0 16G 0 lvm [SWAP]
 ├─vg_root-lv_tmp (dm-11) 253:12 0 10G 0 lvm /tmp
 └─vg_root-lv_usr (dm-12) 253:13 0 10G 0 lvm /usr
sdb 8:48 0 300G 0 disk
└─mpatha (dm-0) 253:2 0 300G 0 mpath
 ├─mpathap1 (dm-2) 253:3 0 10M 0 part
 ├─mpathap2 (dm-3) 253:4 0 1G 0 part /boot
 └─mpathap3 (dm-4) 253:5 0 263.3G 0 part
 ├─vg_root-lv_opt (dm-7) 253:8 0 10G 0 lvm /opt
 ├─vg_root-lv_var (dm-8) 253:9 0 10G 0 lvm /var
 ├─vg_root-lv_home (dm-9) 253:10 0 10G 0 lvm /home
 ├─vg_root-lv_usrlocal (dm-10) 253:11 0 10G 0 lvm /usr/local
 ├─vg_root-lv_root (dm-5) 253:6 0 10G 0 lvm /
 ├─vg_root-lv_swap (dm-6) 253:7 0 16G 0 lvm [SWAP]
 ├─vg_root-lv_tmp (dm-11) 253:12 0 10G 0 lvm /tmp
 └─vg_root-lv_usr (dm-12) 253:13 0 10G 0 lvm /usr
sdc 8:96 0 300G 0 disk
└─mpatha (dm-0) 253:2 0 300G 0 mpath
 ├─mpathap1 (dm-2) 253:3 0 10M 0 part
 ├─mpathap2 (dm-3) 253:4 0 1G 0 part /boot
 └─mpathap3 (dm-4) 253:5 0 263.3G 0 part
 ├─vg_root-lv_opt (dm-7) 253:8 0 10G 0 lvm /opt
 ├─vg_root-lv_var (dm-8) 253:9 0 10G 0 lvm /var
 ├─vg_root-lv_home (dm-9) 253:10 0 10G 0 lvm /home
 ├─vg_root-lv_usrlocal (dm-10) 253:11 0 10G 0 lvm /usr/local
 ├─vg_root-lv_root (dm-5) 253:6 0 10G 0 lvm /
 ├─vg_root-lv_swap (dm-6) 253:7 0 16G 0 lvm [SWAP]
 ├─vg_root-lv_tmp (dm-11) 253:12 0 10G 0 lvm /tmp
 └─vg_root-lv_usr (dm-12) 253:13 0 10G 0 lvm /usr
sdd 8:144 0 300G 0 disk
└─mpatha (dm-0) 253:2 0 300G 0 mpath
 ├─mpathap1 (dm-2) 253:3 0 10M 0 part
 ├─mpathap2 (dm-3) 253:4 0 1G 0 part /boot
 └─mpathap3 (dm-4) 253:5 0 263.3G 0 part
 ├─vg_root-lv_opt (dm-7) 253:8 0 10G 0 lvm /opt
 ├─vg_root-lv_var (dm-8) 253:9 0 10G 0 lvm /var
 ├─vg_root-lv_home (dm-9) 253:10 0 10G 0 lvm /home
 ├─vg_root-lv_usrlocal (dm-10) 253:11 0 10G 0 lvm /usr/local
 ├─vg_root-lv_root (dm-5) 253:6 0 10G 0 lvm /
 ├─vg_root-lv_swap (dm-6) 253:7 0 16G 0 lvm [SWAP]
 ├─vg_root-lv_tmp (dm-11) 253:12 0 10G 0 lvm /tmp
 └─vg_root-lv_usr (dm-12) 253:13 0 10G 0 lvm /usr
[root@server ~]#

Después de realizar las pruebas pertinentes de escritura, desconectando y reconectando cada path, es hora de bailar! 😀

Ver en Youtube

Les comparto la documentación de Red Hat al respecto:

Moving root File Systems from a Single Path Device to a Multipath Device

Espero les sirva…