Montar una unidad alojada en un bloque de volumen en una instancia de Ubuntu en Oracle Cloud

En este tutorial aprenderemos cómo crear un block volume, adjuntarlo a una instancia de cómputo de Ubuntu y, finalmente, montarlo como una unidad de disco en la instancia.

Volúmenes en bloque de Oracle Cloud

El servicio de "Volúmenes en Bloque" (Block Volumes) en Oracle Cloud Infrastructure (OCI) es uno de los componentes de almacenamiento disponibles. Permite la creación y montaje de unidades alojadas en block volumes en las instancias para proporcionar almacenamiento adicional y persistente. Además, al igual que otros muchos recursos de OCI, cuenta con características de seguridad y encriptación, copias de respaldo, escalabilidad y muchas más ventajas.

Crear un Block Volume

Para crear un block volume desde el panel de OCI, abrimos el menú desplegable en la parte izquierda, seleccionamos "Storage" y luego elegimos "Block Volumes".

En esta pantalla, se muestra una tabla que presenta los volúmenes actuales en este compartimento. En este momento, no existe ningún volumen. Al hacer clic en el botón "Crear Block Volume," se iniciará el proceso de creación.

Comenzamos por el nombre del block volume, al que yo he llamado "blockvolume01". A continuación, seleccionamos el compartimento donde se guardará.

Ya hemos discutido los compartimentos en otro tutorial. Recordemos que son espacios aislados entre sí destinados a alojar recursos. Estos nos ayudan a organizar nuestros recursos para mantenerlos ordenados, y su aislamiento proporciona una capa adicional de seguridad.

Dejamos el resto de las configuraciones en sus valores por defecto. Algunas de estas configuraciones se mantienen en su configuración estándar en busca de simplicidad en el proceso de desarrollo, mientras que otras se deben a las limitaciones de recursos en mi cuenta de OCI. En mi caso, no puedo crear un bloque de más de 50 GB ni aumentar su velocidad y capacidad de conexiones.

Una vez que hemos configurado el block volume y pulsamos el botón de "Crear," comenzamos el proceso de aprovisionamiento del recurso. Después de unos breves 15 segundos, veremos su página de detalles con la información de que está en estado "Disponible."

En esta misma pantalla, en la parte inferior izquierda, encontramos el menú "Recursos" con varias opciones relacionadas. Aquí buscamos la opción que dice "Attached Instances" para conectarlo a la instancia que nos interese.

Asociar Block Volume

Antes de continuar, hago un inciso para mostrar los bloques actuales en la instancia antes de adjuntar uno nuevo y poder comparar los cambios. Para ello, usaré el comando lsblk. El comando lsblk en Linux se utiliza para listar información sobre los dispositivos de bloque en el sistema. Estos dispositivos de bloque son generalmente unidades de almacenamiento, como discos duros, unidades SSD y particiones. El comando lsblk proporciona una vista jerárquica de estos dispositivos y sus relaciones.

Abrimos sesión en la instancia y desde la terminal ejecutamos:

ubuntu@ubuntusrv1:~$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0 49.1M  1 loop /snap/core18/2794
loop1     7:1    0 49.1M  1 loop /snap/core18/2788
loop2     7:2    0 59.2M  1 loop /snap/core20/1977
loop3     7:3    0 59.3M  1 loop /snap/core20/2019
loop4     7:4    0 91.9M  1 loop /snap/lxd/23999
loop5     7:5    0 91.9M  1 loop /snap/lxd/24065
loop6     7:6    0 22.6M  1 loop /snap/oracle-cloud-agent/63
loop7     7:7    0   26M  1 loop /snap/oracle-cloud-agent/64
loop9     7:9    0 35.5M  1 loop /snap/snapd/19998
loop10    7:10   0 35.5M  1 loop /snap/snapd/20102
sda       8:0    0 46.6G  0 disk
├─sda1    8:1    0 46.5G  0 part /
└─sda15   8:15   0   99M  0 part /boot/efi

En Linux, los nombres como 'sda', 'sdb', etc., se utilizan para identificar dispositivos de almacenamiento en el sistema. La primera unidad encontrada se llamará 'sda', la segunda 'sdb' y así sucesivamente.

