FastNetMon

Friday, 30 April 2010

Debian, PHP и Suhosin Patch

Всем известно, что PHP в Debian не простой, а с претензией на безопасность (прошу прощения за сумбурное смешение слов "безопасность" и "PHP"). Но далеко не всем известно, что работает он "молча", то есть если он и исправляет какие-то проблемы, то делает это молча, без записи в логи. Также есть ряд скриптов, которые ломаются от Сухосина и это никак не отражается в логах.

Для того, чтобы Suhosin начал писать в логи необходимо в php.ini добавить следующее:
; suhosin looging enabled
suhosin.log.sapi = 511


А вот примеры его записей в логи (взято из кода):

zend_suhosin_log(S_MEMORY, "possible memory corruption detected - unknown llist destructor");
zend_suhosin_log(S_MEMORY, "linked list corrupt on efree() - heap corruption detected");
zend_suhosin_log(S_MEMORY, "canary mismatch on " MFUNCTION " - heap overflow detected");


Вот ссылочка с описанием всех параметров:
http://www.hardened-php.net/suhosin/configuration.html

Option MultiViews not allowed here

Проблема возникает из-за того, что Multiviews не включается в AllowOverride All и его надо указывать явно. Ниже привожу фикс для Дебы.

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


Там видим:
AllowOverride FileInfo AuthConfig Limit Indexes Options


Корректируем:
AllowOverride FileInfo AuthConfig Limit Indexes Options=All,MultiViews


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


Все ок :) источник фикса: http://mathiasbynens.be/notes/apache-allowoverride-all

Что делать, если на FastVPS.ru нету доступа к бэкап FTP серверу?

Если у Вас выделенный сервер и Центос, то переконфигурировать сеть на статическую настройку вместо dhcp :) Тогда все и заработает :)

Если не знаете, как это сделать, пишите нам в саппорт =)

О программистах

Наверное, никто не имеет такого отвратительного мнения о программистах, как хостеры. Мы-то видим, как это говно тормозит и сваливаем несваливаемые сервера при посещаемости 3 человека / неделя, мы-то видим, как люди завязывают софт на десятки модулей (крайне часто даже нестандартных) без особой надобности, мы-то видим, как люди умудряются написать свой скрипт, чтобы он один из сотен и тысяч скриптов (угу, около нескольких сотен только участвовало в тестировании нашего хостинга на совместимость), только он один не работал с дебияновским патчем сухосин.

Ненавижу.

Универсальный cat, zcat

Часто требуется грепать одновременно и сжатые посредством gz текстовые файлы (уже отротейченые) и одновременно обычные, не сжатые текстовые файлы.

Скажем, есть логи:

/var/www/xx/data/logs/xx.com.error.log
/var/www/yy/data/logs/yy.com.error.log
/var/www/zz/data/logs/yy.com.error.log


И рядом с ними еще ряд логов в формате gz:
/var/www/xx/data/logs/xx.com.error.log.0.gz
/var/www/yy/data/logs/yy.com.error.log.0.gz
/var/www/xx/data/logs/zz.com.error.log.0.gz


Задача - их надо отфильтровать посредством одного pipe канала, то есть чтобы и сжатые файлы и несжатые превратились в текст и были выана на stdout.

С gz все очевидно - их умеет выводить команда zcat. С текстовыми все также ясно как день - их выводит cat. Но как объединить этот функционал в одной команде? Очевидный вариант - попробовать вывести zcat ом текствовый файл:

