понедельник, 31 мая 2010 г.

Уважаемый all! Как ограничить число worker процессов для виртуального хост апача?

Сабж.


update1:
ага, спасибо, в ITK такое есть.

MaxClientsVHost: A separate MaxClients for the vhost. This can be useful if, say, half of your vhosts depend on some NFS server (like on our setup); if the NFS server goes down, you do not want the children waiting forever on NFS to take the non-NFS-dependent hosts down. This can thus act as a safety measure, giving "server too busy" on the NFS-dependent vhosts while keeping the other ones happily running. (Of course, you could use it to simply keep one site from eating way too much resources, but there are probably better ways of doing that.)


http://mpm-itk.sesse.net/

Куча сторонних модулей к Nginx

http://wiki.nginx.org/Nginx3rdPartyModules#Catalog_of_Modules

Как научить eAccelerator не работать c shm/sysvipc памятью, а переключить его на mmap

Имеем: eAccelerator + shm валит сервер с ошибками:

eAccelerator: shmmax should be at least 2MBPHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
eAccelerator: Could not allocate 33554432 bytes, the maximum size the kernel allows is 1048576 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.


При его сборке есть следующее:

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... sysvipc


То есть, есть выбор между различными хранилищами, так как мой баг явно связан с sysvipc / shm, то логично будет его заменить на... на кого? В коде posix map явно указан как NOT TESTED, так что он отпадает.

Далее в configure можно найти кой что интересное:
5365 echo $ECHO_N "checking for best shared memory type... $ECHO_C" >&6; }
5366 if test "$mm_shm_ipc" = "yes"; then
5367
5368 cat >>confdefs.h <<\_ACEOF 5369 #define MM_SHM_IPC 1 5370 _ACEOF 5371 5372 msg="sysvipc" 5373 elif test "$mm_shm_mmap_anon" = "yes"; then 5374 5375 cat >>confdefs.h <<\_ACEOF 5376 #define MM_SHM_MMAP_ANON 1 5377 _ACEOF 5378 5379 msg="anonymous mmap"



Отсюда следует, что shm_mmap_anon (он же MM_SHM_MMAP_ANON) следующий в списке предпочтений.

Так что делаем следующее:
vi configure


Накатываем патч:

- 5366 if test "$mm_shm_ipc" = "yes"; then
+ 5366 if false; then


Потом перезапускаем configure и получаем все, как надо:

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... anonymous mmap


То есть, теперь он будет собран с anonymous_mmap и, возможно, прекратит сваливать сервер.

APC vs XCache vs eAccelerator

http://itst.net/654-php-on-fire-three-opcode-caches-compared и еще вот http://2bits.com/articles/benchmarking-drupal-with-php-op-code-caches-apc-eaccelerator-and-xcache-compared.html

Установка XCache 1.3.0 на Debian 5 Lenny

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


Собираем:
cd /usr/src
wget http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz
tar -xf xcache-1.3.0.tar.gz
cd xcache-1.3.0
phpize
./configure --enable-xcache
make
make install


Создаем конфиг:

vi /etc/php5/conf.d/xcache.ini


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

# configuration for php Xcache module

[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php5/20060613/xcache.so


[xcache.admin]
xcache.admin.enable_auth = On
# Configure this to use admin pages
; xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
; xcache.admin.pass = ""

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 32M
; set to cpu count (cat /proc/cuinfo |grep -c processor)
xcache.count = 8
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0

; same as aboves but for variable cache
xcache.var_size = 0M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"


; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory = ""

; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager = Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""


Все :) После этой фичи продакшен сервер лег насмерть с ла уходящим за 70 и помог только резет. Софтег, однако.

воскресенье, 30 мая 2010 г.

Умные рассуждения на тему распределенного хранилища PHP сессий

http://www.mohawksoft.org/?q=node/36

Скрипт для массового добавления www доменов в ISPManager


cat domains.txt | perl -e 'for(<>){ do { chomp; s/^\\s//g; s/\\s+$//g; $_ = lc } for($_); my($d, $ip) = split "\\s+", $_; print "Add $d with $ip to ISPManager\n"; `/usr/local/ispmgr/sbin/mgrctl -m ispmgr wwwdomain.edit domain=$d ip=$ip php=phpmod admin=admin\@mail.ru alias=www.$d sok=ok su=user_name`; }'


В файле domains.txt домены должны быть просто списком в виде:
domain1.ru ip.ad.dr.es
domain2.ru ip.ad.dr.es

Распределенное хранилище для PHP сессий

Да, оказывается такое есть и готовое:
http://ru2.php.net/manual/en/book.msession.php

Скрипт для массового создания DNS доменов в ISPManager


cat domains.txt | perl -e 'for(<>){ do { chomp; s/^\\s//g; s/\\s+$//g; $_ = lc } for($_); my($d, $ip) = split "\\s+", $_; print "Add $d with $ip to ISPManager\n"; `/usr/local/ispmgr/sbin/mgrctl -m ispmgr domain.edit name=$d ip=$ip ns="ns3.fastvps.ru. ns4.fastvps.ru." sok=ok su=user_namee`; }'


В файле domains.txt домены должны быть просто списком в виде:
domain1.ru ip.ad.dr.es
domain2.ru ip.ad.dr.es

Также есть еще к нему в комплекте скрипт для массового создания DNS поддоменов:
for i in `cat domains.txt | awk '{print $1}'`; do echo $i | perl -e 'my$domain=<>; print $domain; chomp $domain; open my $fl, "<", "types.txt"; for(<$fl>) { chomp; @mas=split "\\s+", $_; print `/usr/local/ispmgr/sbin/mgrctl -m ispmgr domain.sublist.edit plid=$domain sdtype=$mas[1] prio=$mas[2] name=$mas[0] addr=$mas[3] sok=ok`; } ;'; done

Вот пример файла types.txt для Gmail MX:
@ MX 10 ASPMX.L.GOOGLE.COM.
@ MX 20 ALT1.ASPMX.L.GOOGLE.COM.
@ MX 20 ALT2.ASPMX.L.GOOGLE.COM.
@ MX 30 ASPMX4.GOOGLEMAIL.COM.
@ MX 30 ASPMX5.GOOGLEMAIL.COM.
@ MX 30 ASPMX2.GOOGLEMAIL.COM.
@ MX 30 ASPMX3.GOOGLEMAIL.COM.

После запуска скрипта, каждый домен из списка получит такой комплект MX записей.

Все PHP программеры, затачивающие cron скрипты на запуск только через веб - печальные му$$$ки

Сабж.

Мониторинг OpenVZ посредством Munin

http://wiki.openvz.org/Monitoring_openvz_resources_using_munin

lighttpd NOTE: a request for x.jpg timed out after writing x bytes. We waited 360 seconds. If this a problem increase server.max-write-idle

В этой ошибке ничего страшного. Она вызвана тем, что клиент сбросил соединение раньше, чем lighttpd смог отдать ему файлы либо клиент реально имеет ОЧЕНЬ медленный канал и не смог забрать файлы в заданное время.

Подробнее: http://redmine.lighttpd.net/wiki/lighttpd/server.max-write-idleDetails

суббота, 29 мая 2010 г.

Установка Munin на Debian 6 Squeeze

Клиентская часть

Ставим датчика на Debian и набор плагинов мониторинга (они встанут в папку /usr/share/munin/plugins):
apt-get install -y munin-node munin-plugins-extra

Установка датчика на CentOS:
yum install -y munin-node

Запускаем его:
/etc/init.d/munin-node start


Убеждаемся, что процесс запустился:
ps aux | grep munin | grep -v grep
root 31205 0.0 0.0 124348 7100 ? Ss 19:47 0:00 /usr/sbin/munin-node


При этом он биндится на 4949 порт, но в конфиге блокировка на доступ к нему только с 127.0.0.1:
netstat -lnpt | grep muni
tcp 0 0 0.0.0.0:4949 0.0.0.0:* LISTEN 31205/munin-node
Для большей безопасности в случае только локального использования рекомендую его настроить на прослушивание только локального интерфейса:
vim /etc/munin/munin-node.conf 
Внисим там коррективу:
host 127.0.0.1
Применяем:
/etc/init.d//munin-node restart
Серверная часть

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


Далее я бы рекомендовал бы открыть конфиг:
vi /etc/munin/munin.conf


И сменить там стандартный путь на более удобный:
htmldir /var/www/munin


После этого оздаем папку и запускаем его вручную:
mkdir -p /var/www/munin
chown munin:munin -R /var/www/munin

su munin -s /bin/bash
/usr/bin/munin-cron
exit


При этом, никакой демон для него не требуется, опрос нод мониторинга производится по крон задачей /etc/cron.d/munin, которая также генерирует графики: /var/www/munin.

Если датчики расположены на удаленных серверах, то их нужно указывать в конфиге явно:
vi /etc/munin/munin.conf

Вот таким образом:
[srv1.domain.ru]
address 46.4.63.77
use_node_name yes

А на датчике в свою очередь нужно явно указать IP мастер сервера мониторинга:

vim /etc/munin/munin-node.conf

Он задается в строке:
allow ^127\.0\.0\.1$

