Курс по работе с Samba в Linux by Perplexity

Продвинутый курс: Работа с Samba для организации общих ресурсов

Этот курс является продолжением базового курса по правам доступа в Linux и предназначен для тех, кто хочет освоить Samba — мощный инструмент для организации файлового обмена между Linux и Windows системами. Мы рассмотрим установку и настройку Samba, создание различных типов общих папок, управление пользователями, интеграцию с LXC-контейнерами в Proxmox, а также решение типичных проблем. Все примеры будут даны на основе Ubuntu.

Глава 1: Введение в Samba

Что такое Samba и зачем она нужна

Samba — это бесплатный программный пакет с открытым исходным кодом, который реализует протоколы SMB/CIFS (Server Message Block / Common Internet File System). Эти протоколы изначально были разработаны Microsoft для организации совместного доступа к файлам и принтерам в сети Windows.[1][2][3][4][5]

Основная задача Samba — обеспечить бесшовную интеграцию между системами Linux/Unix и Windows. С помощью Samba вы можете превратить Linux-сервер в файловый сервер, к которому могут подключаться клиенты Windows, macOS и Linux. Это особенно важно в гетерогенных сетях, где работают разные операционные системы.[2:1][6][7][5:1][8][9][1:1]

Типичные сценарии использования Samba включают организацию централизованного хранилища файлов для офиса, создание домашнего медиа-сервера, предоставление общего доступа к проектам для команды разработчиков, а также резервное копирование данных с Windows-машин на Linux-сервер.[10][11][12]

Архитектура Samba

Samba состоит из нескольких компонентов:[13][6:1][7:1]

smbd — основной демон, который обрабатывает запросы на доступ к файлам и принтерам. Он прослушивает TCP порты 139 и 445. Этот демон отвечает за аутентификацию пользователей и управление сессиями.[3:1][6:2][14][15][16]

nmbd — демон для разрешения имен NetBIOS и обнаружения сервисов в локальной сети. Он прослушивает UDP порты 137 и 138. Этот компонент позволяет клиентам находить ваш Samba-сервер по имени в сетевом окружении.[6:3][15:1][17][16:1]

smb.conf — главный конфигурационный файл, расположенный в /etc/samba/smb.conf. В нём определяются все настройки сервера и параметры общих ресурсов (шар).[7:2][11:1][13:1][2:2][6:4]

smbpasswd — утилита для управления паролями пользователей Samba. Samba использует отдельную базу данных паролей, независимую от системных паролей Linux.[18][2:3][3:2][10:1]

Модели безопасности Samba

Samba поддерживает несколько режимов безопасности:[4:1][3:3]

Share-level security — каждая шара имеет свой собственный пароль. Любой, кто знает пароль шары, может к ней подключиться. Это устаревший и небезопасный метод, не рекомендуемый к использованию.[3:4][4:2]

User-level security (по умолчанию) — каждая шара настроена на доступ определённым пользователям. При подключении Samba проверяет имя пользователя и пароль. Это наиболее распространённый режим для небольших сетей и домашних серверов.[2:4][4:3][7:3][10:2][3:5]

Server-level security — аналогичен user-level, но Samba делегирует аутентификацию другому SMB-серверу. Это полезно, когда у вас есть выделенный сервер аутентификации.[3:6]

Domain-level security — Samba становится членом домена Windows и использует контроллер домена (Domain Controller) для аутентификации. После успешной аутентификации пользователь получает токен, позволяющий доступ ко всем ресурсам домена.[19][4:4][3:7]

В этом курсе мы сосредоточимся на user-level security, так как он наиболее прост в настройке и подходит для большинства задач.[7:4][10:3][2:5]

Глава 2: Установка и базовая настройка Samba

Установка Samba в Ubuntu

Установка Samba в Ubuntu выполняется через менеджер пакетов APT:[1:2][13:2][6:5][10:4]

# Обновляем список пакетов
sudo apt update

# Устанавливаем Samba
sudo apt install samba -y

После установки можно проверить версию Samba:[6:6]

samba -V
# Вывод: Version 4.15.13-Ubuntu (или другая версия)

Также проверим, что служба Samba запущена:[20][13:3][6:7]

sudo systemctl status smbd

Вы должны увидеть статус active (running). Если служба не запущена, запустите её вручную:

sudo systemctl start smbd
sudo systemctl enable smbd

Команда enable обеспечит автоматический запуск Samba при загрузке системы.[6:8][7:5]

Структура конфигурационного файла smb.conf

Главный конфигурационный файл Samba находится по адресу /etc/samba/smb.conf. Он состоит из нескольких секций:[11:2][13:4][2:6][7:6]

Секция [global] — содержит глобальные настройки, применяемые ко всему серверу:[11:3][2:7][7:7]

[global]
   workgroup = WORKGROUP
   security = user
   server string = %h server (Samba %v)
   log file = /var/log/samba/log.%m
   max log size = 1000

Параметры в секции [global]:

  • workgroup — имя рабочей группы или домена. По умолчанию это WORKGROUP для Windows систем.[21][11:4][3:8]
  • security = user — режим аутентификации на уровне пользователей[4:5][2:8][3:9]
  • server string — описание сервера, отображаемое в сетевом окружении[11:5]
  • log file — путь к лог-файлам[16:2]

Секции общих ресурсов (shares) — каждая шара определяется в своей секции с именем в квадратных скобках:[10:5][7:8][11:6]

[myshare]
   comment = My shared folder
   path = /srv/samba/myshare
   browseable = yes
   writable = yes
   valid users = alice, bob

Настройка Firewall

Samba требует открытия нескольких портов в firewall:[14:1][20:1][6:9]

  • TCP 445 — основной порт для SMB
  • TCP 139 — порт для NetBIOS
  • UDP 137-138 — порты для разрешения имён NetBIOS

В Ubuntu с UFW (Uncomplicated Firewall):

# Разрешаем Samba через firewall
sudo ufw allow samba

# Или более детально:
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
sudo ufw allow 137:138/udp

# Проверяем статус
sudo ufw status

Без правильной настройки firewall клиенты не смогут подключиться к серверу, получая ошибку “Connection refused” или “Host is down”.[15:2][17:1][14:2]

Проверка конфигурации с помощью testparm

После любых изменений в smb.conf необходимо проверить корректность конфигурации с помощью утилиты testparm:[14:3][16:3][2:9]

testparm

Программа проверит синтаксис файла и выведет предупреждения об ошибках:[16:4]

Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Processing section "[myshare]"
Loaded services file OK.

Если есть ошибки, testparm укажет на них. Типичные ошибки включают неправильные имена параметров, отсутствие обязательных опций, конфликты настроек.[22][16:5]

Можно также проверить, будет ли разрешён доступ с конкретного хоста:[16:6]

testparm /etc/samba/smb.conf client-hostname 192.168.1.50

Глава 3: Управление пользователями Samba

Почему Samba использует отдельную базу пользователей

Важно понимать: Samba не может использовать обычные Linux-пароли напрямую. Это связано с тем, что протоколы SMB/CIFS используют другие методы шифрования паролей, несовместимые с тем, как Linux хранит пароли в /etc/shadow.[9:1][2:10][3:10]

