воскресенье, 29 мая 2016 г.

Установка Windows XP в Xen

Возникла задача поставить Windows для запуска программы, которая не работает в Wine. Решил попробовать установить Windows под управлением Xen. Ранее я уже писал небольшую заметку о настройке Xen: Памятка по настройке Xen. В той статье для управления Xen использовалась утилита xm, поскольку писалась она применительно к Debian Wheezy. В этот раз будет использоваться утилита xl, поскольку дело происходит в Debian Jessie. Однако, несмотря на это различие, всё написанное в прошлой статье будет работать и сейчас. Надо всего лишь вместо xm использовать xl.

1. Установка операционной системы на виртуальную машину

Создадим LVM-раздел, куда будем устанавливать Windows:
# lvcreate -L10G -n winxp-disk
Создадим файл конфигурации /etc/xen/winxp.cfg, который первоначально будет использоваться для установки системы:
builder = 'hvm'
device_model_version = 'qemu-xen'
memory = 1024
vcpus = 1
pae = 0
acpi = 0
apic = 0
name = 'winxp'
disk = ['phy:/dev/vg0/winxp-disk,ioemu:hda,w',
        'phy:/home/stupin/WindowsXP_SP2.iso,ioemu:hdb:cdrom,r']
boot = 'd'

on_poweroff = 'destroy'
on_reboot = 'destroy'
on_crash = 'destroy'
on_xend_start = 'ignore'
on_xend_stop = 'ignore'

fullscreen = 1
sdl = 0
vnc = 1
vncconsole = 1
vncpasswd = ''
keymap = 'ru'
stdvga = 0
serial = 'pty'

usb = 1
usbdevice = 'tablet'
Особо стоит отметить следующие моменты в этом файле:
  • Опции acpi (интерфейс управления электропитанием) и apic (улучшенный контроллер прерываний) на время установки отключены,
  • В опции disk первым прописан LVM-раздел, в который будем устанавливать систему, а вторым прописан ISO-образ установочного диска с Windows,
  • Опция boot выставлена в значение d - загрузка "с диска D:", то есть - с компакт-диска, в роли которого выступает ISO-образ установочного диска,
  • Опция keymap позволяет в дальнейшем не следить за раскладкой на системе, где запущен VNC-клиент. Без этой опции в сеансе VNC русские буквы удастся ввести только в случае, если на системе с VNC-клиентом включена английская раскладка,
  • Включена поддержка usb, а в списке USB-устройств в опции usbdevice настроен "планшет". Эта настройка позволяет в дальнейшем без проблем манипулировать курсором мыши. Без неё при подключении через VNC будет два курсора мыши, слабо связанных между собой, так что управляться ими будет непросто.
Теперь запустим виртуальную машину:
# xl create /etc/xen/winxp.cfg
На всякий случай, если вдруг виртуальная машина зависнет, приведу команду для её принудительного выключения:
# xl destroy winxp
Напоминаю, что список запущенных виртуальных машин можно посмотреть такой командой:
# xl list
После запуска можно подключиться к виртуальной машине при помощи VNC-клиента на TCP-порт 5900 по IP-адресу 5900. Я воспользовался Remmina, о которой писал в одноимённой заметке - Remmina:

Если Вы хотите подключиться по сети не из домена dom0 или у Вас имеется несколько подобных доменов domU, к которым Вы хотите подключаться по протоколу VNC, можно настроить прослушиваемый адрес и порт при помощи опции vnclisten. Например, значение 192.168.0.1:2 будет соответствовать ожиданию подключений на TCP-порт 5902 и адрес 192.168.0.1.

Настроить переключение раскладки по нажатию Alt+Shift мне не удалось - это сочетание в сеанс VNC не попадало, поэтому пришлось настроить непривычное для меня сочетание Ctrl+Shift.

2. Изменение настроек после установки

После установки Windows нужно выключить виртуальную машину, воспользовавшись пунктом меню "Выключить компьютер", доступным по нажатию кнопки "Пуск":

Теперь нужно немного изменить конфигурацию в файле /etc/xen/winxp.cfg. Включим опции acpi и apic, уберём из списка дисков ISO-образ установочного компакт-диска и поменяем значение опции boot на c - загрузка "с диска C:":
acpi = 1
apic = 1
disk = ['phy:/dev/vg0/winxp-disk,ioemu:hda,w']
boot = 'c'
3. Проброс USB-устройств вовнутрь виртуальной машины

