понедельник, 30 ноября 2009 г.

Python, замечательный Python


print 0 == None
False


И за такое его стоит любить :)

CRON: запуск задачи при перезагрузке

Да, я тоже не знал, но такая фича имеется, man 5 crontab:
@reboot Run once, at startup.

Установка mod_rpaf в Debian

apt-get install libapache2-mod-rpaf -y --force-yes


Узнаем IP своего сервера:
ifconfig -a


Открываем конфиг-файл редактором:
vi /etc/apache2/mods-enabled/rpaf.conf


Корректируем строку: RPAFproxy_ips 127.0.0.1, заменяя 127.0.0.1 на IP сервера.

Перезапускаем Апача:
/etc/init.d/apache2 restart

воскресенье, 29 ноября 2009 г.

Оптимизация использования памяти на VPS

По мотивам статьи: http://habrahabr.ru/blogs/hosting/53236/, вообще к таким оптимизациям я отношусь весьма скептически, но по логике вещей в случае многопоточного приложения такой вариант может сэкономить энное количество памяти, но опять же - не факт, необходимы тесты (дада, мой вывод top за тест не катит ни минутой). Но все же, вариант имеет право на жизнь :)

vi /etc/security/limits.conf


Вписываем туда:
* - stack 1024


Сохраняем показания по занятой памяти "до":

top - 18:32:46 up 3 min, 1 user, load average: 0.03, 0.10, 0.05
Tasks: 25 total, 1 running, 24 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.9%us, 0.3%sy, 0.0%ni, 97.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 102400k total, 49368k used, 53032k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached



Перезагружаем VPS.

Фиксируем значения "после":


top - 18:35:28 up 0 min, 1 user, load average: 0.73, 0.19, 0.06
Tasks: 25 total, 1 running, 24 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.8%us, 3.3%sy, 0.0%ni, 94.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 102400k total, 51120k used, 51280k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached


Ну вот особых изменений не видим, если кто проведет тесты (wordpress+ab или еще что в том же духе), то милости прошу в комменты :)

Про возможности :)

Когда ты молодой:
1. Тело красивое
2. Здоровье богатырское
3. Желаний море
4. Возможностей мало

Когда ты вырос:
1. Тело постаревшее
2. Здоровье подорванное
3. Желаний все меньше
4. Возможности есть, но зачем они тебе уже?


Отсюда мораль - вкалывайте, чтобы первый блок совместить со вторым по пункту возможностей :)

потырено с: http://sergeydolya.livejournal.com/86241.html

init скрипт для Sphinx в Debian

Можно взять от здесь: http://www.klaus.gr/pub/sphinx

А вот и копипаста на случай падения источника:

#! /bin/sh
# /etc/init.d/sphinx: start the sphinx search daemon.

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

pidfile=/var/sphinx/run/searchd.pid
binpath=/var/sphinx/bin/searchd

SPHINX="--config /var/sphinx/etc/sphinx.conf"

NAME=searchd
DESC="sphinx search daemon"

test -f $binpath || exit 0

test ! -r /etc/default/sphinx || . /etc/default/sphinx