Поэтому у нас будут две базы пользователей:[2:11]

  1. Системные пользователи Linux (в /etc/passwd)
  2. Пользователи Samba с их паролями (в отдельной базе данных)

Пользователь Samba должен существовать как системный пользователь Linux, но его пароль Samba может отличаться от системного пароля.[9:2][2:12][3:11]

Создание пользователя Samba

Процесс создания пользователя Samba включает два шага:[20:2][10:6][2:13]

Шаг 1: Создать системного пользователя Linux (если он ещё не существует):

# Создаём пользователя без домашней директории
sudo useradd -M alice

# Или с домашней директорией
sudo useradd -m alice

Опция -M создаёт пользователя без домашней директории, что удобно для пользователей, которые будут использоваться только для Samba.[12:1][10:7]

Шаг 2: Добавить пользователя в базу Samba и установить пароль:

sudo smbpasswd -a alice

Вас попросят дважды ввести пароль. Этот пароль не обязан совпадать с системным паролем Linux:[9:3][2:14]

New SMB password:
Retype new SMB password:
Added user alice.

Теперь пользователь alice может подключаться к Samba-шарам.[10:8][2:15]

Управление паролями пользователей

Изменить пароль существующего пользователя Samba:[2:16]

sudo smbpasswd alice

Удалить пользователя из базы Samba:[2:17]

sudo smbpasswd -x alice

Это удалит пользователя только из Samba, но не из системы Linux.[2:18]

Отключить пользователя (временно запретить доступ):

sudo smbpasswd -d alice

Включить обратно:

sudo smbpasswd -e alice

Просмотр списка пользователей Samba

Чтобы увидеть всех пользователей, зарегистрированных в Samba:[2:19]

sudo pdbedit -L

Вывод:

alice:1000:Alice Smith
bob:1001:Bob Jones

Для более детальной информации:

sudo pdbedit -L -v

Глава 4: Создание общих папок

Публичная папка с гостевым доступом

Начнём с самого простого примера — создадим публичную папку, к которой может получить доступ любой без аутентификации.[7:9][10:9][11:7]

Шаг 1: Создать директорию:

sudo mkdir -p /srv/samba/public

Шаг 2: Установить права доступа:

# Владелец - nobody, группа - nogroup (для гостевого доступа)
sudo chown nobody:nogroup /srv/samba/public

# Все могут читать, писать и входить
sudo chmod 0777 /srv/samba/public

Шаг 3: Добавить секцию в /etc/samba/smb.conf:

sudo nano /etc/samba/smb.conf

Добавьте в конец файла:

[public]
   comment = Public shared folder
   path = /srv/samba/public
   browseable = yes
   writable = yes
   guest ok = yes
   read only = no
   create mask = 0664
   directory mask = 0775

Разберём параметры:[12:2][7:10][10:10]

  • comment — описание шары
  • path — путь к директории на сервере
  • browseable = yes — шара видна в сетевом окружении
  • writable = yes или read only = no — разрешена запись
  • guest ok = yes — гостевой доступ разрешён (без пароля)[7:11][11:8]
  • create mask — права для новых файлов (0664 = rw-rw-r–)[23][12:3]
  • directory mask — права для новых директорий (0775 = rwxrwxr-x)[23:1][12:4]

Шаг 4: Проверить конфигурацию и перезапустить Samba:

testparm
sudo systemctl restart smbd

Теперь любой в сети может подключиться к \\server-ip\public и работать с файлами.[10:11][7:12]

Приватная папка для конкретного пользователя

Создадим приватную папку, доступную только одному пользователю.[11:9][10:12]

Шаг 1: Создать пользователя и директорию:

# Создаём системного пользователя
sudo useradd -m alice

# Создаём его Samba-аккаунт
sudo smbpasswd -a alice

# Создаём приватную директорию
sudo mkdir -p /srv/samba/private_alice

Шаг 2: Установить владельца и права:

# Владелец - alice
sudo chown alice:alice /srv/samba/private_alice

# Только владелец имеет полный доступ
sudo chmod 0700 /srv/samba/private_alice

Шаг 3: Добавить секцию в smb.conf:

[private_alice]
   comment = Alice's private folder
   path = /srv/samba/private_alice
   browseable = no
   writable = yes
   guest ok = no
   valid users = alice
   create mask = 0600
   directory mask = 0700

Параметры:[10:13][11:10][2:20]

  • browseable = no — шара не отображается в списке, но доступна по прямой ссылке
  • guest ok = no — гостевой доступ запрещён
  • valid users = alice — доступ разрешён только пользователю alice[3:12][10:14][2:21]

Шаг 4: Перезапустить Samba:

testparm
sudo systemctl restart smbd

Теперь только alice может подключиться к \\server-ip\private_alice, используя свой Samba-пароль.[10:15]

Групповая папка с частичным доступом

Создадим папку, где разные пользователи имеют разные уровни доступа.[10:16][2:22]

Сценарий: Есть группа разработчиков (developers), которые могут читать и писать, и группа менеджеров (managers), которые могут только читать.

Шаг 1: Создать группы и пользователей:

# Создаём группы
sudo groupadd developers
sudo groupadd managers

# Создаём пользователей
sudo useradd -m alice
sudo useradd -m bob
sudo useradd -m charlie

# Добавляем в группы
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo usermod -aG managers charlie

# Создаём Samba-пользователей
sudo smbpasswd -a alice
sudo smbpasswd -a bob
sudo smbpasswd -a charlie

Шаг 2: Создать директорию и настроить права:

# Создаём директорию
sudo mkdir -p /srv/samba/project

# Владелец root, группа developers
sudo chown root:developers /srv/samba/project

# Группа может читать и писать
sudo chmod 0770 /srv/samba/project

# Устанавливаем SetGID для автоматического наследования группы
sudo chmod g+s /srv/samba/project

# Даём группе managers права на чтение через ACL
sudo setfacl -R -m g:managers:rx /srv/samba/project
sudo setfacl -d -m g:managers:rx /srv/samba/project

Шаг 3: Настроить smb.conf:

[project]
   comment = Project folder with different access levels
   path = /srv/samba/project
   browseable = yes
   writable = yes
   guest ok = no
   valid users = @developers, @managers
   write list = @developers
   read list = @managers
   create mask = 0664
   directory mask = 0775
   force group = developers

Параметры:[4:6][2:23][10:17]

  • valid users = @developers, @managers — доступ разрешён членам обеих групп. Символ @ указывает, что это группа[2:24]
  • write list = @developers — только developers могут писать[4:7][2:25]
  • read list = @managers — managers могут только читать[4:8][2:26]
  • force group = developers — все файлы создаются с группой developers[23:2][12:5]

Шаг 4: Перезапустить Samba:

testparm
sudo systemctl restart smbd

Теперь alice и bob могут читать и писать, а charlie может только читать файлы в проекте.[10:18][2:27]

Административный доступ к папке

Иногда нужно дать определённому пользователю полные права администратора на шару:[2:28]

[shared]
   path = /srv/samba/shared
   valid users = @team
   admin users = alice
   writable = yes

Параметр admin users = alice даёт alice полные права на все файлы в шаре, независимо от их реальных Linux-прав. Она сможет читать, изменять и удалять любые файлы.[2:29]

