Подробный гайд: Как проверить и настроить кодировку в SMB/CIFS
Важное уточнение:
- В протоколе SMB/CIFS нет единого параметра "кодировка".
То, как отображаются имена файлов и содержимое, зависит от:
- Версии протокола (SMB1 vs SMB2/SMB3)
- Настроек сервера (Samba, Windows, NAS)
- Параметров монтирования на клиенте
- Системной локали ОС
Ниже приведён пошаговый алгоритм диагностики и проверки для всех распространённых сценариев.
1. Как SMB работает с символами (кратко)
| Версия протокола | Кодировка имён файлов в сети | Примечание |
|---|---|---|
| SMB1 (CIFS) | OEM/ANSI codepage (зависит от dos charset/codepage) |
Требует явного указания кодировки, часто ломает кириллицу |
| SMB2 / SMB3 | UTF-16LE (встроенная поддержка Unicode) | Современный стандарт, проблемы с кодировкой возникают только из-за неправильных параметров монтирования или конвертации на уровне ОС |
2. Проверка на Linux-клиенте (cifs/kfs)
2.1. Посмотреть текущие опции монтирования
mount | grep cifs
# или
findmnt -t cifs
Обратите внимание на параметры:
iocharset=...(например,utf8,cp1251)vers=...(например,3.1.1,2.0)
Пример корректного вывода:
//192.168.1.10/share on /mnt/share type cifs (rw,relatime,vers=3.1.1,iocharset=utf8,cache=strict)
2.2. Что означают параметры
| Параметр | Значение |
|---|---|
iocharset=utf8 |
Преобразование имён файлов между сервером и VFS Linux в UTF-8 |
iocharset=cp1251 |
Использовать Windows-1251 (только для legacy/SMB1) |
vers=2.0/3.0/3.1.1 |
Версия протокола. Рекомендуется ≥3.0 |
В ядрах
≥5.15параметрiocharsetчасто не требуется: клиент автоматически использует UTF-8. Но его явное указание устраняет неоднозначности.
2.3. Быстрая проверка чтения/записи кириллицы
touch "/mnt/share/Тестовый файл_2026.txt"
ls -l "/mnt/share/" | grep Тестовый
Если имя отображается корректально → кодировка работает. Если ?????? или ТеÑ... → проблема в iocharset или локали терминала.
Проверка локали терминала:
locale | grep LC_CTYPE
# Должно быть: ru_RU.UTF-8 или en_US.UTF-8
3. Проверка на Windows-клиенте
Windows использует UTF-16LE для SMB2/3 по умолчанию. Отдельной "кодировки SMB" в системе нет.
3.1. Проверка версии протокола
Откройте PowerShell от администратора:
Get-SmbConnection | Select ServerName, Dialect, ShareName
Dialect должен быть 3.1.1, 3.0 или 2.1. Если 1.0 → принудительно отключите SMB1 (см. раздел 8).
3.2. Если кириллица "ломается" в старых приложениях
Это не проблема SMB, а системной локали для не-Unicode программ:
1. Панель управления → Региональные стандарты → Дополнительно
2. В блоке Язык программ, не поддерживающих Юникод должно стоять Русский (Россия)
3. Перезагрузите ПК.
4. Проверка на сервере Samba (Linux)
4.1. Проверка текущих настроек кодировок
testparm -v | grep -i charset
Ожидаемый вывод (современная Samba 4.15+):
dos charset = CP850
unix charset = UTF-8
display charset = UTF-8
4.2. Расшифровка параметров
| Параметр | Назначение | Рекомендация |
|---|---|---|
unix charset |
Кодировка файловой системы сервера | UTF-8 |
dos charset |
Кодировка для SMB1/старых клиентов | Оставьте CP850 или CP1251 только если подключаются устаревшие устройства |
display charset |
Кодировка логов и вывода smbstatus |
UTF-8 |
4.3. Проверка версии протокола на сервере
testparm -v | grep -i protocol
Убедитесь, что:
server min protocol = SMB2_02
client min protocol = SMB2_02
(или SMB3_00 / SMB3_11 для максимальной безопасности)
4.4. Тест подключения с выводом имён
smbclient -L //localhost -U% | head -20
Если русские имена шар/файлов отображаются корректально → кодировка настроена верно.
5. Проверка на Windows Server
Windows Server использует Unicode-native стек. Отдельной настройки кодировки SMB нет.
5.1. Проверка включённых версий протокола
Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol, EnableSMB3Protocol
Рекомендуется:
EnableSMB1Protocol = False, остальныеTrue.
5.2. Если клиенты жалуются на кракозябры
- Проверьте, что файловая система сервера NTFS (ReFS также поддерживает Unicode).
- Убедитесь, что имена файлов создаются в системе с корректной локалью.
Для legacy-клиентов (Windows 98/XP, старые NAS) может потребоваться групповая политика:
Конфигурация компьютера → Административные шаблоны → Сеть → Lanman Workstation → Включить небезопасные гостевые входы(только в изолированных сетях).
6. Анализ трафика (Wireshark / tcpdump)
Если нужно точно узнать, в какой кодировке передаются имена:
1. Захват трафика:
sudo tcpdump -i any port 445 -w smb_capture.pcap
- Откройте в Wireshark, примените фильтр
smb2 || cifs - Найдите пакет
Create RequestилиQuery Directory
4. Раскройте поле File Name или Search Pattern
- SMB2/3: имя будет в формате
UTF-16LE(каждый символ = 2 байта, русские буквы читаемы в hex-просмотре) - SMB1: имя будет в OEM-кодовой странице (например,
CP866для кириллицы в DOS-клиентах)
В Wireshark можно переключить отображение:
View → Name Resolution → Resolve SMB File Names→UTF-16LE
7. Типичные проблемы и быстрые решения
| Симптом | Причина | Решение |
|---|---|---|
?????? или Те... в именах |
iocharset не совпадает с локалью терминала |
Добавьте iocharset=utf8 в /etc/fstab или опции mount |
Файлы создаются с %D0%9A... в имени |
Клиент передаёт имена в URL-encoding или неправильной кодировке | Проверьте приложение, использующее SMB. Убедитесь, что ОС клиента использует UTF-8 |
| Старый NAS/принтер не видит русские имена | Устройство работает только на SMB1 + CP866/CP1251 | В smb.conf: dos charset = CP1251, server min protocol = NT1 (только в изолированной сети) |
mount error(22): Invalid argument |
Ядро не поддерживает указанную iocharset или vers |
Уберите iocharset, используйте vers=3.1.1 |
8. Рекомендации для современных систем (2024–2026)
1. Отключите SMB1 везде, где это возможно:
# /etc/samba/smb.conf
server min protocol = SMB2_02
client min protocol = SMB2_02
2. На Linux-клиенте в /etc/fstab:
//server/share /mnt/share cifs rw,vers=3.1.1,iocharset=utf8,uid=1000,gid=1000 0 0
- На Samba-сервере оставьте дефолтные кодировки (обычно уже
UTF-8). - Не используйте
codepage,noperm,mapcharsбез крайней необходимости. - Для диагностики используйте:
smbclient,testparm -v,findmnt,Get-SmbConnection.
Итог
- SMB2/3 передают имена файлов в UTF-16LE. Проблемы с кодировкой возникают на этапе конвертации между сервером, клиентом и файловой системой.
- На Linux проверяйте
mount | grep cifsи параметрiocharset. - На Samba используйте
testparm -v | grep charset. - На Windows убедитесь, что используется SMB2/3 и системная локаль корректна.
- Для точной проверки трафика используйте Wireshark с фильтром
smb2.