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

Проверка кодировки SMB/CIFS: Linux, Windows, Samba. Параметры iocharset, vers, UTF-16LE. Диагностика кириллицы в сетевых ресурсах

2026.04.24                  


Подробный гайд: Как проверить и настроить кодировку в SMB/CIFSПодробный гайд: Как проверить и настроить кодировку в 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
  1. Откройте в Wireshark, примените фильтр smb2 || cifs
  2. Найдите пакет 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 NamesUTF-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
  1. На Samba-сервере оставьте дефолтные кодировки (обычно уже UTF-8).
  2. Не используйте codepage, noperm, mapchars без крайней необходимости.
  3. Для диагностики используйте: 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.