Глава 5: Подключение к Samba с различных клиентов

Подключение из Windows

Подключение через проводник Windows (Windows 10/11)

Способ 1: Прямое подключение

  1. Откройте Проводник Windows (File Explorer)
  2. В адресной строке введите: \\IP-адрес-сервера\имя-шары[5:2][8:1][24]

Например: \\192.168.1.100\project

  1. Если требуется аутентификация, введите имя пользователя и пароль Samba[8:2][24:1][5:3]

Способ 2: Добавление сетевого расположения

  1. Откройте Проводник
  2. Правой кнопкой на “Этот компьютер” (This PC)
  3. Выберите “Добавить сетевое расположение” (Add a network location)[24:2]
  4. Следуйте мастеру, указав \\192.168.1.100\project[24:3]

Способ 3: Подключение сетевого диска

Для постоянного доступа можно “подключить сетевой диск”:[5:4]

  1. Откройте Проводник
  2. Выберите “Компьютер” → “Подключить сетевой диск”
  3. Выберите букву диска (например, Z:)
  4. Введите путь: \\192.168.1.100\project
  5. Установите флажок “Восстанавливать подключение при входе в систему”
  6. Нажмите “Готово”

Или через PowerShell:[5:5]

NET USE Z: \\192.168.1.100\project

Теперь шара будет доступна как диск Z: на вашем компьютере.[24:4][5:6]

Создание локального пользователя Windows (опционально)

Если вы хотите, чтобы Windows автоматически использовала учетные данные при подключении, можно создать локального пользователя с тем же именем, что и в Samba:[5:7]

# Запустите PowerShell от имени администратора
$password = Read-Host -AsSecureString
New-LocalUser -Name "alice" -Password $password

Теперь, войдя в Windows под пользователем alice, вы автоматически получите доступ к Samba-шарам без повторного ввода пароля.[5:8]

Подключение из Linux

Использование smbclient для проверки

Сначала установим клиентские утилиты Samba:[5:9]

sudo apt install smbclient cifs-utils

Проверим доступные шары на сервере:[16:7][5:10]

smbclient -L //192.168.1.100 -U alice

Вас попросят ввести пароль. Вывод покажет список доступных шар:[5:11]

Sharename       Type      Comment
---------       ----      -------
public          Disk      Public shared folder
project         Disk      Project folder
IPC$            IPC       IPC Service

Подключиться к шаре для работы в интерактивном режиме:[16:8]

smbclient //192.168.1.100/project -U alice

После ввода пароля вы попадёте в командную строку SMB, где можно использовать команды вроде ls, cd, get, put:

smb: \> ls
smb: \> cd documents
smb: \> get file.txt
smb: \> put localfile.txt
smb: \> exit

Монтирование шары с помощью mount.cifs

Для постоянной работы удобнее примонтировать Samba-шару как локальную директорию.[25][26][27][28]

Создать точку монтирования:

sudo mkdir -p /mnt/samba_project

Простое монтирование с паролем в командной строке (небезопасно):

sudo mount -t cifs //192.168.1.100/project /mnt/samba_project -o username=alice,password=mypassword

После выполнения команды шара будет доступна в /mnt/samba_project.[26:1][25:1]

Безопасное монтирование с файлом учётных данных:[27:1][28:1][25:2]

Создайте файл с учётными данными:

sudo nano /etc/samba/credentials

Добавьте:

username=alice
password=mypassword

Защитите файл от чтения другими пользователями:

sudo chmod 600 /etc/samba/credentials

Теперь монтируйте, используя файл учётных данных:

sudo mount -t cifs //192.168.1.100/project /mnt/samba_project -o credentials=/etc/samba/credentials,uid=1000,gid=1000

Параметры:[25:3][26:2][27:2]

  • credentials=/etc/samba/credentials — файл с учётными данными
  • uid=1000 — файлы будут принадлежать пользователю с UID 1000
  • gid=1000 — файлы будут принадлежать группе с GID 1000

Автоматическое монтирование при загрузке (fstab):[28:2][27:3][25:4]

Отредактируйте /etc/fstab:

sudo nano /etc/fstab

Добавьте строку:

//192.168.1.100/project /mnt/samba_project cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,_netdev,iocharset=utf8 0 0

Параметр _netdev указывает, что это сетевое устройство, и монтирование должно происходить только после поднятия сети.[27:4][28:3]

Проверьте монтирование:

sudo mount -a

Если ошибок нет, шара будет автоматически монтироваться при каждой загрузке системы.[28:4][27:5]

Размонтирование:

sudo umount /mnt/samba_project

Дополнительные опции монтирования

При монтировании через mount.cifs можно использовать множество опций:[26:3][25:5][27:6]

  • vers=3.0 — указать версию протокола SMB (1.0, 2.0, 2.1, 3.0, 3.1.1)[29][27:7]
  • ro — монтировать только для чтения
  • rw — монтировать для чтения и записи (по умолчанию)
  • dir_mode=0755 — права для директорий
  • file_mode=0644 — права для файлов
  • noauto — не монтировать автоматически (полезно для fstab)
  • iocharset=utf8 — использовать кодировку UTF-8[25:6][27:8]

Пример с несколькими опциями:

sudo mount -t cifs //192.168.1.100/project /mnt/samba_project \
  -o credentials=/etc/samba/credentials,uid=1000,gid=1000,vers=3.0,iocharset=utf8,dir_mode=0775,file_mode=0664

Глава 6: Samba в LXC-контейнерах Proxmox

Запуск Samba внутри LXC-контейнера

Одна из распространённых задач в Proxmox — запустить Samba-сервер внутри непривилегированного LXC-контейнера. Это позволяет изолировать файловый сервер от основной системы хоста.[30][31][32][12:6]

Создание и настройка LXC для Samba

Шаг 1: В веб-интерфейсе Proxmox создайте новый непривилегированный LXC-контейнер на основе Ubuntu:[31:1][32:1][12:7]

  • Hostname: samba-server
  • Unprivileged container: Yes (оставить отмеченным)
  • Выделите необходимые ресурсы (CPU, RAM, диск)

Шаг 2: Войдите в контейнер через консоль или SSH:[12:8]

pct enter 100  # где 100 - ID контейнера

Шаг 3: Внутри контейнера установите Samba:

apt update && apt upgrade -y
apt install samba -y

Шаг 4: Создайте пользователей и настройте шары согласно инструкциям из предыдущих глав.[31:2][12:9]

Шаг 5: Проверьте, что Samba работает:

systemctl status smbd

Теперь вы можете подключаться к Samba-серверу в контейнере, используя IP-адрес контейнера.[31:3][12:10]

Проблема с UID/GID маппингом в непривилегированных контейнерах

Когда Samba работает в непривилегированном LXC-контейнере, возникает та же проблема с маппингом UID/GID, что мы рассматривали в предыдущем курсе.[33][34][35][31:4]

Напомним: в непривилегированном контейнере UID 0 (root) маппится на UID 100000 на хосте, UID 1000 — на 101000 и т.д.. Это создаёт проблемы при монтировании директорий с хоста в контейнер через bind mount.[32:2][33:1][31:5]

Пример проблемы

