Curso de Ubuntu 26.04 / Preparar un disco adicional y montarlo con fstab

El montaje automático de discos adicionales se configura conectando el UUID y el punto de montaje del sistema de archivos real. No asuma que está escribiendo en el disco deseado solo porque se ven los archivos; también debe verificar las condiciones de reinicio y la ausencia del dispositivo.

Verificar el dispositivo y los datos existentes antes de formatear

lsblk -o NAME,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
findmnt -rno SOURCE,TARGET,FSTYPE,OPTIONS

La práctica de montaje comienza en un disco de práctica separado que ya tiene un sistema de archivos. Compare la capacidad, la etiqueta y el UUID, y excluya la raíz, el arranque y los dispositivos de copia de seguridad existentes. Si solo hay un disco nuevo vacío, realice primero el procedimiento de preparación siguiente, y no formatee los discos que deben restaurar datos existentes.

Preparar un nuevo disco de práctica vacío como ext4

Conectar un nuevo archivo VDI y preparar un sistema de archivos ext4 son cosas diferentes. Para crear un disco de práctica nuevo de 8 GiB sin datos originales en VirtualBox, cierre la VM y vaya a Configuración → Almacenamiento → Agregar disco duro al controlador de almacenamiento, y cree un nuevo disco virtual. No seleccione discos existentes ni discos físicos del host.

En la consola del servidor, use el siguiente script de preparación. Se aplica solo a un nuevo VDI vacío y requiere lsblk, wipefs, fdisk de util-linux, udevadm y mkfs.ext4 de e2fsprogs. Verifique las herramientas con command -v e instale los paquetes faltantes revisando su origen. Compare primero la capacidad, modelo y número de serie del nuevo disco de la herramienta de virtualización y la ruta /dev/disk/by-id; si no está seguro, deténgase.

Dentro de fdisk, se crea GPT con g y se agrega una nueva partición con n. Puede usar los valores predeterminados de número, inicio y fin, pero solo guarde con w después de verificar nuevamente el objetivo y el rango con p. Si está incorrecto, cancele con q antes de w. Esto no es un procedimiento para inicializar un disco que ya tiene datos, y si existen firmas, particiones o montajes previos, el script se detendrá.

Si el disco contiene datos que desea conservar, omita la inicialización y compruebe el dispositivo y su UUID. Guarde el bloque completo en un archivo nuevo ~/prepare-empty-lab-disk.sh, sin reemplazar un script existente, y ejecútelo con bash ~/prepare-empty-lab-disk.sh /dev/disk/by-id/RUTA_REAL_DEL_DISCO_NUEVO. Las confirmaciones requieren escribir las rutas reales del disco y de la partición. El formateo crea ext4 con la etiqueta lab-data y un UUID; no existe una operación sencilla para deshacerlo y restaurar los datos anteriores.

set -euo pipefail
if [ "$#" -ne 1 ]; then
    printf 'Usage: bash prepare-empty-lab-disk.sh /dev/disk/by-id/ACTUAL_NEW_DISK\n' >&2; exit 2
