FastNetMon

Thursday 30 December 2010

Saturday 25 December 2010

GoDaddy SSL wildcard сертификаты криво работают в Chrome

Если быть точным, выдается ошибка:
Вы попытались открыть domain.ru, однако представленный сервером сертификат не является доверенным для операционной системы вашего ПК. Это может означать, что данный сервер сгенерировал собственные данные подтверждения безопасности, на которые Google Chrome не может полагаться, либо злоумышленник пытается перехватить данные коммуникации. Мы не советуем продолжать, особенно если вы не видели предупреждения для этого сайта ранее.

И в подробностях указано что "Сертификат подписан неизвестным" бюро.

Чтобы избавится от проблемы, нам нужен intermediate сертификат GoDaddy (что это,читаем тут). Заходим на страницу https://certs.godaddy.com/anonymous/repository.seam, там ищем файлик "gd_intermediate.crt", копируем ссылку на него.

Заходим на сервер:
cd /etc/apache2
wget тут_ссылка_на_сертификат

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

Ищем, где указан наш сертификат, это будут строки в стиле:
SSLCertificateFile /etc/apache2/ssl.crt/domain.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/domain.key

И добавляем чуть ниже:
SSLCertificateChainFile /etc/apache2/gd_intermediate.crt

Применяем настройки:
invoke-rc.d apache2 restart


Все, теперь никаких ошибок от сертификата в Chrome не будет :)

Источник: http://www.cupcakewithsprinkles.com/godaddy-ssl-certificate-and-chrome/ и http://doejo.com/blog/godaddy-ssl-certificate-throws-errors-in-google-chrome

Обновление прошивки D-Link Dir-320

http://internet.natm.ru/setting/wifi/asus-wl-500g-premium/65-d-link-dir-320#0-1

Узнать свой ИНН онлайн

http://service.nalog.ru:8080/innmy.do

Из недостатков:
1) Не используется SSL, при использовании по открытым сетям Ваши данные могут перехватить крайне легко
2) Меня не нашло, хотя ИНН, разумеется, есть :) Сведений о Вашем ИНН в федеральной базе данных Единого государственного реестра налогоплательщиков не найдено. Для получения ИНН Вам необходимо заполнить заявление о постановке на учет. Заполнить заявление на постановку на учет в электронном виде Вы можете здесь.

Update:

3) Меня-таки нашло, по совету Genmed попробовал данные своего старого паспорта и меня чудным образом нашло :)

Thursday 23 December 2010

the "alias" directive may not be used inside location given by regular expression

Это означает, что нужно использовать Nginx версии выше 0.7.40.

Источник: http://nginx.org/pipermail/nginx/2010-July/021280.html

Где взять список всех доменов зон .ru .su .рф?

ru: https://partner.r01.ru/zones/ru_domains.gz
su: https://partner.r01.ru/zones/su_domains.gz
рф: https://partner.r01.ru/zones/rf_domains.gz

Поля разделены табами:
имя_домена
регистратор
дата_регистрации
дата_окончания_регистрации
дата_освобождения
делегирован_ли_домен (1 - делегирован, 0 - не делегирован)

Для .com / .net / .org и прочих искать вот тут: http://www.verisign.com/domain-name-services/domain-information-center/tld-zone-access/

К слову, аналогичный ресурс, правда, с доступом по паролю (достаточно быть просто клиентом), есть у REG.RU: https://stat.reg.ru/domainlist?tld=ru

Источник: http://domenforum.net/showthread.php?t=67147&page=2 и http://forum.searchengines.ru/showthread.php?t=584377

Как заставить TomCat на Linux слушать 80й порт вместо 8180?

Просто прописать в конфиге 80й нельзя, так как он привилегированный и биндится на него может только root. Как же обойти эту проблему? Либо поставить реверс-прокси (nginx, lighttpd) либо заюзать немного Linux магии.

Выполняем следующую конфигурацию iptables:
iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8180
iptables -t nat -A OUTPUT -d 213.133.x.x -p tcp --dport 80 -j REDIRECT --to-ports 8180
iptables -t nat -A PREROUTING -d 213.133.x.x -p tcp --dport 80 -j REDIRECT --to-ports 8180

Эти правила делают переброс портов и при соединении на 80й порт будет срабатывать прозрачный переброс на 8180.

Источник: http://www.klawitter.de/tomcat80.html

Tuesday 21 December 2010

Как добавить IP на Debian как алияс для eth0?

Легко!

Открываем конфиг сети:
vi /etc/network/interfaces

Добавляем там:
auto eth0:0
iface eth0:0 inet static
address xx.xx.xx.xx
netmask 255.255.255.255

Применяем:
/etc/init.d/networking restart

Через несколько мгновений адрес должен запинговаться.

Время - это капитал работника умственного труда. (с) Оноре Бальзак

Время - это капитал работника умственного труда. (с) Оноре Бальзак

Офигенная фраза! Очень понравилась!

Как короче записать shutdown -r now?

Вот так:
shutdown -r 0

Thursday 16 December 2010

NOTICE: Your partition size "all" exceeded the maximum partition size of 2000G. We set the partition size to the maximum available size

NOTICE: Your partition size "all" exceeded the maximum partition size of 2000G. We set the partition size to the maximum available size.

Такая ошибка в инсталляторе ОС в FastVPS.ru намекает, что пора погуглить, что такое GPT.

Tuesday 14 December 2010

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

vi /etc/postfix/main.cf

Добавляем в самый низ:
smtp_bind_address = ...

Применяем настройки:
/etc/init.d/postfix restart

После этого все внешние почтовые сервера будут видеть указанный IP при подключении нашего сервера:
Received: from test.domain.ru ([88.198.xx.xx])
 Но если нужно сохранить работу Postfix на ВСЕХ IP адреса, то достаточно сделать в конфиге /etc/postfix/master.cf вот так:

smtp      unix  -       -       -       -       -       smtp  -o smtp_bind_address=xx.yy.zz.ww
 

Создание шифрованных разделов на Mac OS X - TrueCrypt

PLEASE DO NOT USE IT ANYMORE http://www.truecrypt.org/downloads

Monday 13 December 2010

Всем любителям клевых Лис, рекомендуется!

Велкам http://shpilenok.livejournal.com/31166.html!

Как включить логгирование cron задач в Debian 5 Lenny?

vi /etc/rsyslog.conf

И правим строку:
#cron.* /var/log/cron.log

На:
cron.* /var/log/cron.log

Применяем настройки:
/etc/init.d/rsyslog restart

После этого все cron задачи начнут записываться в лог-файл:
/var/log/cron.log

Как привязать пользователя ISPManager к определенному IP?

vi /usr/local/ispmgr/var/userconf/ispmgr.username

И добавляем строчку:
Access ip_addr

После этого перезапускаем ISPManager:
killall ispmgr

После данных операций пользователь username сможет входить лишь с данного IP.

Friday 10 December 2010

Как заставить жить вместе apt-get / dpkg и /tmp, смонтированную как noexec?

Очень легко, открываем конфиг:
/etc/apt/apt.conf:

И добавляем там:
DPkg::Pre-Invoke{"mount -o remount,exec /tmp";};
DPkg::Post-Invoke {"mount -o remount /tmp";};

Но, обращаю внимание! /tmp уже до подключения этих команд должна быть смонтирована как noexec и с отдельного раздела!

Источник: http://www.debian-administration.org/articles/57

Thursday 9 December 2010

Итак, ждем книгу про Ассинджа :) Кто напишет быстрее всех?

Сабж =)

Как сконвертировать таблицу размещения разделов dos/mbr в GPT без потери данных?

http://www.rodsbooks.com/gdisk/mbr2gpt.html

Но я не использовал этого! Так что - на свой страх и риск, уважаемые!

Как добавить дополнительный диск (но не отдельный!) в XenServer для размещения виртуальных машин?

Итак, имеем установленный на /dev/sda XenServer и пустой (только что установленный) диск /dev/sdb:
fdisk -l

Disk /dev/sda: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 523 4194304 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 523 1045 4194304 83 Linux
/dev/sda3 1045 91201 724183393 8e Linux LVM

Disk /dev/sdb: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

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


Создаем на базе /dev/sdb физическое устройство LVM:
pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created

Убеждаемся, что все ок:
pvdisplay
--- Physical volume ---
PV Name /dev/sda3
VG Name VG_XenStorage-f7499bd4-b272-1f99-60f9-8b729e065161
PV Size 690.63 GB / not usable 9.78 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 176800
Free PE 136132
Allocated PE 40668
PV UUID c5zR7M-96Yc-wiwi-NclQ-RhCw-P9qz-5R2hUh

"/dev/sdb" is a new physical volume of "698.64 GB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 698.64 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID X3296z-a02v-3iS0-eteF-H2WA-62w3-jC0glw


Но данный диск еще не стал доступен для создания виртуальных машин на нем:
vgdisplay
--- Volume group ---
VG Name VG_XenStorage-f7499bd4-b272-1f99-60f9-8b729e065161
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 58
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 6
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 690.62 GB
PE Size 4.00 MB
Total PE 176800
Alloc PE / Size 40668 / 158.86 GB
Free PE / Size 136132 / 531.77 GB
VG UUID cEjZ1H-xTE2-e2fv-9grZ-bjDW-nU3g-lAAITl

Теперь нам нужно расширить на эти дополнительные 600+ гигабайт существующий Volume Group "VG_XenStorage-f7499bd4-b272-1f99-60f9-8b729e065161":
vgextend VG_XenStorage-f7499bd4-b272-1f99-60f9-8b729e065161 /dev/sdb

Вуаля:
vgdisplay
--- Volume group ---
VG Name VG_XenStorage-f7499bd4-b272-1f99-60f9-8b729e065161
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 59
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 6
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 1.36 TB
PE Size 4.00 MB
Total PE 355651
Alloc PE / Size 40668 / 158.86 GB
Free PE / Size 314983 / 1.20 TB
VG UUID cEjZ1H-xTE2-e2fv-9grZ-bjDW-nU3g-lAAITl


После этого, чтобы получить доступ ко всему дисковому пространству необходима перезагрузка:
shutdown -r now

Но, обращаю внимание, данная конфигурация крайне небезопасна, используйте аппаратные RAID контроллеры!

Источник: http://support.citrix.com/article/CTX116176

Wednesday 8 December 2010

Как посредством echo в Linux вывести перевод строки?

Для этого нужно включить ключик -e, который активирует обработку backspash последовательностей:
echo -e "print\nnewline"
print
newline

Tuesday 7 December 2010

Баг с source пакетом от Apache2 в Debian

Актуальная версия Apache в Debian сейчас lenny8, но исходники Апача упорно качаются от 7го:

# dpkg -l | grep 'apache2 '
ii apache2 2.2.9-10+lenny8 Apache HTTP Server metapackage