Увы, это не сработает:
find /var/www/*/data/logs | egrep 'error.log$' | xargs cat | zcat
gzip: stdin: not in gzip format
xargs: cat: terminated by signal 13


Увы, я не нашел способа совместить функционал команд, но написал скрипт на баше для этого:
for i in `find /var/www/*/data/logs | grep 'error.log'`; do file $i | grep -q 'gzip compressed data'; if [ $? -eq 0 ]; then zcat $i ; else cat $i; fi ; done

Wednesday, 28 April 2010

Ubuntu 9.10 внутри контейнера OpenVZ, как заставить работать сеть?

Есть хак, крутой и красивый :) Называется - /etc/vz/dists, матчасть по нему тут: http://blog.shaggy-cat.ru/2010/03/openvz_25.html или http://wiki.openvz.org/Configuring_container_creation

Суть в том, что шаблон http://download.openvz.org/template/precreated/ubuntu-9.10-x86_64.tar.gz от отсюда: http://download.openvz.org/template/precreated/ не работает. Точнее он работает, но внутри контейнера не поднимается сеть и все тут.

А при попытке ручного запуска/перезапуска сети получаем следующий облом:

/etc/init.d/networking restart
* Reconfiguring network interfaces...
/etc/network/interfaces:15: interface lo declared allow-auto twice
ifdown: couldn't read interfaces file "/etc/network/interfaces"
/etc/network/interfaces:15: interface lo declared allow-auto twice
ifup: couldn't read interfaces file "/etc/network/interfaces"
...fail!


Виной тому некорретный файл /etc/networking/interfaces.template. Его можно просто удалить и все заработает, но тогда придется юзать нестандартные шаблоны, что не тру. Поэтому мы отучим OpenVZ "видеть" этот файл тимплейта.

Копируем болванку от Ubuntu:

cp /etc/vz/dists/ubuntu.conf /etc/vz/dists/ubuntu-9.10.conf


Теперь зададим свой скрипт для прописывания IP машине:

vi /etc/vz/dists/ubuntu-9.10.conf

Далее вносим патч:
-ADD_IP=debian-add_ip.sh
+ADD_IP=ubuntu-910-add_ip.sh


После этого копируем скрипт прописывания IP машине:
cp /etc/vz/dists/scripts/debian-add_ip.sh /etc/vz/dists/scripts/ubuntu-910-add_ip.sh


Делаем тестовый перезапуск
vzctl --verbose restart 57821
И убеждаемся, что запускается скрипт ubuntu-910-add_ip.sh

Далее корректируем скрипт:
vi /etc/vz/dists/scripts/ubuntu-910-add_ip.sh


Комментируем строки, отвечающие за чтение шаблона:
#if [ -f ${CFGFILE}.template ]; then
# cat ${CFGFILE}.template >> ${CFGFILE}
#fi


Вуаля, теперь перезапускаем VE и наслаждаемся рабочей сеткой :)

PHP такой PHP

pear.php.net is using a unsupported protocal - This should never happen.

Monday, 26 April 2010

Сайт АвиаНовы лежит

Ну пипец: http://host-tracker.com/check_res_ajx/4782722-0/share/

Ап: поднялсо :)

DEVCONF::Ruby - пройдет 17 мая в Москве - приезжает автор Rails 3, Merb, DataMapper и jQuery

17 мая в Москве пройдет конференция, посвященная разработке на языке Ruby: DEVConf::Ruby())

Приезжает автор Ruby - Yehuda Katz

Программа конференции:

"Community Engine" или как сделать социальную сеть за 15 минут. Михаил Бараблин
Как не затрачивая человеко часы, дни и месяцы получить стандартную ункциональность форума, личных сообщений, фото-галлерей и всего что присуще социальным сетям в своем новом веб-проекте?
Tequila - язык для продвинутой генерации JSON Евгений Хлызов.
Докладчик расскажет о проблемах возникающих при использовании стандартного в Rails подхода к генерации JSON и способах их преодоления с помощью движка шаблонов Tequila
Rails 3 Choices: The Devil Is In The Details - Yehuda Katz
Ехуда Кац (Yehuda Katz) ведущий разработчик Rails 3, Merb, DataMapper и jQuery. Так же он является контрибьютором таких проектов, как Rubinius и Johnson, и работает над своим собственным проектом Thor.
Оптимизация ruby on rails проектов Дмитрий Галинский
Существует моного способов ускорения вашего Rails приложение, раскажу про некоторые из них. Кэширование с автоматической инвалидацией, работа с callback функциями в моделях, использование Rack для некоторых задач, перенос части запросов из Mysql в Sphinx.
Rubinius - Ruby, написанный на Ruby - Иван Самсонов
Rubinius - альтернативная реализация языка Ruby, написанная на Ruby.
В докладе будут освещены следующие вопросы: история создания, устройство интерпретатора, архитектура виртуальной машины, обзорное сравнение производительности, план развития на ближайшее будущее.

Разработка приложений для Facebook.com на ruby on rails - Алекс Дмитриев
В этом докладе я поделюсь опытом разработки приложений для социальной сети Facebook на базе платформы Ruby on Rails, расскажу о проблемах, которые могут возникнуть при разработке и развертывании приложений, а так же о том, как эти проблемы решать и какие инструменты для этого использовать.
Rails 3, Ruby 1.9.1 и русские буквы - Павел Голубев
Какие проблемы возникают при использовании Rails 3 на Ruby 1.9.1 с русским языком и кодировкой UTF8.
Использование jQuery с Rails - Yehuda Katz
Rails 3 has added support for choosing a JavaScript library, but did you know that the jQuery driver exposes additional client-side functionality. In this talk, Yehuda will show how you can extend the built-in functionality with existing behavior, as well as useful patterns for using jQuery with normal Rails applications.

http://feedproxy.google.com/~r/org/LOR/~3/3qjznbTlDEA/4817040

DEVCONF::Perl пройдет 17 мая в Москве

17 мая в Москве пройдет конференция, посвященная разработке на языке Perl: DEVConf::Perl())

Программа конференции:

Мифы Perl - Алексей Капранов
Технический директор ООО «НадоБы», бывший руководитель почты Рамблера, организатор конференций YAPC::Russia, активный участник Moscow.pm, докладчик, хакер
Прямо сейчас Перл переживает то, что называют Apple-moment, — возрождение в стиле Apple.

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

Perl: За и Против - Валерий Студенников
Сравнение великого и могучего языка Perl с другими языками для разработки серверного ПО (web-приложения, сетевые демоны, cron-скрипты).

Open source бизнес и Perl внутри - Руслан Закиров
Администрирует и поддерживает http://rt.cpan.org — трекер багов для Perl-модулей.
Новые начинания в Perl 5 - Piers Cawley (BBC, UK)
Доклад охватывает основные изменения в синтаксисе Perl, которые делают работу с Perl приятнее. Речь пойдет о: MooseX::Declare, TryCatch, Moose::Autobox. Будет показано, как они вместе с другими современными модулями Perl омоложивают язык прямо на глазах.
Вторая жизнь CGI-скриптов - Наим Шафиев
Опишу, как можно ускорить то, что, казалось, будет вечным тормозом — CGI (несмотря даже на рост производительности современных машин).
Prescience and time travel - Perl 6 - Карл Мэсак (Carl Mäsak)
программист из Швеции, принимающий активное участие в разработке компилятора Perl 6 Rakudo
В этом докладе будут представлены статический анализатор кода, а также отладчик с функцией путешествий во времени. Они написаны на Perl 6, который является «постепенно-типизируемым», самособираемым, дружественным к парсерам языком, всё ещё переживающим младенчество, но подающим большие надежды.

Perl 5.12 и 5.10 за 30 минут - Андрей Шитов
организатор конференций YAPC::Russia, активный участник Moscow.pm Обзор новшеств в последних версиях Perl.
Mojolicious. Веб в коробке! - Анатолий Шарифулин
ведущий программист в компании «Точка кипения». Лидер RostovOnDon.pm. Организатор «South Perl» Mojolicious – революционный и красивый веб-фреймворк, развивается очень быстро, уже поддерживается интерфейс PSGI и протокол WebSockets.
Регистрация на DEVCONF::Perl - самую большую встречу Perl'овиков уже открыта. http://devconf.ru/register/index/perl/


http://feedproxy.google.com/~r/org/LOR/~3/C2H3_QJy-yY/4816923

Sunday, 25 April 2010

Визуализация памяти процессов Linux

Интересует сабж, закидайте ссылками, а? :)

Подсчет "чистой памяти", потребляемой процессом (пример на Апаче)

По мотивам: http://prematureoptimization.org/blog/archives/28

В моей интерпретацией он выглядит примерно так:
pidof apache2 | xargs pmap -d | grep '^mapped' | awk '{print $4}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


Выдача его выглядит так:
555.3828125 mb
30.8546006944444 mb


Первая строка означает "настоящее потребление памяти всеми процессами", а вторая означает усредненное на каждый форк значение.

А вот "реальное" использование памяти всеми процессами на сервере:
ps aux | awk '{print $2}' | grep -v 'PID' | xargs pmap -d | grep '^mapped' | awk '{print $4}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


У меня скрипт выдал 5000 мегабайт при вот таких показаниях в top:
Mem: 12328016k total, 11257416k used, 1070600k free, 900536k buffers
Swap: 16779768k total, 233988k used, 16545780k free, 7255084k cached


То есть, 11257416k used - 900536k buffers - 7255084k cached = 3 Гигабайта. Однако. То есть каким-то образом мой скрипт учитывает и страничный кэш (ну не буферы же он приплетает, чесслово).

Также при тесте на VPS скрипт выдал следующие значения:
80.04296875 mb

При следующей выдаче free:
free
total used free shared buffers cached
Mem: 409600 84748 324852 0 0 0
-/+ buffers/cache: 84748 324852
Swap: 0 0 0

Также можно посчитать общий размер памяти, который mapped (то есть общий):
ps aux | awk '{print $2}' | grep -v 'PID' | xargs pmap -d | grep '^mapped' | awk '{print $2}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


Вот отличная статья по сабжу: http://www.opennet.ru/base/sys/pmap_memory.txt.html

Как узнать, чем в процессе занята память?

Командой pmap!

pmap 32513
32513: sshd: root@pts/0
b7848000 1280K rw-s- [ anon ]
b7988000 12K r-x-- /lib/security/pam_limits.so
b798b000 4K rw--- /lib/security/pam_limits.so
b798c000 8K r-x-- /lib/security/pam_mail.so
b798e000 4K rw--- /lib/security/pam_mail.so
b798f000 4K r-x-- /lib/security/pam_motd.so
b7990000 4K rw--- /lib/security/pam_motd.so
b7991000 48K r-x-- /lib/security/pam_unix.so
b799d000 4K rw--- /lib/security/pam_unix.so
b799e000 48K rw--- [ anon ]
b79aa000 12K r-x-- /lib/security/pam_env.so
b79ad000 4K rw--- /lib/security/pam_env.so
b79ae000 16K r-x-- /lib/libnss_dns-2.7.so
b79b2000 8K rw--- /lib/libnss_dns-2.7.so
b79b4000 1280K rw-s- [ anon ]
b7b04000 36K r-x-- /lib/libnss_files-2.7.so
b7b0d000 8K rw--- /lib/libnss_files-2.7.so
b7b0f000 32K r-x-- /lib/libnss_nis-2.7.so
b7b17000 8K rw--- /lib/libnss_nis-2.7.so
b7b19000 28K r-x-- /lib/libnss_compat-2.7.so
b7b20000 8K rw--- /lib/libnss_compat-2.7.so
b7b22000 8K rw--- [ anon ]
b7b24000 80K r-x-- /lib/libpthread-2.7.so
b7b38000 8K rw--- /lib/libpthread-2.7.so
b7b3a000 8K rw--- [ anon ]
b7b3c000 8K r-x-- /lib/libkeyutils-1.2.so
b7b3e000 4K rw--- /lib/libkeyutils-1.2.so
b7b3f000 28K r-x-- /usr/lib/libkrb5support.so.0.1
b7b46000 4K rw--- /usr/lib/libkrb5support.so.0.1
b7b47000 4K rw--- [ anon ]
b7b48000 1248K r-x-- /lib/libc-2.7.so
b7c80000 4K r---- /lib/libc-2.7.so
b7c81000 8K rw--- /lib/libc-2.7.so
b7c83000 12K rw--- [ anon ]
b7c86000 8K r-x-- /lib/libcom_err.so.2.1
b7c88000 4K rw--- /lib/libcom_err.so.2.1
b7c89000 140K r-x-- /usr/lib/libk5crypto.so.3.1
b7cac000 4K rw--- /usr/lib/libk5crypto.so.3.1
b7cad000 584K r-x-- /usr/lib/libkrb5.so.3.3
b7d3f000 8K rw--- /usr/lib/libkrb5.so.3.3
b7d41000 164K r-x-- /usr/lib/libgssapi_krb5.so.2.2
b7d6a000 4K rw--- /usr/lib/libgssapi_krb5.so.2.2
b7d6b000 36K r-x-- /lib/libcrypt-2.7.so
b7d74000 8K rw--- /lib/libcrypt-2.7.so
b7d76000 160K rw--- [ anon ]
b7d9e000 76K r-x-- /lib/libnsl-2.7.so
b7db1000 8K rw--- /lib/libnsl-2.7.so
b7db3000 8K rw--- [ anon ]
b7db5000 80K r-x-- /usr/lib/libz.so.1.2.3.3
b7dc9000 4K rw--- /usr/lib/libz.so.1.2.3.3
b7dca000 8K r-x-- /lib/libutil-2.7.so
b7dcc000 8K rw--- /lib/libutil-2.7.so
b7dce000 1256K r-x-- /usr/lib/i686/cmov/libcrypto.so.0.9.8
b7f08000 88K rw--- /usr/lib/i686/cmov/libcrypto.so.0.9.8
b7f1e000 12K rw--- [ anon ]
b7f21000 60K r-x-- /lib/libresolv-2.7.so
b7f30000 8K rw--- /lib/libresolv-2.7.so
b7f32000 8K rw--- [ anon ]
b7f34000 92K r-x-- /lib/libselinux.so.1
b7f4b000 8K rw--- /lib/libselinux.so.1
b7f4d000 4K rw--- [ anon ]
b7f4e000 8K r-x-- /lib/libdl-2.7.so
b7f50000 8K rw--- /lib/libdl-2.7.so
b7f52000 40K r-x-- /lib/libpam.so.0.81.12
b7f5c000 4K rw--- /lib/libpam.so.0.81.12
b7f5d000 28K r-x-- /lib/libwrap.so.0.7.6
b7f64000 4K rw--- /lib/libwrap.so.0.7.6
b7f66000 4K r-x-- /lib/security/pam_nologin.so
b7f67000 4K rw--- /lib/security/pam_nologin.so
b7f69000 8K rw--- [ anon ]
b7f6b000 104K r-x-- /lib/ld-2.7.so
b7f85000 8K rw--- /lib/ld-2.7.so
b7f87000 424K r-x-- /usr/sbin/sshd
b7ff1000 8K rw--- /usr/sbin/sshd
b7ff3000 20K rw--- [ anon ]
b90b1000 132K rw--- [ anon ]
bfb2b000 84K rw--- [ stack ]
total 8016K


А есть ли что подобное, но с визуализацией на псевдографике?

Быстро подсчитать, сколько места занимает папка /usr на всех контейнерах OpenVZ

du -sh /vz/private/*/usr | awk '{print $1}' | sed 's/M//' | perl -e '$a+=$_ for <>; print $a . "Mb\n"'

-mm дерево Эндрю Мортона не поддерживается более :/

http://en.wikipedia.org/wiki/Mm_tree

Occasionally, the -mm tree was overloaded with new patches so testing it became overly difficult. On Sep 17 2007 Andrew Morton sent a mail saying that "this just isn't working any more".
Today the -mm tree is no longer being developed and has been superseded by the -next tree.


А ссылок на -mm дофига до сих пор :/

Saturday, 24 April 2010

Не работает квота в OpenVZ контейнере

То нужно открыть конфиг VE на ноде:

vi /etc/vz/conf/{veid}.conf


И внести туда следующее:

# ENABLE QUOTA
QUOTAUGIDLIMIT="2048"


vzctl stop {veid}
vzctl start {veid}


При этом при запуске контейнера должна появится запись: "Setting quota ugidlimit: 2048".

Если не сработает, пробуйте делать (внимание! будет перезапуск всех VE):
/etc/init.d/vz restart

Станция Спортивная. Песня про грузчика

Это шедевр, я щщитаю :))) Кому интересно - на Ютубе есть видео.


Я учился 8 лет на экономиста,
Аспирант, почти доцент, вуз закончил чисто.
Мир финансов для меня книга был открытая.
Кризис грянул, и теперь угадайте: кто я?
Грузчик, грузчик, парень работящий,
Грузчик, грузчик, прёт, кладёт и тащит.
Все, кто может деньги правильно подсчитать,
Грузчиком, конечно, в детстве мечтают стать.
Стать я физиком решил после старших классов,
Знал, как силу приложить, сколько нужно массы,
Знал, как тело поднимать, чтоб росла энергия.
Пригодились навыки. Угадайте: кто я?
Грузчик, грузчик, парень работящий,
Грузчик, грузчик, прёт, кладёт и тащит.
Все, кто науку хочет до конца познать,
Грузчиком, конечно, сразу мечтает стать.
Я учился в ПТУ на специальность "грузчик",
Обучался там 7 лет, чтоб водить погрузчик.
И исполнилась мечта, самая заветная,
Ведь работаю теперь, угадайте: кем я?
Главный грузчик, парень работящий,
Главный грузчик, прёт, кладёт и тащит.
Знайте, главный грузчик может слова сказать,
После которых каждый захочет поразгружать.
Не училась я нигде, да и не хотела,
С детских лет мечтала выйти за миллионера,
Олигарх не встретился, хоть я и красивая.
И теперь живу одна, угадайте: кто я?
Просто тёлка без образованья,
Просто тёлка не имеет званья.
Девушки, которых не взяли в институт,
Весело и здорово с грузчиками живут.
Мы пропели, как смогли, гимн студентов дружно,
Песня близится к концу, закругляться нужно.
Но уйти вот просто так мы никак не можем,
Потому что закрепить зритель с нами должен:
Грузчик, грузчик, парень работящий,
Грузчик, грузчик, прёт, кладёт и тащит.
Если бы не грузчик, люди планеты всей
Жили бы гораздо менее веселей.

Все дистрибутивы семейства RedHat

Я по старой доброй привычке называю РедХатами целую пачку дистрибутивов, не конкретизируя, кого именно имею в виду. Пора исправить эту ситуацию :)

Итак, семейство RedHat.

1. RHEL, Enterprise стандарт для Linux дистрибутивов, является бесплатным, но с платной поддержкой и обновлениям http://www.redhat.com/rhel/

2. Fedora, подшефный проект RedHat, используется для обкатки фич, которые со временем включаются в RHEL, для продакшена нестабилен (кто считает иначе - стена рядом), http://fedoraproject.org/

3. CentOS, Community ENTerprise Operation System, является бинарно совместимым с RHEL дистрибутивом, но с бесплатными обновлениями, без поддержки http://centos.org/

4. Scientific Linux (SL), научная версия RHEL используемая такими монстрами как Fermilab, CERN. По своей сути близок к CentOS, также базируется на пакетной базе RHEL и бинарно совместим с ним, но имеет ряд изменений (как я п нимаю, они как на уровне ядра, так и на уровне пакетов), http://www.scientificlinux.org/

Уверен, список можно продолжить, но основные представители семейства все же именно эта четверка.

Friday, 23 April 2010

Как в вызове команд через конвейер получить код возврата не только последней команды?

http://blog.steve-miller.org/2010/03/exit-status-of-commands-in-pipeline.html

16 сайтов, которые должен знать и посещать каждый разработчик Linux ядра

1. Офсайт ядра: http://kernel.org/
2. Сайт, где публикуются все новинки и вехи в развитии ядра: http://lwn.net/
3. Сайт для "новичков" в ядре, в первую очередь содержит крайне подробные и понятные расшифровки Changelog списков ядра: http://kernelnewbies.org
4. Сайт с блогами и кучей сопроводительной информации по ядру: http://kerneltrap.org/
5. Linux-mm, эти люди решили досконально понять принципы работы памяти в Linux: http://www.linux-mm.org/
6. Сайт гипервизора KVM: http://www.linux-kvm.org/page/Main_Page
7. Сайт проекта Linux Containers: http://lxc.sourceforge.net/
8. LKLM - архив списка рассылки ядра: http://lkml.org/
9. Сайт с документацией по ядру: http://www.kernel.org/doc/
10. Сайт с важными и "официальными" патчами к ядру: https://patchwork.kernel.org/
11. Сайт с man страницами, соответствующими актуальному ядру: http://kernel.org/doc/man-pages/
12. Сайт с возможностью удобного онлайн навигации по коду ядра: http://lxr.linux.no/linux
13. Сайт с актуальным списком изменений в API ядра http://lwn.net/Articles/2.6-kernel-api/
14. Подкасты по различным темам касательно ядра http://kernelpodcast.org
15. Список утилит для удобной навигации по коду ядра: http://code.google.com/p/kernel-janitors/source/browse/wiki/Tools.wiki
16. Список блогов хакеров ядра: http://www.kernel-labs.org/?q=kernelhackers

Автоматическая инсталляция Bitrix на CentOS 5.4

http://dev.1c-bitrix.ru/community/forums/forum32/topic22770/

И да - изобретатель телевидения тоже русский :)

http://ru.wikipedia.org/wiki/%D0%97%D0%B2%D0%BE%D1%80%D1%8B%D0%BA%D0%B8%D0%BD,_%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80_%D0%9A%D0%BE%D0%B7%D1%8C%D0%BC%D0%B8%D1%87

Это ж сколько мозгов-то просрали за последний век :)

Офигительное интервью руководителя команды OpenVZ, Кирилла Колышкина

http://www.montanalinux.org/openvz-kir-interview.html

Описание vzfs от Кирилла Колышкина

ML: I've often heard that Virtuozzo scales even better and allows for even higher VPS/VE density than OpenVZ. Why is this true and what feature differences between OpenVZ and Virtuozzo account for this?

Kir: There is a VZFS filesystem in Virtuozzo but not in OpenVZ. It is similar to unionfs or aufs, the idea here is to make a single copy of files for applications, binaries, libraries and data. If there is a single copy of such files on disk for different VEs, there will be a single copy in memory holding the read-only code and data. It helps to save some memory and thus increase running VE density a bit -- but only the in cases where all (or most of) the VEs are identical (i.e. have the exactly same versions of programs installed).

So, VZFS is not a silver bullet and it comes with a price -- not conforming to POSIX by adding an ability to have additional permission and ownership attributes for symlinks. Because of that Virtuozzo ships with its own modified versions of tar, cpio, rpm, and deb which are patched to understand the added filesystem semantics. Besides, it complicates template tools. We do not want that sort of complexity in OpenVZ.


(с) http://www.montanalinux.org/openvz-kir-interview.html

В Linux поддержка файловой системы может быть реализована модулем ядра

Вот так вота... как бы и очевидно, но не всегда и не всем.

Как делать патчи для ядра linux посредством git?

Я уже много писал о том, как стянуть ядро с kernel.org, распаковать его и потом пропатчить каким-нить интересным патчем. Да, когда патч чужой все хорошо и понятно - пускаем patch -p1 < getallworldmoney.diff и получаем измененное дерево, которое осталось лишь собрать. Но в какой ад превращается разработка, когда сам пишешь патч, который затрагивает добрый десяток файлов! Ведь приходится каждый раз вызывать рекурсивное сравнение папок diff ом, чтобы вспомнить, в каком же файле добавил строчку! Разумеется, разработчики ядра умнее :) Они юзают git для этой цели, так что мы пойдем те же путем.

Установка необходимого ПО


Итак, если мы на РедХатах:

yum install git -y


Если на Дебиянах:

apt-get -y install git-core


Получение дерева исходных кодов ядра

Так как патчить мы собрались ядро Линукса, то нам бы его для начала раздобыть. Поэтому идем на офсайт ядра, устремляем свой взор в правый верхний угол, сейчас там написано "Latest Stable Kernel: 2.6.33.2", что говорит нам о том, что данная версия ядра является актуальной и стабильной (да, мы пока со стабильными только играемся).

В средней части страницы присутствует строка с рядом ссылок: "stable: 2.6.33.2 2010-04-01 [Full Source] [Patch] [View Patch] [View Inc.] [Gitweb] [Changelog]", вот как раз ссылка на Gitweb нас интересует более всего. щелкаем по ней. После этого мы попадаем на страницу, где в верхней части расположился вот такой блок:

URL git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git
http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git


Вот как раз за ним мы охотились! Нам из этого списка нужна строка с git://.

Создаем папку, где будем девелопить ядро:

cd ~
mkdir kernel_dev
cd kernel_dev
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git


Теперь идем готовить себе кофе, так как процесс весьма длительный.

Основы работы с git


Получение обновлений

В случае, если ветка ядра обновится, необходимо иметь возможность скачать все обновления, для этого используем следующие команды (если у нас самое новое ядо этой ветки, то в ответ мы получим "Already up-to-date."):

cd linux-2.6.33.y
git pull


Добавление / удаление файлов

Для добавления файла в дерево используйте команду:
git add
Для удаления:
git rm


Откат изменений

Откатить все локальные изменения (ну это на случай, если Вы расстроитесь тому, что Галуа из Вас не получился и решите все переделать):
git checkout -f


Просмотр лога изменений и информации о коммитах

git log


Просмотр списка измененных / добавленных файлов

git status


Просмотр изменений во всех файлах / в заданном файле

Изменения во всем репозитории:
git diff


Изменения в одном файле:
git diff fs/proc/stat.c


Просмотреть различия между ревизиями

git diff 96d170a11d7cc998a5ddedc56e98c783f1bee1db..19f00f070c17584b5acaf186baf4d12a7d2ed125


Коммит изменений (в локальный репозиторий!)
git commit -a


После этого Ваш коммит отобразится в git log и на его основе можно будет сделать diff и из него как раз сделать пачт :)

Отмена изменений
git-revert 96d170a11d7cc998a5ddedc56e98c783f1bee1db


Ну вот и все :) После каждого уверенного шага в написании патча для ядра делаете commit, а потом посредством git diff между исходным и конечными этапами получаете полный патч :)

По материалам: http://linux.yyz.us/git-howto.html

Как быстро очистить файл патча?

Вот так:
sed -i 's/^+//' fs/newfs.c


После этой операции файл вида:
+ asdasd
+ 324
+ asdasd


Превратится в:

asdasd
324
asdasd

Как узнать, чем занят страничный кэш в Linux?

View linux page cache content

Вуаля: http://code.google.com/p/pagecache-tools/ :)

Как работает vzfs в Virtuozzo?

http://forum.openvz.org/index.php?&t=msg&goto=89

I suppose I eat my words on this, it does seem to share the same inode.

Then I can only help that vm.swappiness can help my systems.

# ls -ali /vz/private/1/root/etc/inittab /vz/root/1/etc/inittab
451387465 -rw-r--r-- 1 root root 1456 Sep 2 16:31 /vz/private/1/root/etc/inittab
451387465 -rw-r--r-- 1 root root 1456 Sep 2 16:31 /vz/root/1/etc/inittab
Matt Ayres
TekTonic


Инфми словами, vzfs - это прослойка, позволяющая вариант "несколько файлов разделяют один inode". Формально, по тому же принципу работают hard links.

Нечто аналогичное можно провернуть вот так:

touch file1
ln file1 file1_alias
ln file1 file1_alias_two


И, вуаля:
ls -li
total 0
50801725 -rw-rw-r-- 3 rpmbuild rpmbuild 0 Apr 23 04:07 file1
50801725 -rw-rw-r-- 3 rpmbuild rpmbuild 0 Apr 23 04:07 file1_alias
50801725 -rw-rw-r-- 3 rpmbuild rpmbuild 0 Apr 23 04:07 file1_alias_two


Но до vzfs не хватает одной мелкой фичи :)

Как обязать клиентов использовать https на сайте?

Вот такой записью в файле .htaccess:


RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
# или так:
# RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Thursday, 22 April 2010

Получение статистики доменных зон доменов, поддержиавемых на DNS

cat /etc/bind/named.conf | grep zone | grep -v '^/' | tr '"' ' ' | awk '{print $2}' | perl -MData::Dumper -e 'my$hs; do { chomp; @a=split/\./, $_; $hs->{$a[-1]}++; } for <>; print "$_ $hs->{$_}\n" for sort { $hs->{$b} <=> $hs->{$a} } keys %$hs'

Использование nscd на CentOS / Debian

Имеем тормоза с DNS:

time wget -q -O/dev/null xx.com

real 0m16.113s
user 0m0.003s
sys 0m0.002s

time wget -q -O/dev/null xxx.com

real 0m16.215s
user 0m0.001s
sys 0m0.002s


Ставим nscd, который суперски умеет кэшировать запросы к DNS

CentOS way

yum install -y nscd


Активируем запуск при загрузке:
chkconfig nscd on


Запускаем:
/etc/init.d/nscd start


Debian way

apt-get install -y nscd


Статистику работы nscd можно узнать командой:
nscd -g


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


nscd -g
nscd configuration:

0 server debug level
4d 17h 21m 20s server runtime
8 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal

passwd cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
18296 used data pool size
600 seconds time to live for positive entries
20 seconds time to live for negative entries
26303 cache hits on positive entries
0 cache hits on negative entries
18186 cache misses on positive entries
36 cache misses on negative entries
59% cache hit rate
190 current number of cached values
542 maximum number of cached values
7 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/passwd for changes

group cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
17648 used data pool size
3600 seconds time to live for positive entries
60 seconds time to live for negative entries
3283 cache hits on positive entries
0 cache hits on negative entries
4439 cache misses on positive entries
67 cache misses on negative entries
42% cache hit rate
245 current number of cached values
268 maximum number of cached values
8 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/group for changes

hosts cache:

no cache is enabled
yes cache is persistent
yes cache is shared
0 suggested size
0 total data pool size
0 used data pool size
3600 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes

services cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
1432 used data pool size
28800 seconds time to live for positive entries
20 seconds time to live for negative entries
32 cache hits on positive entries
0 cache hits on negative entries
15 cache misses on positive entries
1876 cache misses on negative entries
1% cache hit rate
9 current number of cached values
26 maximum number of cached values
2 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/services for changes



А вот потребление памяти:
ps aux | grep nscd
root 5138 0.0 0.0 346312 1020 ? Ssl Apr24 0:38 /usr/sbin/nscd


Теперь тестируем скорость работы DNS:
time wget -q -O/dev/null xxx.com

real 0m27.112s
user 0m0.003s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.107s
user 0m0.001s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.106s
user 0m0.001s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.105s
user 0m0.000s
sys 0m0.002s


Теперь если отключить nscd, проблема вернется:

time wget -q -O/dev/null xxx.com

real 0m22.109s
user 0m0.000s
sys 0m0.003s


Важное замечание

nscd умеет кэшировать не только DNS запросы, но и кучу всяких других тяжелых операций, выполняемых из libc, например: getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname (как раз DNS).

Nscd provides caching for accesses of the passwd(5), group(5), and hosts(5)
databases through standard libc interfaces, such as getpwnam(3), getpwuid(3),
getgrnam(3), getgrgid(3), gethostbyname(3), and others.


Причем, не стоит бояться ошибок кэширования, так как он очень умный:
The daemon will try to watch for changes in configuration files appropriate
for each database (e.g. /etc/passwd for the passwd database or /etc/hosts and
/etc/resolv.conf for the hosts database), and flush the cache when these are
changed.


http://kernel.org/doc/man-pages/online/pages/man8/nscd.8.html

error: failed to add iptables rule to allow forwarding to 'virbr0': Invalid argument

virsh net-start default
error: Failed to start network default
error: failed to add iptables rule to allow forwarding to 'virbr0': Invalid argument


Apr 22 09:47:00 CentOS-54-64-minimal kernel: virbr0: starting userspace STP failed, starting kernel STP
Apr 22 09:47:00 CentOS-54-64-minimal avahi-daemon[3500]: Registering new address record for 192.168.122.1 on virbr0.
Apr 22 09:47:00 CentOS-54-64-minimal libvirtd: 09:47:00.348: error : internal error '/sbin/iptables --table filter --insert FORWARD --destination 192.168.122.0/255.255.255.0 --out-interface virbr0 --match state --state ESTABLISHED,RELATED --jump ACCEPT' exited with non-zero status 1 and signal 0: iptables: Unknown error 18446744073709551615
Apr 22 09:47:00 CentOS-54-64-minimal libvirtd: 09:47:00.348: error : failed to add iptables rule to allow forwarding to 'virbr0': Invalid argument
Apr 22 09:47:00 CentOS-54-64-minimal avahi-daemon[3500]: Interface virbr0.IPv4 no longer relevant for mDNS.
Apr 22 09:47:00 CentOS-54-64-minimal avahi-daemon[3500]: Leaving mDNS multicast group on interface virbr0.IPv4 with address 192.168.122.1.
Apr 22 09:47:00 CentOS-54-64-minimal avahi-daemon[3500]: Withdrawing address record for 192.168.122.1 on virbr0.


Ядро 2.6.33.2 и не работает :(((

virt-install ValueError: Virtual network 'default' has not been started.

Фикс:
virsh net-start default

Доступна бета-версия RHEL6

http://press.redhat.com/2010/04/21/red-hat-enterprise-linux-6-beta-available-today-for-public-download/

Скачать можно вот здесь: http://ftp.redhat.com/pub/redhat/rhel/beta/6.0/ хотя сейчас там что-то просит пароль, в связи с этим даю прямые ссылки на зеркала:

http://204.152.191.39/redhat/pub/redhat/rhel/beta/6/i386/iso/RHEL6.0-20100414.0-AP-i386-DVD1.iso
ftp://ftp.scientificlinux.org/linux/redhat/beta/6/iso/RHEL6.0-20100414.0-AP-x86_64-DVD1.iso


И-да, самое ключевая инновация: "2.6.32 как стандартное ядро".

По инфе от: http://markelov.blogspot.com/2010/04/rhel-6-beta.html

План, как выгнать 50 крупных Западных компаний с Российского рынка

http://www.bbc.co.uk/russian/business/2010/04/100421_russia_firms_bribes.shtml

Ну а что, подобные How-to вполне в теме моего блога :)

Линуксовое :)

Холостяк Креббс обратился в брачную контору, которая подбирает будущих супругов с помощью астролога.
- Я хочу, чтобы моя жена, - говорит потенциальный жених, - была невысокого роста,симпатичная, чтобы она любила рыбу, рыбную ловлю и не мешала бы мне разговорами.
Просьбу жениха передали по назначению. Через тридцать секунд был получен ответ:
- Вам лучше всего жениться на пингвине. Найти среди женщин ваш идеал невозможно!


http://kir1.livejournal.com/1418164.html?mode=reply

Как узнать номер inode, в котором располагается файл?


ls -i /bin/ls
16416853 /bin/ls

Распределенная компиляция программ на С/С++

Для этого есть отличная тулза distcc: http://distcc.samba.org/

Использование ccache для ускорения компиляции на CentOS 5.4

Подключаем Epel:
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm


Ставим:
yum install -y ccache


Теперь перед компиляций какого-либо ПО требуется сделать подмену PATH, чтобы вызывался не реальный gcc, а его враппер, заставляющий его использовать ccache (мой пример для 64 битной платформы):
export PATH=/usr/lib64/ccache:$PATH


После этого пробуем собрать что-либо большое :)

Потом смотрим статистику:
/usr/bin/ccache -s


Немного тестов

После первой сборки ядра 2.6.33.2 на Core i7 у меня получились примерно такие циферки:
ccache -s
cache directory /var/cache/ccache
cache hit 0
cache miss 4751
called for link 26
not a C/C++ file 53
no input file 415
files in cache 9502
cache size 762.2 Mbytes
max cache size 976.6 Mbytes


И время компиляции:
real 13m9.645s
user 33m20.539s
sys 2m59.188s


А при повторной компиляции с make clean:

ccache -s
cache directory /var/cache/ccache
cache hit 4743
cache miss 4759
called for link 51
not a C/C++ file 106
no input file 764
files in cache 9518
cache size 763.6 Mbytes
max cache size 976.6 Mbytes



real 8m46.094s
user 11m29.093s
sys 1m35.004s



http://www.debian-administration.org/article/Speeding_up_recompilation_with_ccache

Wednesday, 21 April 2010

Установка виртуализации KVM на CentOS 5.4+

Действовать мы будем по официальным мануалам от Red Hat: http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html/Virtualization_Guide/index.html и статье "Виртуализация — это просто" LXF 12/125.

Офсайт проекта KVM: http://www.linux-kvm.org/page/Main_Page

Проверяем, можем ли мы на данный сервер поставить KVM

Во-первых, у нас должен быть CentOS / RHEL версий старше 5.4:
cat /etc/redhat-release
CentOS release 5.4 (Final)


Во-вторых, проверяем поддержку процессором аппаратной виртуализации:
egrep 'vmx|svm' --color /proc/cpuinfo


В ответ на это для каждого ядра:
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc ida nonstop_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

Установка требуемого ПО

Ставим сам kvm, модуль ядра:
yum install kvm


Ставим libvirt и его обвязку для Python:

yum install -y libvirt libvirt-python


Ставим утилиту для удобной установки вирт машин:

yum install -y python-virtinst


Запускаем libvirtd:
/etc/init.d/libvirtd start


Убеждаемся, что libcirtd добавился в автозапуск:
chkconfig --list | grep virt
libvirtd 0:off 1:off 2:off 3:on 4:on 5:on 6:off


Установка VPS, создание образа

Для этого поставим CentOS 5.4 в вирт машину, для этого заюзаем утилиту virt-install (вот для того, чтобы понять, как избавиться от "Connected to domain myvps Escape character is ^]" мне пришлось изрядно прогуглить):

virt-install --connect qemu:///system --name mykvmvps --ram 1024 --file /var/lib/libvirt/images/mykvmvps.img --file-size 10 --location http://mirror.yandex.ru/centos/5.4/os/x86_64/ --network network:default --hvm --accelerate -x console=ttyS0


После этого запустится инсталлятор CentOS, где на свое усмотрение ставите машину с требуемыми настройками. В результате же установки конфиг виртуальной машины создастся в папке /etc/libvirt/qemu, а диск в папке /var/lib/libvirt/images.

Управление виртуальными машинами

Для управления VPS на базуе KVM есть две основных утилиты от RedHat: virt-manager (графическое приложение) и virsh. Обе они работают через libvirt (абстрактный относительно типа системы виртуализации API для управления). Разумеется, мой выбор — virsh.

yum group install - установка групп пакетов

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

Список всех имеющихся стандартных групп можно просмотреть вот так:
yum grouplist


Довольно интересны из них, например, группы: Virtualization, KVM.

Получить информацию о группе и список ее пакетов можно так:
yum groupinfo KVM


Ну и, наконец, установка группы:
yum groupinstall KVM


Из недостатков - ставится куча совершенно ненужных пакетов :(

Сборка ядер с kernel.org в CentOS 5

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

yum install -y ncurses-devel gcc make rpm-build redhat-rpm-config


cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.bz2
tar -xf linux-2.6.33.2.tar.bz2
cd linux-2.6.33.2


Копируем конфиг от активного ядра и если нужно вносим коррективы:

cp /boot/config-`uname -r` .config


Запускаем конфигуратор:
make menuconfig


Выбираем там следующую опцию (иначе не загрузится он на CentOS):
General setup ---> enable deprecated sysfs features which may confuse old userspace


Создаем папки для сохранения результирующего rpm файла:

mkdir -p /usr/src/redhat/SRPMS
mkdir -p /usr/src/redhat/RPMS/{i386,x86_64}


Стандартный make rpm не собирает initrd автоматически и не добавляет ядро в grub.conf, поэтому надо наложить патчик

vi scripts/package/mkspec


И в самый низ добавляем следующее:
echo "%post"
echo "/sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install "$KERNELRELEASE" || exit \$?"
echo ""

echo "%preun"
echo "/sbin/new-kernel-pkg --rminitrd --rmmoddep --remove "$KERNELRELEASE" || exit \$?"
echo ""


Собираем ядро (заодно контролируем время сборки):
time make rpm


И ставим:

rpm -ihv /usr/src/redhat/RPMS/i386/kernel-2.6.33.2.i386.rpm



Частично основано на: http://highloaded.blogspot.com/2010/04/centos-kernel-2633-build-rpm.html

vzmigrate: Error: Failed to initialize quota или vzquota : (warning) Quota is broken for id ...

При одной неудачной попытке мигарции OpenVZ контейнера при повторной попытке выдало следующее:

Initializing remote quota
Quota init
vzquota : (error) Quota is running, stop it first
vzquota init failed [5]
Error: Failed to initialize quota

А также этот рецепт помогает при ошибке "vzquota : (warning) Quota is broken for id ...".


Фиксится так (на target машине):

vzctl stop 101
vzquota off 101
vzquota drop 101
vzquota show 101
vzctl start 101


После этого повторяете синхронизацию и все.

Tuesday, 20 April 2010

Почти все ПО от Microsoft бесплатно для студентов!

https://www.dreamspark.com/Default.aspx

ПО, поддержка и продвижение для небольших веб-студий и веб-разработчиков - без предварительной оплаты от Microsoft

В вашей компании не более 10 сотрудников?
Получите Windows Web Server и SQL Server Web Edition без оплаты* для развертывания новых веб-сайтов.

*Взнос за участие в размере 100 долларов США должен быть оплачен по истечении 3-х летнего срока членства в программе, либо при досрочном выходе из программы.


http://www.microsoft.com/web/websitespark/default.aspx

iSCSI target на OpenVZ VPS

Без патчей ядра невозможен: http://forum.openvz.org/index.php?t=msg&goto=4721

Инструкция по безопасному пользованию xBox 360

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

Полноценно питайтесь и отдыхайте.
Делайте упражнения для поддержания общего физического состояния, чтобы придать телу силу и гибкость. Имейте ввиду, что вам необходимо посоветоваться с квалифицированным врачом, чтобы подобрать индивидуальные упражнения на растяжку и физическую нагрузку.
Учитесь справляться со стрессом.
Обратитесь к квалифицированному врачу в случае возникновения вопросов о том, как медицинские предпосылки и физическое состояние могут быть связаны с нарушениями опорно-двигательного аппарата. Пока исследователи еще не готовы ответить на многие вопросы, касающиеся нарушений опорно-двигательного аппарата, существует общее мнение, что их возникновение может быть связано с многими факторами, включая прошлые травмы, диабет, гормональные изменения (например, беременность) и ревматоидный артрит


http://www.xbox.com/ru-RU/support/xbox360/familysettings/healthygamingguide.htm

Сборка soft RAID5 после отказа диска

Имеем RAID-5
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid5 sda3[0] sdb3[1]
2917660800 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]

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

md0 : active (auto-read-only) raid1 sda1[0] sdb1[1]
4200896 blocks [3/2] [UU_]

unused devices:


А подробный статус RAID имеет вот такой вид:
mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Fri Mar 5 20:34:14 2010
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 3
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Mon Apr 19 14:45:55 2010
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : 4bc73b00:8e0c384f:776c2c25:004bd7b2
Events : 0.51384

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 0 0 2 removed


То есть, заменен был /dev/sdc. И массив нужно перевести в штатный режим.

Изначально, диск /dev/sdc пуст:
fdisk -l /dev/sdc

Disk /dev/sdc: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x55555555

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


Копируем либо с /dev/sda либо с /dev/sdb таблицу разделов на /dev/sdc.

sfdisk -d /dev/sda | sfdisk /dev/sdc


Добавляем диски в массив:
mdadm /dev/md0 -a /dev/sdc1
mdadm /dev/md1 -a /dev/sdc2
mdadm /dev/md2 -a /dev/sdc3


После этого небольшие разделы соберутся быстро, а мелкие чуть дольше:
cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid5 sdc3[3] sda3[0] sdb3[1]
2917660800 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 0.1% (1990240/1458830400) finish=592.0min speed=41007K/sec

md1 : active raid1 sdc2[2] sda2[0] sdb2[1]
2104448 blocks [3/3] [UUU]

md0 : active raid1 sdc1[2] sda1[0] sdb1[1]
4200896 blocks [3/3] [UUU]

unused devices:


После того, как соберется массив, на котором расположен /boot ставим grub на диск:
grub-install /dev/sdc


Все :)

Расширенное управление контейнерами OpenVZ

Так же, существует набор скриптов, предоставляющих менеджмент сети и других параметров, специфичных для дистрибутива


Говорится про скрипты, специфичные определенным ОС в /etc/vz/dist.

Взято с: http://blog.shaggy-cat.ru/2010/03/openvz_25.html

Monday, 19 April 2010

CodePlex - хостинг OpenSource проектов от Microsoft

Project Hosting for Open Source Software http://www.codeplex.com/

Ух, а сколько там всего вкусного :)

SharePoint Knowledgebase

http://spkb.codeplex.com/

C++ STL придуман русским!!!!


The architecture of STL is largely the creation of one person, Alexander Stepanov. In 1979 he began working out his initial ideas of generic programming and exploring their potential for revolutionizing software development. Although David Musser had developed and advocated some aspects of generic programming already by year 1971, it was limited to a rather specialized area of software development (computer algebra).


http://en.wikipedia.org/wiki/Standard_Template_Library

За наводу спасибо: http://sigterm.livejournal.com/66894.html

Смена основного IP в VDSManager

vzlist | grep 1139
1139 40 running xx.xx.xx.173 domain.ru


Допустим, старый IP xx.xx.xx.173, новый: xx.xx.xx.171.

Итак, теперь идем в VDSmanager и в блоке Настройки - список IP адресов выбираем любой свободный.

После этого открываем конфиг OpenVZ для заданного контейнера:
vi /etc/vz/conf/1139.conf


И на строке: IP_ADDRESS="..." заменяем xx.xx.xx.173 на xx.xx.xx.171

Перезапускаем конетйнер для применения настроек:
vzctl restart 1139


После этого новый IP должен запинговаться.

Теперь сменим IP в VDSManager:
vi /usr/local/ispmgr/etc/vdsmgr.conf


Там находим упоминание старого IP в виде:
vds "xx.xx.xx.173" {
....
}


Заменяем здесь IP на новый.

Перезапускаем VDSManager
killall -9 vdsmgr



Все, теперь новый IP значится назначенным за VDS в "Список IP адресов" и также указан как основной в "Управлении VDS".

DEVCONF::Python 17 мая, Москва

http://www.linux.org.ru/news/opensource/4794252?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+org/LOR+(Linux.org.ru:+%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8)&utm_content=Google+Reader

Все самолеты в мире за 24 часа!

http://www.youtube.com/watch?v=z1US_4uf4YE&feature=player_embedded#!

Просмотр самолетов над Европой в режиме реального времени

http://www.flightradar24.com/

Стандартный откат - это сколько?


Президент ООО «Когнитивные технологии» (подрядчик по многим контрактам связанным с «Электронной Россией») Ольга Ускова, рассказал о том, как менялась динамика откатов в IT по годам:

1996-1999гг. – до 10%
1999-2003гг. – до 20%
2003-2005гг. – до 35%
2005-2008гг. – до 40%
2008-2009гг. – до 60%
2009-2010гг. – до 75%

"Больше всего поражает чувство безнаказанности, детской наивности и вседозволенности со стороны чиновников, - сказала О.Ускова. – Чиновник из одного из крупнейших министерств предложил нам дать ему взятку в размере 75 проц от суммы контракта за право заключить контракт".


Roem: http://roem.ru/2010/04/19/addednews14449/

Вызов команды только для папок в определенной директории

find /usr -type d -exec echo {} \;

Пересборка libc6 в Debian 5 Lenny

Ога, даже такое может потребоваться :)

Ставим все для сборки:
apt-get install -y dpkg-dev devscripts build-essential fakeroot



cd /usr/src
apt-get build-dep libc6 -y
apt-get source libc6 -y
cd glibc-2.7


Накладываем патчи:

debian/rules patch


После этого в папке ls build-tree/glibc-2.7/ можно видеть все необходимое для сборки, заходим туда и нагло патчим все, что нужно :)

На правах ремарки, код сборки ld-linux.so.2 расположен по пути: build-tree/glibc-2.7/elf/Makefile. Вызов сборки идет из:
build-tree/glibc-2.7/Makefile:

100 # Make sure that the dynamic linker is installed before libc.
101 $(inst_slibdir)/libc-$(version).so: elf/ldso_install


А сам код расположен в build-tree/glibc-2.7/elf.

Собираем libc:

debian/rules build


Собираем бинарный пакет:
fakeroot debian/rules binary


Итого в папке /usr/src появится куча файлов, из которых нам нужны:

libc6-dev-i386_2.7-18lenny2_amd64.deb
libc6-dev_2.7-18lenny2_amd64.deb
libc6-i386_2.7-18lenny2_amd64.deb
libc6_2.7-18lenny2_amd64.deb


Так как в стандартной сборке Дебы:
dpkg -l | grep 'GNU C Library'
ii libc6 2.7-18lenny2 GNU C Library: Shared libraries
ii libc6-dev 2.7-18lenny2 GNU C Library: Development Libraries and Hea
ii libc6-dev-i386 2.7-18lenny2 GNU C Library: 32bit development libraries f
ii libc6-i386 2.7-18lenny2 GNU C Library: 32bit shared libraries for AM


Ставим:

dpkg -i libc6-dev-i386_2.7-18lenny2_amd64.deb libc6-dev_2.7-18lenny2_amd64.deb libc6-i386_2.7-18lenny2_amd64.deb libc6_2.7-18lenny2_amd64.deb


Блокируем пропатченный libc от апдейта:
echo "libc6 hold" | dpkg --set-selections
echo "libc6-i386 hold" | dpkg --set-selections
echo "libc6-i386-dev hold" | dpkg --set-selections
echo "libc6-dev hold" | dpkg --set-selections


Спасибо за помощь: http://www.pubbs.net/200910/ubuntu/23274-re-how-to-apply-a-patch-to-glibc-and-build-it.html и http://www.debian.org/doc/maint-guide/ch-build.en.html

[332297.933399] TCP: Peer 195.161.25.83:50467/80 unexpectedly shrunk window 2549516499:2549516500 (repaired)

И этой фигней забит весь dmesg, что бесит и не несет никакой смысловой нагрузки - она говорит лишь о том, что принимающая сторона насильно уменьшила размер окна.

В ядре эта штука объявлена в файле net/ipv4/tcp_timer.c

301 */
302 #ifdef TCP_DEBUG
303 struct inet_sock *inet = inet_sk(sk);
304 if (sk->sk_family == AF_INET) {
305 LIMIT_NETDEBUG(KERN_DEBUG "TCP: Peer %pI4:%u/%u unexpectedly shrunk window %u:%u (re paired)\n",
306 &inet->daddr, ntohs(inet->dport),
307 inet->num, tp->snd_una, tp->snd_nxt);
308 }
309 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
310 else if (sk->sk_family == AF_INET6) {
311 struct ipv6_pinfo *np = inet6_sk(sk);
312 LIMIT_NETDEBUG(KERN_DEBUG "TCP: Peer %pI6:%u/%u unexpectedly shrunk window %u:%u (re paired)\n",
313 &np->daddr, ntohs(inet->dport),
314 inet->num, tp->snd_una, tp->snd_nxt);
315 }
316 #endif
317 #endif


Далее в файле include/net/tcp.h этот самый TCP_DUMP прописан как:
21 #define TCP_DEBUG 1


То есть достаточно его сменить на нуль и перкомпилить ядро. Ничего лишнего при этом не пострадает, так как TCP_DEBUG используется лишь в еще одном месте, в файле net/ipv4/tcp.c:
1187 KERN_INFO "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n",

Улучшение использования памяти в kvm

Memory ballooning: http://www.linux-kvm.com/content/memory-ballooning-feature-coming-soon-kvm

Ускорение KVM за счет использования hugetlbfs

http://www.linux-kvm.com/content/get-performance-boost-backing-your-kvm-guest-hugetlbfs

Ключевое отличие OpenVZ от Virtuozzo

VZFS is an integral part of the virtualization technology developed by Parallels, Inc. It translates to Virtuozzo file system and comprises such product as Parallels Virtuozzo Containers for Linux. VZFS allows to share common files among multiple Containers (Containers) without sacrificing flexibility. This sharing saves up to tens of megabytes of RAM and hundreds of megabytes of disk space for each Container. On the other hand, it remains possible for Container users to modify, update, replace, and delete shared files. When a user modifies a shared file, VZFS creates a private copy of the file transparently for the user. Thus, the modifications do not affect the other users of the file. As an additional advantage, VZFS does not require having different physical partitions for different Containers or creating a special "file system in a file" setup for a Container, which significantly simplifies disk administration.

Virtuozzo Containers 4.0 for Linux comes with a new version of VZFS - Version 2. This paper is destined for Virtuozzo administrators who would like to know more of VZFS v2 and to understand the upgrade path for existing Virtuozzo Containers installations.


http://download.swsoft.com/virtuozzo/virtuozzo4.0/docs/en/lin/VzLinuxUG/19412.htm

Sunday, 18 April 2010

sshd[*]: error writing /proc/self/oom_adj: Operation not permitted

И таких записей на OpenVZ VPS куча в логе: /var/log/auth.log

Что это и зачем?

Эта ошибка связана с тем, что SSH корректирует работу механизма ядра Linux называемого OOM killer. Этот механизм призван любыми средствами сохранять работоспособность системы в случае исчерпанная памяти. Когда память кончается, он по довольно сложному алгоритму ищет ненужный, на его взгляд процесс, и убивает его. К сожалению, под действие этого механизма может попасть и процесс SSH сервера, что крайне нежелательно. Поэтому демон SSH передает ядру команду, чтобы его не убивало OOM killer ом в случае недостатка памяти (если быть точным, то его тоже убьет, но самым самым последним).

На VPS же этот механизм не работает по причине, что OpenVZ не дает доступ к файловой системе /proc, которая как раз и используется для управления OOM Killerом. Поэтому, данные записи в логах являются нормальным явлением на VPS и Вам не стоит о них беспокоиться.

А вот бы такой патчик пропихнуть в OpenVZ апстрим....

Хороший мануал по KSM

http://www.ibm.com/developerworks/linux/library/l-kernel-shared-memory/index.html

Как рассчитать MaxClients для конкретного сервера?

Вот так: http://perl.apache.org/docs/1.0/guide/performance.html#Choosing_MaxClients

Как узнать, какой URL / сайт больше всего грузит Apache?

Утилитой Apachetop!

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


Натравливаем на access лог Апача:
apachetop -f /var/log/apache/access.log


Кстати, access логи nginx он также отлично кушает:
apachetop -f /var/log/nginx/access.log


Выдача команды имеет вот такой вид:
last hit: 14:49:12 atop runtime: 0 days, 00:00:35 14:49:28
All: 19 reqs ( 0.9/sec) 50.4K ( 2457.9B/sec) 2716.6B/req
2xx: 8 (42.1%) 3xx: 11 (57.9%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)
R ( 30s): 19 reqs ( 0.6/sec) 50.4K ( 1720.5B/sec) 2716.6B/req
2xx: 8 (42.1%) 3xx: 11 (57.9%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)

REQS REQ/S KB KB/S URL
6 0.29 37.8 1.8*/
2 0.11 0.0 0.0 /favicon.ico
2 0.12 12.6 0.7 /favicon.ico/
1 0.06 0.0 0.0 /wp-content/themes/bluebird/style.css
1 0.06 0.0 0.0 /wp-includes/js/thickbox/thickbox.css
1 0.06 0.0 0.0 /wp-content/plugins/google-ajax-translation/google-ajax-translation
1 0.06 0.0 0.0 /wp-includes/js/jquery/jquery.js
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/header1.jpg
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/header2.jpg
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/feedicon.png
1 0.06 0.0 0.0 /wp-content/plugins/google-ajax-translation/transparent.gif
1 0.06 0.0 0.0 /files/2009/12/Christmas-Tree.png

Тот самый вулкан в реальном времени

http://eldgos.mila.is/eyjafjallajokull-fra-valahnjuk/

Визуализация размера папок в системе

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


Запускаем:
Результат работы выглядит примерно так (для /):

Вот результат ее работы:
535.9MB [##########] /usr
153.4MB [## ] /var
7.9MB [ ] /lib
5.0MB [ ] /sbin
4.2MB [ ] /bin
3.9MB [ ] /etc
824.0kB [ ] /home
204.0kB [ ] /root
12.0kB [ ] /tmp
4.0kB [ ] /dev
e 4.0kB [ ] /boot
e 4.0kB [ ] /media
e 4.0kB [ ] /mnt
e 4.0kB [ ] /opt
e 4.0kB [ ] /selinux
e 4.0kB [ ] /srv
4.0kB [ ] .rnd
0.0 B [ ] /sys
0.0 B [ ] /proc
@ 0.0 B [ ] lib64

Saturday, 17 April 2010

Поддержка виртуализации kvm в RHEL/CentOS 5.4

Начиная с версии 5.4 в RHEL появилась поддержка kvm виртуализации! Причем, без каких-то левых репозиториев и сомнительных мануалов :)

Итак, встречайте, официальный мануал:
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html/Virtualization_Guide/index.html


Разрешаю обзывать меня ретроградом за такие новости на фоне выхода RHEL 5.5, но все же :) В ближайше время ждите мануал по поднятию виртуалки на базе KVM по CentOS 5.4 x86_64.

Debian, конфигурация PHP, max_execution_time и папочка conf.d

Допустим, есть конфиг /etc/php5/cgi/php.ini и в нем задана опция:

max_execution_time = 90


и есть файл:
/etc/php5/conf.d/my.ini

в нем этот параметр перекрыт:

max_execution_time = 91


То какое значение примет PHP?

Вот такое:
php5-cgi -i | grep max_exec
max_execution_time 91

Причем, у PHP как модуля Apache подход в точности такой же.

А CLI же версии решительно на всех пофигу:
php5 -i | grep max_exec
max_execution_time => 0 => 0


Иными словами, больший приоритет имеет то, что находится в папке conf.d, а не в родном php.ini.

Маечки про вулкан =)

http://cashnotash.spreadshirt.net/

Направо пойдешь, по Google maps пойдешь!

mod_ispmgr.so: wrong ELF class: ELFCLASS32

/etc/init.d/httpd restart
Stopping httpd: [FAILED]
Starting httpd: httpd: Syntax error on line 993 of /etc/httpd/conf/httpd.conf: Syntax error on line 1 of /usr/local/ispmgr/etc/ispmgr.inc: Cannot load /usr/local/ispmgr/lib/apache/mod_ispmgr.so into server: /usr/local/ispmgr/lib/apache/mod_ispmgr.so: wrong ELF class: ELFCLASS32
[FAILED]
~# uname -a
Linux domain.com 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:32:21 EST 2010 x86_64 x86_64 x86_64 GNU/Linux


Я искренне жажду увидеть тех существ, что написали это говно. Мне вот крайне интересно КАК ОНИ ВЫГЛЯДЯТ.

Фикс - отключение панели.

Для CentOS:
vi /etc/httpd/conf/httpd.conf

И комментируем символом # там строку:
# Include /usr/local/ispmgr/etc/ispmgr.inc


Перезапускаем Апача:
/etc/init.d/httpd restart
Stopping httpd: [FAILED]
Starting httpd: [ OK ]

Friday, 16 April 2010

re.search vs re.match (search vs match) в Python

In a nutshell, match() only attempts to match a pattern at the beginning of a string where search() will match a pattern anywhere in a string. For example:


То есть re.match требует, чтобы паттерн подходил ко ВСЕЙ строке, а re.search срабатывает, если хотя бы часть подстроки совпала с паттерном.

Можно ли в OpenVZ подключить разные точки монтирования с разных дисков?

Скажем, var с одного жесткого диска, а все остальное с другого? Хотеть!

Использование Pylons в продакшене: paster + Nginx

Разработку приложения можно вполне вести и на встроенном веб-сервере paster, но как только посещаемость увеличивается и Вы запускаете проект, то, безусловно, paster - не лучший выбор. Тут ем может помочь Nginx, выступающий в качестве reverse proxy!

Итак, имеем paster на 5000 порту:
http://127.0.0.1:5000


Ставим Nginx (здесь и далее - ОС Debian 5 Lenny):
apt-get install -y nginx


Удаляем конфиг стандартного сайта:
rm /etc/nginx/sites-enabled/default


Создаем новый:
vi /etc/nginx/sites-enabled/default


Со следующим содержимым:

server {
listen 80;
server_name domain.ru;

access_log /var/log/nginx/access.log;

location / {
# передаем хостнейм Paster, хотя это не обязательно
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:5000;
}
}


Перезапускаем Nginx и применяем настройки:
/etc/init.d/nginx restart


Следом запускаем paster (иначе поулчим на 80м порту "502 bad gateway"):

cd myapp
nohup paster serve --reload development.ini &


Все, теперь открываем сайт http://domain.ru и любуемся видом нашего Pylons проекта.

Thursday, 15 April 2010

А тем временем, в порыве креатива у меня родился новый термин - "специалист на 8 часов"

Что он значит, думаю, сами догадаетесь? :)

Error: database disk image is malformed

yum upgrade
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: centos.intergenia.de
* base: centos.copahost.com
* extras: centos.copahost.com
* updates: centos.copahost.com
Error: database disk image is malformed


Фикс очень прост:
yum clean all

Нужно ли для MySQL покупать много памяти и SSD диски?

http://www.mysqlperformanceblog.com/2010/04/08/fast-ssd-or-more-memory/

Думаете, видели поистине огромные MySQL запросы? Ошибаетесь.

Вот такое чудо выдернул утром с одной CMS, нещадно насиловавшей MySQL: http://paste.org/pastebin/view/17403

CentOS и CRON

На одном из CentOS серверов от FastVPS заметил отсутствие CRON в принципе, что меня довольно удивило. И ведь правда - не было.

Пришлось поставить вручную:
yum install -y vixie-cron


И запустить:
/etc/init.d/crond start


В автозагрузку же он попал без моего вмешательства :)

vzquota : (warning) Incorrect quota shutdown for id xxx, recalculating disk usage

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

vzctl start xxxxx
Starting container ...
vzquota : (warning) Incorrect quota shutdown for id xxx, recalculating disk usage
Container is mounted
Adding IP address(es):xx.xx.xx.xx
Setting CPU limit: 200
Setting CPU units: 500000
Setting CPUs: 2
Configure meminfo: none
Set hostname: yyyy.xxxx.ru
Setting quota ugidlimit: 2048
Container start in progress...

Wednesday, 14 April 2010

Мониторинг отброшенных / принятых соединений в iptables без dmesg

Стандартным способом узнать, какие именно соединения / пакеты принял iptables является цель -j LOG, которая выбрасывает их в кольцевой буфер ядра, dmesg. Но это крайне неудобно по двум причинам - замусоривается dmesg, где могут быть крайне важные и полезные сообщения от ядра, а также неудобно читать и следить за логом (да, есть klogd).

Тут нам на выручку приходит ULOG, позволяющий по netlink отправить сообщения о пропущенных / заблокированных пакетах в userspace, где их встретит демон.

Вот выдержка из мана по iptables:
This target provides userspace logging of matching packets. When this target is set for a rule, the Linux kernel willmulticast this packet through a netlink socket. One or more userspace processes may then subscribe to various multicast groups and receive the packets. Like LOG, this is a "non-terminating target", i.e. rule traversal continues at the next rule.


Самое важное во всем этом то, что ULOG является не детерминирующим правилом, то есть после -j ULOG пакет будет пропущен дальше и если Вы хотите таки его отбросить, нужно следующим правилом добавить -j DROP.

Мое правило, работу которого я хочу контролировать логом имеет вид:
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Чтобы сначала пакеты зафиксировать в ULOG нужно перед ним добавить еще одно правило:

-A OUTPUT -p tcp -m tcp --dport 25 -j ULOG --ulog-prefix "SMTP25BLOCK" --ulog-cprange 0 --ulog-qthreshold 50
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


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


После установки ulogd создает два лога:

/var/log/ulog/ulogd.log - системный, хранит информацию о работе демона
/var/log/ulog/syslogemu.log - лог трафика, сюда как раз будут записываться прошедшие через ULOG пакеты


Запускаем:
/etc/init.d/ulogd start


Пробуем коннект наружу:
telnet mail.ru 25
Trying 217.69.128.45...
^C


Получаем один пакет, зафиксированный ULOG и один отброшенный:

iptables -nvL
Chain OUTPUT (policy ACCEPT 1546 packets, 2211K bytes)
1 60 ULOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ULOG copy_range 0 nlgroup 1 prefix `SMTP25BLOCK' queue_threshold 50
1 60 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25