После этого потребуется перезапуск: датчика
/etc/init.d/munin-node restart
Обращаю внимание, что стандартно доступ к графикам munin открыт только для 127.0.0.1 и для удаленного доступа к site.ru/munin нужно добавить свой IP:
vim /etc/apache2/conf.d/munin 

Управление плагинами

С плагинами работать крайне просто - это лишь набор слимлинков из папки /usr/share/munin/plugins в папку /etc/munin/plugins.

Например, удалить мониторинг эксима и лдап:
rm /etc/munin/plugins/exim_mailstats /etc/munin/plugins/slapd_bdb_cache_pages /etc/munin/plugins/slapd_bdb_cache_percent
А вот так можно добавить мониторинг апача (обращаю внимание, что для их работы должен быть включен ExtendedStatus у Апача, а также должен быть установлен пакет libwww-perl):
sudo ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
sudo ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
sudo ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes

После этого для изменения набора плагинов нужно перезапустить мониторинг-ноду:

/etc/init.d/munin-node restart   


Также вот хорошая инструкция: http://debianworld.ru/articles/ustanovka-i-nastrojka-munin-v-debian-ubuntu/

Скрипт для очистки неиспользуемой shm памяти

Все написанное ниже под большим сомнением, используйте на свой страх и риск :)


Бывает так, что процесс, работающий с shm падает и, разумеется, не успевает освободить блок shm памяти. Поэтому за shm памятью стоит следить и очищать, если находятся не используемые никем блоки. Число процессов, использующих блок shm можно посмотреть в столбце nattach выдачи команды
ipcs -m


А вот скрпит для удаления блоков shm памяти, у которых nattach равно 0.
ipcs -m | grep -v nattch | perl -e 'my $mem = 0; do { my@a=split "\\s+", $_; next if $a[4] or !$a[1]; print "Remove shm block with shmid $a[1] which used by $a[5] processes\n"; $mem+=$a[4]; `ipcrm -m $a[1]`} for<>; $mem /= 1024 for 1..2; print "Totally freed up: $mem mb\n" '

Установка APC (Alternative PHP Cache) на Debian 5 Lenny

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

Установка APC из стабильного репозитория

APC в отличие от eAccelerator есть в в пакетном менеджере (версия 3.0.19-2 как раз стабильная из pecl):
apt-get install -y php-apc


После установки будет создан полу-пустой конфиг:
vi /etc/php5/conf.d/apc.ini


И мы получим стандартные настройки APC:

php -i | grep apc
/etc/php5/cli/conf.d/apc.ini,
apc
apc.cache_by_default => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => no value => no value
apc.num_files_hint => 1000 => 1000
apc.report_autofilter => Off => Off
apc.rfc1867 => Off => Off
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.shm_segments => 1 => 1
apc.shm_size => 30 => 30
apc.slam_defense => 0 => 0
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On


И настройки компиляции:
APC Support enabled
Version 3.0.19
MMAP Support Enabled
MMAP File Mask no value
Locking type pthread mutex Locks
Revision $Revision: 3.154.2.5 $
Build Date Dec 17 2008 18:21:28


Тут стоит обратить внимание на apc.stat, он обязательно должен быть включен, иначе кэш не будет обновляться при обновлении файлов, а также на apc.shm_size, это размер shm сегмента в памяти.


Баги
При установке на Debian 5 + PHP FastCGI + IonCube + Zend Optimizer + APC получаем кучу мусора в dmesg:
[1218697.911671] php[28066]: segfault at e9 ip 00007fac6f561569 sp 00007ffff4066360 error 4 in ZendOptimizer.so[7fac6f4fe000+184000]


А в error.log апача:
[Sun May 30 21:32:36 2010] [notice] mod_fcgid: process /var/www/xxx/data/www/xxxx.ru/index.php(28238) exit(communication error), get unexpected signal 11


При этом сами сайты через раз выбрасывали 500ую и ругались на Cannot found function null (или что-то в этом роде).

Так что, нужно что-то с этим делать.

Установка из исходников

Будем ставить самую новую версию.

cd /usr/src
pecl download apc-3.1.3p1
tar -xf APC-3.1.3p1.tgz
cd APC-3.1.3p1
phpize
./configure # все стандартно
make
make install


Создаем конфиг:
echo "extension=apc.so" > /etc/php5/conf.d/apc.ini


Результат: тот же самый баг. Мораль - PHP FastCGI + APC + ZendOptimizer 3.3.9 несовместимы. Вот еще багрепорт.

Некоторые фичи на тему APC + PHP FastCGI + SHM память + расшаривание одного кэша между всеми процессами. APC это не умеет, вот фич риквест: http://pecl.php.net/bugs/bug.php?id=11988

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

среда, 26 мая 2010 г.

Кто хочет на работу в Wordpress.com?

telnet wordpress.com 80
Trying 74.200.247.60...
Connected to wordpress.com.
Escape character is '^]'.
HEAD / HTTP/1.1
HOST: wordpress.com

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 26 May 2010 17:36:38 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Last-Modified: Wed, 26 May 2010 17:36:30 +0000
Cache-Control: max-age=22, must-revalidate
Vary: Cookie
X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.
X-Pingback: http://wordpress.com/xmlrpc.php
Link: ; rel=shortlink
X-nananana: Batcache

Connection closed by foreign host.

Squid vs Varnish

http://deserialized.com/reverse-proxy-performance-varnish-vs-squid-part-1/ и http://deserialized.com/reverse-proxy-performance-varnish-vs-squid-part-2/

Резюме: где-то varnish лучше, где-то Squid.

Зачем удалять gcc? Или параноикам (не включающим мозг) посвящается.

... Isn't that security problem?

The days when you could prevent people from running non-approved programs by removing the C compiler from your system ended roughly with the VAX 11/780 computer.


(c) http://varnish-cache.org/wiki/FAQ

вторник, 25 мая 2010 г.

Перечитать таблицу разделов без ребута

http://www.cyberciti.biz/faq/debian-ubuntu-reload-partition-table/

Миграция с Bind на PowerDNS крайне прозрачна

http://doc.powerdns.com/migration.html

Чем бы дитя на маялось... лучше б повесилось.

http://www.vedomosti.ru/newspaper/article/2010/05/25/235357

Кто еще использует префиксы www. ?

Довольно много кто:
domain.ru 324
www.domain.ru 45


Цифры за пару часов от одного довольно посещаемого сайта.

Вакансия Last.FM для С++ программиста

C++ Software Engineer, Data and Recommendations

Purpose of Role
We're seeking an exceptional software engineer to join the small and very enthusiastic data and recommendations team at Last.fm. The position is full-time and based in London.

Are you ready to tackle all the challenges that high-performance, data-intensive backend software can put on your way? Do you like thinking about cache lines, memory bandwidth, seek times, and how code constructs are compiled into machine code? At the same time, do you enjoy writing lean, tested, modular code, using the kind of high-level and expressive idioms only Boost and the STL can offer? Do you have experience implementing key-value stores, information retrieval or large-scale machine learning software?

We need a coding wizard to help develop last.fm backend infrastructure, where magic like recommendations, tag clouds, radio playlist or realtime profile charts generation happens.

Responsibilities
Analyze, test, optimize, maintain, design and build core backend software components
Perform research on algorithms for recommendation and scalability related problems
Build cool demos with our data
Code using primarily C++ (STL/Boost) and Python
Requirements
Expert knowledge developing and debugging in C++ on *nix
Experience building large-scale server applications
Interested in: computational complexity, scalability, map/reduce, bloom filters, bitmaps, caching algorithms, multithreading, radix trees, LSH, template metaprogramming, thrift, boost, bogosort, and much more
MSc in computer science or related is a plus


Это вам не на похапе писать, тут мозг нужен.

понедельник, 24 мая 2010 г.

Всем, кто верит, что в их идеях есть хоть какая-либо ценность или уникальность

Чтите, мечтатели: http://www.artlebedev.ru/kovodstvo/sections/161/ :) И запомните раз и навсегда - ваша идея не стоит ни копейки без долгого и кропотливого труда по ее реализации (а изначально, без досконального понимания процесса реализации ).

воскресенье, 23 мая 2010 г.

DjVu на Mac OS X

Браузер плагин (у меня работал в FireFox только и криво):

http://www.caminova.net/en/downloads/download.aspx?id=1

MacDjView:
http://windjview.sourceforge.net/ru/

Ученым в США удалось создать первую искусственную форму жизни!

Ученым в США удалось создать первую искусственную форму жизни. ДНК, созданная компьютером по инструкциям генетиков, была внедрена в клетку и вытеснила естественную ДНК организма.

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


(c) http://www.bbc.co.uk/russian/multimedia/2010/05/100521_artificial_cell.shtml

А между тем, в DARPA уже есть оружие будущего

http://mikhail-sudakov.livejournal.com/83979.html

пятница, 21 мая 2010 г.

Соображения по генерации chroot окружения в CentOS / Debian или засовываем wget в chroot

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

Экспериментировать мы будем над wget, так как на него я более всего времени потратил. Ставим его:
apt-get install -y wget



Что нужно приложению?

