Files
ProxMenux/scripts/share/guia.md
2025-09-08 15:27:32 +02:00

17 KiB

📘 Guía Completa: Compartir Recursos entre Proxmox Host y Contenedores LXC

📋 Índice

  1. Conceptos Fundamentales
  2. Preparación del Host Proxmox
  3. Tipos de Recursos Compartidos
  4. Configuración de Contenedores
  5. Montaje en Contenedores
  6. Verificación y Pruebas
  7. Solución de Problemas
  8. Comandos de Referencia Rápida

1. Conceptos Fundamentales

¿Qué son los Usuarios y Grupos en Linux?

En Linux, cada archivo y proceso pertenece a un usuario y un grupo:

# Ver información de un archivo
ls -l /mnt/shared/archivo.txt
# Salida: -rw-rw-r-- 1 root sharedfiles 1024 dic 8 archivo.txt
#         ↑permisos  ↑usuario ↑grupo    ↑tamaño

Explicación de permisos:

  • rw- = Usuario propietario: lectura y escritura
  • rw- = Grupo propietario: lectura y escritura
  • r-- = Otros usuarios: solo lectura

¿Qué son las ACLs (Access Control Lists)?

Las ACLs son permisos extendidos que van más allá del sistema tradicional usuario/grupo/otros:

# Ver ACLs de un directorio
getfacl /mnt/shared
# Salida:
# user::rwx
# group::rwx
# group:sharedfiles:rwx    ← ACL específica para el grupo
# mask::rwx
# other::r-x
# default:user::rwx        ← Permisos por defecto para nuevos archivos
# default:group::rwx
# default:group:sharedfiles:rwx
# default:mask::rwx
# default:other::r-x

¿Por qué son importantes los Grupos en Proxmox?

Los contenedores no privilegiados usan un mapeo de IDs:

  • Usuario root (UID 0) en el contenedor = UID 100000 en el host
  • Usuario www-data (UID 33) en el contenedor = UID 100033 en el host

El problema: Si un archivo pertenece al UID 1000 en el host, el contenedor lo ve como UID 101000 (inexistente).

La solución: Usar un grupo común con ACLs que garanticen permisos independientemente del UID.


2. Preparación del Host Proxmox

Paso 1: Crear Grupo Universal

# Crear grupo que usarán todos los recursos compartidos
groupadd -g 101000 sharedfiles

# Verificar que se creó correctamente
getent group sharedfiles
# Salida: sharedfiles:x:101000:

¿Por qué GID 101000?

  • Es el primer GID mapeado de contenedores no privilegiados
  • Garantiza compatibilidad entre host y contenedores

Paso 2: Instalar Herramientas Necesarias

# Instalar herramientas para ACLs
apt update
apt install -y acl

# Para recursos NFS
apt install -y nfs-common

# Para recursos Samba/CIFS
apt install -y cifs-utils

3. Tipos de Recursos Compartidos

A) Directorio Local del Host

Cuándo usar: Para almacenamiento compartido simple entre contenedores del mismo host.

# 1. Crear directorio
mkdir -p /mnt/local_shared

# 2. Configurar propietario y permisos
chown root:sharedfiles /mnt/local_shared
chmod 2775 /mnt/local_shared

# 3. Aplicar ACLs
setfacl -R -m g:sharedfiles:rwx /mnt/local_shared
setfacl -d -m g:sharedfiles:rwx /mnt/local_shared

# 4. Verificar configuración
ls -ld /mnt/local_shared
# Salida: drwxrwsr-x+ 2 root sharedfiles 4096 dic 8 /mnt/local_shared
#         ↑ La 's' indica setgid activo
#         ↑ El '+' indica ACLs aplicadas

Explicación de permisos 2775:

  • 2 = setgid (nuevos archivos heredan el grupo)
  • 7 = rwx para el propietario (root)
  • 7 = rwx para el grupo (sharedfiles)
  • 5 = r-x para otros

B) Recurso NFS Remoto