Вот и все, запись о нашей попытке запсиана в лог:

tail /var/log/ulog/syslogemu.log
Apr 14 21:48:19 v1 SMTP25BLOCK IN= OUT=eth0 MAC= SRC=xx.xx.xx.xx DST=yy.yy.yy.yy LEN=60 TOS=10 PREC=0x00 TTL=64 ID=29311 DF PROTO=TCP SPT=50089 DPT=25 SEQ=731105051 ACK=0 WINDOW=5840 SYN URGP=0


Ну вот и все :) Разве что у меня остался вопрос, как добавить сюда uid/gid приложения пытавшегося осуществить отправку. Но он, к сожалению, не решается в рамках ULOG, так как только у цели LOG есть ключик --log-uid, который как раз логгирует uid отправителя.

Потрясающий доклад Павла Кудинова

Прошу: http://pavel-kudinov.livejournal.com/69412.html

Debian, MySQL: лог /var/log/mysql.log всегда пустой - это нормально?

Предполагаю, что это бага, ибо на Центосе он хотя бы сообщал в логе о том, что запустился или если у него слетели таблицы после ребута.

Как ограничить потребление памяти Java приложением?

http://www.hostsvault.com/blog/howto-limit-java-application-memory-specially-on-a-vps/

Запуск двух MySQL инстансов на одном сервере