1) Динамические библиотеки явно указанные при линковке. Узнать, какие библиотеки требуются программе крайне легко - ldd /usr/bin/wget.

Вот пример результата работы программы:
ldd /usr/bin/wget
linux-vdso.so.1 => (0x00007fff481ff000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fdea4e7c000)
librt.so.1 => /lib/librt.so.1 (0x00007fdea4c73000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007fdea4a22000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007fdea4687000)
libc.so.6 => /lib/libc.so.6 (0x00007fdea4334000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdea5080000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fdea4118000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007fdea3f01000)


2) Кроме явно указанных библиотек также возможно, что приложение в процессе запуска через dl_open и другие функции подгружает еще какие-то библиотеки (либо это делает даже не программа, а некая библиотека из зависимостей). Без запуска программы это выяснить нельзя. Так что заюзаем strace:


strace -e trace=open -f /usr/bin/wget ya.ru 2>&1 | grep lib
open("/lib/libdl.so.2", O_RDONLY) = 3
open("/lib/librt.so.1", O_RDONLY) = 3
open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 3
open("/usr/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/lib/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/libz.so.1", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/lib/libnss_files.so.2", O_RDONLY) = 3
open("/lib/libnss_dns.so.2", O_RDONLY) = 3
open("/lib/libresolv.so.2", O_RDONLY) = 3


Итого, выяснили еще несколько библиотек, которые нам нужны для работы.

3) Кроме библиотек приложению часто требуются специализированные устройства, /dev/null, /dev/zero, /dev/urandom, /dev/random и ряд других.
4) Также часто приложения требуют смонтированной файловой системы /proc, но это часто игнорируется ими и они без нее работают корректно.
5) Конфигурационные файлы, например: /etc/resolv.conf. Тут также сложность в том, что конфиги могут требоваться не самой программой, а зависимыми библиотеками.
6) Файлы документации, локали и проч - их также ловить только по strace.

На основе всего выше сказанного, задача правильного помещения большого числа программ в chroot становится почти неавтиматизируемой при подходе со стороны реверс инжиниринга. А вот со стороны:

dpkg -L wget
и
apt-cache depends wget


Она вполне решаемая. Но тут также без файлов устройств не обойтись.

Хостинг такой хостинг

Только ны рынке хостинга можно за 50 баксов продать тариф с 10% процессора :) Посмотрел бы я, как бы кто-нибудь купил машину с, скажем, 20% л/с :)

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

Ставим пакеты для 64 битых систем:
apt-get install -y linux-image-openvz-amd64

Для 32 битных систем:
apt-get install -t linux-image-openvz-686

Прописываем опции ядра в конец конфиг-файла (аналогичны CentOS):
vi /etc/sysctl.conf

Опции:
# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
net.ipv4.ip_forward = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0

# Enables source route verification
net.ipv4.conf.all.rp_filter = 1

# Enables the magic-sysrq key
kernel.sysrq = 1

# We do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0


Выбираем ядро стандартным:
vi /boot/grub/menu.lst


Ребутимся:
shutdown -r now


Убеждаемся, что работаем под OpenVZ ядром:
uname -a
Linux Debian-50-lenny-64-minimal 2.6.26-2-openvz-amd64 #1 SMP Tue Mar 9 23:10:10 UTC 2010 x86_64 GNU/Linux


В отличие от CentOS в глаза сразу бросилась фишка:
physpages 2573 2574 0 9223372036854775807 0
vmguarpages 0 0 33792 9223372036854775807 0
oomguarpages 2573 2574 26112 9223372036854775807 0


То есть, oomguarpages и vmguarpages здесь не лимитируются в отличие от CentOS (physpages также не лимитируется в CentOS),

А по использованию мануал целиком аналогичен Центосному: http://phpsuxx.blogspot.com/2009/12/openvz-centos-54.html

http://wiki.openvz.org/Installation_on_Debian и Установка OpenVZ на CentOS 5.5

Поиск всех дисковых устройств на сервере

blkid
/dev/sda1: UUID="d9f5b65e-bb67-8777-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sda2: UUID="5edaf8f7-cc8c-666c-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sda3: UUID="5f852b9a-70b4-b4c1-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb1: UUID="d9f5b65e-bb67-8777-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb2: UUID="5edaf8f7-cc8c-666c-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdb3: UUID="5f852b9a-70b4-b4c1-252c-6c77b2d74b00" TYPE="mdraid"
/dev/sdc1: UUID="d801006d-8564-4409-b7f3-205321ef53f0" TYPE="ext3"
/dev/sdd1: UUID="fc6cf046-8036-48ee-af0e-d877613b9c20" TYPE="ext3"
/dev/md0: UUID="e0da3930-a7d8-4c66-bbc1-77d881a7d48e" TYPE="swap"
/dev/md1: UUID="91d1c518-b31c-4930-95ae-c41dc77c6d46" TYPE="ext3"
/dev/md2: UUID="1ff0f06d-a0de-4a2c-bffb-4bf2ffef4c1f" TYPE="ext3"

php-fpm будет (возможно) интегрирован в PHP 5.4

Updates
Mar 17, 2010
Antony Dovgal says PHP-FPM will not be in PHP 5.3.3, but looks like PHP 5.4. Read here.

Dec 04, 2009
Antony Dovgal announces PHP-FPM has been put into a SVN branch in PHP core. This is an exciting development. It will be a while before it hits production status, but this is a great move for the future.


http://php-fpm.org/

четверг, 20 мая 2010 г.

Linux Raid-1 / mirror - параллелит ли он чтение?

Нет, нет и еще раз НЕТ.

RAID1

A RAID1 array is also known as a mirrored set (though mirrors tend to provide reflected images, which RAID1 does not) or a plex.
Once initialised, each device in a RAID1 array contains exactly the same data. Changes are written to all devices in parallel. Data is read from any one device. The driver attempts to distribute read requests across all devices to maximise performance.

All devices in a RAID1 array should be the same size. If they are not, then only the amount of space available on the smallest device is used. Any extra space on other devices is wasted.


http://linux.die.net/man/4/md

Как скрыть версию ядра в Debian Lenny SSH Welcome screen?

Открываем конфиг:
vi /etc/init.d/bootmisc.sh


Накладываем вот такой патч (убираем -r, который как раз и печатает версию ядра):
- uname -snrvm > /var/run/motd
+ uname -snvm > /var/run/motd


Применяем изменения:

uname -snvm > /var/run/motd
[ -f /etc/motd.tail ] && cat /etc/motd.tail >> /var/run/motd


Все, версия ядра скрыта :)

CentOS - Device eth0 has different MAC address than expected

Как избавится от этой хрени? Что за сволочь это вопит? Скрипт? Бинарь?

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

Update: эту ошибку выдает скрипт:
vi /etc/sysconfig/network-scripts/ifup-eth


В процессе поиска обнаружил, что кроме HWADDR есть еще параметр сети MACADDR, оба они описаны в хелпе:
vi /usr/share/doc/initscripts-8.45.30/sysconfig.txt


Их отличие в том, что HWADDR - информативный параметр и лишь хранит адрес дивайса, а вот MACADDR хранит желаемый MAC адрес дивайса, который будет подсунут сетевой карте при первой возможности. Вместе же их использоваться, разумеется, нельзя.

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

Update: вот фикс - http://phpsuxx.blogspot.com/2010/11/kudzu-ifcfg-eth0-ifcfg-eth0bak.html

Источник: http://codeghar.wordpress.com/2008/06/09/set-mac-address/

Почему chroot suxx?

http://kerneltrap.org/Linux/Abusing_chroot

Запуск только подписанных бинарных файлов

http://www.scribd.com/doc/3499565/IndustrialStrength-Linux-Lockdown-Part-2-Executing-Only-Signed-Binaries

и вот еще по сабжу:
https://twiki.cern.ch/twiki/bin/view/LinuxSupport/LinuxHardening

Вот даже так бывает...

Скрипт для генерации "скелета" chroot среды

http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/

среда, 19 мая 2010 г.

Активация memcached кэша для Bitrix

vi bitrix/php_interface/dbconn.php


И в самый низ добавляем:
define("BX_CACHE_TYPE", "memcache");


http://dev.1c-bitrix.ru/community/webdev/user/1978/blog/1361/

