“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:
Esta técnica provee al disco, al menos, de dos accesos diferentes: path1 y path2. 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! 😀
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…