# apt-get clean
# apt-get source apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
Need to get 6546kB of source archives.
Get:1 http://security.debian.org lenny/updates/main apache2 2.2.9-10+lenny7 (dsc) [1682B]
Get:2 http://security.debian.org lenny/updates/main apache2 2.2.9-10+lenny7 (tar) [6397kB]
Get:3 http://security.debian.org lenny/updates/main apache2 2.2.9-10+lenny7 (diff) [147kB]
Fetched 6546kB in 6s (1012kB/s)
gpg: Signature made Sun 28 Mar 2010 10:07:07 PM MSD using DSA key ID AE3BE9AA
gpg: Can't check signature: public key not found
dpkg-source: extracting apache2 in apache2-2.2.9
dpkg-source: info: unpacking apache2_2.2.9.orig.tar.gz
dpkg-source: info: applying apache2_2.2.9-10+lenny7.diff.gz

sources.list (это этом не используется заpinивание пакаджей):
cat /etc/apt/sources.list
deb ftp://mirror.hetzner.de/debian/packages lenny main contrib non-free
deb ftp://mirror.hetzner.de/debian/security lenny/updates main contrib non-free

deb http://ftp.de.debian.org/debian lenny main non-free contrib
deb-src http://ftp.de.debian.org/debian lenny main non-free contrib

deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free

Бага / фича?

Update: видимо, какое-то из зеркал тупит, на другой машине не воспроизвелось и стянуло lenny8.

Спецификация протокола RTMP

http://www.adobe.com/devnet/rtmp.html

PDF спецификации: http://www.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf

Спецификация форматов flv и f4v

http://www.adobe.com/devnet/f4v.html

PDF с спецификацией: http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

Руководство по написанию безопасных программ от НАСА

http://www.hq.nasa.gov/office/codeq/doctree/871913.pdf

Monday 6 December 2010

Установка Red5 на Windows XP / 2008

1. Открываем страницу загрузки Red5: http://www.red5.org/wiki/0_9_1
2. Выбираем там: Windows
3. Ждем пока скачается файл setup-Red5-0.9.1.exe
4. Запускаем его
5. Next
6. I agree
7. Next
8. Install
9. Будет выдано окошко "Enter IP address for your server". И при тесте локально дома нужно сюда вписать: 127.0.0.1, при тесте, когда будет тестироваться нагрузка (по локалке), нужно будет вносить сюда IP адрес машины, на которую ставим, в локальной сети (192.168.*.*).
10. Будет выдано окошко "Enter port number to use for http requests", вводим в него: 5080
11. Next
12. Finish

После этого, чтобы запустить Red5 щелкаем по "Мой компьютер" правой кнопкой мыши, выбираем "Управление", внизу щелкаем по "Службы и приложения", разворачиваем список и внутри него из 3х пунктов выбираем: Службы. Потом справа выбираем Red5 и в левом (но не самом левом!) меню выбираем "Запустить службу", через несколько мгновений она запусится.

Все, установка закончена, открываем в браузере: http://127.0.0.1:5080/ (или, если тесты идут в локальной сети, вместо 127.0.0.1 выбираем 192.68.*.*). Должна появиться цветастая страница Red5. Все, сервер установлен и будет автоматически загружаться при запуске системы.

Установка JRE на WIndows XP

1. Открываем страницу загрузки инсталлятора Java: http://javadl.sun.com/webapps/download/AutoDL?BundleId=44398
2. После этого начнется загрузка файла "jre-6u22-windows-i586-s.exe", дожидаемся окончания загрузки.
3. Запускаем инсталлятор
4. На главной странице инсталлятора щелкаем "Install" в нижнем правом углу.
5. Щелкаем Close в инсталляторе
6. Java установлена :)

Есть два Debian репозитория и пакет с одинаковыми версиями в обоих

Есть ли вариант сделать повышенный приоритет для одного из репозиториев? Или только pin отдельных пакетов?

Sunday 5 December 2010

Интересная опция Linux ядра

ip_nonlocal_bind - BOOLEAN If set, allows processes to bind() to non-local IP addresses, which can be quite useful - but may break some applications.

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

Что такое TIME_WAIT статус tcp сокета в Linux?

http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7

В двух словах:
When you close a socket, the server goes into a TIME_WAIT state, just to be really really sure that all the data has gone through

А вот пару слов, почему они могут быть вредны, эти самые TIME_WAIT соединения: http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions

Есть пара вариантов, как избежать пагубного влияния большого числа TIME_WAIT на обработку соединений, они включаются ключами sysctl:
tcp_tw_recycle - BOOLEAN
Enable fast recycling TIME-WAIT sockets. Default value is 0. It should not be changed without advice/request of technical experts.

tcp_tw_reuse - BOOLEAN
Allow to reuse TIME-WAIT sockets for new connections when it is safe from protocol viewpoint. Default value is 0. It should not be changed without advice/request of technical experts.

Источник: документация ядра Линукс, Documentation/networking/ip-sysctl.txt

Типы состояния tcp сокетов в Linux

ESTABLISHED The socket has an established connection.
SYN_SENT The socket is actively attempting to establish a connection.
SYN_RECV A connection request has been received from the network.
FIN_WAIT1 The socket is closed, and the connection is shutting down.
FIN_WAIT2 Connection is closed, and the socket is waiting for a shutdown from the remote end.
TIME_WAIT The socket is waiting after close to handle packets still in the network.
CLOSE The socket is not being used.
CLOSE_WAIT The remote end has shut down, waiting for the socket to close.
LAST_ACK The remote end has shut down, and the socket is closed. Waiting for acknowledgement.
LISTEN The socket is listening for incoming connections. Such sockets are not included in the output unless you specify the --listening (-l) or --all (-a) option.
CLOSING Both sockets are shut down but we still don’t have all our data sent.
UNKNOWN The state of the socket is unknown.

Источник: man netstat

Nginx + memcached = connect() to 127.0.0.1:11211 failed (99: Cannot assign requested address) while connecting to upstream

При нагрузочном тестировании:
ab -c 45 -n 1000000 http://domain.ru/

Вот такая радость в логах Nginx 0.7.65:
2010/12/05 21:54:14 [crit] 21537#0: *14117 connect() to 127.0.0.1:11211 failed (99: Cannot assign requested address) while connecting to upstream, client: xx.xx.xx.xx server: domain.ru, request: "POST /test.php HTTP/1.1", subrequest: "/test.php", upstream: "memcached://127.0.0.1:11211", host: "domain.ru"

Как симптом море TIME_WAIT ов:
netstat -an |grep TIME_WAIT | grep 11211 | wc -l
24203

Фиксить нужно так:
Нужно увеличить число исходящих портов. Как это сделать в Линуксе - не знаю.
--
Игорь Сысоев

Но проблема в том, что пул этих адресов итак огромен:
sysctl -a|grep range
net.ipv4.ip_local_port_range = 32768 61000

Далее идет вот такое обсуждение перенастройки на 1024-65535:
now my benchmark test works fine. are there any other problems
when i run debian with this large port range?

No, there should no be problems.
You may set 1024-65535.

Есть еще вариант:
sysctl -a | grep recycl
net.ipv4.tcp_tw_recycle = 0

sysctl -a | grep reuse
net.ipv4.tcp_tw_reuse = 0

Итого, резюмируя, лично я делаю так (18000 потому, что с 21 по 17900 у меня висят различные демоны):
echo "net.ipv4.ip_local_port_range = 18000 61000" >> /etc/sysctl.conf
sysctl -p

И не забываем перезаупстить Nginx:
/etc/init.d/nginx restart

Итого, мы где-то на 15 000 портов расширили интервал исходящих портов и ошибка должна исчезнуть.

Источник: вот и вот

Очень простое написание демонов на Perl с использованием Proc::Daemon (Debian)

Для сабжа есть прекрасный модуль:
http://search.cpan.org/~deti/Proc-Daemon-0.05/lib/Proc/Daemon.pod

Также для защиты от запуска нескольких экземпляров нам понадобится модуль Proc::PID::File.

Устанавливаем его и модуль Proc::PID::File:
apt-get install -y libproc-daemon-perl libproc-pid-file-perl

Начинаем использовать:
#!/usr/bin/perl

use strict;
use warnings;

use Proc::Daemon;
use Proc::PID::File;

# Daemonize
Proc::Daemon::Init();

# Если демон уже запущен, то просто выходим.
if (Proc::PID::File->running()) {
print "Already running\n";
exit 0;
}

# инициализируем демона

# Enter loop to do work
for (;;) {
# выполняем циклическую задачу
}

Вот и все :)

Предвкушая вопрос, почему проверяем демона на существование после демонизации:
Returns true when the process is already running. Please note that this call must be made *after* daemonisation i.e. subsequent to the call to fork(). If the verify flag was set during the instance creation, the process id is verified, alternatively the flag may be passed directly to this method.

По поводу защиты от запуска нескольких экземпляров - она работает прекрасно, pid файл создается в папке /var/run:
ls -la /var/run/ | grep pl
-rw-rw-rw- 1 root root 6 2010-12-05 21:21 mydaemon.pl.pid

Источник: http://www.perlmonks.org/index.pl?node_id=478839

Последовательность запуска задач в пределах заданного runlevel в Debian

С пониманием, когда запускается какой runlevel, обычно проблем нету, но есть проблемы с пониманием, как задачи упорядочиваются внутри конкретного runlevel. Рассмотрим на примере /etc/rcS.d/. В данной папке есть очень много файлов с именами вида SNNимя, где NN - двухзначное число:
ls
README S05keymap.sh S20module-init-tools S35quota S45mountnfs.sh S70x11-common
S01glibc.sh S07hdparm S25mdadm-raid S36mountall-bootclean.sh S46mountnfs-bootclean.sh S75sudo
S02hostname.sh S08hwclockfirst.sh S26lvm2 S36udev-mtab S47lm-sensors S99stop-bootlogd-single
S02mountkernfs.sh S10checkroot.sh S30checkfs.sh S37mountoverflowtmp S48console-screen.sh
S03udev S11hwclock.sh S30procps S39ifupdown S55bootmisc.sh
S04mountdevsubfs.sh S12mtab.sh S34fuse S40networking S55urandom
S05bootlogd S18ifupdown-clean S35mountall.sh S43portmap S70screen-cleanup

Последовательность тут очень простая: загрузка начинается со скриптов c меньшим номером и переходит к скриптам с большим номером.

Оригинал:
The two-digit number mm is used to determine the order in which to run the scripts: low-numbered links have their scripts run first. For example, the K20 scripts will be executed before the K30 scripts. This is used when a certain service must be started before another. For example, the name server bind might need to be started before the news server inn so that inn can set up its access lists. In this case, the script that starts bind would have a lower number than the script that starts inn so that it runs first:
/etc/rc2.d/S17bind
/etc/rc2.d/S70inn

