Исходный адрес статьи: https://xakep.ru/2011/08/23/56239/
В наши нелегкие времена, когда большинство пользователей сидит под виндой, обычному линуксоиду приходится подстраиваться под обстоятельства. Файл уже не передашь с помощью nc или NFS, а документ не распечатаешь удаленно через CUPS. Остается только использовать Samba, про тотальную настройку и оптимизацию которой я сейчас и расскажу.
Samba — это свободная программная реализация протокола SMB/ CIFS. Этот протокол, нэйтивно поддерживаемый семейством ОС Windows, позволяет получать удаленный доступ к файлам и сетевым принтерам. В винде рядовой пользователь может повлиять лишь на минимум настроек, связанных с доступом, остальные же опции глубоко скрыты в реестре либо отсутствуют вовсе. В никсах протокол SMB не является обязательным и не всегда доступен из коробки.
Для его использования требуется установить клиентскую (для доступа к уже расшаренным файлам и принтерам) и серверную (для расшаривания у себя на компе) части. После установки следует создать главный конфигурационный файл (если его нет) и запустить стартовый скрипт для активации серверной части. Например, для Arch Linux команды будут выглядеть так:
# pacman -S samba smbclient
/etc/rc.d/samba start
В некоторых системах следует запустить два демона: smbd (файловый) и nmbd (демон имен). Собственно, за расшаривание папок и прочие функции отвечает серверная часть Samba, а за доступ к уже расшаренным на других компах — консольная утилита smbclient. В качестве фронт-энда к ней выступает часть функционала распространенных файловых менеджеров, таких как Dolphin или Nautilus.
В них настройка осуществляется не намного сложнее, чем в винде, поэтому здесь останавливаться не будем. Кроме smbclient существует еще ряд программ, облегчающих жизнь в консоли, кратко рассмотрим наиболее используемые.
В старые версии пакета 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».
Другие важные параметры конфига:
[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
Смысл параметров:
Чтобы найти оптимальные параметры для конкретных условий, надо провести эксперименты по передаче тестового файла размером 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 можно задать ряд параметров, которые так или иначе будут сказываться на производительности:
Следует также отметить, что ощутимую прибавку к производительности может дать использование асинхронного ввода-вывода. Правда, для этого необходимо пересобрать Samba с опцией AIO_ SUPPORT, после чего добавить в конфиг следующие параметры:
aio read size = 16384
aio write size = 16384
aio write behind = true
При работе с 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».
С помощью 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) повысилась и производительность при передаче файлов. Среди прочих изменений:
Например, «wbinfo -g» или «wbinfo -u» теперь выполняются в неблокирующем режиме.
Последняя стабильная версия на данный момент находится под номером 3.5.6 и вышла в свет 8 октября 2010 года.
Проект 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 года.
-------------------------------------------------------------------------------------------------------------------------------------------------
Можно ускорить работу Samba в зависимости от требуемой ситуации. В нашем распоряжении несколько вариантов конфигурации.
Параметры Socket
Одним из полезных параметров является изменение настроек sockets в файле конфигурации Samba. Стоит отметить что все сети различны (тип соединений, коммутаторы, шумы, и т. д.), поэтому не существует универсальной магической формулы для всех сетей. Поэтому если вы хотите оптимизировать производительность Samba для своей сети, вам придется экспериментировать. Для особо упертых рекомендую прочитать страницу man для socket(7). Остальным же нужно просто добавить в конфигурацию Samba следующее SO_KEEPALIVE, SO_RCVBUF=8192, and SO_SNDBUF=8192.
Последние два параметра определяют максимально возможны размер буферов приема и передачи Samba. Уменьшение размера буферов приводит к увеличению фрагментации пакетов, увеличение размера ( вплоть до максимального значения) к уменьшению фрагментации. Лучшим решением будет поставить эксперимент по созданию одного тестового файла размером 100 MB и 100 тестовых файлов по 1 MB, и оценить время копирования их с сервера и на него. На всякий случай рекомендую каждый раз останавливать и запускать сервер Samba для предотвращения кеширования данных. По результатам тестирования времени копирования для разных значений SO_RCVBUF и SO_SNDBUF вы можете определить оптимальное значение для вашей локальной сети. Чтобы создать тестовы файл выполните:
$ dd if=/dev/zero of=testfile count=10240 bs=10240
Для создания 100 файлов размером 1MB выполните:
#!/bin/sh
for ((counter=1; counter<=100; counter++)); do
dd if=/dev/zero of=test${counter} count=1024 bs=1024
done
После сбора данных, добавьте их в график для определения наиболее оптимальных значений параметров socket. На основании этих значений измените параметры socket в файле конфигурации Samba для вашей локальной сети.