http://www.hostsvault.com/blog/howto-run-two-instances-of-mysql-in-the-same-server/

OpenVZ + noatime для EXT3

Инго Молнар говорит про atime следующее:

Ingo Molnar stressed the significance of fixing this performance issue, "I cannot over-emphasize how much of a deal it is in practice. Atime updates are by far the biggest IO performance deficiency that Linux has today. Getting rid of atime updates would give us more everyday Linux performance than all the pagecache speedups of the past 10 years, _combined_."


(c) http://kerneltrap.org/node/14148

Для OpenVZ же кроме этого есть еще опция непосредственно для отключения/включения noatime для определенных VE:

--noatime yes|no Sets noatime flag (do not update inode access times) on file system.


(c) man vzctl

Например, вот так будет выглядеть команда для отключения atime для определенного VPS:
vzctl set 101 --noatime yes --save
vzctl restart 101


(c) http://www.hostsvault.com/blog/how-to-reduce-disk-partition-io-access-time/

Но обращаю внимание, что есть софт (мало-мало-мало), который от такого сломается. Хотя если у Вас хостинг сервер - Вам бояться нечего, в типичном LAMP такой софт фактически отсутствует.

А еще есть самое-самое надежное подтверждение надежности этой опции - оф руководство по Virtuozzo: http://download.swsoft.com/virtuozzo/virtuozzo4.0/docs/en/lin/VzLinuxClustering/20091.htm

