ВЗЯТО С : http://www.k-max.name/windows/howto-samba-na-2-interfejsa-i-2-seti-s-raznymi-smb-conf/
Доброго времени, читатели и гости
моего блога. На днях довелось реализовать вот такую необычную схему на
SAMBA, установленной из пакетного менеджера
Debian squeezy. Делюсь данным решением с Вами.
Введение
Итак, стояла задача организовать
обменник между двумя сетям не связанными между собой. При этом, объем файлов был довольно большой и использовать файловые хостинги или почту для данной задачи неудобно. Было решено поставить между сетями слабенькую машинку с большим объемом дискового пространства и попробовать
настроить SAMBA. При этом, 2 конфига будут указывать на один и тот же каталог в файловой системе, это позволит видеть измененные/добавленные файлы обоим подсетям в онлайне. За основу статьи был взят материал из
wiki samba.
Особенностью конфигурации samba для работы в нескольких сетях (читай - с разными конфигами) заключается в том, что необходимо хранить tdb - файлы раздельно для каждого запущенного экземпляра smbd/nmbd. Эти файлы содержат некоторую техническую информацию о работе демонов, такую как сопоставление пользователей, пароли и др. (более подобно о файлах tdb можно почитать в
man smbd). Чтобы обеспечить хранение tdb-файлов в разных каталогах, можно пойти двумя путями:
- перекомпилировать SAMBA с указанием путей размещения файлов
- указать размещение - в конфигурационном файле smb.conf и указать каждому экземпляру демона свой конфигурационный файл
Как вы, наверно, догадались - мы пойдем по второму пути. Кроме того, необходимо заставить samba (читай - демонов
smbd, nmbd) слушать запросы на
заданных сетевых интерфейсах. Это тоже делается в конфигурационном файле.
Исходные данные
- Данный мануал ориентирован на Debian-подобные дистрибутивы.
- Для статьи я буду использовать файл конфигурации для файлопомойки, чтобы не отвлекать от основной задачи настройки SAMBA на двух интерфейсах. Никто не запрещает настроить samba, например для взаимодействия в одной из сетей с контроллером домена.
- На нашем сервере имеется два сетевых интерфейса: eth1 и eth2
- На интерфейсе eth1 будут работать следующие параметры:
- рабочая группа SAMBA
- имя сервера FILES
- подсеть 192.168.0.1/24
- На интерфейсе eth2 будут работать следующие параметры:
- рабочая группа WINDOWS
- имя сервера SERVER
- подсеть 10.0.0.1/24
- Для настройки данной статьи необходимо наличие установленного пакета samba (и winbind, если используется доменная аутентификация), на момент написания статьи версия - 3.5.6~dfsg-3squeeze8.
Настройка сети для SAMBA
Настроим сетевые интерфейсы и некоторые другие
сетевые параметры перед настройкой SAMBA. (Для редактирования конфигов я использую
редактор vim). Вот содержимое файлов:
root@debian:~# vim /etc/network/interfaces
root@debian:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1 eth2
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
iface eth2 inet static
address 10.0.0.1
netmask 255.255.255.0
root@debian:~# vim /etc/hosts
root@debian:~# cat /etc/hosts
127.0.0.1 localhost
192.168.0.1 files.samba files
10.0.0.1 server.windows server
Более подробно о
настройке сети в Linux я писал в соответствующей статье.
Настройка каталогов размещения экземпляров SAMBA
Если мы посмотрим
в каких каталогах самба по умолчанию хранит свои настройки:
root@debian:~# testparm -vs 2> /dev/null | grep /
smb passwd file = /etc/samba/smbpasswd
private dir = /etc/samba
passwd program = /usr/bin/passwd %u
log file = /var/log/samba/log.%m
lock directory = /var/run/samba
state directory = /var/lib/samba
cache directory = /var/cache/samba
pid directory = /var/run/samba
то сможем эти пути переделать под наши нужны. О назначении каждого из каталогов можно почитать в
man smb.conf. Давайте
создадим необходимые нам
каталоги, в которых samba хранит свои настройки (pid'ы, базы данных ...):
root@debian:~# mkdir -p /var/log/samba-server /var/log/samba-files
mkdir: создан каталог «/var/log/samba-server»
mkdir: создан каталог «/var/log/samba-files»
root@debian:~# mkdir -p -v /var/run/samba-server /var/run/samba-files
mkdir: создан каталог «/var/run/samba-server»
mkdir: создан каталог «/var/run/samba-files»
root@debian:~# mkdir -p -v /var/lib/samba-server /var/lib/samba-files
mkdir: создан каталог «/var/lib/samba-server»
mkdir: создан каталог «/var/lib/samba-files»
root@debian:~# mkdir -p -v /var/cache/samba-server /var/cache/samba-files
mkdir: создан каталог «/var/cache/samba-server»
mkdir: создан каталог «/var/cache/samba-files»
root@debian:~# mkdir -p -v /shares/obmen
mkdir: создан каталог «/shares»
mkdir: создан каталог «/shares/obmen»
Данные пути я выбрал для удобства. Вы можете создать свои каталоги для разных экземпляров samba. Конечно же, если укажите свои пути, то их нужно учесть в следующих шагах.
Настройка ротации логов SAMBA
О
syslog и logrotate я писал в прошлых статьях. Этих знаний должно быть вполне достаточно, чтобы понять следующий конфиг:
root@debian:~# # оригинальный конфиг:
root@debian:~# vim /etc/logrotate.d/samba
/var/log/samba/log.smbd {
weekly
missingok
rotate 7
postrotate
/etc/init.d/samba reload > /dev/null
endscript
compress
notifempty
}
/var/log/samba/log.nmbd {
weekly
missingok
rotate 7
postrotate
[ ! -f /var/run/samba/nmbd.pid ] || kill -HUP `cat /var/run/samba/nmbd.pid`
endscript
compress
notifempty
}
root@debian:~# # переделанный для нескольких интерфейсов:
root@debian:~# vim /etc/logrotate.d/samba
## в целом, конфиг необходимо формировать по следующим правилам:
#/путь/к/логам/log.* {
## путь задается в том формате, который задан в параметре log file
# weekly
# missingok
# rotate 7
# postrotate
## пути к pid указываются в соответствии с параметром pid directory
# [ ! -f /путь/к/pid/файлу_nmbd.pid ] || /bin/kill -HUP `cat /путь/к/pid/файлу_nmbd.pid`
# [ ! -f /путь/к/pid/файлу_smbd.pid ] || /bin/kill -HUP `cat //путь/к/pid/файлу_smbd.pid`
## путь к pid'у демона winbind указывать необязательно, если он не используется
# [ ! -f /путь/к/pid/файлу_winbindd.pid ] || /bin/kill -HUP `cat /путь/к/pid/файлу_winbindd.pid`
# endscript
# compress
# notifempty
#}
/var/log/samba-files/log.* {
weekly
missingok
rotate 7
postrotate
[ ! -f /var/run/samba-files/nmbd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/nmbd-smb-files.conf.pid`
[ ! -f /var/run/samba-files/smbd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/smbd-smb-files.conf.pid`
[ ! -f /var/run/samba-files/winbindd-smb-files.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-files/winbindd-smb-files.conf.pid`
endscript
compress
notifempty
}
/var/log/samba-server/log.* {
weekly
missingok
rotate 7
postrotate
[ ! -f /var/run/samba-server/nmbd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/nmbd-smb-server.conf.pid`
[ ! -f /var/run/samba-server/smbd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/smbd-smb-server.conf.pid`
[ ! -f /var/run/samba-server/winbindd-smb-server.conf.pid ] || /bin/kill -HUP `cat /var/run/samba-server/winbindd-smb-server.conf.pid`
endscript
compress
notifempty
}
Из данных конфигурационных файлов может возникнуть вопрос,
почему pid'ы указаны в таком формате. Об этом я расскажу ниже. В остальном, думаю, что понятно, что пути к каталогу логов и pid'ов необходимо поменять на те, которые были созданы на прошлом шаге, а точнее на те, которые вы укажите в соответствующем конфиге smb.conf для заданного экземпляра samba.
Настройка файлов smb.conf для разных экземпляров samba
Перед настройкой SAMBA на разных интерфейсах я обычно переименовываю оригинальный smb.conf и создаю отдельные конфиги с нуля:
root@debian:~# mv -v /etc/samba/smb.conf /etc/samba/_smb.conf.orig
«/etc/samba/smb.conf» -> «/etc/samba/_smb.conf.orig
root@debian:~# # конфиг для интерфейса eth2,
root@debian:~# # раб.гр. WINDOWS с именем севера SERVER:
root@debian:~# vim /etc/samba/smb-server.conf
[global]
workgroup = WINDOWS
netbios name = SERVER
interfaces = eth2
bind interfaces only = Yes
security = SHARE
log level = 3
smb ports = 139
wins support = Yes
preferred master = Yes
guest ok = yes
log file = /var/log/samba-server/log.%m
lock directory = /var/run/samba-server
state directory = /var/lib/samba-server
cache directory = /var/cache/samba-server
pid directory = /var/run/samba-server
private dir = /var/lib/samba-server
[win-serv]
path = /shares/obmen
read only = No
inherit permissions = Yes
create mask = 0777
directory mask = 0777
root@debian:~# # конфиг для интерфейса eth1,
root@debian:~# # раб.гр. SAMBA с именем севера FILES:
root@debian:~# vim /etc/samba/smb-files.conf
[global]
workgroup = SAMBA
netbios name = FILES
interfaces = eth1
bind interfaces only = Yes
security = SHARE
log level = 3
smb ports = 139
wins support = Yes
preferred master = Yes
guest ok = yes
log file = /var/log/samba-files/log.%m
lock directory = /var/run/samba-files
state directory = /var/lib/samba-files
cache directory = /var/cache/samba-files
pid directory = /var/run/samba-files
private dir = /var/lib/samba-files
[samba-files]
path = /shares/obmen
read only = No
inherit permissions = Yes
create mask = 0777
directory mask = 0777
Основополагающим для данной темы в данных конфигурационных файлах являются параметры
interfaces и
bind interfaces only, ограничивающие работу экземпляра samba на заданных интерфейсах. А так же параметры, разделяющие размещение приватных файлов для данного экземпляра SAMBA (
log file, lock directory, state directory,cache directory, pid directory и private dir).
Примечание. В Debian в SAMBA, поставляемой с дистрибутивом по какой-то причине, smbd не слушается параметр private dir, в результате чего файлы passdb.tdb и secrets.tdb используются для всех запускаемых экземпляров и хранят в себе SID'ы и некоторые другие настройки для всех запущенных smbd. Почему так происходит - я ответа не нашел...
Создание init - скрипта для разных smb.conf
Про
этапы загрузки Linux и
систему System V init я писал в прошлых статьях, про работу
bash так же было написано много статей, поэтому знаний для понимания происходящего должно хватить. Перед тем как создать
модифицированные init-скрипты, необходимо остановить и отключить оригинальный экземпляр
samba и
winbind:
root@debian:~# /etc/init.d/samba stop
Stopping Samba daemons: nmbd smbd.
root@debian:~# /etc/init.d/winbind stop
Stopping the Winbind daemon: winbind.
root@debian:~# update-rc.d samba remove
update-rc.d: using dependency based boot sequencing
root@debian:~# update-rc.d winbind remove
update-rc.d: using dependency based boot sequencing
После этого, беремся
модифицировать оригинальный init-скрипт samba, который имеет вид:
Спрятать оригинальный init для samba «
#!/bin/sh
### BEGIN INIT INFO
# Provides: samba
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Should-Start: slapd
# Should-Stop: slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO
# Defaults
RUN_MODE="daemons"
# Reads config file (will override defaults above)
[ -r /etc/default/samba ] && . /etc/default/samba
PIDDIR=/var/run/samba
NMBDPID=$PIDDIR/nmbd.pid
SMBDPID=$PIDDIR/smbd.pid
# clear conflicting settings from the environment
unset TMPDIR
# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting Samba daemons"
# Make sure we have our PIDDIR, even if it's on a tmpfs
install -o root -g root -m 755 -d $PIDDIR
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
if [ "$NMBD_DISABLED" != 'Yes' ]; then
log_progress_msg "nmbd"
if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/nmbd -- -D
then
log_end_msg 1
exit 1
fi
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/smbd -- -D; then
log_end_msg 1
exit 1
fi
fi
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping Samba daemons"
log_progress_msg "nmbd"
start-stop-daemon --stop --quiet --pidfile $NMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by nmbd itself IMHO.)
rm -f $NMBDPID
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
start-stop-daemon --stop --quiet --pidfile $SMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by smbd itself IMHO.)
rm -f $SMBDPID
fi
fi
log_end_msg 0
;;
reload)
log_daemon_msg "Reloading /etc/samba/smb.conf" "smbd only"
start-stop-daemon --stop --signal HUP --pidfile $SMBDPID
log_end_msg 0
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
status)
status="0"
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
if [ "$NMBD_DISABLED" != "Yes" ]; then
status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
fi
if [ "$RUN_MODE" != "inetd" ]; then
status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
fi
if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
status="4"
fi
exit $status
;;
*)
echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
exit 1
;;
esac
exit 0
Давайте разберем данный скрипт... В самом начале (
BEGIN INIT INFO) задается некая информация для управления автозапуском демона (например, с помощью команды
update-rc.d). Далее, задаются некоторые
переменные. Тут мы сталкиваемся с
первым важным моментом, который нас не устраивает -
неверно указаны пути к расположению pid-файлов. Кроме того, как показала практика, если используется нестандартный конфиг, то pid-файл создается с именем
имядемона-имяконфига.pid, (например, в нашем случае с конфигом
smb-files.conf и демоном
smbd -
smbd-smb-files.conf.pid). Соответственно, это
второй важный момент -
несоответствие имени pid-файла.
Далее, проверяется наличие и читается конфигурационный файл из
/etc/default, происходит разименование переменной TMPDIR (для чего???), проверяется наличие исполняемых файлов демонов и включается в конфиг некоторые
LSB log_* функции из пакета
lsb-base. Как видно, тут
нигде не задается переменная со значением конфигурационного файла. Это
третий важный момент, который нас не устраивает.
Далее идет чтение переданной
позиционной переменной $1 и в зависимости от ее значения происходит, запуск, остановка, перезагрузка, перезапуск, вывод статуса или просто вывод сообщения на консоль. Давайте каждый пункт рассмотрим:
start) = запуск демона
- Сначала выводится сообщение о начале запуска SAMBA с помощью функции log_daemon_msg, которая берется из файла init-functions.
- Далее командой install устанавливается владелец, группа и права на каталог с pid-файлами.
- Далее, с помощью программы testparm проверяется, не установлен ли параметр disable netbios в конфигурационном файле по умолчанию (!!! /etc/samba/smb.conf). Опять же, у нас будут свои конфиги и в данной проверке конфиг не указан. Это четвертый важный момент, который нас не устраивает.
- Если disable netbios в конфиге задан в yes, то nmbd запущен не будет за ненадобностью. Если же nmbd запускается, то выводится сообщение "nmbd" и запускается демон nmbd с помощью программы start-stop-daemon. Если почитать man start-stop-daemon, то становится видно, что тут тоже есть недостатки, которые так же нас не устраивают: 1. не проверяется создание pid файла, 2. не указывается конфигурационный файл, который необходимо использовать для запуска.
- Если запуск происходит неудачно, про происходит выход с выводом сообщения об ошибке со статусом 1.
- Далее, если переменная $RUN_MODE не установлена в значение inetd, то выводится сообщение "smbd" и запускается демон smbd. С теми же недостатками, что и nmbd. Так же, если запуск не удался, то происходит выход с выводом сообщения об ошибке со статусом 1.
stop) = остановка демона
- при остановке демона выводится сообщение об остановке, выводится сообщение "nmbd" и с помощью программы start-stop-daemon на основе pid-файла демон nmbd останавливается.
- Через 1 секунду проверяется существование pid файла и если он существует - удаляется.
- Далее, если переменная $RUN_MODE не установлена в значение inetd, то выводится сообщение "smbd" и останавливается демон smbd.
- Через 1 секунду проверяется существование pid файла и если он существует - удаляется.
reload) = перечитать конфиг
- В данном случае выводится сообщение о релоаде smbd и и посылается сигнал HUP демону smbd.
restart) = перезапуск
- перезапуск заключается в последовательном запуске stop и start.
status) = проверка статуса процесса
- в данном случае, с помощью функции status_of_proc из init-functions проверяется запущен ли smbd, nmbd
*) = вывод текстового сообщения
- Данный пункт отвечает за вывод текстового сообщения в случае ошибки при вводе start, stop,....
Итак, разобравшись с init-скриптом мы можем приступить к модификации оригинального скрипта в тот вид, который необходимый нам. С учетом всех
описанных недостатков выше:
root@debian:~# # копируем оригинальный скрипт в модифицируемый
root@debian:~# cp -v /etc/init.d/samba /etc/init.d/samba-server
«/etc/init.d/samba» -> «/etc/init.d/samba-server»
root@debian:~# # запрещаем доступ всем к реальному скрипту
root@debian:~# chmod 000 /etc/init.d/samba
root@debian:~# # редактируем скрипт для SERVER
root@debian:~# vim /etc/init.d/samba-server
root@debian:~# # копируем модифицированный скрипт в скрипт для FILES и редактируем
root@debian:~# cp -v /etc/init.d/samba-server /etc/init.d/samba-files
«/etc/init.d/samba-server» -> «/etc/init.d/samba-files»
root@debian:~# vim /etc/init.d/samba-files
root@debian:~# # делаем скрипты исполняемыми
root@debian:~# chmod -v +x /etc/init.d/samba-*
права доступа «/etc/init.d/samba-files» оставлены как 0755 (rwxr-xr-x)
права доступа «/etc/init.d/samba-server» оставлены как 0755 (rwxr-xr-x)
root@debian:~# # добавляем оба скрипта в автозагрузку
root@debian:~# update-rc.d samba-server defaults
update-rc.d: using dependency based boot sequencing
root@debian:~# update-rc.d samba-files defaults
update-rc.d: using dependency based boot sequencing
Итого, у нас получились следующие скрипты (модификации отмечены цветом):
root@debian:~# cat /etc/init.d/samba-server
#!/bin/sh
### BEGIN INIT INFO
# Provides: samba-server
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Should-Start: slapd
# Should-Stop: slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO
# изменим поле Provides в соответствии с именем скрипта,
# иначе будет ругаться при добавлении в автозагрузку
# Defaults
RUN_MODE="daemons"
# Reads config file (will override defaults above)
# у себя я отключил данный конфиг, т.к. настраиваю все тут
#[ -r /etc/default/samba ] && . /etc/default/samba
# изменяем путь на тот, что в конфиге:
PIDDIR=/var/run/samba-server
# изменяем имена pid
NMBDPID=$PIDDIR/nmbd-smb-server.conf.pid
SMBDPID=$PIDDIR/smbd-smb-server.conf.pid
# задаем переменную, хранящую путь к конфигу
CONF=/etc/samba/smb-server.conf
# clear conflicting settings from the environment
unset TMPDIR
# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
# изменяем строку лога на подходящую нам
log_daemon_msg "Starting Samba for SERVER and workgroup WINDOWS"
# Make sure we have our PIDDIR, even if it's on a tmpfs
install -o root -g root -m 755 -d $PIDDIR
# указываем в testparm конфиг
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
if [ "$NMBD_DISABLED" != 'Yes' ]; then
log_progress_msg "nmbd"
# указываем для nmbd конфиг и задаем проверку pid
if ! start-stop-daemon --start --quiet --oknodo --pidfile $NMBDPID --exec /usr/sbin/nmbd -- -D -s $CONF
then
log_end_msg 1
exit 1
fi
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
# указываем для smbd конфиг и задаем проверку pid
if ! start-stop-daemon --start --quiet --oknodo --pidfile $SMBDPID --exec /usr/sbin/smbd -- -D -s $CONF; then
log_end_msg 1
exit 1
fi
fi
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping Samba for SERVER and workgroup WINDOWS"
log_progress_msg "nmbd"
start-stop-daemon --stop --quiet --pidfile $NMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by nmbd itself IMHO.)
rm -f $NMBDPID
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
start-stop-daemon --stop --quiet --pidfile $SMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by smbd itself IMHO.)
rm -f $SMBDPID
fi
fi
log_end_msg 0
;;
reload)
# изменяем строку лога на подходящую нам
log_daemon_msg "Reloading /etc/samba/smb-server.conf" "smbd only"
start-stop-daemon --stop --signal HUP --pidfile $SMBDPID
log_end_msg 0
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
status)
status="0"
# указываем для testparm конфиг
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
if [ "$NMBD_DISABLED" != "Yes" ]; then
status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
fi
if [ "$RUN_MODE" != "inetd" ]; then
status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
fi
if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
status="4"
fi
exit $status
;;
*)
# изменяем сообщение на подходящее нам
echo "Usage: /etc/init.d/samba-server {start|stop|reload|restart|force-reload|status}"
exit 1
;;
esac
exit 0
и
root@debian:~# cat /etc/init.d/samba-files
#!/bin/sh
### BEGIN INIT INFO
# Provides: samba-files
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Should-Start: slapd
# Should-Stop: slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO
# изменим поле Provides в соответствии с именем скрипта,
# иначе будет ругаться при добавлении в автозагрузку
# Defaults
RUN_MODE="daemons"
# Reads config file (will override defaults above)
# у себя я отключил данный конфиг, т.к. настраиваю все тут
#[ -r /etc/default/samba ] && . /etc/default/samba
# изменяем путь на тот, что в конфиге:
PIDDIR=/var/run/samba-files
# изменяем имена pid
NMBDPID=$PIDDIR/nmbd-smb-files.conf.pid
SMBDPID=$PIDDIR/smbd-smb-files.conf.pid
# задаем переменную, хранящую путь к конфигу
CONF=/etc/samba/smb-files.conf
# clear conflicting settings from the environment
unset TMPDIR
# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
# изменяем строку лога на подходящую нам
log_daemon_msg "Starting Samba for FILES and workgroup SAMBA"
# Make sure we have our PIDDIR, even if it's on a tmpfs
install -o root -g root -m 755 -d $PIDDIR
# указываем в testparm конфиг
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
if [ "$NMBD_DISABLED" != 'Yes' ]; then
log_progress_msg "nmbd"
# указываем для nmbd конфиг и задаем проверку pid
if ! start-stop-daemon --start --quiet --oknodo --pidfile $NMBDPID --exec /usr/sbin/nmbd -- -D -s $CONF
then
log_end_msg 1
exit 1
fi
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
# указываем для smbd конфиг и задаем проверку pid
if ! start-stop-daemon --start --quiet --oknodo --pidfile $SMBDPID --exec /usr/sbin/smbd -- -D -s $CONF; then
log_end_msg 1
exit 1
fi
fi
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping Samba for FILES and workgroup SAMBA"
log_progress_msg "nmbd"
start-stop-daemon --stop --quiet --pidfile $NMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by nmbd itself IMHO.)
rm -f $NMBDPID
fi
if [ "$RUN_MODE" != "inetd" ]; then
log_progress_msg "smbd"
start-stop-daemon --stop --quiet --pidfile $SMBDPID
# Wait a little and remove stale PID file
sleep 1
if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
then
# Stale PID file (nmbd was succesfully stopped),
# remove it (should be removed by smbd itself IMHO.)
rm -f $SMBDPID
fi
fi
log_end_msg 0
;;
reload)
# изменяем строку лога на подходящую нам
log_daemon_msg "Reloading /etc/samba/smb-files.conf" "smbd only"
start-stop-daemon --stop --signal HUP --pidfile $SMBDPID
log_end_msg 0
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
status)
status="0"
# указываем для testparm конфиг
NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' $CONF 2>/dev/null`
if [ "$NMBD_DISABLED" != "Yes" ]; then
status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
fi
if [ "$RUN_MODE" != "inetd" ]; then
status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
fi
if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
status="4"
fi
exit $status
;;
*)
# изменяем сообщение на подходящее нам
echo "Usage: /etc/init.d/samba-files {start|stop|reload|restart|force-reload|status}"
exit 1
;;
esac
exit 0
Ну что ж, на данном этапе можно считать, что все готово к запуску и проверке....
Запуск и тестирование SAMBA на двух интерфейсах
Запускаем FILES в рабочей группе SAMBA, который должен запуститься только на интерфейсе с подсетью 192.168.0.1/24
root@debian:~# /etc/init.d/samba-files start
Starting Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# ps aux | grep mbd
root 3430 0.0 0.5 10780 1976 ? Ss 02:24 0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-files.conf
root 3432 0.0 0.2 10388 872 ? S 02:24 0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-files.conf
root 3434 0.0 0.7 17832 2892 ? Ss 02:24 0:00 /usr/sbin/smbd -D -s /etc/samba/smb-files.conf
root 3440 0.0 0.3 17832 1200 ? S 02:24 0:00 /usr/sbin/smbd -D -s /etc/samba/smb-files.conf
root@debian:~# netstat -nap | grep mb
tcp 0 0 192.168.0.1:139 0.0.0.0:* LISTEN 3434/smbd
tcp6 0 0 fe80::a00:27ff:fe7f:139 :::* LISTEN 3434/smbd
udp 0 0 192.168.0.255:137 0.0.0.0:* 3430/nmbd
udp 0 0 192.168.0.1:137 0.0.0.0:* 3430/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 3430/nmbd
udp 0 0 192.168.0.255:138 0.0.0.0:* 3430/nmbd
udp 0 0 192.168.0.1:138 0.0.0.0:* 3430/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 3430/nmbd
unix 2 [ ] DGRAM 11989 3430/nmbd
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]
Sharename Type Comment
--------- ---- -------
samba-files Disk
IPC$ IPC IPC Service (Samba 3.5.6)
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]
Server Comment
--------- -------
FILES Samba 3.5.6
LINUX-KURS
Workgroup Master
--------- -------
SAMBA FILES
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Connection to SERVER failed (Error NT_STATUS_CONNECTION_REFUSED)
Можно кричать УРА! SAMBA запустилась с нужным конфигом и только на нужном интерфейсе (??? зачем на 0.0.0.0), при подключении клиентом мы видим общие ресурсы ресурсы, а на WinXP видим нужный файловый сервер.
Пробуем
запустить второй экземпляр SAMBA - SERVER в рабочей группе WINDOWS, который должен запуститься только на интерфейсе с подсетью 10.0.0.10/24:
root@debian:~# /etc/init.d/samba-files stop
Stopping Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# /etc/init.d/samba-server start
Starting Samba for SERVER and workgroup WINDOWS: nmbd smbd.
root@debian:~# ps aux | grep mbd
root 3681 0.1 0.5 10736 1932 ? Ss 02:49 0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-server.conf
root 3683 0.0 0.2 10388 864 ? S 02:49 0:00 /usr/sbin/nmbd -D -s /etc/samba/smb-server.conf
root 3684 0.2 0.7 17832 2888 ? Ss 02:49 0:00 /usr/sbin/smbd -D -s /etc/samba/smb-server.conf
root 3690 0.0 0.3 17832 1200 ? S 02:49 0:00 /usr/sbin/smbd -D -s /etc/samba/smb-server.conf
root 3692 0.0 0.2 3328 780 pts/0 S+ 02:49 0:00 grep mbd
root@debian:~# netstat -nap | grep mbd
tcp 0 0 10.0.0.1:139 0.0.0.0:* LISTEN 3684/smbd
tcp6 0 0 fe80::a00:27ff:fe36:139 :::* LISTEN 3684/smbd
udp 0 0 10.0.0.255:137 0.0.0.0:* 3681/nmbd
udp 0 0 10.0.0.1:137 0.0.0.0:* 3681/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 3681/nmbd
udp 0 0 10.0.0.255:138 0.0.0.0:* 3681/nmbd
udp 0 0 10.0.0.1:138 0.0.0.0:* 3681/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 3681/nmbd
unix 2 [ ] DGRAM 12797 3681/nmbd
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]
Sharename Type Comment
--------- ---- -------
win-serv Disk
IPC$ IPC IPC Service (Samba 3.5.6)
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]
Server Comment
--------- -------
SERVER Samba 3.5.6
WINXP
Workgroup Master
--------- -------
WINDOWS SERVER
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Connection to FILES failed (Error NT_STATUS_CONNECTION_REFUSED)
Аналогично, все прошло удачно.
Стартуем оба экземпляра:
root@debian:~# /etc/init.d/samba-files start
Starting Samba for FILES and workgroup SAMBA: nmbd smbd.
root@debian:~# chmod 777 /shares/obmen/
root@debian:~# smbclient -L //FILES -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]
Sharename Type Comment
--------- ---- -------
samba-files Disk
IPC$ IPC IPC Service (Samba 3.5.6)
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.5.6]
Server Comment
--------- -------
FILES Samba 3.5.6
LINUX-KURS
Workgroup Master
--------- -------
SAMBA FILES
root@debian:~# smbclient -L //SERVER -U%
params.c:OpenConfFile() - Unable to open configuration file "/etc/samba/smb.conf":
No such file or directory
smbclient: Can't load /etc/samba/smb.conf - run testparm to debug it
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]
Sharename Type Comment
--------- ---- -------
win-serv Disk
IPC$ IPC IPC Service (Samba 3.5.6)
Domain=[WINDOWS] OS=[Unix] Server=[Samba 3.5.6]
Server Comment
--------- -------
SERVER Samba 3.5.6
WINXP
Workgroup Master
--------- -------
WINDOWS SERVER
и видим в своих рабочих группах наличие
только заданных в конфигурации master-серверов.
Совсем забыл указать еще один нюанс. При установке samba создается так же файл
/etc/network/if-up.d/samba, который запускает samba при старте сети. В нашем случае это не совсем актуально, т.к. для каждого интерфейса используется свой экземпляр SAMBA. Поэтому я вижу 2 выхода, если есть необходимость запускать/перезапускать SAMBA при изменении настроек сети: 1. Перезапускать SAMBA вручную, 2. Добавить команду запуска в /etc/network/interfaces, пример:
root@debian:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1 eth2
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
up /etc/init.d/samba-files start
iface eth2 inet static
address 10.0.0.1
netmask 255.255.255.0
up /etc/init.d/samba-server start
Но сам файл
/etc/network/if-up.d/samba необходимо удалить.
Если используется winbind
Если
SAMBA будет взаимодействовать с доменом, то необходимо будет использовать
демон winbindd. Собственно, в статье все настройки для winbind учтены. Что необходимо сделать дополнительно:
- Модифицировать init-скрипт /etc/init.d/winbind. Этот скрипт абсолютно идентичен /etc/init.d/samba и содержит те же недостатки и переделывается аналогично.
- При настройке сети необходимо учесть нюансы настроек файлов /etc/nsswitch.conf и других, указанных в статье SAMBA как член домена AD.
Резюме
На этом можно считать HOWTO завершенной. По аналогии, можно запустить демонов хоть на 3,4...20 сетевых интерфейсов, создав соответствующие файлы smb.conf и init скрипты. При обновлении SAMBA наши конфиги не должны пострадать. Но все же стоит после обновления проконтролировать, не заменился ли
/etc/init.d/samba на оригинальный. Так же, при настройке данной схемы, я предпочитаю удалять оригинальные каталоги
/var/log/samba, /var/run/samba и
/var/cache/samba, чтобы не возникало путаницы. Буду рад вашим комментариям и дополнениям! Удачных внедрений!