2025-09-08 15:01:00 +02:00
# 📘 Guía Completa: Compartir Recursos entre Proxmox Host y Contenedores LXC
2025-09-08 15:08:02 +02:00
## 📋 Índice
### 🎯 Conceptos Fundamentales
- [¿Qué son los permisos en Linux? ](#qué-son-los-permisos-en-linux )
- [Usuarios y grupos en Linux ](#usuarios-y-grupos-en-linux )
- [¿Qué son las ACLs? ](#qué-son-las-acls )
- [Contenedores privilegiados vs no privilegiados ](#contenedores-privilegiados-vs-no-privilegiados )
### 🛠️ Configuración Práctica
- [Crear directorio local compartido ](#crear-directorio-local-compartido )
- [Configurar recurso NFS ](#configurar-recurso-nfs )
- [Configurar recurso Samba ](#configurar-recurso-samba )
- [Montar recursos en contenedores ](#montar-recursos-en-contenedores )
### 🔧 Casos Prácticos
- [Ejemplo completo: NFS ](#ejemplo-completo-nfs )
- [Ejemplo completo: Samba ](#ejemplo-completo-samba )
- [Ejemplo completo: Directorio local ](#ejemplo-completo-directorio-local )
### 🚨 Solución de Problemas
- [Errores comunes y soluciones ](#errores-comunes-y-soluciones )
- [Comandos de verificación ](#comandos-de-verificación )
2025-09-08 15:03:10 +02:00
---
2025-09-08 15:08:02 +02:00
## 🎯 Conceptos Fundamentales
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### ¿Qué son los permisos en Linux?
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
En Linux, cada archivo y directorio tiene **permisos** que determinan quién puede hacer qué con ellos.
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Tipos de permisos:
- **r (read/lectura)**: Ver el contenido
- **w (write/escritura)**: Modificar el contenido
- **x (execute/ejecución)**: Ejecutar archivos o acceder a directorios
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Niveles de permisos:
- **Usuario propietario (u)**: El dueño del archivo
- **Grupo propietario (g)**: El grupo al que pertenece el archivo
- **Otros (o)**: Todos los demás usuarios
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Ejemplo práctico:
```bash
ls -l /mnt/shared_data/archivo.txt
-rw-rw-r-- 1 root sharedfiles 1024 sep 8 archivo.txt
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Desglose:**
- `-rw-rw-r--` : Permisos (explicado abajo)
- `root` : Usuario propietario
- `sharedfiles` : Grupo propietario
- `1024` : Tamaño en bytes
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Permisos desglosados:**
- Primer `-` : Tipo de archivo (- = archivo, d = directorio)
- `rw-` : Usuario puede leer y escribir, no ejecutar
- `rw-` : Grupo puede leer y escribir, no ejecutar
- `r--` : Otros solo pueden leer
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### Usuarios y grupos en Linux
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### ¿Qué es un usuario?
Un **usuario** es una identidad en el sistema. Cada usuario tiene:
- **UID (User ID)**: Número único que lo identifica
- **Nombre**: Como `root` , `www-data` , `nextcloud`
- **Grupo principal**: Su grupo por defecto
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### ¿Qué es un grupo?
Un **grupo** es una colección de usuarios que comparten permisos. Cada grupo tiene:
- **GID (Group ID)**: Número único que lo identifica
- **Nombre**: Como `sharedfiles` , `www-data` , `users`
#### ¿Por qué usar grupos en Proxmox?
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Sin grupo común - PROBLEMÁTICO
# Host: archivo pertenece a "root"
# LXC1: usuario "www-data" no puede escribir
# LXC2: usuario "nextcloud" no puede escribir
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Con grupo común - SOLUCIÓN
# Host: archivo pertenece a grupo "sharedfiles"
# LXC1: "www-data" está en grupo "sharedfiles" → puede escribir
# LXC2: "nextcloud" está en grupo "sharedfiles" → puede escribir
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Comandos útiles:
```bash
# Ver usuarios del sistema
cat /etc/passwd
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Ver grupos del sistema
cat /etc/group
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Ver a qué grupos pertenece un usuario
groups www-data
# Ver información completa de un usuario
id www-data
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### ¿Qué son las ACLs?
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**ACL (Access Control Lists)** son permisos **extendidos** que van más allá de los permisos básicos de Linux.
#### ¿Por qué necesitamos ACLs?
Los permisos básicos solo permiten **un usuario** y **un grupo** por archivo. Las ACLs permiten:
- Múltiples usuarios con diferentes permisos
- Múltiples grupos con diferentes permisos
- Permisos por defecto para archivos nuevos
#### Ejemplo sin ACLs (limitado):
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Solo podemos dar permisos a UN grupo
chown root:sharedfiles /mnt/shared_data
chmod 775 /mnt/shared_data
# ¿Qué pasa si necesitamos que otro grupo también tenga acceso?
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Ejemplo con ACLs (flexible):
```bash
# Podemos dar permisos a MÚLTIPLES grupos
setfacl -m g:sharedfiles:rwx /mnt/shared_data
setfacl -m g:developers:rwx /mnt/shared_data
setfacl -m g:backup:r-x /mnt/shared_data
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### ¿Por qué son cruciales con NFS?
**NFS no entiende nombres, solo números (UID/GID)**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# En el servidor NFS
# Usuario "www-data" tiene UID 33, GID 33
# En el cliente NFS
# Usuario "www-data" tiene UID 33, GID 33
# ✅ Coinciden → funciona
# Pero si los números no coinciden:
# Servidor: "www-data" UID 33
# Cliente: "www-data" UID 1001
# ❌ NFS ve usuarios diferentes → permisos rotos
```
**Las ACLs solucionan esto** asegurando que el grupo tenga permisos sin importar qué usuario específico cree el archivo.
### Contenedores privilegiados vs no privilegiados
#### Contenedor Privilegiado
- **UID/GID idénticos** al host
2025-09-08 15:01:00 +02:00
- `root` en contenedor = `root` en host (UID 0)
2025-09-08 15:08:02 +02:00
- **Más simple** de configurar
- **Menos seguro** (escape = root en host)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Contenedor No Privilegiado
- **UID/GID desplazados** +100000
- `root` en contenedor (UID 0) = usuario 100000 en host
- **Más complejo** de configurar
- **Más seguro** (escape = usuario sin privilegios)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Mapeo de IDs en contenedores no privilegiados:
```bash
# Contenedor → Host
UID 0 → UID 100000 (root)
UID 33 → UID 100033 (www-data)
UID 1000 → UID 101000 (usuario normal)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
GID 0 → GID 100000 (root)
GID 33 → GID 100033 (www-data)
GID 1000 → GID 101000 (grupo personalizado)
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
---
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
## 🛠️ Configuración Práctica
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### Crear directorio local compartido
#### Paso 1: Crear directorio y grupo en el host
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Crear directorio
2025-09-08 15:01:00 +02:00
mkdir -p /mnt/shared_data
2025-09-08 15:08:02 +02:00
# Crear grupo universal (si no existe)
groupadd -g 101000 sharedfiles 2>/dev/null || true
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar que se creó correctamente
2025-09-08 15:01:00 +02:00
getent group sharedfiles
# Salida: sharedfiles:x:101000:
```
2025-09-08 15:08:02 +02:00
#### Paso 2: Configurar permisos base
2025-09-08 15:01:00 +02:00
```bash
# Asignar propietario y grupo
chown root:sharedfiles /mnt/shared_data
2025-09-08 15:08:02 +02:00
# Permisos con setgid (bit especial)
2025-09-08 15:01:00 +02:00
chmod 2775 /mnt/shared_data
```
2025-09-08 15:08:02 +02:00
**¿Qué significa `2775` ?**
- **2**: Bit setgid → archivos nuevos heredan el grupo `sharedfiles`
- **7**: Propietario (root) → lectura, escritura, ejecución
- **7**: Grupo (sharedfiles) → lectura, escritura, ejecución
- **5**: Otros → lectura, ejecución (sin escritura)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Paso 3: Aplicar ACLs
2025-09-08 15:01:00 +02:00
```bash
# ACLs para contenido existente
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
# ACLs por defecto para contenido nuevo
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
# Verificar ACLs aplicadas
getfacl /mnt/shared_data
```
2025-09-08 15:08:02 +02:00
### Configurar recurso NFS
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Paso 1: Instalar servidor NFS
```bash
# En Debian/Ubuntu
apt update
apt install -y nfs-kernel-server
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# En CentOS/RHEL
yum install -y nfs-utils
systemctl enable nfs-server
systemctl start nfs-server
```
#### Paso 2: Configurar exportación
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Editar archivo de exportaciones
nano /etc/exports
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Añadir línea (ajustar red según tu configuración)
/mnt/shared_data 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=0,anongid=101000)
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Explicación de opciones:**
- `rw` : Lectura y escritura
- `sync` : Confirma escritura antes de responder
- `no_subtree_check` : Evita verificaciones innecesarias
- `all_squash` : Mapea todos los usuarios al anónimo
- `anonuid=0` : Usuario anónimo = root (UID 0)
- `anongid=101000` : Grupo anónimo = sharedfiles (GID 101000)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Paso 3: Activar exportación
```bash
# Recargar configuración
exportfs -ra
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar exportaciones activas
exportfs -v
showmount -e localhost
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Paso 4: Configurar firewall (si está activo)
```bash
# UFW (Ubuntu)
ufw allow from 192.168.1.0/24 to any port nfs
# Firewalld (CentOS)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --reload
```
### Configurar recurso Samba
#### Paso 1: Instalar servidor Samba
```bash
# En Debian/Ubuntu
apt update
apt install -y samba samba-common-bin
# En CentOS/RHEL
yum install -y samba samba-client
systemctl enable smb nmb
systemctl start smb nmb
```
#### Paso 2: Configurar compartición
```bash
# Hacer backup de configuración original
cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
# Editar configuración
nano /etc/samba/smb.conf
```
Añadir al final del archivo:
```ini
[shared_data]
comment = Directorio compartido
path = /mnt/shared_data
browseable = yes
read only = no
valid users = @sharedfiles
force group = sharedfiles
create mask = 0664
directory mask = 2775
force create mode = 0664
force directory mode = 2775
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Explicación de opciones:**
- `valid users = @sharedfiles` : Solo miembros del grupo pueden acceder
- `force group = sharedfiles` : Fuerza que archivos pertenezcan al grupo
- `create mask = 0664` : Permisos para archivos nuevos
- `directory mask = 2775` : Permisos para directorios nuevos (con setgid)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Paso 3: Crear usuario Samba
```bash
# Crear usuario del sistema (si no existe)
useradd -r -s /bin/false -g sharedfiles sambauser
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Crear usuario Samba
smbpasswd -a sambauser
# Te pedirá contraseña
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Añadir usuario existente al grupo
usermod -aG sharedfiles sambauser
```
#### Paso 4: Reiniciar servicios
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Verificar configuración
testparm
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Reiniciar servicios
systemctl restart smbd nmbd
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
### Montar recursos en contenedores
#### Paso 1: Configurar contenedor privilegiado
**¿Por qué necesitamos configurar grupos en contenedores privilegiados?**
Aunque los contenedores privilegiados comparten los mismos UID/GID que el host, **NO comparten automáticamente los grupos** . Cada contenedor tiene su propio `/etc/group` .
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# 1.1 Entrar al contenedor
pct exec 100 -- bash
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# 1.2 Crear grupo idéntico al host
groupadd -g 101000 sharedfiles
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# ¿Por qué GID 101000?
# Porque es el mismo GID que usamos en el host
# En privilegiados: GID contenedor = GID host
# 1.3 Añadir usuarios relevantes al grupo
2025-09-08 15:01:00 +02:00
usermod -aG sharedfiles root
usermod -aG sharedfiles www-data
2025-09-08 15:08:02 +02:00
# Si tienes otros usuarios específicos
usermod -aG sharedfiles nextcloud 2>/dev/null || true
usermod -aG sharedfiles jellyfin 2>/dev/null || true
# 1.4 Verificar membresía
groups root
groups www-data
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# 1.5 Salir del contenedor
2025-09-08 15:01:00 +02:00
exit
```
2025-09-08 15:08:02 +02:00
#### Paso 2: Configurar contenedor no privilegiado
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# 2.1 Entrar al contenedor
pct exec 101 -- bash
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# 2.2 Crear grupo con GID mapeado
groupadd -g 1000 sharedfiles
# Importante: GID 1000 en contenedor = GID 101000 en host
# 2.3 Listar todos los usuarios disponibles
echo "Usuarios disponibles en el contenedor:"
awk -F: '$3>=1000 & & $1!="nobody" {print "- " $1 " (UID: " $3 ")"}' /etc/passwd
# También mostrar usuarios del sistema comunes
echo "Usuarios del sistema comunes:"
for user in root www-data nginx apache mysql postgres redis; do
if id "$user" >/dev/null 2>&1; then
echo "- $user ($(id -u $user))"
fi
2025-09-08 15:01:00 +02:00
done
2025-09-08 15:08:02 +02:00
# 2.4 Añadir usuarios al grupo
# Usuarios básicos siempre necesarios
usermod -aG sharedfiles root
usermod -aG sharedfiles www-data
# Usuarios específicos según aplicaciones instaladas
usermod -aG sharedfiles nextcloud 2>/dev/null || true
usermod -aG sharedfiles jellyfin 2>/dev/null || true
usermod -aG sharedfiles plex 2>/dev/null || true
usermod -aG sharedfiles mysql 2>/dev/null || true
usermod -aG sharedfiles postgres 2>/dev/null || true
# 2.5 Verificar configuración
echo "Verificando configuración de usuarios:"
for user in root www-data nextcloud jellyfin; do
if id "$user" >/dev/null 2>&1; then
echo "Usuario $user:"
id "$user"
echo ""
fi
done
# 2.6 Salir del contenedor
exit
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Comando para añadir TODOS los usuarios automáticamente:**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Dentro del contenedor no privilegiado
# Añadir todos los usuarios con UID >= 1000 al grupo sharedfiles
awk -F: '$3>=1000 & & $1!="nobody" {print $1}' /etc/passwd | while read user; do
usermod -aG sharedfiles "$user"
echo "Añadido $user al grupo sharedfiles"
done
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Añadir usuarios del sistema importantes
for user in root www-data nginx apache mysql postgres redis; do
2025-09-08 15:01:00 +02:00
if id "$user" >/dev/null 2>&1; then
usermod -aG sharedfiles "$user"
2025-09-08 15:08:02 +02:00
echo "Añadido $user al grupo sharedfiles"
2025-09-08 15:01:00 +02:00
fi
done
```
2025-09-08 15:08:02 +02:00
#### Paso 3: Montar directorios en contenedores
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# 3.1 Para contenedor privilegiado (ID 100)
2025-09-08 15:01:00 +02:00
pct set 100 -mp0 /mnt/shared_data,mp=/mnt/shared,backup=0,acl=1,shared=1
2025-09-08 15:08:02 +02:00
# 3.2 Para contenedor no privilegiado (ID 101)
2025-09-08 15:01:00 +02:00
pct set 101 -mp0 /mnt/shared_data,mp=/mnt/shared,backup=0,acl=1,shared=1
2025-09-08 15:08:02 +02:00
# 3.3 Reiniciar contenedores para activar montajes
2025-09-08 15:01:00 +02:00
pct reboot 100
pct reboot 101
# Esperar a que arranquen
2025-09-08 15:08:02 +02:00
sleep 15
2025-09-08 15:01:00 +02:00
```
**Explicación de parámetros:**
2025-09-08 15:08:02 +02:00
- `mp0` : Punto de montaje 0 (puedes usar mp1, mp2, etc.)
2025-09-08 15:01:00 +02:00
- `/mnt/shared_data` : Ruta en el host
- `mp=/mnt/shared` : Ruta dentro del contenedor
2025-09-08 15:08:02 +02:00
- `backup=0` : Excluir del backup automático
2025-09-08 15:01:00 +02:00
- `acl=1` : Habilitar soporte para ACLs
2025-09-08 15:08:02 +02:00
- `shared=1` : **IMPORTANTE** - Permite migración en clusters sin copiar datos
2025-09-08 15:01:00 +02:00
---
2025-09-08 15:08:02 +02:00
## 🔧 Casos Prácticos
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### Ejemplo completo: NFS
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Escenario: Servidor NFS en host, cliente en contenedor
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Paso 1: Preparar servidor NFS en host**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Crear directorio y configurar permisos
mkdir -p /mnt/nfs_export
groupadd -g 101000 sharedfiles 2>/dev/null || true
chown root:sharedfiles /mnt/nfs_export
chmod 2775 /mnt/nfs_export
setfacl -R -m g:sharedfiles:rwx /mnt/nfs_export
setfacl -d -m g:sharedfiles:rwx /mnt/nfs_export
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Configurar exportación NFS
echo "/mnt/nfs_export 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=0,anongid=101000)" >> /etc/exports
exportfs -ra
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Paso 2: Montar NFS desde otro host**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# En otro servidor Proxmox
mkdir -p /mnt/nfs_client
2025-09-08 15:01:00 +02:00
# Montar temporalmente para probar
2025-09-08 15:08:02 +02:00
mount -t nfs 192.168.1.50:/mnt/nfs_export /mnt/nfs_client
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Hacer persistente tras reinicio
echo "192.168.1.50:/mnt/nfs_export /mnt/nfs_client nfs rw,hard,nofail,rsize=131072,wsize=131072,timeo=600,retrans=2,_netdev 0 0" >> /etc/fstab
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Explicación del fstab:**
2025-09-08 15:01:00 +02:00
- `rw` : Lectura y escritura
2025-09-08 15:08:02 +02:00
- `hard` : Reintentar indefinidamente si hay problemas
- `nofail` : No bloquear arranque si no está disponible
- `rsize/wsize=131072` : Tamaño de buffer (128KB) para mejor rendimiento
2025-09-08 15:01:00 +02:00
- `timeo=600` : Timeout de 60 segundos (600 décimas)
2025-09-08 15:08:02 +02:00
- `retrans=2` : Reintentar 2 veces antes de timeout
- `_netdev` : Esperar a que la red esté lista
2025-09-08 15:01:00 +02:00
- `0 0` : No hacer dump ni fsck (siempre para recursos de red)
2025-09-08 15:08:02 +02:00
**Paso 3: Configurar contenedor para usar NFS**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Configurar permisos en el host cliente
groupadd -g 101000 sharedfiles 2>/dev/null || true
chown root:sharedfiles /mnt/nfs_client
setfacl -R -m g:sharedfiles:rwx /mnt/nfs_client
setfacl -d -m g:sharedfiles:rwx /mnt/nfs_client
# Montar en contenedor
pct set 102 -mp0 /mnt/nfs_client,mp=/mnt/shared_nfs,backup=0,acl=1,shared=1
pct reboot 102
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
### Ejemplo completo: Samba
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Escenario: Montar recurso Samba externo en host y compartir con contenedores
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Paso 1: Montar Samba en host**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Instalar cliente Samba
apt install -y cifs-utils
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Crear directorio de montaje
mkdir -p /mnt/samba_share
2025-09-08 15:01:00 +02:00
# Crear archivo de credenciales
cat > /etc/cifs-credentials < < EOF
username=tu_usuario
2025-09-08 15:08:02 +02:00
password=tu_contraseña
2025-09-08 15:01:00 +02:00
domain=tu_dominio
EOF
2025-09-08 15:08:02 +02:00
# Proteger credenciales
2025-09-08 15:01:00 +02:00
chmod 600 /etc/cifs-credentials
2025-09-08 15:08:02 +02:00
# Montar temporalmente para probar
mount -t cifs //192.168.1.60/shared_folder /mnt/samba_share -o credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Hacer persistente
echo "//192.168.1.60/shared_folder /mnt/samba_share cifs credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0,_netdev,nofail 0 0" >> /etc/fstab
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Paso 2: Configurar permisos para contenedores**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Configurar grupo y permisos
groupadd -g 101000 sharedfiles 2>/dev/null || true
2025-09-08 15:01:00 +02:00
chown root:sharedfiles /mnt/samba_share
chmod 2775 /mnt/samba_share
setfacl -R -m g:sharedfiles:rwx /mnt/samba_share
setfacl -d -m g:sharedfiles:rwx /mnt/samba_share
```
2025-09-08 15:08:02 +02:00
**Paso 3: Montar en contenedores**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Contenedor privilegiado
pct set 103 -mp0 /mnt/samba_share,mp=/mnt/samba,backup=0,acl=1,shared=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Contenedor no privilegiado
pct set 104 -mp0 /mnt/samba_share,mp=/mnt/samba,backup=0,acl=1,shared=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Reiniciar contenedores
pct reboot 103 104
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
### Ejemplo completo: Directorio local
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Escenario: Compartir directorio local del host con múltiples contenedores
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
**Paso 1: Crear y configurar directorio**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Crear directorio principal
mkdir -p /mnt/local_shared
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Crear subdirectorios por aplicación
mkdir -p /mnt/local_shared/{nextcloud,jellyfin,backup,common}
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Configurar permisos base
groupadd -g 101000 sharedfiles 2>/dev/null || true
chown -R root:sharedfiles /mnt/local_shared
chmod -R 2775 /mnt/local_shared
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Aplicar ACLs recursivamente
setfacl -R -m g:sharedfiles:rwx /mnt/local_shared
setfacl -R -d -m g:sharedfiles:rwx /mnt/local_shared
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Paso 2: Montar en múltiples contenedores**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Nextcloud (contenedor 105) - acceso completo
pct set 105 -mp0 /mnt/local_shared,mp=/mnt/shared,backup=0,acl=1,shared=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Jellyfin (contenedor 106) - solo su directorio
pct set 106 -mp0 /mnt/local_shared/jellyfin,mp=/mnt/media,backup=0,acl=1,shared=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Backup (contenedor 107) - acceso de solo lectura
pct set 107 -mp0 /mnt/local_shared,mp=/mnt/backup_source,backup=0,acl=1,shared=1,ro=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Reiniciar todos
pct reboot 105 106 107
2025-09-08 15:01:00 +02:00
```
---
2025-09-08 15:08:02 +02:00
## 🚨 Solución de Problemas
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### Errores comunes y soluciones
#### Error: "Permission denied" al escribir desde contenedor no privilegiado
2025-09-08 15:01:00 +02:00
**Síntomas:**
```bash
2025-09-08 15:08:02 +02:00
# Dentro del contenedor
touch /mnt/shared/test.txt
# touch: cannot touch '/mnt/shared/test.txt': Permission denied
2025-09-08 15:01:00 +02:00
```
**Diagnóstico:**
```bash
2025-09-08 15:08:02 +02:00
# En el host, verificar permisos
2025-09-08 15:01:00 +02:00
ls -la /mnt/shared_data/
getfacl /mnt/shared_data/
2025-09-08 15:08:02 +02:00
# En el contenedor, verificar usuario
id
groups
2025-09-08 15:01:00 +02:00
```
**Soluciones:**
```bash
2025-09-08 15:08:02 +02:00
# 1. Verificar que el grupo existe en el contenedor
pct exec 101 -- getent group sharedfiles
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# 2. Si no existe, crearlo
pct exec 101 -- groupadd -g 1000 sharedfiles
# 3. Añadir usuario al grupo
pct exec 101 -- usermod -aG sharedfiles www-data
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# 4. Verificar ACLs en el host
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Error: "Stale file handle" en montajes NFS
2025-09-08 15:01:00 +02:00
**Síntomas:**
```bash
2025-09-08 15:08:02 +02:00
ls /mnt/nfs_mount
# ls: cannot access '/mnt/nfs_mount': Stale file handle
2025-09-08 15:01:00 +02:00
```
**Solución:**
```bash
2025-09-08 15:08:02 +02:00
# Desmontar forzadamente
umount -f /mnt/nfs_mount
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Limpiar cache NFS
echo 3 > /proc/sys/vm/drop_caches
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Volver a montar
mount -t nfs servidor:/export /mnt/nfs_mount
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Error: Archivos aparecen con propietario incorrecto
2025-09-08 15:01:00 +02:00
**Síntomas:**
```bash
2025-09-08 15:08:02 +02:00
ls -l /mnt/shared/
# -rw-r--r-- 1 100033 100033 1024 sep 8 archivo.txt
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
**Explicación:**
El archivo muestra UID/GID numéricos porque el sistema no encuentra nombres correspondientes.
2025-09-08 15:01:00 +02:00
**Solución:**
```bash
2025-09-08 15:08:02 +02:00
# Verificar mapeo de IDs
# En contenedor no privilegiado: UID 33 → Host UID 100033
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Crear grupo con GID correcto en host si es necesario
groupadd -g 100033 container-www-data
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# O mejor, usar el grupo universal
chown -R root:sharedfiles /mnt/shared/
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Error: "Transport endpoint is not connected" en Samba
2025-09-08 15:01:00 +02:00
**Síntomas:**
```bash
2025-09-08 15:08:02 +02:00
ls /mnt/samba_mount
# ls: cannot access '/mnt/samba_mount': Transport endpoint is not connected
2025-09-08 15:01:00 +02:00
```
**Solución:**
```bash
2025-09-08 15:08:02 +02:00
# Desmontar
umount /mnt/samba_mount
2025-09-08 15:01:00 +02:00
# Verificar conectividad
2025-09-08 15:08:02 +02:00
ping servidor_samba
smbclient -L //servidor_samba -U usuario
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Remontar con opciones específicas
mount -t cifs //servidor/share /mnt/samba_mount -o username=user,vers=3.0,iocharset=utf8
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
### Comandos de verificación
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Verificar configuración de permisos
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Verificar permisos básicos
ls -la /mnt/shared_data/
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar ACLs
getfacl /mnt/shared_data/
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar grupos
2025-09-08 15:01:00 +02:00
getent group sharedfiles
2025-09-08 15:08:02 +02:00
# Verificar usuarios en grupo
getent group sharedfiles | cut -d: -f4
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Verificar montajes NFS
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Ver exportaciones disponibles
showmount -e servidor_nfs
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Ver montajes activos
mount | grep nfs
df -h | grep nfs
# Verificar estadísticas NFS
nfsstat -c # Cliente
nfsstat -s # Servidor
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Verificar montajes Samba
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Ver recursos compartidos disponibles
smbclient -L //servidor_samba -U usuario
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Ver montajes activos
mount | grep cifs
df -h | grep cifs
# Probar conectividad
smbclient //servidor/share -U usuario
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Verificar configuración de contenedores
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 15:08:02 +02:00
# Ver configuración de contenedor
cat /etc/pve/lxc/101.conf | grep mp
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Ver montajes dentro del contenedor
pct exec 101 -- df -h
pct exec 101 -- mount | grep /mnt
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar permisos dentro del contenedor
pct exec 101 -- ls -la /mnt/shared/
pct exec 101 -- getfacl /mnt/shared/
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
#### Probar escritura desde contenedores
```bash
# Crear archivo de prueba desde contenedor privilegiado
pct exec 100 -- bash -c 'echo "Prueba desde privilegiado" > /mnt/shared/test_privileged.txt'
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Crear archivo de prueba desde contenedor no privilegiado
pct exec 101 -- bash -c 'echo "Prueba desde no privilegiado" > /mnt/shared/test_unprivileged.txt'
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
# Verificar en el host
ls -la /mnt/shared_data/test_*.txt
getfacl /mnt/shared_data/test_*.txt
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
#### Script de diagnóstico completo
```bash
#!/bin/bash
# Guardar como: diagnostico_permisos.sh
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
echo "=== DIAGNÓSTICO DE PERMISOS COMPARTIDOS ==="
echo
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
echo "1. Verificando directorio compartido:"
ls -la /mnt/shared_data/
echo
echo "2. Verificando ACLs:"
getfacl /mnt/shared_data/
echo
echo "3. Verificando grupo sharedfiles:"
getent group sharedfiles
echo
echo "4. Verificando montajes NFS:"
mount | grep nfs
echo
echo "5. Verificando montajes Samba:"
mount | grep cifs
echo
echo "6. Verificando configuración de contenedores:"
for ct in $(pct list | awk 'NR>1 {print $1}'); do
echo "Contenedor $ct:"
grep mp /etc/pve/lxc/$ct.conf 2>/dev/null || echo " Sin montajes configurados"
done
echo
echo "7. Probando escritura desde host:"
if touch /mnt/shared_data/test_host.txt 2>/dev/null; then
echo " ✅ Host puede escribir"
rm -f /mnt/shared_data/test_host.txt
else
echo " ❌ Host NO puede escribir"
fi
echo
echo "=== FIN DEL DIAGNÓSTICO ==="
```
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
---
## 📝 Resumen de mejores prácticas
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### ✅ Configuración correcta
1. **Usar grupo universal** `sharedfiles` con GID 101000
2. **Aplicar setgid** (chmod 2775) para herencia automática
3. **Configurar ACLs** por defecto para garantizar permisos
4. **Usar shared=1** en montajes para compatibilidad con clusters
5. **Excluir de backups** (backup=0) para evitar duplicación
6. **Habilitar ACLs** (acl=1) en montajes de contenedores
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
### ❌ Errores a evitar
1. No crear el grupo en los contenedores
2. Olvidar el bit setgid (2775)
3. No aplicar ACLs por defecto
4. Usar rutas diferentes entre nodos del cluster
5. No configurar _netdev en fstab para recursos de red
6. Usar fsck (último número ≠ 0) en recursos de red
### 🔧 Comandos esenciales
```bash
# Configuración básica de directorio compartido
mkdir -p /mnt/shared_data
groupadd -g 101000 sharedfiles
chown root:sharedfiles /mnt/shared_data
chmod 2775 /mnt/shared_data
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
# Montaje en contenedor
pct set ID -mp0 /mnt/shared_data,mp=/mnt/shared,backup=0,acl=1,shared=1
# Configuración en contenedor no privilegiado
pct exec ID -- groupadd -g 1000 sharedfiles
pct exec ID -- usermod -aG sharedfiles www-data
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:08:02 +02:00
Esta guía te permitirá configurar correctamente recursos compartidos entre Proxmox y contenedores LXC, garantizando permisos adecuados y compatibilidad con clusters.
```