running()
{
# No pidfile, probably no daemon present
#
if [ ! -f $pidfile ]
then
return 1
fi

pid=`cat $pidfile`

# No pid, probably no daemon present
#
if [ -z "$pid" ]
then
return 1
fi

if [ ! -d /proc/$pid ]
then
return 1
fi

cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1`

# No syslogd?
#
if [ "$cmd" != "$binpath" ]
then
return 1
fi

return 0
}

case "$1" in
start)
echo -n "Starting sphinx search daemon: searchd"
start-stop-daemon --start --quiet --chuid 999 --group 999 --exec $binpath -- $SPHINX
echo "."
;;
stop)
echo -n "Stopping sphinx search daemon: searchd"
start-stop-daemon --stop --chuid 999 --group 999 --retry TERM/1/TERM/1/TERM/4/KILL --quiet --exec $binpath --pidfile $pidfile
echo "."
;;
restart|force-reload)
echo -n "Restarting sphinx search daemon: searchd"
start-stop-daemon --stop --chuid 999 --group 999 --retry TERM/1/TERM/1/TERM/4/KILL --quiet --exec $binpath --pidfile $pidfile
start-stop-daemon --start --chuid 999 --group 999 --quiet --exec $binpath -- $SPHINX
echo "."
;;
*)
echo "Usage: /etc/init.d/shpinx {start|stop|restart|force-reload}"
exit 1
esac

exit 0

Полнотекстовый поисковик по MySQL

Прошу любить и жаловать, Sphinx: http://www.ibm.com/developerworks/ru/library/os-php-sphinxsearch/

Скоростные поезда в СССР?

Оказывается были! Прошу, ЭР200: http://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BF%D0%BE%D0%B5%D0%B7%D0%B4_%D0%AD%D0%A0200

Linux Kernel Tracepoints

Наткнулся в одном из блогов про информацию про очень интересный механизм ядра Linux: http://git.kernel.org/?p=linux/kernel/git/compudj/linux-2.6-lttng.git;a=blob;f=Documentation/trace/tracepoints.txt

Один из вариантов использования - суперлегкие бэкапы файловой системы (делается полный бэкап, а потом дописываются измененные файлы, об измении в которых сообщает само ядро), вот как раз пример их реализации http://stacktrace.it/2009/09/linux-kernel-hacking-real-time-backup-con-i-kernel-tracepoints/

Linux: поиск портов, слушаемых какими-либо демонами

Это делается командой:
netstat -ln


А отобразить слушающие только по TCP порты можно командой:
netstat -ln -t


-l говорит о том, что нам нужны лишь listening, -t выводит только tcp порты, а -n требует показывать айпи адреса вместо хостнеймов.

Активация аккаунтинга процессов на CentOS

У ядра linux есть замечательный механизм process accounting (man 5 acct), который в случае активации соответствующей опции ядра позволяет анализировать, сколько памяти и времени cpu использовали конкретные процессы и конкретные пользователи. Это очень полезная фича, в условиях шаред-хостинга.

Ставим зависимости:
sudo yum -y install psacct
sudo /etc/init.d/psacct start
sudo /sbin/chkconfig psacct on


Команды для анализа:

sudo /usr/sbin/sa -u
sudo /usr/sbin/sa


Одной негативной фичей данного механизма является то, что данные о занимаемой памяти и потребленном процессорном времени сбрасываются при убийстве процесса (ну или его корректном завершении, не суть), о чем говорится в мане:
Each time a process terminates a record for this process is appended to the accounting file.


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

Отключение рекурсии (recursion) в DNS Named (Bind)

На CentOS:
vi /etc/named.conf


На Debian:
vi /etc/bind/named.conf.options


И в самый верх (CentOS ) или в блок options (Debian) вносим следующее:
options {
allow-recursion { localnets; localhost; };
};


После чего перезапускаем named (CentOS):

/etc/init.d/named restart


или (Debian):

/etc/init.d/bind9 restart

Debian 5 Lenny Warning: SuexecUserGroup directive requires SUEXEC wrapper.

Фиксица легко:
apt-get install -y apache2-suexec

grub-probe: error: Cannot find a GRUB drive for /dev/sda1

Вот часто в Xen DomU возникает такой трабл при апдейте GRUB или ядра:


Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-2.6.26-2-xen-686
Errors were encountered while processing:
linux-image-2.6.26-2-xen-686
linux-image-2.6-xen-686
E: Sub-process /usr/bin/dpkg returned an error code (1)


Или вот такой:


apt-get dist-upgrade
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 0B of additional disk space will be used.
Do you want to continue [Y/n]? y
Setting up linux-image-2.6.26-2-xen-686 (2.6.26-19lenny2) ...
update-initramfs: Generating /boot/initrd.img-2.6.26-2-xen-686
Searching for GRUB installation directory ... found: /boot/grub
warning: grub-probe can't find drive for /dev/sda1.
grub-probe: error: Cannot find a GRUB drive for /dev/sda1. Check your device.map.

dpkg: error processing linux-image-2.6.26-2-xen-686 (--configure):
subprocess post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of linux-image-2.6-xen-686:
linux-image-2.6-xen-686 depends on linux-image-2.6.26-2-xen-686; however:
Package linux-image-2.6.26-2-xen-686 is not configured yet.
dpkg: error processing linux-image-2.6-xen-686 (--configure):
dependency problems - leaving unconfigured
Errors were encountered while processing:
linux-image-2.6.26-2-xen-686
linux-image-2.6-xen-686
E: Sub-process /usr/bin/dpkg returned an error code (1)




ИМХО, самый правильный способ фикса проблемы в этом случае (если не используется PyGrub конечно, а ядра для DomU указаны явно):
apt-get remove grub

суббота, 28 ноября 2009 г.

Кто такие "Паксы"?


Паксы (от аббревиатуры в перевозочной документации на английском – PAX) – пассажиры самолёта.


по материалам: http://slovonovo.ru/term/%D0%9F%D0%B0%D0%BA%D1%81%D1%8B

Подмена целей

Это ведь очень по-русски: сначала создать себе трудности, потом героически их преодолевать.

— А на самом деле, это следствие подмены целей. И борьбой здесь даже не пахнет. Помнишь, Николай Бударин садился в БС (баллистический спуск). Собирают совещание. Вопрос: почему экипаж долго искали? Докладывают: можем сделать требуемую систему, но для этого необходимо пять лет и столько-то денег. Тут космонавт Павел Виноградов берет слово: «Зачем так сложно. Зайдите в ближайший магазин и купите спутниковый телефон».


источник: http://www.avia.ru/inter/15302/

Нанокалибри

Не, вы ошиблись, я сейчас не буду рассказывать про отмывание денег на слове "нано" нашими сородичами, а покажу очень крутое видео от DARPA, организации некогда заказавшей прототип Интернета.

Замена Yandex на Google Firefox 3.5

Открываем страницу: about:config
Ищем ключ keyword.URL
Заменяем его содержимое на "http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q="

По материалам: http://stproject.info/blog/?paged=4

пятница, 27 ноября 2009 г.

linux software raid: kicking non-fresh sdxN from array

Такое бывает после некорректного завершения работы и лечится удалением и повторным добавлением диска в массив.

Да воздастся вам по поступкам вашим

Амен

Проблемы с PyDev

При вводе следующего кода:

import random


или подобного (например, import md5) PyDev выделяет его красным с ошибкой "unresolved import". И при этом отказывается делать для этого модуля автокомплит.

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

"import md5" is giving you an unresolved import error right? Do you have an
md5.py file in your pythonpath? (or only .pyc/.pyo?)
--
Just the .pyc/.pyo as far as I can tell. This is the default MacOS Python
install
(2.5.1).


И у меня тоже самое:

macbook-pavel-odincov:~ nrg$ ls /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ | grep md5
md5.pyc
md5.pyo
macbook-pavel-odincov:~ nrg$ ls /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ | grep random
random.pyc
random.pyo


А вот и там же подсказывают решение:

Just to follow up: that did the trick. For any other Mac developers that have
the same problem, installing Xcode is a quick fix; it's got the .py sources
included.



Итого после установки XCode по мануалу: http://phpsuxx.blogspot.com/2009/10/xcode-mac-os-x.html


ls /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ | grep random
random.py
random.pyc
random.pyo


И все заработало :)

источник решения: http://www.mail-archive.com/pydev-users@lists.sourceforge.net/msg02820.html

Варианты подлючения PHP к веб-серверу

http://www.1gb.ru/wiki/index.php?title=%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9_Web-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80_%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%3F

четверг, 26 ноября 2009 г.

Airbus A380

Смотрим и тащимся: http://sergeydolya.livejournal.com/84655.html

Установка Aptana на Mac Os

Т.к. у Eclipse+PyDev баги с аутокомплитом и проверкой синтаксиса Python кода я решил попробовать Aptana, т.к. в ней все интегрировано и есть надежда, чем интегрировано "прямо".

Идем на страницу: http://www.aptana.org/studio/download и выбираем " Step 1Select your download preferences " Standalone / Mac / Full Installer и скачиваем.

Теперь на главной странице приветствия щелкаем по "Plugins" - "Platform" - "Aptana PyDev" - "Get It"

Установка svn плагина на Eclipse

Help / Install new software / work with: "all available sites" / Collaboration / "Subversive SVN team Provider" / "Ok" / "Finish"

Eclipse / Настройки / Team / SVN / Svn Kit 1.3.0 (появится во всплывающем окне) / Finish

Переход к началу или конфу строки в vim

Обнаружил совершенно случайно, опытным путем: shift+6 (^) и shift+4 ($). Не правда ли, логично?

Список всех книг издательства Red Hat Press

Ссылка

Ограничение системных вызовов посредством strace

Прошу! http://av5.com/journals-magazines-online/1/4/48

Регистрация .РФ, как и ожидалось, хорошее наеб%%%во


Вчера, 25-го ноября 2009-го года был первый день регистрации доменов в зоне .рф. По его итогам домены получили популярные в Рунете проекты и киберсквоттеры, заранее подготовившиеся к запуску национального домена.

Так, компания Cetis, по мнению ряда участников домейнерского рынка, аффилированная с регистратором Reg.ru, подготовив заранее ряд товарных марок вроде "Банк", зарегистрированных по классу "Зонты", получила ряд доменов, имеющих высокую коммерческую привлекательность. Среди них уже упоминавшийся "банк.рф", "недвижимость.рф", "секс.рф" и другие.


(c) http://roem.ru/2009/11/26/kts_podaril_domeni_kiberskvotteram/

Мда, хорошо, что я теперь не работаю в REG.RU, пренеприятно, если указанное окажется правдой.

Отключение Spelling в Eclipse

Довольно противно, когда редактор расцвечивает все текстовые строки в коде красным, поэтому Спелл Чек мы отрубим :)

Делается это так: Eclipse - Настройки - General - Editors - Text Editors - Spelling и убираем галочку "Enable spell check" - Apply - ok.

Установка PyDev на Mac OS X Leopard 32 bit

Ставим Eclipse

Идем на страницу: http://www.eclipse.org/downloads/, выбираем "Eclipse Classic 3.5.1" и скачиваем версию "Mac Cocoa 32bit", распаковываем и копируем в "программы".

Ставим PyDev плагин

Запускаем Eclipse, открываем меню "Eclipse-настройки", далее Install / Update - Available Software Sites - Add. Далее вписываем следующее - name: PyDev Location: http://pydev.org/updates и "ok" / "ok".

Открываем "Help - install new software" - work with вбиваем "PyDev - http://pydev.org/updates" и в появившемся списке выбираем "PyDev" (там рядом будет еще и Mylyn Integration, оно нам не нужно) и щелкаем "Next" / "Next" / "Finish" / "Accept" и ждем установки плагина. В процессе будет выдано "Security warning", это не страшно, соглашаемся на установку не подписанных пакетов и после окончания процесса соглашаемся на рестарт Eclipse.

Создаем свой первый проект в PyDev

File / New / Project / PyDev / PyDev Project / Next / "MyFirstProject" и при этом видим красную надпись "Project interpreter not specified" и щелкаем по подсказке "Project interpreter not specified".

Далее выбираем "New", Interpreter Name: Python25, Interpreter Executable: /usr/bin/python, далее "ok", "ok", "apply", "ok", выбираем Grammar Version 2.5 и щелкаем "finish"".

Добавляем файл в проект

File / New / File / выбираем в верху папку "src", file name: "hello.py" / Finish. Далее открываем файл в редакторе и добавляем следующий контент в него:


#!/usr/bin/python

print "hello world!".upper()



И выбираем "Run" или жмем cmd+shift+f11 и далее запускаем требуемую нам версию Python и теперь видим в нижней части экрана веселую надпись "HELLO WORLD!".

Ну вот и все, рабочая среда готова, теперь креативить :)

Защита кода на Python от прочтения :)

http://www.lysator.liu.se/~astrand/projects/pyobfuscate/

Еще варианты?

А между тем, ISPManager потребляет порядка 35 мегабайт памяти...



cat /proc/18281/status
Name: ispmgr
State: S (sleeping)
SleepAVG: 78%
Tgid: 18281
Pid: 18281
PPid: 1
TracerPid: 0
FNid: 6041
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 33
envID: 6041
VPid: 18281
PNState: 0
StopState: 0
VmPeak: 35368 kB
VmSize: 35364 kB
VmLck: 0 kB
VmHWM: 8936 kB
VmRSS: 8788 kB
VmData: 23984 kB
VmStk: 84 kB
VmExe: 860 kB
VmLib: 9824 kB
VmPTE: 64 kB
StaBrk: 08d85000 kB
Brk: 090a0000 kB
StaStk: bff4e490 kB
Threads: 1
SigQ: 0/38912
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180006000
SigSvd: 0000000000000000
CapInh: 000000007dcceeff
CapPrm: 000000007dcceeff
CapEff: 000000007dcceeff
Cpus_allowed: ffffffff
Mems_allowed: 1
TaskUB: 6041
MMUB: 6041


VmSize как раз и есть ключевое значение, указываемое в top.

Снизить приоритет процессу

Очень легко:
nice -n 19 processname

среда, 25 ноября 2009 г.

Debian 5 Lenny + Task xxx blocked for more than 120 seconds

Вообще, судя по тому, что машины с такой ошибкой отлично работают, стоит визуально проверять дисковую систему (S.M.A.R.T / RAID) и если ничего не найдется, просто игнорировать ошибку.

Очень неприятная проблема (возникает у меня на ядре 2.6.26-2-686-bigmem) и ее единственное решение (судя по форумам и блога) - апдейт на ядро выше 2.6.29 :(

Решение такое: взять да вручную поставить ядро из squeeze на странице http://packages.debian.org/squeeze/linux-image-2.6.30-2-686-bigmem и поставить его:


dpkg -i linux-image-2.6.30-2-686-bigmem_2.6.30-8_i386.deb



Перезагружаемся

shutdown -r now


Тащимся с нового ядра:
uname -r
2.6.30-2-686-bigmem

upstream sent too big header while reading response header from upstream, client

Исправляется добавлением двух последних строк в конфиг Nginx:


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

proxy_buffers 8 16k;
proxy_buffer_size 32k;

А вот подробное описание, что такое proxy_buffer_size и proxy_buffers.

А если по-русски, то proxy_buffer_size предназначен для хранения, прочтенного с бэкэнда хидера:

proxy_buffer_size and fastgci_buffer_size set buffer to read the whole of
response header from backend or fastcgi server.

То есть, если Вы уже выставили 32к, а ошибка все равно появляется, то нужно тюнить дальше.

Если же просто увеличить 32к до 64к, то можно получить вот такую ошибку:
Restarting nginx: [emerg]: "proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer in /etc/nginx/nginx.conf:34017

Итого, если указанных в самом верху настроек мало, корректируем так:
proxy_buffers 8 32k;
proxy_buffer_size 64k;

(с) Игорь Сысоев

Debian: как узнать, какой процесс забивает io?

Легко:
apt-get install -y iotop


И запускаем:
iotop

Установка Zimbra

Ссылко

Системные требовани Zimbra Collaboration Suite 6.0

Дабы никто не наступал на грабли, пытаясь поставить это на VPS: системные требования =)

Защита от брутфорса

Рекомендуют решение на базе fail2ban, думаю, стоит попробовать :)

Установка Lighttpd с поддержкой PHP на Centos 5

Ставим Лайти

Т.к. Лайти нету в стандартном репо, то подключаем мой любимый Epel:
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm


Ставим Лайти и PHP:
yum install -y lighttpd lighttpd-fastcgi php-cli


Добавляем Лайти в автозагрузку:
chkconfig lighttpd on


Запускаем Лайти:
/etc/init.d/lighttpd start


Конфигурируем PHP

Открываем конфиг PHP:
vi /etc/php.ini


И в самый его низ добавляем строки (зачем это нужно, напишу позже):
cgi.fix_pathinfo = 1


Открываем конфиг Лайти:
vi /etc/lighttpd/lighttpd.conf


И раскомментируем строки (убираем везде # в начале):

#fastcgi.server = ( ".php" =>
# ( "localhost" =>
# (
# "socket" => "/var/run/lighttpd/php-fastcgi.socket",
# "bin-path" => "/usr/bin/php-cgi"
# )
# )
# )



А также раскомменчиваем строку:

# "mod_fastcgi",


Рестартим лайти:
/etc/init.d/lighttpd restart


Создаем тестовый файл:
echo "<?PHP phpinfo(); ?>" > /var/www/lighttpd/info.php


Теперь открываем сайт: http://xx.xx.xx.xx/info.php и должны увидеть там большую простыню команд, где среди прочего встречается "Server API CGI/FastCGI "

Основано на мануале: установка и настройка Web-сервера под управлением Lighttpd, с поддержкой PHP5, Mysql на CentOS 5.0

вторник, 24 ноября 2009 г.

Не прошло и ста лет, GSM локаторы запретили



Оператор интернет-платежей «А1 Агрегатор» обращает внимание на запрет работы в системе следующих сервисов:

GSM-Пеленгаторы (поиск абонента по номеру);
GSM-Перехватчики звонков, SMS и другой конфиденциальной информации;
GSM-киллер (информационная атака на абонента).

Использование коротких номеров компании для предоставления подобных услуг строго запрещено. «А1 Агрегатор» начинает широкомасштабный мониторинг партнеров для контроля соблюдения данного правила. Компания А1А оставляет за собой право применять к нарушителям, проигнорировавшим данное сообщение, штрафные санкции вплоть до блокировки аккаунта и удержании 100% дохода.


(c) roem.ru

О форумах =)


Немецкий форум — задал вопрос, на него ответили.
Израильский форум — задал вопрос, тебе задали вопрос.
Русский форум — задал вопрос и тебе долго будут объяснять какой ты мудак.


Потырено с замечательного журнала

Активировать fsck по-умолчанию при запуске на FreeBSD

Чтобы сервер каждый раз при горячем ребуте не стоппился в ожидании одобрения фикса файловой системы, рекомендую в файл
vi /etc/rc.conf
добавить строки (вторая строка запрещает фоновый запуск проверки, который может привести к проблемам):
fsck_y_enable="YES"
background_fsck="NO"


С такими настройками система пережила целых 3 горячих ребута подряд и по-прежнему в строю без вмешательства KVM :)

FreeBSD fsck как ответить на все его запросы yes?

Легко, для этого есть специальный ключ:
fsck -y /dev/ad6s1a

Инициализация системы портов FreeBSD после установки системы

Ставим portsnap (хотя у меня в Minimal Install он стоял искаропки и следующая команда работать повторно отказывалась):
pkg_add -r portsnap # часто он уже стоит, так что проверьте его наличие


Скачиваем и распаковываем дерево портов:
portsnap fetch ; portsnap extract


Для обновления дерева портов используется команда:
portsnap update

Установка FreeBSD 7.2 / 8.0 на fastvps.ru

Стандартно FreeBSD Hetzner.de не ставят, но предоставляют Rescue систему на базе FreeBSD, которая представляет собой в сущности LiveCD, но с доступом по сети. Как раз из него мы и будем ставить операционку.


Подготовка

Итак, переводим сервер в FreeBSD Rescue 32 бита и перезагружаем его. После перезагрузки видим замечательную и такую привычную (года 4 не видел) надпись:

Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.

FreeBSD 7.2-RELEASE (GENERIC) #0: Fri May 1 08:49:13 UTC 2009


Узнаем настройки сети
Теперь нам необходимо узнать все настройки для работы сети, их можно взять прямо здесь:

DNS:

cat /etc/resolv.conf
nameserver 213.133.98.98
nameserver 213.133.99.99
nameserver 213.133.100.100


IP ( ip: 85.10.193.55, mask: 0xffffffe0 ):

ifconfig re0
re0: flags=8843 metric 0 mtu 1500
options=389b
ether 00:16:17:ea:ff:3d
inet 85.10.193.55 netmask 0xffffffe0 broadcast 85.10.193.63
media: Ethernet autoselect (100baseTX )
status: active


GW ( 85.10.193.33 ):

netstat -rn
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif Expire
default 85.10.193.33 UGS 0 5213 re0
85.10.193.32/27 link#1 UC 0 0 re0
85.10.193.33 00:26:88:76:01:87 UHLW 2 0 re0 634
127.0.0.1 127.0.0.1 UH 0 0 lo0
255.255.255.255 0.0.0.0 UHb 0 0 plip0

Internet6:
Destination Gateway Flags Netif Expire
::1 ::1 UHL lo0
fe80::%lo0/64 fe80::1%lo0 U lo0
fe80::1%lo0 link#3 UHL lo0
ff01:3::/32 fe80::1%lo0 UC lo0
ff02::%lo0/32 fe80::1%lo0 UC lo0



Официальная документация Hetzner.de

Официальный мануал, на основе которого мы будем действовать: http://wiki.hetzner.de/index.php/FreeBSD_installieren

Разбивка диска

Посмотрим, какие диски у нас есть в системе:
ls /dev/ad*
/dev/ad4 /dev/ad4s2 /dev/ad6 /dev/ad6s2
/dev/ad4s1 /dev/ad4s3 /dev/ad6s1 /dev/ad6s3


Итого, видим, что у нас два жестких диска: /dev/ad4 и /dev/ad6, ставить FreeBSD будем на первый (/dev/ad4) из них, т.к. я банально пока не умею делать RAID-1 во FreeBSD.

Создаем на диске один слайс (-I) и переустанавливаем загрузочный код (-B) (жалобы на Geom можно игнорировать):

fdisk -BI /dev/ad4
******* Working on device /dev/ad4 *******
fdisk: Geom not found: "ad4"


Если же вместо означенной ошибки выводится:

******* Working on device /dev/ad4 *******
fdisk: Class not found


То можно не волноваться, это варнинг, а не ошибка.

В итоге получаем следующую схему:

ls /dev/ad4*
/dev/ad4 /dev/ad4s1


Более подробно:

fdisk /dev/ad4
******* Working on device /dev/ad4 *******
parameters extracted from in-core disklabel are:
cylinders=581421 heads=16 sectors/track=63 (1008 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=581421 heads=16 sectors/track=63 (1008 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 586072305 (286168 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 812/ head 15/ sector 63
The data for partition 2 is:

The data for partition 3 is:

The data for partition 4 is:




Установка загрузчика и разметка дисков

Ставим загрузчик (-B обозначает, что загрузочный код будет взят с файла /boot/boot и записан на диск, а -w делает стандартный label на слайс, как я понял, это некое подобие таблицы разделов, но в пределе слайс ):
bsdlabel -wB /dev/ad4s1


Разбивка разделов

Запускаем редактор label-а на слайсе:
bsdlabel -e /dev/ad4s1


И видим следующую таблицу разделов:

# /dev/ad4s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 586072289 16 unused 0 0
c: 586072305 0 unused 0 0 # "raw" part, don't edit



Нажимаем i (дада, Вы угадали, это редактор vi и мы должны перейти в режим редактирования)


Приводим к следующему виду:

# /dev/ad4s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: * 16 4.2BSD 0 0
b: 4G * swap 0 0
c: * 0 unused 0 0 # "raw" part, don't edit


Если же у Вас есть требуемая квалификация, то можете разбить диск с отдельными /var, /, /usr и /tmp для этого потребуется примерно следующая схема (но обратите внимание! мой мануал основывается не на ней, а на предыдущей схеме разбивки):


# /dev/ad4s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 2G 16 4.2BSD 0 0 # /
b: 20G * swap 0 0
d: 100G * 4.2BSD 0 0 # /var
e: 8G * 4.2BSD 0 0 # /tmp
f: * * 4.2BSD 0 0 # /usr


А почему после d сразу e - потому что "The partition identifier is a single letter in the range `a' to `h' By convention, partition `c' is reserved to describe the entire disk." (отобразил на английском, а очень хотелось покрыть матом).


Нажимаем ESC и вводим : wq и энтер.


Теперь наша таблица разделов имеет следующий вид:

ls /dev/ad4*
/dev/ad4 /dev/ad4s1 /dev/ad4s1a /dev/ad4s1b /dev/ad4s1c


При этому в /dev/ad4s1a мы будем ставить систему, а /dev/ad4s1b служит SWAP ом.

Форматируем root раздел в файловую систему UFS:

newfs /dev/ad4s1a



Монтируем root

mount /dev/ad4s1a /mnt


Запускаем инсталлятор

sysinstall


Идем в "Custom", "2 Options View/Set various installation options" и значение в поле "Install Root" заменяем на "/mnt" (для того, чтобы появился диалог редактирования необходимо нажать "пробел") и после этого нажимаем Q для выхода в вышестоящее меню.

Кстати, в предыдущем меню есть настройка "Release Name", стандартно там вписано "8.0-RELEASE", значит стандартно будет ставить FreeBSD 8, а не 7.2.

Теперь заходим в "5 Distributions Select distribution(s) to extract" и пробелом выбираем "[X] A Minimal The smallest configuration possible" (либо ставим комплект "User", который более оптимален и не так урезан, я рекомендую именно его) и выходим в главное меню.

При выборе User на предложение "FreeBSD Documentation Installation Menu" отвечаем Cancel а при предложении установить порты ("Would you like to install the FreeBSD ports collection") отвечаем Yes.

Выбираем носитель, с которого будет выполняться установка: "6 Media Choose the installation media type", "6 NFS Install over NFS" и вводим одну из следующих строк в зависимости от необходимой битности дистрибутива (в нашем случае нужна 32 битная версия):

Для FreeBSD 8 пути следующие:
213.133.99.100:/nfs/freebsd/8.0_32
213.133.99.100:/nfs/freebsd/8.0_64


Для 7.2:
213.133.99.100:/nfs/freebsd/64
213.133.99.100:/nfs/freebsd/32


Теперь для начала установки "7 Commit Perform any pending Partition/Label/Extract actions"

Ждем пока ставится BASE System. Когда выдается запрос "│ Visit the general configuration menu for a chance to set any last options?" выбираем No и выходим из меню, далее "X Exit Exit this menu (returning to previous)".

Можно видеть, что инсталлятор поставил нам FreeBSD по пути /mnt:

ls /mnt
.cshrc COPYRIGHT dev libexec proc sbin usr
.profile bin etc media rescue sys var
.snap boot lib mnt root tmp


Последние настройки


Чрутимся в свежеустановленную FreeBSD:
chroot /mnt


Если славливаем ошибку:
chroot /mnt
chroot: /usr/local/bin/bash: No such file or directory


То пробуем монтировать так:

chroot /mnt /bin/sh


Делаем что-то мистическое с ядром (кто расскажет, для чего это, получит плюшку):

cp -Rp /boot/GENERIC/* /boot/kernel/


Открываем конфиг сети:

vi /etc/rc.conf


И вписываем туда следующее:

hostname="rechnername.domain.tld"
sshd_enable="YES"
ifconfig_re0="DHCP"
sendmail_enable="NONE"
fsck_y_enable="YES"
background_fsck="NO"


Заполняем список DNS:
vi /etc/resolv.conf



nameserver 213.133.98.98
nameserver 213.133.99.99
nameserver 213.133.100.100


Заполняем fstab:

vi /etc/fstab



# dev mnt type opt dump pass
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1a / ufs rw 1 1


А для случая с раздельными разделами это будет выглядеть так:

/dev/ad4s1a / ufs rw 1 1
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1d /var ufs rw 1 1
/dev/ad4s1e /tmp ufs rw 1 1
/dev/ad4s1f /usr ufs rw 1 1


Задаем пароль для root:
passwd


Разрешаем руту входить по SSH:

vi /etc/ssh/sshd_config


Там находим строку "#PermitRootLogin no" и заменяем ее на "PermitRootLogin yes"

Теперь выходим из chroot среды посредством нажатия CTRL+D

Отмонтируем раздел:

umount /mnt


Перезагружаемся:
shutdown -r now


Ну и тут все стандартно, ждем пока машинка перезагрузится и готовимся морально к заказу KVM :)

У меня загрузилась раза с 5го только (пришлось переставить на другой диск, т.к. ночь и KVM не подключают, а загрузка стояла со второго диска), но загрузилась :)


uname -a
FreeBSD rechnername.domain.tld 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri May 1 08:49:13 UTC 2009 root@walker.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386



А тем временем, немного негатива -- после пары жестких ребутов в процессе эксперимента Фря ругалась: mount: /dev/ad6s1a : Operation not permitted что на русском означает "запусти-ка товарищ fsck" (о чем рапортовало в dmesg):


fsck /dev/ad6s1a


Заранее прошу прощения за возможные косяки и ошибки (особенно в терминологии и понимании процесса) в мануале, я ни минуты ни бсдшник, а простой линуксойд :)

Если требуется RAID, то переходим к мануалу: http://phpsuxx.blogspot.com/2009/12/raid-1-freebsd-72.html

Низкая самооценка убивает (c) Британские Ученые

Сабж

Очень интересный способ бэкапа небольших сайтов

Бэкап посредством Gmail

Еще немного от Лебедева

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


(с) http://www.artlebedev.ru/studio/

понедельник, 23 ноября 2009 г.

Лебедев про зону .РФ

Мда, все лучшее про зону .РФ сказал Лебедев, так что прошу в его уютную жжежшечку (предупреждаю, много мата, очень много мата, но по делу и отражает всю суть)

Установка ClamAV на Debian / CentOS

Ставим:
apt-get install clamav -y


На CentOS:
yum install -y clamav clamav-update


Обновляем базы:
freshclam


Но на CentOS не все так просто:

freshclam
ERROR: Please edit the example config file /etc/freshclam.conf
ERROR: Can't open/parse the config file /etc/freshclam.conf


Поэтому открываем:
vi /etc/freshclam.conf


И удаляем строки:

# Comment or remove the line below.
Example



Запускаем проверку всей файловой системы:
clamscan --infected -r /

Защита от руткитов Debian Linux

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

Ставится следующим образом:
apt-get install rkhunter -y


На CentOS:
yum -y install rkhunter


А запускается так:

rkhunter --update # обновление базы руткитов
rkhunter --check


Еще одна тулза для борьбы с руткитами зовется chkrootkit

Ставится так:
apt-get install -y chkrootkit


На CentOS:
yum -y install chkrootkit


А запускать так:
chkrootkit


Также есть отличная тулза для комплексного аудита безопасности: tiger

Ставить так:
apt-get install -y tiger


Запускать так:
tiger


Также рекомндую ознакомиться с отличным мануалом по безопасности на сайте Debian: http://www.debian.org/doc/manuals/securing-debian-howto/ch-sec-tools.en.html

суббота, 21 ноября 2009 г.

Linux, RAID-1 восстановление после сбоя, замена жесткого диска

Сейчас хочется рассмотреть случай, когда 1 диск зеркального RAID массива отказывает и отдается на замену. Мы будем экспериментировать с двумя дисками: /dev/sda и /dev/sdb.

Проверим статус RAID массива:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
286728000 blocks [2/2] [UU]

unused devices:


Эмуляция отказа диска

Эмулировать будем отказ диска /dev/sda, это делается следующим образом:


mdadm /dev/md0 --fail /dev/sda1
mdadm /dev/md1 --fail /dev/sda2
mdadm /dev/md2 --fail /dev/sda3


В итоге получаем ситуацию аналогичную выходу из строя диска /dev/sda:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[2](F)
4200896 blocks [2/1] [_U]

md1 : active raid1 sdb2[1] sda2[2](F)
2104448 blocks [2/1] [_U]

md2 : active raid1 sdb3[1] sda3[2](F)
286728000 blocks [2/1] [_U]

unused devices:


После этого попробуем перезагрузиться для чистоты эксперимента (но в случае "вылета" /dev/sda лучше этого не делать, будет не с чего грузиться, если он реально отказал).

Замена диска

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

После перезагрузки RAID принял следующий вид:

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1]
4200896 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
2104448 blocks [2/1] [_U]

md2 : active raid1 sdb3[1]
286728000 blocks [2/1] [_U]

unused devices:



Внимание! Прочиатйте следующий абзац прежде чем выполнять эти команды! Предварительно, необходимо /dev/sda выбросить из RAID а, это делается так:

mdadm /dev/md0 --remove /dev/sda1
mdadm /dev/md1 --remove /dev/sda2
mdadm /dev/md2 --remove /dev/sda3


Если RAID откажется выбрасывать раздел, то стоит заюзать флаг -f:


mdadm /dev/md0 --remove -f /dev/sda1
mdadm /dev/md1 --remove -f /dev/sda2
mdadm /dev/md2 --remove -f /dev/sda3



Но в моем случае, это не потребовалось, т.к. все упоминания о /dev/sda были выброшены автоматически после перезагрузки.

Форматирование диска для эмуляции "замены"

Теперь посредством fdisk отформатируем /dev/sda:
fdisk /dev/sda
и далее последовательно командой d удаляем все разделы

В итоге получаем следующую картину:

fdisk -l /dev/sda

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System


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

Копируем таблицы разделов на новый диск

Теперь копируем таблицу разделов с /dev/sdb на /dev/sda:

sfdisk -d /dev/sdb | sfdisk /dev/sda


В итоге получаем следующее:

fdisk /dev/sda -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 fd Linux raid autodetect
/dev/sda2 524 785 2104515 fd Linux raid autodetect
/dev/sda3 786 36481 286728120 fd Linux raid autodetect


Ставим GRUB на новый диск

grub-install /dev/sda

Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb



Либо если вариант выше не помог пробуем ставить GRUB вручную:


grub /dev/sda
grub>
grub> root (hd0,0) # указать, где находится каталог /boot/grub на вторичном диске
grub> setup (hd0) # установить GRUB-загрузчик в MBR вторичного диска
grub> quit


Сборка RAID
Теперь дело за малым, снова добавить указанные разделы в RAID массив:


mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3


Следим за сборкой RAID массива


cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0] sdb1[1]
4200896 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
2104448 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
286728000 blocks [2/1] [_U]
[>....................] recovery = 0.0% (150592/286728000) finish=95.1min speed=50197K/sec

unused devices:



P.S. вообще, самый правильный путь следующий: сначала необходимо добавить в RAID раздел, на котором располагается /boot, дождаться, пока он соберется, после этого установить grub и уже самым последним шагом - собрать остальные разделы.

Удалить сервис из автозапуска Gentoo Linux

Посомтреть список сервисов в автозагрузке можно так:

rc-config show

Status of init scripts in runlevel "default"
local [stopped]
net.venet0 [stopped]
netmount [stopped]
nginx [stopped]
spawn-fcgi.trac [stopped]
sshd [stopped]
udev-postmount [stopped]
vzquota [stopped]



А удалить так:

rc-config delete mysql

Deleting mysql from following runlevels
default [done]

Centos bash: strings: command not found

yum install binutils -y

Необхоимый набор пакетов для сборки модулей ядра на Centos5

yum install gcc gcc-c++ kernel-devel kernel-headers


Потырено с: hetzner.de wiki

PHP фреймворк Yii

С очень хорошими скоростными качествами: тыц Прошу обратить внимание на скоростные характеристики идиотического монструозного "Симфони".

При входе в PhpMyAdmin появляется белый экран, что делать?

Часто такая ошибка вызвана тем, что включен eaccelerator, необходимо добавить папку phpmyadmin`а в исключение следующим образом:


<Directory /usr/share/phpmyadmin>
php_admin_value eaccelerator.enable 0
</Directory>


Или в частности конкретно по ОС.

CentOS
vi /etc/httpd/conf.d/phpmyadmin.conf


И в самый низ блока Directory добавляем:
php_admin_value eaccelerator.enable 0


И перезапускаем Апача:

/etc/init.d/httpd restart


Debian 5 Lenny
vi /etc/apache2/conf.d/phpmyadmin.conf


И в самый низ блока Directory добавляем:
php_admin_value eaccelerator.enable 0


Перезапускаем Апача:
/etc/init.d/apache2 restart

Новое слово в блог хостингах

Прошу, pubsubhubbub

Те, то не любит читать, прошу смотреть презентацию, где чотко описано, что это и для чего.

пятница, 20 ноября 2009 г.

Как посмотреть список модулей Apache (httpd) ?

Apache modules list



Очень просто:
apachectl -M

Интервью с авторами движка Magento

Сабж

Избранные цитаты:

А когда вы начали его продавать?

Это бесплатный Open source продукт.

ОК, но вы же должны как-то зарабатывать деньги. Продавали техподдержку?

Да, мы сначала мы продавали поддержку. Но это не очень хорошая модель для Open source.

Red Hat вроде бы на ней зарабатывет.

Red Hat еще продает лицензии, то есть там не только поддержка.

люди склонны покупать поддержку только тогда, когда они в ней нуждаются

Проблема с поддержкой в Open source в том, что люди склонны покупать поддержку только тогда, когда они в ней нуждаются. Они пользуются продуктом несколько месяцев, потом у них появляется проблема и они пытаются обращаться за поддержкой. Сложно построить и масштабировать бизнес на таком. Итак, поддержку мы пробовали в первый год. Это не работает на самом деле. Это не работает для многих Open source компаний.



Почему же вы поставили на первое место поддержку?

Потому что это выглядело многообещающим. Мы думали, что для людей, занимающихся электронной коммерцией — это критично-важное приложение. Но продукт оказался слишком хорошим, и люди были очень довольны. Они, конечно же, просили улучшений, но так как им бы пришлось платить за поддержку, они говорили: «ОК, мы можем смириться с этой проблемой, мы подождем пока». Честно говоря, есть много Open source проектов, чьи продукты слишком хороши, чтобы обращаться за поддержкой, продукт работают, люди, используя его, могут вести бизнес и вместо того, чтобы платить за поддержку предпочитают подождать пару месяцев, пока проблема и так будет решена в продукте.

ОК, продажа поддержки не работает. И что дальше?

Мы создали enterprise edition, основанную на Open source, а также community edition, которая включает некоторые новые модули, доступные только для пользователей enterprise edition в комплекте с поддержкой. Эта версия лицензируется на каждый сервер. Так работает MySQL AB, например.

Мы запустили это в мае 2009 и за первые три месяца подписали свыше 60 клиентов.


Мне кажется, что не может быть так много магазинов в интернете.

Это один из самых быстрорастущих рынков в мире. США в этом лидируют, но Западная Европа не сильно отстает, Дальний Восток…


И теперь внимание причина успеха!:

Компанией владеют только американцы или же какая-то доля есть у украинских разработчиков? Иными словами, есть ли какие-то схеми мотивациии, помимо просто зарплаты.

Владеют компанией только американцы. Наша мотивация — зарплата.

Cook Book для разработчиков под Google AppEngine

Дабы не наступать на грабли, рекомендую всем для прочтения: http://appengine-cookbook.appspot.com/

Хотите сделать AppEngine на своих серверах? Легко!

http://code.google.com/p/appscale/

Ждите в скором времени обзора "как это в действии".

Google AppEngine, реалии

Подборка ссылок о реальном опыте использования AppEngine:

http://habrahabr.ru/blogs/webdev/70252/
http://habrahabr.ru/blogs/webdev/70324/
http://habrahabr.ru/blogs/webdev/62927/
http://habrahabr.ru/blogs/gae/70355/
http://habrahabr.ru/blogs/webdev/70299/

OpenVZ на Debian5

мануал

четверг, 19 ноября 2009 г.

Почему на моем сервере вся память занята под cached?

Рассмотри гипотетический случай, когда большое количество памяти используется под кэш:

"Шапка" top:
Mem: 8193844k total, 5646272k used, 2547572k free, 288384k buffers
Swap: 4200888k total, 0k used, 4200888k free, 4446864k cached


Из этого:
288384k buffers - это буферы ядра операционной системы для обеспечения ее работоспособности
4446864k cached - дисковый кэш, иными словами, часть данных с диска при частом доступе к ним копируется в оперативную память для ускорения доступа, это очень эффективный механизм сильно снижающий нагрузку на диск.
Swap: 4200888k total, 0k used -- использование SWAP, оно должно быть нулевое, пока есть хоть какая-либо память

Но особенность памяти занятой под "Cached" в том, что как только Вашим приложениям потребуется память, она сразу будет отрезана от Cached и возвращена приложениям.

Но, к слову сказать, есть способ освободить всю эту память одним махом:
echo 3 > /proc/sys/vm/drop_caches


Очистка только страничного кэша:

echo 1 > /proc/sys/vm/drop_caches


Очистка только inode и dentry кэша:

echo 2 > /proc/sys/vm/drop_caches


Более подробно узнать, на что используется память можно вот этой командой:
cat /proc/meminfo
а вот хорошее описание всех параметров: http://www.itcommunity.ru/blogs/am/archive/2009/01/13/46080.aspx

OpenSource библиотека для манипулирования содержимым конфигурационных файлов

http://augeas.net/tour.html

strace нескольких процессов

Часто работающий процесс представляет собой связку процессов и мониторить их необходимо все, т.к. заранее неизвестно, каким их процессов будет отработан наш запрос. На этот случай strace умеет принимать набор pid ов процессов, на каждый процесс свой аргумент -p

Получаем список всех процессов по имени:
pidof apache2


Собираем список аргументов:
pidof apache2 | sed 's/\([0-9]*\)/\-p \1/g'


Вызываем strace:
strace -s 1024 -f $(pidof apache2 | sed 's/\([0-9]*\)/\-p \1/g')


На CentOS имя процесса другое:
strace -s 1024 -f $(pidof httpd | sed 's/\([0-9]*\)/\-p \1/g')


Для трейса php-cgi процессов команда будет следующая:

strace -s 1024 -f $(pidof php5-cgi | sed 's/\([0-9]*\)/\-p \1/g')
А вот боеле гибкий вариант для выборки процессов по регулярному выражению:
strace -s 1024 -f $(pgrep php5-fastcgi | sed 's/\([0-9]*\)/\-p \1/g')

А для Nginx:

strace -s 1024 -f $(pidof nginx | sed 's/\([0-9]*\)/\-p \1/g')
Для php5-fpm:

 strace -s 1024 -f $(pidof php5-fpm | sed 's/\([0-9]*\)/\-p \1/g')
Для Apache wsgi:
strace -s 1024 -f $(ps aux|grep wsgi|grep -v 'grep'|awk '{print $2}'| sed 's/\([0-9]*\)/\-p \1/g') 

взято с: отличного сайта

Установка всех возможных локалей на Debian5

Стандартный список локалей на Дебияне весьма скуден:


locale -a
C
en_US.utf8
POSIX


Ставим полный пакет локалей:
apt-get install -y locales-all



После этого список локалей увеличивается раз в 50 :)

