Desde Febrero de 2021 he estado usando una instalación de Samba en una Raspberry Pi 4 para tener diferentes shares relacionados con aplicaciones multimedia.

En esta ocasión voy a instalar Samba en un LXC de Proxmox con TurnKey Core. El procedimiento para crear este LXC es el mismo que usé para ejecutar Docker en Proxmox LXC.

Características del LXC

Este servidor de ficheros con Samba se ejecutará sobre un LXC con las siguientes características:

  • LXC no privilegiado, sin nesting y sin keyctl
  • CT ID 300
  • Password + SSH key file
  • Disco de 4GB
  • CPU con 1 core
  • 1024MB de memoria
  • IP fija 192.168.1.90
  • Configurado con Start at boot

El archivo de configuración de esta máquina se guarda en el fichero /etc/pve/lxc/300.conf:

arch: amd64
cores: 1
hostname: samba
memory: 1024
nameserver: 192.168.1.1
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.1.1,hwaddr=XX:XX:XX:XX:XX:XX,ip=192.168.1.90/24,type=veth
onboot: 1
ostype: debian
rootfs: local-lvm:vm-300-disk-0,size=4G
searchdomain: home
swap: 512
unprivileged: 1

El archivo de configuración del contenedor LXC se guarda en el fichero /var/lib/lxc/300/config:

lxc.cgroup.relative = 0
lxc.cgroup.dir.monitor = lxc.monitor/300
lxc.cgroup.dir.container = lxc/300
lxc.cgroup.dir.container.inner = ns
lxc.arch = amd64
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.include = /usr/share/lxc/config/debian.userns.conf
lxc.seccomp.profile = /var/lib/lxc/300/rules.seccomp
lxc.apparmor.profile = generated
lxc.apparmor.raw = deny mount -> /proc/,
lxc.apparmor.raw = deny mount -> /sys/,
lxc.mount.auto = sys:mixed
lxc.monitor.unshare = 1
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
lxc.tty.max = 2
lxc.environment = TERM=linux
lxc.uts.name = samba
lxc.cgroup2.memory.max = 1073741824
lxc.cgroup2.memory.high = 1065353216
lxc.cgroup2.memory.swap.max = 536870912
lxc.rootfs.path = /var/lib/lxc/300/rootfs
lxc.net.0.type = veth
lxc.net.0.veth.pair = veth300i0
lxc.net.0.hwaddr = XX:XX:XX:XX:XX:XX
lxc.net.0.name = eth0
lxc.net.0.mtu = 1500
lxc.net.0.script.up = /usr/share/lxc/lxcnetaddbr
lxc.cgroup2.cpuset.cpus =

Se puede observar el mapeo de identificadores que se realiza entre el host y el contenedor al tratarse de un LXC no privilegiado. El ID 0 del LXC, es decir root:root, se mapea como el usuario 100000:100000 sin privilegios en Proxmox:

lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536

También se observa que, al no utilizar nesting, los directorios /proc y /sys del host Proxmox no se montan en el LXC:

lxc.apparmor.profile = generated
lxc.apparmor.raw = deny mount -> /proc/,
lxc.apparmor.raw = deny mount -> /sys/,

Preparación del host Proxmox

En el host Proxmox hay que crear y configurar el directorio que proporcionará almacenamiento persistente de los datos y que después se montará en el LXC.

En el caso de mi servidor Proxmox 8.0.2, se utilizará el disco local-lvm de tipo LVM ya que, desafortunadamente, no dispongo de ZFS.

# Crear el directorio base para compartir con LXC (permisos 755)
mkdir /data/samba

# Cambiar el propietario del directorio según el mapeo de los LXC no privilegiados
chown -R 100000:100000 /data/samba

# Añadir el punto de montaje al contenedor LXC (el directorio en LXC se crea automáticamente)
pct set 300 -mp0 /data/samba,mp=/mnt/samba

Nota: Si no se cambia el propietario root:root del directorio /data/samba por el usuario 100000:100000, el directorio /mnt/samba del LXC pertenecerá al usuario nobody:nogroup y habrá problemas de acceso debido a los permisos 755 del mismo.

A continuación se pone en marcha el LXC desde la CLI de Proxmox y se procede a configurarlo de la misma manera que ya expliqué en el artículo sobre LXC y Docker:

pct start 300

Acceder al LXC