Есть очень удобный способ просмотра последовательности запуска:
find /etc/rcS.d/ | sort -g
/etc/rcS.d/
/etc/rcS.d/README
/etc/rcS.d/S01glibc.sh
/etc/rcS.d/S02hostname.sh
/etc/rcS.d/S02mountkernfs.sh
/etc/rcS.d/S03udev
/etc/rcS.d/S04mountdevsubfs.sh
/etc/rcS.d/S05bootlogd
/etc/rcS.d/S05keymap.sh
/etc/rcS.d/S07hdparm
/etc/rcS.d/S08hwclockfirst.sh
/etc/rcS.d/S10checkroot.sh
/etc/rcS.d/S11hwclock.sh
/etc/rcS.d/S12mtab.sh
/etc/rcS.d/S18ifupdown-clean
/etc/rcS.d/S20module-init-tools
/etc/rcS.d/S25mdadm-raid
/etc/rcS.d/S26lvm2
/etc/rcS.d/S30checkfs.sh
/etc/rcS.d/S30procps
/etc/rcS.d/S34fuse
/etc/rcS.d/S35mountall.sh
/etc/rcS.d/S35quota
/etc/rcS.d/S36mountall-bootclean.sh
/etc/rcS.d/S36udev-mtab
/etc/rcS.d/S37mountoverflowtmp
/etc/rcS.d/S39ifupdown
/etc/rcS.d/S40networking
/etc/rcS.d/S43portmap
/etc/rcS.d/S45mountnfs.sh
/etc/rcS.d/S46mountnfs-bootclean.sh
/etc/rcS.d/S47lm-sensors
/etc/rcS.d/S48console-screen.sh
/etc/rcS.d/S55bootmisc.sh
/etc/rcS.d/S55urandom
/etc/rcS.d/S70screen-cleanup
/etc/rcS.d/S70x11-common
/etc/rcS.d/S75sudo
/etc/rcS.d/S99stop-bootlogd-single

Источник: http://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit

Saturday 4 December 2010

CentOS + PHP 5.1.6 + eAccelerator 0.9.6.1 = не собирается

/usr/src/eaccelerator-0.9.6.1/ea_store.c: In function 'store_property_access_check':
/usr/src/eaccelerator-0.9.6.1/ea_store.c:683: error: 'zend_property_info' has no member named 'ce'

Это баг 0.9.6.1 версии eAccelerator: http://eaccelerator.net/ticket/426

Очевидный фикс: юзаем 0.9.6 версию.

Friday 3 December 2010

Как управлять VmWare ESXi ?

Посредством VmWare vSphere Client, который скачать (только под Windows), можно здесь: https://www.vmware.com/tryvmware/index.php?p=free-esxi&lp=1

Причем, утилита абсолютно бесплатна:
YOUR FREE VSPHERE HYPERVISOR REGISTRATION INCLUDES ACCESS TO
VMware ESXi 4.1
VMware vSphere Client
VMware Go

Thursday 2 December 2010

Установка ssh2 расширения для PHP на CentOS 5.5 из PECL

Ставим все необходимое для сборки:
yum install -y php-devel libssh2-devel php-pear

Собираем модуль:
pecl install -f ssh2

Подключаем ssh2 расширение к PHP:
echo "extension=ssh2.so" > /etc/php.d/ssh2.ini

Убеждаемся, что все ок:
php -m | grep ssh2
ssh2

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

Tuesday 30 November 2010

Хорошая статья по сборке .deb пакетов

http://www.opennet.ru/base/sys/debian_backport.txt.html

Можно ли выполнить бинарный код в noexec файловой системе по аналогии с интерпретируемым скриптом?

Итак, имеем noexec файловую систему /tmp, копируем туда некий бинарик:
cp /bin/ls /tmp

Пробуем его запустить напрямую:
/tmp/ls
-bash: /tmp/ls: Permission denied

А если попробовать заюзать хак, который работал некоторое время раньше (с точностью до версий ядер не скажу, но работал):
/lib64/ld-linux-x86-64.so.2 /tmp/ls
/tmp/ls: error while loading shared libraries: /tmp/ls: failed to map segment from shared object: Operation not permitted

И да, правда не нашел способа обойти :)

Источник: http://forums.grsecurity.net/viewtopic.php?f=3&t=1624

Как готовить тех поддержку?

http://www.ixbt.com/editorial/fishday/fishday-19.shtml

Monday 29 November 2010

Как в Skype выключить поток сообщений о настроении?

Настройки - Дополнительные - Снимаем галочку "Включить поток сообщений о настроении".

Генератор парсеров на C

http://www.complang.org/ragel/

Разбор YAML в Python на Centos 5.5

Формат YAML крайне удобен для всевозможных конфигов, причем, его удобно как редактировать вручную (не верите? Посмотрите примеры ниже!), так и разбирать программно, что делает его лучшим другом любого системного администратора :)

Устанавливаем библиотеку для разбора Python формата:
yum install -y PyYAML

Вот пример использования библиотеки:
#!/usr/bin/python

import yaml

document = """
  servers1:
    - host1
    - host2
  srver2:
    - hosta
    - hostb
"""
print yaml.dump(yaml.load(document))

После запуска выдача будет иметь примерно такой вид, то есть, у нас получился хеш с двумя ключами, по каждому из которых лежат списки узлов:
python generate_config.py
servers1: [host1, host2]
srver2: [hosta, hostb]

Немного усложним пример - вынесем блок данных yaml в отдельный файл, config.yaml:
servers1:
  - host1
  - host2
ssrvers2:
  - hosta
  - hostb

Python скрипт же примет вид:
#!/usr/bin/python

import yaml

document = file('config.yaml', 'r')
print yaml.dump(yaml.load(document)

Результат его работы будет аналогичный предыдущему.

Вот так довольно легко и непринужденно можно рисовать конфиг-файлы для своих скриптов :)

Источник: http://pyyaml.org/wiki/PyYAMLDocumentation

Saturday 27 November 2010

Конфиг для JW Player для приема RTMP потока

Вот такой вот:

s1.addVariable('streamer','rtmp://xx.xx.xx.xx/oflaDemo');
s1.addVariable('file', 'stream129088sadasd');

Может ли JW Player транслировать поток RTMP?

Progressive Download, HTTP Psuedo-streaming, & RTMP Streaming
Flash Media Server (FMS) and Wowza Media Server
Bitrate switching and DVR support
Native support for CDNs: Akamai, Amazon CloudFront, BitGravity, CDNetworks, Highwinds, and Limelight

Источник: http://www.longtailvideo.com/players/jw-player/features/

Установка lighttpd на Debian 5 Lenny с поддержкой трансляции flv видео

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

После установки он автоматически запустится и будет слушать 80й порт:
netstat -lnpt | grep light
tcp6 0 0 :::80 :::* LISTEN 9941/lighttpd

Далее в качестве теста попробуем открыть страничку: http://ip_address_вашего_сервера/, в ответ нас должно поприветствовать веселым "Placeholder page".

Подключаем поддержку flv (более подробно тут):
vi /etc/lighttpd/lighttpd.conf

Ищем внизу файла строку:
# "mod_flv_streaming",
И убираем в ее начале знак комментария.

Также чуть ниже блока server.modules следом за его закрывающейся скобкой добавляем:
flv-streaming.extensions = ( ".flv" )

После этого применяем изменения посредством перезапуска lighttpd:
/etc/init.d/lighttpd restart

Стриминг flv видео посредством lighttpd

Итак, у нас есть готовый видео файл в формате flv: http://phpsuxx.blogspot.com/2010/11/dvd-video-flv-debian-5-linux.html и теперь стоит задача настроить трансляцию этого видео с работающей перемоткой в браузер с поддержкой flash.

