Подробный гайд по настройке кодировки при работе с 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. - Настройка кодировки не требуется.
Если видите "кракозябры":
- Убедитесь, что сервер отдаёт SMB2+.
- Проверьте региональные настройки: Параметры → Время и язык → Регион → Формат → Русский (Россия).
- Отключите "Бета: использовать 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. Рекомендации и безопасность
- Никогда не используйте SMB1 в 2026 году. Он не поддерживает Unicode, уязвим (EternalBlue), отключён в большинстве ОС.
- Всегда явно указывайте
vers=3.0илиvers=3.1.1в клиентских опциях. - Храните пароли в
credentialsфайле с правами600, а не вfstab. - Избегайте спецсимволов и пробелов в именах общих ресурсов и пользователей, если в сети есть легаси-оборудование.
- Тестируйте на чистой системе:
LANG=C.UTF-8 mount -t cifs ...покажет, проблема в локали или в протоколе. - Обновляйте 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