Допустим:

  1. На хосте Proxmox есть директория /storage/data, принадлежащая UID 1000
  2. Вы монтируете её в контейнер с ID 100
  3. Внутри контейнера пользователь с UID 1000 не может получить доступ к файлам

Почему? Потому что UID 1000 внутри контейнера на самом деле является UID 101000 на хосте, а файлы принадлежат UID 1000 на хосте.[32:3][31:6]

Решение 1: Настройка lxc.idmap

На хосте Proxmox настройте маппинг UID/GID для контейнера.[34:1][35:1][33:2][32:4][31:7]

Шаг 1: Остановить контейнер:

pct stop 100

Шаг 2: Отредактировать /etc/subuid и /etc/subgid на хосте:[35:2][33:3][31:8]

nano /etc/subuid

Добавить (если нет):

root:100000:65536
root:1000:1

То же самое для /etc/subgid.[33:4][31:9]

Шаг 3: Отредактировать конфигурацию контейнера /etc/pve/lxc/100.conf:[35:3][33:5][31:10]

nano /etc/pve/lxc/100.conf

Добавить в конец:

# Маппинг UID
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535

# Маппинг GID
lxc.idmap: g 0 100000 1000
lxc.idmap: g 1000 1000 1
lxc.idmap: g 1001 101001 64535

Это маппит UID 1000 контейнера напрямую на UID 1000 хоста.[33:6][35:4][31:11]

Шаг 4: Добавить bind mount в конфигурацию контейнера:

mp0: /storage/data,mp=/mnt/data

Шаг 5: Запустить контейнер:

pct start 100

Теперь пользователь с UID 1000 внутри контейнера сможет работать с файлами в /mnt/data.[32:5][31:12]

Решение 2: Использование force user и force group

Более простой способ — использовать параметры force user и force group в smb.conf:[23:3][12:11][31:13]

[shared]
   path = /mnt/data
   valid users = smbuser
   writable = yes
   force user = smbuser
   force group = smbgroup

Все операции с файлами будут выполняться от имени указанного пользователя и группы, что упрощает управление правами.[12:12][23:4]

Создайте пользователя с нужным UID внутри контейнера:

groupadd -g 1000 smbgroup
useradd -u 1000 -g smbgroup -M smbuser
smbpasswd -a smbuser

Теперь все файлы, созданные через Samba, будут принадлежать UID 1000 и GID 1000, что соответствует владельцу на хосте.[31:14][12:13]

Решение 3: Использование ACL на хосте

Если маппинг сложен, можно использовать ACL на хосте для предоставления доступа mapped UID:[36][12:14]

# На хосте Proxmox
# Контейнер 100 имеет пользователя с UID 1000, который на хосте = 101000
setfacl -m u:101000:rwx /storage/data

Это даст доступ пользователю в контейнере без изменения маппинга.[36:1]

Общие директории между несколькими LXC-контейнерами

Часто требуется организовать доступ нескольких контейнеров к одному хранилищу.[37][32:6][31:15]

Способ 1: Общий bind mount с хоста

На хосте Proxmox создайте директорию и примонтируйте её в несколько контейнеров:[37:1][31:16]

# На хосте
mkdir -p /storage/shared
chmod 775 /storage/shared

В конфигурации первого контейнера (100.conf):

mp0: /storage/shared,mp=/mnt/shared

В конфигурации второго контейнера (101.conf):

mp0: /storage/shared,mp=/mnt/shared

Оба контейнера получат доступ к одной и той же директории. Главное — правильно настроить UID/GID маппинг или использовать одинаковые UID в обоих контейнерах.[37:2][32:7][31:17]

Способ 2: Один контейнер с Samba, другие — клиенты

Более правильный подход с точки зрения безопасности:[30:1][31:18]

  1. Контейнер 100 запускает Samba-сервер и имеет bind mount к /storage/data с хоста
  2. Контейнер 101 монтирует Samba-шару из контейнера 100 через сеть

Внутри контейнера 101:[26:4][27:9]

apt install cifs-utils
mkdir -p /mnt/samba_share

# Монтируем шару из другого контейнера
mount -t cifs //IP-контейнера-100/shared /mnt/samba_share \
  -o credentials=/etc/samba/creds,uid=1000,gid=1000

Это создаёт чёткое разделение: один контейнер управляет файлами и правами, остальные получают доступ через стандартный протокол.[30:2][31:19]

Подключение контейнера к Samba-шаре на другом контейнере

Рассмотрим полный пример настройки двух контейнеров:[30:3][32:8][31:20]

Контейнер 100 (Samba-сервер):

# Внутри контейнера 100
apt install samba
useradd -m alice
smbpasswd -a alice

nano /etc/samba/smb.conf

Добавить:

[data]
   path = /mnt/data
   valid users = alice
   writable = yes
   browseable = yes

Перезапустить Samba:

systemctl restart smbd

Контейнер 101 (клиент):

# Внутри контейнера 101
apt install cifs-utils

# Создать файл с учётными данными
nano /etc/samba/creds

Содержимое:

username=alice
password=alicepassword

Защитить файл:

chmod 600 /etc/samba/creds

Монтировать шару:

mkdir -p /mnt/remote_data
mount -t cifs //IP_контейнера_100/data /mnt/remote_data -o credentials=/etc/samba/creds

Добавить в /etc/fstab для автоматического монтирования:

//IP_контейнера_100/data /mnt/remote_data cifs credentials=/etc/samba/creds,_netdev 0 0

Теперь контейнер 101 может работать с файлами, хранящимися в контейнере 100.[30:4][31:21]

Глава 7: Типичные ошибки и их решение

Ошибки подключения

mount error(13): Permission denied

Причина: Неверное имя пользователя или пароль, либо пользователь не имеет доступа к шаре.[38][14:4]

Решение:

  1. Проверьте учётные данные:
smbclient -L //server-ip -U username
  1. Убедитесь, что пользователь добавлен в Samba:
sudo pdbedit -L | grep username
  1. Проверьте параметр valid users в smb.conf[38:1][2:30]
  2. Проверьте права Linux на директорию:
ls -l /srv/samba/sharename

mount error(22): Invalid argument

Причина: Неверные параметры в команде монтирования или несовместимая версия протокола.[29:1][27:10]

Решение:

  1. Проверьте синтаксис команды mount:
sudo mount -t cifs //server/share /mnt/point -o username=user,password=pass
  1. Попробуйте явно указать версию протокола:
sudo mount -t cifs //server/share /mnt/point -o username=user,password=pass,vers=3.0
  1. Проверьте, что cifs-utils установлен:
sudo apt install cifs-utils
  1. Проверьте dmesg для подробностей:
dmesg | tail

mount error(112): Host is down

Причина: Сервер недоступен по сети или служба smbd не запущена.[29:2][14:5]

Решение:

  1. Проверьте доступность хоста:
ping server-ip
  1. Проверьте, что smbd запущен на сервере:
sudo systemctl status smbd
  1. Проверьте firewall на сервере:[15:3][14:6]
sudo ufw status
# Должны быть открыты порты 139, 445
  1. Попробуйте telnet к порту 445:[15:4]
telnet server-ip 445

Если соединение не устанавливается, проблема в сети или firewall.[17:2][15:5]

Ошибки аутентификации