среда, 18 ноября 2009 г.

Легковесный аналог lsmod

cat /proc/modules

Загрузка Centos / Debian в single mode

Очень много мануалов советуют делать это так: припишите в GRUB в строке kernel .... в самом конце " single", но по каким-то сакральным причинам этот подход не работает. Правильный вариант - это писать:
single init=/bin/bash

Proftpd и показ скрытых файлов

С этой проблемой довольно часто сталкиваются клиенты, решается она несложно:

В файле /etc/proftpd/proftpd.conf вносим следующие коррективы:

ListOptions "-l"


заменяем на:


ListOptions "-la"


И перезапускаем сервис:

/etc/init.d/proftpd restart

вторник, 17 ноября 2009 г.

Мануалы по Red Hat / Centos

http://www.redhat.com/docs/manuals/enterprise/#RHEL5

Перенос Centos Linux 5 с одного диска на Soft Raid

Появилась следующая проблема, есть Centos Linux 5, установленный на один жесткий диск (/dev/sda) без рейда вообще, также в системе присутствует второй не размеченный жесткий диск (/dev/sdb). Из всего этого требуется собрать soft raid 1 (зеркало в народе) не потеряв при этом данные. Данный мануал почти без изменений применим для серверов на fastvps.ru

Вот как раз для этого есть отличный мануал от Red Hat: http://kbase.redhat.com/faq/docs/DOC-7355 и вот еще один мануал с Opennet и вот еще один.

