суббота, 29 июня 2013 г.

Настройка ротации логов

Logrotate - приложение, разработанное для облегчения управления лог-файлами. Особенно Logrotate полезен там, где создается большое количество лог-файлов. Утилита позволяет в автоматическом режиме архивировать, удалять, очищать и отправлять на e-mail лог-файлы. Этот процесс обычно называется ротацией лог файлов.
Logrotate может быть настроен на ежедневную, еженедельную или ежемесячную ротацию. Кроме того, можно задать размер файла, по достижении которого файл будет ротирован. Обычно logrotate выполняется в качестве каждодневного задания (cron).

Установка Logrotate

Установка обычна для Debian / Ubuntu-based дистрибутивов:
$ sudo aptitude install logrotate

Краткое описание файла настроек Logrotate

Описание того, каким образом Logrotate будет работать с тем или иным лог файлом находится в специальном конфигурационном файле. Как правило, они располагаются в директории /etc/logrotate.d/. Например, файл конфигурации для apache2 выглядит следующим образом:
$ more /etc/logrotate.d/apache2
/var/log/apache2/*.log {
        weekly              # ротация раз в неделю, возможна иная периодичность:  daily, monthly
        missingok           # отсутствие файла не является ошибкой
        rotate 52           # сохраняется последние 52 ротированных файла
        compress            # сжимать ротируемый файл
        delaycompress       # сжимать предыдущий файл при следующей ротации 
                            # (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми)
        notifempty          # не обрабатывать пустые файлы
        create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем
        sharedscripts       # крипты prerotate/postrotate будут выполнены только один раз
                            # не зависимо от количества журналов, подходящих под заданный шаблон
        postrotate          # скрипт будет выполнен сразу после ротации
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                        /etc/init.d/apache2 reload > /dev/null
                fi
        endscript
}
При этом, первая строка /var/log/apache2/*.log есть ничто иное, как шаблон обрабатываемых лог-файлов. Он означает, что указанная конфигурация ротации будет использоваться для всех файлов, находящихся в директории /var/log/apache2/ и имеющих расширение "log".

Вместо
weekly
можно было указать
size 10M
тогда лог будет ротироваться вне зависимости от регулярности, но на основе своего размера: ротироваться будет лог по объему больший или равный 10 мегабайтам. Какой вариант более подходит вам — решайте сами. Но учтите, что при регулярной ротации, вам надо хотя бы примерно прикинуть максимальный размер лога, умножить его на количество сохраняых копий и убедится, что места у вас на диске хватит и останется (иначе вся ротация смысл теряет).
Допустимых директив в конфигурационном файле очень много (более 40). Поддробнее о них можно узнать из man logrotate.

Основные опции Logrotate

Как правило, после настройки конфигурационного файла появляется необходимость проверить работу logrotate для новых логов. Для этого есть возможность непосредственного запуска logrotate из командной строки. При этом допускаются следующие опции:
  • -d. Всключает режим отладки, а так же дублирует опциию -v. В режиме отладки никаких действий с логами не будет выполнено.
  • -f, --force. Заставляет logrotate выполнить ротацию логов. Бывает необходимо после добавления новых конфигурационных файлов или если старый лог файл был удалён вручную; таким образом будут созданы новые лог-файлы и журналирование будет корректно продолжено.
  • -m, --mail command. Указывает, какую команду использовать для отправки журналов по почте. Команда должна принимать 2 входных параметра:
    • заголовок письма
    • получателя письма
    После этого команда должна прочитать сообщение со стандартного входа (STDIN) и отправить его получателю. Командой по умолчанию является /usr/bin/mail -s
  • -s, --state statefile. Указывает на использование альтернативный файл состояния. Полезно в случаях, когда logrotate работает от имени разных пользователей для различных наборов лог-файлов. Дефолтный файл состояния: /var/lib/logrotate/status
  • --usage. Выводит краткую инструкцию по использованию утилиты.
  • -v, --verbose. Вывод диагностических сообщений во время ротации.

Пример настройки Logrotate

В качестве примера допустим, что в директории /home/site/debianworld.ru/logs/ располагаются лог-файлы таких веб серверов, как nginx и apache. Работают они в связке:nginx - фронтенд, apache2-бэкенд.
$ more /etc/logrotate.d/debianworld.ru
# Ротация логов nginx (front-end)
# Отдает статику, все остальное - проксирует на apache.
# Лог ведется более интенсивно. 
/home/dw/debianworld.ru/logs/nginx_*.log {
    daily                   # ежедневная ротация
    missingok               # отсутствие файла не является ошибкой
    rotate 45               # хранится история за 45 дней
    compress                # ротируемые файлы сжимаются
    delaycompress           # ротируемый файл не сжимается, остальные - сжимаются
    notifempty              # не обрабатывать пустые файлы
    create 640 dw www-data  # права, пользователь нового файла
    sharedscripts           # prerotate/postrotate выполняются только 1 раз
    prerotate               # Cбор статистики посещений для AWstats
            /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=debianworld.ru -databasebreak=day
    endscript               
    postrotate              # Перезапуск nginx
            [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

# Ротация логов apache2 (back-end)
# Лог ведется менее интенсивно.
/home/dw/debianworld.ru/logs/apache*.log {
    weekly                   # еженедельная ротация
    missingok                # отсутствие файла не является ошибкой
    rotate 4                 # хранится история за 4 недели
    compress                 # ротируемые файлы сжимаются
    nodelaycompress          # ротируемый файл так же сжимается
    notifempty               # не обрабатывать пустые файлы
    create 640 dw www-data   # права, пользователь нового файла
    sharedscripts            # postrotate выполняется только 1 раз
    postrotate               # Перезапуск apache2
            if [ -f /var/run/apache.pid ]; then
                /etc/init.d/apache2 restart > /dev/null
            fi
    endscript
}
Комментарии по ходу текста не должны оставить вопросов. Но в общем, схема такова, что отдельно ротируются логи nginx, отдельно логи apache2. При этом, так как nginx является front-end'ом и его лог наполняется интенсивнее, чем у apache, то он (лог nginx) ротируется в 7 раз чаще, чем лог apache2.
Кроме того, при каждой итерации ротирования логов nginx выполняется сбор статистики посещений AWstats (см. Установка и настройка AWstats и Настройка AWstats для генерации статистики по дням).
После того, как конфигурационный файл создан, необходимо убедиться, что все будет работать именно так, как и задумано. Для этого необходимо выполнить (при этом, реальных изменений никаких не будет, так как запуск будет выполнен в отладочном режиме):
$ sudo logrotate -d /etc/logrotate.d/debianworld.ru
После того, как по диагностическим сообщениям стало ясно, что все в порядке, необходимо непосредственно запустить ротацию:
$ sudo logrotate -v -f /etc/logrotate.d/debianworld.ru
В дальнейшем ротация будет выполняться автоматически с заданным в конфигурационном файле интервалом

четверг, 27 июня 2013 г.

WOL в linux, когда несколько интерфейсов.

Если необходимо включать компьютеры с разных подсетей, т.е. имеем несколько физических интерфейсов, то возникает проблема с основным маршрутом, куда будет отсылаться широковещательный пакет. Для этого, для каждого компьютера, написал простецкий скрипт:

#! /bin/bash
#добавляем маршрут по умолчанию для широковещательного пакета в #подсеть с компьютером
route add -net 255.255.255.255 netmask 255.255.255.255 gw 192.168.2.1 metric 2
#отсылаем пакет чз порт 8 с нужным маком

wakeonlan -p 8 BC:5F:F4:5C:71:43
#удаляем маршрут
route del -net 255.255.255.255 netmask 255.255.255.255 gw 192.168.2.1 metric 2


Другого решения пока не нашел.
При проблеме запуска скрипта bash: ./1.sh: Отказано в доступе, выполняем команду chmod +x 1.sh

Включение компьютеров по сети (WOL)

Для того, чтобы иметь возможность разбудить компьютер удалённо, необходимо,
чтобы в нём был установлен источник питания ATX версии не ниже 2.01,
материнская плата, поддерживающая Wake On Lan, а также сетевая плата с
поддержкой этой технологии.

Настройка

Определить, поддерживает ли материнская плата вашего компьютера Wake On Lan,
можно зайдя в настройки CMOS Setup в раздел настроек управления питанием.
Найдите там опцию "Wake On Lan" и убедитесь, что она включена.

После загрузки системы установите, если необходимо, пакет ethtool, при помощи
которого можно в том числе и переключать сетевую плату в режим пробуждения по
сигналу Wake On Lan от других машин:

   sudo apt-get install ethtool

Далее, необходимо определить, поддерживает ли установленная сетевая плата Wake
On Lan, и включена ли эта опция:

   sudo ethtool eth0 | grep -i wake-on

   Supports Wake-on: pumbg
   Wake-on: d

В строке Supports Wake-On перечислены механизмы, поддерживаемые сетевой платой.
В моём примере я пользуюсь методом отправки так называемым Magic Packet, и если
вам нужно то же самое, то убедитесь, что в Supports Wake On присутствует буква
"g". Буква "d" в строке Wake-on обозначает, что Wake On Lan для данного
сетевого интерфейса отключён. Чтобы включить его в режим распознавания Magic
Packet, необходимо выполнить:

   ethtool -s eth0 wol g

Имейте ввиду, что после включения компьютера, вероятней всего, опция Wake-on
опять перейдёт в состояние "d" и, если вам нужно, добавьте приведённую выше
команду куда-нибудь в /etc/rc.local.

Теперь всё готово для пробуждения системы по получению Magic Packet. Для того,
чтобы его отправить, необходимо знать MAC-адрес сетевого интерфейса включаемого
компьютера, поэтому прежде, чем выключать систему, запишите его:

   ifconfig eth0 | grep -i hwaddr
   eth0      Link encap:Ethernet  HWaddr 00:0e:2e:b9:cb:ad

Теперь можно выключать систему:

   sudo shutdown -h now


Включение

Теперь с любого другого компьютера, находящегося в том же сегменте локальной
сети (в принципе, это необязательно, но тогда необходимо, чтобы в вашей сети
маршрутизаторы корректно пробрасывали широковещательные пакеты), можно включить
ранее сконфигурированную удалённую систему. Для этого понадобится утилита
wakeonlan, которую необходимо установить:

   sudo apt-get install wakeonlan

Разбудить выключенную систему теперь можно командой (обратите внимание,
wakeonlan не требует прав суперпользователя):

   wakeonlan -p 8 00:0e:2e:b9:cb:ad

Опцией -p указывается номер UDP-порта, с которого будет отправлен Magic Packet.
Указание этой опции обязательно, поскольку по умолчанию wakeonlan использует
девятый порт, помеченный в /etc/services как discard, что означает то, что
пакет с этого порта отправить не получится. В принципе, можно использовать
любой незанятый в системе UDP-порт.

среда, 26 июня 2013 г.

Как создать пустой файл в Linux

Взято с ссылка

Способ 1

touch — команда Unix, предназначенная для установки времени последнего изменения файла или доступа в текущее время. Также используется для создания пустых файлов.

#!/bin/sh
touch имя_файла


Способ 2

cat — утилита UNIX, выводящая последовательно указанные файлы (или устройства), таким образом, объединяя их в единый поток. Если вместо имени файла указывается «-», то читается стандартный ввод.

#!/bin/sh
cat /dev/null >имя_файла

 

Способ 3

tail — утилита в UNIX, выводящая несколько (по умолчанию 10) последних строк из файла.


#!/bin/sh
tail /etc/fstab | grep -E "^Moses$" >имя_файла

 

Способ 4

date — утилита Unix для работы с системными часами. Выводит текущую дату и время в различных форматах и позволяет устанавливать системное время.


#!/bin/sh
date 2>имя_файла

 

Способ 5

dd — программа Unix, предназначенная как для копирования, так и для конвертации файлов.


#!/bin/sh
dd count=0 if=/etc/inittab of=имя_файла

 

Способ 6

Vim — свободный режимный текстовый редактор, созданный на основе более старого vi. Ныне это один из мощнейших текстовых редакторов с полной свободой настройки и автоматизации, и созданным благодаря этому расширениям и надстройкам.


#!/bin/sh
vim -c wq имя_файла

 

Способ 7

cp — команда Unix в составе GNU Coreutils, предназначенная для копирования файлов из одного в другие каталоги (возможно, с другой файловой системой). Исходный файл остаётся неизменным, имя созданного файла может быть таким же, как у исходного, или измениться.

#!/bin/sh
cp имя_файла_0 имя_файла

 

Способ 8

echo — команда Unix, предназначенная для отображения строки текста. Команда echo — выводит текст (выводит текст на стандартное устройство вывода).

#!/bin/sh
echo >имя_файла

 

Способ 9



#!/bin/sh
echo '(with-open-file (x "имя_файла" :direction <img src="http://www.kobzarev.com/wp-includes/images/smilies/icon_surprised.gif" alt=":o" class="wp-smiley"> utput))' | clisp -

 

Способ 10


#!/bin/sh
cp /dev/null имя_файла

 

Способ 11


#!/bin/sh
: > имя_файла

 

Способ 12

Самый короткий из способов, любезно предоставленный пользователем stam.

#!/bin/sh
> имя_файла

вторник, 25 июня 2013 г.

SAMBA на 2 интерфейса и 2 сети с разными smb.conf

ВЗЯТО С : 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-файлов в разных каталогах, можно пойти двумя путями:
  1. перекомпилировать SAMBA с указанием путей размещения файлов
  2. указать размещение - в конфигурационном файле 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
  • Для настройки данной статьи необходимо наличие установленного пакета sambawinbind, если используется доменная аутентификация), на момент написания статьи версия - 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 видим нужный файловый сервер.
работа самба на сетевом интерфейсе eth1
Пробуем запустить второй экземпляр 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)
Аналогично,  все прошло удачно.
Запуск samba на интерфейсе eth2
Стартуем оба экземпляра:
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 учтены. Что необходимо сделать дополнительно:
  1. Модифицировать  init-скрипт /etc/init.d/winbind. Этот скрипт абсолютно идентичен /etc/init.d/samba и содержит те же недостатки и переделывается аналогично.
  2. При настройке сети необходимо учесть нюансы настроек файлов /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, чтобы не возникало путаницы. Буду рад вашим комментариям и дополнениям! Удачных внедрений!

Jail в Debian

Взято с умершего сайта.


Порядок действий по заведению юзера в jail.
Исходные данные:
priest – логин юзера

Порядок действий:
Устанавливаем Jailkit
[cc lang="bash"]cd /jail/
mkdir priest // создаем пользовательскую папку (корневую директорию)
chown root:root priest/  //меняем права[/cc]
Потом подключаем заранее написаные в конфиге (/etc/jailkit/jk_init.ini ) шабоны.
Пример шаблона basicshell
[cc lang="bash"][basicshell]
comment = bash based shell with several basic utilities<
executables = /bin/sh, /bin/bash, /bin/ls, /bin/cat, /bin/chmod, /bin/mkdir, /bin/cp, /bin/cpio, /bin/date, /bin/dd, /bin/echo, /bin/egrep, /bin/false, /bin/fgrep, /bin/grep, /bin/gunzip, /bin/gzip, /bin/ln, /bin/ls, /bin/mkdir, /bin/mktemp, /bin/more, /bin/mv, /bin/pwd, /bin/rm, /bin/rmdir, /bin/sed, /bin/sh, /bin/sleep, /bin/sync, /bin/tar, /bin/touch, /bin/true, /bin/uncompress, /bin/zcat
regularfiles = /etc/motd, /etc/issue, /etc/bash.bashrc, /etc/bashrc, /etc/profile
directories = /usr/lib/locale/en_US.utf8
users = root
groups = root
includesections = uidbasics[/cc]
Подключение шаблонов
[cc lang="bash"]
jk_init -v /jail/priest/ basicshell
jk_init -v /jail/priest/ editors
jk_init -v /jail/priest/ extendedshell
jk_init -v /jail/priest/ netutils
jk_init -v /jail/priest/ ssh
jk_init -v /jail/priest/ sftp[/cc]
Добавляем юзера в систему
[cc lang="bash"]adduser priest[/cc]
и назначаем ему шелл
[cc lang="bash"]jk_init -v /jail/priest/ jk_lsh
jk_jailuser -m -j /jail/priest/ priest
passwd priest[/cc]
Создаем ему папку для веб(необходимо зранее включить в apache)
[cc lang="bash"]mkdir /jail/priest/home/priest/www/[/cc]
Выставляем права
[cc lang="bash"]chown -R priest:priest /jail/priest/home/[/cc]
Редактируем его файл passwd
[cc lang="bash"]nano /jail/priest/etc/passwd  (меняем /usr/bin/jk_lsh на /bin/bash)[/cc]
Копируем .bashrc c любого реального аккаунта
[cc lang="bash"]cp /jail/demo/home/demo/.bashrc /jail/priest/home/priest/.bashrc[/cc]
Если нужен screen
[cc lang="bash"]mount -o bind /dev /home/chroot/dev
mount -t proc proc /home/chroot/proc
mount -t devpts devpts /home/chroot/dev/pts[/cc]

Проверка работоспособности видеокарты в Linux

Что бы проверить, правильно ли установлены драйвера на видеокарту, можно запустить glxgears. Должно появиться окошко с крутящимися шестеренками.

P.S. Для корректной работы glxgears, необходим пакет mesa-utils

Автоматическое монтирование второго жетсокого диска

Для упрощения:
В меню "Переходы" выбираем нужный диск, заходим на него, и система автоматически его монтирует. Вся информация о смонтированном диске попадет в /etc/mtab. Заходим,  находим нужную строку вида:
/dev/sdb5 /media/70be3c1b-bf5d-44d4-848e-a7cdc4e66642 ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered 0 0

Копируем ее в конец файлы /etc/fstab , только вместо /dev/sdb5 подставляем UUID. Узнать UUID можно с помощью команды ls -l /dev/disk/by-uuid.

Не забываем предварительно создать папку для монтирования. 

Взято из http://help.ubuntu.ru/manual/fstab

понедельник, 24 июня 2013 г.

Автоматизация скачивания обновлений продуктов Kaspersky Lab на Debian Wheez 7.1

Актуально для Debian Wheezy 7.1

1. Скачиваем утилиту Kaspersky Update Utility 2.0 и сохраняем. (в примере сохранено в домашнюю папку пользователя)

2. Распаковываем:
       mkdir /home/servser1c/UpdateKasper &  tar xvfz updater2.0.1.2015.1_linux_ru.tar.gz -C /home/servser1c/UpdateKasper
    и переходим в директорию с файлами:
   cd /home/servser1c/UpdateKasper


3. Настраиваем утилиту. Есть два пути, первый это открыть графически ./UpdateUtility-Gui утилиту и настроить все там. Второй это открыть файл updater.ini и отредактировать все там. Можно и комбинировать эти варианты, т.к. выставлять false напротив параметров (а их прилично), немного утомительно. Я к примеру выставил обновления только KIS 2013 (к слову строка в графическом интерфейсе с ним не содержит надписи, и нужно нажимать на "обум"), и выставил отображение хода работы с помощью параметра TurnTrace.
Так же желательно указать куда будут скачиваться обновления. Для этого параметр MoveToCustomFolder, выставляем true, а в параметрах UpdatesFolder и TempFolder указываем папку для готовых обновлений и для временных файлов обновлений, соответственно. Более подробное описание параметров updater.ini, можно найти на сайте касперского.

Если ругается на отсутствие библиотеки libQtXml.so.4, или какой либо еще, устанавливаем их. В моем случае: aptitude install libqtxml4-perl


4. Проверяем консольную утилиту, выполнив команду: ./UpdateUtility-Console -u.

5. Устаналиваем утилиту для автозапуска приложений по расписанию  - Cron. Выполняем команду crontab -e. В конец файла дописываем:
  0 3 * * * user /home/servser1c/ftp/updater2.0.1.2015.1_linux_ru/UpdateUtility-Console -u
Это позволит запускать, от пользователя user, каждый день в 3 часа ночи наш апдейтер. Подробный мануал на Cron, можно найти в сети.

Первый раз запуск утилиты касперского, лучше выполнить вручную, так как она долго скачивает обновления, и лучше знать что происходит.

VNC в Debian Wheezy 7.1

1. Устаналиваем x11vnc и tightvncserver:

aptitude install x11vnc tightvncserver

2. Необходимо в сценарии запуска DM (Desktop Manager, в Debian Wheezy он к примеру Gnome3) указать  запуск X11VNC. Путь к данному файлу может быть разный, к примеру:  /etc/X11/gdm/Init/Default
У меня он /etc/gnm3/Init/Default. Открываем с помощью nano:

nano /etc/gdm3/Init/Default

В конец файла, перед exit 0. добавляем следующую строку:

/usr/bin/x11vnc -scale 1024x768 -xkb -rfbauth /root/.vnc/passwd -o /var/log/x11vnc.log -forever -bg

Где "/usr/bin/x11vnc" путь до нашего x11vnc, желательно проверить, есть ли он там. Далее необходимо указать пароль из под root'a, командой:

vncpasswd

Перезагружаемся, проверяем.

воскресенье, 23 июня 2013 г.

Администрирование посредством VNC

Администрирование посредством VNC

MooSE 2006-12-18 02:24:19
Протокол VNC предусматривает подключение к удалённому рабочему столу. Он является аналогом RAdmin из Windows, но в отличии от последнего является кроссплатформенным и поддерживает шифрование передаваемых данных.
Сразу оговорюсь что в этой статье я никоим образом не отрицаю других способов удалённого администрирования Linux. Просто появилось желание осветить возможности VNC - протокола, более удобного для начинающих пользователей чем, например, SSH.
Как и большинство моих статей, эта статья будет ориентирована в первую очередь на пользователей дистрибутива Gentoo, одним из которых я являюсь. Однако 95% того что здесь написано применимо и для других дистрибутивов.
Для начала нам нужно установить пакет VNC. Обязательно с включенным флагом server. Для этого достаточно выполнить следующую команду:
USE=server emerge vnc
Если по какой-то причине сборка пройдёт не удачно - обновите ваше дерево portage при помощи emerge --sync, emerge-webrsync или emerge-delta-webrsync (Тут уж на ваше усмотрение). Всё дело в том что в какой-то момент в дереве уже был X.Org 7, но имеющаяся версия VNC не поддерживала его. Именно поэтому и нужно обновить дерево (Хотя по идее поможет и откат на X.Org 6, но я не думаю что кто-то использует это решение).
Следующим шагом нужно добавить в секцию Module файла /etc/X11/xorg.conf следующую строчку:
        Load    "vnc"
Теперь нужно решить вопрос с аврторизацией. Для анонимного доступа добавьте в секцию Screen того же файла строчку:
        Option  "SecurityTypes" "None"
или, если вы хотите защитить свой рабочий стол паролем, то в секцию Screen нужно добавить строки:
        Option  "SecurityTypes" "VncAuth"
        Option  "UserPasswdVerifier" "VncAuth"
        Option  "PasswordFile" "/etc/vncpasswd"
После этого вам понадобится задать пароль для подключения. Для этого выполните от имени пользователя root:
# vncpasswd /etc/vncpasswd
и введите желаемый пароль (само собой два раза:)).
После этого вам необходимо перезапустить X-сервер.
Теперь вы можете ввести команду vncviewer <Ваш IP> и получить доступ к вашему рабочему столу. Если вы хотите изменить какие-то параметры VNC-сервера (например разрешение, глубину цвета или порт, на котором "слушает" сервер) то вам нужно дописывать соответствующие параметры в секекцию Screen файла xorg.conf. Список опций и их подробное описание (на английском языке) есть в man-странице Xvnc
Всё это, практически один в один описано в FAQ на официальном сайте Real VNC, однако в man-страницах в самом пакете VNC про это ничего не сказано. Поэтому и была написана эта статья.

Хитрости запуска служб в Linux.

Взято с: http://www.opennet.ru/base/sys/run_services_tips.txt.html 
 
Наверное не для кого не секрет что скрипты запускаемых служб в Linux
располагаются в  /etc/rc.d/init.d или /etc/init.d в зависимости от
дистрибутива.  Для того чтобы скрипт запускался автоматически во время
запуска системы надо создать символическую ссылку на скрипт и разместить
её в каталоге  /etc/rc.d/rcN.d или  /etc/rc.d/rcN.d, где N &#8211;
соответствует  уровню выполнения скрипта.

Уровень 0 
    остановка системы (halt) - работа системы должна быть прекращена; 

Уровень 1 
    однопользовательский режим работы - система инициализирует минимум
    служб и даёт единственному пользователю (как правило,
    суперпользователю) без проведения аутентификации командную строку.
    Как правило, этот режим используется для восстановления системы; 

Уровень 2 
    многопользовательский режим - пользователи могут работать на разных
    терминалах, вход в систему с процессом аутентификации; 

Уровень 3 
    многопользовательский сетевой режим - в отличие от предыдущего
    уровня, осуществляется настройка сети и запускаются различные
    сетевые службы; 

Уровень 4 
    не имеет стандартного толкования и практически не используется;

Уровень 5 
    запуск графической подсистемы - по сравнению с уровнем 3
    производится также старт графической подсистемы X11 , и вход в
    систему осуществляется уже в графическом режиме; 

Уровень 6 
    перезагрузка системы - при включении этого режима останавливаются
    все запущенные программы и производится перезагрузка. 

Чаще всего во время загрузке система использует уровни загрузки 3 или 5. 
Однако есть некоторая хитрость в названии самой символической ссылки, о
которой многие умалчивают, и которой я хочу рассказать. Например:
/etc/rc.d/rc0.d/K60crond и /etc/rc.d/rc3.d/S40crond, указывающие на один
скрипт /etc/init.d/crond службы системного журнала. Скрипт, начинающийся
с "K" соответствует останову службы, а "S" - запуску. Числа, следующие
перед именем службы задают порядок запуска скриптов в директории.
Например, скрипт /etc/rc.d/rc3.d/S34syslogd будет запущен до скрипта
/etc/rc.d/rc3.d/S40crond, тогда как /etc/rc.d/rc3.d/K60crond до
/etc/rc.d/rc3.d/K66syslogd. Можно заметить, что сумма чисел для одной
службы равна 100 - это позволяет упорядочить все скрипты в порядке
старта, обратном порядку завершения.  Создавать самому символические
ссылки весьма утомительно, и для этого лучше использовать специальную
утилиту  chkconfig.


Синтаксис её использования весьма прост:

        chkconfig --list [имя сервиса]
        chkconfig --add <имя сервиса>
        chkconfig --del <имя сервиса>
        chkconfig [--level <уровни>] <имя сервиса> <on|off|reset|resetpriorities>


Где  имя сервиса - это имя исполняемого скрипта находящегося в /etc/rc.d/init.d

Однако и тут есть небольшая хитрость, дело в том что скрипт запуска
должен иметь специальный формат, например такой:

        #!/bin/sh
        # chkconfig: - 98 02
        # description:  Описание процесса
        # processname: Имя процесса

        # Source function library.
        if [ -f /etc/init.d/functions ] ; then
          . /etc/init.d/functions
        elif [ -f /etc/rc.d/init.d/functions ] ; then
          . /etc/rc.d/init.d/functions
        else
          exit 0
        fi
        KIND="Имя_сервиса"
        start() {
                echo -n $"Starting $KIND services: "
                daemon /usr/local/sbin/исполняемый_файл
                echo
        } 

        stop() {
                echo -n $"Shutting down $KIND services: "
                killproc исполняемый_файл
                echo
        } 

        restart() {
                    echo -n $"Restarting $KIND services: " 
                       killproc исполняемый_файл
                   daemon /usr/local/sbin/исполняемый_файл
                   echo
        } 

        case "$1" in
          start)
                  start
                ;;
          stop)
                  stop
                ;;
          restart)
                  restart
                ;;
          *)
                echo $"Usage: $0 {start|stop|restart}"
                exit 1
        esac
        exit $?


Главное тут в следующем, во первых скрипт должен иметь как минимум 3
возможных ключа запуска, это:  start, stop, restart, поскольку именно
эти основные команды используются для запуска, останова и перезапуска.
Плюс ко всему к этому в самом начале файла пишутся те самые заветные
цифры отвечающие за последовательность запуска:

         # chkconfig: - 98 02


Где 98 это номер в последовательности запуска, а 02 это номер
последовательности останова.

То есть, проще говорят этот скрипт запуститься как 98мым в
последовательности очередей, а будет остановлен 2рым.

Теперь практикум. 

Итак для того чтоб добавить скрипт и добавить его в автозагрузку надо
произвести следующую последовательность действий:

1. Создать исполняемый скрипт по шаблону приведёному выше, заменив
исполняемый_файл именем файла который надо запустить.

2. Разместить исполняемый скрипт в /etc/rc.d/init

3. Выполнить команду chkconfig --add исполняемый_скрипт

4. Выполнить команду setup или servicevonf  (в зависимости от того
работвете вы в графическом режиме или консоле ) и выбрать службу которая
будет носить имя исполняемый_скрипт.

Ну вот наверное и всё, если я ни где не ошибся.

Настройка NO-IP

ЕСЛИ ХОСТ НА КОТОРОМ БУДЕТ ЗАПУШЕНА УТИЛИТА НЕ ИМЕЕТ ПРЯМОГО ДОСТУПА К ИНТЕРНЕТУ, Т.Е. СИДИТ ЗА NAT'ом ИЛИ МАРШРУТИЗАТОРОМ, ЧИТАЕМ  (Если NOIP не правильно определяет адрес)
  1. Выкачиваете последнюю версию программы под Linux
  2. Разархивируете полученный файл в директорию /usr/local/src
# cp noip-duc-linux.tar.gz /usr/local/src
# cd /usr/local/src
# tar -zxf noip-duc-linux.tar.gz
# cd noip-2.1.9-1
# make
 
Если выскакивает:
make
gcc -Wall -g -Dlinux -DPREFIX=\"/usr/local\" noip2.c -o noip2 
make: gcc: Команда не найдена
make: *** [noip2] Ошибка 127
то необходимо установиться пакет gcc 
 
# cp redhat.noip.sh /etc/init.d/noip
# chmod 744 /etc/init.d/noip
# make install
При выполнении make install
  1. Выбираем какой интерфейс смотрит в инет
  2. Вводим email адрес, который использовали при регистрации
  3. Вводим пароль, который использовали при регистрации
  4. Период обновления оставляем по умолчанию.
  5. Отказываемся
Скрипт создает файл /usr/local/etc/no-ip2.conf. Если нет, то создаете файл с именем noip2 в директории etc/init.d/ и в него вставляете:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          noip2
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example my init script
# Description:       This file should be used to construct scripts to be placed in /etc/init.d
### END INIT INFO
IDPID=`ps -e | grep "noip2" | grep -v grep | awk '{print $1}'`
 
/etc/rc.d/init.d/noip2
case "$1" in
start)
echo "Starting noip2."
/usr/local/bin/noip2
;;
stop)
echo -n "Shutting down noip2."
killproc $IDPID
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0


сохраняем. Или можете скачать этот файл с нашего сервера.

Переходим в директорию etc/ открываем файл rc.local
перед словом exit 0 , вставляем /etc/init.d/noip2 start
должно получиться примерно так:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/init.d/noip2 start
exit 0


Перезагружаем Linux , заходим в консоль, набираем ps -e или ps aux , ищем в списке noip2 , если есть, значит программа запустилась с автозагрузки и все сделано правильно, если нет в списке, то присвоим права для для файла /etc/init.d/noip2 командой chmod 777 /etc/init.d/noip2.


Если NOIP не правильно определяет адрес

Если мы прокинули порт на модеме, а noip определяет наш адрес как 192.168.1.2 (адрес интерфейса), то можно поступить так.
1. Исключаем noip из сервисов, например, с помощью drakxconf (Для Mandriva).
2. Устанавливаем билиотеку php-cli (может называться к примеру php5-cli), если она не установлена
$sudo urpmi php-cli
2. Создаем файл /etc/scripts/myip.php, который определяет наш IP адрес через сайт www.myip.ru и отправляет его на сайт NOIP.
#!/usr/bin/php
<?php 
$page = file_get_contents('http://www.myip.ru/get_ip.php?loc=http://www.myip.ru/'); 
//echo $page;
preg_match_all('|<TR><TD bgcolor=white align=center valign=middle>(.+)</TD></TR>|',$page,$result); 
$rez=$result[1][rand(0,0)];
//echo $rez;
exec ('/usr/local/bin/noip2 -i'.$rez); 
?>
3. Добавляем в crontab задание
# Отправка в noip IP адреса 
*/10 *  *  *  *   root    /etc/scripts/myip.php
И теперь каждые 10 минут скрипт будет определять Ваш внешний IP адрес и отправлять его на NOIP.