Cuándo usar: Para acceder a un servidor NFS existente en la red.

# 1. Crear punto de montaje
mkdir -p /mnt/nfs_shared

# 2. Montar temporalmente para probar
mount -t nfs 192.168.1.100:/export/data /mnt/nfs_shared

# 3. Verificar que funciona
ls -la /mnt/nfs_shared

# 4. Si funciona, hacer persistente en /etc/fstab
echo "192.168.1.100:/export/data /mnt/nfs_shared nfs rw,hard,nofail,rsize=131072,wsize=131072,timeo=600,retrans=2,_netdev 0 0" >> /etc/fstab

# 5. Configurar permisos locales
chown root:sharedfiles /mnt/nfs_shared
chmod 2775 /mnt/nfs_shared
setfacl -R -m g:sharedfiles:rwx /mnt/nfs_shared
setfacl -d -m g:sharedfiles:rwx /mnt/nfs_shared

# 6. Probar montaje persistente
umount /mnt/nfs_shared
mount -a

Explicación de opciones NFS:

  • rw = lectura y escritura
  • hard = reintentar indefinidamente si el servidor no responde
  • nofail = no bloquear el arranque si no está disponible
  • rsize/wsize=131072 = tamaño de buffer para mejor rendimiento
  • timeo=600 = timeout de 60 segundos
  • retrans=2 = reintentar 2 veces antes de reportar error
  • _netdev = esperar a que la red esté lista
  • 0 0 = no hacer dump ni fsck (siempre para recursos de red)

C) Recurso Samba/CIFS

Cuándo usar: Para acceder a recursos compartidos de Windows o servidores Samba.

# 1. Crear archivo de credenciales seguro
cat > /etc/cifs-credentials << EOF
username=tu_usuario
password=tu_password
domain=tu_dominio
EOF

# 2. Proteger el archivo
chmod 600 /etc/cifs-credentials

# 3. Crear punto de montaje
mkdir -p /mnt/samba_shared

# 4. Montar temporalmente para probar
mount -t cifs //192.168.1.200/shared /mnt/samba_shared -o credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0

# 5. Verificar que funciona
ls -la /mnt/samba_shared

# 6. Si funciona, hacer persistente en /etc/fstab
echo "//192.168.1.200/shared /mnt/samba_shared cifs credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0,_netdev,nofail 0 0" >> /etc/fstab

# 7. Configurar permisos locales
chown root:sharedfiles /mnt/samba_shared
chmod 2775 /mnt/samba_shared
setfacl -R -m g:sharedfiles:rwx /mnt/samba_shared
setfacl -d -m g:sharedfiles:rwx /mnt/samba_shared

# 8. Probar montaje persistente
umount /mnt/samba_shared
mount -a

Explicación de opciones CIFS:

  • credentials= = archivo con usuario/password
  • iocharset=utf8 = codificación de caracteres
  • vers=3.0 = versión del protocolo SMB
  • _netdev = esperar a que la red esté lista
  • nofail = no bloquear el arranque si no está disponible

4. Configuración de Contenedores

Contenedor Privilegiado (Ejemplo: ID 100)

¿Necesita configuración especial? En teoría no, porque los UIDs/GIDs son idénticos al host. Sin embargo, es recomendable crear el grupo para consistencia:

# 1. Entrar al contenedor
pct exec 100 -- bash

# 2. Crear grupo idéntico al host
groupadd -g 101000 sharedfiles

# 3. Añadir usuarios relevantes al grupo
usermod -aG sharedfiles root
usermod -aG sharedfiles www-data

# Si tienes otros usuarios específicos de aplicaciones:
usermod -aG sharedfiles ncp 2>/dev/null || true  # Nextcloud
usermod -aG sharedfiles mysql 2>/dev/null || true  # MySQL

# 4. Verificar membresía
groups root
groups www-data

# 5. Salir del contenedor
exit