InnoDB теперь стандартный Storage Engine для MySQL начиная с версии 5.5

http://www.nixp.ru/news/InnoDB-%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%81%D1%8F-%D0%B4%D0%B2%D0%B8%D0%B6%D0%BA%D0%BE%D0%BC-%D0%91%D0%94-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-%D0%B2-MySQL.html

Что будет с пхп, если он найдет в своем php.ini директиву от отключенного модуля?

А хрен его знает :) Ща протесчу.

GFS vs GFS2: в каких они состоят отношениях?

GFS2 adds a number of new features which are not in GFS


(c) http://en.wikipedia.org/wiki/Global_File_System

OCFS2 vs GFS2, что круче?

Сабж? Закидайте ссылками :)

Почти всеобъемлющий обзор почти всех файловых систем

http://www.pentarh.com/wp/2008/07/04/cluster-filesystems/

Масштабирование PHP

http://porteightyeight.com/2008/03/24/the-hitchhikers-guide-to-php-load-balancing/

Шаблоны для VDSMnager/FreeBSD с интегрированным ISPManager

Лежат вот тут:
http://download.ispsystem.com/FreeBSD-8.0/amd64/VDSmanager-FreeBSD/DiskTemplate/FreeBSD-8-ISPmanager/

Tuesday, 13 April 2010