NT_STATUS_ACCESS_DENIED

Причина: Пользователь аутентифицирован, но не имеет доступа к ресурсу.[14:7]

Решение:

  1. Проверьте valid users, write list, read list в smb.conf[2:31]
  2. Проверьте права Linux на директорию и файлы:[14:8]
ls -l /srv/samba/share/
  1. Если используются ACL, проверьте их:[12:15]
getfacl /srv/samba/share/
  1. Перезапустите Samba после изменений:
sudo systemctl restart smbd

NT_STATUS_BAD_NETWORK_NAME

Причина: Указано неверное имя шары или шара не существует.[14:9][16:9]

Решение:

  1. Проверьте список доступных шар:
smbclient -L //server-ip -U username
  1. Убедитесь, что имя шары в команде точно совпадает с именем в smb.conf
  2. Проверьте testparm:
testparm -s

Он покажет все определённые шары.[16:10]

Ошибки конфигурации

testparm: Unknown parameter

Причина: В smb.conf использован неизвестный или устаревший параметр.[22:1][16:11]

Решение:

  1. Запустите testparm для выявления ошибки:
testparm
  1. Прочитайте вывод и исправьте опечатки или удалите устаревшие параметры
  2. Обратитесь к документации Samba для проверки правильных имён параметров
  3. После исправления перезапустите Samba:
sudo systemctl restart smbd

Bind failed on port 139/445

Причина: Другой процесс уже использует порты Samba.[17:3][16:12]

Решение:

  1. Проверьте, что запущен только один экземпляр smbd:
ps aux | grep smbd
  1. Проверьте, что порты свободны:
sudo netstat -tulpn | grep -E '139|445'
  1. Если вы запускаете Samba и через systemd, и через inetd, отключите один из способов[16:13]
  2. Убедитесь, что нет конфликтующих служб (например, не запущен ли другой SMB-сервер)

Проблемы с правами в LXC

Файлы отображаются как nobody:nogroup

Причина: UID/GID файлов находятся вне диапазона маппинга контейнера.[39][40][31:22]

Решение:

  1. Проверьте маппинг в /etc/pve/lxc/XXX.conf[35:5][33:7][31:23]
  2. Расширьте диапазон маппинга, включив нужные UID/GID:
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535
  1. Или используйте force user и force group в smb.conf[23:5][31:24][12:16]
  2. Или настройте ACL на хосте для mapped UID[36:2]

Permission denied при записи через Samba из контейнера

Причина: Неправильные права на хосте или неправильный маппинг.[36:3][31:25]

Решение:

  1. На хосте проверьте права на bind-mounted директорию:
ls -ln /storage/shared
  1. Убедитесь, что mapped UID имеет права на запись:
# Если контейнер использует UID 1000, а маппинг даёт +100000, то на хосте это 101000
sudo chown -R 101000:101000 /storage/shared
  1. Или используйте ACL:
sudo setfacl -m u:101000:rwx /storage/shared
  1. Или используйте force user в Samba для упрощения[23:6][12:17]

Проблемы производительности

Медленная скорость передачи файлов

Причина: Неоптимальные настройки протокола SMB или сети.[14:10]

Решение:

  1. Используйте современную версию протокола SMB:
[global]
   min protocol = SMB2
   max protocol = SMB3
  1. Отключите oplocks для некоторых типов файлов (базы данных):
[share]
   oplocks = no
   level2 oplocks = no
  1. Увеличьте буферы для сетевых операций:
[global]
   socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
  1. Проверьте сетевое подключение и убедитесь, что используется гигабитный интерфейс

Заключение

В этом курсе мы детально разобрали работу с Samba — от базовой установки до продвинутых сценариев с LXC-контейнерами в Proxmox. Давайте подведём итоги основных тем.

Основные выводы

Samba — это незаменимый инструмент для организации совместного доступа к файлам в гетерогенных сетях с Linux и Windows машинами. Правильная настройка Samba обеспечивает безопасный и эффективный обмен данными между пользователями и системами.[8:3][1:3][9:4][3:13][4:9][5:12][2:32]

Управление пользователями в Samba требует понимания того, что Samba использует отдельную базу паролей, независимую от системных паролей Linux. Пользователь должен существовать в обеих базах, но пароли могут различаться.[9:5][3:14][2:33]

Создание общих папок с различными уровнями доступа позволяет гибко управлять правами пользователей. Параметры valid users, write list, read list совместно с Linux-правами и ACL дают полный контроль над тем, кто и что может делать с файлами.[4:10][12:18][10:19][2:34]

Подключение клиентов из Windows осуществляется через Проводник или подключение сетевого диска, а из Linux — через mount.cifs с возможностью автоматического монтирования через /etc/fstab.[27:11][28:5][25:7][24:5][5:13]

Работа с LXC-контейнерами в Proxmox требует особого внимания к маппингу UID/GID. Использование lxc.idmap, параметров force user/group в Samba или ACL на хосте позволяет решить проблемы с правами доступа.[33:8][35:6][31:26][12:19][23:7]

Организация общих ресурсов между контейнерами может быть реализована через bind mount с хоста или через Samba-подключения между контейнерами. Второй способ более безопасен и гибок, так как использует стандартные механизмы аутентификации и авторизации.[37:3][31:27][30:5]

Диагностика проблем с помощью утилит testparm, smbclient, проверки логов и состояния сервисов позволяет быстро выявить и устранить большинство ошибок. Понимание типичных ошибок и их причин экономит время при настройке и эксплуатации Samba.[38:2][29:3][15:6][14:11][16:14]

Практические рекомендации

Всегда начинайте с простой конфигурации и постепенно добавляйте сложность. Сначала создайте публичную шару без аутентификации для проверки работоспособности, затем добавляйте пользователей и права доступа.[7:13][10:20]

Используйте testparm после каждого изменения smb.conf. Это поможет выявить ошибки до перезапуска сервиса и предотвратит проблемы с доступом.[16:15][2:35]

Храните пароли в отдельных файлах с правами 600 при монтировании CIFS. Никогда не указывайте пароли в командной строке или /etc/fstab в открытом виде.[28:6][25:8][27:12]

Документируйте UID/GID маппинг в комментариях конфигурационных файлов. Это сэкономит время при диагностике проблем с правами в будущем.[41][31:28]

Регулярно проверяйте логи Samba в /var/log/samba/. Многие проблемы становятся очевидными при анализе логов.[16:16]

Используйте современные версии протокола SMB (2.1 или выше). Старые версии медленнее и менее безопасны.[14:12]

При работе с контейнерами Proxmox используйте непривилегированные контейнеры. Это повышает безопасность системы, хотя и усложняет настройку прав доступа.[42][43][31:29]

Тестируйте изменения на тестовых системах или шарах перед применением на продакшене. Неправильная конфигурация может привести к потере данных или утечке информации.[10:21]

Дальнейшее развитие навыков

После освоения материала этого курса вы готовы к изучению более продвинутых тем: интеграция Samba с Active Directory для корпоративных сетей, настройка Samba как контроллера домена (Samba DC), использование Samba для печати в сети, оптимизация производительности Samba для больших файлов, настройка репликации и резервного копирования Samba-шар, а также мониторинг и аудит доступа к Samba-ресурсам.

