Mount SMB shares in LXC Debian 13

0) Prereqs (inside the LXC)

sudo apt update
sudo apt install -y cifs-utils
sudo mkdir -p /data/mediacentarr /data/multimedia

Make sure the credentials file exists and is locked down:

sudo chown root:root /etc/.smbcredentials_plex
sudo chmod 600 /etc/.smbcredentials_plex

1) Create one script that mounts both shares

Create /usr/local/sbin/mount-smb-shares.sh:

sudo nano /usr/local/sbin/mount-smb-shares.sh

Paste this:

#!/usr/bin/env bash
set -euo pipefail

SERVER_IP="172.25.6.21"
CREDS="/etc/.smbcredentials_plex"

# Common mount options (tweak if needed)
COMMON_OPTS="credentials=${CREDS},vers=3.1.1,iocharset=utf8,uid=plex,gid=plex"

# Shares to mount: "UNC|MOUNTPOINT"
SHARES=(
  "//${SERVER_IP}/mediacentarr|/data/mediacentarr"
  "//${SERVER_IP}/multimedia|/data/multimedia"
)

log() { echo "[mount-smb-shares] $*"; }

# Already mounted?
is_mounted() {
  mountpoint -q "$1"
}

# Wait for server to be reachable (up to ~120s)
wait_for_server() {
  log "Waiting for SMB server ${SERVER_IP} to be reachable..."
  for i in {1..60}; do
    if ping -c1 -W1 "${SERVER_IP}" >/dev/null 2>&1; then
      log "Server reachable."
      return 0
    fi
    sleep 2
  done
  log "ERROR: server not reachable after timeout."
  return 1
}

mount_one() {
  local unc="$1"
  local mp="$2"

  mkdir -p "$mp"

  if is_mounted "$mp"; then
    log "Already mounted: $mp"
    return 0
  fi

  log "Mounting ${unc} -> ${mp}"
  mount -t cifs "$unc" "$mp" -o "$COMMON_OPTS"
  log "Mounted OK: $mp"
}

main() {
  # If both are already mounted, exit cleanly
  local all_mounted="yes"
  for entry in "${SHARES[@]}"; do
    IFS="|" read -r _unc mp <<< "$entry"
    if ! is_mounted "$mp"; then
      all_mounted="no"
      break
    fi
  done
  if [[ "$all_mounted" == "yes" ]]; then
    log "All shares already mounted."
    exit 0
  fi

  # Wait until SMB server is reachable, then mount missing ones
  wait_for_server

  for entry in "${SHARES[@]}"; do
    IFS="|" read -r unc mp <<< "$entry"
    mount_one "$unc" "$mp"
  done

  log "Done."
}

main "$@"

Make it executable:

sudo chmod 755 /usr/local/sbin/mount-smb-shares.sh

Quick manual test:

sudo /usr/local/sbin/mount-smb-shares.sh
mount | grep -E "mediacentarr|multimedia" || true

2) Create a single systemd service

Create /etc/systemd/system/smb-shares-mount.service:

sudo nano /etc/systemd/system/smb-shares-mount.service

Paste:

[Unit]
Description=Mount SMB shares (mediacentarr, multimedia) after server reachable
After=network.target
Wants=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/mount-smb-shares.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Enable it:

sudo systemctl daemon-reload
sudo systemctl enable --now smb-shares-mount.service

Check status/logs:

systemctl status smb-shares-mount.service --no-pager
journalctl -u smb-shares-mount.service -b --no-pager

3) (Recommended) Add a timer to retry if the server is down at boot

If the SMB server sometimes comes up later, add a timer that retries every minute.

Create /etc/systemd/system/smb-shares-mount.timer:

sudo nano /etc/systemd/system/smb-shares-mount.timer

Paste:

[Unit]
Description=Retry mounting SMB shares until available

[Timer]
OnBootSec=30
OnUnitActiveSec=60
Unit=smb-shares-mount.service

[Install]
WantedBy=timers.target

Enable the timer:

sudo systemctl daemon-reload
sudo systemctl enable --now smb-shares-mount.timer
systemctl list-timers | grep smb-shares || true

Because the script exits cleanly if both mountpoints are already mounted, the timer becomes “no-op” once everything is up.


4) Reboot test

sudo reboot

After reboot:

mount | grep -E "mediacentarr|multimedia" || true
ls /data/mediacentarr | head
ls /data/multimedia | head

Posted

in

by

Tags:

WordPress Appliance - Powered by TurnKey Linux