Ir al contenido principal

Añadir disco en caliente a un Ubuntu virtualizado

 

En este artículo vamos a explicar cómo aumentar un volumen de discos en una máquina virtual. Pongamos por caso que tenemos un servidor que se nos ha quedado corto de espacio en disco y que no podemos parar. La solución es añadir un nuevo disco virtual a nuestra máquina y, con ese espacio añadido, extender el volumen de discos. 
En principio, este es un proceso en el que no hay pérdida de datos. Sin embargo, es conveniente que exista una copia de seguridad antes de llevarlo a cabo como precaución. He de decir que yo lo he hecho en un par de ocasiones y no ha habido problemas con la máquina virtual ni con los datos. De hecho, los usuarios ni se enteraron de que se amplió el espacio en disco.

Consideraciones iniciales

En primer lugar, este es un proceso que sólo se puede llevar a cabo en una máquina virtual. Para añadir un disco nuevo en una máquina física hay que pararla y, por lo tanto, no se puede añadir en caliente. Cierto es que la parte de extender el volumen sí que se realiza igual haya una parada de la máquina como no.
En segundo lugar, para realizar las operaciones descritas en este artículo, el sistema ha de haberse instalado usando volúmenes lógicos (LVM). En un ordenador personal no es muy importante usar LVM, pero es una opción muy recomendable en servidores.
Las pruebas las voy a realizar usando VMware Workstation 16 Player y KVM+Qemu, versión 4.2.1. En VirtualBox, al menos en la versión que tengo instalada (6.1), no se puede añadir un nuevo disco si la máquina se encuentra en funcionamiento. Por lo que no habrá pruebas para este hipervisor. Imagino, aunque ya no puedo dar fe de eso, que si utilizan otro hipervisor distinto de los ya mencionados, también se puede seguir lo que explicaré en este artículo, salvo la diferencia de cómo añadir el disco a una máquina virtual en funcionamiento.

Añadir el nuevo hardware del disco a la máquina virtual

Como hemos dicho, la máquina virtual con el Ubuntu instalado debe estar ejecutándose para estas pruebas.

Añadir el disco en VMware Workstation 16 Player

Para añadir un disco con la máquina en funcionamiento debemos abrir las propiedades de la máquina virtual. Como se puede observar en la imagen. Para llegar a eso debemos seleccionar la opción del menú Virtual Machine y luego elegir Virtual Machine Settings. Se nos mostrará la pantalla con las propiedades de la imagen.
A continuación en la pantalla de propiedades le daremos al botón Add para añadir nuevo hardware. De todo el hardware disponible, dejaremos seleccionado Hard Disk y le daremos al botón de Next:
En la siguiente pantalla seleccionaremos el tipo de disco. Lo recomendado es usar SCSI y ese es el que he dejado:
De hecho, si nos fijamos en los mensajes sólo se pueden añadir discos con la máquina en marcha si son del tipo SCSI o SATA. Pasamos a la siguiente pantalla en donde seleccionaremos el disco que queremos usar. En nuestro caso se trata de un nuevo disco.

El siguiente paso es indicar el tamaño del disco que estamos añadiendo. Para esta prueba dejaremos el tamaño de 20GB que viene por defecto. También he dejado la opción que indica que el disco se distribuirá en varios archivos.
La ubicación del disco también la he dejado por defecto, así se guardará con la máquina virtual.

Tras terminar con el asistente, en las propiedades de la máquina virtual aparecerá  un nuevo disco duro a la punta abajo de la lista del hardware instalado.

Añadir el disco en KVM+QEmu

Para añadir el disco desde una máquina ejecutándose con KVM+QEmu y que hemos lanzado usando el Gestor de máquinas virtuales, que expliqué como instalar en el artículo Virtualización con KVM, tenemos que seleccionar la opción del menú Vista llamada Detalles. O bien, picar en el icono azul con una i en su interior de la barra de herramientas.
Una vez en la vista Detalles, veremos todo el hardware que compone nuestra máquina virtual. Para añadir un nuevo disco le damos al botón Agregar hardware que se encuentra en la parte inferior izquierda de la ventana.
Se nos abre otra ventana de diálogo en el que tendremos que seleccionar Almacenamiento para poder añadir el disco adicional.
En esta parte sólo tenemos que seleccionar el tamaño del disco que vamos a añadir y el Tipo de bus que tiene que ser SCSI. Le damos a Finalizar y ya está el disco añadido.