¿Por qué hacerlo aunque no sea estrictamente necesario?

  • Consistencia: Mismo comportamiento en privilegiados y no privilegiados
  • Migración: Si conviertes el contenedor a no privilegiado, ya está configurado
  • Claridad: Es evidente qué usuarios tienen acceso al recurso compartido

Contenedor No Privilegiado (Ejemplo: ID 101)

Aquí SÍ es obligatorio configurar el grupo:

# 1. Entrar al contenedor
pct exec 101 -- bash

# 2. Crear grupo con GID mapeado
groupadd -g 1000 sharedfiles
# Importante: GID 1000 en contenedor = GID 101000 en host

# 3. Listar todos los usuarios disponibles
awk -F: '$3>=1000 && $1!="nobody" {print $1 " (UID: " $3 ")"}' /etc/passwd
# O más simple, solo los nombres:
awk -F: '$3>=1000 && $1!="nobody" {print $1}' /etc/passwd

# 4. Añadir usuarios al grupo (ajusta según tu contenedor)
usermod -aG sharedfiles root
usermod -aG sharedfiles www-data

# Para aplicaciones específicas:
usermod -aG sharedfiles ncp 2>/dev/null || true      # Nextcloud
usermod -aG sharedfiles mysql 2>/dev/null || true    # MySQL
usermod -aG sharedfiles postgres 2>/dev/null || true # PostgreSQL
usermod -aG sharedfiles redis 2>/dev/null || true    # Redis

# 5. Verificar configuración
id www-data
# Salida esperada: uid=33(www-data) gid=33(www-data) groups=33(www-data),1000(sharedfiles)

# 6. Salir del contenedor
exit

¿Cómo añadir TODOS los usuarios automáticamente?

# Dentro del contenedor no privilegiado:
# Obtener lista de usuarios y añadirlos al grupo
for user in $(awk -F: '$3>=1000 && $1!="nobody" {print $1}' /etc/passwd); do
    usermod -aG sharedfiles "$user"
    echo "Usuario $user añadido al grupo sharedfiles"
done

# Verificar resultado
getent group sharedfiles

5. Montaje en Contenedores

Configurar Puntos de Montaje

# Para contenedor privilegiado (ID 100)
pct set 100 -mp0 /mnt/local_shared,mp=/mnt/shared,backup=0,acl=1,shared=1

# Para contenedor no privilegiado (ID 101)  
pct set 101 -mp0 /mnt/local_shared,mp=/mnt/shared,backup=0,acl=1,shared=1

# Si tienes múltiples recursos:
pct set 101 -mp1 /mnt/nfs_shared,mp=/mnt/nfs,backup=0,acl=1,shared=1
pct set 101 -mp2 /mnt/samba_shared,mp=/mnt/samba,backup=0,acl=1,shared=1

Explicación de parámetros:

  • mp0 = identificador del punto de montaje (mp0, mp1, mp2...)
  • /mnt/local_shared = ruta en el host
  • mp=/mnt/shared = ruta dentro del contenedor
  • backup=0 = excluir del backup de vzdump (recomendado para recursos de red)
  • acl=1 = habilitar soporte para ACLs dentro del contenedor
  • shared=1 = IMPORTANTE para clusters - permite migración sin copiar datos

Aplicar Cambios

# Reiniciar contenedores para activar montajes
pct reboot 100
pct reboot 101

# Esperar a que arranquen completamente
sleep 15

# Verificar que están funcionando
pct status 100
pct status 101

6. Verificación y Pruebas

Prueba Básica de Escritura

# 1. Crear archivo desde el host
echo "Archivo creado desde el host" > /mnt/local_shared/test_host.txt

# 2. Verificar permisos en el host
ls -l /mnt/local_shared/test_host.txt
getfacl /mnt/local_shared/test_host.txt

# 3. Probar desde contenedor privilegiado
pct exec 100 -- bash -c "echo 'Desde contenedor privilegiado' > /mnt/shared/test_privileged.txt"