Как YouTube борется с неприемлемым видео?


Каждую минуту на YouTube загружается более 20 часов видео, что составляет сотни тысяч видеороликов ежедневно. Для поддержания постоянной работы сервиса в таком масштабе, мы физически не можем просматривать весь загружаемый контент перед его публикацией. Точно так же как и телефонная компания не может отслеживать звонки перед тем, как они совершены. Вместо этого YouTube разработал инновационную и надежную систему мониторинга – пользователи помогают отслеживать и отмечать неприемлемый контент. Глобальное сообщество YouTube никогда не спит: люди, составляющие это сообщество, находятся на всех континентах и во всех часовых поясах. Пользователи YouTube - самая авторитетная для нас группа людей в том, что касается отслеживания контента, нарушающего Принципы сообщества. Миллионы пользователей сообщают о неприемлемом контенте, кликая на флажок «Отметить как неуместное» под самим роликом. Команда YouTube круглосуточно рассматривает все отмеченные таким образом видео. Если видеоролик нарушает правила, его незамедлительно удаляют с сайта. Аккаунты пользователей, нарушающих принципы сообщества YouTube, будут заблокированы.


взято с: http://feedproxy.google.com/~r/blogspot/LMWz/~3/AqlyW0L0PuA/youtube.html

Украинский стартап: Prom.ua

