Diferencia entre revisiones de «Sistemas de archivos»
(→Paso 8: Creación de un RAID) |
(→Paso 8.3: Gestionar el almacenamiento) |
||
(No se muestran 72 ediciones intermedias de 3 usuarios) | |||
Línea 9: | Línea 9: | ||
# Repetir el paso anterior y crear otro disco de 4GB | # Repetir el paso anterior y crear otro disco de 4GB | ||
− | + | Para crear un nuevo disco virtual desde el intérprete de órdenes: | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | qemu-img create -f qcow2 mi-disco.img 20G | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | + | Para adjuntar este disco a una máquina virtual existente: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | virsh attach-disk mi-mv /home/usuario/mi-disco.img vdb --cache none --subdriver qcow2 --config | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | vdb | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Esto va a adjuntar el disco virtual creando anteriormente a la máquina virtual cuyo nombre es ''mi-mv'' haciendo uso del driver paravirtualizado ''VirtIO''. | |
+ | |||
+ | Ojo: ''virsh attach-disk'' requiere una ruta absoluta al disco virtual. | ||
− | + | Posible errores: | |
− | |||
− | |||
− | + | * La máquina virtual a la que se quiere adjuntar el nuevo disco no existe | |
+ | <syntaxhighlight lang="bash"> | ||
+ | error: failed to get domain 'mv' | ||
+ | </syntaxhighlight> | ||
− | + | Consulte el listado de máquinas virtuales existentes con ''virsh''. | |
− | + | * El identificador del disco virtual ya existe: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | error: Failed to attach disk | |
+ | error: XML error: target 'vdb' duplicated for disk sources ... | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | En este caso, indica que ''vdb'' ya está en uso para un disco virtual existente, por lo que debe emplear otro identificador tal como ''vdc'', ''vdd'', etc. | |
− | + | Para ver los discos virtuales de una máquina virtual: | |
+ | <syntaxhighlight lang="bash"> | ||
+ | virsh domblklist mv | ||
+ | Target Source | ||
+ | ---------------------------------------------- | ||
+ | hda /home/usuario/ubuntu-cloud.img | ||
+ | vda /home/usuario/mi-disco.img | ||
+ | </syntaxhighlight> | ||
− | + | Para eliminar un discho de la máquina virtual: | |
− | |||
− | |||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | virsh detach-disk mv vda --config | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | = Paso 2: Ver discos en Linux = | |
+ | |||
+ | Volvamos a la vista consola (Vista -> Consola) y arranquemos la máquina (Máquina virtual -> Ejecutar). | ||
+ | |||
+ | Para comprobar los discos añadidos en el paso 1 vamos a utilizar el comando lsblk, el cual nos mostrará una salida similar a la siguiente: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT | |
− | + | sr0 11:0 1 1024M 0 rom | |
− | + | vda 252:0 0 2.2G 0 disk | |
− | + | ├─vda1 252:1 0 2.1G 0 part / | |
− | + | ├─vda14 252:14 0 4M 0 part | |
− | + | └─vda15 252:15 0 106M 0 part /boot/efi | |
+ | vdb 252:16 0 5G 0 disk | ||
+ | vdc 252:32 0 4G 0 disk | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Aqui vemos que tenemos 3 discos: | |
− | |||
− | + | * vda: el actual de ubuntu que añadimos al crear la máquina | |
+ | * vdb: el disco que añadimos en el paso 1 de 5GB | ||
+ | * vdc: el disco que añadimos en el paso 1 de 4GB | ||
+ | También vemos que el disco vda tiene 3 particiones: vda1, vda14 y vda15 | ||
= Paso 3: Creación de particiones en Linux = | = Paso 3: Creación de particiones en Linux = | ||
Línea 87: | Línea 92: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | fdisk /dev/vdb | |
</syntaxhighlight> | </syntaxhighlight> | ||
Línea 96: | Línea 101: | ||
alamacenar la información de las particiones, el formato y si una partición es | alamacenar la información de las particiones, el formato y si una partición es | ||
ejecutable o no. | ejecutable o no. | ||
+ | |||
+ | Recuerda hacer: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | partprobe /dev/vdb | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | para solicitar al sistema operativo que refresque la tabla de particiones. | ||
Una vez hecho esto, veremos que estamos dentro de fdisk (software para | Una vez hecho esto, veremos que estamos dentro de fdisk (software para | ||
Línea 163: | Línea 176: | ||
sistema de archivos en la partición. Para crear un sistema de archivos | sistema de archivos en la partición. Para crear un sistema de archivos | ||
utilizaremos el comando 'mkfs', y tendremos varias opciones a la hora de crear | utilizaremos el comando 'mkfs', y tendremos varias opciones a la hora de crear | ||
− | uno: ext2, ext3, ext4, | + | uno: ext2, ext3, ext4, btrfs, fat, ntfs, etc... |
Nosotros creamos un sistema ext4 para /dev/vdc1 y uno fat para /dev/vdc2: | Nosotros creamos un sistema ext4 para /dev/vdc1 y uno fat para /dev/vdc2: | ||
Línea 181: | Línea 194: | ||
En la salida deberíamos de obtener que tenemos un sistema de ficheros ext4 y | En la salida deberíamos de obtener que tenemos un sistema de ficheros ext4 y | ||
otro FAT. | otro FAT. | ||
− | |||
= Paso 5: Montar y desmontar particiones en Linux = | = Paso 5: Montar y desmontar particiones en Linux = | ||
Línea 227: | Línea 239: | ||
sudo touch /home/ubuntu/part1/nuevoFichero # tenemos que crearlo con sudo porque no tenemos permisos, luego veremos esto | sudo touch /home/ubuntu/part1/nuevoFichero # tenemos que crearlo con sudo porque no tenemos permisos, luego veremos esto | ||
sudo umount /dev/vdc1 | sudo umount /dev/vdc1 | ||
− | ls /home/ubuntu/ | + | ls /home/ubuntu/part1 # el fichero ya no está, la partición fue desmontada |
mkdir /home/ubuntu/part3 | mkdir /home/ubuntu/part3 | ||
sudo mount /dev/vdc1 /home/ubuntu/part3 | sudo mount /dev/vdc1 /home/ubuntu/part3 | ||
Línea 256: | Línea 268: | ||
Cada fila contiene un montaje de una partición, la cual contiene: | Cada fila contiene un montaje de una partición, la cual contiene: | ||
− | * Identificación de la partición: en este caso se está utilizando una etiqueta de | + | * Identificación de la partición: en este caso se está utilizando una etiqueta de la partición, pero podemos utilizar cualquier cosa que identifique al dispositivo, como el uuid o la localización (/dev/vdc1) |
− | |||
− | |||
* Punto de montaje: donde se montará el dispositivo | * Punto de montaje: donde se montará el dispositivo | ||
− | * Sistema de archivos: ext4, | + | * Sistema de archivos: ext4, fat |
− | * Opciones: aquí pondremos las diferentes opciones de montaje, como por ejemplo | + | * Opciones: aquí pondremos las diferentes opciones de montaje, como por ejemplo montar para solo lectura, dar permisos a un usuario para utilizar la partición, etc. Hay que tener en cuenta que cada sistema tiene sus opciones. |
− | |||
− | |||
* backup: si está a cero, no haremos backup | * backup: si está a cero, no haremos backup | ||
* chequeo: si está a cero no se hace chequeo al iniciar | * chequeo: si está a cero no se hace chequeo al iniciar | ||
− | Vamos a añadir unas líneas para montar automáticamente las particiones al | + | Vamos a añadir unas líneas para montar automáticamente las particiones al iniciar: |
− | iniciar: | ||
Utilizando el editor que prefieras, añadir lo siguiente en el fichero | Utilizando el editor que prefieras, añadir lo siguiente en el fichero | ||
Línea 326: | Línea 333: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | = Paso 6: Creación de un RAID = | ||
− | = Paso 6: | + | En este apartado vamos a configurar un RAID 1 (espejo) que nos permite aumentar la fiabilidad. La idea es que si uno de los discos del RAID deja de funcionar, los datos en el sistema de fichero siguen estando disponibles con lo que disponemos de algo de tiempo para reemplazar el disco defectuoso. |
+ | |||
+ | == Paso 6.1: Añadir discos a la máquina virtual == | ||
+ | |||
+ | Como explicamos en el Paso 1, vamos a añadir a una máquina virtual 2 discos duros de 5GB cada uno. | ||
+ | |||
+ | == Paso 6.2: Instalación de la herramienta de mdadm == | ||
+ | |||
+ | Por defecto, esta herramienta viene instalada en el ubuntu cloud server, pero en | ||
+ | el caso de utilizar otra distribución diferente, necesitaremos instalarla: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt install mdadm | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Paso 6.3: Utilización de la herramienta de mdadm == | ||
+ | |||
+ | Empezamos escribiendo el comando, y luego pasamos a explicar los detalles: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/vdb /dev/vdc | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Explicamos los parámetros: | ||
+ | |||
+ | # --create: para crear el raid | ||
+ | # --verbose: nos muestra más información del proceso | ||
+ | # /dev/md0: El nombre del nuevo raid, normalmente se utiliza md0 | ||
+ | # --level=1: crea un raid 1 que es el que queremos | ||
+ | # --raid-devices=2: cantidad de dispositivos que vamos a utilizar, 2 en nuestro caso | ||
+ | # /dev/vdb1: Nombre de la partición 1 | ||
+ | # /dev/vdc1: Nombre de la partición 2 | ||
+ | |||
+ | Una vez ejecutado el comando, creará el RAID 1, pasemos ahora a ver los | ||
+ | detalles: | ||
− | + | <syntaxhighlight lang="bash"> | |
− | + | sudo mdadm --detail /dev/md0 | |
− | + | </syntaxhighlight> | |
− | + | Esto nos mostrará la información del RAID, lo que a nosotros nos interesa son | |
− | + | las últimas líneas: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | Name : ubuntu:0 (local to host ubuntu) | |
+ | UUID : e40ba520:5ed1bd37:5c818550:03a18368 | ||
+ | Events : 17 | ||
+ | |||
+ | Number Major Minor RaidDevice State | ||
+ | 0 252 17 0 active sync /dev/vdb1 | ||
+ | 1 252 33 1 active sync /dev/vdc1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Aqui vemos el UUID de nuestro RAID, y también veremos en las dos última líneas, | |
− | + | las dos particiones, las cuales están marcadas con active sync, esto quiere | |
+ | decir que están activos y sincronizados. Puede que si hacemos muy rápido este | ||
+ | comando, muestre algo diferente porque tarda un poco en sincronizar la primera | ||
+ | vez, pero pronto estará. | ||
+ | |||
+ | == Paso 6.4: Guardar la configuración del RAID == | ||
+ | |||
+ | Vamos a modificar la configuración, tendremos que editar el | ||
+ | fichero /etc/mdadm/mdadm.conf y debajo de la línea que pone '# definitions of | ||
+ | existing MD arrays', añadir lo siguiente: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | ARRAY /dev/md0 UUID=e40ba520:5ed1bd37:5c818550:03a18368 | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Recuerda que el UUID lo puedes consultar con la orden: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --detail /dev/md0 | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Busca el campo UUID. | |
+ | |||
+ | Tras actualizar /etc/mdadm/mdadm.conf, tienes que invocar la siguiente orden: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | update-initramfs -u | |
− | + | </syntaxhighlight> | |
− | + | ||
− | + | Esto asegura que en el próximo arranque el RAID usa la unidad /dev/md0. | |
− | + | ||
− | + | == Paso 6.5: Particionar y formatear el RAID == | |
− | |||
− | |||
− | |||
− | + | Como explicamos en los Pasos 2, 3 y 4, vamos a particionar el disco RAID: | |
− | + | ||
− | + | <syntaxhighlight lang="bash"> | |
− | + | lsblk # comprobamos los dicos, en mi caso sería md0 | |
− | + | sudo fdisk /dev/md0 | |
− | |||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Ahora vamos a formatear la partición: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | / | + | sudo mkfs -t ext4 /dev/md0p1 |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | == Paso 6.6: Montar el RAID == | |
− | + | Como previamente hemos hecho, crearemos una carpeta donde montar el RAID y lo | |
− | + | montaremos usando el comando mount: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <syntaxhighlight lang="bash"> | |
+ | mkdir /home/ubuntu/datos | ||
+ | sudo mount /dev/md0p1 /home/ubuntu/datos | ||
+ | sudo chown -R ubuntu /home/ubuntu/datos | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Así ya tenemos nuestro RAID montado y podemos utilizarlo, vamos a probar a | ||
+ | escribir en él. | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | touch /home/ubuntu/datos/fichero | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Esto está funcionando, pero como comentamos en uno de los pasos previos, el | |
+ | comando mount solo montará el raid temporalmente, para automatizar este montado | ||
+ | al arrancar, tendremos que añadir la siguiente línea a /etc/fstab: | ||
− | = | + | <syntaxhighlight lang="bash"> |
+ | /dev/md0p1 /home/ubuntu/datos ext4 defaults | ||
+ | </syntaxhighlight> | ||
− | + | == Paso 6.7: Comprobar tolerancia a fallos == | |
− | |||
− | |||
− | + | Vamos a probar que sin un disco duro, todo sigue funcionando bien, ya que al | |
− | + | tener un RAID 1 y tener los datos en espejo, no debería de haber problemas. | |
+ | |||
+ | La siguiente orden marca el disco /dev/sdb como dañado: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --fail /dev/md0 /dev/sdb | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Podemos ver con la siguiente orden que el disco aparece como ''faulty'': | |
− | |||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --detail /dev/md0 | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Sin embargo, podemos ver que el sistema de ficheros sigue montado y el contenido sigue estando disponible. | |
− | |||
− | + | <syntaxhighlight lang="bash"> | |
− | + | ls /home/ubuntu/datos/ | |
− | + | </syntaxhighlight> | |
+ | |||
+ | Podéis retirar definitivamente el disco defectuoso con la orden: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --remove /dev/md0 /dev/sdb | |
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Para volver a incluirlo en el RAID: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --add /dev/md0 /dev/sdb | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Podéis consultar que está sincronizando con la orden: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --detail /dev/md0 | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Que mostrará el disco /dev/sdb en estado ''spare rebuilding'' y mostrará el porcentaje de sincronización. | |
+ | |||
+ | Finalmente, para destruir el RAID, basta hacer: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | mdadm --stop /dev/md0 | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | = Paso | + | = Paso 7: Gestión volúmenes (Logic Volume Manager, LVM) = |
− | + | Logic Volume Manager (LVM) es una capa de software que permite crear volúmenes lógicos y mapearlos de manera sencilla sobre dispositivos físicos. | |
− | |||
− | |||
− | |||
− | + | La instalación de LVM es sencilla mediante la orden: | |
− | |||
− | + | sudo apt-get install lvm2 | |
− | |||
− | + | La gestión de LVM se basa en tres conceptos básicos: | |
− | + | * Volúmenes físicos (PV): Representa una unidad de almacenamiento que aprovisiona espacio de almacenamiento para el volumen lógico que vamos a crear. | |
− | + | * Grupo volumen (VG): Representa un almacén de espacio para LVM. Un VG estará compuesto por varios PV, pudiendo tener tantos VG como sean necesarios. | |
+ | * Volumen lógico (LV): Representan unidades lógicas creadas a partir de VG creado previamente. Se podrán crear tantos LV como sean necesarios para un VG. La creación de un LVM genera un archivo especial en /dev, con la forma /dev/nombre_del_grupo/nombre_volumne_logico. El mapeo de espacio desde un LV hasta un PV es configurable pudiendo ser: Lineal, RAID, Cache, ... | ||
− | == Paso | + | == Paso 7.1: Creación de volumen físico LVM (PV) == |
− | + | Para listar las unidades de almacenamiento disponibles en el sistema, empleamos la siguiente orden: | |
− | el | + | |
+ | lsblk | ||
+ | |||
+ | En virtualbox podemos crear nuevas unidades almacenamiento y añadirlas a la máquina virtual. | ||
+ | |||
+ | Para crear un volumen físico en la unidad /dev/sdb, empleamos la orden: | ||
+ | |||
+ | pvcreate /dev/sdb | ||
+ | |||
+ | Recuerde que la unidad /dev/sdb tiene que estar en desuso. | ||
+ | |||
+ | Para ver los volúmenes físicos existentes, empleamos la orden: | ||
+ | |||
+ | pvscan | ||
+ | |||
+ | Para obtener más información: | ||
+ | |||
+ | pvdisplay | ||
+ | |||
+ | Para eliminar un PV, por ejemplo /dev/sdb: | ||
+ | |||
+ | pvremove /dev/sdb | ||
+ | |||
+ | Si reporta error indicando que está en uso, mueve el contenido del volumen que quieres borrar a otro de los volúmenes físicos que forman parte del grupo: | ||
+ | |||
+ | pvmove /dev/sdb /dev/sdc | ||
+ | |||
+ | y prueba a borrarlo de nuevo. La orden ''lsblk'' ofrece información acerca del uso de los volúmenes físicos. | ||
+ | |||
+ | == Paso 7.2: Creación de grupo de volumenes LVM (VG) == | ||
+ | |||
+ | Para crear un grupo, empleamos el comando vgcreate: | ||
+ | |||
+ | vgcreate vg_prueba /dev/sdb /dev/sdc | ||
+ | |||
+ | Esto añade al grupo 'vg_prueba' los volúmenes sdb y sdc, haciendo que la capacidad del grupo sea la capacidad agregada de los PV añadidos. | ||
+ | |||
+ | Para eliminar un grupo vgremove: | ||
+ | |||
+ | vgremove vg_prueba | ||
+ | |||
+ | Para extender un grupo creado (por ejemplo, vg_prueba) con más PV (por ejemplo /dev/sde) usamos el comando vgextend: | ||
+ | |||
+ | vgextend vg_prueba /dev/sde | ||
+ | |||
+ | Para reducir la capacidad de un grupo creado (por ejemplo, vg_prueba) basta con usar el comando vgreduce indicando la unidad (PV) a quitar, por ejemplo /dev/sde: | ||
+ | |||
+ | vgreduce vg_prueba /dev/sde | ||
+ | |||
+ | Para mostrar todos los grupos de volumenes existentes | ||
+ | |||
+ | vgscan | ||
+ | |||
+ | == Paso 7.3: Creación de volumen lógico (LV) == | ||
+ | |||
+ | Para crear un volúmen lógico, empleamos la orden: | ||
+ | |||
+ | lvcreate --name volumen1 --size 100MB vg_prueba | ||
+ | |||
+ | A partir de este momento hay una unidad que se presenta como ''/dev/mapper/vg_prueba-volumen1''. | ||
+ | |||
+ | Podemos ahora formatear el volumen lógico: | ||
+ | |||
+ | mkfs.ext4 /dev/vg_prueba/volumen1 | ||
+ | |||
+ | y montarlo para almacenar información: | ||
+ | |||
+ | mount /dev/vg_prueba/volumen1 /mnt | ||
+ | |||
+ | Puedes extender un volumen lógico en 1 Gbyte de más: | ||
+ | |||
+ | lvextend --size +1GB /dev/vg_prueba/volumen1 | ||
+ | |||
+ | Justo después tienes que redimensionar el sistema de ficheros: | ||
+ | |||
+ | resize2fs /dev/vg_prueba/volumen1 | ||
+ | |||
+ | Puedes comprobar con: | ||
+ | |||
+ | df -h | ||
+ | |||
+ | que el sistema de ficheros en ''volumen1'' ocupa ahora todo el volumen lógico. | ||
+ | |||
+ | Reducir el tamaño de un volumen lógico es un poco más complicado, ¡podrían perder datos si no se realiza correctamente! | ||
+ | |||
+ | Primero, desmontamos el volumen: | ||
+ | |||
+ | umount /mnt/volumen1 | ||
+ | |||
+ | reducir el tamaño del sistema de ficheros, comprobamos la integridad del sistema de ficheros: | ||
+ | |||
+ | e2fsck -f /dev/vg_prueba/volumen1 | ||
+ | |||
+ | Y lo redimensionamos (reducimos de tamaño): | ||
+ | |||
+ | resize2fs /dev/vg_prueba/volumen1 500M | ||
+ | |||
+ | Ahora ya, por último lugar, puedes reducir el tamaño del volumen: | ||
+ | |||
+ | lvreduce --size 500M /dev/vg_prueba/volumen1 | ||
+ | |||
+ | Para comprobar que hay ido todo bien, vuelve a redimensionar el sistema de ficheros para que ocupe todo el espacio disponible. | ||
+ | |||
+ | resize2fs /dev/vg_prueba/volumen1 | ||
+ | |||
+ | Y puedes volver a montar el sistema de ficheros: | ||
+ | |||
+ | mount /dev/vg_prueba/volumen1 /mnt/volumen1 | ||
+ | |||
+ | con | ||
+ | |||
+ | df -h | ||
+ | |||
+ | para comprar el nuevo tamaño disponible de sólo 500 MBytes. | ||
+ | |||
+ | Es posible borrar un volumen lógico: | ||
+ | |||
+ | lvremove /dev/vg_prueba/volumen1 | ||
+ | |||
+ | asegúrate que no está montando, de lo contrario esta órden reportará que el volumen está en uso. | ||
+ | |||
+ | = Paso 8: GlusterFS = | ||
+ | |||
+ | GlusterFS es un sistema de archivos cliente-servidor de almacenamiento en red escalable. También puede consultar [https://docs.gluster.org/en/latest/Administrator-Guide/ official documentation] para más detalles. | ||
+ | |||
+ | Algunos conceptos: | ||
+ | |||
+ | * Nodo: máquina que proporciona espacio de almacenamiento. | ||
+ | * Pool: Un conjunto de nodos. | ||
+ | * Cliente: máquina en la que se monta un volumen | ||
+ | |||
+ | y con respecto al almacenamiento: | ||
+ | |||
+ | * Brick: Unidad mínima de almacenamiento (dada por un sistema de archivos exportado por un nodo). En cada nodo se define un brick. | ||
+ | * Volumen: unidad lógica compuesta por bricks de uno o varios nodos. | ||
+ | |||
+ | == Paso 8.1: Instalar el servidor GlusterFS == | ||
+ | |||
+ | Para instalar Glusterfs: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | apt install glusterfs-server | ||
+ | systemctl enable glusterd | ||
+ | systemctl start glusterd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Puedes consultar los logs en: /var/log/glusterfs/glusterd.log | ||
+ | |||
+ | Puedes comprobar que el servicio está activo verificado que el puerto TCP/24007 está activo: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | ss -ltn | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | La orden ''ss'' muestra con esta opción los servicios TCP (-t) que están escuchando (-l, de ''listen'') y usando la notación numérica (-n). | ||
+ | |||
+ | Si vamos a construir un pool con dos nodos, tenemos que editar /etc/hostname y /etc/hosts de lo contrario tendremos problemas al crear un pool. | ||
+ | |||
+ | '''Si clonas una máquina virtual tras la instalación de los paquetes''', tienes que volver a crear el identificador único del nodo tal [https://wenhan.blog/post/glusterfs-failed-to-probe-a-cloned-peer/ aquí]. | ||
+ | |||
+ | === Paso 8.1.1. Editar /etc/hostname === | ||
+ | |||
+ | Gluster requiere nombres únicos para identificar a las máquinas que forman parte del pool: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | nano /etc/hostname | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Y pones ''ubuntu1''. | ||
+ | |||
+ | Tras esto, hay que reiniciar el sistema para que el cambio de nombre surta efecto. | ||
+ | |||
+ | Para la segunda máquina, pones ''ubuntu2''. Y así sucesivamente. | ||
+ | |||
+ | '''Es fundamental que todas las máquinas del pool tengan nombres únicos, de lo contrario gluster no va a funcionar'''. | ||
+ | |||
+ | === Paso 8.1.2. Editar el /etc/hosts === | ||
+ | |||
+ | Suponiendo que el nodo 2 tiene la dirección IP 192.168.122.75 y el nodo 1 tiene la IP 192.168.122.175, hay que editar /etc/hosts con: | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | 127.0.0.1 localhost | ||
+ | 192.168.122.175 ubuntu1 | ||
+ | 192.168.122.75 ubuntu2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''en todas las máquinas que formen parte del pool'''. | ||
+ | |||
+ | == Paso 8.2: Gestionar el pool de servidores == | ||
+ | |||
+ | Para añadir el nodo 1 y al 2 al mismo pool, desde el nodo 2 hay que invocar: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | gluster peer probe ubuntu1 | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Ahora tienes que comprobar la lista de nodos del clúster en el ''pool'': | |
− | + | <syntaxhighlight lang="bash"> | |
+ | gluster pool list | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | que muestra desde el nodo 1 lo siguiente: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | UUID Hostname State | |
+ | ca4b43a2-aa4b43a2-bb3422cc-a4540010 ubuntu2 Connected | ||
+ | ba4bbba2-bb4bbba2-cc3422cc-aaabff67 localhost Connected | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Comprobar el estado de los nodos: | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | gluster peer status | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | + | que muestra: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | Number of peers: 1 | |
+ | |||
+ | Hostname: ubuntu2 | ||
+ | Uuid: ca4b43a2-aa4b43a2-bb3422cc-a45400S10 | ||
+ | State: Peer in Cluster (Connected) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Es posible borrar un nodo mediante la siguiente orden: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | gluster peer detach ubuntu2 | |
− | + | </syntaxhighlight> | |
− | + | ||
+ | == Paso 8.3: Gestionar el almacenamiento == | ||
+ | |||
+ | En ambos nodos cree una carpeta: | ||
− | + | <syntaxhighlight lang="bash"> | |
− | + | mkdir -p /data/myvol1/brick1 | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | En '''uno''' de los nodos, puede crear el volumen: | |
− | + | ||
− | + | <syntaxhighlight lang="bash"> | |
− | + | gluster volume create myvol1 replica 2 ubuntu1:/data/myvol1/brick1 ubuntu2:/data/myvol1/brick1 | |
− | + | </syntaxhighlight> | |
− | + | '''Nota''': Si la carpeta está en el raíz, entonces hay que añadir ''force'' al final de la orden anterior. | |
− | + | Y para iniciar el volumen: | |
− | para | ||
− | |||
− | |||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | gluster volume start myvol1 | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Para listar los volúmenes existentes: | |
− | = | + | <syntaxhighlight lang="bash"> |
+ | gluster volume list | ||
+ | </syntaxhighlight> | ||
− | + | Puede comprobar la información y el estado del volumen: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | gluster volume info | |
− | + | gluster volume status | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Además, cada nuevo volumen de glusterfs abre un puerto TCP que se puede observar con: | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | ss -ltnp | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | La opción ''-p'' muestra el proceso asociado a dicho puerto, se puede observar que es un proceso de ''glusterfsd''. Esta información sobre los puertos TCP asociados al volumen también aparece en la información de''status'': | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | gluster volume status | |
+ | </syntaxhighlight> | ||
+ | |||
+ | En caso de necesitar borrar un volumen de red, puedes invocar: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | gluster volume stop myvol1 | |
− | + | gluster volume delete myvol1 | |
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | parando el volumen en primer lugar para luego borrarlo. | |
− | + | ||
+ | == Paso 8.4: Cliente GlusterFS == | ||
+ | |||
+ | Primero instala el paquete de cliente de GlusterFS. | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | apt install glusterfs-client | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Desde el cliente, puede montar el volumen con: | |
− | |||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | / | + | mount -t glusterfs ubuntu1:/myvol1 /mnt |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | = Paso 9: Redimensionar tamaño del disco virtual de imagen Ubuntu cloud ya importada en libvirt = | |
− | + | Con la máquina virtual apagada, desde el anfritrión: | |
− | + | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | qemu-img resize ubuntu-18.04-server-cloudimg-arm64.img +8G | ||
+ | </syntaxhighlight> | ||
− | + | Para darle 8 GBytes más de espacio. | |
− | |||
− | + | Ahora, desde la máquina virtual, aumentamos el tamaño de la partición: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | sudo | + | sudo growpart /dev/sda 1 |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Y, a continuación, redimensionamos el sistema de ficheros: | |
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | + | sudo resize2fs /dev/sda1 +8G | |
</syntaxhighlight> | </syntaxhighlight> |
Revisión actual del 17:12 29 nov 2024
Contenido
- 1 Paso 1: Añadir un disco a la máquina virtual
- 2 Paso 2: Ver discos en Linux
- 3 Paso 3: Creación de particiones en Linux
- 4 Paso 4: Formatear partición: crear un sistema de archivos
- 5 Paso 5: Montar y desmontar particiones en Linux
- 6 Paso 6: Creación de un RAID
- 6.1 Paso 6.1: Añadir discos a la máquina virtual
- 6.2 Paso 6.2: Instalación de la herramienta de mdadm
- 6.3 Paso 6.3: Utilización de la herramienta de mdadm
- 6.4 Paso 6.4: Guardar la configuración del RAID
- 6.5 Paso 6.5: Particionar y formatear el RAID
- 6.6 Paso 6.6: Montar el RAID
- 6.7 Paso 6.7: Comprobar tolerancia a fallos
- 7 Paso 7: Gestión volúmenes (Logic Volume Manager, LVM)
- 8 Paso 8: GlusterFS
- 9 Paso 9: Redimensionar tamaño del disco virtual de imagen Ubuntu cloud ya importada en libvirt
Paso 1: Añadir un disco a la máquina virtual
Vamos a usar cualquier máquina virtual de ubuntu cloud que hayamos usado previamente y vamos a añadir dos discos virtuales para hacer pruebas.
- Abrimos la ventana de la máquina virtual a usar
- Nos movemos a Vista -> Detalles, y le damos al botón de 'Agregar hardware'
- Seleccionamos Almacenamiento, le damos un tamaño de 5GB y en el tipo de dispositivo seleccionamos 'dispositivo de disco'. Con estas opciones, pulsamos Finalizar., y ya tendremos nuestro disco creado.
- Repetir el paso anterior y crear otro disco de 4GB
Para crear un nuevo disco virtual desde el intérprete de órdenes:
qemu-img create -f qcow2 mi-disco.img 20G
Para adjuntar este disco a una máquina virtual existente:
virsh attach-disk mi-mv /home/usuario/mi-disco.img vdb --cache none --subdriver qcow2 --config
Esto va a adjuntar el disco virtual creando anteriormente a la máquina virtual cuyo nombre es mi-mv haciendo uso del driver paravirtualizado VirtIO.
Ojo: virsh attach-disk requiere una ruta absoluta al disco virtual.
Posible errores:
- La máquina virtual a la que se quiere adjuntar el nuevo disco no existe
error: failed to get domain 'mv'
Consulte el listado de máquinas virtuales existentes con virsh.
- El identificador del disco virtual ya existe:
error: Failed to attach disk
error: XML error: target 'vdb' duplicated for disk sources ...
En este caso, indica que vdb ya está en uso para un disco virtual existente, por lo que debe emplear otro identificador tal como vdc, vdd, etc.
Para ver los discos virtuales de una máquina virtual:
virsh domblklist mv
Target Source
----------------------------------------------
hda /home/usuario/ubuntu-cloud.img
vda /home/usuario/mi-disco.img
Para eliminar un discho de la máquina virtual:
virsh detach-disk mv vda --config
Paso 2: Ver discos en Linux
Volvamos a la vista consola (Vista -> Consola) y arranquemos la máquina (Máquina virtual -> Ejecutar).
Para comprobar los discos añadidos en el paso 1 vamos a utilizar el comando lsblk, el cual nos mostrará una salida similar a la siguiente:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 2.2G 0 disk
├─vda1 252:1 0 2.1G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
vdb 252:16 0 5G 0 disk
vdc 252:32 0 4G 0 disk
Aqui vemos que tenemos 3 discos:
- vda: el actual de ubuntu que añadimos al crear la máquina
- vdb: el disco que añadimos en el paso 1 de 5GB
- vdc: el disco que añadimos en el paso 1 de 4GB
También vemos que el disco vda tiene 3 particiones: vda1, vda14 y vda15
Paso 3: Creación de particiones en Linux
Vamos a utilizar ahora nuestro disco añadido de 5GB, en el paso anterior deberiamos de haber identificado cual es, en mi caso /dev/vdb, aseguraros cual es el vuestro y comenzaremos a particionar el disco:
fdisk /dev/vdb
Si el disco es nuevo y no ha hecho nada previamente, normalmente viene sin tabla de particiones, así que fdisk se encarga de crear una, seguramente veamos ese mensaje cuando hayamos ejecutado el comando anterior. La tabla de particiones es una pequeña parte del disco que se utiliza para alamacenar la información de las particiones, el formato y si una partición es ejecutable o no.
Recuerda hacer:
partprobe /dev/vdb
para solicitar al sistema operativo que refresque la tabla de particiones.
Una vez hecho esto, veremos que estamos dentro de fdisk (software para particionar un disco), y veremos que este tiene su propia linea de comando.
Ahora veremos la ayuda de fdisk y crearemos una partición de prueba de 3GB
- Introducir la letra 'm' y pulsar Intro, así obtendremos el listado de comandos posibles de fdisk.
- Introducir 'n' y pulsar Intro para crear una nueva partición. Nos preguntará varios detalles:
- Tipo de partición: pulsamos Intro y se asignará primaria por defecto.
- Número de partición: pulsamos Intro y se asignará 1 por defecto.
- Primer sector: pulsamos Intro para que se asigne por defecto.
- Último sector: vamos a crear una partición de 3GB, así que escribimos +3G y pulsamos Intro
- Ya está creada nuestra primera partición, aunque los cambios todavía no se han escrito en disco, para ello, necesitaremos aplicar estos cambios, y lo hacemos con el comando 'w' y pulsando Intro.
- Ahora si, ya tenemos nuestra partición creada. Vamos a comprobar que el cambio está hecho, usando lsblk por ejemplo, deberíamos de obtener algo similar a la siguiente:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 2.2G 0 disk
├─vda1 252:1 0 2.1G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
vdb 252:16 0 5G 0 disk
└─vdb1 252:17 0 3G 0 part
vdc 252:32 0 4G 0 disk
Vamos ahora a crear en el disco de 4GB (vdc en mi caso) dos particiones de 2GB cada una, y la partición de 3GB creada anteriormente, vamos a borrarla:
- sudo fdisk /dev/vdc
- comando 'n' e Intro
- Todos los datos por defecto, excepto el último sector, donde pondremos '+2G'
- Una vez creada la primera partición, antes de escribir a disco, vamos a crear la segunda partición, repetimos los pasos anteriores. Vamos a tener un problema y cuando lleguemos al último paso, nos dirá que 2GB no es posible. Si tenemos un disco de 4GB, ¿Por qué no nos permite crear dos particiones de 2GB? Exacto, por la tabla de particiones. Lo que haremos en el último paso será dejar el valor por defecto, que será todo el disco sobrante.
- Vamos a comprobar antes de escribir los cambios, que todo está bien, comando 'p' e Intro debería de mostrarnos una salida similar a:
Device Boot Start End Sectors Size Id Type
/dev/vdc1 2048 4196351 4194304 2G 83 Linux
/dev/vdc2 4196352 4196351 4194304 2G 83 Linux
- Si todo está correcto, pulsamos 'w' e Intro y aplicamos los cambios
- Ahora entraremos con el disco /dev/vdb para eliminar la partición: sudo fdisk /dev/vdb
- Ahora vamos a eliminar la particion, pulsamos 'd' e Intro. Como solo tenemos una partición, nos la borra directamente, en caso de tener más de una, nos preguntaría cual queremos borrar.
- Aplicamos los cambios: 'w' e Intro
- Comprobamos que todo ha quedado a nuestro gusto con el comando lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 2.2G 0 disk
├─vda1 252:1 0 2.1G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
vdb 252:16 0 5G 0 disk
vdc 252:32 0 4G 0 disk
├─vdc1 252:33 0 2G 0 part
└─vdc2 252:34 0 2G 0 part
Paso 4: Formatear partición: crear un sistema de archivos
Hasta ahora solo hemos definido en la tabla de particiones donde comienza y acaba cada partición, pero no podremos utilizarla hasta que no creemos un sistema de archivos en la partición. Para crear un sistema de archivos utilizaremos el comando 'mkfs', y tendremos varias opciones a la hora de crear uno: ext2, ext3, ext4, btrfs, fat, ntfs, etc...
Nosotros creamos un sistema ext4 para /dev/vdc1 y uno fat para /dev/vdc2:
sudo mkfs -t ext4 /dev/vdc1
sudo mkfs -t fat /dev/vdc2
Una vez hecho esto, vamos a comprobar que se han aplicado bien los cambios:
sudo file -s /dev/vdc1
sudo file -s /dev/vdc2
En la salida deberíamos de obtener que tenemos un sistema de ficheros ext4 y otro FAT.
Paso 5: Montar y desmontar particiones en Linux
Tras haber creado en los pasos anteriores unas particiones y formatearlas, vamos a pasar ahora a montarlas para poderles dar uso. En linux montar una partición significará que asignaremos una carpeta del sistema a una partición, y en ella estará todo el contenido del disco.
Mount y umount
Empezaremos utilizando los comandos mount y umount para montar y desmontar particiones. Vamos a montar las particiones /dev/vdc1 y /dev/vdc2, la primera la montaremos en /home/ubuntu/part1 y la segunda en /home/ubuntu/part2:
mkdir /home/ubuntu/part1 # Creamos la carpeta donde vamos a montar la partición
sudo mount /dev/vdc1 /home/ubuntu/part1 # montamos la partición
Lo mismo con /dev/vdc2
mkdir /home/ubuntu/part2
sudo mount /dev/vdc2 /home/ubuntu/part2
Vamos a ver el contenido de las particiones montadas:
ls /home/ubuntu/part1
ls /home/ubuntu/part2
Veremos que tenemos una carpeta lost+found en el sistema ext4, la cual se utiliza para los errores en el sistema de archivos, cuando hay un error y encontramos un fichero sin referencia, este se añadiría dentro de esta carpeta, y existiría la posibilidad de recuperarlo.
Ahora vamos a crear un nuevo fichero dentro de nuestra partición /dev/vdc1, la vamos a desmontar, y vamos a montarla en otro directorio diferente:
sudo touch /home/ubuntu/part1/nuevoFichero # tenemos que crearlo con sudo porque no tenemos permisos, luego veremos esto
sudo umount /dev/vdc1
ls /home/ubuntu/part1 # el fichero ya no está, la partición fue desmontada
mkdir /home/ubuntu/part3
sudo mount /dev/vdc1 /home/ubuntu/part3
ls /home/ubuntu/part3
Comprobaremos que el fichero creado en /home/ubuntu/part1 lo tenemos ahora en /home/ubuntu/part3, ya que realmente, cuando lo guardamos, estaba en la partición que montamos.
También podemos ver que utilizando el comando lsblk, podremos observar donde está montada la partición.
Montaje automático al iniciar el sistema
Ahora veremos como automatizar el proceso de montaje cada vez que se inicia el sistema, ya que sería tedioso tener que montar todos las particiones cada vez que apagamos y encendemos nuestra máquina.
El proceso de automatizado suele hacerse dentro del fichero /etc/fstab, veamos su contenido:
cat /etc/fstab
Cada fila contiene un montaje de una partición, la cual contiene:
- Identificación de la partición: en este caso se está utilizando una etiqueta de la partición, pero podemos utilizar cualquier cosa que identifique al dispositivo, como el uuid o la localización (/dev/vdc1)
- Punto de montaje: donde se montará el dispositivo
- Sistema de archivos: ext4, fat
- Opciones: aquí pondremos las diferentes opciones de montaje, como por ejemplo montar para solo lectura, dar permisos a un usuario para utilizar la partición, etc. Hay que tener en cuenta que cada sistema tiene sus opciones.
- backup: si está a cero, no haremos backup
- chequeo: si está a cero no se hace chequeo al iniciar
Vamos a añadir unas líneas para montar automáticamente las particiones al iniciar:
Utilizando el editor que prefieras, añadir lo siguiente en el fichero /etc/fstab. Importante hacerlo con sudo para que nos permita escribir en el fichero:
/dev/vdc1 /home/ubuntu/part1 ext4 rw,user,exec 0 0
/dev/vdc2 /home/ubuntu/part2 vfat umask=000 0 0
Una vez guardado los cambios, vamos a aplicarlos sin reiniciar, para comprobar que funciona correctamente:
mount -a # aplica los cambios de fstab sin necesidad de reiniciar
lsblk # comprobar que está bien montado
Ahora vamos a comprobar si nuestro usuario tiene permisos para escribir:
touch /home/ubuntu/part1
touch /home/ubuntu/part2
En el primero no nos dejará y en el segundo no tendremos problemas. Esto funciona así porque los sistemas ext4, para poder tener permisos de escritura, tenemos que darlo sobre el sistema de ficheros, mientras que el sistema fat, tiene la opción umask que ya hace el trabajo. Para tener permisos de escritura con nuestro usuario en la partición, tendremos que darle permiso a la partición para poder escribir en ella, por ejemplo, utilizando el comando chown:
sudo chown ubuntu /home/ubuntu/part1
Si probamos ahora, podremos escribir en la partición de ext4, y al haber dado permisos, ya nos funcionará siempre:
touch /home/ubuntu/part1
Ahora, vamos a desmontar todo y a reiniciar la máquina para comprobar que está todo funciona.
sudo umount /dev/vdc1
sudo umount /home/ubuntu/part2 # Es otra forma de desmontar, dando el punto de montaje
lsblk # comprobamos que no estén montadas
Reiniciamos la máquina (Máquina virtual -> Apagar -> Reiniciar) y comprobamos:
lsblk
Paso 6: Creación de un RAID
En este apartado vamos a configurar un RAID 1 (espejo) que nos permite aumentar la fiabilidad. La idea es que si uno de los discos del RAID deja de funcionar, los datos en el sistema de fichero siguen estando disponibles con lo que disponemos de algo de tiempo para reemplazar el disco defectuoso.
Paso 6.1: Añadir discos a la máquina virtual
Como explicamos en el Paso 1, vamos a añadir a una máquina virtual 2 discos duros de 5GB cada uno.
Paso 6.2: Instalación de la herramienta de mdadm
Por defecto, esta herramienta viene instalada en el ubuntu cloud server, pero en el caso de utilizar otra distribución diferente, necesitaremos instalarla:
sudo apt install mdadm
Paso 6.3: Utilización de la herramienta de mdadm
Empezamos escribiendo el comando, y luego pasamos a explicar los detalles:
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/vdb /dev/vdc
Explicamos los parámetros:
- --create: para crear el raid
- --verbose: nos muestra más información del proceso
- /dev/md0: El nombre del nuevo raid, normalmente se utiliza md0
- --level=1: crea un raid 1 que es el que queremos
- --raid-devices=2: cantidad de dispositivos que vamos a utilizar, 2 en nuestro caso
- /dev/vdb1: Nombre de la partición 1
- /dev/vdc1: Nombre de la partición 2
Una vez ejecutado el comando, creará el RAID 1, pasemos ahora a ver los detalles:
sudo mdadm --detail /dev/md0
Esto nos mostrará la información del RAID, lo que a nosotros nos interesa son las últimas líneas:
Name : ubuntu:0 (local to host ubuntu)
UUID : e40ba520:5ed1bd37:5c818550:03a18368
Events : 17
Number Major Minor RaidDevice State
0 252 17 0 active sync /dev/vdb1
1 252 33 1 active sync /dev/vdc1
Aqui vemos el UUID de nuestro RAID, y también veremos en las dos última líneas, las dos particiones, las cuales están marcadas con active sync, esto quiere decir que están activos y sincronizados. Puede que si hacemos muy rápido este comando, muestre algo diferente porque tarda un poco en sincronizar la primera vez, pero pronto estará.
Paso 6.4: Guardar la configuración del RAID
Vamos a modificar la configuración, tendremos que editar el fichero /etc/mdadm/mdadm.conf y debajo de la línea que pone '# definitions of existing MD arrays', añadir lo siguiente:
ARRAY /dev/md0 UUID=e40ba520:5ed1bd37:5c818550:03a18368
Recuerda que el UUID lo puedes consultar con la orden:
mdadm --detail /dev/md0
Busca el campo UUID.
Tras actualizar /etc/mdadm/mdadm.conf, tienes que invocar la siguiente orden:
update-initramfs -u
Esto asegura que en el próximo arranque el RAID usa la unidad /dev/md0.
Paso 6.5: Particionar y formatear el RAID
Como explicamos en los Pasos 2, 3 y 4, vamos a particionar el disco RAID:
lsblk # comprobamos los dicos, en mi caso sería md0
sudo fdisk /dev/md0
Ahora vamos a formatear la partición:
sudo mkfs -t ext4 /dev/md0p1
Paso 6.6: Montar el RAID
Como previamente hemos hecho, crearemos una carpeta donde montar el RAID y lo montaremos usando el comando mount:
mkdir /home/ubuntu/datos
sudo mount /dev/md0p1 /home/ubuntu/datos
sudo chown -R ubuntu /home/ubuntu/datos
Así ya tenemos nuestro RAID montado y podemos utilizarlo, vamos a probar a escribir en él.
touch /home/ubuntu/datos/fichero
Esto está funcionando, pero como comentamos en uno de los pasos previos, el comando mount solo montará el raid temporalmente, para automatizar este montado al arrancar, tendremos que añadir la siguiente línea a /etc/fstab:
/dev/md0p1 /home/ubuntu/datos ext4 defaults
Paso 6.7: Comprobar tolerancia a fallos
Vamos a probar que sin un disco duro, todo sigue funcionando bien, ya que al tener un RAID 1 y tener los datos en espejo, no debería de haber problemas.
La siguiente orden marca el disco /dev/sdb como dañado:
mdadm --fail /dev/md0 /dev/sdb
Podemos ver con la siguiente orden que el disco aparece como faulty:
mdadm --detail /dev/md0
Sin embargo, podemos ver que el sistema de ficheros sigue montado y el contenido sigue estando disponible.
ls /home/ubuntu/datos/
Podéis retirar definitivamente el disco defectuoso con la orden:
mdadm --remove /dev/md0 /dev/sdb
Para volver a incluirlo en el RAID:
mdadm --add /dev/md0 /dev/sdb
Podéis consultar que está sincronizando con la orden:
mdadm --detail /dev/md0
Que mostrará el disco /dev/sdb en estado spare rebuilding y mostrará el porcentaje de sincronización.
Finalmente, para destruir el RAID, basta hacer:
mdadm --stop /dev/md0
Paso 7: Gestión volúmenes (Logic Volume Manager, LVM)
Logic Volume Manager (LVM) es una capa de software que permite crear volúmenes lógicos y mapearlos de manera sencilla sobre dispositivos físicos.
La instalación de LVM es sencilla mediante la orden:
sudo apt-get install lvm2
La gestión de LVM se basa en tres conceptos básicos:
- Volúmenes físicos (PV): Representa una unidad de almacenamiento que aprovisiona espacio de almacenamiento para el volumen lógico que vamos a crear.
- Grupo volumen (VG): Representa un almacén de espacio para LVM. Un VG estará compuesto por varios PV, pudiendo tener tantos VG como sean necesarios.
- Volumen lógico (LV): Representan unidades lógicas creadas a partir de VG creado previamente. Se podrán crear tantos LV como sean necesarios para un VG. La creación de un LVM genera un archivo especial en /dev, con la forma /dev/nombre_del_grupo/nombre_volumne_logico. El mapeo de espacio desde un LV hasta un PV es configurable pudiendo ser: Lineal, RAID, Cache, ...
Paso 7.1: Creación de volumen físico LVM (PV)
Para listar las unidades de almacenamiento disponibles en el sistema, empleamos la siguiente orden:
lsblk
En virtualbox podemos crear nuevas unidades almacenamiento y añadirlas a la máquina virtual.
Para crear un volumen físico en la unidad /dev/sdb, empleamos la orden:
pvcreate /dev/sdb
Recuerde que la unidad /dev/sdb tiene que estar en desuso.
Para ver los volúmenes físicos existentes, empleamos la orden:
pvscan
Para obtener más información:
pvdisplay
Para eliminar un PV, por ejemplo /dev/sdb:
pvremove /dev/sdb
Si reporta error indicando que está en uso, mueve el contenido del volumen que quieres borrar a otro de los volúmenes físicos que forman parte del grupo:
pvmove /dev/sdb /dev/sdc
y prueba a borrarlo de nuevo. La orden lsblk ofrece información acerca del uso de los volúmenes físicos.
Paso 7.2: Creación de grupo de volumenes LVM (VG)
Para crear un grupo, empleamos el comando vgcreate:
vgcreate vg_prueba /dev/sdb /dev/sdc
Esto añade al grupo 'vg_prueba' los volúmenes sdb y sdc, haciendo que la capacidad del grupo sea la capacidad agregada de los PV añadidos.
Para eliminar un grupo vgremove:
vgremove vg_prueba
Para extender un grupo creado (por ejemplo, vg_prueba) con más PV (por ejemplo /dev/sde) usamos el comando vgextend:
vgextend vg_prueba /dev/sde
Para reducir la capacidad de un grupo creado (por ejemplo, vg_prueba) basta con usar el comando vgreduce indicando la unidad (PV) a quitar, por ejemplo /dev/sde:
vgreduce vg_prueba /dev/sde
Para mostrar todos los grupos de volumenes existentes
vgscan
Paso 7.3: Creación de volumen lógico (LV)
Para crear un volúmen lógico, empleamos la orden:
lvcreate --name volumen1 --size 100MB vg_prueba
A partir de este momento hay una unidad que se presenta como /dev/mapper/vg_prueba-volumen1.
Podemos ahora formatear el volumen lógico:
mkfs.ext4 /dev/vg_prueba/volumen1
y montarlo para almacenar información:
mount /dev/vg_prueba/volumen1 /mnt
Puedes extender un volumen lógico en 1 Gbyte de más:
lvextend --size +1GB /dev/vg_prueba/volumen1
Justo después tienes que redimensionar el sistema de ficheros:
resize2fs /dev/vg_prueba/volumen1
Puedes comprobar con:
df -h
que el sistema de ficheros en volumen1 ocupa ahora todo el volumen lógico.
Reducir el tamaño de un volumen lógico es un poco más complicado, ¡podrían perder datos si no se realiza correctamente!
Primero, desmontamos el volumen:
umount /mnt/volumen1
reducir el tamaño del sistema de ficheros, comprobamos la integridad del sistema de ficheros:
e2fsck -f /dev/vg_prueba/volumen1
Y lo redimensionamos (reducimos de tamaño):
resize2fs /dev/vg_prueba/volumen1 500M
Ahora ya, por último lugar, puedes reducir el tamaño del volumen:
lvreduce --size 500M /dev/vg_prueba/volumen1
Para comprobar que hay ido todo bien, vuelve a redimensionar el sistema de ficheros para que ocupe todo el espacio disponible.
resize2fs /dev/vg_prueba/volumen1
Y puedes volver a montar el sistema de ficheros:
mount /dev/vg_prueba/volumen1 /mnt/volumen1
con
df -h
para comprar el nuevo tamaño disponible de sólo 500 MBytes.
Es posible borrar un volumen lógico:
lvremove /dev/vg_prueba/volumen1
asegúrate que no está montando, de lo contrario esta órden reportará que el volumen está en uso.
Paso 8: GlusterFS
GlusterFS es un sistema de archivos cliente-servidor de almacenamiento en red escalable. También puede consultar official documentation para más detalles.
Algunos conceptos:
- Nodo: máquina que proporciona espacio de almacenamiento.
- Pool: Un conjunto de nodos.
- Cliente: máquina en la que se monta un volumen
y con respecto al almacenamiento:
- Brick: Unidad mínima de almacenamiento (dada por un sistema de archivos exportado por un nodo). En cada nodo se define un brick.
- Volumen: unidad lógica compuesta por bricks de uno o varios nodos.
Paso 8.1: Instalar el servidor GlusterFS
Para instalar Glusterfs:
apt install glusterfs-server
systemctl enable glusterd
systemctl start glusterd
Puedes consultar los logs en: /var/log/glusterfs/glusterd.log
Puedes comprobar que el servicio está activo verificado que el puerto TCP/24007 está activo:
ss -ltn
La orden ss muestra con esta opción los servicios TCP (-t) que están escuchando (-l, de listen) y usando la notación numérica (-n).
Si vamos a construir un pool con dos nodos, tenemos que editar /etc/hostname y /etc/hosts de lo contrario tendremos problemas al crear un pool.
Si clonas una máquina virtual tras la instalación de los paquetes, tienes que volver a crear el identificador único del nodo tal aquí.
Paso 8.1.1. Editar /etc/hostname
Gluster requiere nombres únicos para identificar a las máquinas que forman parte del pool:
nano /etc/hostname
Y pones ubuntu1.
Tras esto, hay que reiniciar el sistema para que el cambio de nombre surta efecto.
Para la segunda máquina, pones ubuntu2. Y así sucesivamente.
Es fundamental que todas las máquinas del pool tengan nombres únicos, de lo contrario gluster no va a funcionar.
Paso 8.1.2. Editar el /etc/hosts
Suponiendo que el nodo 2 tiene la dirección IP 192.168.122.75 y el nodo 1 tiene la IP 192.168.122.175, hay que editar /etc/hosts con:
127.0.0.1 localhost
192.168.122.175 ubuntu1
192.168.122.75 ubuntu2
en todas las máquinas que formen parte del pool.
Paso 8.2: Gestionar el pool de servidores
Para añadir el nodo 1 y al 2 al mismo pool, desde el nodo 2 hay que invocar:
gluster peer probe ubuntu1
Ahora tienes que comprobar la lista de nodos del clúster en el pool:
gluster pool list
que muestra desde el nodo 1 lo siguiente:
UUID Hostname State
ca4b43a2-aa4b43a2-bb3422cc-a4540010 ubuntu2 Connected
ba4bbba2-bb4bbba2-cc3422cc-aaabff67 localhost Connected
Comprobar el estado de los nodos:
gluster peer status
que muestra:
Number of peers: 1
Hostname: ubuntu2
Uuid: ca4b43a2-aa4b43a2-bb3422cc-a45400S10
State: Peer in Cluster (Connected)
Es posible borrar un nodo mediante la siguiente orden:
gluster peer detach ubuntu2
Paso 8.3: Gestionar el almacenamiento
En ambos nodos cree una carpeta:
mkdir -p /data/myvol1/brick1
En uno de los nodos, puede crear el volumen:
gluster volume create myvol1 replica 2 ubuntu1:/data/myvol1/brick1 ubuntu2:/data/myvol1/brick1
Nota: Si la carpeta está en el raíz, entonces hay que añadir force al final de la orden anterior.
Y para iniciar el volumen:
gluster volume start myvol1
Para listar los volúmenes existentes:
gluster volume list
Puede comprobar la información y el estado del volumen:
gluster volume info
gluster volume status
Además, cada nuevo volumen de glusterfs abre un puerto TCP que se puede observar con:
ss -ltnp
La opción -p muestra el proceso asociado a dicho puerto, se puede observar que es un proceso de glusterfsd. Esta información sobre los puertos TCP asociados al volumen también aparece en la información destatus:
gluster volume status
En caso de necesitar borrar un volumen de red, puedes invocar:
gluster volume stop myvol1
gluster volume delete myvol1
parando el volumen en primer lugar para luego borrarlo.
Paso 8.4: Cliente GlusterFS
Primero instala el paquete de cliente de GlusterFS.
apt install glusterfs-client
Desde el cliente, puede montar el volumen con:
mount -t glusterfs ubuntu1:/myvol1 /mnt
Paso 9: Redimensionar tamaño del disco virtual de imagen Ubuntu cloud ya importada en libvirt
Con la máquina virtual apagada, desde el anfritrión:
qemu-img resize ubuntu-18.04-server-cloudimg-arm64.img +8G
Para darle 8 GBytes más de espacio.
Ahora, desde la máquina virtual, aumentamos el tamaño de la partición:
sudo growpart /dev/sda 1
Y, a continuación, redimensionamos el sistema de ficheros:
sudo resize2fs /dev/sda1 +8G