Se puede acceder al LXC utilizando la opción Console de la GUI o, mucho mejor, mediante SSH gracias a la configuración de las claves públicas que se hizo en el mismo:

ssh root@192.168.1.90

Instalación de Samba

La instalación de Samba en una distribución basada en Debian es muy sencilla usando el comando apt:

apt update
apt install samba samba-common-bin -y

Se puede comprobar que el servicio Samba se ha puesto en marcha correctamente y que se ha configurado para hacerlo al iniciar la máquina mediante el comando systemctl status smbd.service:

* smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-11-05 08:31:41 CET; 35s ago
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)
    Process: 225 ExecStartPre=/usr/share/samba/update-apparmor-samba-profile (code=exited, status=0/SUCCESS)
   Main PID: 229 (smbd)
     Status: "smbd: ready to serve connections..."
      Tasks: 4 (limit: 18778)
     Memory: 30.1M
        CPU: 82ms
     CGroup: /system.slice/smbd.service
             |-229 /usr/sbin/smbd --foreground --no-process-group
             |-271 /usr/sbin/smbd --foreground --no-process-group
             |-272 /usr/sbin/smbd --foreground --no-process-group
             `-275 /usr/sbin/smbd --foreground --no-process-group

Nov 05 08:31:41 samba systemd[1]: Starting Samba SMB Daemon...
Nov 05 08:31:41 samba systemd[1]: Started Samba SMB Daemon.

Como en mi entorno no utilizo NetBIOS, desactivo el servicio nmbd.service para liberar recursos.

systemctl stop nmbd.service
systemctl disable nmbd.service
systemctl status nmbd.service
* nmbd.service - Samba NMB Daemon
     Loaded: loaded (/lib/systemd/system/nmbd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:nmbd(8)
             man:samba(7)
             man:smb.conf(5)

Configuración de Samba

A continuación se configura Samba de forma similar a como lo hice anteriormente en mi instalación de Samba en una Raspberry Pi.

Usuarios y directorios

# Creación de directorios que Samba exportará por SMB
cd /mnt/samba
mkdir homes
mkdir media
mkdir downloads

# Cambiar el propietario de los directorios al grupo de Samba
# sambashare: LXC (111) --> Host (100111)
chown -R :sambashare homes
chown -R :sambashare media
chown -R :sambashare downloads

# Cambiar los permisos de grupo de los directorios comunes
chmod -R g+w media
chmod -R g+w downloads

# Crear mi usuario de Linux (sin login) y su directorio protegido en homes
# manel: LXC (1000:111) --> Host (101000:100111)
mkdir homes/manel
adduser --home /mnt/samba/homes/manel --no-create-home --shell /usr/bin/nologin --ingroup sambashare manel
chown manel:sambashare homes/manel
chmod 2770 homes/manel

# Crear mi usuario de Samba y habilitarlo
smbpasswd -a manel
smbpasswd -e manel

# Añadir usuarios al grupo de Samba
usermod -aG sambashare manel
usermod -aG sambashare $(whoami)

Modificación de smb.conf

Antes de modificar el fichero de configuración de Samba en /etc/samba/smb.conf se hace una copia de seguridad:

cd /etc/samba
mv smb.conf smb.conf.original

A continuación se edita el fichero smb.conf con el siguiente contenido:

[global]
   server string = samba.home
   server role = standalone server
   interfaces = eth0
   bind interfaces only = yes
   disable netbios = yes
   smb ports = 445
   log file = /var/log/samba/smb.log
   max log size = 10000
   security = user

[manel]
   path = /mnt/samba/homes/manel
   browseable = yes
   read only = no
   force create mode = 0660
   force directory mode = 2770
   valid users = manel

[media]
   path = /mnt/samba/media
   browseable = yes
   read only = no
   force create mode = 0660
   force directory mode = 2770
   valid users = @sambashare

[downloasd]
   path = /mnt/samba/downloads
   browseable = yes
   read only = no
   force create mode = 0660
   force directory mode = 2770
   valid users = @sambashare

Finalmente se reinicia el servicio smbd.service:

systemctl restart smbd.service

Si todo funciona correctamente, se debería poder acceder a \\192.168.1.90 desde otra máquina. En la siguiente captura de pantalla se muestran los shares vistos desde una máquina Windows:

Samba Shares

Referencias