Вот конфигурация винтов:
fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table



Создаем на втором диске (/dev/sdb) структуру разделов аналогичную /dev/sda

fdisk /dev/sdb
n
p
1
[enter]
523 # соответствует значению End напротив /dev/sda1 из таблицы выше
w


fdisk /dev/sdb
n
p
2
[enter]
785 # соответствует значению End напротив /dev/sda2 из таблицы выше




fdisk /dev/sdb
n
p
3
[enter]
[enter]
w


В итоге должна получиться следующая картина:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 83 Linux
/dev/sdb2 524 785 2104515 83 Linux
/dev/sdb3 786 36481 286728120 83 Linux



Как легко заметить, структура размещения разделов на обоих дисках идентична.

Кстати говоря, на Opennet автор рекомендует использовать вот такую простую команду для копирования структуры разделов:
sfdisk -d /dev/sda | sfdisk /dev/sdb
она работает отлично, также рекомендую, как более простой путь :)

Меняем тип для всех вновь созданных разделов с Linux на Linux Raid


fdisk /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.




Итого в результате у нас получается следующее:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 fd Linux raid autodetect
/dev/sdb2 524 785 2104515 fd Linux raid autodetect
/dev/sdb3 786 36481 286728120 fd Linux raid autodetect





Создаем Raid на основе второго диска (/dev/sdb):

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3


