пятница, 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 соответственно

четверг, 21 ноября 2013 г.

Роутер tp-link mr3420 с резервированием канала по 3g

Для организации канала связи на удаленной точке берем роутер tp-link mr3420. Это роутер хорош тем, что позволяет зарезервировать канал выхода в интернет по 3g модему, подключаемому в USB порт роутера. И даже заводская прошивка позволяет такое делать. Но! - почему-то на заводской прошивке решили что падение канала по WAN порту означает или отключение кабеля от порта или обесточивание устройства, подключенному к порту.
Хвала opensource - существуют альтернативные прошивки для данного роутера. Идем на сайт www.openwrt.org , ищем наше устройство, качаем прошивку, внимательно читаем инструкцию, прошиваем устройство. Далее берем 3g модем (в моем случае это AnyData 500/510 от МТС) и подключаем к роутеру. В принципе он уже готов к работе. Можно зайти по ssh на роутер(читайте инструкцию по прошивке роутера - там все расписано) и в консоли скомандовать :
ifup 3g
и посмотреть состояние маршрутов:
route -n
если соединение по модему установилось, мы увидим, что шлюз по-умолчанию поменялся на точку доступа провайдера 3g связи.
Отлично, теперь чтобы вернуться на основной канал (WAN-интерфейс) необходимо выключить мобильный интерфейс :
ifdown 3g
и вернуть маршрут по-умочанию через WAN интерфейс:
route add -net 0.0.0.0 gw 192.168.0.1 (здесь предполагается, что "основной" провайдер, заходит в порт WAN нашего роутера и предоставляет шлюз с адресом 192.168.0.1)

Для автоматизации всей этой рутины напишем скриптик :
vi /etc/config/test

#!/bin/sh                                                                      
/bin/ping -w 2 -c 3  -q -I eth0 8.8.8.8 |/bin/grep "100% packet loss"          
if [ $? -ne "0" ]; then                                                        
                echo "WLAN is worked."                                         
                /sbin/route -n | grep "3g-3g"                                  
                if [ $? -ne "0" ] ; then                                       
                  echo "Interface 3g is down"                                  
                else                                                           
                  #shutdown 3g modem and return default routing                
                  /sbin/ifdown 3g                                              
                  /sbin/route add -net 0.0.0.0 gw 192.168.0.1                  
                fi                                                             
                                                                               
        else                                                                   
                echo "WLAN is aborted!"                                        
                /sbin/route -n | grep "3g-3g"                                  
                if [ $? -ne "0" ] ; then                                       
                 echo "Interface 3g is down"                                   
                 /sbin/ifup 3g                                                 
                else                                                           
                 echo "Interface 3g is up"                                     
                fi                                                             
                                                                               
fi 

сделаем его исполняемым, и посадим в crontab:
crontab -e
*/1 * * * *   /etc/config/test > /dev/null
Еще добавим в файлик /etc/rc.local строку маршрута по умолчанию для гугловского сервера( с его помощью мы будем проверять его доступность интернета через  WAN интерфейс):

route add -host 8.8.8.8 gw 192.168.0.1

Чтобы можно было управлять роутером из-вне , но при этом не светить открытые порты наружу можно ограничить подключение к роутеру только с конкретного IP , запретив всем остальным. Для этого в файлике /etc/config/firewall необходимо установить в секциях zone интерфейсов wan и 3g :
option input 'DROP'

создать секции rule:

 config rule
        option name 'Allow-my-pc'
        option src 'wan'
        option src_ip 'xxx.yyy.zzz.vvv'
        option target ACCEPT


config rule
        option name 'Allow-my-pc-3g'
        option src '3g'
        option src_ip 'xxx.yyy.zzz.vvv'
        option target ACCEPT



и перезапустить firewall.


!Внимание! Если у вас уже всё работает, и вы вносите правку в правила firewall, настоятельно рекомендуется сохранить работающую конфигурацию, например командой
iptables-save > /etc/iptables-rule

Перед применением измененных правил  firewall можно провести пробное тестирование новых правил, с возможностью отката к сохраненной конфигурации:
/etc/init.d/firewall stop; /etc/init.d/firewall start; sleep 300; iptables-restore < /etc/iptables-rule

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


воскресенье, 10 ноября 2013 г.

Speedtest из командной строки

Иногда есть необходимость измерить скорость доступа к сети из командной строки.Например: стоит где-то на удаленной точке серверок, и к нему, конечно, удобно коннектиться по ssh. Можно где-то поднять сервер iperf,  а на тестируемом объекте запустить этого же клиента. Но есть путь попроще. Доустановим следующие 2 пакета в Убунту:
sudo apt-get install python-pip
sudo pip install speedtest-cli
теперь можем из консоли померить пузо:
speedtest

понедельник, 12 августа 2013 г.

Добавляем Oracle Java нашему компьютеру

Чтобы установить jre от Oracle на Ubuntu скачиваем архив и распаковываем его:
 tar -zxvf jre-7u25-linux-i586.tar.gz
создадим целевой каталог каталог :
sudo mkdir -p /usr/lib/jvm/jre1.7.0
и перенесем распакованные файлы в целевой каталог:
sudo mv jre1.7.0_25/* /usr/lib/jvm/jre1.7.0/
Теперь сообщим системе где установлена наша java:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jre1.7.0/bin/java 3
и можем проверить как отзывается система:
java -version
должны в ответ получить:
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode)
Теперь подключим плагин jvm браузеру Firefox:
mkdir ~/.mozilla/plugins
ln -s /usr/lib/jvm/jre1.7.0/lib/i386/libnpjp2.so ~/.mozilla/plugins/
перезапустим браузер и проверим работу плагина зайдя на страничку

Также есть отличнейшее руководство по установке jre и jdk от oracle  на компьютер с Ubuntu здесь

вторник, 28 мая 2013 г.

Правим grub.cfg

В линейке Ubuntu начиная ,кажется, с версии 11.04 убрали текстовый режим работы grub по умолчанию   и при попытке получить список пунктов меню загрузки могут появляться различные ошибки (типа no videomode activated).
Чтобы это дело поправить нужно подредактировать файл /etc/default/grub (привести его к такому виду):

#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10


GRUB_TERMINAL=console
GRUB_GFXMODE=640x480

и обновить конфигурацию grub:

update-grub