2004 г.
Все будет Samba!
Сергей Ефремов, Издательский Дом "Комиздат"
У многих начинающих администраторов ОС Linux возникают те или иные проблемы при настройке и запуске в эксплуатацию системы Samba. Правильно настроенный пакет позволит избежать головной боли в дальнейшем. Итак, начнем…
Лучше день потерять,
зато за десять минут долететь...
(с) Крылья, ноги и хвост
Зачем нужна Samba
Эта служба предоставляет ряд возможностей:
- разделение файловых систем Linux операционными системами Windows 9x/NT;
- разделение файловых систем Windows 9x/NT операционной системой Linux;
- совместное использование принтеров, подключенных к системе Linux, операционными системами Windows 9x/NT;
- совместное использование принтеров, подключенных к Windows 9x/NT, операционной системой Linux;
- организации системы доменов для клиентов под управлением ОС Windows.
Samba представляет собой протокол, используемый Microsoft для разделения файлов и служб печати. Этот протокол был разработан в 1987 году и позже перенесен на платформы Linux Эндрю Триджеллом (Andrew Tridgell). Официальный сайт Samba, тут вы всегда найдете интересующую вас информацию и новые версии пакета.
Что нам надо для счастья
- Операционная система Red Hat Linux 7.2 - на мой взгляд, этот релиз, хоть он и не самый новый, наиболее оптимален для серверов.
- Стабильная версия Samba - например, версия 2.2.5, пакет samba-2.2.5.tar.gz.
- Компилятор зыка С - gcc (рекомендую установить версию gcc 3.1).
- Патч Network Recycle Bin, разработанный в Amherst College. Как видно из названия, этот пачт позволит расширить стандартную функциональность поддержкой корзины для удаленных файлов на сетевых дисках.
- Ну и конечно - физический или виртуальный сервер, на который мы будем устанавливать программу (в моем случае это был Dual PIIIs 866, 512M ECC, SCSI RAID Mylex170, 4 HDD SCSI IBM 18G в RAID5, Teckram 390U + SCSI 18G Seagate).
Организация дисковых разделов
Для нормального функционирования системы в процессе эксплуатации нужно заранее определиться с дисковыми разделами, на которых будет устроен файловый сервер. Для примера я организовал дисковое пространство следующим образом:
/boot |
100M |
Загрузочный раздел |
/ |
3.5G |
Корень системы с не выделенным /home /usr |
/tmp |
2G |
Раздел для временных файлов |
swap |
1G |
Раздел виртуальной памяти |
/var |
6G |
Раздел для рабочих данных системных программ и ведения логических журналов программ |
/install |
5.3G |
Раздел с инсталляционным ПО и драйверами для машин пользователей |
/FileServer |
40.6G |
Раздел файлового сервера |
/Vol |
17G |
Раздел хранения в архивном виде данных пользователей |
Не выделяю отдельно Home, поскольку для задач пользователей предоставление каждому пользователю отдельного домашнего каталога совершенно не нужно. Это связано с тем, что работа организована по отделам,- и, соответственно, пользователи одного отдела должны иметь доступ к файлам друг друга, для хранения же прочей информации каждый пользователь использует локальный жесткий диск.
Установка
Все операции проводим под авторизацией root (администратора системы).
Распакуем пакет samba-2.2.5.tar.gz в каталог /usr/src/redhat/SOURCES:
# cat samba-2.2.5.tar.gz | gzip -d | tar xvpf -
Теперь установим поддержку "сетевой корзины". Зачем нужна "сетевая корзина"? Все операционные системы, имеющие GUI, предоставляют пользователям (в той или иной мере) так называемую "корзину", которая служит для временного хранения файлов, удаленных пользователем на своей рабочей станции. При работе в сети эти функции обычно недоступны для сетевых ресурсов, поэтому администраторам системы приходиться делать периодический BackUp файлов пользователей. Но это перестает быть эффективным, если удаленный файл не был сохранен с помощью программ, организующих BackUp. Именно для такого случая и нужна "сетевая корзина".
Еще одно ее достоинство - возможность восстановления предыдущей версии файла пользователем самостоятельно, без привлечения администратора сети. Но здесь сразу же стоит сделать некоторые замечания:
- "сетевая корзина" - это обычная папка, которую можно размещать как на текущем (классический вид), так и на специализированном ресурсе. Причем в последнем случае на этом же диске могут находиться и корзины других пользователей - в виде так называемого Online Backup ресурса;
- по умолчанию в патче атрибуты доступа на корзину - 0700. То есть в эту папку может зайти и что-либо с ней делать только владелец этого ресурса. Это не вызывает проблем, если пользователь использует сетевой ресурс один,- но обычно одним ресурсом пользуется несколько пользователей, и в этом случае возникает ситуация, когда только один пользователь может удалять файлы. Для решения этой проблемы предлагаю в файле reply.c.patch изменить строку №15 с "+ int dir_mask=0700;" на "+ int dir_mask=0777;" - это позволит всем пользователям данного ресурса корректно работать с данной папкой;
- если в системе используются квоты (quota), то их установки влияют и на корзину - так что при расчете квот нужно учитывать этот момент;
- в ходе эксплуатации была обнаружена проблема, заключающаяся в том, что, если в конфигурационном файле указать полный, а не относительный путь к корзине на ресурсе, то при попытке пользователя удалить файл в корзине происходило следующее: файл не удалялся, а переименовывался по формату "имя файла. (Copy #N).расширение" (где N - номер файла с одинаковыми именами). То есть срабатывал алгоритм, по условиям которого, если файл с определенным именем есть в корзине, то происходит не замена старого файла новым, а добавление дополнительного суффикса и инкрементация его номера. Для решения данной проблемы необходимо в файле reply.c.patch изменить строку № 38 с "+ if (strcmp (fname,bin)){" на "+ if (access (bin, F_OK)!=-1) {".
По окончанию описанных мероприятий переходим к компиляции пакета и его установке, для чего устанавливаем патч:
# patch /usr/src/redhat/SOURCES
/samba-2.2.5/source/include/proto.h
/usr/src/readhat/SOURCES/proto.h.patch
# patch /usr/src/redhat/SOURCES
/samba-2.2.5/source/param/loadparm.c
/usr/src/readhat/SOURCES/loadparm.c.patch
# patch /usr/src/redhat/SOURCES
/samba-2.2.5/source/smbd/reply.c
/usr/src/readhat/SOURCES/reply.h.patch
И выполняем конфигурацию пакета инсталляции (полный перечень всех параметров можно получить по команде./configure --help):
переходим в каталог /usr/src/redhat/SOURCES/samba-2.2.5/source
# cd /usr/src/redhat/SOURCES/samba-2.2.5/source
выполняем конфигурирование:
# ./configure --prefix=/usr --with-quota
--with-smbmount --with-msdfs
--with-privatedir=/etc/samba
--with-configdir=/etc/samba
--with-lockdir=/var/lock/samba
--with-piddir=/var/run/samba
--with-logfilebasedir=/var/log/samba
Этим мы дали команду включить в сборку smbmount, который служит для монтирования SMB-ресурсов в файловую структуру Linux, включили поддержку квот (quota), а также поддержку Microsoft DFS, и приказали устанавливаться в каталог /usr;
далее выполняем стандартные:
# make; make install
еще одним шагом сделаем, следующее:
копируем файл smb.init:
# cp /usr/packaging/RedHat/smb.init /etc/init.d/smb
делаем симлинк на это файл (чтобы при старте сервера у нас всегда запускалась служба):
# ln -s /etc/init.d/smb /etc/rc3.d/S99samba
и, на всякий случай,- для init 5:
# ln -s /etc/init.d/smb /etc/rc5.d/S99samba
В результате получаем установленный пакет. Начинаем его настраивать. Основной файл конфигурации и файл паролей пользователей будет находиться в /etc/samba.
Приступаем к настройке
Для начала определимся со структурой каталогов на разделе /FileServer - для примера рассмотрим такой вариант:
/FileServer/etc |
Папка будет содержать файлы конфигурации Samba |
/FileServer/netlogon |
Папка для скриптов входа в домен |
/FileServer/otdel_1 |
Папка 1 отдела |
/FileServer/otdel_N |
Папка N отдела |
/FileServer/Public |
Общий для всех отделов ресурс |
Соответственно, в основном файле конфигурации /etc/samba/smb.conf прописываем:
include=/FileServer/etc/smb.global
include=/FileServer/etc/%U.conf
- то есть мы будет управлять каждым пользователем отдельно. Такое управление выбрано как более гибкое, нежели управление группами пользователей, потому что оно позволяет более жестко контролировать отдельных пользователей в случае необходимости в таком контроле. В обычный ситуации я создаю один конфигурационный файл для всей группы, а для отдельных пользователей делаю на него symlink ("мягкую" ссылку на файл) по имени пользователя.
При этом не забываем следить, чтобы все указанные в конфигурационных файлах каталоги и файлы существовали и имели правильные права. То есть после создания папок на разделе файл-сервера нужно установить на них атрибуты доступа для пользователей:
# chmod 777 /FileServer/otdel*
# chmod 777 /FileServer/Public*
Теперь сформируем файл /FileServer/etc/smb.global:
[global]
null passwords = false
workgroup=MY_DOMAIN
netbios name=MyServ
server string=File Server
character set=KOI8-R
client code page=866
unix password sync = yes
passwd chat = *new*password* %n\n *new*password*
%n\n *success*
passwd program = /usr/bin/passwd %u
interfaces=eth0
bind interfaces only=True
hosts deny=ALL
hosts allow=192.168.0.0/255.255.0.0 127.0.0.1
protocol=NT1
security=domain
encrypt passwords=yes
lm interval=0
oplocks=False
level2 oplocks=No
syslog=1
wins support=Yes
domain master=Yes
local master=Yes
preferred master=Yes
os level=255
log level=0
log file=/dev/null
domain logons=yes
logon script=%U.bat
create mask=0666
directory mask=0777
security mask=0777
force create mode=0777
nt acl support =yes
socket options =SO_KEEPALIVE SO_BROADCAST
TCP_NODELAY
SO_RCVBUF=4096 SO_SNDBUF=4096
domain admin group = root
add user script = /usr/sbin/useradd -d
/dev/null -g
machines -s /bin/false -M %u
logon path = \%L\Profiles\%U
[Profiles]
path = /var/lib/samba/profiles
browseable = no
read only = no
create mask = 0600
directory mask = 0700
Проведем анализ - что же мы тут написали. Как видим, у нас есть два раздела: [global] и [Profiles] - первый отвечает за информацию непосредственно о сервере и общих настройках, а второй описывает каталог, в котором будут храниться профили пользователей на сервере. Соответственно, каталог /var/lib/samba/profiles должен существовать - и при этом права доступа должны разрешать писать туда всем (# chmod 777 /var/lib/samba/profiles).
Раздел [global] - главные моменты:
workgroup |
Название домена, в котором участвует сервер |
netbios name |
Как будет откликаться сервер по NetBIOS-протоколу. Не делайте его таким же, как и имя рабочей группы! |
hosts allow |
Список сетей, которым разрешен доступ к серверу |
interfaces |
Список сетевых интерфейсов, которым разрешен доступ к серверу |
security |
Говорит, какой будет аутентификация |
encrypt passwords |
Разрешаем шифрованные пароли |
local master |
Samba сразу берет на себя роль мастер-браузера |
preferred master |
При запуске устраивает перевыборы с наибольшим шансом для себя |
wins support |
Запускаем wins-сервер |
os level |
Уровень ОС. Чем выше номер, тем выше вероятность стать главным браузером сети |
domain logons |
Разрешаем подсоединения в режиме домена |
logon script |
Скрипт, который выполнится при входе в домен |
domain admin group |
Какой пользователь может добавлять машины и пользователей в домен |
add user script |
Позволяет samba работать как PDC Windows, то есть добавляет имя машины в список зарегистрированных в домене |
Более подробную информацию по командам конфигурации samba можно получить с помощью # man smb.conf.
Следующим этапом мы создадим файл smb.netlogon со таким содержимым:
[netlogon]
path=/FileServer/netlogon
writeable=no
guest ok=no
browsable=no
available=yes
Здесь описывается "шара" (сетевой ресурс) для возможности выполнения скрипта при входе в домен.
И последний штрих - пример файла конфигурации для пользователя user, принадлежащего к отделу № 1, файл user.conf:
include=/FileServer/etc/smb.global
include=/FileServer/etc/smb.netlogon
[Otdel]
path=/FileServer/otdel_1
comment=Информация отдела
browsable=yes
available=yes
writeable=yes
recycle bin=/FileServer/otdel_1/.recycled
mangled names=no
directory mask=0777
create mask=0666
fstype=NTFS
[Public]
path=/FileServer/Public
comment=Общая информация
browsable=yes
available=yes
writeable=yes
mangled names=no
directory mask=0777
create mask=0666
fstype=NTFS
[Inst_Prog]
path=/install
comment=Инсталяционное ПО
browsable=yes
available=yes
writeable=no
mangled names=no
fstype=NTFS
[HP_5000]
printer=lp
comment = Queue for HP LaserJet 5000
browseable = yes
printable = yes
public = yes
writable = no
create mode = 0700
Проанализируем, что получилось. Итак, у нас есть четыре сетевых ресурса, три из них - это дисковые пространства, а последний - очередь на сетевой принтер. Параметр printer=lp дает нам ссылку на имя очереди принтера, который предварительно был установлен в системе и получил имя lp. Менеджер управления принтерами вызывается с помощью команды:
# /usr/bin/redhat-config-printer
Ресурс [Inst_Prog] предоставляет пользователям возможность получить доступ к инсталляционным пакетам программ и драйверам в режиме "только чтение".
Ресурс [Otdel] - это папка отдела, к которому принадлежит пользователь; при описании этого ресурса была использована команда для организации на этом ресурсе "сетевой корзины" (recycle bin=/FileServer/otdel_1/.recycled). Как видно из синтаксиса команды, мы можем указать в качестве корзины как полный путь, так и относительный (например: recycle bin=.recycled). При использовании относительного пути в качестве базы для имени будет использован путь к сетевому ресурсу, в котором и описано правило по использованию "сетевой корзины".
Следующим шагом будет написание файла скрипта, который будет выполняться при входе в домен,- обычно в этом файле производят подключение сетевых ресурсов и синхронизацию времени, хотя можно выполнять и другие задачи (например, запуск на рабочей станции программы удаленного администрирования - Remote Admin).
Скрипт /FileServer/netlogon/user.bat:
@echo off
net use h: \MyServ\Otdel
net use i: \MyServ\Public
net use k: \MyServ\Inst_Prog
net time \MyServ /SET /YES
Здесь следует обратить внимание на одну деталь, связанную с кодовыми таблицами Windows и Linux: созданный в Linux файл для операционной системы выглядит как одна строка и, соответственно, написанные нами команды выполняться не будут. Чтобы обойти эту проблему, воспользуемся программой конвертации файлов из кодовой системы Linux/Unix в DOS/Windows:
# unix2dos /FileServer/netlogon/user.bat
На выходе получим файл в кодировке DOS, который ОС Windows сможет правильно интерпретировать.
Нам осталось сделать еще одну маленькую операцию - и можно будет переходить к тестированию наших настроек.
В процессе эксплуатации "сетевая корзина" будет заполняться данными, и нам нужно предусмотреть вариант переполнения корзины и - как следствие - исчерпание дискового пространства, предоставленного пользователю на сетевом ресурсе.
Для решения этой задачи создадим скрипт clear_recycled, который поместим в каталог /etc/cron.daily. Это позволит выполнять скрипту каждую ночь и выполнять запланированные нами действия над "сетевой корзиной". В тело скрипта поместим следующие строки:
#del after 1 day recycled file
find /FileServer/otdel*/.recycled -type f -atime +1
-exec rm {} \; >& /dev/null
Приведенный скрипт просматривает во всех папках отделов "сетевую корзину" - и файлы, которые были помещены туда более одного дня назад, будут удалены. Параметр, отвечающий за данную опцию,- -atime +1. Здесь вы можете указать любое нужное количество дней. (Более подробно о возможностях команды find смотрите: man find.)
Графический интерфейс управления Samba
Этот интерфейс называется swat, он является так называемым веб-интерфейсом (то есть его можно использовать на любом компьютере, имеющем веб-браузер). Для активации доступа к этой службе необходимо создать в каталоге /etc/xinetd.d файл swat следующего содержания:
service swat
{
port = 901
socket-type = stream
wait = no
only_from = <IP адрес рабочей станции
администратора>
user = root
server = /usr/bin/swat
log_on_failure += USERID
disable = no
}
После этого перезапускаем службу xinetd:
# /etc/init.d/xinetd restart
Теперь, если в браузере на рабочей станции администратора набрать: http://192.168.0.1:901 - получим графический интерфейс управления пакетом.
Прежде чем начать непосредственное тестирование установленного пакета, необходимо выполнить следующие операции:
создать в системе группы, к которым будут принадлежать наши пользователи:
# groupadd otdel_1
...
# groupadd otdel_N
создать группу, в которую будем затем помещать имена машин пользователей (необходимо для ОС Windows 2000/XP/2003 Server):
# groupadd -g 9999 machines
создать скрипт machine_add (в папке /usr/bin) - для ручного добавления имен машин в наш домен:
useradd -d /dev/null -c "User PC"
-g machines -s /bin/false
-M $1
passwd -l $1
smbpasswd -a -t $1
В качестве параметра нашему скрипту передается имя компьютера с добавленным в конце знаком $. Например, для нашего пользователя user имя его ПК - otdel_n1_user:
# /usr/bin/machine_add "otdel_n1_user$"
добавить в систему наших пользователей - с учетом принадлежности их своим группам:
# useradd -c "Фамилия Имя Отчество" -g otdel_1 -s
/bin/false user
и, наконец, добавить нашего пользователя в список пользователей samba:
# smbpasswd -a user
- с вводом ему первичного пароля. После входа в сеть пользователь на рабочей станции может самостоятельно сменить себе пароль - причем, тот должен будет удовлетворять двум условиям: не быть "пустым" и иметь длину не менее 6-ти символов. Эти условия контролируются Samba и при их нарушении смена пароля не будет допущена.
Теперь мы можем проверить работоспособность установленного пакета. Для этого выполним следующий скрипт:
# /etc/init.d/smb start
Проверяем, что демон действительно работает:
# /etc/ini.d/smb status
В результате мы должны получить нечто вроде этого:
smbd (pid 1488) выполняется...
nmbd (pid 1492) выполняется...
Переходим к проверке доступности ресурсов для пользователей (на примере пользователя user):
# smbclient -L MyServ -U user
added interface ip=192.168.0.2 bcast=192.168.0.255
nmask=255.255.255.0
Got a positive name query response from 192.168.0.1
(192.168.0.1)
Domain=[MY_DOMAIN] OS=[Unix] Server=[Samba 2.2.5]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba Server)
ADMIN$ Disk IPC Service (Samba Server)
Otdel Disk Информация отдела
Public Disk Общая информация
Inst_Prog Disk Инсталяционное ПО
HP_5000 Printer Queue for HP LaserJet 5000
Server Comment
--------- -------
MyServ File Server
Workgroup Master
--------- -------
MY_DOMAIN MyServ
Как видно из полученного сообщения, все прошло удачно и при обращении к samba server пользователь получил свои ресурсы.
Настройка Windows-клиента
Прежде чем ввести компьютер в созданный домен, необходимо (для ОС Windows 2000/XP/2003 Server) изменить параметры входа в домен. Под этим подразумевается, что мы отключим некоторые ключи, использующиеся для задания специального доверительного общения между доменом, сделанным на базе ОС Windows, и Windows-клиентом. Для упрощения этого процесса создадим файл domain_fix.reg следующего содержания:
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000
"requirestrongkey"=dword:00000000
"sealsecurechannel"=dword:00000001
"signsecurechannel"=dword:00000001
Следующим шагом будет ввод ПК в домен.
Для ОС Windows 9x все очень просто - необходимо в Свойствах сети выбрать службу Microsoft и в ее свойствах указать, что рабочая станция подключается в домен, и указать также его имя.
Для Windows 2000/XP/2003 Server нужно вызвать вкладку Свойства на Мой компьютер - и выбрать вкладку Имя компьютера. Далее - команда Изменить (см. рис. 2).
После этого ОС просмотрит текущую сеть на предмет наличия домена. Если тот будет найден, появится диалоговое окно, в котором вы (в качестве пользователя) должны указать логин пользователя, имеющего права для ввода рабочей станции в домен (в нашем случае, и по умолчанию, это root), и указать его пароль. После того как система сообщит о вводе рабочей станции в домен, она предложит перезагрузиться.
Здесь мы можем пойти по двум направлениям - имеется ввиду, что нашему пользователю можно оставить "обычные права", а можно задать специальные.
Если мы выбираем первый вариант, можно перегрузить систему и при загрузке просто указать имя пользователя и домен, с которого будем загружаться. Или же можем добавить пользователя через Панель управления > Администрирование > Управление компьютером > Локальные пользователи > Пользователи (создаем нового пользователя с указанием того, в каком домене он будет проходит аутентификацию и к какой группе будет принадлежать - например, Администраторы).
После входа пользователя в домен выполняется скрипт входа в домен, в нашем примере, подключаются сетевые диски и происходит синхронизация времени рабочей станции и сервера.
Выводы
Как видим, процесс настройки пакета достаточно сложен и трудоемок, зато в таком разрезе проходит только один раз - обслуживание уже настроенного пакета не вызывает никаких трудностей. Управление пользователями и их ресурсами достаточно прозрачно, и процессы добавления, изменения или удаления пользователя или ресурса занимают очень мало времени - буквально пару минут.