Ещё одна вещь, которая мне понадобилась - это пробросить флешку вовнутрь виртуальной машины. Для начала я вставил её в компьютер и нашёл её в списке имеющихся в системе USB-устройств при помощи команды:
$ lsusb -v | less
В несколько сокращённом виде, нужная мне флешка выглядела следующим образом:
Bus 001 Device 005: ID 0930:6534 Toshiba Corp. TravelDrive
Device Descriptor:
  ...
  idVendor           0x0930 Toshiba Corp.
  idProduct          0x6534 TravelDrive
  bcdDevice            1.00
  iManufacturer           1 Kingston
  iProduct                2 DataTraveler 2.0
  iSerial                 3 0201101728450
  bNumConfigurations      1
  Configuration Descriptor:
    ...
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass         8 Mass Storage
Чтобы флешка автоматически пробрасывалась в виртуальную машину, нужно отредактировать список USB-устройств в файле конфигурации /etc/xen/winxp.cfg:
usbdevice = ['tablet', 'host:0930:6534']
Если в системе имеется несколько устройств с одинаковыми идентификаторами производителя и модели, то можно указать номер шины и устройства. В нашем случае это будет выглядеть вот так:
usbdevice = ['tablet', 'host:1.5']
Однако стоит учесть, что при отключении и повторном включении устройство может получить другой номер. Использовать идентификаторы производителя и модели.

В случае с утилитой xm можно было бы вставлять и удалять устройства налету, вот так:
# xm usb-add winxp host:0930:6534
# xm usb-del winxp host:0930:6534
Однако, в утилите xl подобная функциональность пока не реализована и для введения настроек в силу понадобится завершить работу виртуальной машины и запустить её снова, с использованием исправленной конфигурации.

4. Использованные материалы

воскресенье, 22 мая 2016 г.

Мониторинг Asterisk по протоколу SNMP

Меня заинтересовало наличие в Asterisk модуля res_snmp. Я решил попробовать настроить его и узнать, за какими параметрами Asterisk можно наблюдать с его помощью.

1. Установка и настройка SNMP-агента

Устанавливаем SNMP-агента:
# apt-get install snmpd
Нужно заглянуть в файл /etc/default/snmpd и убедиться, что запуск SNMP-агента разрешён:
SNMPDRUN=yes
Редактируем файл конфигурации SNMP-агента /etc/snmp/snmpd.conf, приведя к следующему виду:
agentAddress udp:127.0.0.1:161
  
view asterisk included .1.3.6.1.2.1.1.1
view asterisk included .1.3.6.1.2.1.1.2
view asterisk included .1.3.6.1.2.1.1.4
view asterisk included .1.3.6.1.2.1.1.5
view asterisk included .1.3.6.1.2.1.1.6
view asterisk included .1.3.6.1.4.1.22736

rocommunity public 127.0.0.1 -V asterisk
rwcommunity private 127.0.0.1 -V asterisk

createUser zabbix SHA auth_password AES encryption_password
rouser zabbix priv -V asterisk

sysLocation Ufa
sysContact Vladimir Stupin <vladimir@stupin.su>
sysObjectID .1.3.6.1.4.1.22736.1

master agentx
agentXSocket /var/agentx/master
agentXPerms 0660 0775 nobody asterisk
Указанный выше файл конфигурации является лишь примером. Реально вы можете захотеть поменять часть настроек. Например:
  • agentAddress - прослушиваемый SNMP-агентом IP-адрес,
  • view asterisk included - в этом представлении я ограничил доступ к OID'ам. Доступ разрешён только к OID'ам, содержащим информацию об узле и к дереву OID'ов с состоянием Asterisk,
  • rocommunity - строка сообщества для чтения данных для SNMP версий 1 и 2c,
  • rwcommunity - строка сообщества для записи данных для SNMP версий 1 и 2c,
  • createUser - строка описывает одного пользователя SNMP версии 3 - его имя, пароли и алгоритмы аутентификации и шифрования,
  • rouser - описывает права доступа пользователя SNMP версии 3,
  • sysLocation - строка местонахождения оборудования. Бывает полезно в больших компаниях, когда имеется много оборудования и сотрудников, или оборудование расположено в необычном месте: за фальшь-потолком или на радиомачте,
  • sysContact - строка с контактными данными администратора оборудования. Бывает полезно в больших компаниях, чтобы найти сотрудника, ответственного за оборудование,
  • sysObjectID - идентификатор типа оборудования. Полезно, например, для автоматического обнаружения оборудования и автоматической постановки на контроль с шаблоном, соответствующим этому OID'у,
  • master, agentXSocket, agentXPerms задают настройки Unix-сокета SNMP-агента, к которому будут подключаться субагенты.