Añadir el disco a VM para que Ubuntu lo reconozca

En este apartado añadimos el disco a Ubuntu. Es necesario para que lo reconozca el sistema. Posteriormente deberemos crear la partición, formatearlo, etc. Esto se explica en el siguiente apartado.

Los datos de los dispositivos SCSI de nuestra máquina virtual los podemos mirar en /proc/scsi/scsi. Así, en este momento en que sólo hemos creado el disco virtual, este fichero nos indicará los dispositivos SCSI detectados en el momento de arrancar. Si abrimos una terminal y mostramos el contenido del fichero veremos algo como esto:
En esta información podemos observar que hay dos dispositivos: 
  1. En el Host: scsi3 channel: 00 Id: 00: Lun: 00 tenemos el lector de CD-ROM.
  2. En el Host: scsi32 channel: 00 Id: 00: Lun: 00 tenemos el disco duro con el que creamos la máquina virtual.
Vamos a hacer una pausa para explicar cada uno de los parámetros que identifican a un dispositivo SCSI.
  • Host: identifica a la controladora SCSI a la que está enchufado el dispositivo.
  • Channel: en canal SCSI es un conector físico en la controladora SCSI, donde conecta un cable SCSI. Las unidades múltiples (u otros dispositivos SCSI) se pueden conectar a un solo canal SCSI que forma una cadena, y todos ellos compartirán la misma conexión física y ancho de banda. Cada dispositivo se identificará en el canal por su propia ID de SCSI. Por lo general, el número máximo de dispositivos es 15, más el propio controlador, para un total de 16 identificaciones posibles. Un solo controlador SCSI puede tener múltiples canales; De esta manera, ambos pueden administrar más dispositivos y proporcionar un rendimiento más alto.
  • Id: es el identificador del dispositivo dentro del canal SCSI.
  • Lun (Logical Unit Number): Es el número de unidad lógica. En el almacenamiento de la computadora, se usa un número para identificar la unidad lógica. La unidad lógica es un dispositivo dirigido por el protocolo SCSI o los protocolos SAN, como el canal de fibra o el iSCSI, que encapsulan iSCSI.
Visto esto baste decir que en nuestra máquina virtual suele haber dos Host, con un sólo canal y no hay unidades lógicas. Por lo tanto, al añadir un nuevo disco lo hacemos en el mismo Host en el que se encuentra el disco actual. Así que para identificarlo sólo hay que variar el parámetro correspondiente al Id
Por lo tanto, para añadir el nuevo disco al sistema, debemos indicarle de que dispositivo se trata. En la misma terminal ejecutamos el siguiente comando, entrando en la shell del superusuario con sudo -i, para nuestro ejemplo:
echo "scsi add-single-device" 32 0 1 0 > /proc/scsi/scsi
Indicando que queremos añadir un dispositivo simple en el host 32, canal 0, Id 1 y Lun 0.
Mostrando de nuevo el contenido del archivo /proc/scsi/scsi vemos que el nuevo disco se ha añadido y ya es posible que el Ubuntu lo reconozca.

Podemos observar que aparece con el Id 1.

Añadir el disco al volumen lógico.

Como vamos a añadir el disco a un grupo de volúmenes. Recuerden que creamos nuestra máquina virtual usando LVM, tendremos que seguir una serie de pasos en el orden correcto. Éstos son los que se describen a continuación. Debemos ser superusuarios para poder llevarlos a cabo.

Identificar el disco recién añadido

Para identificarlo usaremos la orden fdisk:
fdisk -l
En mi caso se detecta como /dev/sdb:
Disco /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectores
Disk model: VMware Virtual S
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes

Listamos los grupos de volúmenes físicos

El siguiente paso es ver los volúmenes físicos creados en nuestro sistema. Seguimos en la terminal como superusuario:
#vgs
VG #PV #LV #SN Attr VSize VFree
vgubuntu 1 2 0 wz--n- <19,50g 36,00m
Vemos que disponemos de un grupo de volúmenes llamado vgubuntu.

Crear el nuevo volumen físico con el disco recién añadido