[Wed May 19 19:39:55 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21627

strace дает следующий результат:
[pid 21841] brk(0xc26000) = 0xc26000
[pid 21841] semop(2555905, 0x7f87e3f84a60, 1) = -1 EACCES (Permission denied)
[pid 21841] write(9, "[Wed May 19 19:45:06 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21841\n"..., 96) = 96


Причина:

dpkg -l | grep itk
ii apache2-mpm-itk 2.2.6-02-1+lenny2+b3 multiuser MPM for Apache 2.2


Решение - удалить и воткнуть префорк. То есть, mod_fcgid несовместим с Apache mpm_itk.

Что за черточки перед файлами в rsyslog.conf?

Пример черточек:
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err


I assume that the hyphens in rsyslog.conf in front of some filenames
indicate that these files aren't synced after every message, but
there's no information about this in the manpage.


По логике в принципе это согласуется с тем, что я вижу в конфиге.

http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/f48a038c0b502814

Как запретить Nginx логгировать в error.log "2: No such file or directory"?

http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#log_not_found

То есть внутрь блока http {} добавляем:
log_not_found off;


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


После этого весь мусор из логов пропадет в один момент и не будет более терроризировать диск.

ФастВПС теперь работает с юридическими лицами в России!

Уважаемые читатели! С радостью сообщаю, что крайне дружественная мне компания, FastVPS, с недавнего времени работает и с юридическими лицами, резидентами РФ: https://billing.fastvps.ru/announcements.php?id=16 За вкусными конфигами и дешевыми VPS, прошу сюда: http://fastvps.ru/ :)

вторник, 18 мая 2010 г.

Исследование степени идентификации пользователя по web-браузеру

Организация Electronic Frontier Foundation опубликовала интересный отчет , в котором представлены выводы, сделанные при исследовании запросов от около миллиона пользователей. Исследование показало, что для достаточно точной идентификации пользователя в сети и трекинга его соединений оказалось вполне достаточно стандартной информации, предоставляемой серверу обычным браузером. Для 84% из всех обработанных запросов удалось сгенерировать уникальную сигнатуру размером всего несколько байт, позволяющую с высокой степенью вероятности утверждать об ее уникальности, что дает возможность отслеживать перемещения пользователя в сети без установки Cookie и учета IP-адреса. При наличии у пользователя плагина Flash или Java вероятность получить уникальный идентификатор возрастает до 94%.


(c) http://rss.feedsportal.com/c/32457/f/477055/s/a952f35/l/0L0Sopennet0Bru0Copennews0Cart0Bshtml0Dnum0F26635/story01.htm

Одна из тех немногих вещей, где я согласен с Артемием Лебедевым. Теперь согласен.

— То есть, все то, что происходит в России, Вас полностью устраивает?
— Я делаю все, чтобы не знать ничего о том, что происходит в стране: я не читаю газет, не смотрю телевизор, не слушаю радио и на новостные сайты в Интернете тоже не хожу. Чем меньше за новостями следишь, тем спокойнее живется. Я знаю, что если в стране действительно что-то изменится, я это увижу из своего окна. Тогда я буду готов поверить в то, что что-то действительно изменилось. А то, что кто-то Один поспорил с кем-то Другим – эти чужие «корпоративные» разборки меня совсем не касаются. И у меня есть много примеров того, что моя стратегия поведения – верна. Например, я прожил год с семьей в Америке, а потом вернулся в Россию и стал жить один. Мне было 16 лет в тот момент. Практически сразу, как только я приехал, в России начался путч. И все те, кто остался в Америке, очень переживали за то, что происходит в России, так как они смотрели телевизор, а там – танки в Москве, ужас, кошмар… А я сам все видел своими глазами и знаю, что вообще ничего страшного не было. Все, что показывали по телевизору, было высосано из пальца. Я пошел в магазин и купил себе фотопленку, чтобы снимать эти самые танки. Это был первый сигнал к тому, что все в порядке – где возврат к тоталитаризму, если фотопленку в магазине продают? Если магазин открыт? Если я спокойно могу ходить с фотоаппаратом и все снимать? В России в тот момент было зарождение медиапространства «плохих новостей». Потому что если все новости будут хорошими, то никто не будет читать газеты и смотреть телевизор, это же очевидно! Сразу всем станет скучно. А когда новости плохие, то ты постоянно живешь в ожидании того, что завтра – война или что все умрут от СПИДа, или от голода. Тогда тебе и дальше хочется потреблять новостной продукт. Мне же это не интересно. И вот я уже столько лет живу, не читая новостей, а ничего за эти годы не изменилось. Я занимаюсь своим делом, дело это растет, я развиваю компанию – у нас уже около 120 человек работает. Получается, что наша студия – самая большая в этой стране. И все происходит только потому, что я не читаю новостей. Может быть, если бы кто-то еще перестал читать новости, а занялся бы делом, вместо того, чтобы сидеть и переживать, то и у него получилось бы.


(c) http://publicweb.ru/2007/11/21/39

понедельник, 17 мая 2010 г.

После апдейта VDSManager не появилось поле "Шаблон конфига"

Фикс:

rm -rf /usr/local/ispmgr/var/.xmlcache/
killall -9 -r vdsmgr

Насильное обновление VDSManager даже если автообновление запрещено

/usr/local/ispmgr/sbin/update.sh --force vdsmgr

Пишем модуль ядра Linux

http://takeworld.blogspot.com/2010/05/linux.html

Менеджер очередей на Erlang: RabbitMQ

http://www.rabbitmq.com

Debian + vim + ctags

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

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


Переходим в папку проекта с кодом (у меня это С):
cd /usr/src/php5-5.2.6.dfsg.1/


Собираем базу:
ctags -R *


Результатом работы программы является файл tags:
ls -al | grep tags
-rw-r--r-- 1 root root 4062045 May 17 14:31 tags


Теперь открываем любой файл:
vi main/php_ini.c


После этого выбираем какую-либо функцию и жмем CTRL+] и нас перебрасывает на ее реализацию :) Аналогично работает и со структурами данных - щелкаем по ней и нас перебрасывает на ее описание :)

http://linux.byexamples.com/archives/177/vim-with-ctags/

Навигация по коду крупных проектов: cscope + vim

В прошлой статье мы настроили cscope, теперь пришел черед интегрировать его в vim: http://phpsuxx.blogspot.com/2010/05/debian-cscope.html

Теперь добиваемся глубокой интеграции с vim.

Для начала нужно указать пути к БД символов:
CSCOPE_DB=/usr/src/php5-5.2.6.dfsg.1/cscope.out; export CSCOPE_DB


Теперь просто запускаем vim и выполняем:
:cscope help


либо в краткой форме:
:cs help


Теперь пробуем обратится к БД cscope:
:cs find g _zend_class_entry


Если получаем облом:
E567: no cscope connections


То делаем следующее:
:cs add /usr/src/php5-5.2.6.dfsg.1/cscope.out


Но есть способ проще:

Добавляем следующее в ~/.vimrc

if has("cscope")
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
endif


И все, теперь файл будет подхватываться на автомате или браться из переменной среды!

Основано на: http://cscope.sourceforge.net/cscope_vim_tutorial.html и http://vimdoc.sourceforge.net/htmldoc/if_cscop.html

Навигация по коду крупных проектов: Debian + cscope

Итак, имеем крупный проект, в моем примере это PHP, так как я активно мучаю его внутренности:

apt-get install -y dpkg-dev
cd /usr/src
apt-get sources php5-cgi
cd php5-5.2.6.dfsg.1


В этом проекте крайне мало файлов:
# find | grep .c | wc -l
4352
# find | grep .h | wc -l
6858


И навигация по ним крайне проста! Ага, поверили? :)

Итак, как возможно ориентироваться в куче этих файлов? Разумеется, найти нужную функцию по имени / комментариям можно посредством:
grep -HiR 'func_name' *


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

На помощь нам приходит утилита cscope: cscope - Interactively examine a C program source


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


Теперь запускаем индексацию нашего дерева кодов:
cd php5-5.2.6.dfsg.1
# -b означает только создание индекса, без запуска оболочки
# -q ускоренный индекс
# -k "режим ядра с игнором /usr/include", полезен при работе с libc, kernel
# -R рекурсивный просмотр вложенных директорий
cscope -b -q -R


В итоге мы получим ряд файлов в папке с кодом:

ls -al | grep csc
-rw-r--r-- 1 root root 106496 May 17 12:57 cscope.in.out
-rw-r--r-- 1 root root 138386 May 17 12:57 cscope.out
-rw-r--r-- 1 root root 188928 May 17 12:57 cscope.po.out


Где: scope.in.out, cscope.po.out - файлы с инвертированным индексом, cscope.out - собственно файл с базой данных кода.

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

# -d только запуск оболочки, без переиндексации
cscope -d


Теперь для примера осуществим поиск тела функции zend_alter_ini_entry:
Find this global definition: zend_alter_ini_entry


Как видите, программа сходу выдает тело функции без кучи промежуточных поисков.

Далее, давайте попробуем поискать тип данных _zend_class_entry:
Find this global definition: _zend_class_entry


И тут тоже сто процентный успех! Не правда ли, потрясающе?

Выход из оболочки по CTRL+d. Переключение между списком найденных файллв и меню, TAB.

Основано на: http://cscope.sourceforge.net/large_projects.html

Debian APT sources.list для FastVPS.ru

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


На всех новых машинах он именно такой.

2.6.34 вышло, ура!

http://kernelnewbies.org/LinuxChanges

Включение бинарных логов для MySQL на Debian

Включение бинарых логов является первым этапом настройки репликации, оно производится на мастере (master-server).

Открываем конфигурацию:
vi /etc/mysql/my.cnf


Там будут следующие записи:

#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name


Приводим их в вид (для активации бинарного логгирования необходимо - указать идентификатор сервера, server-id и указать путь к бинарному логу, log_bin):

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name


Перезапускаем СУБД для применения настроек:
/etc/init.d/mysql restart