Слово missing означает, что создается degraded (разбитый) массив, т.е. массив, в котором один из дисков отсутствует.

Форматируем диски вновь созданного Raid


mkswap /dev/md0
mkfs.ext3 /dev/md1
mkfs.ext3 /dev/md2


Составляем конфиг RAID
Теперь нам необходимо составить конфиг нашего RAID массива (как я понял, он особо никому не нужен, но сделать его стоит хотя бы для удобства):

Генерируется он так:


mkdir -p /etc/mdadm
/sbin/mdadm --examine --scan > /etc/mdadm/mdadm.conf


Перенос данных


Теперь нам нужно перенести данные c /dev/sda2 и /dev/sda3 на соответственно /dev/md1 и /dev/md2

Данные на sda2 и sda3 у нас размещены в следующих точках мониторования:

/dev/sda2 on /boot type ext3 (rw)
/dev/sda3 on / type ext3 (rw)


Итак, копируем /dev/sda2:

mkdir /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


В итоге получаем идентичное содержимое папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md1
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found

root@CentOS-54-32-minimal /etc # ls /boot
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found



Следующая операция крайне длительна и не хотелось бы, чтобы она оборвалась по вине интернет-соединения, поэтому ставим и запускаем screen:
yum install -y screen
screen



Переносим /dev/sda3:

mkdir /mnt/md2
mount /dev/md2 /mnt/md2/
cp -axu / /mnt/md2


Также убеждаемся в идентичности содержимого папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md2/
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var
root@CentOS-54-32-minimal /etc # ls /
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var



Корректирование /etc/fstab

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

vi /mnt/md2/etc/fstab


И строки:
/dev/sda1 none swap sw 0 0
/dev/sda2 /boot ext3 defaults 0 0
/dev/sda3 / ext3 defaults 0 0


Заменяем соотвественно на:

/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext3 defaults 0 0


Регенерируем Initrd ядра, включаем в него модули поддержки RAID

mkinitrd --fstab=/mnt/md2/etc/fstab -v -f /boot/initrd-`uname -r`.img `uname -r`


При этом в выдаче команды должны промелькнуть строки "raid-1". Только вот честно не понимаю, где он узнает, что на машинке теперь используется RAID. Как выяснилось после долгих изысканий, об использовании RAID на root разделе он узнает из fstab.

Теперь повторяем перенос /boot раздела, т.к. у нас новый initrd
Сейчас оптимизирую мануал. чтобы этого избежать.



mkdir -p /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


Отмонитируем раздел

umount /mnt/md2/


Вносим коррективы в системный GRUB

Для этого открываем /etc/grub.conf и там

root=/dev/sda3


заменяем на:

root=/dev/md2


Тоже самое делаем для нового /boot (/dev/md1).


mount /dev/md1 /mnt/md1
vi /mnt/md1/grub/menu.lst
umount /mnt/md1


Перезагружаемся

shutdown -r now



Ставим GRUB на второй диск

grub-install /dev/sdb
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb


Также я бы рекомендовал "освежить" инсталляцию grub на первом диск:
grub-install /dev/sda


Еще раз перезагружаемся

И ставим в BIOS загрузку со второго, нового жесткого диска ( Boot Sequecce ) и еще раз перзагружаемся, при этом уже загрузка пойдет со второго диска и первый не потребуется вообще.

Устанавливаем тип Linux Raid для разделов первого диска


fdisk /dev/sda

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.


Добавляем разделы с первого диска в RAID

mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3


Дожидаемся окончания ребилда RAID

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[2] sdb1[1]
4200896 blocks [2/1] [_U]
[==========>..........] recovery = 52.7% (2215232/4200896) finish=0.5min speed=58454K/sec

md1 : active raid1 sda2[2] sdb2[1]
2104448 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
286728000 blocks [2/1] [_U]
resync=DELAYED

unused devices:


Еще раз перезагружаемся

И Убеждаемся, что все окей :) Либо идем заказывать KVM

Смена контактов

Добрый вечер всем!

Так или иначе кто-то из знакомых меня читает, за сим сообщаю, что джаббер nrg@jabber.snc.ru мною более не используется, ему на смену пришел pavel.odintsov [ат] gmail.com Всем велкам :)

Хардкорная отлада Linux софта: SystemTAP

Это штука по типу Солярисного DTrace, который поистине крутой :) И местами даже превосходящий DTrace: http://sourceware.org/systemtap/wiki/SystemtapDtraceComparison А вот даже офгайд от Red Hat: http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/SystemTap_Beginners_Guide/using-systemtap.html#installproper

Для начала нужно заручиться поддержкой со стороны ядра (список взят с "Installing and Using SystemTap"):

General setup --->
[*] Kprobes
[*] Kernel->user space relay support (formerly relayfs)
Kernel hacking --->
[*] Debug Filesystem
[*] Kernel debugging
[*] Compile the kernel with debug info
Security Options --->
[*] Default Linux Capabilities


Или вот так:
cat .config | egrep 'CONFIG_DEBUG_INFO|CONFIG_KPROBES|CONFIG_RELAY|CONFIG_DEBUG_FS|CONFIG_MODULES|CONFIG_MODULES_UNLOAD'