http://www.developers.org.ua/archives/max/2010/04/12/prom-ua-startup/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+DevelopersOrgUa+(Developers.Org.Ua+Updates)&utm_content=Google+Reader

Ребята супер! За тех часть зачот :)

Включение Register_Globals при использовании HTScanner

Чтобы включить Register_Globals для определенного сайта добавьте в корневой .htaccess следующие строки:
php_value register_globals 1


После этого подождите 2 минуты, пока применятся настройки и Register_Globals включиться только для этого сайта. Если хотите применить настройки срочно - откройте настройки любого www домена и не изменяя их сохраните их, это приведет к перезапуску Апача и немедленному применению настроек.

Zero tolerance

Вот так и везде надо: http://m-0-r-u-s.livejournal.com/150701.html

ISPManager: No such file or directory: Timeout connecting daemon

Вот заметил в логах такую ересь:
[Mon Apr 12 22:32:52 2010] [error] [client xx.xx.xx..xx] (2)No such file or directory: Timeout connecting daemon, referer: https://xxxx.info/manager/


Чем это может быть вызвано?

Поиск аномальных записей в логах ошибок Nginx и Apache

В логах ошибок Апача и Нгинкса тонны записей, но полезных среди них очень мало и они почти теряются на фоне ошибок "No such directory" и прочих, что делает просмотр логов очень неудобным и допускающим пропуск важных записей. Чтобы просматривать логи в удобном виде, необходимо отфильтровать лишние записи каким-либо образом, например грепом. Все примеры ниже будут для Debian.