fi
case "$1" in /dev/disk/by-id/*) ;; *) printf 'Use the verified by-id path.\n' >&2; exit 2 ;; esac
disk=$(readlink -e -- "$1")
test -b "$disk"
if [ "$(lsblk -dnro TYPE "$disk")" != disk ] || [ "$(lsblk -dnro RO "$disk")" != 0 ]; then
    printf 'Not a writable whole disk.\n' >&2; exit 1
fi
if [ "$(lsblk -nr -o NAME "$disk" | wc -l)" -ne 1 ]; then
    printf 'Partitions or dependent devices already exist; stop.\n' >&2; exit 1
fi
if lsblk -nr -o MOUNTPOINTS "$disk" | grep -q '[^[:space:]]'; then
    printf 'A mount is present; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$disk")
if [ -n "$signatures" ]; then
    printf 'Existing signatures: %s; stop.\n' "$signatures" >&2; exit 1
fi
lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the verified empty disk path ($disk): " confirmed
if [ "$confirmed" != "$disk" ]; then exit 1; fi
sudo fdisk "$disk"
sudo udevadm settle
mapfile -t partitions < <(lsblk -nrpo NAME,TYPE "$disk" | awk '$2 == "part" {print $1}')
if [ "${#partitions[@]}" -ne 1 ]; then
    printf 'Expected one newly created partition; inspect before formatting.\n' >&2; exit 1
fi
partition=${partitions[0]}
if findmnt -rn --source "$partition" >/dev/null; then
    printf 'The partition is mounted; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$partition")
if [ -n "$signatures" ]; then printf 'Partition already has a signature; stop.\n' >&2; exit 1; fi
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the new partition to format as ext4 ($partition): " confirmed
if [ "$confirmed" != "$partition" ]; then exit 1; fi
sudo mkfs.ext4 -L lab-data "$partition"
sudo blkid "$partition"
lsblk -f "$disk"

Si un disco de práctica separado ya tiene ext4 preparado, omita el script de inicialización y comience con la verificación del UUID. No use el mismo disco virtual en varios VM simultáneamente. El siguiente procedimiento de montaje permanente se realiza con el UUID de la partición verificada.

Consulte el manual de fdisk para entender cómo editar particiones y el significado del objetivo del disco.

El manual de mke2fs describe las opciones de creación del sistema de archivos de mkfs.ext4 y sus efectos.

Montaje del sistema fstab y dependencias de servicios

El montaje permanente en el servidor se gestiona vinculando el UUID real, el punto de montaje, el sistema de archivos y las opciones en /etc/fstab. Crear un directorio o montar temporalmente y el montaje después de reiniciar son cosas diferentes, por lo que se debe verificar la copia de seguridad original, la inspección y el reinicio por separado. Si se trata de la ruta de datos de un servicio, también se diseña la dependencia para que el servicio no comience a escribir si el montaje falla.

La política de fallo varía según si son datos de servicio necesarios al arrancar o dispositivos externos prescindibles. nofail puede ayudar a continuar con el arranque, pero no evita que la aplicación escriba en un directorio de montaje vacío si ese disco no está presente.

Preparar la copia de seguridad y el punto de montaje

(
set -eu
backup=$(sudo mktemp /root/fstab-backup.XXXXXX)
sudo cp -a /etc/fstab "$backup"
printf 'Backup: %s\n' "$backup"
sudo mkdir -p /srv/lab-data
)

Si el punto de montaje ya está en uso o contiene archivos, primero se debe preservar el contenido y elegir otro punto vacío. Cuando se monta un disco, los archivos locales existentes debajo pueden quedar ocultos. Crear un directorio no significa que el disco esté conectado.

Agregar un elemento con UUID real

Abra el archivo con sudoedit /etc/fstab, conserve el contenido existente y añada una línea. A continuación se muestra un formato de ejemplo al seleccionar el disco de práctica ext4. Sustituya el marcador de UUID al valor real confirmado por lsblk y, si el sistema de archivos es diferente, no lo use sin adaptarlo.

UUID=REPLACE_WITH_VERIFIED_UUID /srv/lab-data ext4 defaults,nofail,x-systemd.device-timeout=10s 0 2

La línea es un ejemplo para un disco de práctica prescindible: nofail evita tratar su fallo como el de un montaje requerido para el arranque. x-systemd.device-timeout=10s limita la espera por el dispositivo, no el tiempo total de montaje o arranque. Para datos esenciales de un servicio, defina las dependencias y la política de fallo apropiadas. En rutas con espacios, respete las secuencias de escape de fstab.

(
set -eu
sudo findmnt --verify --verbose
sudo systemctl daemon-reload
sudo mount /srv/lab-data
findmnt --mountpoint /srv/lab-data
)

Corrija primero el error de validación y monta solo los elementos previstos. En lugar de usar el montaje -a, que procesa otros discos a la vez, especificar un objetivo de práctica puede reducir el impacto. Compare el origen real de findmnt con si el sistema de archivos es el dispositivo del UUID esperado.

Escribir datos solo después de comprobar el montaje

expected_uuid=REPLACE_WITH_VERIFIED_UUID
actual_uuid=$(findmnt -rn --mountpoint /srv/lab-data -o UUID || true)
if [ "$actual_uuid" != "$expected_uuid" ]; then
    printf 'Expected disk is not mounted; stop the write job.\n' >&2
    exit 1
fi
printf 'Verified the expected mounted filesystem.\n'

Guarde el chequeo en un archivo Bash nuevo, como ~/check-lab-mount.sh, y sustituya el UUID por el verificado. Ejecútelo con bash ~/check-lab-mount.sh: solo el estado cero permite continuar con una escritura. En el volumen recién preparado, puede comprobarlo con bash ~/check-lab-mount.sh && printf "%s\n" "mount practice" | sudo tee /srv/lab-data/mount-practice.txt; elija otro nombre si ese archivo ya existe. Después de reiniciar, repita el chequeo antes de leer el archivo. Para simular la ausencia del disco, apague completamente la VM y desconéctelo de su configuración sin borrar el archivo del disco virtual. No retire un volumen mientras se utiliza.

Si la configuración falla, entre por la consola y restaure únicamente la entrada de fstab que cambió, comparándola con la copia de seguridad y conservando otros cambios posteriores. Repita la validación y la recarga de systemd. En la prueba sin dispositivo, confirme que el chequeo y las tareas dependientes fallan antes de escribir en el directorio local. Reconecte el disco con la VM apagada y compruebe su UUID al arrancar.

El documento systemd.mount explica la relación entre las opciones de montaje de fstab y la dependencia de servicios.