Для генерации строк сообщества и паролей я рекомендую воспользоваться, например, программой pwgen, которую можно установить из одноимённого пакета:
# apt-get install pwgen
Сгенерировать 16-символьный пароль можно следующим образом:
$ pwgen 16
Чтобы Asterisk, запущенный от пользователя asterisk, имел доступ к каталогу с Unix-сокету SNMP-агента, меняем права доступа к каталогу /var/agentx:
# chmod o+rx /var/agentx
Перезапускаем SNMP-агента:
# systemctl restart snmpd.service
2. Включение SNMP-модуля в Asterisk

Открываем файл /etc/asterisk/res_snmp.conf и приводим его к следующему виду:
[general]
subagent = yes
enabled = yes
После чего просим Asterisk выгрузить модуль SNMP и загрузить его снова:
# asterisk -rx 'module unload res_snmp.so'
# asterisk -rx 'module load res_snmp.so'
3. Использование MIB-файлов

Посмотреть OID'ы в виде дерева:
$ snmptranslate -M /var/lib/mibs/:/var/lib/mibs/ietf/:/var/lib/mibs/iana/ -m DIGIUM-MIB:ASTERISK-MIB -Tp -Td -Ln 1.3.6.1.4.1.22736 | less
Посмотреть значения OID'ов с их символьными именами по SNMP второй версии можно следующим образом:
$ snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.22736.1 | less
Для SNMP третьей версии то же самое делается так:
$ snmpwalk -v 3 -u zabbix -n '' -l authPriv -a SHA -x AES -A auth_password -X encryption_password 127.0.0.1 .1.3.6.1.2.4.1.22736.1 | less
4. Шаблоны для Zabbix

В качестве основы для шаблона я воспользовался официальными MIB-файлами:
Я подготовил два шаблона для контроля интересующих меня параметров с помощью Zabbix:
Поменять строки сообщества и пароли можно при помощи массового редактирования элементов данных. Из шаблона для второй версии SNMP можно массовым редактированием легко получить и шаблон, использующий первую версию SNMP. Собственно, массовым редактированием можно получить и шаблон, использующий третью версию SNMP.

На снимке экрана ниже показаны имеющиеся в шаблоне элементы данных:

На этом снимке показаны результаты опроса Asterisk по этому шаблону:

К сожалению, SNMP-модуль Asterisk не позволяет узнать состояние регистраций абонентов. Если бы состояние регистраций можно было бы контролировать, я обязательно добавил бы в шаблон низкоуровневое обнаружение регистраций и контроль их состояний. Это позволило бы своевременно обнаруживать проблемы со шлюзами абонентов.

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

воскресенье, 15 мая 2016 г.

Краткий обзор программного телефона SFLphone

Итак, как я и обещал, в этой заметке я сделаю краткий обзор программного телефона SFLphone, который привлёк моё внимание в качестве программы, пригодной для секретарей, диспетчеров и операторов, т.к. умеет работать с несколькими звонками одновременно и соединять абонентов между собой.

Программа имеет несколько разных интерфейсов и разбита на несколько пакетов:
$ apt-cache search sflphone
sflphone-daemon - SIP and IAX2 compatible VoIP phone - core daemon
sflphone-data - SIP and IAX2 compatible VoIP phone - common data
sflphone-evolution - SIP and IAX2 compatible VoIP phone - Evolution plugin
sflphone-gnome - SIP and IAX2 compatible VoIP phone - GNOME client
sflphone-kde - SIP and IAX2 compatible VoIP phone - KDE client
Как видно, имеются варианты интерфейсов для рабочих сред KDE и GNOME, а также плагин для почтового клиента Evolution. Ещё два пакета содержат демон и данные для программы. Демон на самом деле и является программным телефоном: внутри него происходит работа с устройствами компьютера и сетью. Интерфейс программы взаимодействует с демоном через DBUS и занимается лишь передачей команд в демон и отображением его состояния. В этой заметке я рассмотрю только интерфейс для среди GNOME. Установим в систему соответствующий пакет:
# apt-get install sflphone-gnome

