Содержание статьи
В наши нелегкие времена, когда большинство пользователей сидит под виндой, обычному линуксоиду приходится подстраиваться под обстоятельства. Файл уже не передашь с помощью nc или NFS, а документ не распечатаешь удаленно через CUPS. Остается только использовать Samba, про тотальную настройку и оптимизацию которой я сейчас и расскажу.
Ликвидация безграмотности
Samba — это свободная программная реализация протокола SMB/ CIFS. Этот протокол, нэйтивно поддерживаемый семейством ОС Windows, позволяет получать удаленный доступ к файлам и сетевым принтерам. В винде рядовой пользователь может повлиять лишь на минимум настроек, связанных с доступом, остальные же опции глубоко скрыты в реестре либо отсутствуют вовсе. В никсах протокол SMB не является обязательным и не всегда доступен из коробки.
Для его использования требуется установить клиентскую (для доступа к уже расшаренным файлам и принтерам) и серверную (для расшаривания у себя на компе) части. После установки следует создать главный конфигурационный файл (если его нет) и запустить стартовый скрипт для активации серверной части. Например, для Arch Linux команды будут выглядеть так:
# pacman -S samba smbclient
cp /etc/samba/smb.conf.default /etc/samba/smb.conf
/etc/rc.d/samba start
В некоторых системах следует запустить два демона: smbd (файловый) и nmbd (демон имен). Собственно, за расшаривание папок и прочие функции отвечает серверная часть Samba, а за доступ к уже расшаренным на других компах — консольная утилита smbclient. В качестве фронт-энда к ней выступает часть функционала распространенных файловых менеджеров, таких как Dolphin или Nautilus.
В них настройка осуществляется не намного сложнее, чем в винде, поэтому здесь останавливаться не будем. Кроме smbclient существует еще ряд программ, облегчающих жизнь в консоли, кратко рассмотрим наиболее используемые.
- smbclient— клиент, который может общаться с SMB-сервером. Он предлагает интерфейс, схожий с интерфейсом программы ftp. Среди его возможностей — получение файлов с сервера на локальную машину, перемещение файлов с локальной машины на сервер, получение списка папок с сервера и так далее.
- smbtree— SMB-обозреватель в текстовом режиме. Аналог «Обозревателя сети», существующего на компьютерах под управлением Windows. Отображает дерево всех доменов, сервера этих доменов и общие ресурсы на серверах.
- mount.cifsи umount.cifsотвечают за монтирование и размонтирование файловой системы Linux CIFS. Эти программы работают только в Linux, ядро должно поддерживать файловую систему CIFS. Как вариант, для этих целей можно использовать команду mount с аргументом ‘-t cifs’, либо ‘-i’ (для размонтирования).
В старые версии пакета Samba входили утилиты smbmount и smbumount, которые, по сути, заменены на mount.cifs и umount.cifs.
Пилим конфиг
В конфиге Samba доступно несметное количество опций, при желании их все можно найти в справочной странице smb.conf(5). Поэтому для простоты приведу минимальный рабочий конфиг, а далее расскажу про наиболее интересные параметры, которые можно в него добавить:
$ cat /etc/samba/smb.conf
[global]
; Имя рабочей группы
workgroup = WRKGRP
; Уровень безопасности
security = SHARE
[myshare]
; Абсолютный путь к разделяемому ресурсу
path = /usr/somewhere/shared
; Доступ только на чтение
read only = Yes
; Доступ будет предоставлен с правами гостевого
пользователя (nobody)
guest ok = Yes
Функциональность этого конфига сводится к расшариванию папки /usr/somewhere/shared для всех пользователей рабочей группы WRKGRP без возможности записи. Конфиг состоит из нескольких секций (в данном случае двух), в секции global определяются общие параметры сервера, остальные секции могут называться произвольными именами (за исключением имен специальных секций), и в них задаются настройки для каждого разделяемого объекта (в примере использован объект myshare).
Для расшаривания принтеров существует специальная секция printers, которая в большинстве случаев имеет следующий вид:
[printers]
path = /usr/spool/public
guest ok = yes
printable = yes
Для автоматической активации принтеров в секцию global также следует добавить строку «load printers = yes».
Другие важные параметры конфига:
- security— определяет, каким образом клиенты соединяются с сервером. В примере выше этот параметр был установлен в значение SHARE — для такого соединения не будут запрашиваться имя пользователя и пароль. В большинстве случаев используется значение USER, которое подразумевает ввод логина и пароля существующего пользователя для доступа к шаре. Кроме того, у этого пользователя должны быть соответствующие права на содержимое папки.
- hosts allow— список хостов через пробел, с которых разрешен доступ к расшаренным ресурсам. Допускается задавать символические имена, IP-адреса или диапазоны адресов, например элемент вида «150.203.» разрешает соединения со всех IP-адресов подсети 150.203.0.0/16. Если параметр не задан, то соединения разрешены для всех. Параметр может также применяться к отдельным секциям, позволяя гибко разграничивать права доступа.
- log file— путь записывания логов. Здесь стоит отметить возможность задания переменных в конфиге: например, значение «/var/log/ samba/%m.log» позволит создавать отдельный лог-файл для каждой подключающейся машины, что весьма полезно для мониторинга активности отдельных клиентов.
- include— позволяет подключать произвольные конфиги. Наиболее эффективен при использовании с переменными, например «%m», в таком случае для разных клиентов можно задавать различные настройки: include = /usr/local/samba/lib/smb.conf.%m.
- interfaces— список сетевых интерфейсов, на которых будут висеть демоны Samba. По умолчанию задействуются все интерфейсы, кроме lo. Имена нужно задавать через пробел, либо указывать запись вида «адрес сети/маска».
- guest only— если этот параметр выставлен в «yes», то доступ к разделяемому ресурсу возможен только с правами гостя.
- invalid users— задает через пробел список пользователей, которым запрещен доступ к разделяемым ресурсам. Здесь же можно задать группу UNIX/NIS, использовав в качестве префикса «@» или «+» соответственно.
- create mask— маска прав доступа для созданных файлов. По умолчанию равна 0744, что означает сброс прав на исполнение для пользователей группы и остальных. Задается в секции разделяемого ресурса.
- directory mask— аналог предыдущей опции, только для директорий.
- browseable — определяет, будет ли объект отображаться в списке доступных общих ресурсов в сетевом окружении и в списке просмотра.
[public]
create mask = 0400
directory mask = 0700
path = /export/public
writeable = yes
[archive]
path = /export/archive
writeable = no
browseable = no
Тонкая настройка и оптимизация
Samba предоставляет нам широкие возможности по оптимизации. Одной из них является директива sockets options. Однако не существует универсального способа добиться максимальной производительности, так как все сети различны (тип соединения, тип оборудования и так далее) Если ты хочешь увеличить скорость передачи файлов в своей сети, то придется поэкспериментировать. В своих рассуждениях я буду опираться на особенности реализации интерфейса сокетов в Linux (об этом можно почитать в руководстве socket(7)). Первым делом добавим в конфигурацию Samba следующую запись:
[global]
socket options = TCP_NODELAY IPTOS_LOWDELAY
SO_RCVBUF=65536 SO_SNDBUF=65536
Смысл параметров:
- TCP_NODELAYотвечает за задержку пакетов. Начиная с Samba 2.0 данный параметр устанавливается по умолчанию, в более старых версиях его установка может привести к ускорению работы на 30%.
- IPTOS_LOWDELAY— еще один параметр для оптимизации пропускной способности. Но он затрагивает работу роутеров и конечных систем, а не сервера. Этот параметр должен использоваться вместе с TCP_NODELAY и может обеспечить прирост производительности до 20%.
- Опции SO_RCVBUFи SO_SNDBUFопределяют максимально возможный размер буферов приема и передачи Samba. Уменьшение размера буферов приводит к увеличению фрагментации пакетов, увеличение размера — к уменьшению фрагментации.
Чтобы найти оптимальные параметры для конкретных условий, надо провести эксперименты по передаче тестового файла размером 100 Мб и 100 тестовых файлов по 1 Мб, затем оценить время выполнения операций. Для создания 100-мегабайтного тестового файла выполни команду:
$ dd if=/dev/zero of=testfi le count=10240 bs=10240
Для создания 100 файлов размером 1 Мб поможет следующий скрипт:
$ cat mkfi les.sh
#!/bin/bash
for ((i=1; i<=100; i++)); do
dd if=/dev/zero of=testfi le${i} count=1024 bs=1024
done
Далее нужно примонтировать шару:
$ mount -t cifs -o guest //192.168.1.101/share
/home/user/share/
И провести копирование с замером времени:
$ time cp /home/user/share/testfi le /home/user/
Результаты, получившиеся у меня, можешь наблюдать на рисунке (шкала Y — время копирования в секундах). Примечание: сервер Samba имеет привычку кэшировать передаваемые данные, поэтому рекомендую перезапускать его при каждом новом тесте. В конфиге smb.conf можно задать ряд параметров, которые так или иначе будут сказываться на производительности:
- hide files— в этом параметре задается список файлов или директорий, которые будут скрыты при просмотре разделяемого ресурса (но будут доступны при прямом обращении). Список задается через знак «/», и чем список длиннее, тем больше будут задержки при просмотре разделяемого ресурса, так как все файлы прогоняются на соответствие каждого элемента списка. Без крайней необходимости лучше не использовать.
- strict sync— установленный в «yes», этот параметр заставляет сервер при каждом новом пакете с установленным битом sync сбрасывать дисковые буферы непосредственно на диск, что существенно снижает производительность при работе с некоторыми приложениями, но при установке в «no» появляется некоторая вероятность потери данных во время сбоя.
- sync always— включение этого параметра означает сброс содержимого каждого нового пакета на диск, минуя дисковые буферы и вне зависимости от бита sync. Весьма пагубно сказывается на производительности, поэтому включать рекомендуется только если сервер Samba работает нестабильно.
- wide links— параметр определяет, могут ли использоваться символические ссылки в разделяемых ресурсах. Выключение этого параметра приведет к дополнительному системному вызову при открытии каждого файла.
- deadtime— значением этого параметра является время бездействия в минутах, по истечении которого соединение с клиентом будет разорвано. По умолчанию установлено в 0, то есть соединение с клиентом не будет разорвано никогда. При большом количестве клиентов это может привести к проблемам в работе, поэтому рекомендую изменить значение на 15.
- max connections— максимальное число одновременных подключений к серверу. По умолчанию выставлено в 0 (то есть без ограничений), что может привести к отказу в обслуживании на слабых системах или в случае намеренной атаки. В большинстве случаев значения 10 вполне хватает.
- log level— детализация логов, задается числом от 0 до 10. Запись на диск — весьма затратная операция, поэтому не рекомендуется выставлять этот параметр в значение больше 2, за исключением отладочных ситуаций.
- syslog— параметр отвечает за попадание событий в системный syslog. По умолчанию равен 1, что означает запись ошибок и предупреждений. Можно понизить до 0, тогда будут записываться только ошибки.
Следует также отметить, что ощутимую прибавку к производительности может дать использование асинхронного ввода-вывода. Правда, для этого необходимо пересобрать Samba с опцией AIO_ SUPPORT, после чего добавить в конфиг следующие параметры:
aio read size = 16384
aio write size = 16384
aio write behind = true
Shit happens
При работе с Samba могут вылезти различного рода косяки и грабли. примеры, для распространенных из них. Для решения проблемы с отображением кириллических символов рекомендуется выставить следующие параметры в секции global:
dos charset = cp866
unix charset = UTF8
display charset = UTF8
А если в твоей системе нет и не планируется развертывание серверов печати CUPS, то в логах периодически будут появляться ошибки по этому поводу. В таком случае лучше отключить поддержку печати в Samba, добавив в секцию global следующие строки:
load printers = no
show add printer wizard = no
printing = none
printcap name = /dev/null
disable spoolss = yes
WinXP — достаточно древняя и глючная система, но, тем не менее, множество людей остаются ей верны. При использовании разделяемых ресурсов эта операционка открывает соединения сразу к двум портам: 139/tcp и 445/tcp. Если ей это удается, то на 139-м порту соединение она разрывает, что приводит к появлению в логах записи «getpeername failed. Error was Transport endpoint is not connected».
Чтобы ошибка не возникала, необходимо добавить в секцию global строчку «smb ports = 139».
GUI в помощь
С помощью SWAT (Samba Web Administration Tool) можно конфигурировать самбу прямо из браузера. Интерфейс утилиты не выдерживает никакой критики, но она полезна с точки зрения тонкой настройки, поскольку показывает все возможные параметры конфига и дает контекстные подсказки к каждому из них. Для корректной работы необходимо доустановить пакет xinetd:
# pacman -S xinetd
Затем привести файл /etc/xinetd.d/swat к следующему виду:
service swat
{
type = UNLISTED
protocol = tcp
port = 901
socket_type = stream
wait = no
user = root
server = /usr/sbin/swat
log_on_success += HOST DURATION
log_on_failure += HOST
disable = no
}
А также добавить в файл /etc/hosts.allow строку «swat:127.0.0.1». После чего запустить демон xinetd:
# /etc/rc.d/xinetd start
И вуаля! SWAT доступен по адресу http://localhost:901. Альтернативным средством для управления параметрами Samba из браузера является Webmin, который имеет приятный интерфейс и множество функций для управления системой.
# pacman -S webmin perl-net-ssleay
/etc/rc.d/webmin start
После установки и запуска демона веб-морда будет доступна по адресу https://localhost:10000.
Подводим итоги
Процесс настройки Samba — это сложная и интересная задача. После оптимизации у меня получилось сократить время передачи файлов в среднем на 20%. Возможно, твои успехи в этом будут намного лучше: в некоторых источниках сообщается об ускорении аж до 200%.
Текущее состояние дел: Samba 3.5
Основным нововведением в версии 3.5 стала экспериментальная поддержка протокола SMB2, использующегося в системах Vista/Se7en. Благодаря значительному упрощению SMB2 (было более 100 команд, а стало 19) повысилась и производительность при передаче файлов. Среди прочих изменений:
- Обеспечена 100-наносекундная точность установки времени изменения или создания файлов (timestamp resolution). Для поддержки необходимо Linux-ядро минимум версии 2.6.22 и glibc 2.6.
- Добавлена поддержка шифрования соединений при выводе на печать через сервер CUPS. Включение производится через параметр «cups encrypt».
- В Winbind проведен рефакторинг кода с целью реализации асинхронной обработки запросов.
Например, «wbinfo -g» или «wbinfo -u» теперь выполняются в неблокирующем режиме.
Последняя стабильная версия на данный момент находится под номером 3.5.6 и вышла в свет 8 октября 2010 года.
Что нам готовит день грядущий: Samba 4.0
Проект Samba4 более пяти лет развивается параллельно с Samba3 и содержит почти полную переработку кода в контексте реализации работы в качестве Active Directory Domain Controller (совместимый с Win2k и выше) и приведения поддерживаемого SMB-протокола к полной совместимости с продуктами Microsoft. Реализованы встроенный LDAP-сервер, поддерживающий Active Directory правила; встроенный Kerberos KDC (Key Distribution Center) сервер; ACL в базе пользователей; виртуальная файловая система (Microsoft VFS) и так далее.
Основным нововведением разрабатываемой версии 4.0 станет возможность использования Samba-сервера в качестве контроллера домена Active Directory. Данная возможность реализована в версиях 3.x, но в сильно урезанном виде. После трех лет разработки первый технический релиз 4.0.0TP1 был выпущен в январе 2006 года. Впоследствии альфа-релизы появляются регулярно. Последняя версия 4.0.0-alpha14 выпущена 24 декабря 2010 года.
Info
- Протокол CIFS является преемником протокола SMB, поддерживается большинством серверов Windows и множеством других коммерческих серверов, а также хранилищами Network Attached Storage.
- У проекта существует форк SambaTHG, который возник в 2000 году из-за разногласий разработчиков, но так и не получил широкого распространения.
- В условиях многопользовательского доступа скорость работы Samba в качестве файлового и принт-сервера более чем в два раза выше по сравнению с Win2k3 с теми же ролями (по исследованиям ITLabs).
Links
- Официальный сайт проекта Samba: samba.org;
- интересная статья про настройку Samba в роли PDC: opennet.ru/base/net/samba_pdc_slackware.txt.html;
- русскоязычный ресурс с множеством статей и переводов по теме: smb-conf.ru.