Убеждаемся, что бинарный лог создался и начинает расти в размере:
ls -al /var/log/mysql
total 16K
drwxr-s--- 2 mysql adm 4.0K 2010-05-17 04:40 .
drwxr-xr-x 14 root root 4.0K 2010-05-16 06:25 ..
-rw-rw---- 1 mysql adm 471 2010-05-17 04:41 mysql-bin.000001
-rw-rw---- 1 mysql adm 32 2010-05-17 04:40 mysql-bin.index


Ну вот, собственно и все.

Источник: http://dev.mysql.com/doc/refman/5.0/en/replication-howto-masterbaseconfig.html и http://www.linuxjournal.com/content/database-replication-mysql?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+linuxjournalcom+(Linux+Journal+-+The+Original+Magazine+of+the+Linux+Community)&utm_content=Google+Reader

Доступ к оперативной памяти по сети? Сказка? Реальность!

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

воскресенье, 16 мая 2010 г.

Во сколько раз blueray хуже, чем настоящее кино?

Где-то в два:
Cinema is currently being played at a resolution of 2485×2970 or 1420×3390. My 1080p Blu-ray playback is a mere 1920×1080 by comparison.


http://www.tkarena.com/Default.aspx?tabid=57&EntryID=107

Критическая уязвимость в расширении ISPManager "mysqldumpupload"

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

Отключать так - настройка сервера, расширения, выбираем mysqldumpupload и нажимаем синюю лампочку на панели справа.

http://forum.searchengines.ru/showthread.php?t=499405

Тестирование atime vs noatime и различных журналов ext3

http://www.ffnn.nl/pages/articles/linux/server-wide-performance-benchmarking.php

Debian, Apache, /var/log/apache2/error.log

Вот много вот такой ереси:
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1


В интернетах пишут, что баг из-за кривой стандартной программы host: http://www.kathmann.com/2008/10/29/debian-apache-2-error-invalid-query-name-1/

У меня стояла именно она:
dpkg -l | grep host | grep 'utility for querying DNS servers'
ii host 20000331-9 utility for querying DNS servers


Ставим замену:
apt-get install -y bind9-host


При этом стандартная утилита host будет удалена:
dpkg -l | grep host | grep 'utility for querying DNS servers'

Debian, dmesg и не читаемое время

Время в dmesg представлено в крайне странном формате:

[2664083.816857] TCP: Peer 80.92.200.53:6262/80 unexpectedly shrunk window 838123551:838124931 (repaired)
[2664928.896796] do_general_protection: 17 callbacks suppressed


Но как узнать, когда именно было выдано определенное сообщение?

Для этого есть спец хак - файл, где время представлено в читаемом виде:
cat /var/log/kern.log


http://ubuntuforums.org/showthread.php?t=484475

суббота, 15 мая 2010 г.

C, strlen

Что вернет
strlen("1\0")
?

1, так как \0 при этом не учитывается, так как является терминирующим символом. Но вот при выделении памяти про него стоит помнить. Индекс же \0 в строке будет = 1, то есть strlen("1\0").

Ура! Вышел CentOS 5.5

Обновляемся:
yum update


cat /etc/redhat-release
CentOS release 5.5 (Final)

пятница, 14 мая 2010 г.

Как обнулить трафик VPS у в VDSManager?

Уверен, у многих была такая задача. И многие видели поле TrafUsed в конфиге /usr/local/ispmgr/etc/vdsmgr.conf:

vds "xx.xx.xx.xx" {
Name xxxx.ru
Owner admin
CPULimit 0
TrafLimit 1000000
TrafUsed 220754
Preset OVZ-3
Backup none
Rate 10mbit
}


Но обнуление трафика тут и последующий перезапуск:
killall -9 -r vdsmgr


Не помогают и трафик через пару минут работы VDSManager возвращается вновь.

Правильно решение выглядит так, открываем:
vi /var/log/isp_summary.log


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

Также еще рекомендую пере запустить процесс vdsmon.

Отдельную благодарность выражаю спонсорам данного поста: strace и /usr/sbin/смекалка.

четверг, 13 мая 2010 г.

Разработка веб-приложений на базе Pylons, Python

Этот пост представляет собой объединение ряда моих постов под общей темой в единый материал по Pylons.

1. Почему Python круче Perl в веб-разработке. Статья
2. Почему Pylons/Python круче Rails/Ruby и Catalyst/Perl? Статья
3. Установка Pylons 0.9.7 на Debian 5 Lenny. Статья
4. Использование Pylons в продакшене: paster + Nginx Статья
5. Создание первого контроллера. Статья
6. Работа с шаблонами. Статья
7. Передача переменных из контроллера в шаблон. Статья
8. Обработка GET/POST параметров. Статья
9. Работа с сессиями. Статья
10. Подключение базы данных (PostgreSQL, MySQL). Статья
11. Работа с БД посредством SQLAlchemy. Статья
12. Работа с моделью из внешних скриптов. Статья
13. Подключение ToscaWidgets к Pylons для работы с формами. Статья
14. Валидация форм посредством ToscaWidgets. Статья
15. Аутентификация посредством AuthKit. Статья
16. Авторизация посредством AuthKit. Статья

Есть также идея написать еще посту про пагинацию, кэширование и REST интерфейсы. Если Вам интересно что-то конкретное, то милости прошу в комменты :)

Установка Piwik на Debian 5

Ставить будем на Debian 5.