Для работоспособности перемотки нужно добавить мета информацию (http://kovyrin.net/2006/10/08/lighttpd-memcoder-flvtool-for-streaming/),
более конкретно, что именно за информацию я пока сказать не могу, не
изучал вопрос настолько хорошо.

Для этого ставим flvtool2:
apt-get install -y flvtool2

Итак, сначала наш файл не содержит никакой мета-информации:
flvtool2 -P outputfile.flv
---
/opt/ssau_film/outputfile.flv:
duration: 723.52
audiosamplerate: 22050
framerate: 25
audiosamplesize: 16
stereo: true
videocodecid: 2
filesize: 40900644
height: 576
audiocodecid: 2
videodatarate: 0
width: 720
...


Далее добавляем метаданные к созданному нами файлику (но лучше, конечно, выдавать результат в другой файл, чтобы не перезаписывать оригинал):
flvtool2 -PU outputfile.flv

Теперь повторно запросим информацию о мета-данных:
flvtool2 -P outputfile.flv
---
/opt/ssau_film/outputfile.flv:
duration: 723.52
hasMetadata: true
hasKeyframes: true
framerate: 25
datasize: 40724054
audiodatarate: 35.1694144965998
audiosamplerate: 22000
cuePoints:
audiosamplesize: 16
hasVideo: true
lasttimestamp: 723.48
videocodecid: 2
canSeekToEnd: false
stereo: true
audiosize: 3484883
lastkeyframetimestamp: 715.32
videosize: 37232469
audiodelay: 0
hasAudio: true
filesize: 40907095
height: 576
keyframes:
filepositions:
- 6727
- 29382
- 40182
- 51024
тут еще очень много циферок
- 40052758
- 40120879
- 40216540
- 40257801
- 40330333
- 40585739
times:
- 0
- 0.08
- 0.12
- 0.16
- 0.2
тут еще много циферок
- 217.6
- 221.6
- 221.64
- 221.68
- 221.72
- 221.76
- 221.8
- 221.84
- 225.52
- 226.96
- 228.16
- 229.56
- 233.28
- 238.32
- 240.88
- 242.16
тут также много-много циферок
- 709.8
- 712.04
- 715.32
videodatarate: 409.50407474982
audiocodecid: 2
metadatacreator: inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2
metadatadate: Sat Nov 27 13:16:56 GMT+0300 2010
width: 720
hasCuePoints: false
...


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

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

Теперь копируем в папку веб-сервера наш flv файл:
cp /opt/film/outputfile.flv /var/www/

Далее, для проигрывания всей этой радости нам нужен flash (swf) плейер, я предлагаю использовать FLV-Scrubber 3.x, вот его офсайт http://www.topfstedt.de/weblog/?page_id=208

Итак, качаем плейер:
cd /var/www
wget http://topfstedt.de/FLVScrubber3/FLVScrubber.swf

Далее нужно создать html файлик, в который будет встроен флеш плейер, назовем его, допустим, player.html:
<html>
<body>
<object
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0"
width="336"
height="297">
<param name="movie" value="scrubber.swf?file=/movie.flv" />
<param name="quality" value="high" />
<embed src="FLVScrubber.swf?file=/outputfile.flv"
quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash"
width="336"
height="297"></embed>
</object>
</body>
</html>

Далее открываем http://..../player.html и наслаждаемся :) Итого, у меня все отлично заработало (и даже с прокруткой!) на FireFox 3.6, Opera 10, Chrome.

Либо можно поставить JW Player, который по впечатлениям намного круче и аккуратнее.

Скачиваем дистрибутив (нам из него нужны лишь файлы player.swf, swfobject.js, yt.swf и, вроде, jwplayer.js):
cd /var/www
wget http://www.longtailvideo.com/jw/upload/mediaplayer.zip
unzip mediaplayer.zip
mv mediaplayer-5.3/* ./
rm -r mediaplayer-5.3
mkdir swf
mkdir js
mv *.js js
mv *.swf swf

Далее составляем файлик player.html следующего вида:
<html>
<body>
<p id='preview'>
The player will show in this paragraph
</p>
<script type='text/javascript' src='js/swfobject.js'></script>
<script type='text/javascript'>
var s1 = new SWFObject('swf/player.swf','player','400','300','9');
s1.addParam('allowfullscreen','true');
s1.addParam('allowscriptaccess','always');
s1.addVariable('file','http://46.4.187.234/outputfile.flv');
s1.write('preview');
</script>
</body>
</html>

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

Источник: http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5/12/install-the-jw-player-for-flash-v5

Конвертирование DVD Video в формат flv на Debian 5 Linux

Ствим mencoder: http://phpsuxx.blogspot.com/2009/11/mencoder-debian5-lenny.html

Далее открываем наш DVD в файловом менеджере и идем в папку VIDEO_TS и ищем там файлик с расширением VOB большого размера, например:
ls -la
total 1711056
dr-xr-xr-x 8 nrg staff 272 24 июн 2008 .
drwxr-xr-x 4 nrg staff 136 16 ноя 13:08 ..
-r-xr-xr-x 1 nrg staff 14336 24 июн 2008 VIDEO_TS.BUP
-r-xr-xr-x 1 nrg staff 14336 24 июн 2008 VIDEO_TS.IFO
-r-xr-xr-x 1 nrg staff 294912 24 июн 2008 VIDEO_TS.VOB
-r-xr-xr-x 1 nrg staff 22528 24 июн 2008 VTS_01_0.BUP
-r-xr-xr-x 1 nrg staff 22528 24 июн 2008 VTS_01_0.IFO
-r-xr-xr-x 1 nrg staff 875681792 24 июн 2008 VTS_01_1.VOB

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

Запускаем конвертацию:
mencoder VTS_01_1.VOB -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=150 -ofps 25 -oac mp3lame -lameopts abr:br=32 -srate 22050 -vf scale=720 -o outputfile.flv

В процессе конвертации видим вот такие красоты:
MEncoder dev-SVN-r26940 (C) 2000-2008 MPlayer Team
CPU: Intel(R) Core(TM) i7 CPU X 980 @ 3.33GHz (Family: 6, Model: 44, Stepping: 2)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
success: format: 0 data: 0x0 - 0x3431d800
MPEG-PS file format detected.
VIDEO: MPEG2 720x576 (aspect 2) 25.000 fps 9610.0 kbps (1201.2 kbyte/s)
[V] filefmt:2 fourcc:0x10000002 size:720x576 fps:25.000 ftime:=0.0400
==========================================================================
Opening audio decoder: [dvdpcm] Uncompressed DVD/VOB LPCM audio decoder
AUDIO: 48000 Hz, 2 ch, s16be, 1536.0 kbit/100.00% (ratio: 192000->192000)
Selected audio codec: [dvdpcm] afm: dvdpcm (Uncompressed DVD/VOB LPCM)
==========================================================================
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B-frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit.
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
Opening video filter: [scale w=720]
==========================================================================
Opening video decoder: [mpegpes] MPEG 1/2 Video passthrough
VDec: vo config request - 720 x 576 (preferred colorspace: Mpeg PES)
The selected video_out device is incompatible with this codec.
Try appending the scale filter to your filter list,
e.g. -vf spp,scale instead of -vf spp.
VDecoder init failed :(
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffmpeg2] vfm: ffmpeg (FFmpeg MPEG-2)
==========================================================================
MP3 audio selected.
VDec: vo config request - 720 x 576 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 1.33:1 - prescaling to correct movie aspect.
[swscaler @ 0xa1e8d0]using unscaled yuv420p -> yuv420p special converter
videocodec: libavcodec (720x576 fourcc=31564c46 [FLV1])
New_Face failed. Maybe the font path is wrong.n 0mb A-V:0.000 [0:0]
Please supply the text font file (~/.mplayer/subfont.ttf).
subtitle font: load_sub_face failed.
New_Face failed. Maybe the font path is wrong.
Please supply the text font file (~/.mplayer/subfont.ttf).
subtitle font: load_sub_face failed.
VIDEO CODEC ID: 22
AUDIO CODEC ID: 15001, TAG: 0
Writing header...

1 duplicate frame(s)!
Pos: 0.9s 22f ( 0%) 0.00fps Trem: 1min 201mb A-V:0.084 [0:7]
Skipping frame!
Pos: 1.2s 32f ( 0%) 0.00fps Trem: 1min 279mb A-V:0.084 [2085:7]
Skipping frame!
Pos: 1.6s 42f ( 0%) 0.00fps Trem: 2min 363mb A-V:0.084 [2099:7]
Skipping frame!
Pos: 720.0s 18002f (99%) 194.66fps Trem: 0min 39mb A-V:0.081 [410:34]
Skipping frame!
Pos: 720.3s 18012f (99%) 194.70fps Trem: 0min 39mb A-V:0.081 [410:34]
Skipping frame!
Pos: 720.7s 18022f (99%) 194.75fps Trem: 0min 38mb A-V:0.081 [410:34]
Skipping frame!
Pos: 721.0s 18032f (99%) 194.81fps Trem: 0min 38mb A-V:0.081 [410:34]
Skipping frame!
Pos: 721.4s 18042f (99%) 194.85fps Trem: 0min 38mb A-V:0.081 [410:34]
Skipping frame!
Pos: 721.8s 18052f (99%) 194.91fps Trem: 0min 38mb A-V:0.081 [410:34]
Skipping frame!
Pos: 722.1s 18062f (99%) 194.96fps Trem: 0min 38mb A-V:0.081 [409:34]
Skipping frame!
Pos: 722.5s 18072f (100%) 195.00fps Trem: 0min 38mb A-V:0.081 [409:34]
Skipping frame!
Pos: 722.8s 18082f (100%) 195.07fps Trem: 0min 39mb A-V:0.081 [409:34]
Skipping frame!
Pos: 723.2s 18092f (100%) 195.13fps Trem: 0min 39mb A-V:0.081 [409:34]
Skipping frame!
Pos: 723.6s 18102f (100%) 195.20fps Trem: 0min 39mb A-V:0.081 [409:34]
Flushing video frames.
Writing index...

Video stream: 409.259 kbit/s (51157 B/s) size: 37015413 bytes 723.560 secs 18102 frames

Audio stream: 34.900 kbit/s (4362 B/s) size: 3152879 bytes 722.730 secs

И в итоге наш огромный 800 мегабайтный файл DVD Video превращается в аккуратные 40 мегабайт flv:
ls -lah outputfile.flv
-rw-r--r-- 1 root root 40M Nov 27 12:54 outputfile.fldvd

Но, к слову, полученный мною файл не читался даже плейером VLC, что странно. Но при заливке на YouTube все хорошо смотрелось и слушалось :)

Источник: http://wiki.soslug.org/wiki/vob_to_flv

Как работает Apache Per User MPM?

http://www.peruser.org/trac/peruser/wiki/PeruserUnderTheHood

Из фундаментальных отличий от prefork - наличие мультиплексор (третий тип) процесса, который принимает соединение, определяет, на какой vhost оно идет и передает соединение нужному рабочему процессу.

Friday 26 November 2010

Как проанализировать, кто отправил больше всех писем в Postfix?

Легко, тулзой: pflogsumm

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

Запускаем отчет за сегодня:
pflogsumm.pl -d today /var/log/mail.log

Или за вчера:
pflogsumm.pl -d yesterday /var/log/mail.log

Понятностью и полнотой эти отчеты не блещут, но какой-никакой инструмент.

/usr/local/ispmgr/bin/vdsmgr: error while loading shared libraries: libmgr.so.14: cannot open shared object file: No such file or directory

Вот такая проблема с VDSManager:
/usr/local/ispmgr/bin/vdsmgr
/usr/local/ispmgr/bin/vdsmgr: error while loading shared libraries: libmgr.so.14: cannot open shared object file: No such file or directory

Фикс:
cp /usr/local/ispmgr/lib/libmgr.so.13 /usr/local/ispmgr/lib/libmgr.so.14
/usr/local/ispmgr/bin/vdsmgr

Глобальный фикс: запретите этому софту апдейт, вообще, навсегда следующей директивой в конфиг:
vi /usr/local/ispmgr/etc/vdsmgr.conf

Option DisableAutoUpdate

И перезапускаем:
killall -9 vdsmgr

Wednesday 24 November 2010

Руководство для разработчиков под Apache 2

http://httpd.apache.org/docs/2.2/developer/

Как подружить APC и phpmyadmin (Debian 5 Lenny)?

При работе данных программ вместе наблюдается полная неработоспособность phpmyadmin, сопровождающаяся следующими ошибками в логе ошибок Апача:
[Wed Nov 24 10:34:59 2010] [notice] child pid 13706 exit signal Segmentation fault (11)
[Wed Nov 24 10:35:34 2010] [notice] child pid 13648 exit signal Segmentation fault (11)
[Wed Nov 24 10:35:42 2010] [notice] child pid 23979 exit signal Segmentation fault (11)
[Wed Nov 24 10:36:43 2010] [notice] child pid 15875 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:13 2010] [notice] child pid 16171 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:14 2010] [notice] child pid 17420 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:16 2010] [notice] child pid 4038 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:17 2010] [notice] child pid 17928 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:41 2010] [notice] child pid 17977 exit signal Segmentation fault (11)
[Wed Nov 24 10:37:56 2010] [notice] child pid 17978 exit signal Segmentation fault (11)
[Wed Nov 24 10:40:06 2010] [notice] child pid 17957 exit signal Segmentation fault (11)
[Wed Nov 24 10:40:11 2010] [notice] child pid 19791 exit signal Segmentation fault (11)

Чтобы избавится от проблемы, нужно отключить APC для PhpMyAdmin, для этого открываем конфиг:
vi /etc/apache2/conf.d/phpmyadmin.conf

И внутри блока Directory добавляем:
php_admin_flag apc.enabled Off

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

И наслаждаемся работоспособностью PhpMyAdmin`а :)

Источник: http://pecl.php.net/bugs/bug.php?id=16945&edit=1

Tuesday 23 November 2010

Как корректно настроить spf для Gmail?

Из рекомендации от Google, следует, что для обеспечения корректной работы Gmail при использовании spf записей следует добавить следующую директиву в spf запись:
include:_spf.google.com

Итого, полностью запись (для примера из http://phpsuxx.blogspot.com/2010/11/ispmanager-spf.html) будет иметь вот такой вид:

v=spf1 ip4:188.40.60.215 a mx include:_spf.google.com ~all

Замечания

Много где в сети рекомендуется прописывать aspmx.googlemail.com, но это не правильно, так как он ссылается на _spf.google.com, который рекомендован к использованию:
host -t txt aspmx.googlemail.com
aspmx.googlemail.com descriptive text "v=spf1 redirect=_spf.google.com"

Ресурсная же запись _spf.google.com содержит все сети, с которых может прийти почта от Google:
host -t txt _spf.google.com
_spf.google.com descriptive text "v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:209.85.128.0/17 ip4:66.102.0.0/20 ip4:74.125.0.0/16 ip4:64.18.0.0/20 ip4:207.126.144.0/20 ip4:173.194.0.0/16 ?all"

ISPManager, spf и защита от СПАМа

При создании любой доменной зоны ISPManager создает также и spf запись:

nslookup -type=TXT mylivenotes.ru
Server: 192.168.155.1
Address: 192.168.155.1#53

Non-authoritative answer:
mylivenotes.ru text = "v=spf1 ip4:188.40.60.215 a mx ~all"

Authoritative answers can be found from:
mylivenotes.ru nameserver = ns4.fastvps.ru.
mylivenotes.ru nameserver = ns3.fastvps.ru.


Что же означает строка "v=spf1 ip4:188.40.60.215 a mx ~all", а означает она то, что отправка почтовых писем, у которых в адресе отправителя (поле FROM) указан домен mylivenotes.ru допустима c IP 188.40.60.215, всех серверов, указанных как MX, а также с IP, соответствующего A записи самого домена, то есть, в данном случае:
host -t A mylivenotes.ru
mylivenotes.ru has address 88.198.29.129

~all означает мягкий отказ, то есть, если письмо пришло с IP, которого не было в spf записи, то оно, скорее всего, будет отправлено в СПАМ, но отброшено не будет. Возможен вариант и жесткого отказа: -all, при этом письмо, отправленное с не авторизованного IP будет отброшено и уничтожено совсем.

Более подробно: рус вики и англ вики.

А также: https://support.exabytes.com/KB/a1957/email-error-550-spf-xxxx-is-not-allowed-to-send-mail.aspx

Офсайт spf: http://www.openspf.org/SPF_Record_Syntax

Sunday 21 November 2010

Отличное решение для бэкапа баз данных на Percona Server 5.1 - xtrabackup

Ранее я писал о Percona Server - http://phpsuxx.blogspot.com/2010/10/percona-server-51-debian-5-lenny.html

А сейчас мне помогли обратить внимание на очень продвинутую тулзу для бэкапа MyISAM и InnoDB баз: http://www.percona.com/software/percona-xtrabackup/

Сравнить по пунктам с mysqldump пока не могу, но ожидайте :)

Вот сравнение с mysqldump при бэкапе-восстановлении больших баз: http://www.mysqlperformanceblog.com/2010/11/08/an-argument-for-not-using-mysqldump-in-production/

Что такое Linux Memory Overcommit?

Хорошо описано, зачем это, вот здесь: http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html

Также рекомендую к прочтению раздел "9.6 Overcommit and OOM": http://www.win.tue.nl/~aeb/linux/lk/lk-9.html

И еще вот прекрасный пост от catap`а: http://catap.ru/blog/2009/05/05/about-memory-overcommit-memory/

Для чего Apache 2.2 Prefork MPM использует shm память?

Сейчас изучаю исходный код Apache 2.2 Prefork и хотелось бы объяснить, зачем Апача использует SHM память.

Итак, имеем в почти чистой системе такую вот картину по использованию SHM памяти:
ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x0000014c 0 root 600 384 0

Запускаем Апача:
/etc/init.d/apache2 start
Starting web server: apache2.

Убеждаемся, что запустились и считаем количество тушек:
ps aux | grep apa | wc -l
8

Также обращаем внимание, что появился блок SHM памяти:
ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x0000014c 0 root 600 384 14
0x0103c460 65537 root 600 345416 7

Итак, зачем же она нужна Апачу? :)

Saturday 20 November 2010

Как восстановить побитый /etc/sasldb2?

Имеем вылетевшую авторизацию на Postfix (ну или любом другом сервисе, использующем SASL):
Nov 21 01:27:45 v1 postfix/smtpd[10701]: warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: Invalid argument

При этом с правами на sasl базу данных все хорошо:
ls -la /etc/sasldb2
-rw-r----- 1 root postfix 45K 2010-11-19 15:10 /etc/sasldb2


Но при попытке задать пользователю пароль выдается ошибка:
echo qwerty | /usr/sbin/saslpasswd2 -p -a Sendmail -u test.ru username
/etc/sasldb2: file size not a multiple of the pagesize

Листинг юзеров также не пашет:
sasldblistusers2
/etc/sasldb2: file size not a multiple of the pagesize
listusers failed

Как же пофиксить?

При попытке сделать db4.6_recover все проходит визуально хорошо:
db4.6_recover -h /etc -c -v
Finding last valid log LSN: file: 1 offset 28

Но не помогает:

sasldblistusers2
/etc/sasldb2: file size not a multiple of the pagesize
listusers failed

В итоге помогло лишь (за материал огромное спасибо snkua@jabber.ru):
$ sudo db_recover -v
*db_recover: Finding last valid log LSN: file: 3 offset 399092
*db_recover: Recovery starting from [2][887112]
*db_recover: Log sequence error: page LSN 2 322820; previous LSN 2 885276
*db_recover: Recovery function for LSN 2 887886 failed on forward pass

This error is usually the result of someone removing all of
the log files from a Berkeley DB database environment. You
can never remove all of the log files without also clearing
the database file references to the log.

You should be able to salvage your data -- see the -R and -r
options to the Berkeley DB db_dump utility.

В итоге сработало следующее:
db4.6_dump /root/sasldb2_backup -r

А также еще запасной вариант:
db4.6_dump /root/sasldb2_backup -R

Но он в моем случае выдал ошибку:
db4.6_dump: /root/sasldb2_backup: DB_VERIFY_BAD: Database verification failed

Ну и после этого нужно загрузить дамп в файл и все.

Как отучить kudzu ломать конфиги сети ifcfg-eth0, переименовывая их в ifcfg-eth0.bak?

Так понимаю, конфиг железа он (kudzu) хранит в /etc/sysconfig/hwconf, так что надо там как-то все корректировать с учетом специфики замены сетевой карты.

До замены сетевой карты имеем там нечто вот такое:
class: NETWORK
bus: PCI
detached: 0
device: eth0
driver: e100
desc: "Intel Corporation 82801EB/ER (ICH5/ICH5R) integrated LAN Controller"
network.hwaddr: 00:14:85:62:7c:97
vendorId: 8086
deviceId: 1051
subVendorId: 1458
subDeviceId: e000
pciType: 1
pcidom: 0
pcibus: 1
pcidev: 8
pcifn: 0

Меняем карту и грузим систему с LiveCD. Теперь попросим kudzu проанализировать, как же теперь зовется наша сетевая, делаем это следующей командой:
kudzu -p --class NETWORK
-
class: NETWORK
bus: PCI
detached: 0
device: eth0
desc: "Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller"
network.hwaddr: 6c:62:6d:76:2e:cc
vendorId: 10ec
deviceId: 8168
subVendorId: 1462
subDeviceId: 7522
pciType: 1
pcidom: 0
pcibus: 6
pcidev: 0
pcifn: 0

Теперь берем этот блок и заменяем им старый блок NETWORK в файле /etc/sysconfig/hwconf (не забывая заранее сменить MAC карточки в /etc/sysconfig/network-scripts/ifcfg-eth0). И перезагружаемся. При этом kudzu не переименует ifcfg-eth0 в ifcfg-eth0.bak (если бы мы не скорректировали hwconf, то это бы гарантировано произошло) и наши настройки не пропадут.

zen-kernel - vanilla ядро ++

Вот есть такая прикольная штука: http://zen-kernel.org/included-code

Friday 19 November 2010

Несколько слов о работе раздачи файлов непосредственно из puppet

http://docs.puppetlabs.com/guides/file_serving.html

Cft - автоматическая генерация манифестов для Puppet

Рекомендую: http://cft.et.redhat.com/

Установка PHP 5.3 на Debian 5 Lenny рядом с системным PHP 5.2.6

apt-get install -y mysql-client libmysqlclient15-dev

Ставим зависимости:
apt-get install -y libtidy-dev curl libcurl4-openssl-dev libcurl3 libcurl3-gnutls zlib1g zlib1g-dev libxslt1-dev libzip-dev libzip1 libxml2 libsnmp-base libsnmp15 libxml2-dev libsnmp-dev libjpeg62 libjpeg62-dev libpng12-0 libpng12-dev zlib1g zlib1g-dev libfreetype6 libfreetype6-dev libbz2-dev libxpm-dev libmcrypt-dev libmcrypt4 sqlite3 bzip2 build-essential libreadline5-dev libedit-dev libc-client2007b libc-client-dev krb5-kdc openssl

Компилируем:
cd /usr/src
wget http://de.php.net/distributions/php-5.3.3.tar.gz
tar -xf php-5.3.3.tar.gz
cd php-5.3.3
./configure -prefix=/opt/php53 -with-mysql=/usr -with-mysqli=/usr/bin/mysql_config -with-tidy=/usr -with-curl=/usr/bin -with-curlwrappers -with-openssl-dir=/usr -with-zlib-dir=/usr -enable-mbstring -with-xpm-dir=/usr -with-pdo-mysql=/usr -with-xsl=/usr -with-ldap -with-xmlrpc -with-iconv-dir=/usr -with-snmp=/usr -enable-exif -enable-calendar -with-bz2=/usr -with-mcrypt=/usr -with-gd -with-jpeg-dir=/usr -with-png-dir=/usr -with-zlib-dir=/usr -with-freetype-dir=/usr -enable-mbstring -enable-zip -with-pear -with-imap -with-kerberos -with-imap-ssl -with-imagick -with-readline -with-libedit
make install

Проверяем работспособность PHP cli:
/opt/php53/bin/php -v
PHP 5.3.3 (cli) (built: Nov 19 2010 17:49:19)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

Проверяем работу PHP cgi/fcgi:
/opt/php53/bin/php-cgi -v
PHP 5.3.3 (cgi-fcgi) (built: Nov 19 2010 17:49:13)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

Источник: http://www.howtoforge.com/install-php-5.3.0-lighttpd-on-debian-lenny-with-imap-mysql-sqlite3-and-imagemagick-support

Thursday 18 November 2010

Сборка spawn-fcgi 1.6.3 из исходников

Update:
В Debian Squeeze все ок и пересборка не требуется, версия новая:
spawn-fcgi -v
spawn-fcgi v1.6.3 (ipv6) - spawns FastCGI processes
Build-Date: Sep 24 2009 18:52:51

Менеджер процессов, который идет в комплекте с lighttpd в Lenny довольно малофункциональный - он умеет форкать лишь несколько тушек PHP, используя лишь встроенный механизм PHP (PHP_FCGI_CHILDREN), который не особенно надежен. Чтобы добавить поддержку полноценных отдельных процессов (в каждом из которых, в свою очередь может быть несколько тушек самого PHP, посредством выше упомянутого PHP_FCGI_CHILDREN) нужно собрать новый spawn-fcgid из исходников.

Вот данные старого:
spawn-fcgi -v
spawn-fcgi-1.4.19 - spawns fastcgi processes

spawn-fcgi -?
spawn-fcgi v1.4.19 - spawns fastcgi processes

Options:
-f fcgiapp filename of the fcgi-application
-a addr bind to ip address
-p port bind to tcp-port
-s path bind to unix-domain socket
-C childs (PHP only) numbers of childs to spawn (default 5)
-P path name of PID-file for spawed process
-n no fork (for daemontools)
-v show version
-h show this help
(root only)
-c dir chroot to directory
-u user change to user-id
-g group change to group-id


Собираем новый:
cd /usr/src
wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
tar -xf spawn-fcgi-1.6.3.tar.gz
cd spawn-fcgi-1.6.3
./configure --prefix=/opt/spawn-fcgi
make install

Вуаля:
/opt/spawn-fcgi/bin/spawn-fcgi -?
Usage: spawn-fcgi [options] [-- fcgiapp [fcgi app arguments]]

spawn-fcgi v1.6.3 (ipv6) - spawns FastCGI processes

Options:
-f path filename of the fcgi-application (deprecated; ignored if
is given; needs /bin/sh)
-d directory chdir to directory before spawning
-a address bind to IPv4/IPv6 address (defaults to 0.0.0.0)
-p port bind to TCP-port
-s path bind to Unix domain socket
-M mode change Unix domain socket mode
-C children (PHP only) numbers of childs to spawn (default: not setting
the PHP_FCGI_CHILDREN environment variable - PHP defaults to 0)
-F children number of children to fork (default 1)
-P path name of PID-file for spawned process (ignored in no-fork mode)
-n no fork (for daemontools)
-v show version
-?, -h show this help
(root only)
-c directory chroot to directory
-S create socket before chroot() (default is to create the socket
in the chroot)
-u user change to user-id
-g group change to group-id (default: primary group of user if -u
is given)
-U user change Unix domain socket owner to user-id
-G group change Unix domain socket group to group-id

То есть, теперь ключиком -F можно задать число тушек.

Вот пример запуска PHP для работы в режиме FastCGI режиме (-C рекомендуется в районе 2х штук, -F подстраивается в зависимости от количества свободной памяти):
/opt/spawn-fcgi/bin/spawn-fcgi -U www-data -G www-data -p 9001 -F 2 -C 3 -f php-cgi

Как отсортировать текст sort`ом в соответствие с номерами версий?

У sort новых версий (например, в Ubuntu 10.10) есть замечательный ключ -V, который работает вот так:
-V, --version-sort natural sort of (version) numbers within text

Допустим, у нас есть вот такие данные о версиях:
git tag -l | grep '2.6.35'
Linaro-2.6.35-1000.2
Linaro-2.6.35-1000.3
Linaro-2.6.35-1001.5
Linaro-2.6.35-1002.6
Linaro-2.6.35-1003.7
Linaro-2.6.35-1004.8
Linaro-2.6.35-1004.9
Linaro-2.6.35-1005.10
Linaro-2.6.35-1006.11
Linaro-2.6.35-1006.12
Linaro-2.6.35-1007.13
Linaro-2.6.35-1008.14
Linaro-2.6.35-1008.15
Ubuntu-2.6.35-1.1
Ubuntu-2.6.35-10.15
Ubuntu-2.6.35-11.16
Ubuntu-2.6.35-12.17
Ubuntu-2.6.35-13.18
Ubuntu-2.6.35-14.19
Ubuntu-2.6.35-14.20
Ubuntu-2.6.35-15.21
Ubuntu-2.6.35-16.22
Ubuntu-2.6.35-17.23
Ubuntu-2.6.35-18.24
Ubuntu-2.6.35-19.25
Ubuntu-2.6.35-19.26
Ubuntu-2.6.35-19.27
Ubuntu-2.6.35-19.28
Ubuntu-2.6.35-2.2
Ubuntu-2.6.35-2.3
Ubuntu-2.6.35-20.29
Ubuntu-2.6.35-21.30
Ubuntu-2.6.35-21.31
Ubuntu-2.6.35-22.32
Ubuntu-2.6.35-22.33
Ubuntu-2.6.35-22.34
Ubuntu-2.6.35-22.35
Ubuntu-2.6.35-23.36
Ubuntu-2.6.35-23.37
Ubuntu-2.6.35-23.38
Ubuntu-2.6.35-23.39
Ubuntu-2.6.35-3.4
Ubuntu-2.6.35-4.5
Ubuntu-2.6.35-5.6
Ubuntu-2.6.35-6.7
Ubuntu-2.6.35-6.8
Ubuntu-2.6.35-6.9
Ubuntu-2.6.35-7.10
Ubuntu-2.6.35-7.11
Ubuntu-2.6.35-7.12
Ubuntu-2.6.35-8.13
Ubuntu-2.6.35-9.14
Ubuntu-2.6.35-903.10
Ubuntu-2.6.35-903.11
Ubuntu-2.6.35-903.12
Ubuntu-2.6.35-903.13
Ubuntu-2.6.35-903.14
Ubuntu-2.6.35-903.15
Ubuntu-2.6.35-903.16
Ubuntu-2.6.35-903.17
Ubuntu-2.6.35-903.18
Ubuntu-2.6.35-903.19
Ubuntu-2.6.35-903.8
Ubuntu-2.6.35-903.9
v2.6.35

Читать крайне неудобно и непонятно, заюзаем sort -V:
git tag -l | grep '2.6.35' | sort -V
Linaro-2.6.35-1000.2
Linaro-2.6.35-1000.3
Linaro-2.6.35-1001.5
Linaro-2.6.35-1002.6
Linaro-2.6.35-1003.7
Linaro-2.6.35-1004.8
Linaro-2.6.35-1004.9
Linaro-2.6.35-1005.10
Linaro-2.6.35-1006.11
Linaro-2.6.35-1006.12
Linaro-2.6.35-1007.13
Linaro-2.6.35-1008.14
Linaro-2.6.35-1008.15
Ubuntu-2.6.35-1.1
Ubuntu-2.6.35-2.2
Ubuntu-2.6.35-2.3
Ubuntu-2.6.35-3.4
Ubuntu-2.6.35-4.5
Ubuntu-2.6.35-5.6
Ubuntu-2.6.35-6.7
Ubuntu-2.6.35-6.8
Ubuntu-2.6.35-6.9
Ubuntu-2.6.35-7.10
Ubuntu-2.6.35-7.11
Ubuntu-2.6.35-7.12
Ubuntu-2.6.35-8.13
Ubuntu-2.6.35-9.14
Ubuntu-2.6.35-10.15
Ubuntu-2.6.35-11.16
Ubuntu-2.6.35-12.17
Ubuntu-2.6.35-13.18
Ubuntu-2.6.35-14.19
Ubuntu-2.6.35-14.20
Ubuntu-2.6.35-15.21
Ubuntu-2.6.35-16.22
Ubuntu-2.6.35-17.23
Ubuntu-2.6.35-18.24
Ubuntu-2.6.35-19.25
Ubuntu-2.6.35-19.26
Ubuntu-2.6.35-19.27
Ubuntu-2.6.35-19.28
Ubuntu-2.6.35-20.29
Ubuntu-2.6.35-21.30
Ubuntu-2.6.35-21.31
Ubuntu-2.6.35-22.32
Ubuntu-2.6.35-22.33
Ubuntu-2.6.35-22.34
Ubuntu-2.6.35-22.35
Ubuntu-2.6.35-23.36
Ubuntu-2.6.35-23.37
Ubuntu-2.6.35-23.38
Ubuntu-2.6.35-23.39
Ubuntu-2.6.35-903.8
Ubuntu-2.6.35-903.9
Ubuntu-2.6.35-903.10
Ubuntu-2.6.35-903.11
Ubuntu-2.6.35-903.12
Ubuntu-2.6.35-903.13
Ubuntu-2.6.35-903.14
Ubuntu-2.6.35-903.15
Ubuntu-2.6.35-903.16
Ubuntu-2.6.35-903.17
Ubuntu-2.6.35-903.18
Ubuntu-2.6.35-903.19
v2.6.35

Очевидно, сортированный вариант намного удобнее :)

Лимитирование полосы пропускания посредством tc на Linux

http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/

Сборка ядра для Ubuntu 10.10 из git репозитория Ubuntu.

Вот официальный общий мануал: https://help.ubuntu.com/community/Kernel/Compile

А вот конкретно под 10.10:
http://blog.avirtualhome.com/2010/11/06/how-to-compile-a-ubuntu-10-10-maverick-kernel/

А вот мануал по работе с git репозиториями ядра от Ubuntu: https://wiki.ubuntu.com/Kernel/Dev/KernelGitGuide?action=show&redirect=KernelTeam/KernelGitGuide

В ближайшее время нарисую свой мануал :)

В чем отличия редакций server, virtual и generic в Ubuntu 10.10?

Итак, Вы решили поставить новое ядро в Ubuntu 10.10 (ну или любом из новых) и тут Вас постигает шок от огромного выбора редакций ядер (я рассматриваю лишь 64 битные ядра):
apt-cache search linux-image
alsa-base - ALSA driver configuration files
linux-image - Generic Linux kernel image.
linux-image-2.6.32-305-ec2 - Linux kernel image for version 2.6.32 on x86/x86_64
linux-image-ec2 - Linux kernel image for ec2 machines
linux-image-generic - Generic Linux kernel image
linux-image-server - Linux kernel image on Server Equipment.
linux-image-virtual - Linux kernel image for virtual machines
linux-image-2.6.35-22-generic - Linux kernel image for version 2.6.35 on x86/x86_64
linux-image-2.6.35-22-server - Linux kernel image for version 2.6.35 on x86_64
linux-image-2.6.35-22-virtual - Linux kernel image for version 2.6.35 on x86/x86_64

Немного скудной информации об этом есть здесь: https://help.ubuntu.com/10.10/serverguide/C/preparing-to-install.html#intro-kernel-diffs

Согласно ей, в редакции server имеются следующие отличия:
1. The Server Edition uses the Deadline I/O scheduler instead of the CFQ scheduler used by the Desktop Edition.

2. Preemption is turned off in the Server Edition.

3. The timer interrupt is 100 Hz in the Server Edition and 250 Hz in the Desktop Edition.

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

Стягиваем исходники ядра:
apt-get install linux-source-2.6.35 -y

Переходим в папку исходников:
cd /usr/src/linux-source-2.6.35

После недолгих поисков в папке debian.master/config/amd64/ обнаруживаем конфиги ядра для каждой из редакций (в терминологии авторов "различных flavour", то есть, ядра с различными вкусами, ага).

ls -la debian.master/config/amd64/
total 28
drwxr-xr-x 2 root root 4096 Nov 18 03:00 .
drwxr-xr-x 6 root root 4096 Nov 18 03:00 ..
-rw-r--r-- 1 root root 7054 Oct 17 00:36 config.common.amd64
-rw-r--r-- 1 root root 477 Oct 17 00:36 config.flavour.generic
-rw-r--r-- 1 root root 470 Oct 17 00:36 config.flavour.server
-rw-r--r-- 1 root root 471 Oct 17 00:36 config.flavour.virtual

Для наглядности привожу их все.

Стандартное ядро (desktop).
cat config.flavour.generic
#
# Config options for config.flavour.generic automatically generated by splitconfig.pl
#
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_IOSCHED="cfq"
# CONFIG_MEMORY_HOTPLUG is not set
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_SYM53C8XX_2=m
CONFIG_VIRTIO=m
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_RING=m
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_NETDEV_FRONTEND=m

Редакция server.
cat config.flavour.server
#
# Config options for config.flavour.server automatically generated by splitconfig.pl
#
# CONFIG_DEFAULT_CFQ is not set
CONFIG_DEFAULT_DEADLINE=y
CONFIG_DEFAULT_IOSCHED="deadline"
CONFIG_MEMORY_HOTPLUG=y
CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_RING=y
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_NETDEV_FRONTEND=m

Редакция virtual.
cat config.flavour.virtual
#
# Config options for config.flavour.virtual automatically generated by splitconfig.pl
#
# CONFIG_DEFAULT_CFQ is not set
CONFIG_DEFAULT_DEADLINE=y
CONFIG_DEFAULT_IOSCHED="deadline"
CONFIG_MEMORY_HOTPLUG=y
CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_RING=y
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y


Итак, для начала сравним редакции virtual и server:
diff -u config.flavour.server config.flavour.virtual
--- config.flavour.server 2010-10-17 00:36:17.000000000 +0400
+++ config.flavour.virtual 2010-10-17 00:36:17.000000000 +0400
@@ -1,5 +1,5 @@
#
-# Config options for config.flavour.server automatically generated by splitconfig.pl
+# Config options for config.flavour.virtual automatically generated by splitconfig.pl
#
# CONFIG_DEFAULT_CFQ is not set
CONFIG_DEFAULT_DEADLINE=y
@@ -14,5 +14,5 @@
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_RING=y
-CONFIG_XEN_BLKDEV_FRONTEND=m
-CONFIG_XEN_NETDEV_FRONTEND=m
+CONFIG_XEN_BLKDEV_FRONTEND=y
+CONFIG_XEN_NETDEV_FRONTEND=y

Согласно официальной вики Xen, эти опции требуются для корректой работы сервера в качестве Xen DomU в режиме паравиртуализации, http://wiki.xen.org/xenwiki/XenParavirtOps

Разница между generic и server редакциями чуть больше:
diff -u config.flavour.generic config.flavour.server
--- config.flavour.generic 2010-10-17 00:36:17.000000000 +0400
+++ config.flavour.server 2010-10-17 00:36:17.000000000 +0400
@@ -1,18 +1,18 @@
#
-# Config options for config.flavour.generic automatically generated by splitconfig.pl
+# Config options for config.flavour.server automatically generated by splitconfig.pl
#
-CONFIG_DEFAULT_CFQ=y
-# CONFIG_DEFAULT_DEADLINE is not set
-CONFIG_DEFAULT_IOSCHED="cfq"
-# CONFIG_MEMORY_HOTPLUG is not set
-# CONFIG_PREEMPT_NONE is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_SYM53C8XX_2=m
-CONFIG_VIRTIO=m
-CONFIG_VIRTIO_BLK=m
-CONFIG_VIRTIO_NET=m
-CONFIG_VIRTIO_PCI=m
-CONFIG_VIRTIO_RING=m
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_DEADLINE=y
+CONFIG_DEFAULT_IOSCHED="deadline"
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_VIRTIO=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_VIRTIO_NET=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_RING=y
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_NETDEV_FRONTEND=m

Итого, в редакции сервер планировщик ввода-вывода CFQ заменяется на Deadline, что ж сомнительная замена, но вполне допустимая. Также включается поддержка горячего добавления памяти на сервер CONFIG_MEMORY_HOTPLUG. В generic активен CONFIG_PREEMPT_VOLUNTARY, в то время как в серверной редакции CONFIG_PREEMPT_NONE, подробнее прочесть, что это за звери можно здесь: http://lxr.linux.no/linux/kernel/Kconfig.preempt. Также в server редакции добавляются в ядро (в generic они модулями) две крайне экзотичные и в упор мне не известные фишки: CONFIG_SCSI_SPI_ATTRS и CONFIG_SCSI_SYM53C8XX_2. А также поддержка VIRTIO (CONFIG_VIRTIO, CONFIG_VIRTIO_*) в серверной редакции поставляется вкомпилированной в ядро, а не в модулях.

Wednesday 17 November 2010

Как только скачать исходники пакета на Debian, но не распаковывать их?

Вот так:
apt-get source --download-only nginx

Как результат, в папке появится несколько файликов:
total 640
drwxrwsr-x 2 root src 4096 Nov 18 01:58 .
drwxr-xr-x 10 root root 4096 Nov 11 21:15 ..
-rw-r--r-- 1 root src 26140 Aug 17 01:05 nginx_0.7.67-3ubuntu1.debian.tar.gz
-rw-r--r-- 1 root src 2044 Aug 17 01:05 nginx_0.7.67-3ubuntu1.dsc
-rw-r--r-- 1 root src 608462 Jul 22 13:05 nginx_0.7.67.orig.tar.gz

Где nginx_0.7.67.orig.tar.gz - исходники программы (без патчей), nginx_0.7.67-3ubuntu1.dsc - файл описания пакета, nginx_0.7.67-3ubuntu1.debian.tar.gz - патчи Дистрибутива + служебные файлы пакета.

И их можно распаковать вручную, для этого ставим софт:
apt-get install -y dpkg-dev

Распаковываем:
dpkg-source -x nginx_0.7.67-3ubuntu1.dsc

После этого успешно наблюдаем, как накладываются патчики:
gpgv: keyblock resource `/root/.gnupg/trustedkeys.gpg': file open error
gpgv: Signature made Tue Aug 17 00:52:20 2010 MSD using RSA key ID EFC8774C
gpgv: Can't check signature: public key not found
dpkg-source: warning: failed to verify signature on ./nginx_0.7.67-3ubuntu1.dsc
dpkg-source: info: extracting nginx in nginx-0.7.67
dpkg-source: info: unpacking nginx_0.7.67.orig.tar.gz
dpkg-source: info: unpacking nginx_0.7.67-3ubuntu1.debian.tar.gz
dpkg-source: info: applying nginx-upstream-fair.diff
dpkg-source: info: applying dlopen.diff
dpkg-source: info: applying fix_reloading_ipv6.diff

И появляется папочка с распакованными исходниками и наложенными на код патчами:
ls -al
total 644
drwxrwsr-x 3 root src 4096 Nov 18 02:15 .
drwxr-xr-x 10 root root 4096 Nov 11 21:15 ..
drwxr-xr-x 10 root root 4096 Nov 18 02:15 nginx-0.7.67
-rw-r--r-- 1 root src 26140 Aug 17 01:05 nginx_0.7.67-3ubuntu1.debian.tar.gz
-rw-r--r-- 1 root src 2044 Aug 17 01:05 nginx_0.7.67-3ubuntu1.dsc
-rw-r--r-- 1 root src 608462 Jul 22 13:05 nginx_0.7.67.orig.tar.gz

Не злоупотребляйте аббревиатурами в коде :)

http://cafe.elharo.com/programming/dnt-abbrvt/

График поддержки различных версий Ubuntu Linux (в т.ч. LTS)

https://wiki.ubuntu.com/LTS?action=AttachFile&do=get&target=ubuntu-release-cycle.png

Взято с: https://wiki.ubuntu.com/LTS

Список документов на визу Эстонии от граждан РФ

http://www.estemb.ru/konsulskaja_informatsija/viza/aid-1986G

Tuesday 16 November 2010

Как заставить CentOS x86 увидеть более 4гб памяти?

Легко, поставить PAE ядро!

Для начала ставим PAE ядро стандартным (иначе при обновлении ядра посредством yum он всегда будет ставить обычное, не PAE ядро стандартным):
vi /etc/sysconfig/kernel

И заменяем там строку:
DEFAULTKERNEL=kernel

На:
DEFAULTKERNEL=kernel-PAE

Ставим само ядро:
yum install -y kernel-PAE

При этом, оно в /boot/grub/menu.lst само станет стандартным и чтобы переключиться на него достаточно финальной перезагрузки:
shutdown -r now

ФАС проверит домен РФ, интервью Алексея Лесникова (Ру-Центр)

Нашел ответы на многие вопросы: http://www.gazeta.ru/business/2010/11/15/3437908.shtml

А Лесников мегакрутой мужик, за что ему зачот, все четко, кратко и по существу. Впрочем, бизнес у них такой же - грамотный, дальновидный и расчетливый :)

Не-не, я не работаю в Ру-Центре :)

Как добавить дополнительный IP адрес OpenVZ контейнеру?

Итак, нужно добавить некому OpenVZ контейнеру IP адрес.

Для начала запросим список имеющихся на сервере контейнеров:
vzlist
CTID NPROC STATUS IP_ADDR HOSTNAME
4241 42 running xx.xx.yy.zz domain.com

Итак, у нас есть один контейнер 4241, добавлять IP (пусть добавляемый IP будет aa.bb.cc.dd) будем ему, для этого выполняем следующую команду:
vzctl set 4241 --ipadd aa.bb.cc.dd --save

После этого сеть на контейнере будет перезапущена и дополнительный IP начнет пинговаться.

После этого для гарантии, что все ПО начнет видеть добавленный IP делаем перезагрузку контейнера:
vzctl restart 4241

Как сделать Apache hook на событие ДО форка child?

Есть только после форка:
Apache provides hooks into the child process initialization and exit handling. The child process initialization handler, installed with PerlChildInitHandler, is called just after the main server forks off a child but before the child has processed any incoming requests. The child exit handler, installed with PerlChildExitHandler, is called just before the child process is destroyed.

Как сделать до форка? Кто-нибудь такое делал?

Monday 15 November 2010

dump (hd0,1)/grub/stage1 /tmp/grub-install.img.bV7802 Error 2: Bad file or directory type

Имеем ext3 раздел с файловой системой, созданной в Debian Lenny следующими утилитами:
dpkg -l | grep e2fs
ii e2fslibs 1.41.3-1 ext2 filesystem libraries
ii e2fsprogs 1.41.3-1 ext2/ext3/ext4 file system utilities

И имеем проблему внутри CentOS, которую пытаемся поставить на этот раздел:
root@rescue /etc # rpm -qa | grep grub
grub-0.97-13.5
root@rescue /etc # rpm -qa | grep e2fs
e2fsprogs-1.39-23.el5
e2fsprogs-libs-1.39-23.el5

Это баг, цитирую:
Users of GRUB legacy, which is version 0.97, are getting bitten by an e2fsprogs incompatibility that renders their systems unbootable. e2fsprogs is the utilities package for the Ext3 filesystem, so it doesn't affect other filesystems. As this Ubuntu bug report states:

"e2fsprogs ≥ 1.40.5 creates ext3 filesystems with 256 byte large inodes by default (in contrast to 128 byte used before), to accommodate for further ext4 related changes... Using any of these new features requires updating the bootsector of your system. Bootsectors written by "grub or earlier versions of "grub-gfxboot" are not able to boot or even access partitions using any of these new features!

The bug report says that there is a fix using grub-install, but I tried it and it didn't fix anything. This particular little bug apparently took a lot of people, including distribution maintainers, by surprise, with the result that some new installations were unbootable. Another way to bump into it is to create a new Ext3 filesystem on a multiboot system. It will install quite happily, in a normal fashion, and let you install a new Linux on it. Then when you try to boot into your new installation GRUB barfs with "Error 2: unknown file or directory type". GRUB does not recognize the new filesystem in any way, so dropping to the GRUB commandline for repairs does no good. If your GRUB bootfiles are installed on the new filesystem, you won't even get to the GRUB menu or command line.

The GRUB maintainers are devoting their energies to GRUB 2 and have put GRUB legacy into a feature freeze, which means they're not accepting bug reports and won't fix this particular issue. Leaving the aside the whole question of who to blame, which can be fun but is really a waste of time, why did this particular problem emerge in the first place? Why do we even need 256-byte inodes? To support new features in Ext4 such as faster fscks, extended attributes stored in inodes, inode versioning, and nanosecond timestamps. Storing extended attributes in the inodes results in significantly faster performance with any application that uses ACLs (Access Control Lists) or EAs, such as SELinux. Putting 256-byte inodes in Ext3 provides a direct migration path to Ext4; the alternative is to create new Ext4 filesystems and copy your old files over.

Полностью суть проблемы звучит как "grub не поддерживает 256 битные inode, которые были введены для легкой миграции на ext4".

Тесты подтвердили вердикт:
tune2fs -l /dev/md1 | grep 'Inode size'
Inode size: 256

А вот и фикс: http://www.linuxplanet.com/linuxplanet/tutorials/6480/2/

То есть, для фикса нужно отформатировать заново файловую систему с 128 битным inode и все будет окей:
mkfs.ext3 -I 128 /dev/md2

Можно ли обойтись без форматирования? Нет, см. man mkfs.ext3:
-I inode-size
Specify the size of each inode in bytes. mke2fs creates 256-byte inodes by default.In kernels after 2.6.10 and some earlier vendor kernels it is possible to utilize inodes larger than 128 bytes to store extended attributes for improved performance. The inode-size value must be a power of 2 larger or equal to 128. The larger the inode-size the more space the inode table will consume, and this reduces the usable space in the filesystem and can also negatively impact performance. Extended attributes stored in large inodes are not visible with older kernels, and such filesystems will not be mountable with 2.4 kernels at all. It is not possible to change this value after the filesystem is created.

Источник: http://www.linuxplanet.com/linuxplanet/tutorials/6480/1/

Пошаговое исполнение /bin/sh скриптов

Часто для отладки нужно понять, что же именно сейчас делает bash в данный момент, это весьма легко, открываем нужный нам скрипт:
vi /sbin/grub-install

И в самом верху заменяем:
#!/bin/sh

на

#!/bin/sh -x

В итоге при запуске скрипта мы получим крайне приятный трейс:
+ for file in '${grubdir}/stage1' '${grubdir}/stage2' '${grubdir}/*stage1_5'
+ echo /boot/grub/stage1
/boot/grub/stage1
+ count=5
++ echo /boot/grub/stage1
++ sed 's|^/boot/grub|/grub|'
+ tmp=/grub/stage1
+ test 5 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 5 - 1
+ count=4
+ test 4 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 4 - 1
+ count=3
+ test 3 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 3 - 1
+ count=2
+ test 2 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 2 - 1
+ count=1
+ test 1 -gt 0
+ dump_boot_block '(hd0,1)' /tmp/grub-install.img.Fh5897
+ sync
+ /sbin/grub --batch --device-map=/boot/grub/device.map
+ grep 'Error [0-9]*: ' /tmp/grub-install.log.DD5898
+ :
+ sleep 1
++ expr 1 - 1
+ count=0
+ test 0 -gt 0
+ test 0 -eq 0
+ echo 'The file /boot/grub/stage1 not read correctly.'
The file /boot/grub/stage1 not read correctly.
+ exit 1


А если ключик -x заменить на -vx, то bash начнет выводить текст блоков кода до вывода трейса, что крайне удобно.

Описание схемы БД PowerDNS

В назидание всем заинтересованным: http://wiki.powerdns.com/trac/wiki/fields

Debian: rake aborted! no such file to load -- net/https

Fix so simple:
apt-get install -y libopenssl-ruby1.8

Debian: ERROR: Failed to build gem native extension

Это ознает, что не стоит тулкит по сборке бинарных Ruby расширений:
apt-get install -y ruby-dev

Установка обновленного gem в Debian

При попытке обновить gem правильным способом на Debian гарантированно вылетает ошибка:
gem update --system is disabled on Debian. RubyGems can be updated using the official Debian repositories by aptitude or apt-get.

gem install rubygems-update
cd /var/lib/gems/1.8/bin
./update_rubygems

Источник: http://programmers-blog.com/2009/04/12/ruby-gem-update-system-is-disabled-on-debian

Какие ядра используются в Ubuntu 10.10 LTS?

Вот ссылки на страницы пакетов: http://packages.ubuntu.com/maverick/linux-image и http://packages.ubuntu.com/maverick-updates/linux-image

А вот ссылки на файлы исходного кода:
http://packages.ubuntu.com/source/maverick/linux
http://packages.ubuntu.com/source/maverick-updates/linux

А вот ссылочка на deb.src пакет: http://packages.ubuntu.com/maverick/linux-source-2.6.35

Ссылки на файлы исходников идентичны по понятным причинам, но вот логику по какой пакеты отправляются в updates / base я никак понять не могу, кто объяснит?

Кстати, вот еще что заметил:
Обновления, связанные с безопасностью, для Ubuntu официально распространяются только через security.ubuntu.com.

Так что ну никак не получится сделать универсальную ссылку по скачке сорцов ядра Ubuntu :)

Новая модель управления памятью на OpenVZ / RHEL 6 ядрах

http://wiki.openvz.org/Vswap

Sunday 14 November 2010

Как работают встроенный и внешний менеджеры FastCGI процессов в lighttpd

Вот так: http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModFastCGI

Есть ряд фич, которыми отличается внешний менеджер процессов от внутреннего. И какой выбирать - сильно зависит от версии, например, в контексте lighttpd 1.4.19 из дистрибутива Debian Lenny, внутренний явно предпочтительнее, так как внешний просто-напросто не умеет форкать несколько процессов PHP самостоятельно, а полностью полагается в этом вопросе на сам PHP (а частности переменную-среды PHP_FCGI_CHILDREN), что крайне нехорошо. Впрочем, в актуальной версии spawn-fcgi (1.6.3) имеется полноценный процесс-менеджер, который умеет, как форкать процессы сам, так и просить PHP форкнуться, так что юзать его крайне рекомендуется, даже в связке с более старыми версиями lighttpd :)

К слову, обращаю внимание, что упоминаемый в документации lighttpd внешний менеджер процессов по имени spawn-fcgi.lighttpd (src/spawn-fcgi.c) теперь (с версий старше 1.4.23, вот как раз запись в информации о версии lighttpd, где сообщается, что spawn-fcgi окончательно выделен в отдельный проект) отсутствует в архиве lighttpd и является отдельным проектом: http://redmine.lighttpd.net/projects/spawn-fcgi.

Источник: http://redmine.lighttpd.net/wiki/lighttpd/FrequentlyAskedQuestions

Как убить все процессы определенного юзера?

Легко:
killall -u user_name

Викиномика: Как массовое сотрудничество изменяет всё

Натолкнулся на вот такую интересную книжку: http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%BA%D0%B0

Надо будет прочесть :)

Как включить проброс портов для Xbox 360 на роутере?

Необходимо пробросить tcp/udp для портов 88, 2074, 3074 и все заработает :)

Отключение selinux в любой ОС на уровне ядра

Достаточно прописать к списку опций ядра в конфигурации загрузчика следующее:
selinux=0

Вклчюение UPnP на D-link Dir-100

Advanced - Advanced Network - Enable UPnP.

Как сменить регион учетной записи Xbox Live на Россию?

С 10 ноября Xbox Live официально доступен в России, так что меянем прописку аккаунтов на РФ :)

Открываем страничку: https://live.xbox.com/ru-RU/account?xr=shellnav и выбираем "Change account region", далее меняем на Россию и раз пять щелкаем "ok" / "next".

Saturday 13 November 2010

Тюнинг Apache (Prefork) MaxClients на OpenVZ VPS

Имеем работающий хотя бы минут 15-20 VPS с отключенным Апачем:
free
total used free shared buffers cached
Mem: 409600 62588 347012 0 0 0
-/+ buffers/cache: 62588 347012
Swap: 0 0 0

Запускаем Апача:
/etc/init.d/apache2 start

Дерагем несколько страниц сайта и смотрим данные free повторно:
free
total used free shared buffers cached
Mem: 409600 81100 328500 0 0 0
-/+ buffers/cache: 81100 328500
Swap: 0 0 0

Теперь считаем число обработчиков Апача:
ps aux | grep apa | wc -l
6

Далее производим расчет памяти, занимаемой одним процессом Апача (делаим на 5, а не на 6, потому что 1 процесс Апача является родительским и обработку сайтов не осуществляет):
perl -e ' print scalar (81100-62588)/5/1024'
3.615625

То есть, около 4 мегабайт на один процесс. Это крайне примерный метод, так что стоит заложить в него +5 мегабайта еще, то есть взять где-то 8-9 мегабайт на процесс. Более точные измерения можно провести вот так: http://phpsuxx.blogspot.com/2010/04/blog-post_9092.html

Теперь берем объем свободной памяти до старта Апача (347012) и делим его на память, занимаемую 1 тушкой Апача:
perl -e '347/9'
38.5555555555556

Итого, ставим MaxClients у Апача в 35 и живем спокойно.

Рекомендую офигенный блог по устройству Linux

http://timetobleed.com/

Отчет о том, на чем заблокирован процесс в Linux

Возможен при активации опции ядра CONFIG_LATENCYTOP и использовании специализированного ПО - LatencyTOP от Intel.

Офигенная презентация по тонкому тюнингу Linux систем

Прямо яро рекомендую всем-всем-всем: http://timetobleed.com/slides-from-highload/

irqbalance или ручное распределение прерываний по процессорам?

Есть вот такая штука (как она работает, к сожалению, понял не особенно), но поидее она выполняет распределение прерываний по различным ядрам:
http://www.irqbalance.org/documentation.php

А вот есть отзывы об успешном использовании, а также о кернел паниках: http://www.screenage.de/blog/2008/06/02/my-package-of-the-day-irqbalance/