Ставим:
apt-get install -y systemtap




Примеры использования

А запускать скрипты так: stap fork.stp -v

А вот еще интересная статья

А вот и "тестовые наборы": /usr/share/doc/systemtap/examples

Debian, serverstats, rrd

apt-get install -y serverstats


После этого появится куча интересных файлов в: /var/www/serverstats

Добавляем в crontab -e задачу:
* * * * * php -f /var/www/serverstats/update.php


Теперь создаем в Апаче отдельный виртуалхост для просмотра статистики и после этого входим на него и наблюдаем ряд красивых графиков :)

Активация AllowOverride ISPManager, Apache

Для этого необходимо немного подтюнить папку:

<Directory /var/www/domain/data/www/domain.ru>
Options +ExecCGI +Includes
AllowOverride All
</Directory>

11 Советов Билла Гейтса школьникам, рекомендую к прочтению

Ссылко

понедельник, 16 ноября 2009 г.

Fatal error: Class 'SQLite3' not found

Фиксица довольно странно.


sudo apt-get install php5-cli php5-dev make
sudo apt-get install libsqlite3-0 libsqlite3-dev
sudo apt-get install php5-sqlite3
sudo apt-get remove php5-sqlite3
cd ~
sudo wget http://pecl.php.net/get/sqlite3-0.6.tgz
sudo tar -zxf sqlite3-0.6.tgz
cd sqlite3-0.6/
sudo phpize
sudo ./configure
sudo make
sudo make install
sudo apache2ctl restart


Также потребовалось создать файл vi /etc/php5/conf.d/sqlite.ini со следующим контентом:
extension=sqlite3.so



источник: http://ubuntuforums.org/showthread.php?p=5957265

mencoder в Debian5 Lenny

