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
Doctor Who
Big things have small beginnings
1 апр. 2014 г.
my bashrc
18 мар. 2014 г.
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:
После этого подключаются модули ядра и запускается демон. После чего на первом ноде создаем фаловую систему:
Здесь будет показано как создать и настроить файловую систему 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
Версии пакетов: 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 файл.
Вот скрипт:
В конце у нас получится готовый bash скрипт для запуска.
Теперь соединим все в один файл:
P.S. код на гитхабе https://github.com/samlabs821/Server-side/
Допустим у нас на сервере есть папка куда будет поступать видео файлы, обычные которые вы скачиваете через торрент. Нам необходимо автоматически конвертировать эти файлы для пригодного формата.
Теперь приступим. На сервере должна быть установлена 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. Это просто один из тысячи методов. Также приветсвуется подсказки и пожелания.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
Подписаться на:
Сообщения (Atom)