Resize de discos en caliente y nuevos discos (sin reinicios)
Como administradores de infraestructura cloud, una tarea que muchos de nosotros hemos tenido que realizar (y seguiremos realizando), es adaptarnos a los requisitos de nuestros clientes respecto a las necesidades de almacenamiento que se establecen y que evolucionan/cambian en el tiempo.
A la hora de realizar estas operaciones (añadir nuevos discos o redimensionar discos existentes) en una instancia, la mejor de las situaciones que podemos encontrar es que sin más acciones, la instancia virtualizada detecte dichos cambios de discos, ya sea un nuevo disco o el cambio de tamaño de uno ya existente.
No obstante, en nuestro día a día hemos topado con sistemas de virtualización y/o sistemas operativos que no han detectado automáticamente estos cambios en discos.
Esto presenta un problema en muchas circunstancias cuando se trabaja en entornos productivos, ya que reiniciar una instancia para que detecte los cambios aplicados en discos puede no ser trivial.
En este artículo, vamos a enseñar cómo nosotros forzamos al SO a detectar cambios en discos.
Disco nuevo
En esta ocasión, nos encontramos ante una instancia que tiene únicamente un disco de 50GB.
Entre las distintas formas de listar los discos y particiones, vamos a usar “fdisk”, con el flag -l o –list para visualizar esta información:
En este momento, el disco es identificado como /dev/sda y podemos ver también sus particiones /dev/sda1 , /dev/sda2 y /dev/sda3.
Podemos visualizar la información de los discos y/o particiones montadas en el sistema con el comando “df”, y entre sus muchos argumentos/flags, utilizamos -h para una lectura más comprensible de la información mostrada.
Como podemos ver en el sistema de virtualización (en este caso VMWare), la instancia únicamente tiene el disco de 50GB que habíamos detectado antes.
Procedemos a añadir un disco de 2GB.
Una vez que ya tenemos el disco nuevo asignado a la instancia, comprobamos si ésta detecta el nuevo disco:
Como podemos ver, aunque nuestro disco de 2GB ya está configurado y asignado a la instancia nuevamente con el comando “fdisk -l”, observamos que no hay discos nuevos y únicamente vemos el disco de “50GB /dev/sda”.
Para actualizar la información de los discos sin necesidad de reiniciar, es necesario que forcemos un “scan” del bus scsi del host.
Para forzar dicho scan ejecutaremos el comando:
echo “- - -” > /sys/class/scsi_host/host0/scan
** Nótese que los guiones del string, están separados por un espacio. En el ejemplo puede verse cómo únicamente es válido el string con dichos guiones separados por espacio. No es válido ni “echo 1 > …” ni “echo ‘---’ > … “, etc.
En la imagen anterior, podemos observar como en la sección 1 (en rojo) únicamente detectamos el disco de 50GB, pero no vemos el nuevo de 2GB.
En la sección 2 (en cyan), podemos ver el comando utilizado para forzar el rescaneo del bus scsi (comandos inválidos y comando final válido).
En la sección 3 (en azul), vemos como al listar nuevamente los discos y particiones está reflejado el disco nuevo de 2GB que habíamos asignado a la instancia, en este caso identificado como /dev/sdb.
Resize de disco en caliente
En esta ocasión vamos a tratar un caso similar, pero en vez de añadir un disco nuevo, aumentaremos el tamaño de uno ya existente.
Para ello, utilizaremos el disco nuevo que hemos asignado anteriormente y doblaremos su tamaño de 2GB a 4GB.
Tras modificar el tamaño del disco y establecerlo a 4GB, comprobamos con “fdisk -l” los discos y particiones existentes:
Aunque el resize de nuestros disco ya ha sido realizado en el sistema de virtualización y el nuevo tamaño ha sido asignado, seguimos detectando que nuestros disco (/dev/sdb) sigue siendo de 2GB.
En este caso, para reescanear un disco ya existente, es necesario que forcemos el rescan de esa unidad.
Para ello, necesitamos saber el bus scsi en el que está conectado así como la unidad en cuestión (el disco) dentro de los discos conectados a ese bus.
En muchas ocasiones, nuestro sistema de virtualización nos facilita esa información. Como podemos observar en imágenes anteriores, a la hora de añadir un disco nuevo, seleccionamos el "bus" y la "unidad". También podemos visualizar estos datos de los discos ya asignados.
De no disponer de esta información en nuestro sistema de virtualización, podemos hacer uso de la herramienta “lsscsi”, permitiéndonos visualizar los discos conectados y la información del bus y unidad:
En el recuadro izquierdo (1) podemos identificar el bus (en este caso 0:0:1:0), en el recuadro derecho (2) vemos la información del disco.
Una vez que tenemos identificado el bus y dispositivo/unidad a rescanear, forzamos el rescan utilizando el siguiente comando:
echo 1 > “/sys/class/scsi_device/0:0:1:0/device/rescan”
En la imagen anterior, podemos observar como en la sección 1 (en rojo) el tamaño detectado de nuestro disco /dev/sdb sigue siendo de 2GB.
En la sección 2 (en cyan), podemos ver el comando utilizado para forzar el rescaneo del dispositivo/disco/unidad con el comando indicado.
En la sección 3 (en azul), vemos como al listar nuevamente los discos y particiones ya tenemos reflejado el nuevo tamaño del disco /dev/sdb, habiendo actualizado finalmente el tamaño a 4GB.