Архив рубрики: Администрирование

Linux — Порядок запуска служб

Иногда может потребоваться изменить порядок запуска служб в Linux, если некоторые из них оказываются зависимыми от других. Например, в моем случае одна из машин на RHEL 5 была членом домена, и в то же время на ней нужно было использовать VNC-сервер. После выполнения команды chkconfig vncserver onдля его постановки в автозагрузку выяснилось, что по умолчанию VNC-сервер запускается до Samba; таким образом, он не видит пользователей и завершается с ошибкой. Если же запустить его позже вручную, все нормально.

Итак, нужно изменить порядок запуска этих сервисов.

Посмотрим сначала /etc/rc.d/. Здесь есть подкаталоги для разных уровней запуска. Для тех уровней, в которых запускается служба (посмотреть можно через chkconfig --list), в подкаталогах есть символическая ссылка на скрипт запуска/останова. Например, в  /etc/rc.d/rc5.d/в моем случае имеется файл @S91vncserver(то, что начинается с S, относится к запуску, а с K — к останову). Цифра как раз задает порядок запуска.

Идем туда, куда указывает символическая ссылка — в /etc/rc.d/init.d/, искомый файл — vncserver.

#!/bin/bash
#
# chkconfig: - 91 35
# description: Starts and stops vncserver. \
#              used to provide remote X administration services.
...

Нужно отредактировать этот файл. Я заменил 91 на 93 (92 оставим про запас), чтобы служба запускалась позже:

# chkconfig: - 93 35

Теперь такая команда:

chkconfig vncserver on

Посмотрим в подкаталогах, расположенных в /etc/rc.d/@S91vncserverпревратилось в @S93vncserver. Теперь служба запустится после Самбы, что и подтверждает перезагрузка.

Linux — Настройка VNC Server

Рассмотрим основные моменты на примере Red Hat Linux. Для доступа к машине по VNC следует отредактировать /etc/sysconfig/vncservers, добавив в него строку вида:

VNCSERVERS="1:root 2:user"

Можно также установить дополнительные опции (например, разрешение) строкой VNCSERVERARGS=...

Затем нужно залогиниться пользователем, который будет работать с VNC, и задать пароль командой vncpasswd.

Запуск VNC-сервера:

service vncserver start

Автоматический запуск при загрузке:

chkconfig vncserver on

Сессия по умолчанию будет выглядеть весьма аскетично (используется twm window manager). Чтобы сессия выглядела как обычный десктоп, следует отредактировать /home/user/.vnc/xstartup, раскомментировав две строчки сразу после «Uncomment the following two lines for normal desktop»:

unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

После этого возможен доступ по VNC на порт 590x, где x — цифра, соответствующая пользователю из строки VNCSERVERS. Если включен межсетевой экран, нужно открыть нужный порт. Например, для iptables:

iptables -A INPUT -i eth0 -p tcp --dport 5900:5904 -j ACCEPT

Что касается клиентской части, можно воспользоваться бесплатным VNC Viewer Free Edition.

См. также: http://www.redhat.com/magazine/006apr05/features/vnc/.

Как правильно поменять IP-адрес почтового сервера

В первые дни нового года одна известная организация, обменивающаяся почтой с финансовыми учреждениями, показала увлекательный спектакль. Завязка была такой: по какой-то причине им нужно было поменять IP-адрес почтового сервера или сам сервер. Ну, мало ли что, бывает.

Что они сделали? Они изменили MX-запись, прописав туда новый адрес, и немедленно стали отправлять с него почту. Как на это реагировали почтовые серверы контрагентов?  Очень просто, в большинстве случаев (кроме тех, когда людей устраивает спам) посылали его куда-то подальше.

В какой-то момент известная организация, судя по всему, подумала: «Ой, а что это мы делаем? DNS-ы же еще не разошлись, почта не уходит». И что они сделали дальше? Совершенно верно, попробовали отправлять со старого адреса. И тут, конечно, стало еще забавнее, потому что DNS-ы как раз разошлись и теперь уже почта не принималась со старого адреса.

Какую отсюда можно извлечь мораль? Все очевидно: решив поменять адрес почтового обменника, добавьте еще одну MX-запись (приоритет выбирайте сами) и подождите два-три дня, чтобы она разошлась по интернету. Лишняя запись, вообще говоря, никому еще не мешала. А после этого делайте все, что хотите: убивайте старую, оставляйте ее, используйте обе — работать будет.

