среда, 30 июля 2014 г.

Проброс портов из хоста в гостевую систему (KVM)

Например в гостевой системе открыт ssh порт 22. Чтобы к нему пробиться из внешней сети изменяем конфигурацию виртуальной машины:

virsh edit vm_name
вначале меняем первую строку:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
Затем находим строку , описывающую сетевую карту 
<interface type='network'>

и меняем на следующее: 
<interface type='user'>
И добавляем аргументы перед закрывающим тегом </domain>:
<qemu:commandline>
  <qemu:arg value='-redir'/>
  <qemu:arg value='tcp:2122::22'/>
</qemu:commandline>
 
Теперь обращаясь по адресу  хоста и указывая порт 2122, пакеты будут перенаправляться 
на порт 22 гостевой машины.
 
И на хосте, конечно, необходимо прописать что делать с поступающими пакетами:
 iptables -I FORWARD 1 -i eth0 -o virbr0 -d ip_vm -p tcp -m tcp --dport 2122 -j ACCEPT
 iptables -t nat -A POSTROUTING --dst ip_vm -p tcp --dport 2122 -j SNAT --to-source internal_ip_host
 

пятница, 9 мая 2014 г.

KVM сохраняем состояние гостевых машин при выключении хоста

Имеется сервер Ubuntu 12.04 с настроенной kvm. В виртуальной среде  работают несколько машин. Необходимо сохранять состояние виртуальных машин при выключении сервера. Когда-то давно я делал такую задачу и все отличненько работало, но, к сожадению , не записал - приходится вновь изобретать велосипед. Сразу скажу - в прошлый раз схема была намного изящней, но не могу вспомнить как было настроено. Если кто подскажет более правильное решение - буду благодарен.
Итак есть тфкой файлик на сервере /etc/init/libvirt-bin.conf 
В нём необходимо найти такие строки :

 for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
            log_msg "libvirt-bin: attempting clean shutdown of $domain at $(date)"
            run_virsh -c "$uri" shutdown "$domain" >/dev/null
        done


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

for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
            log_msg "libvirt-bin: attempting clean shutdown of $domain at $(date)"
            run_virsh -c "$uri" save "$domain" "/kvm-state/$domain.save">/dev/null
        done

Таким образом в каталоге /kvm-state/ сохранятся файлы имя_виртуалки.save

Восстановить состояние машин можно командой

virsh restore /kvm-state/domain_name.save

 При этом не забыть предварительно убрать автостартующие виртуалки из каталога /etc/libvirt/qemu/autostart



среда, 7 мая 2014 г.

Извлечение аудиодорожки в формате mp3 из avi

Для выполнения сабжа устанавливаем необходимые программы:

sudo apt-get install ffmpeg libavcodec-extra-53 libav-tools 

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

#!/bin/sh
 

for x in *.avi; do
    avconv -i "$fn"  "`basename "$fn" .avi`.mp3"
    rm $fn
done



среда, 16 апреля 2014 г.

Зеркалирование каталогов между серверами


Есть каталог /home/user1/filedata на server1 и каталог /home/user2/filedata на server2. В любой из этих каталов извне сохраняются данные. Задача стоит засинхронизировать содержимое этих каталогов.
В ядре linux есть механизм inotify - который позволяет отслеживать изменения в файловой системе. Для использования этого механизма установим пакет inotify-tools

Теперь для обработки событий , связанных с изменением в наших каталогах воспользуемся следующей конструкцией:
inotifywait -r -e create,attrib,delete,modify,move /home/user1/filedata/

где  -r  просматривать каталог рекурсивно
       -e  create,attrib,delete,modify,move  слушать следующие события

для передачи изменений воспользуемся программой rsync. Так как сервера находятся в интернете, то данные между ними передавать будем по протоколу ssh.
А так как желательно запуск синхронизации  оформить в виде демона сгенерируем ключи доступа от пользователей root на серверах:

server1@root#mkdir .ssh
генерируем ключ без пароля
server1@root#ssh-keygen -t rsa
и отправим открытый  ключ пользователю другого сервера
server1@root#ssh-copy-id -i .ssh/id_rsa.pub user2@server2

и на втором сервере:
server2@root#mkdir .ssh

server2@root#ssh-keygen -t rsa

server2@root#ssh-copy-id -i .ssh/id_rsa.pub user1@server1

можем проверить как , как работет rsync через ssh:
server1@root#rsync -e 'ssh -p 22' -avzp --delete /home/user1/filedata/ user2@server2:/home/user2/filedata/

и в обратную сторону:
server2@root#rsync -e 'ssh -p 22' -avzp --delete /home/user2/filedata/ user1@server1:/home/user1/filedata/

Теперь оформим эту всю красоту в виде демонов

создадим в /etc/init.d/ файлик sshync следующего содержания:

#!/bin/sh
while inotifywait -r -e  create,attrib,delete,modify,move /home/user1/filedata/;do
 rsync -e 'ssh -p 22' -avzp --delete /home/user1/filedata/ user2@server2:/home/user2/filedata/
done

А в /etc/init создадим файл sshync.conf :

description "syncronisation filedata"
start on runlevel [2345]
stop on runlevel ![2345]
respawn
exec /etc/init.d/sshync

Теперь можем создать символические ссылки в скриптах запуска:
update-rc.d sshync start 70   2 3 4 5 . stop 20 0 1 6 .

Можем стартовать сервисы. Протокол работы сервиса в /var/log/upstart/sshync.log

Чтобы все работало корректно, внешние изменения в каталоги filedata должны осуществляться с правами user1 и user2 соответственно