Продолжайте практиковаться, создавайте различные конфигурации, экспериментируйте с правами доступа в безопасной среде. Изучайте официальную документацию Samba (https://www.samba.org/samba/docs/) и активно участвуйте в сообществах, где можно получить помощь и поделиться опытом. Опыт работы с Samba приходит с практикой, и чем больше различных сценариев вы реализуете, тем увереннее вы становитесь в администрировании файловых сервисов.[1:4][2:36]

Успехов в освоении Samba и построении эффективных файловых систем!
[44][45][46][47][48][49][50][51][52][53][54][55][56][57][58][59][60][61][62]


  1. Install and Configure Samba | Ubuntu ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. Share access controls - Ubuntu Server documentation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  3. [Chapter 6] 6.3 Authentication Security ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  4. http://rus-linux.net/MyLDP/BOOKS/using_samba_2/ch09.html ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  5. Mounting and mapping shares between Windows and Linux with Samba ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  6. Install & Configure Samba on Ubuntu 22.04 [7 Main Steps] ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  7. Set up Samba as a file server - Ubuntu Server documentation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  8. How to set up a Samba server on Linux and connect | Zomro ↩︎ ↩︎ ↩︎ ↩︎

  9. Share files between Linux and Windows computers | Opensource.com ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  10. Reddit — Сердце сети ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  11. Samba Server Configuration in Ubuntu 14.04 LTS ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  12. https://www.sadera.cz/en/jak-nastavit-pristup-k-proxmox-lxc-kontejneru-z-windows ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  13. https://www.youtube.com/watch?v=2gW4rWhurUs ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  14. Troubleshooting Common Samba Issues Across Distributions - Shapehost ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  15. https://thorprojects.com/archive/techrepublic/troubleshooting-samba/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  16. Using Samba, 2nd Edition. Chapter 12. Troubleshooting Samba ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  17. https://srobb.net/rhsamba.html ↩︎ ↩︎ ↩︎ ↩︎

  18. Все о Samba » smbpasswd (managing SMB passwords) ↩︎

  19. Reddit — Сердце сети ↩︎

  20. https://www.youtube.com/watch?v=FSipsRniHeA ↩︎ ↩︎ ↩︎

  21. https://serverspace.ru/support/help/configuring-samba/ ↩︎

  22. [root tip] [How To] Basic Samba Setup and Troubleshooting - Tutorials - Manjaro Linux Forum ↩︎ ↩︎

  23. Setting Up Samba User Permissions - Network - Manjaro Linux Forum ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  24. https://www.techrepublic.com/article/how-to-connect-to-linux-samba-shares-from-windows-10/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  25. https://support.zadarastorage.com/hc/en-us/articles/213024986-How-to-Mount-a-SMB-Share-in-Ubuntu ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  26. https://www.linode.com/docs/guides/linux-mount-smb-share/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  27. How to Mount Windows Share on Linux via CIFS ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  28. How to mount CIFS shares permanently - Ubuntu Server documentation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  29. Mount of SMB shares stopped working [solved] / Networking, Server, and Protection / Arch Linux Forums ↩︎ ↩︎ ↩︎ ↩︎

  30. LXC->DOCKER->SAMBA=no access to share folder | Proxmox Support Forum ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  31. Hosting a Samba Server on LXC ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  32. Reddit — Сердце сети ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  33. Understanding LXC user/group mapping - kcore.org ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  34. Proxmox unprivileged LXC id mapping ↩︎ ↩︎

  35. https://www.apalrd.net/posts/2023/tip_idmap/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  36. All About Proxmox Bind Mount Permissions ↩︎ ↩︎ ↩︎ ↩︎

  37. Share folder between containers - Linux Containers Forum ↩︎ ↩︎ ↩︎ ↩︎

  38. Reddit — Сердце сети ↩︎ ↩︎ ↩︎

  39. http://lemmy.kde.social:1236/comment/4273181 ↩︎

  40. proxmox lxc UID/GID mapping | Proxmox Support Forum ↩︎

  41. GitHub - ddimick/proxmox-lxc-idmapper: Proxmox unprivileged container/host uid/gid mapping syntax tool. ↩︎

  42. Reddit — Сердце сети ↩︎

  43. Unprivileged LXC containers - Proxmox VE ↩︎

  44. samba users and passwords. Where are they? how authentication works? - Network/Internet - openSUSE Forums ↩︎

  45. Установка и настройка Samba на Ubuntu ↩︎

  46. https://forum.linuxconfig.org/t/how-to-configure-samba-server-share-on-ubuntu-20-04-focal-fossa-linux-linuxconfig-org/4048 ↩︎

  47. [Solved] Samba mount errors ! - Troubleshooting - DietPi Community Forum ↩︎

  48. samba mount error (but same command worked on self-managed EKS nodes of amazonlinux2) · Issue #3332 · bottlerocket-os/bottlerocket · GitHub ↩︎

  49. Монтирование шары CIFS в Linux. CIFS Linux. CIFS mount Linux ↩︎

  50. https://internet-lab.ru/linux_mount_cifs ↩︎

  51. https://www.youtube.com/watch?v=9EZYM65d04I ↩︎

  52. https://wikival.bmstu.ru/doku.php?id=подключение_к_файловым_серверам_cifs_из_unix ↩︎

  53. https://go2engle.com/posts/UnprivilegedLXCContainerSMBShare/ ↩︎

  54. https://smb-conf.ru/mount-cifs-mount-using-the-cifs.html ↩︎

  55. https://yeupou.wordpress.com/2017/04/04/1989/ ↩︎

  56. https://docs.us.sios.com/spslinux/9.3.2/en/topic/common-samba-error-messages ↩︎

  57. https://forum.proxmox.com/threads/linux-samba-server-or-lxc-container.141177/ ↩︎

  58. https://www.opennet.ru/docs/HOWTO-RU/SMB-HOWTO-8.html ↩︎

  59. https://habr.com/ru/articles/173127/ ↩︎

  60. https://forum.proxmox.com/tags/smb-shares-between-vms/ ↩︎

  61. https://www.reddit.com/r/HomeServer/comments/1i1qtpe/setting_up_samba_shares_on_linux_host_for_windows/ ↩︎

  62. https://www.youtube.com/watch?v=5mHjj6yW0EU ↩︎

2 лайка

Ели речь идёт о том, что samba шара подключается к хосту в котором дальшей должен происходить bind в LXC, то эта рекомендация не сработает, т.к. владелец шары назначается на samba-сервере, а не на стороне клиента.

Вот у меня сейчас проблема:
Samba сервер (отдельная железка) шарит папку с правами 777 и uid=0 gid=0, эта папка примонтирована к другой железке с Poxmox. Там эта шара определяется с правами 755 и uid=0 gid=0, но писать в неё могу. Далее прокидываю эту шару с хоста в непривилегированный LXC, в котором эта шара так же определяется с правами 755 и uid=65534 gid=65534, запись уже невозможна, только чтение.
Проблема вероятно в том, что в LXC эта шара монтируется с uid=65534 gid=65534 и на уровне хоста это не сопоставляется с uid=0 gid=0.
Пока не разобрался.

Пытаюсь решить очень простой кейс, как писать из LXC в примонтированную к PVE samba шару.

Вбил вашу проблему, ответ дали такой:

Решение проблемы записи в Samba-шару из непривилегированного LXC

Ваша диагностика верна! Проблема действительно связана с маппингом UID/GID в непривилегированном LXC-контейнере. Давайте разберём ситуацию подробно и предложим несколько решений.

Анализ проблемы

Что происходит на каждом уровне

Samba-сервер (отдельная железка):

  • Папка с правами 777, владелец root (UID 0, GID 0)
  • Доступна для записи всем

Proxmox хост:

  • Samba-шара примонтирована через CIFS
  • Права 755, владелец root (UID 0, GID 0)
  • Запись работает, потому что монтирование происходит от имени root хоста

Непривилегированный LXC-контейнер:

  • Шара видна с правами 755, владелец nobody (UID 65534, GID 65534)
  • Запись невозможна!

Почему так происходит

В непривилегированном LXC-контейнере UID 0 (root) маппится на UID 100000 на хосте[1][2][3]. Когда контейнер пытается получить доступ к файлам:

  1. Root в контейнере (UID 0) на самом деле является UID 100000 на хосте
  2. Файлы в CIFS-монтировании принадлежат UID 0 на хосте
  3. UID 100000 не имеет прав записи в файлы с правами 755, принадлежащие UID 0
  4. Поэтому файлы отображаются как nobody:nogroup (UID 65534) внутри контейнера[4][3:1]

Решения проблемы

Решение 1: Изменить опции монтирования CIFS на хосте (РЕКОМЕНДУЕТСЯ)

Самое простое и правильное решение — изменить параметры монтирования Samba-шары на хосте Proxmox, указав конкретный UID/GID, который будет использоваться в контейнере[5][6][7][8].

Шаг 1: Определите UID/GID для использования

Выберите UID/GID, который будет маппиться в контейнер. Например, используем UID 1000:

На хосте Proxmox:

# Проверьте текущее монтирование
mount | grep cifs

Шаг 2: Перемонтируйте с правильными параметрами

Размонтируйте текущую шару:

sudo umount /mnt/samba_share

Смонтируйте заново с параметрами uid и gid:

sudo mount -t cifs //samba-server/share /mnt/samba_share \
  -o credentials=/etc/samba/creds,uid=1000,gid=1000,file_mode=0666,dir_mode=0777

Параметры[5:1][6:1][7:1]:

  • uid=1000 — все файлы будут принадлежать UID 1000 на хосте
  • gid=1000 — все файлы будут принадлежать GID 1000 на хосте
  • file_mode=0666 — права для файлов (rw-rw-rw-)
  • dir_mode=0777 — права для директорий (rwxrwxrwx)

Шаг 3: Настройте маппинг UID в контейнере

Остановите контейнер:

pct stop 100

Отредактируйте /etc/subuid и /etc/subgid на хосте:

nano /etc/subuid

Добавьте (если нет):

root:1000:1
root:100000:65536

Аналогично для /etc/subgid:

nano /etc/subgid
root:1000:1
root:100000:65536

Отредактируйте конфигурацию контейнера /etc/pve/lxc/100.conf:

nano /etc/pve/lxc/100.conf

Добавьте в конец (или замените существующий idmap):

# Маппинг UID
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535

# Маппинг GID
lxc.idmap: g 0 100000 1000
lxc.idmap: g 1000 1000 1
lxc.idmap: g 1001 101001 64535

Это означает[1:1][2:1][3:2]:

  • UID 0-999 контейнера → UID 100000-100999 хоста
  • UID 1000 контейнера → UID 1000 хоста (один к одному!)
  • UID 1001-65535 контейнера → UID 101001-165535 хоста

Запустите контейнер:

pct start 100

Шаг 4: Проверьте доступ

Войдите в контейнер:

pct enter 100

Проверьте права:

ls -l /mnt/samba_share

Теперь файлы должны принадлежать UID 1000. Создайте пользователя с UID 1000 внутри контейнера:

useradd -u 1000 -m smbuser

Переключитесь на этого пользователя и попробуйте записать:

su - smbuser
cd /mnt/samba_share
touch test_file.txt
echo "Test" > test_file.txt

Запись должна работать!

Шаг 5: Сделайте монтирование постоянным

Отредактируйте /etc/fstab на хосте Proxmox:

nano /etc/fstab

Добавьте:

//samba-server/share /mnt/samba_share cifs credentials=/etc/samba/creds,uid=1000,gid=1000,file_mode=0666,dir_mode=0777,_netdev 0 0

Решение 2: Использовать привилегированный контейнер (НЕ РЕКОМЕНДУЕТСЯ)

Вы можете конвертировать контейнер в привилегированный[9][10], но это снижает безопасность[11][12][13].

Остановите контейнер:

pct stop 100

Отредактируйте конфигурацию:

nano /etc/pve/lxc/100.conf

Установите:

unprivileged: 0

И удалите все строки lxc.idmap (если есть).

Запустите контейнер:

pct start 100

Теперь root в контейнере = root на хосте, и запись будет работать. Но это создаёт риски безопасности[11:1][13:1].

Решение 3: Монтировать CIFS напрямую в контейнер (АЛЬТЕРНАТИВА)

Вместо bind mount с хоста, смонтируйте Samba-шару напрямую внутри контейнера[6:2][7:2][3:3][14].

Шаг 1: Разрешите контейнеру создавать CIFS-монтирования

На хосте Proxmox отредактируйте конфигурацию контейнера:

nano /etc/pve/lxc/100.conf

Добавьте:

lxc.apparmor.profile: unconfined
lxc.cgroup2.devices.allow: c 10:229 rwm
lxc.mount.entry: /dev/fuse dev/fuse none bind,create=file 0 0

Эти строки разрешают контейнеру работать с файловыми системами[14:1].

Перезапустите контейнер:

pct stop 100
pct start 100

Шаг 2: Установите cifs-utils в контейнере

Войдите в контейнер:

pct enter 100

Установите необходимые пакеты:

apt update
apt install cifs-utils -y

Шаг 3: Смонтируйте Samba-шару

Создайте точку монтирования:

mkdir -p /mnt/samba_direct

Создайте файл с учётными данными:

nano /etc/samba/creds
username=your_samba_user
password=your_samba_password
chmod 600 /etc/samba/creds

Смонтируйте:

mount -t cifs //samba-server-ip/share /mnt/samba_direct \
  -o credentials=/etc/samba/creds,uid=0,gid=0,file_mode=0666,dir_mode=0777

Теперь внутри контейнера все файлы будут принадлежать root (UID 0 контейнера), и запись будет работать[6:3][14:2].

Шаг 4: Автоматическое монтирование

Добавьте в /etc/fstab внутри контейнера:

nano /etc/fstab
//samba-server-ip/share /mnt/samba_direct cifs credentials=/etc/samba/creds,uid=0,gid=0,file_mode=0666,dir_mode=0777,_netdev 0 0

Решение 4: Использовать ACL на Samba-сервере

Если у вас есть доступ к Samba-серверу, настройте на нём force user и force group[15][16]:

На Samba-сервере отредактируйте /etc/samba/smb.conf:

[share]
   path = /path/to/share
   writable = yes
   force user = nobody
   force group = nogroup
   create mask = 0666
   directory mask = 0777

Параметры force user и force group заставят все операции выполняться от имени указанного пользователя, независимо от того, кто подключился[15:1][16:1].

Проверка и диагностика

Проверьте текущее монтирование на хосте

mount | grep cifs

Обратите внимание на опции uid=, gid=, file_mode=, dir_mode=.

Проверьте маппинг в контейнере

На хосте:

cat /etc/pve/lxc/100.conf | grep idmap

Проверьте, как маппятся UID:

# В контейнере
pct enter 100
id
# Запомните UID

# На хосте узнайте, на какой UID это маппится
# Если в контейнере UID 1000, и у вас стандартный маппинг, то на хосте это 101000
# Если настроен direct mapping, то это 1000

Проверьте реальные права на хосте

ls -ln /mnt/samba_share

Опция -n покажет числовые UID/GID вместо имён.

Тестирование записи

В контейнере от root:

pct enter 100
touch /mnt/samba_share/test_root.txt

В контейнере от пользователя с UID 1000:

su - smbuser  # пользователь с UID 1000
touch /mnt/samba_share/test_user.txt

Посмотрите, какой из способов работает, и на основе этого выберите подходящее решение.

Рекомендуемое решение для вашего случая

Для вашей ситуации я рекомендую Решение 1 (изменение опций монтирования на хосте + настройка idmap) или Решение 3 (прямое монтирование в контейнер).

Решение 1 лучше, если:

  • Вы хотите, чтобы несколько контейнеров использовали одну шару
  • Вам нужен централизованный контроль
  • Вы понимаете маппинг UID/GID

Решение 3 лучше, если:

  • Каждый контейнер должен иметь независимый доступ
  • Вы не хотите разбираться с idmap
  • Вам нужна максимальная гибкость

Краткая инструкция для быстрого решения

Если нужно быстро решить проблему, выполните следующее:

На хосте Proxmox:

# Перемонтируйте с правильными опциями
umount /mnt/samba_share
mount -t cifs //samba-server/share /mnt/samba_share \
  -o credentials=/etc/samba/creds,uid=1000,gid=1000,file_mode=0666,dir_mode=0777

# Настройте idmap
pct stop 100
echo "root:1000:1" >> /etc/subuid
echo "root:1000:1" >> /etc/subgid

# Отредактируйте конфиг контейнера
nano /etc/pve/lxc/100.conf
# Добавьте строки idmap из Решения 1

pct start 100

В контейнере:

pct enter 100
useradd -u 1000 -m smbuser
su - smbuser
cd /mnt/samba_share
touch test.txt  # Должно работать!

Это решит вашу проблему и позволит писать из непривилегированного LXC в Samba-шару.


  1. Understanding LXC user/group mapping - kcore.org ↩︎ ↩︎

  2. https://www.apalrd.net/posts/2023/tip_idmap/ ↩︎ ↩︎

  3. Hosting a Samba Server on LXC ↩︎ ↩︎ ↩︎ ↩︎

  4. http://lemmy.kde.social:1236/comment/4273181 ↩︎

  5. https://support.zadarastorage.com/hc/en-us/articles/213024986-How-to-Mount-a-SMB-Share-in-Ubuntu ↩︎ ↩︎

  6. https://www.linode.com/docs/guides/linux-mount-smb-share/ ↩︎ ↩︎ ↩︎ ↩︎

  7. How to Mount Windows Share on Linux via CIFS ↩︎ ↩︎ ↩︎

  8. Монтирование шары CIFS в Linux. CIFS Linux. CIFS mount Linux ↩︎

  9. https://cloudspinx.com/convert-unprivileged-container-in-proxmox-to-privileged/ ↩︎

  10. Change LXC from Unprivileged Back to Privileged in Proxmox in 5 Steps ↩︎

  11. Reddit — Сердце сети ↩︎ ↩︎

  12. Unprivileged LXC containers - Proxmox VE ↩︎

  13. Reddit — Сердце сети ↩︎ ↩︎

  14. Mounting SMB Shares Inside an Unprivileged Proxmox LXC Container for Docker | go2engle ↩︎ ↩︎ ↩︎

  15. Setting Up Samba User Permissions - Network - Manjaro Linux Forum ↩︎ ↩︎

  16. How to setup access to Proxmox LXC container from Windows? - sadera.cz ↩︎ ↩︎

5 лайков

Решил свой кейс пока таким образом:

Справка:
Описанные действия предполагают:

  1. Доступ к директориям и файлам на samba сервере выполняется их под УЗ root (uid=0, gid=0)
  2. Команды монтирования в fstab к хосту Proxmox содержат uid=100000 и gid=100000 с целью последующего корректного монтирования в непривилегированный LXC в Proxmox (uid_proxmox=uid_lxc+100000, gid_proxmox=gid_lxc+100000)
  3. Непривилегированный LXC обращается к примонтированной директории из под УЗ root (в LXC: uid=0, gid=0)
  4. Таким образом обеспечивается корректное сопоставление uid и gid во всей цепочке:
    4.1 Samba сервер: root (uid=0, gid=0)
    4.2 Монтирование samba сервера к Proxmox серверу: uid=100000 и gid=100000
    4.3 Proxmox сервер: root (uid=0, gid=0)
    4.4 Proxmox LXC unprivileged: root (uid=0, gid=0) (мэпинг uid и gid на уровне Proxmox +100000)
  5. Параметры file_mode и dir_mode в команде монтирования сетевого каталога к хосту Proxmox:
    Когда ты монтируешь сетевую папку (cifs) через /etc/fstab, Linux не может “узнать” реальные права доступа (chmod) на удалённой стороне (т.е. на SAMBA-сервере), потому что протокол SMB не передаёт эту информацию напрямую. Поэтому ты указываешь вручную, какие права доступа отображать локально при монтировании файлов и каталогов.

Команды:

  1. Создать директорию на хосте:
    mkdir /mnt/pve/share

  2. Cоздать скрытый файл с авторизационными данными nano /root/.smbcredentials:
    username=root
    password=password

  3. Выставить строгие права:
    chmod 600 /root/.smbcredentials

  4. Добавить в nano /etc/fstab
    //ip_host/share /mnt/pve/share cifs credentials=/root/.smbcredentials,uid=100000,gid=100000,file_mode=0664,dir_mode=0775,nounix,noserverino 0 0
    где:
    //ip_host/share - адрес сетевой директории расшаренной на samba сервере
    /mnt/pve/share - точка монтирования на хосте Proxmox
    file_mode=0664 - все файлы на хосте Proxmox будут отображаться с правами rw-rw-r–
    dir_mode=0775 - все каталоги на хосте Proxmox будут отображаться с правами rwxrwxr-x

  5. Смонтировать
    mount -a

  6. Перезупустить службу (при необходимости):
    systemctl daemon-reload

Такая конструкция позволит писать и читать в сетевую шару прокинутую в LXC, но конкретно такой конфиг не рекомендую, нужно переделывать на отличного от root юзера и по правильному на samba сервере нужно создавать пользователей и группы, из под которых подключаться с другого сервера и прочих клиентов.

1 лайк