Si nos fijamos en las 3 últimas líneas, informan que tenemos un bloque de tipo "disco" con 2 particiones: una de 46.5 GB y otra de 99 MB.

Dejamos la terminal y volvemos al panel de OCI. Ahora procedemos a adjuntar el bloque. Hacemos clic en el botón "Attach to instance" y se abre una nueva pantalla de configuración.

Comenzando desde arriba, en esta pantalla de configuración de asociación, nos encontramos con la opción de elegir entre "ISCSI" o "Paravirtualizado". Optamos por la segunda opción, siguiendo la recomendación del manual del curso "OCI Foundations Associate (2023)" que recientemente completé. En dicho manual se menciona que podremos utilizar el volumen sin necesidad de ejecutar comandos adicionales. Nota de este humilde autor: en realidad, necesitaremos ejecutar algunos comandos para montar el volumen en la instancia y poder utilizarlo.

En Tipo de acceso, marcamos la opción de Lectura/Escritura.

El último apartado es para seleccionar a qué instancia asociamos el volumen. Dejamos los demás ajustes tal como están por defecto.

Después de presionar el botón, en unos breves segundos, el volumen se asocia a la instancia. Asociado, sí, o adjuntado, como prefieras llamarlo, pero es importante destacar que no está montado. Esto significa que no podemos escribir archivos en él ni ver su contenido, en caso de que lo tenga.

Vamos a recuperar la conexión a la instancia y repetimos el comando lsblk para observar las diferencias:

ubuntu@ubuntusrv1:~$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0 49.1M  1 loop /snap/core18/2788
loop1     7:1    0 49.1M  1 loop /snap/core18/2794
loop2     7:2    0 59.2M  1 loop /snap/core20/1977
loop3     7:3    0 59.3M  1 loop /snap/core20/2019
loop4     7:4    0 91.9M  1 loop /snap/lxd/23999
loop5     7:5    0 91.9M  1 loop /snap/lxd/24065
loop6     7:6    0 22.6M  1 loop /snap/oracle-cloud-agent/63
loop7     7:7    0   26M  1 loop /snap/oracle-cloud-agent/64
loop8     7:8    0 35.5M  1 loop /snap/snapd/19998
loop9     7:9    0 35.5M  1 loop /snap/snapd/20102
sda       8:0    0 46.6G  0 disk
├─sda1    8:1    0 46.5G  0 part /
└─sda15   8:15   0   99M  0 part /boot/efi
sdb       8:16   0   50G  0 disk

Presta atención a la última línea, donde aparece un nuevo bloque llamado "sdb" de tipo "disco" que no está montado, ya que la columna 'MOUNTPOINTS ' (punto de montaje) no muestra ninguna ubicación.

Montar Block Volume en instancia Ubuntu

Para montar el bloque debemos crear un directorio que será su punto de montaje.

sudo mkdir /mnt/mi_nuevo_bloque

Antes de montar el bloque, es necesario formatearlo, ya que actualmente solo existe en forma de archivo. Recuerda que en Linux, todo se trata de archivos, incluidos los discos y los volúmenes.

Puedes formatearlo utilizando el comando sudo mkfs -t ext4 /dev/sdb. Después de realizar la asociación, se creó un archivo en el directorio /dev donde está definido o representado. Es abstracto de explicar, los discos se representan en el directorio /dev pero hasta que no se les da formato no se pueden montar.

ubuntu@ubuntusrv1:~$ sudo mkfs -t ext4 /dev/sdb
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 13107200 4k blocks and 3276800 inodes
Filesystem UUID: c21c5f74-85fa-4c12-81e4-15a66ccdbf83
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done

Lo tenemos todo preparado. Ahora ya si podemos ejecutar el comando mount y montaremos el bloque en el directorio que indicamos.

sudo mount /dev/sdb /mnt/mi_nuevo_bloque

Con esto, ya tenemos una nueva unidad y su directorio raíz listo para almacenar archivos. Este nuevo directorio inicialmente es propiedad de root, por lo que será necesario tener en cuenta la configuración de permisos adecuada para otorgar los permisos correspondientes a los usuarios según nuestras necesidades.