Ahora tenemos que crear un volumen físico con el disco que añadimos, para poder posteriormente añadirlo a los volúmenes lógicos. Usamos lo siguiente
pvcreate /dev/sdb
Como dijimos antes nuestro disco fue identificado como /dev/sdb, si en tu caso es otra letra de unidad debes usar la que identificaste.
Ahora tenemos que extender el volumen físico para que se agrege el espacio del nuevo disco.
vgextend vgubuntu /dev/sdb
Tras esta operación se puede comprobar que hay espacio libre y que ahora el grupo de volúmenes tiene dos volúmenes físicos (columna #PV) repitiendo la orden vgs. Si hacemos df -h vemos, sin embargo, que no se ha ampliado el tamaño del volumen lógico.

Ampliar el volumen lógico

Es el momento de sumar el tamaño del disco al volumen lógico para que se pueda utilizar.
Lo primero que haremos será ver los volúmenes lógicos que hay previamente a las operaciones que vamos a realizar. Esto nos servirá de comprobación. Usaremos el comando:
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root vgubuntu -wi-ao---- <18,51g
swap_1 vgubuntu -wi-ao---- 976,00m
Podemos observar que hay dos volúmenes lógicos: root y swap_1. Y que el tamaño del root se de menos de 18,51 GB.
Ahora debemos consultar el path del volumen lógico para ampliarlo. Usaremos el comando df -h que nos mostrará que está en /dev/mapper/vgubuntu-root. Así que ejecutaremos el comando para extender el volumen de esta manera:
#lvextend -l +100%FREE /dev/mapper/vgubuntu-root
Con esto hemos añadido el 100% del espacio libre del volumen físico al volumen lógico vgubuntu-root.
Si en este paso comparamos la salida de los comandos lvs y df -h. Podemos ver que con el primero ya se añadió el espacio del disco adicional, pero que con el segundo comando el volumen lógico sigue teniendo el mismo espacio.
Ya solo nos queda ampliar el tamaño del sistema de ficheros. Como dije al principio, esta es una operación para agregar tamaño al sistema, por lo que no debería haber pérdida de datos. Otra cosa sería que fuéramos a reducir el tamaño en disco...
#resize2fs /dev/mapper/vgubuntu-root
Ahora sí que el comando df -h nos muestra todo el espacio añadido.

Y con esto hemos terminado de añadir un nuevo disco en caliente a nuestra máquina virtual y ampliar el tamaño del volumen lógico para el total del disco añadido.





Comentarios

Entradas populares de este blog

Atom ha muerto, viva Zed

El día 8 de junio de 2022, Microsoft anunció que a partir del día 31 de diciembre de este mismo año dejaría de dar soporte para el editor de código Atom .  ¿En qué nos afecta esto a nosotros? Bueno, pues si me han seguido en artículos anteriores saben que tras una comparativa de varios IDEs había decidido utilizar Atom para los ejemplos que tuviera que hacer en este blog. Sobre todo los artículos que prepararé para ilustrar el uso de Laravel . Amén de los miles de programadores que actualmente usan Atom  en sus proyectos, claro. Pero, ¿qué editor de código abierto podremos utilizar para sustituir a Atom ? En el mismo comunicado, Microsoft explicaba que el abandono del proyecto Atom  se debía a que querían volcar todos sus esfuerzos en el Visual Studio Code y, por supuesto, recomendó a los usuarios de Atom la utilización del mismo como alternativa natural. No quiero entrar en las bondades o defectos del Visual Studio Code  si quieres elegirlo como tu IDE para desarrollo predeterm

Zed: ahora un editor de código de código abierto

  Zed: ahora un editor de código de código abierto Introducción Como ya les comenté en un artículo anterior  Atom ha muerto, viva ZED , Microsoft dejó de dar soporte para el editor de código Atom en el año 2022 en beneficio del Visual Studio Code . En aquel artículo les comentaba que para mi el sucesor de Atom era Zed pues era un editor que se estaba creando por el mismo grupo de trabajo que creó el Atom . Además de que parecía que iba a seguir con la misma filosofía con la que nació  Atom . El editor Zed, una descripción de sus características Zed es un editor de código desarrollado en Rust que, como deberíamos saber, es un lenguaje de programación de sistemas que se enfoca en la seguridad, el rendimiento y la concurrencia. Pues, como decíamos, Zed acaba de dar el salto a ser de código abierto bajo la licencia GPL v3 . Este cambio no solo representa una nueva era para Zed , sino que también nos dirige a un nuevo mundo de colaboración y desarrollo en el ámbito de la programación.