В стандартном репозитории Дебияна нету mencoder`а по соображениям чистоты от исков от правообладателей различных кодеков, например, mp3 и проч, поэтому его требуется ставить из стороннего репозитория.

Открываем список репозиториев:
vi /etc/apt/sources.list

Добавляем туда строчку:
deb http://www.debian-multimedia.org lenny main

Ставим ключи от репозитория:
cd /usr/src
wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2008.10.16_all.deb
dpkg -i debian-multimedia-keyring_2008.10.16_all.deb

Апдейтим списки пакетов и ставим mencoder:

apt-get update;
apt-get install -y mencoder;

воскресенье, 15 ноября 2009 г.

Google Apps vs Microsoft

сравнение стоимостей на владение

Очень удобные AJAX файловый менеджер и WYSIWYG редактор

Прошу:
http://www.elrte.ru/elfinder/
и
http://www.elrte.ru

Уважаемые жители столицы и гости города

Ну просто замечательный сайт: http://www.metromap.ru/ !

Анонимный ФТП, Proftpd, Debian5

Открываем файл: /etc/proftpd/proftpd.conf


# A basic anonymous configuration, no upload directories.


User ftp
Group nogroup
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup on ftp

RequireValidShell off

# Limit the maximum number of anonymous logins
MaxClients 10

# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message

# Limit WRITE everywhere in the anonymous chroot


DenyAll



# Uncomment this if you're brave.
#
# Umask 022 is a good standard umask to prevent new files and dirs
# # (second parm) from being group and world writable.
# Umask 022 022
#

# DenyAll
#

#
# AllowAll
#

#

#



Перезапускаем:
/etc/init.d/proftpd restart





Идиотам - смерть!

Удаляю из Гугло Ридера все RSS на блоги, чьи авторы всрали и туда рекламу. Умойтесь, нищеброды. Также полностью убрал рекламу со своего блога. Монетизаторы, место в аду вам обеспечено :)

суббота, 14 ноября 2009 г.

Nginx: client intended to send too large body

Открываем конфиг:
vi /etc/nginx/nginx.conf

И внутрь блока http{} (допустим, под: access_log) добавляем:
client_max_body_size 50m;

И перезапускаем Nginx:
/etc/init.d/nginx restart

Ответ стырен с: тыц

пятница, 13 ноября 2009 г.

Об эффективности труда

Википедия входит в пятёрку самых посещаемых сайтов мира и имеет менее 30-ти штатных сотрудников.
(с) http://wikimediafoundation.org/wiki/Staff

UTF8 отсутствует в списке кодировок файлового менеджера в ISPManager?

Фиксица легко:

echo "UTF-8" | tee -a /usr/local/ispmgr/etc/filemgr.enc
killall -9 -r ispm

Включение server-status Apache (HTTPD) на Centos

Очень часто при анализе нагрузки на сервер требуется узнать, какие же именно сайты грузят машину, для этого как нельзя лучше подходит Apache server-status, как его использовать и активировать я расскажу ниже.

Для начала ставим пакет links, необходимый для работы страницы статуса при просмотреть из консоли:
yum install links elinks -y


Открываем конфиг Апача:
vi /etc/httpd/conf/httpd.conf


И расскомментируем (убираем знак # в начале строки) там следующие строки:
ExtendedStatus On


Также раскомментируем следующий блок:

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>


Только корректируем строку Allow from:
Allow from 127.0.0.1



После этого рестартим Апача:
/etc/init.d/httpd restart


Теперь смотрим результат нашей работы:
/etc/init.d/httpd fullstatus


Если же в ответ мы получаем connection refused или что-то подобное (бывает при использовании nginx + ispmanager, когда Апача не биндится на 80й порт), испольуем следующую команду:

elinks -dump http://localhost:8080/server-status

Too many open files, как победить?

Конфигурация лимитов файловой системы на число открытых файл

Конфигурация ядра (пункт не обязательный, но на сильно нагруженных системах необходимо)


Нам надо изменить параметр:
cat /proc/sys/fs/file-max
, обозначающий число одновременно открытых файлов
Текущее состояние числа открытых файлов можно узнать так:
cat /proc/sys/fs/file-nr
по порядку он выдает три значения: число открытых в данный момент файлов; число открытых, но не используемых файлов; максимальное число открытых файлов

Открываем файл:
vi /etc/sysctl.conf


имена всех возможных параметров можно узнать так: sysctl -a

Нас интересует параметр: fs.file-max

Добавляем в файл следующую строку:
fs.file-max = 999999


И вызываем для сохранения настроек:
/sbin/sysctl -p


Настраиваем ulimit

Текущее состояние настроек ulimit можно посмотреть: ulimit -a
Открываем файл:
sudo vi /etc/security/limits.conf


и добавляем с него следующую строку:
* - nofile 999999



Устанавливаем для текущего шелла ограничение: ulimit -n 999999
Перезапускаем апачу для применения настроек: /etc/init.d/httpd restart (или постфикс: /etc/init.d/postfix restart )


Заходим под юзером апача (или постфикса: su postfix -s /bin/sh) и удостоверяемся, что настройки новые:


su apache -s /bin/sh
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 80064
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 80064
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited



После настройки limits.conf надо РЕБУТИТЬ СИСТЕМУ!!!!! ОН не подхватывает настройки на лету (а кто расскажет, как это сделать на лету, получит плюшку).

Установка Java 1.6 на Centos Linux

Идем на страницу загрузок: http://java.com/ru/download/manual.jsp, скачиваем там "Linux RPM (самораспаковывающийся файл)" либо " Linux x64 RPM" в зависимости от требуемой платформы.

Вот прямые ссылки на 32битную версию:
http://dl8-cdn-02.sun.com/s/ESD6/JSCDL/jdk/6u17-b04/jre-6u17-linux-i586-rpm.bin?e=1258069887405&h=963e633f2f4bbd85d6a916a18493251f/&filename=jre-6u17-linux-i586-rpm.bin
и 64 битную
http://dl8-cdn-02.sun.com/s/ESD6/JSCDL/jdk/6u17-b04/jre-6u17-linux-x64-rpm.bin?e=1258069936979&h=3ea2a1a3bdb3029bc51ac06f4401b66d/&filename=jre-6u17-linux-x64-rpm.bin


А вот до кучи ссылки общие для любого дистрибутива:

64бита: http://dl8-cdn-02.sun.com/s/ESD6/JSCDL/jdk/6u17-b04/jre-6u17-linux-x64.bin?e=1258503089788&h=2ba56565ed3a9b57d85315224427bba2/&filename=jre-6u17-linux-x64.bin

32бита: http://dl8-cdn-02.sun.com/s/ESD6/JSCDL/jdk/6u17-b04/jre-6u17-linux-i586.bin?e=1258503158489&h=60bef9027b2c8d2764753a306a3b20e2/&filename=jre-6u17-linux-i586.bin


Удалим gcj компилятор Явы (он занимает /usr/bin/java):

yum remove -y java-1.4.2-gcj-compat


Теперь установим (пример для 32 бит дан):
cd /usr/src
wget 'http://dl8-cdn-02.sun.com/s/ESD6/JSCDL/jdk/6u17-b04/jre-6u17-linux-i586-rpm.bin?e=1258069887405&h=963e633f2f4bbd85d6a916a18493251f/&filename=jre-6u17-linux-i586-rpm.bin' -Ofilename=jre-6u17-linux-i586-rpm.bin
sh jre-6u* # можно сразу написать 'yes'


Проверяем результат установки:

java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Server VM (build 14.3-b01, mixed mode)

Об антиспамах

Наткнулся на хорошую статью про сравнение платных и бесплатных антиспамов, все весьма радужно. Дам несколько цитат оттуда:


Ну, и напоследок, я решил свести в таблицу варианты событий в том случае, если бы контекстные анализаторы работали в паре с DNSBL-листами. Как и ожидалось, я получил 100% эффективность фильтрации спама даже при использовании зарубежного продукта Apache SpamAssassin.


После этих слов в статье рекомендую обратить внимание на табличку со строкой: "FastBL+sa", которая показывает, что эффективность решения FastBL + SpamAssassin находится на уровне коммерческих продуктов Яндекс Спамооборона и Касперский Антиспам. Что как бэ доставляет.

четверг, 12 ноября 2009 г.

Аналог apt-get autoremove в Centos

yum install yum-utils -y
package-cleanup --leaves


Из хелпа: командой --leaves можно вывести список пакетов, от которых не зависят никакие другие компоненты

понедельник, 9 ноября 2009 г.

Thrift: кроссязыковой RPC

Прошу заценить. Очень интересная штука, позволяет делать описание методов и структур данных для работы RPC на собственном языке, не привязанном к конкретному языку программирования. Очень грамотный на мой взгляд подход, ибо единое для всех языков средство сериализации/десериализации найти очень сложно и все приходится реализовывать руками, а тут полная автоматизация, так что скорее всего, заюзаю эту штуку в новом проекту, будем все делать мегамасштабируемым :)

Наличием документации Thrift не блещет, но вот нашел полное техническое описание на википедии: тут Прочел весь мануал, потрясающая штука просто. Для тех, кто в теме, это нечто типа Corba / SOAP, но легковесное и очень удобно реализованное. А сам Thrift является наследником Pillar RPC.

Ап! А вот и Гугл открыл свои Protocol Buffers

Установка Tornado

Решил в одном проекте заюзать Фейсбуковый веб-сервер Торнадо, он очень привлекателен по скорости работы и легковесности (у меня последнее время хроническая ненависть к "тяжелым системам").

Ставим зависимости:
yum install curl-devel git -y


Ставим Python зависимости:

easy_install-2.6 pycurl==7.15.5.1 simplejson



git clone git://github.com/facebook/tornado.git
cd tornado/
python2.6 setup.py build
python2.6 setup.py install


А теперь напишем классику жанра, хелловорд =)

Файл test.py:

import tornado.httpserver
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")

application = tornado.web.Application([
(r"/", MainHandler),
])

if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()


Запускаем:

python2.6 test.py


Теперь открываем: http://айпи_вашего_сервера:8888 и радуемся увиденному :)

Сборка Python 2.6.4 Centos 5.4

wget http://python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2
tar -xjf Python-2.6.4.tar.bz2
cd Python-2.6.4
yum install -y gcc make zlib-devel bzip2-devel openssl-devel readline-devel sqlite-devel gdbm-devel ncurses-devel
./configure --prefix=/opt/python26 --with-zlib=/usr/include
make
make install
ln -s /opt/python26/bin/python2.6 /usr/bin/python2.6
python2.6 -V


Ну вот и все :) Причина сборки очень простая, проект ориентирован и на Дебиян и на Центос, где в свою очередь Питон разных версий (2.5 и 2.4), хотя по заверениям авторов Питона, 2.6 вполне себе production ready, так что будем использовать именно его и, скорее всего, перепакуем его в deb и rpm :)

Теперь для удобной установки плагинов нам необходимо собрать easy_install, идем на страницу загрузок. Скачиваем файл setuptools-0.6c11-py2.6.egg


wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
sh setuptools-0.6c11-py2.6.egg
ln -s /opt/python26/bin/easy_install-2.6 /usr/bin/easy_install-2.6
easy_install-2.6 --help


Ну вот и все, теперь приложения можно ставить через easy_install :)

воскресенье, 8 ноября 2009 г.

Начинаем использовать Git

Последнее время многие проекты переходят на Git и теперь всем простым смертным надо знать хотя бы как склонировать удаленный репозиторий (аналог svn co). Я кратко расскажу, как это сделать.


Ставим сам Git:
yum install -y git


А теперь стягиваем содержимое репозитория:
git clone git://github.com/facebook/tornado.git


Вот так все легко и просто :)

Всем любителям коктейлей

Отличный сайт посвященный коктейлям

Как резко снизить потребление памяти MySQL?

Очень даже легко, добавить следующие строки в /etc/my.cnf в блоке [mysqld]:

skip-bdb
skip-innodb

Зеркала для Debian 5 Lenny на hetzner.de

Лежат тут: http://wiki.hetzner.de/index.php/Hetzner_Aptitude_Mirror#Debian_5.0_Lenny

суббота, 7 ноября 2009 г.

Новые правила аккредитации Регистраторов зоны .ru

На Роеме наткнулся на вот эту статью и не выдержал, написал комментарии ко всему этому бреду. Задело, наверное потому, что сам работал почти два года в доменном Регистраторе, а может и просто потому, что доменов много регистрирую :)

Я ранее считал, что у нас только Государство немного "неправильное" со всеми его проверками и поддержками бизнеса, ан нет. Теперь пальма первенства бюрократизации и издеватилизации у КЦ (Координационного Центра, грубо говоря, это организация по контролю за Доменными Регистраторами) зоны .RU. Уж сколько раз твердили миру -- смотрите на запад и думайте головой. Нет, мало того, что не смотрят, так и головой не думают.

Два наиболее крупных пирога доменной индустрии это зона .com (около 40 млн доменов), зона .net (не буду врать, но раза в три меньше, чем .com) и национальные доменные зоны, для России к ним относятся .ru (2+ млн доменов), .su и в скором времени запускаемая .рф.

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

А теперь о реалиях, ранее (до театра по имени "паспортизация" доменного рынка зоны .ru) я мог спокойно зарегистрироваться на сайте любого Регистратора или Реселлера Регистратора, заполнить краткую анкетку со своими личными данными и после оплаты электронной валютой получить себе в пользование домен. Просто? Удобно? Да обалденно просто! Раз-два-три и Ваш интернет-бизнес запущен! Но не тут-то было, когда все хорошо, всегда чувствуется подвох "уж больно хорошо, не по-нашему", правильно чувствуется. Как только всем стало просто и удобно, то пришел КЦ с идеей-фикс о необходимости верификации паспорта доменным Регистратором. Да, именно! Теперь Вы сразу не сможете получить домен в "полноценное владение", а для этого (чтобы снять со своего домена позор "UNVERIFIED") Вам необходимо послать копию паспорта (уже вспоминаете гос организации со всеми их справками, выписками и подтверждениями в 10 копиях из 10 инстанций?).

Ну и что? Так сложно отослать копию паспорта? Нет, не сложно. Вопрос в том, как эту копию сохранят и тут оппа, проявляется геморрой для Регистраторов, им необходимо становиться операторами персональных данных, со всеми отсюда вытекающими подправительственными мерами. Что в свою очередь опять же ведет к повышению затрат на обслуживание всей Регистраторской инфраструктуры. Теперь внимательно смотрим на зону .com, где никаких паспортов и прочего не требуется, работает старая схема -- оплатил и получил, никакого геморроя, все легко и удобно.

Далее о переносе доменов. Все, думаю в курсе, что для переноса домена надо послать старому и новому регистраторами нотариально заверенное (поверьте, заверить письмо, содержащее латинские именования доменов, не так-то легко как кажется) письмо (вы хоть раз писали письма от руки по почте? Я вот нет... )? Ну так вот, в той же зоне .com для переноса домена достаточно узнать "секретный ключ" домена в панели регистратора и сообщить его новому регистратору. Оппа.... Опять же, явная стимуляция и упрощение работы на вторичном доменном рынке (который, если исключить сквоттеров, в нашей стране дохлый -- посомтрите на аукцион ник ру или прочие подобные ресурсы).

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

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

Хороший сайт по администрированию

Рекомендую: Администрирование Linux

Подключение Fuse к OpenVZ VPS

Вот мануал: http://wiki.openvz.org/FUSE

Вот еще важная фича, если модуль fuse на HN был только что загружен, то необходимо перезапустить ВПС через стоп/старт и убедитсья, что вывод следующей команды содержит строки fuse и fusectl:

cat /proc/filesystems
ext2
ext3
nodev proc
nodev sysfs
nodev tmpfs
nodev devpts
nodev binfmt_misc
nodev fusectl
nodev fuse


Выдаем для VPS полномочия для доступа к /dev/fuse:
vzctl set 100 --devices c:10:229:rw --save
vzctl restart 100


Также чтобы /dev/fuse создавался после перезапуска контейнера требуется (это, вообще говоря, не требуется в новых версиях, /dev/fuse итак создается успешно):

В: /etc/rc.local на VPS необходимо поместить команду:
mknod /dev/fuse c 10 229


Этот скрипт выполняется при запуске контейнера и будет создавать устройство /dev/fuse.

А на ноде (хост-машине) в /etc/rc.local необходимо добавить автозапуск модуля fuse:
modprobe fuse


Источник: http://forum.openvz.org/index.php?t=msg&goto=11793&