1 апр. 2014 г.

my bashrc

PS1='\[\e[0;32m\]\u\[\e[m\]@$(hostname) \[\e[1;34m\]\W\[\e[m\] \[\e[1;32m\]\$\[\e[m\] '
alias rootdb='mysql -u"root" -p"root"'
export EDITOR=vim

18 мар. 2014 г.

Get free space in gigabytes at specified location

df -k /opt/ | awk 'END{print $4/1024/1024}'

20 сент. 2013 г.

Useful linux commands

Small collection of useful commands: Listen ports currently listening
netstat -lptun

20 июн. 2013 г.

Настройка кластерной фаловой системы OCFS2 поверх DRBD

В предыдущей статье было показано как настроить DRBD.
Здесь будет показано как создать и настроить файловую систему OCFS2.
Мы будем использовать устройство /dev/drbd1. Действия выполняются на обеих нодах.
Создаем наш конфиг для ocfs:

~: vim /etc/ocfs2/cluster.conf

node:
       name = oxygen
       cluster = ocfs2
       number = 0  
       ip_address = 10.3.1.4
       ip_port = 7777

node:
       name = oxygen2
       cluster = ocfs2
       number = 1
       ip_address = 10.3.1.5
       ip_port = 7777

cluster:
       name = ocfs2
       node_count = 2

Вызываем конфигуратор для ocfs :
~: dpkg-reconfigure ocfs2-tools

После этого подключаются модули ядра и запускается демон. После чего на первом ноде создаем фаловую систему:
~: mkfs.ocfs2 -N 2 /dev/drbd1
Для проверки статуса ocfs2:
~: /etc/init.d/o2cb status

Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Stack glue driver: Loaded
Stack plugin "o2cb": Loaded
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold = 31
  Network idle timeout: 30000
  Network keepalive delay: 2000
  Network reconnect delay: 2000
Checking O2CB heartbeat: Not active
Последняя строка Not active. Это потому что мы не монтировали раздел.

18 июн. 2013 г.

Создание DRDB устройства

Система будет развернута на debian wheezy, на данный момент стабильный.
Версии пакетов: ocfs2-tools:1.6.4, drbd8-utils:8.3.13
Устанавливаем пакеты:
apt-get install ocfs2-tools drbd8-utils


Создание DRBD устройства

В обоих нодах требуется чтобы была одинаковая разметка диска. Для создания сетевого хранилища был выбран раздел с размером 200 гб. Можно разбить диск на 2 части - один для метаданных и  другой блочное устройство. Но мы обойдемся без этого (будем хранить метаданные и данные на одном диске).


oxygen1# gdisk -l /dev/md0
GPT fdisk (gdisk) version 0.8.5

