Crad-move-to-storage.pyc - Mover carpetas a /storage con bind mounts


#1

Descripción

crad-move-to-storage.py es una herramienta de Core-Admin que automatiza el proceso de mover carpetas del sistema a la partición /storage utilizando bind mounts. Esto permite liberar espacio en particiones pequeñas (como /, /tmp o /var) aprovechando el espacio disponible en /storage.

Instalación

Sintaxis

crad-move-to-storage.py --folder CARPETA [opciones]

Opciones
┌──────────────────────┬───────────────────────────────────────────┐
│ Opción │ Descripción │
├──────────────────────┼───────────────────────────────────────────┤
│ -f, --folder CARPETA │ Carpeta a mover (requerido). Debe ser una ruta absoluta │
├──────────────────────┼───────────────────────────────────────────┤
│ -d, --dry-run │ Modo simulación: muestra los pasos sin ejecutarlos │
├──────────────────────┼───────────────────────────────────────────┤
│ -v, --verbose │ Modo verbose: muestra información detallada de debug │
├──────────────────────┼───────────────────────────────────────────┤
│ -y, --yes │ Salta la confirmación interactiva │
├──────────────────────┼───────────────────────────────────────────┤
│ -h, --help │ Muestra la ayuda │
└──────────────────────┴───────────────────────────────────────────┘
Nomenclatura de carpetas en /storage

El script transforma la ruta origen reemplazando las barras / por guiones -:
┌───────────────────────────┬───────────────────────────────────┐
│ Origen │ Destino en /storage │
├───────────────────────────┼───────────────────────────────────┤
│ /tmp │ /storage/tmp │
├───────────────────────────┼───────────────────────────────────┤
│ /var/beep │ /storage/var-beep │
├───────────────────────────┼───────────────────────────────────┤
│ /var/lib/mysql │ /storage/var-lib-mysql │
├───────────────────────────┼───────────────────────────────────┤
│ /var/lib/firewall-manager │ /storage/var-lib-firewall-manager │
└───────────────────────────┴───────────────────────────────────┘
Flujo de ejecución

El script ejecuta los siguientes pasos en orden:

  1. Validación de prerequisitos
- Verifica ejecución como root
- Comprueba que la carpeta origen existe
- Verifica que /storage existe
- Comprueba que la carpeta no está ya montada desde /storage
- Verifica disponibilidad de rsync
  1. Detección de procesos afectados
- Ejecuta lsof para identificar procesos usando la carpeta
- Muestra advertencia sobre servicios que necesitarán reinicio
  1. Confirmación del usuario
- Muestra resumen de la operación
- Solicita confirmación explícita (salvo con --yes)
  1. Creación de carpeta destino
- Crea la carpeta en /storage con mkdir -p
- Preserva permisos y propietario de la carpeta original
  1. Sincronización de datos
- Ejecuta rsync -avz para copiar todos los datos
  1. Desmontaje de carpeta original
- Utiliza umount -l (lazy unmount) para desmontar sin afectar procesos
  1. Modificación de /etc/fstab
- Crea backup automático: /etc/fstab.backup.YYYY-MM-DD_HH-MM-SS
- Comenta las entradas existentes (UUID o device)
- Añade nuevas líneas de bind mount
  1. Recarga de systemd
- Ejecuta systemctl daemon-reload
  1. Montaje del bind mount
- Monta la nueva configuración
  1. Limpieza de carpeta original
- Desmonta temporalmente
- Elimina datos originales para liberar espacio
- Vuelve a montar
  1. Verificación
- Crea archivo de prueba para verificar el bind mount
- Muestra estado del montaje y permisos
  1. Recordatorio de reinicio
- Lista los servicios detectados que pueden necesitar reinicio

Ejemplos de uso

Modo dry-run (simulación)

Antes de ejecutar cambios reales, es recomendable usar --dry-run:

>> crad-move-to-storage.py --folder /tmp --dry-run

Salida:

============================================================
crad-move-to-storage.py
============================================================
Moving '/tmp' to /storage with bind mount
MODE: DRY-RUN (no changes will be made)
============================================================