# 4. Probar desde contenedor no privilegiado
pct exec 101 -- bash -c "echo 'Desde contenedor no privilegiado' > /mnt/shared/test_unprivileged.txt"

# 5. Verificar todos los archivos desde el host
ls -la /mnt/local_shared/
getfacl /mnt/local_shared/test_*

Resultado esperado:

# Todos los archivos deben tener:
-rw-rw-r--+ 1 root sharedfiles [tamaño] [fecha] archivo.txt
#         ↑ El '+' confirma que las ACLs están activas

Prueba de Acceso Cruzado

# 1. Desde contenedor privilegiado, leer archivo del no privilegiado
pct exec 100 -- cat /mnt/shared/test_unprivileged.txt

# 2. Desde contenedor no privilegiado, leer archivo del privilegiado
pct exec 101 -- cat /mnt/shared/test_privileged.txt

# 3. Modificar archivos cruzados
pct exec 100 -- bash -c "echo 'Modificado por privilegiado' >> /mnt/shared/test_unprivileged.txt"
pct exec 101 -- bash -c "echo 'Modificado por no privilegiado' >> /mnt/shared/test_privileged.txt"

# 4. Verificar contenido final
cat /mnt/local_shared/test_unprivileged.txt
cat /mnt/local_shared/test_privileged.txt

Verificar Herencia de Permisos

# 1. Crear subdirectorio desde contenedor
pct exec 101 -- mkdir /mnt/shared/subdir_test

# 2. Crear archivo en subdirectorio
pct exec 101 -- bash -c "echo 'Archivo en subdirectorio' > /mnt/shared/subdir_test/archivo.txt"

# 3. Verificar herencia desde el host
ls -ld /mnt/local_shared/subdir_test
ls -l /mnt/local_shared/subdir_test/archivo.txt
getfacl /mnt/local_shared/subdir_test

Resultado esperado:

  • El subdirectorio debe tener grupo sharedfiles
  • El archivo debe tener grupo sharedfiles
  • Las ACLs deben estar presentes

7. Solución de Problemas

Error: "Permission denied" al escribir

Síntomas:

pct exec 101 -- touch /mnt/shared/test.txt
# touch: cannot touch '/mnt/shared/test.txt': Permission denied

Diagnóstico:

# 1. Verificar montaje en el contenedor
pct exec 101 -- mount | grep /mnt/shared

# 2. Verificar permisos en el host
ls -ld /mnt/local_shared
getfacl /mnt/local_shared

# 3. Verificar grupo en el contenedor
pct exec 101 -- getent group sharedfiles
pct exec 101 -- groups root

Soluciones:

# Si falta el grupo en el contenedor:
pct exec 101 -- groupadd -g 1000 sharedfiles
pct exec 101 -- usermod -aG sharedfiles root

# Si faltan ACLs en el host:
setfacl -R -m g:sharedfiles:rwx /mnt/local_shared
setfacl -d -m g:sharedfiles:rwx /mnt/local_shared

# Si faltan permisos básicos:
chmod 2775 /mnt/local_shared
chown root:sharedfiles /mnt/local_shared

Error: Archivos con propietario incorrecto

Síntomas:

ls -l /mnt/local_shared/
# -rw-r--r-- 1 100033 100033 archivo.txt  ← UIDs numéricos en lugar de nombres

Causa: El contenedor no privilegiado creó el archivo, pero el host no reconoce los UIDs mapeados.

Solución:

# 1. Verificar que las ACLs están activas
getfacl /mnt/local_shared/archivo.txt
# Debe mostrar: group:sharedfiles:rwx

# 2. Si las ACLs están bien, el archivo es accesible aunque el UID se vea raro
# 3. Para "limpiar" la visualización, cambiar propietario:
chown root:sharedfiles /mnt/local_shared/archivo.txt

Error: Montaje no persistente tras reinicio

Síntomas: Tras reiniciar Proxmox, los recursos NFS/Samba no están montados.

Solución:

# 1. Verificar /etc/fstab
cat /etc/fstab | grep -E "(nfs|cifs)"