cd /var/www
wget http://piwik.org/latest.zip
unzip latest.zip
mv piwik/* ./
rm -rf piwik
rm How\ to\ install\ Piwik.html Manifest.xml latest.zip parameters.xml


Далее исправляем проблему с парвами на файлы (у меня используется PHP как модуль Апача):
chown -R www-data:www-data tmp config


Теперь создаем БД для Piwik:
mysql -uroot -p -e "CREATE DATABASE piwik CHARSET 'utf8'";
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON piwik.* TO 'piwik_user'@'localhost' IDENTIFIED BY 'qwerty' ;"


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

вторник, 11 мая 2010 г.

Новое слово - "Дебиянизм"

Клевое словечко, однако =) Обнаружено вот здеся: http://forums.opensuse.org/archives/sf-archives/archives-software/343125-etc-ld-so-preload.html

Какую же все-таки память отображает ps aux?

Немного поэксперементируем над процессом ispmanager в попытках изучить, что же за магические цифры отображает ps aux:

ps aux | egrep 'ispmgr|USER'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 29586 0.0 0.1 171776 19304 ? S 02:35 0:00 /usr/local/ispmgr/bin/ispmgr


Теперь заюзаем утилиту pmap, которая подробно покажет и расскажет, чем занята память:
pmap -d 29586 | tail -n1
mapped: 171780K writeable/private: 30892K shared: 212K


То есть, VSZ - это как раз и есть mapped (из man ps: virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).). В этом можно убедиться довольно простым образом:


ps aux | egrep 'ispmgr|USER' | grep -v 'grep'; pmap -d 29586 | tail -n1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 29586 0.0 0.1 171780 19388 ? S 02:35 0:00 /usr/local/ispmgr/bin/ispmgr
mapped: 171784K writeable/private: 30896K shared: 212K


С RSS чуть иначе - resident set size, the non-swapped physical memory that a task has used (in kiloBytes). То есть это что-то как раз близкое к writeable/private, но на аж 10 мегабайт меньшее. Так что это лично для меня пока загадка :))

По мотивам: http://www.opennet.ru/base/sys/pmap_memory.txt.html

Какую же все-таки память отображает ps aux?

LD_DEBUG и подробнейший трейсинг работы динамического линкера

Кучу интересной информации о процессе можно получить вот так:
LD_DEBUG=all php -V


Для PHP отрывок выдачи будет вот такой:

1 29320:
2 29320: file=libcrypt.so.1 [0]; needed by php [0]
3 29320: find library=libcrypt.so.1 [0]; searching
4 29320: search cache=/etc/ld.so.cache
5 29320: trying file=/lib/libcrypt.so.1
6 29320:
7 29320: file=libcrypt.so.1 [0]; generating link map
8 29320: dynamic: 0x00007f22d3d83df8 base: 0x00007f22d3b7b000 size: 0x00000000002371c0
9 29320: entry: 0x00007f22d3b7ba30 phdr: 0x00007f22d3b7b040 phnum: 9
10 29320:
11 29320:
12 29320: file=libz.so.1 [0]; needed by php [0]
13 29320: find library=libz.so.1 [0]; searching
14 29320: search cache=/etc/ld.so.cache
15 29320: trying file=/usr/lib/libz.so.1

Трейсинг всех функций ядра, патч

http://elinux.org/Kernel_Function_Trace

понедельник, 10 мая 2010 г.

ISPManager: May 10 19:30:52 [13216] WARNING Access not allowed ip '95.79.232.217'. Rejected.

Это означает, что юзер заблокировал вход для всех, кроме заданного IP.

Снять ее можно так:
vi /usr/local/ispmgr/var/userconf/ispmgr.[user_name]


И удаляем строчку:
Access xx.xx.xx.xx


Перезапускаем ISPManager:
killall -9 -r ispmgr

воскресенье, 9 мая 2010 г.

SMART мониторинг SuperTalent UltraDrive GX

Если пытаться вызывать команду smartctl --all /dev/sda в Debian Lenny на SSD диск SuperTalent UltraDrive, то в ответ мы получим кучу бреда. Это объясняется тем, что версия smartmontools старовата в Дебе и надо собрать smartmontools из svn: http://phpsuxx.blogspot.com/2010/02/smartmontools-5391.html и после этого будет стройная картинка:


smartctl 5.40 2010-05-04 r3103 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family: SuperTalent UltraDrive GX SSD
Device Model: STT_FTM28GX25H
Serial Number: P601148-AFBX-C089053
Firmware Version: 1819
User Capacity: 128,035,676,160 bytes
Device is: In smartctl database [for details use: -P show]
ATA Version is: 8
ATA Standard is: Exact ATA specification draft version not indicated
Local Time is: Sun May 9 23:20:34 2010 MSD
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 0) seconds.
Offline data collection
capabilities: (0x1d) SMART execute Offline immediate.
No Auto Offline data collection support.
Abort Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
No Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x00) Error logging NOT supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 0) minutes.
Extended self-test routine
recommended polling time: ( 0) minutes.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x0000 --- --- --- Old_age Offline - 6
9 Power_On_Hours 0x0000 --- --- --- Old_age Offline - 2281
12 Power_Cycle_Count 0x0000 --- --- --- Old_age Offline - 0
184 Initial_Bad_Block_Count 0x0000 --- --- --- Old_age Offline - 20
195 Program_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0
196 Erase_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0
197 Read_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0
198 Read_Sectors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 606564133
199 Write_Sectors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 313738725
200 Read_Commands_Tot_Ct 0x0000 --- --- --- Old_age Offline - 14241593
201 Write_Commands_Tot_Ct 0x0000 --- --- --- Old_age Offline - 19250806
202 Error_Bits_Flash_Tot_Ct 0x0000 --- --- --- Old_age Offline - 642388
203 Corr_Read_Errors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 621881
204 Bad_Block_Full_Flag 0x0000 --- --- --- Old_age Offline - 0
205 Max_PE_Count_Spec 0x0000 --- --- --- Old_age Offline - 10000
206 Min_Erase_Count 0x0000 --- --- --- Old_age Offline - 1
207 Max_Erase_Count 0x0000 --- --- --- Old_age Offline - 8407
208 Average_Erase_Count 0x0000 --- --- --- Old_age Offline - 242
209 Remaining_Lifetime_Perc 0x0000 --- --- --- Old_age Offline - 98
211 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0
212 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0
213 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0


Очень радует параметр: Remaining_Lifetime_Perc, очень интеллектуально :)

Установка только одного пакета из backports на Lenny

vi /etc/apt/sources.list

Добавляем:
deb http://backports.debian.org/debian-backports lenny-backports main


Создаем:
vi /etc/apt/apt.conf


Добавляем туда:
APT::Default-Release "stable";


Далее обновляем репозиторий:
apt-get update

Пробуем обновить какой-либо пакет на:
apt-get upgrade smartmontools

В ответ должны получить сообщение, что у нас самая новая версия. Это правильное поведение, все ок.

Длаее фиксируем исходную версию пакета:
dpkg -l |grep smartmon
ii smartmontools 5.38-2+lenny1 control and monitor storage systems using S.M.A.R.T

Теперь выставляем повышенный приоритет для пакета из backports (стандартно, он ниже, чем у обычных пакетов; пруфлинк):
vi /etc/apt/preferences

Package: smartmontools
Pin: release a=lenny-backports
Pin-Priority: 999

После этого делаем:
apt-get install smartmontools

После этого нужный пакет обновится и будет далее подтягиваться из backports :)

Удостоверяемся в том, что встала именно нужная версия:
dpkg -l | grep smart
ii smartmontools 5.39.1+svn3060-1~bpo50+1 control and monitor storage systems using S.M.A.R.T.


Офсайт backports: http://www.backports.org/dokuwiki/doku.php?id=instructions

Парад Победы 2010

Всех с Праздником!

Вот запись Парада от 1 Канала: http://www.1tv.ru/prj/9may/vypusk/4230

Веб сервис для нагрузочного тестирования (online load testing )

http://loadimpact.com

суббота, 8 мая 2010 г.

Настройка mod_proxy для проксирования https трафика

Включаем нужные модули Апача:
a2enmod proxy
a2enmod proxy_http


И еще, возможно, пригодится:
a2enmod proxy_connect


Перезапуск для включения модулей:
/etc/init.d/apache2 restart



vi /etc/apache2/mods-enabled/proxy.conf


Там удаляем причину перманентного Forbidden Access Deny:
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
#Allow from .example.com
</Proxy>


Добавляем:
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
 Allow from all
</Proxy>


Далее формулируем вот такой vhost:
<VirtualHost xx.xx.xx.xx:443>
ServerName xxx.domain.ru
ServerAlias www.xxx.domain.ru

CustomLog /var/www/httpd-logs/xxx.domain.ru.access.log combined
ErrorLog /var/www/httpd-logs/xxx.domain.ru.error.log

SSLEngine on
SSLCertificateFile /etc/apache2/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server.key

SSLProxyEngine On
ProxyPreserveHost On
ProxyPass / https://yy.yy.xx.zz/
ProxyPassReverse / https://xxx.domain.ru/
</VirtualHost>


После этого все запросы к нашему серверу по протоколу https будут перенаправляться на удаленный сервер ttps://yy.yy.xx.zz, который также отдает нам тарфик в https. Только прошу обратить внимание, иногда приходится выключать .htaccess редиректы, чтобы не было циклов на бэкэнде.

Запросить конкретный vhost с сервера

wget -O- --no-check-certificate --header="Host: yyyy.xxx.ru" https://xx.xx.xx.xx

Как посмотреть статистику proftpd?

Командой:
ftpstats

пятница, 7 мая 2010 г.

Отключение MOD_PHP в ISPManager / Debian, когда для сайта деактивирована поддержка PHP

Краткое изложение проблемы:

У нас на сервере пхп присутствут в дух инкарнациях - как модуль апача (встал стандартно при установке панели) и как фастцги (ставили также через панель). У нас есть пользователь, у которого есть права только на фастцги, возможность работы с ПХП как модулем Апача ему не дана. Этот пользователь создает сайт без поддержки пхп. Какзалось бы - все хорошо. Но если на этот статический сайт залить файл test.php, он исполнится! И при этом ПХП будет рабоатть как Модуль Апача. Как победить эту проблему?"


Фикс:
http://forum.ispsystem.com/ru/showthread.php?t=9134&highlight=%D0%BD%D0%B5%D1%82+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B8+php

Фиксим:
vi /etc/mime.types


Там находим и комментируем все строки с php:

#application/x-httpd-php phtml pht php
#application/x-httpd-php-source phps
#application/x-httpd-php3 php3
#application/x-httpd-php3-preprocessed php3p
#application/x-httpd-php4 php4


Далее открываем файл конфига PHP:
vi /etc/apache2/mods-available/php5.conf


И приводим внутренний блок вот к такому виду:

# Disable PHP for whole server
# AddType application/x-httpd-php .php .phtml .php3
# AddType application/x-httpd-php-source .phps


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

/etc/init.d/apache2 restart


И все оке!

Но если в .htaccess прописано следующее:
AddHandler application/x-httpd-php .php .htm .html


То PHP все равно включится в режиме модуль, но это победить уже проще :)

Что делать если в dmesg - reallocate failed? НЕ ПОВТОРЯТЬ ОПАСНО ДЛЯ ЖИЗНИ!

https://guust.tuxes.nl/~bas/wordpress/?p=12


Имеем: диск /dev/sda и раздел /dev/sda3, входящий в degraded RAID-1 массив /dev/md2. Проблема заключается в том, что на 49% сборки массива, вылетает ошибка ввода-вывода:


ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:58:d1:6a:08/00:00:2d:00:00/40 tag 11 ncq 65536 in
res 51/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:98:d1:6a:08/00:00:2d:00:00/40 tag 19 ncq 65536 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:58:d1:6a:08/00:00:2d:00:00/40 tag 11 ncq 65536 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:98:d1:6a:08/00:00:2d:00:00/40 tag 19 ncq 65536 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:58:d1:6a:08/00:00:2d:00:00/40 tag 11 ncq 65536 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x7fffffff SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/80:98:d1:6a:08/00:00:2d:00:00/40 tag 19 ncq 65536 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
sd 0:0:0:0: SCSI error: return code = 0x08000002
sda: Current [descriptor]: sense key: Medium Error
Add. Sense: Unrecovered read error - auto reallocate failed

Descriptor sense data with sense descriptors (in hex):
72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
2d 08 6b 01
end_request: I/O error, dev sda, sector 755526401
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: cmd 60/08:00:01:6b:08/00:00:2d:00:00/40 tag 0 ncq 4096 in
res 41/40:00:01:6b:08/bc:00:2d:00:00/40 Emask 0x409 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
sd 0:0:0:0: SCSI error: return code = 0x08000002
sda: Current [descriptor]: sense key: Medium Error
Add. Sense: Unrecovered read error - auto reallocate failed

Descriptor sense data with sense descriptors (in hex):
72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
2d 08 6b 01
end_request: I/O error, dev sda, sector 755526401
ata1: EH complete
raid1: sda: unrecoverable I/O read error for block 742915328
SCSI device sda: 1465149168 512-byte hdwr sectors (750156 MB)
sda: Write Protect is off
sda: Mode Sense: 00 3a 00 00
SCSI device sda: drive cache: write back
md: md2: sync done.


В сжатом виде:
dmesg | egrep 'I/O.*sector'
end_request: I/O error, dev sda, sector 755526401
end_request: I/O error, dev sda, sector 755526401


То есть сектор не может быть считан.

Перезагружаемся в LiveCD или FastVPS Rescue и делаем следующее для проверки поднят ли mdraid:

ls -la /dev/md2
brw-rw---- 1 root disk 9, 2 2010-05-07 19:16 /dev/md2


Останавливаем RAID массив, чтобы освободить /dev/sda:
/etc/init.d/mdadm-raid stop


ls -la /dev/md2
ls: cannot access /dev/md2: No such file or directory


Смотрим состояние реаллокетед секторов ДО стирания сектора:
smartctl --all /dev/sda | grep reallo -i
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0


ВНИМАНИЕ!! СЛЕДУЮЩЕЙ КОМАНДОЙ ВЫ МОЖЕТЕ УНИЧТОЖИТЬ ДИСК НАПРОЧЬ:
hdparm --write-sector 755526401 /dev/sda


После этого пробуем прочесть сектор:
hdparm --read-sector 755526401 /dev/sda


Должно выдать кучу нулей.

Теперь смотрим состояние SMART (у меня оно не изменилось, хотя я ожидал увеличения числа Reallocated_Sector_Ct):
smartctl --all /dev/sda | grep reallo -i
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0


Запускаем массив:

/etc/init.d/mdadm-raid start
Assembling MD array md0...done (started [2/2]).
Assembling MD array md1...done (started [2/2]).
Assembling MD array md2...done (initialising [1/2)]).



И ждем, пока будет найден стертый напрочь нами сектор.

Собираем RAID повторно:
mdadm /dev/md2 -a /dev/sdb3


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

Тестируем результат fsck:
fsck.ext3 -f /dev/md2


У меня в итоге все успешно отзеркалилось и диск получилось заменить :)

Еще один вариант решения

Конечно, синхронизировать снова и снова 1.5 тб массивы для поиска очередного битого сектора крайне накладно (синхронизация в свою очередь сбивается от единственного битого сектора) и долго, поэтому более оптимален вариант найти все битые сектора за раз и перетереть их.

Для этого воспользуемся тулзой ddrescue:
apt-get install -y ddrescue screen
screen

После этого очищаем dmesg (чтобы потом из него извлечь номера битых секторов) и запускаем копирование с битого диска в /dev/null:
dmesg -c
ddrescue /dev/sda /dev/null

В ответ нам будет показано красивое окошко:
Press Ctrl-C to interrupt
rescued: 6056 MB, errsize: 0 B, current rate: 115 MB/s
ipos: 6056 MB, errors: 0, average rate: 114 MB/s
opos: 6056 MB
Copying data...

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

GoZeroG - испытать невесомость на себе?

A ZERO-G Experience is available starting at $4,950 per person. Your ZERO-G Experience includes 12-15 parabolas, your own ZERO-G flight suit, ZERO-G merchandise, a Regravitation Celebration, certificate of weightless completion, photos and video of your unique experience. Read more about how it works.


Хочу! Хочу! Хочу!

http://gozerog.com/index.cfm?fuseaction=experience.welcome

четверг, 6 мая 2010 г.

Redis круче Memcached?

Однозначно! http://code.google.com/p/redis/

Во-первых, поддержка списков / множеств / упорядоченных множеств. Во-вторых, возможность асинхронного сброса данных на диск. А также он поддерживает даже мастер-слейв репликацию с низким оверхедом, Это вообще супер для всяких там сессий :) А вот его скоростные характеристики:
Redis is pretty fast!, 110000 SETs/second, 81000 GETs/second in an entry level Linux box


А на мемкэш тем временем куча жалоб на то, что его тридовая версия ацки тупит. На помойку? :)

Представлен VNC-клиент, работающий через web-браузер

Супер! http://www.opennet.ru/opennews/art.shtml?num=26499

Анализ нагрузки на диск на Debian Lenny

Часто приходится слышат: "дисковая подсистема - самое узкое место системы", но кто именно убивает винты никто конкретики обычно не дает. Мы как раз будем собирать конкретику прямо с работющей системы :)


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


Запускаем процесс мониторинга:
nohup iotop --batch --delay 2 --only > /root/iotop_6may.log &


Теперь в файле лога мы увидим нечто вот такое (много-много подобных блоков):

Total DISK READ: 202.58 K/s | Total DISK WRITE: 35.40 K/s
PID USER DISK READ DISK WRITE SWAPIN IO COMMAND
2124 www-data 165.21 K/s 3.93 K/s 0.00 % 8.95 % nginx: worker process
2125 www-data 31.47 K/s 1.97 K/s 0.00 % 0.82 % nginx: worker process
25740 postfix 0 B/s 7.87 K/s 0.00 % 0.09 % tlsmgr -l -t unix -u -c
24583 root 0 B/s 3.93 K/s 0.00 % 0.00 % rsyslogd -c3
6827 www-data 0 B/s 1.97 K/s 0.00 % 0.00 % apache2 -k start


В идеале, оставить сбор лога на сутки, а потом его пропарсить, так данные будут очень точны.

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

Для начала вырезаем заголовки, которые полезной информации нам не несут:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID'


А теперь все это анализируем спец скриптом:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID' | perl -MData::Dumper -e 'my$hs={}; for(<>){ chomp;s/^\s+//g; my@a=split"\\s+",$_; /%\s+([^%]*)$/; $hs->{$1}->{read}+=$a[2];$hs->{$1}->{write}+=$a[4];$hs->{$1}->{swap}+=$a[6]; $hs->{$1}->{io}+=$a[8]; } print "$_\nread: $hs->{$_}->{read} write: $hs->{$_}->{write} swap: $hs->{$_}->{swap} io: $hs->{$_}->{io}\n\n" for reverse sort { my$type="write";$hs->{$a}->{$type} <=> $hs->{$b}->{$type} } keys %$hs;'


Далее, варируя значение $type="write"; выбираем тип сортировки. В самом верху - самый грузящий процесс.

Также немного изменив скрипт, можно научить его делать детализацию не по процесса, а по пользователям:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID' | perl -MData::Dumper -e 'my$hs={}; for(<>){ chomp;s/^\s+//g; my@a=split"\\s+",$_; /\d+\s+(.*?) /; $hs->{$1}->{read}+=$a[2];$hs->{$1}->{write}+=$a[4];$hs->{$1}->{swap}+=$a[6]; $hs->{$1}->{io}+=$a[8]; } print "$_\nread: $hs->{$_}->{read} write: $hs->{$_}->{write} swap: $hs->{$_}->{swap} io: $hs->{$_}->{io}\n\n" for reverse sort { my$type="write";$hs->{$a}->{$type} <=> $hs->{$b}->{$type} } keys %$hs;'

fsck для reiser fs ?

reiserfsck /dev/sda4

Как пролистать все разделы с отображением файловых систем?

parted -l
Model: ATA ST31500341AS (scsi)
Disk /dev/sda: 1500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 32.3kB 4302MB 4302MB primary linux-swap
2 4302MB 6457MB 2155MB primary ext3
3 6457MB 33.3GB 26.8GB primary reiserfs
4 33.3GB 570GB 537GB primary reiserfs


Error: /dev/sdb: unrecognised disk label

среда, 5 мая 2010 г.

Ускоряет / кэширует ли eAccelerator скрипты закрытые IonCube?

Total memory 32.00 mb
Memory in use 2.29 mb (7%)

Free memory 29.71 mb
Cached scripts 34
Removed scripts 0


Судя по этим записям, да :)

Принятие мира таким какой он есть - хорошая черта?

Мужество
Уверенность
Толерантность. Принятие мира таким, какой он есть.


Странный список. Никогда не применял слово толерантность в таком контексте, ново. Хотя от "принятия каким есть" до терпимости - один шаг.

По мотивам: http://tribunska.ru/events/nelli-vlasova-perezhivaesh-strelyajsya/

Статья "Флирт в деловых отношениях" от Елизаветы Трибунской

Рекомендую к прочтению:http://tribunska.ru/woman/flirt/

Очистка templates кэша (templates_c) в WHMCS

Utilities - System Cleanup - Empty Template Cache.

До:

du -sh templates_c/
173M templates_c/


После:

du -sh templates_c/
5.6M templates_c/

Windows 2008 - сравнение версий

http://www.microsoft.com/windowsserver2008/en/us/r2-compare-features.aspx

Установка syck из PECL

При попытке поставить это достижение зарубежного кодопрома:
pecl install syck-0.9.3


Вываливается облом:

checking for syck support... yes, shared
checking for syck files in default path... not found
configure: error: Please reinstall the syck distribution
ERROR: `/tmp/pear/temp/syck/configure' failed


А фича в том, что спецовая либа libsyck-dev (не либа, набор файлов) была в etch:

apt-cache search libsyck
libyaml-syck-perl - Fast, lightweight YAML loader and dumper
libsyck0-dev - YAML parser kit -- development files


Но в Ленни ее нету.

Тянем либу c офсайта http://github.com/indeyets/syck/downloads:


apt-get install bison -y
cd /usr/src
wget http://github.com/downloads/indeyets/syck/syck-0.70.tar.gz
tar -xf syck-0.70.tar.gz
cd syck-0.70
./configure --prefix=/opt/libsyck
make
make install



cd /usr/src
pecl download syck-0.9.3
tar -xf syck-0.9.3.tgz
cd syck-0.9.3
phpize
./configure --with-syck=/opt/libsyck
make
make install


Устанавливаем:
echo 'extension="syck.so"' > /etc/php5/conf.d/syck.ini


Спасибо на том, что либа не совсем либа, а кусок кода:
ldd /usr/lib/php5/20060613/syck.so
linux-vdso.so.1 => (0x00007f4073c21000)
libc.so.6 => /lib/libc.so.6 (0x00007f40736ae000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4073c22000)



P.S. поубивал бы.

Beeline Modem 3g + Mac OS X Leopard = IPV6CP: timeout sending Config-Requests

tail -f /var/log/ppp.log
Wed May 5 15:46:08 2010 : Communicating at 36000 bps.
Wed May 5 15:46:11 2010 : Serial connection established.
Wed May 5 15:46:11 2010 : Using interface ppp0
Wed May 5 15:46:11 2010 : Connect: ppp0 <--> /dev/cu.HUAWEIMobile-Modem
Wed May 5 15:46:12 2010 : PAP authentication succeeded
Wed May 5 15:46:14 2010 : Could not determine remote IP address: defaulting to 10.64.64.64
Wed May 5 15:46:14 2010 : local IP address 172.19.17.10
Wed May 5 15:46:14 2010 : remote IP address 10.64.64.64
Wed May 5 15:46:14 2010 : primary DNS address 217.118.66.243
Wed May 5 15:46:14 2010 : secondary DNS address 64.102.255.44
Wed May 5 15:46:42 2010 : IPV6CP: timeout sending Config-Requests


Если при этом интернет не работает - то смело идите оплачивать услуги. Так как это совершенно не ошибка, лишь предупреждение и с ним Интернет отлично пашет.

Мобильные Яндекс Карты

Это круто :) Разработчикам огромный респект, все на высшем уровне!

Вы еще работаете? Тогда мы идем к Вам!

Когда рабочие завода Эдисона забастовали, требуя прибавки к зарплате. Эдисон сделал изобретения, которые сделали труд этих рабочих ненужным.

Въезд в Мексику по Американской визе


Мексика разрешила безвизовый въезд при наличии визы США
Начиная с 01 мая 2010 года въезд на территорию Мексики с целью туризма, транзита, а также некоторых видов деловых поездок, при наличии действующей визы США, осуществляется безвизово для граждан всех стран. Об этом сообщает посольство Мексики в России. Пребывание на территории Мексики может составлять не более 180 дней за одну поездку, количество поездок неограниченно, отмечается в сообщении. «Газета.Ru»


(с) http://www.gazeta.ru/news/business/2010/05/04/n_1490762.shtml

вторник, 4 мая 2010 г.

Суперскоростное хранилище для PHP

Недавно узнал, что у акселератора APC (кэшера опкода) есть возможность хранения данных на время жизни процесса. Крайне удобно, я считаю :)

Проблемы с установкой memcached на CentOS

yum install memcached
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: ftp.plusline.de
* base: ftp.plusline.de
* epel: mirror.andreas-mueller.com
* extras: centos.intergenia.de
* updates: ftp.plusline.de
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package memcached.i386 0:1.4.5-1.el5 set to be updated
--> Processing Dependency: libevent for package: memcached
--> Processing Dependency: libevent-1.4.so.2 for package: memcached
--> Running transaction check
---> Package libevent.i386 0:1.1a-3.2.1 set to be updated
---> Package memcached.i386 0:1.4.5-1.el5 set to be updated
--> Processing Dependency: libevent-1.4.so.2 for package: memcached
--> Finished Dependency Resolution
memcached-1.4.5-1.el5.i386 from epel has depsolving problems
--> Missing Dependency: libevent-1.4.so.2 is needed by package memcached-1.4.5-1.el5.i386 (epel)
Error: Missing Dependency: libevent-1.4.so.2 is needed by package memcached-1.4.5-1.el5.i386 (epel)
You could try using --skip-broken to work around the problem
You could try running: package-cleanup --problems
package-cleanup --dupes
rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.


Фикс один - ждать пока Центос станет 5.5.

оф описание: https://bugzilla.redhat.com/show_bug.cgi?id=477743

понедельник, 3 мая 2010 г.

Host Gator Hiring!

Linux Administrator: $2,500
Windows Administrator: $2,500
Perl Developer: $2,000
Chat/Phone Technical Support Rep. $500


Это оплата за привод указанных спецов в фирму :) Job-referreal program называется :)

Источник: http://www.hostgator.com/employee-referral.shtml

Кто делал Билайну новый сайт (http://internet.beeline.ru) - печальные кондомы

Простите, наболело. Невозможно пользоваться, нету половины тарифов, куча 404. Это ваще чо?

Далее - в usugi.beeline.ru у меян 14 тарифов для интернета, на сайте описаны только 12. Архив тарифов вообще плюется пустой страницей. Кадры, блин.

А сегодня почти висит uslugi.beeline.ru, после 5 минутного логина нас встречает просто прелестная инфа: "Сумма на балансе: Информация не доступна".

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

воскресенье, 2 мая 2010 г.

Мануал по selinux

http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html/Deployment_Guide/index.html

44-46 разделы.

В каком пакете находится ld.so в Debian?

В пакете libc6.

Пруфлинк:

dpkg -L libc6 | grep /lib/ld-2.7.so
/lib/ld-2.7.so

О работе динамических библиотек под Linux

http://www.ibm.com/developerworks/library/l-shobj/
http://www.ibm.com/developerworks/linux/library/l-dll.html
http://en.wikipedia.org/wiki/Dynamic_linker
http://www.cs.virginia.edu/~dww4s/articles/ld_linux.html (а тут даже ссылки на glibc есть, где именно в коде находится наша либа)
А также:
man ld.so

А Вы еще используете венду на предприятии?

Пора отвыкать, пора отвыкать :))) Вот хейт-спич на тему: http://www.mattheaton.com/?p=237

Теперь в Геленджике есть аэропорт =))

Тем временем, мы открыли продажу авиабилетов из Санкт-Петербурга в Геленджик. Сейчас приобрести билеты можно в собственных офисах продаж ГТК "Россия" и агентствах города, вскоре они также будут доступны на официальном сайте компании. Регулярные рейсы на курорт начнут выполняться с 5 июня.

Открытие нового направления полетов стало возможным благодаря предстоящему вводу в строй современного аэровокзала. Новый аэропорт получил свидетельство о государственной регистрации 15 апреля 2010г., к 9 мая 2010г. планируется завершение его реконструкции.


(c) http://rossiya-airline.livejournal.com/6510.html

суббота, 1 мая 2010 г.

Проверка всех баз данных MySQL / MyISAM на сервере

При наличии панели ISPManager:
mysqlcheck --check --all-databases -u root -p`cat /usr/local/ispmgr/etc/ispmgr.conf | grep Password | awk '{print $2}' | head -n1`
В общем случае:
mysqlcheck --check --all-databases -u root -p
Для фикса надо добавить флаг:  --repair   

Google containter Datacenter

http://blog.lystor.org.ua/2010/04/google-container-data-center-tour.html

Очистка очереди exim от сообщений, попадающих под определенный reg exp

grep -HiR 'SMTP error from remote mail server after RCPT TO:...' /var/spool/exim4/* |tr '/:' ' ' | awk '{print $5}' | xargs exim -Mrm

Скрипт для оценки "популярности" функций панели ISPManager среди пользователей

cat /usr/local/ispmgr/var/ispmgr.log | grep 'INFO Request' | grep -v 'mgrctl'| awk '{print $8}' | sed "s/'//g" | tr '&' ' ' | perl -e 'do { for(split " ",$_) { /func=(.*)\./ && print $1,"\n" } } for <>' | sort | uniq -c | sort -g -r

А вот обобщенная версия скрипта для анализа лишь ротированных логов:
zcat /usr/local/ispmgr/var/ispmgr.log.*.gz | grep 'INFO Request' | grep -v 'mgrctl' | awk '{print $8}' | sed "s/'//g" | tr '&' ' ' | perl -e 'do { for(split " ",$_) { /func=(.*)\./ && print $1,"\n" } } for <>' | sort | uniq -c | sort -g -r

Запросы с mgrctl исключаются, так как это API.

Правда жизни, чо =)

http://plumqqz.livejournal.com/108505.html