Disk /dev/md0: 1464784000 sectors, 698.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 3BE3DE93-D88B-4BFA-A324-36D66AB2ED8E
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 1464783966
Partitions will be aligned on 2048-sector boundaries
Total free space is 1045353533 sectors (498.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       419432447   200.0 GiB   8300  Linux filesystem


В файле /etc/drbd.conf удалите первую строчку. Далее Создаем конфиг для drbd:

#vim /etc/drbd.d/r0.res
global {
        usage-count yes;
}   

common {

        syncer {
                rate 40m;
                al-extents 320;
        }
}

resource r0{

protocol c;

        startup{
                wfc-timeout             20;
                degr-wfc-timeout        10;
                become-primary-on       both;
        }
        disk {
                on-io-error     detach;
        }
        net{
                cram-hmac-alg   sha1;
                shared-secret   "secret";
                allow-two-primaries;
                after-sb-0pri   discard-zero-changes;
                after-sb-1pri   violently-as0p;
                after-sb-2pri   violently-as0p;
                max-buffers     2048;
        }
        on oxygen {
                device          /dev/drbd1;
                disk            /dev/md0p1;
                address         10.3.1.4:7789;
                meta-disk       internal;
        }
        on oxygen2 {
                device          /dev/drbd1;
                disk            /dev/sdb1;
                address         10.3.1.5:7789;
                meta-disk       internal;
        }
}


Желательно почистить заголовки дисков:
dd if=/dev/zero of=/dev/md0p1 bs=1M count=20
Прописываем хосты:
vim /etc/hosts
10.3.1.4 oxygen
10.3.1.5 oxygen2
Проверяем включен ли модуль ядра drbd. если нет то подключаем.
lsmod | grep drbd
modprobe drbd
Первая инициализация:
drbd create-md r0 # r0 название нашего ресурса
drbd up r0
Смортим статус нашего диска:
watch cat /proc/drbd
Должен показать что то типа:
0: cs:WFConnection ro:Secondary/Unknown
Это значит что второй диск еще не подключен. Идем на вторую ноду и повторяем все действия. Настройки drbd должны быть одинаковыми, так что лучше закинуть r0.res через scp. Только на основном ноде выолняем:
drbdadm -- --overwrite-data-of-peer primary netdisk
После выполнения этой команды начинается полная синхронизация дисков. теперь на обоих нодах выполняем:
drbdadm primary r0
watch "cat /proc/drbd"
1: cs:SyncSource ro:Primary/Primary ds:UpToDate/Inconsistent C r-----
ns:71352888 nr:0 dw:0 dr:76727332 al:0 bm:4676 lo:0 pe:281 ua:122 ap:0 ep:1 wo:f oos:133021916
[======>.............] synced: 35.0% (129904/199564)Mfinish: 0:59:06 speed: 37,484 (38,064) K/sec
При возникновении проблем с синхронизацией: на основной ноде:
drbdadm connect r0 
на второй ноде:
drbdadm -- --discard-my-data connect all 

30 апр. 2012 г.

Автоматическая конвертация видео для стримминга

Задача: Автоматически конвертировать видео для стримминга через nginx
Допустим у нас на сервере есть папка куда будет поступать видео файлы, обычные которые вы скачиваете через торрент. Нам необходимо автоматически конвертировать эти файлы для пригодного формата.

Теперь приступим. На сервере должна быть установлена ffmpeg с H264 енкодером. В этом вам поможет гугл.

Есть замечательный инструмент ffprobe, который может извлекать всю необходимую информацию из медиа файла, и выводить в красивом(json, xml) формате. Нам надо пройтись по папке и найти все видео файлы, и записать в json файл.

#!/bin/bash
INPUT_DIR="/home/user1/to_convert/"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
rm videofiles.json
count=$(find $INPUT_DIR -name "*.avi" | wc -l)
echo "[" >> 'videofiles.json'
for i in $(find $INPUT_DIR -name "*.avi")
do
    ffprobe -v quiet -print_format json -show_format $i >> 'videofiles.json'
    if [ $count -ne 1 ];then
        echo "," >> 'videofiles.json'
        count=$(( $count - 1 ))
        echo $count
    fi
done;
echo "]" >> 'videofiles.json'
IFS=$SAVEIFS

Следующий шаг, сделать готовый bash скрипт из json файла. 2-й этап возьмет на себя питон скрипт. Почему питон? Потому что есть готовый парсер для json, да и времени сэкономит.

Вот скрипт:
#!/usr/bin/python

import json
import os
import sys
import codecs

def ffmpegReady(filename, destFile1, destFile2, bit_rate):
 bitrate=int(bit_rate)
 bitrate1=0
 bitrate2=0
 if 1500 < bitrate:
  bitrate1=str(int(bitrate*0.8))
  bitrate2=str(int(bitrate*0.25))
 elif bitrate <1500:
  bitrate1=str(int(bitrate*0.9))
  bitrate2=str(int(bitrate*0.33))

 ffmpeg_command = "ffmpeg -i \""+filename +"\" -vcodec libx264 -acodec libfaac -b:v "+bitrate1+"k -threads 0 -r 24 -g 24 \""+destFile1+".mp4"+"\"\n"
 ffmpeg_command = ffmpeg_command + "qtfaststart \""+destFile1+".mp4\" \""+destFile1[:-4]+".mp4\"\n"
 ffmpeg_command = ffmpeg_command + "rm -f \""+ destFile1+".mp4\"\n"
 ffmpeg_command = ffmpeg_command + "ffmpeg -i \""+filename +"\" -s 480x360 -vcodec libx264 -acodec libfaac -b:v "+bitrate2+"k -threads 0 -r 24 -g 24 \""+destFile2+".mp4"+"\"\n"
 ffmpeg_command = ffmpeg_command + "qtfaststart \""+destFile2+".mp4\" \""+destFile2[:-4]+".mp4\"\n"
 ffmpeg_command = ffmpeg_command + "rm -f \"" + destFile2 + ".mp4\"\n"
 ffmpeg_command = ffmpeg_command + "rm -f \""+ filename+"\"\n"

 return ffmpeg_command

здесь я показал часть которая генерирует команду. Как видите у меня 2 выходных файла. Один с нормальным, другой с низким качеством. Также используется утилита qtfaststart для перемещения мета информации в начало файла. Это поможет нам уменьшить время запуска проигрывания.

В конце у нас получится готовый bash скрипт для запуска.

Теперь соединим все в один файл:
#!/bin/bash

DATE=`/bin/date`
qt=$(ps aux | grep 'qtfaststart' | grep -v grep | wc -l | tr -s "\n")
ff_p=$(ps aux | grep 'ffmpeg' | grep -v grep | wc -l | tr -s "\n")

if [ -e convert_process ]
then 
 echo "$DATE    process not finished" >> log.txt
else
 if [[ $qt > 0 || $ff_p > 0 ]]
 then
  echo "ffmpeg or qtfaststart already running, try later" >> log.txt
 else
  touch convert_process
  echo "$DATE    Scanning ..." >> log.txt
  ./convert.sh 
  echo "$DATE    Parsing ..."  >> log.txt
  ./parsejson.py
  echo "$DATE    Starting ..."  >> log.txt
  screen -d -m ./runnable.sh
  echo "$DATE    Finished." >> log.txt
  rm -f convert_process
 fi

fi
Все. Скрипт можно поставить в крон задачи. Статья не претендует на how to. Это просто один из тысячи методов. Также приветсвуется подсказки и пожелания.

P.S. код на гитхабе https://github.com/samlabs821/Server-side/

17 янв. 2012 г.

Файл hosts для работы с гугл сервисами




193.200.150.82 anonymouse.org

72.14.204.132 lh6.googleusercontent.com
72.14.204.132 lh5.googleusercontent.com
72.14.204.132 lh4.googleusercontent.com
72.14.204.132 lh3.googleusercontent.com
72.14.204.132 lh2.googleusercontent.com
72.14.204.132 lh1.googleusercontent.com
72.14.204.132 oauth.googleusercontent.com
72.14.204.132 webcache.googleusercontent.com
72.14.204.132 www-tt-opensocial.googleusercontent.com
72.14.204.132 googleusercontent.com
72.14.204.132 images0-focus-opensocial.googleusercontent.com
72.14.204.132 images1-focus-opensocial.googleusercontent.com
72.14.204.132 images2-focus-opensocial.googleusercontent.com
72.14.204.132 www-gm-opensocial.googleusercontent.com
72.14.204.132 s2.googleusercontent.com
72.14.204.132 s1.googleusercontent.com
72.14.204.132 s0.googleusercontent.com
72.14.204.132 0-focus-opensocial.googleusercontent.com
72.14.204.132 1-focus-opensocial.googleusercontent.com
72.14.204.132 2-focus-opensocial.googleusercontent.com
72.14.204.132 clients1.googleusercontent.com
72.14.204.132 clients2.googleusercontent.com
72.14.204.132 s2.googleusercontent.com
72.14.204.132 s1.googleusercontent.com
72.14.204.132 s0.googleusercontent.com
72.14.204.132 0-focus-opensocial.googleusercontent.com
72.14.204.132 1-focus-opensocial.googleusercontent.com
72.14.204.132 2-focus-opensocial.googleusercontent.com
72.14.204.132 www-gm-opensocial.googleusercontent.com
72.14.204.132 mail-attachment.googleusercontent.com
72.14.204.121 my.syyn.cc
66.102.13.132 img0.gmodules.com
74.125.53.191 blogspot.com
74.125.53.191 blogger.com
74.125.53.191 www.blogger.com
74.125.53.191 blogblog.com
74.125.53.191 www.blogblog.com
74.125.53.191 img1.blogblog.com
72.14.204.132 doc-0kbku-0loeu-s-googleusercontent.commondatastorage.googleapis.com