Para obtener información sobre las unidades, podemos utilizar el comando df -h (abreviatura de "disk free"). El parámetro -h se utiliza para mostrar los datos en un formato más legible. Este comando proporciona datos como el nombre de la partición, tamaño y porcentaje de espacio libre, entre otros.

ubuntu@ubuntusrv1:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.2G  1.5M  1.2G   1% /run
/dev/sda1        45G   16G   30G  34% /
tmpfs           5.9G   16K  5.9G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15       98M  299K   98M   1% /boot/efi
tmpfs           1.2G  4.0K  1.2G   1% /run/user/1001
/dev/sdb         49G   32K   47G   1% /mnt/mi_nuevo_bloque

El siguiente apartado explica cómo montar automáticamente la unidad al reiniciar el servidor.

Montar automáticamente la unidad al reiniciar el servidor

Si reiniciamos la instancia, la unidad desaparece de nuestra vista. Su contenido sigue almacenado de manera segura, pero no estará visible si intentamos acceder a él. Para recuperar la unidad, podemos volver a ejecutar la sentencia de montaje o quizás nos interese modificar la configuración de inicio para que la unidad se monte automáticamente al iniciar el servidor.

En Ubuntu y otras distribuciones de Linux, la información relacionada con el montaje de las particiones presentes en el sistema durante el arranque se encuentra en el archivo /etc/fstab.

Actualmente, la instancia contiene esta información en el citado archivo:

sudo cat /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults        0 1
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1

Para cada partición se definen sus características mediante columnas separadas por tab. Analizando la primera línea correspondiente a la primera partición, encontramos:

  • LABEL=cloudimg-rootfs: En lugar de utilizar el dispositivo /dev/sda, aquí se utiliza la etiqueta del sistema de archivos (LABEL) para identificar la partición. Por defecto, esta etiqueta ya viene asignada en mi unidad. Opcionalmente, cuando se monta la unidad, se puede asignar una etiqueta personalizada. Esto es útil porque garantiza que la partición se monte correctamente incluso si el dispositivo cambia de nombre.
    En mi servidor, puedo verificar qué etiqueta tiene cada partición ejecutando el comando blkid:

     blkid
    /dev/sdb: UUID="c21c5f74-85fa-4c12-81e4-15a66ccdbf83" BLOCK_SIZE="4096" TYPE="ext4"
    /dev/sda15: LABEL_FATBOOT="UEFI" LABEL="UEFI" UUID="21F4-B0A5" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="e35247a2-3e2d-4c06-9c10-cd5bb87ca8b1"
    

  • /: Este es el punto de montaje raíz del sistema. Indica que esta partición se montará como la raíz del sistema de archivos. Es la partición principal del sistema.

  • ext4: Este es el tipo de sistema de archivos que se utiliza en la partición. En este caso, es ext4, un sistema de archivos común en Linux.

  • defaults: Estas son las opciones de montaje predeterminadas que se aplican a esta partición. Incluyen opciones como el montaje en modo de lectura y escritura, así como otras configuraciones estándar.

  • 0: Este valor es tomado en cuenta por la aplicación dump. Si es 1 'dump' hará una copia de seguridad de la unidad. Este valor normalmente es 0 porque no suele utilizarse 'dump'.

  • 1: Utilizado por fsck para determinar el orden en el que se comprobarán los sistemas de archivos. Las opciones posibles son 0, 1 y 2. El sistema de archivos raíz debe tener la prioridad más alta, por lo que se le asigna el valor 1, y todos los demás sistemas de archivos que deseemos comprobar deben tener el valor 2. La utilidad fsck no comprobará los sistemas de archivos con un valor de 0 en la columna "pass".

La segunda línea, correspondiente a la segunda partición de /dev/sda, es la partición EFI que almacena archivos de inicio y configuraciones esenciales para el arranque del sistema en entornos UEFI. Este sistema reemplaza al antiguo BIOS, que los más viejunos recordamos de los primeros PC.

La configuración de la nueva unidad unidad que se montará automaticamente la agragamos en la tercera línea. Ejecutamos sudo nano /etc/fstab y modificamos el archivo de la siguiente manera:

Importante: Para evitar errores hay que separar cada parámetro de la línea con el tabulador sin usar espacios.

LABEL=cloudimg-rootfs   /       ext4    defaults        0 1
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
# Montaje de la unidad del bloque de volumen
/dev/sdb        /mnt/mi_nuevo_bloque    ext4    defaults        0 2
  • /dev/sdb: Esta parte especifica el dispositivo de almacenamiento que se montará, el volumen en bloque

  • /mnt/mi_nuevo_bloque: Aquí se indica el directorio en el que se montará el dispositivo.

  • ext4: Esta columna especifica el tipo de sistema de archivos que se encuentra en el dispositivo. 'ext4' es un sistema de archivos comúnmente utilizado en sistemas Linux.

  • defaults: Esta columna contiene opciones de montaje específicas para la partición. En este caso, se utilizan las opciones predeterminadas que incluyen las configuraciones típicas de montaje, como permisos y opciones de escritura

  • 0. No tenemos 'dump' por tanto valor 0

  • 2. A unidades secundarias se le da prioridad de comprobación 2, detrás de la principal que es valor 1.

Antes de reiniciar el servidor, como precaución por si hay errores de sintaxis u otros problemas, y para evitar que el sistema no arranque, es recomendable ejecutar la siguiente sentencia: sudo mount -a. Si aparecen errores, algo está mal en el archivo /etc/fstab. Si todo está correcto, se aplicarán las configuraciones del archivo de la misma manera que al reiniciar el sistema.

Desmontar unidades

El proceso de desmontar unidades es muy simple con el comando unmount seguido como parámetro de la ruta al directorio de punto de montaje. En el escenario de este tutorial, para desmontar la unidad entramos:

sudo umount /mnt/miunidadadicional

Para confirmar que la unidad se ha desmontado correctamente, podemos utilizar el comando que hemos visto anteriormente: df -h.

Como es de suponer, en este escenario al reinicar el servidor se volverá a montar la unidad porque así está configurado el archivo /etc/fstab.

Las unidades desmontadas no pierden los archivos almacenados en ellas. En contraste, es evidente que si eliminamos un volumen en bloque desde el panel de OCI, también se eliminará su contenido.

En el panel OCI para eliminar un bloque primero se debe desasociar de cualquier instancia y entonces se podrá eliminar. Para llegar a ella hay varios caminos. La podemos encontrar a través del menú Storage o del menú Compute. Veremos como llegar a través de esta última.

En "Compute->Instances", buscamos la instancia de la que queremos desasociar el bloque y hacemos clic en su nombre en la tabla para acceder a "Instance Details".

En la parte izquierda, en el menú Resources vamos a la opción 'Attached block volumes'. Aquí nos aparece en una tabla el nombre de la instancia a la cual está asociado, en que estado está, tamaño y otros datos. Entramos en su menú contextual(menú de los 3 puntos a la izquierda) y seleccionamos 'Detach from Instance'. Tras unos segundos el block volume desaparece de la tabla. En este momento, todavía no se ha borrado su contenido y podriamos recuperarla totalmente volviendo a asociar el bloque a cualquier instancia.

El siguiente paso es irreversible. Daremos la orden de detener la provisión del Bloque, y todo su contenido se borrará para siempre. Nuevamente, tenemos varias formas de realizar este paso.

Iremos al menú Storage->Block Volumes y buscamos en la tabla el bloque que queremos detener. Clikamos en su nombre para entrar a la pantalla 'Block Volume Details'. Aquí veremos un gran botón rojo que pone "Terminate". Si lo pulsamos el volumen se detiene y todo su contenido se borrará.

Si pulsamos en el botón 'Terminate' el volumen se detiene y todo su contenido se borrará.

Cuando se finaliza un volumen en bloque, al igual que otros recursos en OCI, seguirá apareciendo en la tabla de recursos, pero en estado "Finalizado" durante aproximadamente 24 horas. Sin embargo, ya no es posible volver a activarlo. Después de un tiempo, se eliminará definitivamente de la lista de recursos existentes.