Общий вид программы:

Под меню видно имеется окно со списком текущих разговоров, ниже - регуляторы громкости для микрофона и наушников, ещё ниже - номеронабиратель. Справочник контактов спрятан в отдельное окно, что мне показалось несколько неудобным.

Чтобы попасть в настройки программы, нужно выбрать пункт меню "Правка", а в раскрывшемся списке выбрать пункт "Настройки":


Из всех имеющихся настроек особенный интерес представляют настройки звука:

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

Второй интересный пункт, это выбор видеоустройств:

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

Чтобы настроить учётные записи, нужно в основном окне программы выбрать пункт "Правка", а в раскрывшемся списке выбрать пункт "Аккаунты":


После этого откроется список учётных записей:

Здесь имеется отдельная учётная запись под названием "IP2IP". В ней хранятся настройки, которые будут использоваться для прямых вызовов, без использования какой-либо учётной записи. Можно добавлять, удалять и редактировать учётные записи, а также временно отключать их, снимая галочку.

Во вкладке редактирования основных настроек учётной записи можно указать имя пользователя, пароль, адрес сервера или SIP-прокси и псевдоним, который будет отображаться в списке учётных записей и на программных телефонах других абонентов:


Во вкладке аудионастроек можно выбрать используемые кодеки, их приоритеты, звук входящего звонка и режим передачи тоновых сигналов:


Во вкладке видеонастроек аналогично, можно выбрать используемые кодеки и их приоритеты, а также включить или выключить использование видео:

Ещё раз скажу, что совершить видеозвонок при использовании этой программы мне не удалось.

Во вкладке дополнительных настроек можно указать номер используемого UDP-порта, внешний IP-адрес и указать STUN-сервер:

В отличие от Ekiga, тут все настройки легко доступны и их можно настраивать для каждой учётной записи отдельно.

В последней вкладке можно указать настройки шифрования для сеансов SIP и для трафика RTP:

Я ни то ни другое настраивать пока не пробовал.

Теперь перейдём к самому интересному - к соединению абонентов друг с другом.

Вот так входящий звонок отображается в правом верхнем углу экрана:

Принят звонок можно щелчком по этому всплывающему окну.

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

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

Ставим входящий звонок на паузу:

Опять же - поставить на паузу можно сочетанием горячих клавиш, либо через меню "Вызов".

Стоящий в очереди звонок отображается следующим образом:

При этом телефонная станция воспроизводит ожидающему абоненту музыку.

Пока звонок стоит в очереди, совершаем исходящий звонок:


Этот же исходящий звонок будет отображаться всплывающей надписью в правом верхнем углу экрана:


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

Соединение абонентов друг с другом:

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

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

Управляет конференцией абонент, использующий sflphone. Он может поставить конференцию на паузу, в таком случае все абоненты будут находиться в режиме ожидания и слушать музыку. Когда от конференции отключается абонент sflphone, конференция уничтожается, а все другие абоненты отключаются от неё.

В процессе использования перенаправлений звонков обнаружил, что телефонные шлюзы Cisco ATA 186 не поддерживают функцию REINVITE, которая позволяет абоненту с другой стороны попросить согласовать параметры звука с другим абонентом. Именно эта опция используется для перенаправления звонков. На случай подобных телефонных шлюзов в Asterisk имеется опция canreinvite. Чтобы указать, что телефонный шлюз не умеет переключаться на другого абонента, нужно указать в настройках SIP-пользователя опцию canreinvite=no. В этом случае Asterisk будет выступать посредником при трансляции звука. При установлении первого сеанса звук от обоих абонентов будет проходить через Asterisk. Когда нужно будет выполнить переключение, Aterisk самостоятельно выполнит REINVITE с одним из абонентов, продолжая трансляцию звука через себя для другого абонента, который не поддерживает REINVITE.