Подробный гайд по настройке кодировки при работе с SMB/CIFS

Настройка кодировки SMB/CIFS: переход на UTF-8, SMB3, параметры mount.cifs и smb.conf. Решаем проблемы с русскими именами файлов на Linux, Windows, macOS.

2026.04.24                  


Подробный гайд по настройке кодировки при работе с SMB/CIFSПодробный гайд по настройке кодировки при работе с SMB/CIFS Ниже представлен подробный гайд по настройке кодировки при работе с SMB/CIFS без декоративных элементов.


1. Как работает кодировка в SMB/CIFS

Протокол Поддержка Unicode Как передаются имена файлов
SMB1 (CIFS) Нет (только OEM/ANSI codepages) dos charset + iocharset
SMB2 / SMB3 Да (UTF-16LE внутри протокола) Нативно, без преобразований на уровне клиента

Ключевой вывод:

  • Если вы используете vers=2.0 и выше, ядро и Samba работают с UTF-8 по умолчанию.

Проблемы с кодировкой возникают только при:

  • Подключении к старым серверам (Samba 3.x, Windows Server 2003/2008, старые NAS)
  • Несоответствии локали клиента и сервера
  • Принудительном включении SMB1
  • Ошибках в параметрах монтирования

2. Настройка сервера (Samba)

Файл: /etc/samba/smb.conf

Современный стек (рекомендуется):

[global]
   unix charset = UTF-8
   dos charset = CP866        # нужен только для легаси-клиентов
   display charset = UTF-8
   server min protocol = SMB2_02
   server max protocol = SMB3_11

Пояснения:

  • unix charset – кодировка, в которой Samba хранит имена в файловой системе. Всегда UTF-8.
  • dos charset – преобразование имён для старых клиентов (Windows 9x/NT, embedded). Современные клиенты игнорируют этот параметр.
  • display charset – влияет на вывод в smbclient, net и логах. Должен совпадать с терминалом клиента.
  • Параметры server min/max protocol запрещают использование SMB1, что убирает 90% проблем с кодировкой.

Перезапуск:

  • sudo systemctl restart smbd nmbd (или smbd/nmbd в зависимости от дистрибутива)

3. Настройка клиента на Linux

3.1. Монтирование через mount.cifs или fstab

Современные ядра (5.4+) автоматически используют UTF-8. Явное указание iocharset=utf8 оставлено для обратной совместимости, но codepage признан устаревшим.

Пример /etc/fstab:

//192.168.1.100/share /mnt/smb cifs \
  credentials=/etc/samba/cred,vers=3.0,iocharset=utf8,\
  uid=1000,gid=1000,file_mode=0775,dir_mode=0775,_netdev 0 0

Пояснения опций:

  • vers=3.0 – принудительно используем SMB3. Без этого ядро может выбрать SMB1 на старых серверах.
  • iocharset=utf8 – маппинг имён в VFS. На ядрах 6.1+ можно опустить, но оставлять не вредит.
  • uid/gid, file_mode/dir_mode – права доступа (не относятся к кодировке, но часто нужны).
  • _netdev – ждёт поднятия сети при загрузке.

Файл учётных данных (/etc/samba/cred, права 600):

username=ваш_пользователь
password=ваш_пароль

3.2. Проверка локали

Кодировка клиентской системы должна быть UTF-8:

locale

Ожидается:

LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
...

Если LANG=C или POSIX, русские имена будут отображаться как ???? или Привет. Исправляется через localectl set-locale LANG=ru_RU.UTF-8 или экспорт в ~/.bashrc.


4. Клиенты Windows и macOS

Windows 10/11

  • Внутренне использует UTF-16LE. SMB2/3 передают имена в Unicode.
  • Настройка кодировки не требуется.

Если видите "кракозябры":

  1. Убедитесь, что сервер отдаёт SMB2+.
  2. Проверьте региональные настройки: Параметры → Время и язык → Регион → Формат → Русский (Россия).
  3. Отключите "Бета: использовать UTF-8 для поддержки языков" (Панель управления → Регион → Дополнительно), если оно включено – это ломает совместимость со старыми SMB-шарами.

macOS

  • mount_smbfs по умолчанию работает с UTF-8.
- При проблемах можно явно указать локаль:
  sudo mount_smbfs -o locale=ru_RU.UTF-8 //user@server/share /Volumes/smb
  • В Finder кодировка настраивается автоматически. Если файлы называются ???, обновите macOS или проверьте настройки языка в Системные настройки → Язык и регион.

5. Диагностика и типичные ошибки

Симптом 1: Имена файлов выглядят как ???? или Привет.txt

Причина:
  • Сервер или клиент работает в non-UTF8, либо принудительно включён SMB1.
Решение:
  mount -t cifs //server/share /mnt -o vers=3.0,iocharset=utf8,uid=$(id -u),gid=$(id -g)

Проверьте вывод dmesg | grep -i cifs на наличие CIFS: VFS: server does not support Unicode – это признак SMB1 или очень старой Samba.

Симптом 2: Файлы создаются, но имена "битые"

Причина:
  • Несоответствие dos charset на сервере и ожиданий клиента.
Решение:
  • Добавьте в smb.conf:
  dos charset = CP1251   # или CP866, если клиенты очень старые
  unix charset = UTF-8

Перезапустите smbd и переподключите шару.

Симптом 3: mount.cifs ругается на iocharset или codepage

Причина:
  • В ядре 6.8+ эти опции помечены как deprecated.
Решение:
  • Удалите их из строки монтирования. Оставьте только vers=3.0. Ядро будет использовать UTF-8 автоматически.

Быстрая диагностика:

# Проверка версии протокола
smbclient -L //server -U user -d 3 2>&1 | grep -i "protocol"

# Проверка поддержки Unicode сервером
smbclient //server/share -U user -c "ls"

# Логи ядра
journalctl -k | grep -i cifs
dmesg | tail -20

6. Рекомендации и безопасность

  1. Никогда не используйте SMB1 в 2026 году. Он не поддерживает Unicode, уязвим (EternalBlue), отключён в большинстве ОС.
  2. Всегда явно указывайте vers=3.0 или vers=3.1.1 в клиентских опциях.
  3. Храните пароли в credentials файле с правами 600, а не в fstab.
  4. Избегайте спецсимволов и пробелов в именах общих ресурсов и пользователей, если в сети есть легаси-оборудование.
  5. Тестируйте на чистой системе: LANG=C.UTF-8 mount -t cifs ... покажет, проблема в локали или в протоколе.
  6. Обновляйте Samba и ядро: в версиях 4.18+ и 6.1+ улучшена обработка Unicode, убраны устаревшие codepage-маппинги.

Справочник по опциям монтирования cifs

Опция Статус Описание
vers=3.0 Обязательно Версия протокола
iocharset=utf8 Legacy/совместимость Маппинг имён в VFS (можно опустить на новых ядрах)
codepage=cp866 Удалено в 6.4+ Больше не используется
nls=utf8 Удалено Заменено на неявный UTF-8
uid/gid Рекомендуется Привязка файлов к пользователю
file_mode/dir_mode Рекомендуется Права доступа

Чек-лист быстрой настройки

  • [ ] Сервер: unix charset = UTF-8, server min protocol = SMB2_02
  • [ ] Клиент: vers=3.0 в опциях монтирования
  • [ ] Клиент: LANG=ru_RU.UTF-8 или C.UTF-8
  • [ ] fstab/mount без codepage, без nls
  • [ ] Проверка: ls -l /mnt/smb → русские имена читаемы, file показывает UTF-8
  • [ ] В логах нет CIFS: VFS: server does not support Unicode