# 2. Probar montaje manual
mount -a

# 3. Si falla, verificar conectividad
ping 192.168.1.100  # IP del servidor NFS/Samba

# 4. Para NFS, verificar que el servicio está activo
systemctl status nfs-common

# 5. Para Samba, verificar credenciales
cat /etc/cifs-credentials

Error: "Transport endpoint is not connected"

Síntomas:

ls /mnt/nfs_shared
# ls: cannot access '/mnt/nfs_shared': Transport endpoint is not connected

Causa: El servidor NFS no está disponible o la conexión se perdió.

Solución:

# 1. Desmontar forzosamente
umount -f /mnt/nfs_shared

# 2. Verificar conectividad
ping 192.168.1.100
showmount -e 192.168.1.100

# 3. Remontar
mount /mnt/nfs_shared

# 4. Si persiste, revisar opciones de montaje
# Cambiar 'hard' por 'soft' en /etc/fstab para evitar bloqueos

8. Comandos de Referencia Rápida

Gestión de Grupos

# Crear grupo
groupadd -g 101000 sharedfiles

# Añadir usuario a grupo
usermod -aG sharedfiles usuario

# Ver miembros de un grupo
getent group sharedfiles

# Ver grupos de un usuario
groups usuario
id usuario

Gestión de Permisos

# Permisos básicos con setgid
chmod 2775 /ruta/directorio
chown root:sharedfiles /ruta/directorio

# ACLs
setfacl -R -m g:sharedfiles:rwx /ruta/directorio    # Aplicar a existente
setfacl -d -m g:sharedfiles:rwx /ruta/directorio    # Por defecto para nuevos

# Ver ACLs
getfacl /ruta/directorio

# Eliminar ACLs
setfacl -b /ruta/directorio

Gestión de Contenedores LXC

# Añadir punto de montaje
pct set ID -mp0 /host/path,mp=/container/path,backup=0,acl=1,shared=1

# Ejecutar comando en contenedor
pct exec ID -- comando

# Entrar al contenedor
pct enter ID

# Ver configuración del contenedor
cat /etc/pve/lxc/ID.conf

Montajes de Red

# NFS temporal
mount -t nfs servidor:/export /punto/montaje

# Samba temporal
mount -t cifs //servidor/recurso /punto/montaje -o credentials=/archivo

# Ver montajes activos
mount | grep -E "(nfs|cifs)"

# Desmontar
umount /punto/montaje

# Montaje persistente
echo "entrada" >> /etc/fstab
mount -a

Diagnóstico

# Ver permisos detallados
ls -la /ruta
getfacl /ruta

# Ver procesos usando un directorio
lsof /ruta

# Ver montajes del sistema
cat /proc/mounts | grep /ruta

# Verificar conectividad NFS
showmount -e servidor_nfs

# Verificar conectividad Samba
smbclient -L //servidor_samba -U usuario

Resumen Final

Esta guía te ha enseñado a:

  1. Entender los conceptos de usuarios, grupos y ACLs en Linux
  2. Crear un grupo universal (sharedfiles) para compartir recursos
  3. Montar diferentes tipos de recursos (local, NFS, Samba) en Proxmox
  4. Configurar contenedores privilegiados y no privilegiados correctamente
  5. Aplicar permisos que funcionen en todos los escenarios
  6. Solucionar problemas comunes de permisos y montajes

Puntos clave para recordar:

  • Usa GID 101000 para el grupo sharedfiles
  • Aplica permisos 2775 (con setgid) en directorios compartidos
  • Configura ACLs por defecto para garantizar herencia
  • Usa shared=1 en montajes LXC para compatibilidad con clusters
  • Los contenedores no privilegiados requieren configuración del grupo
  • Los recursos de red necesitan _netdev y nofail en /etc/fstab

Con esta configuración, tendrás un sistema robusto de recursos compartidos que funciona correctamente entre el host Proxmox y todos tus contenedores LXC, independientemente de si son privilegiados o no.