Автоматизация Telnet/SSH

Одна из часто встречающихся задач администрирования — автоматизация терминальной рутины; иными словами, действий, выполняемых через Telnet или SSH.

Tmagic

На сайте IBM есть такая вещь, как Terminal Automation Tool (Tmagic). Вот пример скрипта, который она может выполнить:

* Variables declared below.
V host=host1
V port=23
V user=user1
V password=user1
V prompt="$ "* Variable with special meaning
V ThinkTime=2
V TimeOut=2
V NumThreads=2
V LogSeed="TMagic"
V LogPath="/tmp"

* Connect and logon
C "${host} ${port}"R "login"
S "${user}\r"
R "Password"
S "${password}\r"
R "${prompt}"
L "Logged in.\n"

* A simple "date" command
FOR 5 TIMES DO
S "date\r"
R "${prompt}"
D 1
DONE
L "All Done\n"

Q

Как видим, здесь происходит подключение к хосту и выполнение на нем неких команд. Результаты работы записываются в лог. Если этого достаточно, можно идти и скачивать. Небольшая инструкция входит в комплект.

Expect

Expect, расширение языка Tcl — куда более мощный инструмент.

Я скачивал в исходниках expect-5.43.0-5.1.src.rpm и компилировал. Потребуется установить собственно expect, tcl и tcl.src. Поскольку все это может оказаться в довольно неожиданных каталогах, могут потребоваться дополнительные параметры для configure. Здесь tclconfig — это местонахождение tclConfig.sh, tclinclude — понятно, исходников tcl.

./configure --with-tclconfig=/usr/lib --with-tclinclude=/usr/src/redhat/SOURCES/tcl8.4.13

Потом как обычно, make и make install.

Вот скрипт, близкий к тому, что я реально использую для автоматизации одной из задач:

#!/usr/local/bin/expect -f
# --------------------------------------
# Usage: expect-script [host] [username]
# --------------------------------------
# Variables
set host [lrange $argv 0 0]
set user [lrange $argv 1 1]
set timeout -1# Connect to remote host
spawn ssh $user@$host
match_max 100000

# Wait for password prompt
expect "*?assword:*"

# Grab the password without showing it
stty -echo
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set password $expect_out(1,string)

# ...and then send it
send -- "$password\r"
send_user "\n"

# Wait for command prompt
expect -re "(%|#|\\$) $"

# Send actual commands
send "command1\r"
send "command2\r"
send "A"
send "B"
send "C"

# Leave control to the user
interact

Здесь тоже все вполне понятно: из командной строки берутся два аргумента — имя хоста и имя пользователя, затем мы подключаемся к хосту по SSH, запрашиваем пароль у пользователя (на экране он не будет отображаться), посылаем пароль, ждем появления командной строки и посылаем некоторые команды и нажатия клавиш. В конце мы отдаем управление терминалом пользователю.

Разумеется, фазу ввода пароля можно исключить:

set password MyPaSsWoRd
expect "*?assword:*"
send -- "$password\r"
send_user "\n"
expect -re "(%|#|\\$) $"

Тогда пароль будет фигурировать в скрипте в открытом виде. Можно пойти правильным путем, отказаться от паролей в пользу ключей и применить ssh-agent/ssh-add, и это отдельная тема.

Приведенный скрипт я использую совместно с другим, который сначала запускает GNOME Terminal с нужной кодировкой:

export LANG=ru_RU.IBM866; gnome-terminal --disable-factory --execute /scripts/expect-script hostname username

Более подробно о настройке GNOME Terminal речь шла в предыдущей заметке: GNOME Terminal: кодировка по умолчанию.

Способ скрытия пароля при вводе взят отсюда: http://stackoverflow.com/questions/681928/how-can-i-make-an-expect-script-prompt-for-a-password

GNOME Terminal: кодировка по умолчанию

В GNOME Terminal нет штатных средств, чтобы установить какую-либо кодировку по умолчанию. Можно только поменять текущую кодировку через меню (Терминал → Установить кодировку символов).

Заметим, что при запуске терминала устанавливается кодировка текущей локали. Таким образом, задачу можно решить, поменяв локаль перед запуском терминала.

Допустим, нас интересует кодировка CP866 (IBM866). Нужно, чтобы существовала соответствующая локаль. Система в данном случае — RHEL 5.5. Посмотрим, какие у нас есть локали:

locale -a

Если локали с кодировкой IBM866 нет, создадим ее.

localedef --no-archive -c -i ru_RU -f IBM866 ru_RU.IBM866

Теперь можно запускать терминал, примерно так:

export LANG=ru_RU.IBM866; gnome-terminal --disable-factory

Кстати, можно сразу задать скрипт, который следует выполнить при запуске:

export LANG=ru_RU.IBM866; gnome-terminal --disable-factory --execute /scripts/script.sh

Впрочем, вопросы автоматизации терминала — это уже тема следующей заметки. Здесь же отмечу еще, что на случай, если потребуется использовать особый шрифт или еще какие-нибудь настройки, отличающиеся от стандартных, в GNOME Terminal есть возможность создать несколько профилей (Правка → Профили) и выбирать из них нужный при запуске из скрипта, например:

export LANG=ru_RU.IBM866; gnome-terminal --disable-factory --window-with-profile=MyCustomProfile

Cisco: блокировка порта по STP, 0 packets input

Обнаружился специфический случай, при котором может блокироваться порт. Вот debug с Cisco 2811:

Sep 16 12:34:32.535: %SPANTREE-7-RECV_1Q_NON_TRUNK: Received 802.1Q BPDU on non trunk FastEthernet0/3/3 VLAN4.
Sep 16 12:34:32.535: %SPANTREE-7-BLOCK_PORT_TYPE: Blocking FastEthernet0/3/3 on VLAN4. Inconsistent port type.PVST+: restarted the forward delay timer for FastEthernet0/3/3

Порт не транковый, приходит что-то транковое. Порт блокируется, при этом (после clear counters) наблюдается некоторый исходящий трафик на интерфейсе и ноль входящего (0 packets input).

Решилось отключением STP в данном VLAN:

#no spanning-tree vlan 4

Первое, что нужно сделать при подозрении на заблокированные порты — это посмотреть, есть ли они. Ситуация может выглядеть, например, так:

#show spanning-tree blockedports

Name                 Blocked Interfaces List
-------------------- ------------------------------------
VLAN10               Fa1

Number of blocked ports (segments) in the system : 1

Конечно, нужно еще подумать, стоит ли отключать STP, все-таки протокол придуман не просто так. Но если на другом конце стоит что-то сомнительное, способное прислать такой интересный пакет, как в начале, то смысл в этом есть — с внезапно заблокированным портом жить как-то хуже.

Ссылка на цискино евангелие.

Адаптек и вообще

Не сказать, что Адаптек когда-либо в жизни приносил радость (скорее наоборот), но у них на сайте при скачивании драйверов вылезает лицензия и три кнопки: «Я согласен», «Я не согласен» и «Я не понимаю». Разве они не милашки?

На будущее, по итогам рабочей субботы: ставишь Linux* — достань все ненужные диски из сервера. Так будет проще (и больше свободного времени на жизнь). Когда будет нужно, вставишь обратно.

*) если подумать, остального тоже касается.

VMware ESXi: пропадание трафика через сетевой адаптер

Интересное приключение на ESXi 4. Виртуальная машинка имеет три сетевых адаптера: LAN и два канала в интернет; подключена к двум провайдерам по такой схеме:

В роли гостевой системы — RHEL 5. Все работает нормально до некоего момента X, когда перестает ходить трафик через vmnic3. Внешне все и выглядит нормально, интерфейс поднят, но пакеты не идут. Перезапуск интерфейса, перезагрузки (в том числе хоста) проблему не решают.

В свойствах виртуальной машины был удален и снова создан адаптер: при этом он заработал, но — потрясающе — перестал идти трафик через второй интерфейс. Излечилось снятием галочки «Connected» и ее установкой заново в свойствах адаптера. Что это было?..

Samba: lanman auth

Забавная вещь: вечером заходишь удаленно на свой рабочий компьютер, чтобы кое-что проверить, и видишь, что человек пишет тебе в ICQ. Отключаешься там, включаешься здесь и отвечаешь.

После обновления Samba на RHEL 4 до последнего стабильного релиза (точнее, после удаления старой 3.0.x и установки новой 3.5.4) вылезла фишка, заставившая оперативно погуглить:  аутентифицировались все, кроме Windows 98 — остался еще один такой пациент.

Читать далее