17 KiB
📘 Guía Completa: Compartir Recursos entre Proxmox Host y Contenedores LXC
📋 Índice
- Conceptos Fundamentales
- Preparación del Host Proxmox
- Tipos de Recursos Compartidos
- Configuración de Contenedores
- Montaje en Contenedores
- Verificación y Pruebas
- Solución de Problemas
- 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 escriturarw-
= Grupo propietario: lectura y escriturar--
= 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 escriturahard
= reintentar indefinidamente si el servidor no respondenofail
= no bloquear el arranque si no está disponiblersize/wsize=131072
= tamaño de buffer para mejor rendimientotimeo=600
= timeout de 60 segundosretrans=2
= reintentar 2 veces antes de reportar error_netdev
= esperar a que la red esté lista0 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/passwordiocharset=utf8
= codificación de caracteresvers=3.0
= versión del protocolo SMB_netdev
= esperar a que la red esté listanofail
= 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 hostmp=/mnt/shared
= ruta dentro del contenedorbackup=0
= excluir del backup de vzdump (recomendado para recursos de red)acl=1
= habilitar soporte para ACLs dentro del contenedorshared=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:
- Entender los conceptos de usuarios, grupos y ACLs en Linux
- Crear un grupo universal (
sharedfiles
) para compartir recursos - Montar diferentes tipos de recursos (local, NFS, Samba) en Proxmox
- Configurar contenedores privilegiados y no privilegiados correctamente
- Aplicar permisos que funcionen en todos los escenarios
- 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.