STEP: Validating prerequisites...
STEP: Checking affected processes...
[DRY-RUN] Would run: lsof -n | grep /tmp
STEP: Creating storage folder...
[DRY-RUN] Would create: mkdir -p /storage/tmp
STEP: Synchronizing data...
[DRY-RUN] Would run: rsync -avz /tmp/ /storage/tmp/
...

Mover /tmp a /storage

>> crad-move-to-storage.py --folder /tmp

Este comando:

  • Mueve /tmp a /storage/tmp
  • Configura automáticamente /var/tmp para usar el mismo destino
  • Ambas carpetas compartirán /storage/tmp

Mover carpeta sin confirmación

>> crad-move-to-storage.py --folder /var/beep --yes

Mover carpeta con salida detallada

>> crad-move-to-storage.py --folder /var/lib/mysql --verbose

Combinación de opciones

>> crad-move-to-storage.py --folder /tmp --yes --verbose

Casos especiales

/tmp y /var/tmp

Cuando se mueve /tmp, el script automáticamente:

  1. Detecta y desmonta también /var/tmp si está montado
  2. Comenta las entradas de fstab para ambos
  3. Añade bind mounts para ambos apuntando a /storage/tmp
  4. Monta y verifica ambos

Resultado en /etc/fstab:
/storage/tmp /tmp none defaults,bind,noatime,nodiratime 0 0
/storage/tmp /var/tmp none defaults,bind,noatime,nodiratime 0 0

Carpetas con montajes UUID

Si la carpeta tiene un montaje por UUID, el script lo comenta manteniendo un registro:

# Commented by crad-move-to-storage.py - 2026-01-17 20:40:28
# UUID=46586e96-9389-4cd9-bd8b-d45dfbbbbe59 /tmp ext4 defaults 0 2
/storage/tmp /tmp none defaults,bind,noatime,nodiratime 0 0

Formato de entrada en fstab

Las entradas añadidas siguen este formato:

none defaults,bind,noatime,nodiratime 0 0

Opciones de montaje:

  • defaults - Opciones estándar
  • bind - Indica que es un bind mount
  • noatime - No actualiza tiempo de acceso (mejora rendimiento)
  • nodiratime - No actualiza tiempo de acceso en directorios

Backup y recuperación

Backup automático

El script crea automáticamente un backup de /etc/fstab antes de modificarlo:

/etc/fstab.backup.2026-01-17_20-40-28

Recuperación manual

Si necesitas revertir los cambios:

# 1. Restaurar fstab
>> cp /etc/fstab.backup.2026-01-17_20-40-28 /etc/fstab

# 2. Recargar systemd
>> systemctl daemon-reload

# 3. Desmontar bind mounts
>> umount /tmp
>> umount /var/tmp # si aplica

# 4. Montar particiones originales
>> mount -a

Rollback automático

Si el script falla después de modificar fstab, intenta automáticamente:

  1. Restaurar fstab desde el backup
  2. Ejecutar systemctl daemon-reload
  3. Informar al usuario para verificación manual

Servicios a reiniciar

Después de mover una carpeta, los servicios que la utilizaban pueden necesitar reinicio. El script muestra un recordatorio al final:

 ============================================================
REMINDER: Services that may need restart
============================================================
  - mysqld
  - php-fpm
  - java
============================================================

Reinicio manual:
systemctl restart mysql php7.4-fpm php8.1-fpm

Requisitos

  • Ejecución como root
  • Directorio /storage existente y montado
  • Comando rsync disponible
  • Módulos core_admin_common (command, support)

Verificación post-ejecución

Después de ejecutar el script, verifica:

# Ver montajes activos
>> mount | grep storage

# Ver espacio en disco
>> df -h | grep -E “(storage|tmp)”

# Verificar permisos (para /tmp debe ser drwxrwxrwt)
>> ls -ld /tmp /var/tmp

# Ver entradas en fstab
>> grep -v “^#” /etc/fstab | grep storage

Notas importantes

  1. Ejecutar primero en dry-run: Siempre usar --dry-run antes de ejecutar cambios reales
  2. Backup de datos críticos: Aunque el script hace rsync, considera tener backups adicionales
  3. Ventana de mantenimiento: Planifica la ejecución durante períodos de baja actividad
  4. Reinicio de servicios: Los servicios que usan la carpeta necesitarán reinicio
  5. Espacio en /storage: Verificar que hay espacio suficiente antes de ejecutar