Files
ProxMenux/scripts/share/guia.md

1208 lines
34 KiB
Markdown
Raw Normal View History

2025-09-08 16:20:10 +02:00
# 📘 Guía Completa: Compartir Recursos entre Proxmox Host y Contenedores LXC
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
## 📋 Índice
2025-09-08 17:14:52 +02:00
1. [Introducción](#introducción)
2. [Conceptos Fundamentales](#conceptos-fundamentales)
2025-09-08 16:20:10 +02:00
- [Usuarios y Grupos en Linux](#usuarios-y-grupos-en-linux)
2025-09-08 17:14:52 +02:00
- [Permisos en Linux](#permisos-en-linux)
2025-09-08 16:20:10 +02:00
- [Access Control Lists (ACL)](#access-control-lists-acl)
2025-09-08 17:14:52 +02:00
- [Contenedores No Privilegiados](#contenedores-no-privilegiados)
3. [Tipos de Recursos Compartidos](#tipos-de-recursos-compartidos)
- [NFS (Network File System)](#nfs-network-file-system)
- [Samba/CIFS](#sambacifs)
2025-09-08 16:20:10 +02:00
- [Directorios Locales](#directorios-locales)
2025-09-08 17:14:52 +02:00
4. [Configuración Paso a Paso](#configuración-paso-a-paso)
- [Preparación del Host](#preparación-del-host)
- [Montar Recursos Compartidos](#montar-recursos-compartidos)
- [Configurar Contenedores](#configurar-contenedores)
- [Crear Puntos de Montaje](#crear-puntos-de-montaje)
5. [Verificación y Pruebas](#verificación-y-pruebas)
6. [Solución de Problemas](#solución-de-problemas)
7. [Mejores Prácticas](#mejores-prácticas)
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
---
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
## Introducción
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
Esta guía explica cómo compartir recursos (NFS, Samba, directorios locales) entre el host de Proxmox y contenedores LXC, tanto privilegiados como no privilegiados, manteniendo permisos correctos y acceso de lectura/escritura.
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
### ¿Por qué es complejo?
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
- Los **contenedores no privilegiados** usan IDs de usuario/grupo desplazados (+100000)
- **NFS y Samba** manejan permisos de manera diferente
- Los **permisos tradicionales** de Linux tienen limitaciones
- La **persistencia** tras reinicios requiere configuración específica
### ¿Qué aprenderás?
- Cómo funcionan los permisos en Linux y por qué fallan con contenedores
- Qué son las ACL y por qué son esenciales para recursos compartidos
- Cómo configurar correctamente NFS, Samba y directorios locales
- Por qué usar el GID 101000 y el grupo `sharedfiles`
- Cómo hacer que todo sea persistente tras reinicios
2025-09-08 15:03:10 +02:00
---
2025-09-08 17:14:52 +02:00
## Conceptos Fundamentales
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
### Usuarios y Grupos en Linux
#### ¿Qué es un Usuario?
Un **usuario** en Linux es una identidad que puede:
- Poseer archivos y directorios
- Ejecutar procesos
- Tener permisos específicos
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
Cada usuario tiene:
2025-09-08 17:14:52 +02:00
- **Nombre**: Como `root`, `www-data`, `ncp`
2025-09-08 16:20:10 +02:00
- **UID (User ID)**: Número único, como `0` (root), `33` (www-data), `1000` (primer usuario)
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
```bash
2025-09-08 16:20:10 +02:00
# Ver información de un usuario
id www-data
# Salida: uid=33(www-data) gid=33(www-data) groups=33(www-data)
2025-09-08 17:14:52 +02:00
# Listar usuarios del sistema (solo los relevantes)
awk -F: '$3>=1000 && $1!="nobody"{print $1 " (UID: " $3 ")"}' /etc/passwd
# Salida ejemplo:
# ncp (UID: 1000)
# usuario1 (UID: 1001)
2025-09-08 16:06:50 +02:00
```
2025-09-08 16:20:10 +02:00
#### ¿Qué es un Grupo?
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
Un **grupo** es una colección de usuarios que comparten permisos. Permite:
- Dar acceso a múltiples usuarios sin configurar cada uno individualmente
- Organizar permisos de manera lógica
- Simplificar la administración
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
Cada grupo tiene:
- **Nombre**: Como `root`, `www-data`, `sharedfiles`
- **GID (Group ID)**: Número único, como `0` (root), `33` (www-data), `1000` (usuarios)
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Ver todos los grupos relevantes
getent group | grep -E "(root|www-data|sharedfiles)" | head -5
2025-09-08 16:20:10 +02:00
# Salida:
# root:x:0:
2025-09-08 17:14:52 +02:00
# www-data:x:33:
# sharedfiles:x:101000:
2025-09-08 16:20:10 +02:00
# Ver grupos de un usuario
groups www-data
# Salida: www-data : www-data
2025-09-08 17:14:52 +02:00
# Crear un nuevo grupo con GID específico
groupadd -g 101000 sharedfiles
2025-09-08 16:20:10 +02:00
# Añadir usuario a un grupo
2025-09-08 17:14:52 +02:00
usermod -aG sharedfiles www-data
2025-09-08 15:08:02 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
#### ¿Por qué son importantes los grupos?
**Ejemplo práctico**: Tienes 3 contenedores que ejecutan aplicaciones web:
- **Sin grupos**: Tendrías que dar permisos individuales a cada usuario de cada contenedor
2025-09-08 17:14:52 +02:00
- **Con grupos**: Creas un grupo `sharedfiles`, añades todos los usuarios web, y das permisos al grupo
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
---
### Permisos en Linux
2025-09-08 16:20:10 +02:00
#### Tipos de Permisos
Cada archivo y directorio tiene tres tipos de permisos para tres categorías de usuarios:
| Permiso | Símbolo | Valor | En Archivos | En Directorios |
|---------|---------|-------|-------------|----------------|
| **Lectura** | `r` | 4 | Leer contenido | Listar archivos |
| **Escritura** | `w` | 2 | Modificar archivo | Crear/eliminar archivos |
| **Ejecución** | `x` | 1 | Ejecutar archivo | Entrar al directorio |
#### Categorías de Usuarios
| Categoría | Descripción | Posición |
|-----------|-------------|----------|
| **Propietario** (user) | El dueño del archivo | Primera posición |
| **Grupo** (group) | Miembros del grupo propietario | Segunda posición |
| **Otros** (others) | Todos los demás usuarios | Tercera posición |
#### Lectura de Permisos
2025-09-08 15:01:00 +02:00
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Ver permisos de un directorio específico
ls -ld /mnt/shared_data
# Salida: drwxrwxr-x 2 root sharedfiles 4096 sep 8 10:30 /mnt/shared_data
2025-09-08 16:20:10 +02:00
# │││││││││
# │└┴┴┴┴┴┴┴─ Permisos
# └─────────── Tipo (d=directorio, -=archivo)
# Desglose de permisos: rwxrwxr-x
# Propietario (root): rwx = 7 (lectura + escritura + ejecución)
# Grupo (sharedfiles): rwx = 7 (lectura + escritura + ejecución)
# Otros: r-x = 5 (lectura + ejecución, sin escritura)
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
#### Permisos Numéricos
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
Los permisos se pueden expresar como números de 3 dígitos:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 16:20:10 +02:00
# Ejemplos comunes
chmod 755 archivo # rwxr-xr-x (propietario: todo, otros: lectura+ejecución)
chmod 644 archivo # rw-r--r-- (propietario: lectura+escritura, otros: solo lectura)
chmod 775 directorio # rwxrwxr-x (propietario y grupo: todo, otros: lectura+ejecución)
```
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
#### El Bit Setgid (Herencia de Grupo)
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
El **setgid** es crucial para directorios compartidos y es la clave para que funcionen correctamente:
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Sin setgid - PROBLEMA
2025-09-08 16:20:10 +02:00
mkdir /tmp/sin_setgid
chmod 775 /tmp/sin_setgid
chgrp sharedfiles /tmp/sin_setgid
2025-09-08 17:14:52 +02:00
# Crear archivo como usuario diferente
2025-09-08 16:20:10 +02:00
sudo -u www-data touch /tmp/sin_setgid/archivo1
2025-09-08 17:14:52 +02:00
ls -ld /tmp/sin_setgid/archivo1
# Salida: -rw-r--r-- 1 www-data www-data 0 sep 8 10:35 /tmp/sin_setgid/archivo1
# ❌ El archivo pertenece al grupo 'www-data', no 'sharedfiles'
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Con setgid - SOLUCIÓN
2025-09-08 16:20:10 +02:00
mkdir /tmp/con_setgid
chmod 2775 /tmp/con_setgid # El '2' inicial activa setgid
chgrp sharedfiles /tmp/con_setgid
2025-09-08 17:14:52 +02:00
sudo -u www-data touch /tmp/con_setgid/archivo2
ls -ld /tmp/con_setgid/archivo2
# Salida: -rw-r--r-- 1 www-data sharedfiles 0 sep 8 10:36 /tmp/con_setgid/archivo2
2025-09-08 16:20:10 +02:00
# ✅ El archivo hereda el grupo 'sharedfiles' del directorio padre
```
2025-09-08 17:14:52 +02:00
**¿Por qué es importante setgid?**
- **Sin setgid**: Cada proceso crea archivos con su grupo primario → inconsistencia
- **Con setgid**: Todos los archivos nuevos heredan el grupo del directorio → consistencia
- **Resultado**: Todos los usuarios del grupo pueden leer/escribir todos los archivos
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
**Identificar setgid visualmente**:
```bash
ls -ld /mnt/shared_data
# Con setgid: drwxrwsr-x (nota la 's' en lugar de 'x' en el grupo)
# Sin setgid: drwxrwxr-x (nota la 'x' normal en el grupo)
```
---
2025-09-08 16:20:10 +02:00
### Access Control Lists (ACL)
#### Limitaciones de los Permisos Tradicionales
Los permisos tradicionales de Linux solo permiten:
- **1 propietario**
- **1 grupo**
- **Permisos para "otros"**
**Problema**: ¿Qué pasa si necesitas que 3 grupos diferentes tengan acceso de escritura?
#### ¿Qué son las ACL?
Las **Access Control Lists (ACL)** extienden los permisos tradicionales permitiendo:
- **Múltiples usuarios** con permisos específicos
- **Múltiples grupos** con permisos específicos
- **Permisos por defecto** que se heredan automáticamente
```bash
2025-09-08 17:14:52 +02:00
# Instalar herramientas ACL (si no están instaladas)
apt-get update && apt-get install -y acl
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Ver ACL de un directorio
getfacl /mnt/shared_data
2025-09-08 16:20:10 +02:00
# Salida:
2025-09-08 17:14:52 +02:00
# file: mnt/shared_data
2025-09-08 16:06:50 +02:00
# owner: root
# group: sharedfiles
2025-09-08 15:27:32 +02:00
# user::rwx
# group::rwx
2025-09-08 16:20:10 +02:00
# group:webapps:rwx
# group:developers:r-x
2025-09-08 15:27:32 +02:00
# other::r-x
2025-09-08 16:06:50 +02:00
# default:user::rwx
2025-09-08 15:27:32 +02:00
# default:group::rwx
2025-09-08 16:20:10 +02:00
# default:group:webapps:rwx
2025-09-08 15:27:32 +02:00
# default:other::r-x
2025-09-08 15:01:00 +02:00
```
2025-09-08 16:20:10 +02:00
#### Configurar ACL
```bash
# Dar permisos a un grupo específico
2025-09-08 17:14:52 +02:00
setfacl -m g:webapps:rwx /mnt/shared_data
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
# Dar permisos a un usuario específico
2025-09-08 17:14:52 +02:00
setfacl -m u:ncp:rwx /mnt/shared_data
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Configurar permisos por defecto (se heredan en archivos nuevos)
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
2025-09-08 16:20:10 +02:00
# Aplicar ACL recursivamente a todo el contenido existente
2025-09-08 17:14:52 +02:00
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
2025-09-08 16:20:10 +02:00
# Combinar: aplicar a existente Y configurar por defecto
2025-09-08 17:14:52 +02:00
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
2025-09-08 16:20:10 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
#### ¿Por qué son importantes las ACL para NFS y Samba?
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
**NFS y mapeo de IDs**:
- NFS transmite solo números (UID/GID), no nombres
- Si el cliente tiene usuarios con IDs diferentes, los permisos se rompen
- Las ACL aseguran que el grupo correcto siempre tenga acceso
**Ejemplo práctico**:
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 16:20:10 +02:00
# Servidor NFS: usuario 'web' tiene UID 1001
# Cliente NFS: usuario 'web' tiene UID 1002
# Sin ACL: El cliente ve archivos del UID 1001 (usuario inexistente)
2025-09-08 17:14:52 +02:00
# Con ACL: El grupo 'sharedfiles' siempre tiene acceso, independiente de UIDs
2025-09-08 16:20:10 +02:00
```
2025-09-08 17:14:52 +02:00
**Samba y herencia**:
- Samba puede forzar grupos, pero las ACL son más flexibles
- Las ACL por defecto aseguran herencia correcta
- Funcionan incluso si Samba no está configurado perfectamente
---
### Contenedores No Privilegiados
2025-09-08 16:20:10 +02:00
#### ¿Qué son los Contenedores No Privilegiados?
Los contenedores **no privilegiados** son más seguros porque:
- El usuario `root` del contenedor NO es `root` del host
- Los IDs de usuario/grupo están "desplazados"
- Limitan el daño si el contenedor es comprometido
2025-09-08 17:14:52 +02:00
#### Mapeo de IDs en Proxmox
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
En un contenedor no privilegiado típico de Proxmox:
2025-09-08 16:20:10 +02:00
| Contenedor | Host | Explicación |
|------------|------|-------------|
| UID 0 (root) | UID 100000 | Root del contenedor = usuario 100000 del host |
| UID 1 | UID 100001 | Usuario 1 del contenedor = usuario 100001 del host |
| UID 1000 (usuario) | UID 101000 | Usuario 1000 del contenedor = usuario 101000 del host |
| GID 0 (root) | GID 100000 | Grupo root del contenedor = grupo 100000 del host |
| GID 1000 (grupo) | GID 101000 | Grupo 1000 del contenedor = grupo 101000 del host |
2025-09-08 17:14:52 +02:00
#### ¿Por qué usar GID 101000?
**El GID 101000 es estratégico porque**:
- Es el **primer GID mapeado** para contenedores no privilegiados en Proxmox
- Corresponde al **GID 1000 dentro del contenedor**, que es el GID estándar para grupos de usuarios
- Garantiza **compatibilidad universal** entre contenedores privilegiados y no privilegiados
- Es **predecible** y **consistente** en todas las instalaciones de Proxmox
```bash
# En el HOST: Crear grupo con GID 101000
groupadd -g 101000 sharedfiles
# En CONTENEDOR NO PRIVILEGIADO: Crear grupo con GID 1000
groupadd -g 1000 sharedfiles
# Este GID 1000 del contenedor se mapea automáticamente al GID 101000 del host
# En CONTENEDOR PRIVILEGIADO: Crear grupo con GID 101000
groupadd -g 101000 sharedfiles
# Mismo GID que el host, sin mapeo
```
2025-09-08 16:20:10 +02:00
#### El Problema en la Práctica
```bash
2025-09-08 17:14:52 +02:00
# En el HOST: Crear archivo con grupo 'sharedfiles' (GID 101000)
echo "datos importantes" > /mnt/shared_data/archivo.txt
chgrp sharedfiles /mnt/shared_data/archivo.txt
ls -ld /mnt/shared_data/archivo.txt
# Salida: -rw-r--r-- 1 root sharedfiles 18 sep 8 archivo.txt
# En el CONTENEDOR NO PRIVILEGIADO (sin configurar): Ver el mismo archivo
pct exec 101 -- ls -ld /mnt/shared_data/archivo.txt
# Salida: -rw-r--r-- 1 nobody nogroup 18 sep 8 archivo.txt
# ❌ El contenedor ve 'nobody:nogroup' porque no conoce el GID 101000 del host
# En el CONTENEDOR NO PRIVILEGIADO (configurado): Ver el mismo archivo
pct exec 101 -- ls -ld /mnt/shared_data/archivo.txt
# Salida: -rw-r--r-- 1 root sharedfiles 18 sep 8 archivo.txt
# ✅ El contenedor reconoce el grupo porque tiene 'sharedfiles' con GID 1000 (mapeado a 101000)
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:08:02 +02:00
2025-09-08 16:20:10 +02:00
#### ¿Por qué pasa esto?
2025-09-08 17:14:52 +02:00
1. **Host**: El archivo pertenece al GID 101000 (`sharedfiles`)
2. **Contenedor**: Busca qué grupo tiene GID 1000 en SU `/etc/group` (porque 101000 - 100000 = 1000)
3. **Sin configurar**: Si no existe ese GID en el contenedor, muestra `nogroup`
4. **Configurado**: Si existe el grupo `sharedfiles` con GID 1000, lo reconoce correctamente
5. **Consecuencia**: Solo con la configuración correcta el usuario del contenedor puede escribir
2025-09-08 16:20:10 +02:00
2025-09-08 15:27:32 +02:00
---
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
## Tipos de Recursos Compartidos
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
### NFS (Network File System)
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### ¿Qué es NFS?
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
**NFS** es un protocolo que permite montar directorios remotos como si fueran locales. Es especialmente popular en entornos Linux/Unix.
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### ¿Cómo funcionan los permisos en NFS?
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
**Característica clave**: NFS transmite solo **números** (UID/GID), no nombres de usuarios/grupos.
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Servidor NFS (ej: TrueNAS, Synology, servidor Linux)
# Archivo creado por usuario 'admin' (UID 1001) en grupo 'storage' (GID 2000)
-rw-rw-r-- 1 admin storage 1024 sep 8 archivo.txt
# Cliente NFS (Proxmox host)
# NFS transmite: UID=1001, GID=2000
# Proxmox busca en su /etc/passwd y /etc/group:
# - ¿Existe UID 1001? Si no → muestra número o 'nobody'
# - ¿Existe GID 2000? Si no → muestra número o 'nogroup'
# Resultado típico en Proxmox:
-rw-rw-r-- 1 1001 2000 1024 sep 8 archivo.txt
# o
-rw-rw-r-- 1 nobody nogroup 1024 sep 8 archivo.txt
2025-09-08 16:20:10 +02:00
```
2025-09-08 17:14:52 +02:00
#### Problemas comunes con permisos NFS
**Problema 1: UIDs/GIDs diferentes**
```bash
# Servidor NFS: usuario 'web' = UID 500
# Cliente: usuario 'web' = UID 1000
# Resultado: El cliente no puede acceder a archivos del servidor
```
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
**Problema 2: Usuarios inexistentes**
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Servidor: archivo creado por UID 1500 (usuario 'app')
# Cliente: no existe UID 1500
# Resultado: archivo aparece como 'nobody' y no es accesible
```
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Solución: Grupo universal + ACL**
```bash
# En lugar de depender de UIDs específicos, usar un grupo común:
# 1. Crear grupo 'sharedfiles' con GID 101000 en host y contenedores
# 2. Aplicar ACL para dar permisos al grupo
# 3. Todos los usuarios relevantes pertenecen al grupo
# Resultado: Funciona independientemente de los UIDs individuales
2025-09-08 15:08:02 +02:00
```
2025-09-08 17:14:52 +02:00
#### Configuración típica de servidores NFS
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
**TrueNAS/FreeNAS**:
2025-09-08 17:14:52 +02:00
- Crear dataset con permisos Unix
- Configurar servicio NFS
- Definir redes permitidas
- Los permisos se basan en UID/GID numéricos
2025-09-08 15:08:02 +02:00
2025-09-08 16:20:10 +02:00
**Synology**:
2025-09-08 17:14:52 +02:00
- Crear carpeta compartida
- Habilitar servicio NFS
- Configurar permisos de acceso
- Mapear usuarios si es necesario
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Servidor Linux**:
2025-09-08 15:27:32 +02:00
```bash
2025-09-08 16:20:10 +02:00
# /etc/exports
2025-09-08 17:14:52 +02:00
/export/data 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
2025-09-08 16:06:50 +02:00
```
2025-09-08 17:14:52 +02:00
---
### Samba/CIFS
#### ¿Qué es Samba?
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Samba** implementa el protocolo SMB/CIFS, permitiendo que sistemas Linux compartan archivos con Windows y otros sistemas.
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### ¿Cómo funcionan los permisos en Samba?
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
Samba tiene **dos capas de permisos**:
1. **Permisos de Samba** (definidos en smb.conf)
2. **Permisos del sistema de archivos** (permisos Unix tradicionales + ACL)
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Ejemplo de configuración Samba
[shared_data]
path = /srv/samba/shared
browseable = yes
read only = no
valid users = @storage_users
force group = storage_users
create mask = 0664
directory mask = 2775
2025-09-08 15:08:02 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### Diferencias con NFS
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
| Aspecto | NFS | Samba |
|---------|-----|-------|
| **Autenticación** | Basada en IP/red | Usuario/contraseña |
| **Permisos** | Solo UID/GID numéricos | Mapeo de usuarios + permisos Unix |
| **Herencia** | Depende del sistema de archivos | Configurable (force group, masks) |
| **Compatibilidad** | Linux/Unix nativo | Multiplataforma (Windows, Linux, macOS) |
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### Configuración típica de servidores Samba
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
**Servidor Linux con Samba**:
```bash
# /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
security = user
map to guest = bad user
[shared]
path = /srv/samba/shared
valid users = @sharedfiles
force group = sharedfiles
create mask = 0664
directory mask = 2775
read only = no
```
**NAS (Synology, QNAP, etc.)**:
- Crear carpeta compartida
- Configurar usuarios y grupos
- Habilitar SMB/CIFS
- Definir permisos por usuario/grupo
2025-09-08 15:08:02 +02:00
2025-09-08 16:20:10 +02:00
---
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Directorios Locales
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### ¿Qué son los directorios locales?
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
Son carpetas que existen directamente en el host de Proxmox, sin involucrar protocolos de red.
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### Ventajas
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
- **Rendimiento máximo** (sin overhead de red)
- **Simplicidad** (sin configuración de red)
- **Control total** sobre permisos
- **Ideal para datos críticos** o de alta frecuencia de acceso
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### Casos de uso típicos
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
```bash
# Logs centralizados
/var/log/containers/
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Configuraciones compartidas
/etc/shared-configs/
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Datos de aplicaciones
/opt/app-data/
# Backups locales
/backup/containers/
2025-09-08 16:20:10 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
---
## Configuración Paso a Paso
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Preparación del Host
#### Paso 1: Instalar herramientas necesarias
2025-09-08 15:08:02 +02:00
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Actualizar sistema
apt-get update
# Instalar herramientas ACL
apt-get install -y acl
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Instalar cliente NFS (si vas a usar NFS)
apt-get install -y nfs-common
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Instalar cliente Samba (si vas a usar Samba)
apt-get install -y cifs-utils
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar instalación
which setfacl getfacl mount.nfs mount.cifs
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### Paso 2: Crear grupo universal
2025-09-08 15:01:00 +02:00
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Crear grupo con GID específico para compatibilidad universal
groupadd -g 101000 sharedfiles
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Verificar creación
getent group sharedfiles
# Salida: sharedfiles:x:101000:
# Añadir usuario root al grupo (opcional, para pruebas)
usermod -aG sharedfiles root
2025-09-08 15:08:02 +02:00
```
2025-09-08 17:14:52 +02:00
**¿Por qué GID 101000?**
- Es el primer GID mapeado en contenedores no privilegiados de Proxmox
- Corresponde al GID 1000 dentro del contenedor (GID estándar de usuarios)
- Garantiza compatibilidad entre contenedores privilegiados y no privilegiados
- Es predecible y consistente en todas las instalaciones
---
### Montar Recursos Compartidos
#### Opción A: Montar recurso NFS
2025-09-08 16:20:10 +02:00
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Crear punto de montaje
mkdir -p /mnt/nfs_share
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Montar temporalmente para probar
mount -t nfs 192.168.1.100:/export/data /mnt/nfs_share
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar montaje
df -h | grep nfs_share
# Salida: 192.168.1.100:/export/data 100G 50G 50G 50% /mnt/nfs_share
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Ver permisos originales
ls -ld /mnt/nfs_share
# Salida típica: drwxr-xr-x 2 1001 1001 4096 sep 8 /mnt/nfs_share
2025-09-08 16:06:50 +02:00
```
2025-09-08 17:14:52 +02:00
**Hacer montaje persistente**:
2025-09-08 16:06:50 +02:00
```bash
# Editar /etc/fstab
2025-09-08 17:14:52 +02:00
echo "192.168.1.100:/export/data /mnt/nfs_share nfs rw,hard,nofail,rsize=131072,wsize=131072,timeo=600,retrans=2,_netdev 0 0" >> /etc/fstab
# Verificar sintaxis
2025-09-08 16:06:50 +02:00
mount -a
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Comprobar que funciona tras reinicio
systemctl reboot
# Tras reinicio:
df -h | grep nfs_share
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Explicación de opciones NFS**:
- `rw`: Lectura y escritura
- `hard`: Reintentar indefinidamente si el servidor no responde
- `nofail`: No fallar el arranque si no se puede montar
- `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)
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### Opción B: Montar recurso Samba
2025-09-08 15:08:02 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Crear punto de montaje
mkdir -p /mnt/samba_share
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Crear archivo de credenciales
cat > /etc/cifs-credentials << EOF
2025-09-08 15:27:32 +02:00
username=tu_usuario
2025-09-08 16:20:10 +02:00
password=tu_password
2025-09-08 15:27:32 +02:00
domain=tu_dominio
2025-09-08 17:14:52 +02:00
EOF
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Proteger archivo de credenciales
2025-09-08 15:27:32 +02:00
chmod 600 /etc/cifs-credentials
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Montar temporalmente para probar
mount -t cifs //192.168.1.200/shared /mnt/samba_share -o credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar montaje
df -h | grep samba_share
# Salida: //192.168.1.200/shared 500G 200G 300G 40% /mnt/samba_share
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Ver permisos originales
ls -ld /mnt/samba_share
```
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Hacer montaje persistente**:
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Editar /etc/fstab
echo "//192.168.1.200/shared /mnt/samba_share cifs credentials=/etc/cifs-credentials,iocharset=utf8,vers=3.0,_netdev,nofail 0 0" >> /etc/fstab
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar sintaxis
mount -a
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Explicación de opciones Samba**:
- `credentials=`: Archivo con usuario/contraseña
- `iocharset=utf8`: Codificación de caracteres
- `vers=3.0`: Versión del protocolo SMB
- `_netdev`: Esperar a que la red esté lista
- `nofail`: No fallar el arranque si no se puede montar
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
#### Opción C: Crear directorio local
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
```bash
# Crear directorio local
mkdir -p /mnt/local_share
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Ver permisos iniciales
ls -ld /mnt/local_share
# Salida: drwxr-xr-x 2 root root 4096 sep 8 /mnt/local_share
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:27:32 +02:00
---
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
### Configurar Permisos Universales
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Independientemente del tipo de recurso (NFS, Samba, local), aplicar la misma configuración**:
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
```bash
# Ejemplo con /mnt/shared_data (cambiar por tu ruta)
SHARED_DIR="/mnt/shared_data"
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Paso 1: Asignar propietario y grupo
chown root:sharedfiles "$SHARED_DIR"
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Paso 2: Aplicar permisos con setgid
chmod 2775 "$SHARED_DIR"
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Paso 3: Verificar setgid (debe aparecer 's' en lugar de 'x' para el grupo)
ls -ld "$SHARED_DIR"
# Salida esperada: drwxrwsr-x 2 root sharedfiles 4096 sep 8 /mnt/shared_data
# ↑ Esta 's' indica setgid activo
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Paso 4: Aplicar ACL para contenido existente
setfacl -R -m g:sharedfiles:rwx "$SHARED_DIR"
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Paso 5: Configurar ACL por defecto para archivos nuevos
setfacl -d -m g:sharedfiles:rwx "$SHARED_DIR"
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Paso 6: Verificar ACL
getfacl "$SHARED_DIR"
# Salida esperada:
# file: mnt/shared_data
# owner: root
# group: sharedfiles
# user::rwx
# group::rwx
# other::r-x
# default:user::rwx
# default:group::rwx
# default:other::r-x
```
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
**¿Por qué esta configuración funciona universalmente?**
- **chown root:sharedfiles**: Establece un propietario conocido y el grupo universal
- **chmod 2775**: Da permisos completos al propietario y grupo, y activa setgid
- **setgid (el '2' en 2775)**: Asegura que todos los archivos nuevos hereden el grupo `sharedfiles`
- **ACL recursiva (-R)**: Corrige permisos de archivos/directorios existentes
- **ACL por defecto (-d)**: Asegura que archivos nuevos tengan permisos correctos
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
---
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
### Configurar Contenedores
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
#### Contenedores Privilegiados
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
Los contenedores privilegiados comparten los mismos UIDs/GIDs que el host, por lo que la configuración es más simple:
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Entrar al contenedor privilegiado (ejemplo: ID 100)
2025-09-08 16:20:10 +02:00
pct exec 100 -- bash
2025-09-08 17:14:52 +02:00
# Crear grupo idéntico al host
2025-09-08 16:20:10 +02:00
groupadd -g 101000 sharedfiles
2025-09-08 17:14:52 +02:00
# 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 17:14:52 +02:00
# Si tienes Nextcloud u otras aplicaciones
usermod -aG sharedfiles ncp 2>/dev/null || true
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar membresía
2025-09-08 15:08:02 +02:00
groups root
2025-09-08 16:20:10 +02:00
# Salida: root : root sharedfiles
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
groups www-data
2025-09-08 16:20:10 +02:00
# Salida: www-data : www-data sharedfiles
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Salir del contenedor
2025-09-08 15:01:00 +02:00
exit
```
2025-09-08 17:14:52 +02:00
**Nota importante**: En contenedores privilegiados, técnicamente no es estrictamente necesario añadir usuarios al grupo si solo el propietario (root) va a escribir archivos. Sin embargo, es una buena práctica porque:
- **Consistencia**: Mantiene la misma configuración en todos los contenedores
- **Flexibilidad**: Permite que servicios web (www-data) o aplicaciones (ncp) escriban directamente
- **Futuro**: Si cambias permisos o añades servicios, ya está configurado
- **Depuración**: Es más fácil diagnosticar problemas cuando la configuración es uniforme
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
#### Contenedores No Privilegiados
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
Los contenedores no privilegiados requieren mapeo de IDs, por lo que necesitan configuración específica:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Entrar al contenedor no privilegiado (ejemplo: ID 101)
2025-09-08 15:08:02 +02:00
pct exec 101 -- bash
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Crear grupo con GID mapeado
2025-09-08 15:08:02 +02:00
groupadd -g 1000 sharedfiles
2025-09-08 17:14:52 +02:00
# Importante: GID 1000 en contenedor = GID 101000 en host
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Listar usuarios disponibles en el contenedor
awk -F: '$3>=1000 && $1!="nobody"{print $1 " (UID: " $3 ")"}' /etc/passwd
# Salida ejemplo:
2025-09-08 16:20:10 +02:00
# ncp (UID: 1000)
2025-09-08 17:14:52 +02:00
# www-data (UID: 33)
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Añadir usuarios al grupo
2025-09-08 15:08:02 +02:00
usermod -aG sharedfiles root
usermod -aG sharedfiles www-data
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Ejemplo específico: añadir usuario de Nextcloud
2025-09-08 16:06:50 +02:00
usermod -aG sharedfiles ncp 2>/dev/null || true
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Verificar configuración completa
2025-09-08 15:27:32 +02:00
id www-data
2025-09-08 16:20:10 +02:00
# Salida esperada: uid=33(www-data) gid=33(www-data) groups=33(www-data),1000(sharedfiles)
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
id ncp 2>/dev/null || echo "Usuario ncp no existe"
# Si existe: uid=1000(ncp) gid=1000(ncp) groups=1000(ncp),1000(sharedfiles)
# Salir del contenedor
2025-09-08 15:08:02 +02:00
exit
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**¿Cómo añadir más usuarios?**
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
Si necesitas añadir usuarios adicionales (por ejemplo, para otras aplicaciones):
2025-09-08 15:27:32 +02:00
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Dentro del contenedor no privilegiado
2025-09-08 16:20:10 +02:00
pct exec 101 -- bash
2025-09-08 17:14:52 +02:00
# Ver todos los usuarios del sistema
cat /etc/passwd | grep -v nologin | grep -v false | awk -F: '{print $1 " (UID: " $3 ")"}'
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Añadir usuarios específicos
usermod -aG sharedfiles usuario1
usermod -aG sharedfiles usuario2
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Para añadir TODOS los usuarios con UID >= 1000 automáticamente:
for user in $(awk -F: '$3>=1000 && $1!="nobody"{print $1}' /etc/passwd); do
usermod -aG sharedfiles "$user" 2>/dev/null || true
echo "Añadido usuario: $user"
2025-09-08 15:08:02 +02:00
done
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar todos los usuarios añadidos
2025-09-08 16:20:10 +02:00
getent group sharedfiles
2025-09-08 17:14:52 +02:00
# Salida: sharedfiles:x:1000:root,www-data,ncp,usuario1,usuario2
exit
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:27:32 +02:00
---
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Crear Puntos de Montaje
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
#### Configurar montajes en contenedores
2025-09-08 15:01:00 +02:00
2025-09-08 15:27:32 +02:00
```bash
# Para contenedor privilegiado (ID 100)
2025-09-08 17:14:52 +02:00
pct set 100 -mp0 /mnt/shared_data,mp=/mnt/shared,shared=1,backup=0,acl=1
2025-09-08 15:01:00 +02:00
2025-09-08 15:27:32 +02:00
# Para contenedor no privilegiado (ID 101)
2025-09-08 17:14:52 +02:00
pct set 101 -mp0 /mnt/shared_data,mp=/mnt/shared,shared=1,backup=0,acl=1
2025-09-08 16:20:10 +02:00
# Reiniciar contenedores para activar montajes
pct reboot 100
pct reboot 101
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
# Esperar a que arranquen
sleep 15
2025-09-08 17:14:52 +02:00
# Verificar que los montajes están activos
2025-09-08 16:20:10 +02:00
pct exec 100 -- df -h | grep shared
pct exec 101 -- df -h | grep shared
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Explicación de parámetros**:
- `mp0`: Primer punto de montaje (mp1, mp2, etc. para adicionales)
- `/mnt/shared_data`: Ruta en el host
- `mp=/mnt/shared`: Ruta dentro del contenedor
- `shared=1`: **Esencial para clusters** - permite migración sin copiar datos
- `backup=0`: Excluye del backup de vzdump (evita duplicar datos)
- `acl=1`: Habilita soporte ACL dentro del contenedor
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**¿Por qué shared=1 es importante?**
- Sin `shared=1`: Proxmox copia todos los datos al migrar el contenedor
- Con `shared=1`: Proxmox asume que los datos están disponibles en todos los nodos
- **Resultado**: Migraciones rápidas y sin duplicar almacenamiento
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
---
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
## Verificación y Pruebas
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Prueba básica de funcionamiento
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Desde el HOST: Crear archivo de prueba
echo "Archivo creado desde el host" > /mnt/shared_data/test_host.txt
ls -ld /mnt/shared_data/test_host.txt
# Salida esperada: -rw-r--r-- 1 root sharedfiles 29 sep 8 test_host.txt
# Desde CONTENEDOR PRIVILEGIADO: Crear archivo
pct exec 100 -- bash -c 'echo "Archivo desde contenedor privilegiado" > /mnt/shared/test_privileged.txt'
pct exec 100 -- ls -ld /mnt/shared/test_privileged.txt
# Salida esperada: -rw-r--r-- 1 root sharedfiles 35 sep 8 test_privileged.txt
# Desde CONTENEDOR NO PRIVILEGIADO: Crear archivo
pct exec 101 -- bash -c 'echo "Archivo desde contenedor no privilegiado" > /mnt/shared/test_unprivileged.txt'
pct exec 101 -- ls -ld /mnt/shared/test_unprivileged.txt
# Salida esperada: -rw-r--r-- 1 root sharedfiles 38 sep 8 test_unprivileged.txt
# Verificar desde el HOST que todos los archivos son accesibles
ls -ld /mnt/shared_data/test_*.txt
# Todos deben mostrar grupo 'sharedfiles' y ser legibles
2025-09-08 16:20:10 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Prueba de escritura cruzada
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Desde HOST: Modificar archivo creado por contenedor
echo "Modificado desde host" >> /mnt/shared_data/test_privileged.txt
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Desde CONTENEDOR PRIVILEGIADO: Modificar archivo creado por host
pct exec 100 -- bash -c 'echo "Modificado desde privilegiado" >> /mnt/shared/test_host.txt'
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Desde CONTENEDOR NO PRIVILEGIADO: Modificar archivo creado por privilegiado
pct exec 101 -- bash -c 'echo "Modificado desde no privilegiado" >> /mnt/shared/test_privileged.txt'
2025-09-08 16:06:50 +02:00
2025-09-08 17:14:52 +02:00
# Verificar que todas las modificaciones funcionaron
cat /mnt/shared_data/test_host.txt
cat /mnt/shared_data/test_privileged.txt
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
### Verificar herencia de permisos
2025-09-08 15:01:00 +02:00
2025-09-08 15:27:32 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Crear subdirectorio desde contenedor no privilegiado
pct exec 101 -- mkdir -p /mnt/shared/subdir_test
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Verificar que hereda el grupo correcto
2025-09-08 16:20:10 +02:00
ls -ld /mnt/shared_data/subdir_test
2025-09-08 17:14:52 +02:00
# Salida esperada: drwxrwsr-x 2 root sharedfiles 4096 sep 8 subdir_test
# ↑ La 's' indica que setgid se heredó
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Crear archivo dentro del subdirectorio
pct exec 101 -- bash -c 'echo "test herencia" > /mnt/shared/subdir_test/archivo.txt'
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Verificar herencia de grupo
ls -ld /mnt/shared_data/subdir_test/archivo.txt
# Salida esperada: -rw-r--r-- 1 root sharedfiles 14 sep 8 archivo.txt
2025-09-08 15:01:00 +02:00
```
2025-09-08 15:27:32 +02:00
---
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
## Solución de Problemas
2025-09-08 15:08:02 +02:00
2025-09-08 15:27:32 +02:00
### Error: "Permission denied" al escribir
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Síntomas**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
pct exec 101 -- bash -c 'echo "test" > /mnt/shared/test.txt'
# bash: /mnt/shared/test.txt: Permission denied
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Diagnóstico**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# 1. Verificar permisos del directorio
2025-09-08 16:20:10 +02:00
ls -ld /mnt/shared_data
2025-09-08 17:14:52 +02:00
# ¿Tiene permisos de escritura para el grupo? ¿Está activo setgid?
2025-09-08 16:20:10 +02:00
# 2. Verificar grupo en el contenedor
pct exec 101 -- getent group sharedfiles
2025-09-08 17:14:52 +02:00
# ¿Existe el grupo? ¿Tiene el GID correcto?
2025-09-08 16:06:50 +02:00
2025-09-08 16:20:10 +02:00
# 3. Verificar membresía del usuario
2025-09-08 17:14:52 +02:00
pct exec 101 -- groups root
# ¿El usuario pertenece al grupo sharedfiles?
# 4. Verificar ACL
getfacl /mnt/shared_data
# ¿Están configuradas las ACL para el grupo?
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Soluciones**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Solución 1: Reconfigurar permisos básicos
chmod 2775 /mnt/shared_data
chgrp sharedfiles /mnt/shared_data
# Solución 2: Recrear grupo en contenedor
2025-09-08 16:20:10 +02:00
pct exec 101 -- groupadd -g 1000 sharedfiles
2025-09-08 17:14:52 +02:00
pct exec 101 -- usermod -aG sharedfiles root
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Solución 3: Reconfigurar ACL
2025-09-08 16:20:10 +02:00
setfacl -R -m g:sharedfiles:rwx /mnt/shared_data
setfacl -d -m g:sharedfiles:rwx /mnt/shared_data
2025-09-08 17:14:52 +02:00
# Solución 4: Reiniciar contenedor
pct reboot 101
2025-09-08 15:01:00 +02:00
```
2025-09-08 16:20:10 +02:00
### Error: Archivos aparecen como "nobody:nogroup"
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Síntomas**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
pct exec 101 -- ls -ld /mnt/shared/archivo.txt
# -rw-r--r-- 1 nobody nogroup 100 sep 8 archivo.txt
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Causa**: El contenedor no reconoce los UIDs/GIDs del host.
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
**Solución**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Crear grupo con GID correcto en el contenedor
2025-09-08 16:20:10 +02:00
pct exec 101 -- groupadd -g 1000 sharedfiles
2025-09-08 17:14:52 +02:00
# Si el problema persiste, verificar mapeo
pct exec 101 -- cat /proc/self/uid_map
pct exec 101 -- cat /proc/self/gid_map
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
### Error: Montaje NFS falla
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Síntomas**:
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
mount -t nfs 192.168.1.100:/export/data /mnt/nfs_share
# mount.nfs: Connection refused
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Diagnóstico**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# 1. Verificar conectividad
2025-09-08 16:06:50 +02:00
ping 192.168.1.100
2025-09-08 17:14:52 +02:00
# 2. Verificar servicio NFS en el servidor
2025-09-08 16:06:50 +02:00
showmount -e 192.168.1.100
2025-09-08 17:14:52 +02:00
# 3. Verificar puertos
nmap -p 111,2049 192.168.1.100
# 4. Verificar logs
journalctl -u nfs-client -f
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
**Soluciones**:
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Instalar cliente NFS si no está
apt-get install -y nfs-common
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Reiniciar servicios NFS
systemctl restart nfs-client.target
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Probar con opciones específicas
mount -t nfs -o vers=3 192.168.1.100:/export/data /mnt/nfs_share
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
### Error: Montaje Samba falla
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Síntomas**:
```bash
mount -t cifs //192.168.1.200/shared /mnt/samba_share
# mount error(13): Permission denied
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Diagnóstico**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# 1. Verificar credenciales
cat /etc/cifs-credentials
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# 2. Probar conexión manual
smbclient -L //192.168.1.200 -U usuario
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# 3. Verificar versión SMB
mount -t cifs //192.168.1.200/shared /mnt/samba_share -o vers=1.0,username=usuario
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
**Soluciones**:
```bash
# Instalar cliente Samba si no está
apt-get install -y cifs-utils
# Probar diferentes versiones SMB
mount -t cifs //192.168.1.200/shared /mnt/samba_share -o vers=3.0,credentials=/etc/cifs-credentials
# Verificar y corregir credenciales
chmod 600 /etc/cifs-credentials
2025-09-08 16:06:50 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Error: Contenedor no arranca tras añadir montaje
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
**Síntomas**:
2025-09-08 16:06:50 +02:00
```bash
2025-09-08 17:14:52 +02:00
pct start 101
# TASK ERROR: startup for container '101' failed
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Diagnóstico**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Ver configuración del contenedor
cat /etc/pve/lxc/101.conf | grep mp
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Ver logs del contenedor
journalctl -u pve-container@101 -f
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
**Soluciones**:
2025-09-08 15:01:00 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Verificar que la ruta del host existe
ls -ld /mnt/shared_data
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
# Corregir configuración si es necesaria
pct set 101 -delete mp0
pct set 101 -mp0 /mnt/shared_data,mp=/mnt/shared,shared=1,backup=0,acl=1
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
# Arrancar contenedor
pct start 101
2025-09-08 15:01:00 +02:00
```
2025-09-08 17:14:52 +02:00
---
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
## Mejores Prácticas
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
### Organización de directorios
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Estructura recomendada
/mnt/
├── nfs_shares/
│ ├── documents/
│ ├── media/
│ └── backups/
├── samba_shares/
│ ├── public/
│ └── private/
└── local_shares/
├── configs/
├── logs/
└── data/
2025-09-08 16:20:10 +02:00
```
2025-09-08 17:14:52 +02:00
### Nomenclatura consistente
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
```bash
# Usar nombres descriptivos y consistentes
/mnt/nfs_documents # En lugar de /mnt/share1
/mnt/samba_public # En lugar de /mnt/smb
/mnt/local_configs # En lugar de /mnt/data
```
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
### Seguridad
2025-09-08 15:01:00 +02:00
2025-09-08 15:08:02 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Limitar permisos de "otros"
chmod 2770 /mnt/sensitive_data # Sin acceso para "otros"
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Usar ACL específicas para datos sensibles
setfacl -m u:admin:rwx /mnt/sensitive_data
setfacl -m g:admins:rwx /mnt/sensitive_data
setfacl -m other::--- /mnt/sensitive_data # Sin acceso para otros
2025-09-08 16:20:10 +02:00
```
2025-09-08 17:14:52 +02:00
### Monitoreo
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Script para verificar montajes
#!/bin/bash
for mount in /mnt/nfs_* /mnt/samba_* /mnt/local_*; do
if mountpoint -q "$mount"; then
echo "✅ $mount está montado"
else
echo "❌ $mount NO está montado"
fi
done
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
# Verificar permisos
for dir in /mnt/*/; do
if [[ $(stat -c %G "$dir") == "sharedfiles" ]]; then
echo "✅ $dir tiene grupo correcto"
else
echo "❌ $dir tiene grupo incorrecto: $(stat -c %G "$dir")"
fi
done
2025-09-08 16:20:10 +02:00
```
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
### Backup y recuperación
2025-09-08 15:08:02 +02:00
2025-09-08 16:20:10 +02:00
```bash
2025-09-08 17:14:52 +02:00
# Backup de configuraciones
cp /etc/fstab /etc/fstab.backup
cp /etc/cifs-credentials /etc/cifs-credentials.backup
2025-09-08 15:08:02 +02:00
2025-09-08 17:14:52 +02:00
# Backup de configuraciones de contenedores
cp /etc/pve/lxc/*.conf /backup/lxc-configs/
# Script de restauración rápida
#!/bin/bash
# restore_mounts.sh
systemctl stop pve-container@*
mount -a
systemctl start pve-container@*
2025-09-08 15:08:02 +02:00
```
2025-09-08 15:01:00 +02:00
2025-09-08 16:20:10 +02:00
---
2025-09-08 17:14:52 +02:00
## Resumen Final
2025-09-08 16:20:10 +02:00
2025-09-08 17:14:52 +02:00
### Puntos clave para recordar
2025-09-08 15:01:00 +02:00
2025-09-08 17:14:52 +02:00
1. **Grupo universal**: Usar `sharedfiles` con GID 101000 en host, GID 1000 en contenedores no privilegiados
2. **Setgid**: Siempre usar `chmod 2775` para herencia automática de grupo
3. **ACL**: Aplicar tanto recursivamente (-R) como por defecto (-d)
4. **Montajes**: Usar `shared=1,backup=0,acl=1` en configuraciones de contenedores
5. **Persistencia**: Configurar `/etc/fstab` con opciones `_netdev,nofail,0 0`
2025-09-08 15:27:32 +02:00
2025-09-08 17:14:52 +02:00
### Comando de verificación rápida
```bash
# Ejecutar para verificar configuración completa
#!/bin/bash
echo "=== Verificación de configuración ==="
echo "1. Grupo sharedfiles en host:"
getent group sharedfiles
echo "2. Permisos del directorio compartido:"
ls -ld /mnt/shared_data
2025-09-08 16:42:46 +02:00
2025-09-08 17:14:52 +02:00
echo "3. ACL configuradas:"
getfacl /mnt/shared_data | grep -E "(group:sharedfiles|default:group:sharedfiles)"
echo "4. Montajes en contenedores:"
pct exec 100 -- df -h | grep shared 2>/dev/null || echo "Contenedor 100 no disponible"
pct exec 101 -- df -h | grep shared 2>/dev/null || echo "Contenedor 101 no disponible"
echo "5. Grupos en contenedores:"
pct exec 100 -- getent group sharedfiles 2>/dev/null || echo "Grupo no configurado en contenedor 100"
pct exec 101 -- getent group sharedfiles 2>/dev/null || echo "Grupo no configurado en contenedor 101"
echo "=== Verificación completada ==="
```
Con esta configuración, tendrás un sistema robusto y flexible para compartir recursos entre Proxmox y contenedores LXC, con permisos correctos y persistencia tras reinicios.
```
2025-09-08 15:27:32 +02:00