Nginx:

cat /var/log/nginx/error.log | grep -v '2: No such file or directory' | grep -v 'failed (20: Not a directory' | grep -v ' access forbidden by rule' | egrep -v 'conflicting server name.*ignored' | grep -v 'Connection refused' | grep -v 'upstream timed out' | grep -v 'Connection reset by peer' | grep -v 'upstream prematurely closed connection while reading response header'



Apache:

cat /var/log/apache2/error.log /var/log/httpd/error_log | grep -v '\[notice\] mod_fcgid: call' | grep -v 'Init: SSL server IP/port conflict' | grep -v 'RSA server certificate wildcard' | grep -v 'suEXEC mechanism enabled' | grep -v 'Init: You should not use name-based virtual hosts in conjunction with SSL' | grep -v 'mod_ssl/2.2.9 OpenSSL/0.9.8g configured -- resuming normal operations' | grep -v 'File does not exist' | grep -v 'RSA server certificate is a CA certificate' | grep -v 'RSA server certificate CommonName ' | grep -v 'Graceful restart requested, doing restart' | grep -v 'caught SIGTERM, shutting down' | grep -v 'Digest: done' | grep -v 'Digest: generating secret for digest authentication' | grep -v 'configured -- resuming normal operations' | grep -v 'Could not reliably determine the server' | egrep -v 'DocumentRoot.*does not exist' | egrep -v 'mod_fcgid: process.*terminated by calling exit\(\), return code: 0' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'process.*going graceful shutdown, sending SIGTERM' | grep -v 'process.*graceful shutdown timeouted, sending SIGKILL' | grep -v 'mod_fcgid: cleanup zombie process' | grep -v 'mod_fcgid: too much' | grep -v 'process.*exit(communication error)' | grep -v 'process.*exit(shutting down)' | grep -v 'Premature end of script headers: ispmgr' | egrep -v 'script.*not found or unable to stat' | grep -v 'client denied by server configuration' | grep -v 'mod_fcgid: process.*exit(lifetime expired)' | grep -v 'mod_fcgid: process.*exit(idle timeout)' | grep -v 'mod_fcgid: process.*exit(busy timeout)'


ISPManager:
cat /usr/local/ispmgr/var/ispmgr.log | grep Error -i | grep -v 'error.log' | grep -v 'location_error' | grep -v 'fdata='



Поиск аномалий по клиентским логам:
for i in `find /var/www/*/data/logs | grep 'error.log'`; do file $i | grep -q 'gzip compressed data'; if [ $? -eq 0 ]; then zcat $i ; else cat $i; fi ; done | grep -v 'File does not exist' | grep -v 'client denied by server configuration' | grep -v 'script not found or unable to stat' | grep -v 'not found or unable to stat' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'File name too long' | grep -v 'Directory index forbidden by Options directive' | grep -v 'attempt to invoke directory as script' | grep -v 'mod_fcgid: server is restarted' | grep -v 'Permission denied: file permissions deny server access' | egrep -v 'script.*not found or unable to stat' | grep -v "Permission denied: Can't open directory for index" | grep -v 'stderr: WordPress database error' | grep -v 'mod_fcgid: read data timeout in 40 seconds' | grep -v 'Premature end of script headers' | grep -v 'Request exceeded the limit of 10 internal redirects'

Установка PHP htscanner на Debian - поддержка php_flag в .htaccess для PHP FastCGI / CGI

Офсайт проекта: http://pecl.php.net/package/htscanner

Ставим зависимости:
apt-get install -y php5-dev make patch


cd /usr/src
wget http://pecl.php.net/get/htscanner-0.9.0.tgz
# или зеркало
wget http://fastvps.googlecode.com/svn/trunk/packages/htscanner-0.9.0.tgz
tar -xf htscanner-0.9.0.tgz
cd htscanner-0.9.0
# накладываем патч, без него не будет работать php_flag
wget http://fastvps.googlecode.com/svn/trunk/patches/htscanner.patch
patch -p0 < htscanner.patch # следом накладываем патч для запрета перекрыти memory_limit wget http://fastvps.googlecode.com/svn/trunk/patches/deny_values.patch patch -p0 < deny_values.patch phpize ./configure make



Устанавливаем:
cp modules/htscanner.so /usr/lib/php5/20060613/


Или
make install


Но этого недостаточно, чтобы модуль подключился:
php -m | grep htscanner


Создаем конфиг:
vi /etc/php5/conf.d/htscanner.ini


[htscanner]
extension="htscanner.so"
; The configuration file htscanner needs to scan for php_* directives
config_file=".htaccess"
; The fallback docroot when htscanner can't determine the current docroot
default_docroot="/"
default_ttl=300
; Stop when an error occured in RINIT (no document root, cannot get path_translated,...)
stop_on_error = 0


Теперь создаем в корне сайта .htaccess со следующими строками (поиски по Гуглу и опрос знакомых подтвердили, у htscanner php_flag не работает в принципе):
php_flag register_globals On

но это не сработает почему-то :( А вот такой вариант отлично пашет:

php_value register_globals 1


Обращаю внимание, что после изменения .htaccess необходимо перезапустить рабочие процессы PHP, чтобы изменения применились:
killall -u username


В процессе поиска фикса насткнулся на следующие патчи для htscanner 0.9.0:
http://yourserveradmin.com/ik/htscanner-0.9.0.eol.patch и вот http://blog.hbis.fr/2009/04/02/htscanner-parser-patch/patch-htscanner-parser-20090401/ (как раз, вроде, на мою проблему).

Debian: не работает Apache Mod_Expires

Имеем вот такие настройки в .htaccess:

62 <IfModule mod_expires.c>
63 # Enable expirations.
64 ExpiresActive On
65
66 # Cache all files for 2 weeks after access (A).
67 ExpiresDefault A1209600
68
69 # Do not cache dynamically generated pages.
70 ExpiresByType text/html A1
71 </IfModule>


То есть все файлы с типом text/html должны выдаваться с заголовками, разрешающими их кэширование, это можно проверять командой (обязательно, чтобы 1.html был статикой, иначе никаких директив мы не поулчим! Апач не дописывает директивы к выдаче скриптов):
wget http://domain.ru:80/1.html --server-response -O/dev/null


Но выдаются только следующие заголовки на бэкэнде:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:21:32 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


А на фронтэнде nginx:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:21:34 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding


Как видите, ничего близкого к кэшированию тут нету.

Чтобы кэширование все же заработало, необходимо включить соответствующий модуль:
a2enmod expires
/etc/init.d/apache restart


После этого получаем от бэкэнда:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:24:53 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:24:54 GMT
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


И фронтэнда:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:25:20 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT
Vary: Accept-Encoding


Как видите, появились новые директивы:
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT

Как получить http заголовки (хидеры, headers) от сервера?

Вот так:
wget domain.com --server-response -O/dev/null

PHP FastCGI + php_admin_value, php_admin_flag, php_value, php_flag

Как известно, эти команды указываются в .htaccess и должны поидее читаться модулем PHP для Апача, но когда последний не используется, а используются, скажем, PHP FastCGI / CGI, то эти директивы будут просто-напросто проигнорированы и эффекта не возымеют.

Но есть проблема - есть фикс! Вот что говорят ребята из Zend: http://kb.zend.com/index.php?View=entry&EntryID=259

А именно:

Using htscanner - htaccess support for PHP
Description: Allow one to use htaccess-like file to configure PHP per directory, just like apache's htaccess.
It is especially useful with fastcgi.


А вот ссылка на этот самый HTScanner: http://pecl.php.net/package/htscanner

Краткое описание от авторов этого самого мегаэкстеншена:
Allow one to use htaccess-like file to configure PHP
per directory, just like apache's htaccess. It is especially useful with fastcgi (ISS5/6/7, lighttpd, etc.).
This package was originally developed by Bart Vanbrabant. Old versions are available
from: http://files.zoeloelip.be/htscanner


Еще есть фича - если у Вас используется FastCGI, но при этом подключен PHP как модуль Апача, то все будет ок - php_* директивы будут проигнорированы, а вот если используется только FastCGI и PHP модуль в принципе отключен, то будет ошибка :) Но тут приходит на модуль модуль mod_fakephp, который подавляет выдачу ошибок при обнаружении опций PHP в .htaccess: http://www.dmi.me.uk/code/apache/mod_fakephp/

За наводку огромный респект arp`у: http://highloaded.blogspot.com/2010/04/htaccess-phpflag-with-fastcgi-on-debian.html и вот еще отличная статья с интересным подходом: http://dromok.ru/?p=104

Вот мой мануал по настройке этого чуда: http://phpsuxx.blogspot.com/2010/04/php-htscanner-debian-phpflag-htaccess.html А вот мануал в моем блоге: http://phpsuxx.blogspot.com/2011/01/modfakephp-debian.html