четверг, 21 октября 2010 г.

mount loop offset


losetup --find --offset 512 file

losetup -a

mkfs.ext3 /dev/loop1
losetup -d /dev/loop1

http://wiki.eeeuser.com/howtocustomrestoreimage:pt2mkcustomimage

суббота, 18 сентября 2010 г.

mtop/mytop in centos

mtop (Mysql Top)

http://packages.sw.be/mtop/

yum -y install perl-Curses
wget http://packages.sw.be/mtop/mtop-0.6.6-1.2.el5.rf.noarch.rpm
rpm -ivh mtop-0.6.6-1.2.el5.rf.noarch.rpm

yum -y install perl-TermReadKey perl-DBD-MySQL perl-DBI perl-Curses
wget http://packages.sw.be/mytop/mytop-1.4-2.el5.rf.noarch.rpm
rpm -ivh mytop-1.4-2.el5.rf.noarch.rpm

mytop -u root --prompt -d mysql

понедельник, 13 сентября 2010 г.

puppet replace some lines in files




http://projects.puppetlabs.com/projects/1/wiki/Simple_Text_Patterns


define replace($file, $pattern, $replacement) { 
  exec { "/usr/bin/perl -pi -e 's/$pattern/$replacement/' '$file'": 
      onlyif => "/usr/bin/perl -ne 'BEGIN { \$ret = 1; } \$ret = 0 if 
/$pattern/ && ! /$replacement/ ; END { exit \$ret; }' '$file'", 
   } 

} 

Example:
 
replace { "/etc/bashrc": 
   file => "/etc/bashrc", 
   pattern => "PS1", 
   replacement => "PS1 DOMAINA.COM" 
} 

вторник, 7 сентября 2010 г.

Некоторые малоизвестные факты о программировании

Программист тратит 10-20% своего времени на написание собственно кода, и большинство программистов пишут всего 10-12 строк кода в день, которые попадают в конечный продукт, независимо от их уровня. Хорошие программисты тратят большую часть оставшихся 90% времени на размышления, исследования и эксперименты в поисках наилучшего решения. Плохие программисты тратят это время на отладку, случайные изменения в коде и последующую проверку его на работоспособность.

«Хороший токарь работает в несколько раз лучше среднего, но хороший программист стоит в 10000 раз больше, чем обычный»
Билл Гейтс.

Хороший программист в 10 раз более продуктивен, чем средний. Отличный программист в 20-100 раз более продуктивен, чем средний. И это не преувеличение — исследования, проводящиеся с 1960-х годов, чётко это показывают. Плохой программист не просто непродуктивен: он не только не выполняет свою работу, но ещё и создаёт проблемы, которые приходится решать другим.

Лучшие программисты тратят очень немного времени на написание кода. По крайней мере того, который попадает в конечный продукт. Программисты, тратящие много времени на код либо слишком ленивы, либо слишком безграмотны, либо слишком высокомерны, чтобы искать существующие решения старых проблем. Отличные программисты — мастера определения и использования стандартных подходов. Хорошие не боятся постоянного рефакторинга в поисках идеальной архитектуры. Плохие же пишут код, которому недостаёт концептуальной целостности, лаконичности, иерархичности, шаблонов проектирования, и его невероятно сложно рефакторить. Проще выбросить плохой код на помойку и начать заново, чем что-то менять в нём.

Программы подчиняются закону энтропии, как и всё остальное во Вселенной. Непрерывные изменения вызывают разрушение программ, которое нарушает целостность изначальной архитектуры. Это неизбежно, но программисты, не принявшие во внимание вопросы целостности, пишут программы, которые разрушаются настолько быстро, что становятся ненужными ещё до своего завершения. Энтропическая ошибка целостности, вероятно, самая распространённая ошибка, приводящая к провалу проектов. А вторая по распространённости — это создание программы, идущей вразрез с желаниями клиента. Разрушение программ замедляет прогресс разработки экспоненциально, поэтому многие проекты приходят к лавинообразно нарастающим срывам бюджета и сроков, и это продолжается до тех пор, пока их окончательно не уничтожат.

В исследовании 2004-го года было обнаружено, что большая часть программных проектов (51%) сталкиваются с критическими проблемами (срыв сроков, превышение бюджета, невыполнение обязательств, нарушения функционала и т.п. — прим. пер.), а 15% полностью проваливаются. Это лучше, чем в 1994-м, когда последних было 31%.

Хотя большая часть программ создаётся командами, это не есть демократическая деятельность. Обычно всего один человек является ответственным за архитектуру, остальные — лишь кодеры.

Программирование — тяжёлый труд. Это очень напряжённая умственная деятельность. Хорошие программисты думают о работе 24 часа 7 дней в неделю. Они пишут лучший код в душе и в своих снах. Поскольку самая важная работа делается вдали от клавиатуры, разработку программных проектов нельзя ускорить, заставляя людей больше работать в офисе, или добавив новых людей в проект.

http://habrahabr.ru/blogs/arbeit/102620/

суббота, 21 августа 2010 г.

debian lenny xen XENBUS: Waiting for devices to initialise...

В Lenny бажный tap:aio
Лечится так

ln -s /usr/lib/xen-3.2-1/bin/tapdisk /usr/sbin
echo xenblktap >> /etc/modules
modprobe xenblktap
/etc/init.d/xend restart

четверг, 19 августа 2010 г.

screen

Ctrl-a q
Send a start signal (associated with Ctrl-q by terminals) to current window. (xon)

Ctrl-a s
Send a stop signal (associated with Ctrl-s by terminals) to current window. (xoff)

Ctrl-a Z
Reset virtual terminal to its "power-on" values. (reset)

http://www.oreillynet.com/linux/cmd/cmd.csp?path=s/screen

вторник, 17 августа 2010 г.

perl file tests

Getting File Information

You can test certain features very quickly within Perl using a series of test operators known collectively as -X tests.

For example, to perform a quick test of the various permissions on a file, you might use a script like this:

#/usr/bin/perl


my (@description,$size);
if (-e $file)
{
push @description, 'binary' if (-B _);
push @description, 'a socket' if (-S _);
push @description, 'a text file' if (-T _);
push @description, 'a block special file' if (-b _);
push @description, 'a character special file' if (-c _);
push @description, 'a directory' if (-d _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
Here is the list of features which you can check for a file

Operator Description
-A Age of file (at script startup) in days since modification.
-B Is it a binary file?
-C Age of file (at script startup) in days since modification.
-M Age of file (at script startup) in days since modification.
-O Is the file owned by the real user ID?
-R Is the file readable by the real user ID or real group?
-S Is the file a socket?
-T Is it a text file?
-W Is the file writable by the real user ID or real group?
-X Is the file executable by the real user ID or real group?
-b Is it a block special file?
-c Is it a character special file?
-d Is the file a directory?
-e Does the file exist?
-f Is it a plain file?
-g Does the file have the setgid bit set?
-k Does the file have the sticky bit set?
-l Is the file a symbolic link?
-o Is the file owned by the effective user ID?
-p Is the file a named pipe?
-r Is the file readable by the effective user or group ID?
-s Returns the size of the file, zero size = empty file.
-t Is the filehandle opened by a TTY (terminal)?
-u Does the file have the setuid bit set?
-w Is the file writable by the effective user or group ID?
-x Is the file executable by the effective user or group ID?
-z Is the file size zero?

http://www.tutorialspoint.com/perl/perl_files.htm

установка magickwand for php на debian

в системе уже должны быть установлены следующие пакеты
imagemagick
libmagic1
libmagick10
libmagick9-dev
php5-dev

Качаем http://www.magickwand.org/download/php/MagickWandForPHP-1.0.7.tar.gz
1.0.8 на lenny не соберется, т.к. ей требуется более свежий imagemagick

wget http://www.magickwand.org/download/php/MagickWandForPHP-1.0.7.tar.gz
tar -xzvf MagickWandForPHP-1.0.7.tar.gz
cd ./MagickWandForPHP-1.0.7/
phpize
ln -s /usr/bin/Wand-config /usr/bin/MagickWand-config
./configure
sed -i 's/-lMagickWand//g' Makefile
sed -i 's/-lMagickCore//g' Makefile
make
make install

vi /etc/php5/conf.d/magickwand.ini
[magickwand]
extension="magickwand.so"

локальная установка модулей php

Имеется хостинг сервер debian linux с панелью ispmanager и php в режиме fastcgi
Требуется установить расширение php для определенного пользователя, не затрагивая при этом глобальную конфигурацию.

Рассмотрим пример с пользователем default и расширением ssh2

cd /var/www/default/data/
sudo -u default -s
mkdir src
cd src
wget http://pecl.php.net/get/ssh2-0.11.0.tgz
tar -xzvf ssh2-0.11.0.tgz
cd ssh2-0.11.0
phpize
./configure
make
mkdir /var/www/default/data/php-bin/ext
cp modules/ssh2.so /var/www/default/data/php-bin/ext/

cd /var/www/default/data/php-bin
vi php.ini

[ssh2]
extension_dir=/var/www/default/data/php-bin/ext
extension="ssh2.so"

выполняем
php -m -c /var/www/default/data/php-bin/php.ini | less
и ищем там ssh2
на warning'и не обращаем внимания

php -i -c /var/www/default/data/php-bin/php.ini | less
и видим

ssh2

SSH2 support => enabled
extension version => 0.11.0-dev
libssh2 version => 0.18
banner => SSH-2.0-libssh2_0.18
remote forwarding => enabled
hostbased auth => enabled
polling support => enabled
publickey subsystem => enabled

Правда при этом ломаются все остальные модули, т.к. extension_dir не может содержать более одного значения

понедельник, 16 августа 2010 г.

apache2 mod_vhost_limit

Restrict the number of simultaneous connections per vhost

sources http://sisyphus.ru/en/srpm/Sisyphus/apache2-mod_vhost_limit/sources

Install

tar -xzvf mod_vhost_limit-0.2.tgz
cd mod_vhost_limit-0.2/
apxs2 -i -c -n mod_vhost_limit.so mod_vhost_limit.c

vi httpd.conf
LoadModule vhost_limit_module modules/mod_vhost_limit.so

ExtendedStatus On
MaxVhostClients 30

Save and restart apache

In apache error.log

[Tue Aug 17 02:17:46 2010] [warn] Vhost Limit : Access to domain.com deferred, Max Clients 10 exceeded (11 currently)
[Tue Aug 17 02:18:55 2010] [warn] Vhost Limit : Access to domain.com deferred, Max Clients 10 exceeded (13 currently)
[Tue Aug 17 02:18:55 2010] [warn] Vhost Limit : Access to domain.com deferred, Max Clients 10 exceeded (12 currently)

mod_slotlimit

http://sourceforge.net/projects/mod-slotlimit/

Модуль для организации ограничений для защиты от излишнего потребления ресурсов в системах массового хостинга. Возможно определить процент от общего объема обращений к apache, которое не может превысить один сайт (например, чтобы каждый сайт не мог потребить больше 15% общих ресурсов). Также позволяет определить максимальное число одновременных коннектов или число одновременных обращений от одного IP для каждого сайта.

PS.
Код ужасен. Радует то что его мало.
Можно написать свой, максимально коротко и ясно.

воскресенье, 15 августа 2010 г.

PHP 5.2.10 и выше конфликтует с Zend Optimizer до версии 3.3.3 включительно

PHP 5.2.10 и выше конфликтует с Zend Optimizer до версии 3.3.3 включительно.
Использование PHP 5.2.10 и выше возможно с Zend Optimizer версии 3.3.4/3.3.9 и выше.

http://www.hostcms.ru/forums/22/2992/

суббота, 14 августа 2010 г.

perl generate random string

sub generate_random_string
{
my $length_of_randomstring=shift;# the length of
# the random string to generate

my @chars=('a'..'z','A'..'Z','0'..'9','_');
my $random_string;
foreach (1..$length_of_randomstring)
{
# rand @chars will generate a random
# number between 0 and scalar @chars
$random_string.=$chars[rand @chars];
}

return $random_string;
}

print generate_random_string(14);

вторник, 1 июня 2010 г.

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

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

пятница, 23 апреля 2010 г.

pipe status return code

$ set -o pipefail
$ grep steve /etc/passwd | cut -f5 -d: --bogus-option | tr '[a-z]' '[A-Z]'
cut: unrecognized option `--bogus-option'
Try `cut --help' for more information.
$ echo $?
1

Example of using the PIPESTATUS variable, and referencing all elements of the array using ${PIPESTATUS[@]}:
$ grep steve /etc/passwd | cut -f5 -d: --bogus-option | tr '[a-z]' '[A-Z]'
cut: unrecognized option `--bogus-option'
Try `cut --help' for more information.
$ echo ${PIPESTATUS[@]}
141 1 0

Оригинал
http://phpsuxx.blogspot.com/2010/04/blog-post_2624.html

четверг, 22 апреля 2010 г.

ssl key and crt verify

echo -n test | /usr/bin/openssl rsautl -sign -inkey localhost.key | /usr/bin/openssl rsautl -verify -inkey localhost.crt -certin

среда, 21 апреля 2010 г.

arpsend

arpsend -c 1 -w 1 -U -i 192.168.1.10 -e 192.168.1.10 eth0

arpsend sends ARP packets on device interface to detect or update neighbours ARP caches with a given IP.

executed by /usr/lib64/vzctl/scripts/vps-functions

remove ip from interface on linux

ip address del 192.168.8.9/24 brd + dev eth0

вторник, 20 апреля 2010 г.

install mod_fakephp on debian

svn co http://svn.dmi.me.uk/mod_fakephp/trunk mod_fakephp
cd mod_fakephp/src/
apxs2 -i -c -n mod_fakephp.so mod_fakephp.c


cd /etc/apache2/mods-available/
echo "LoadModule fakephp_module /usr/lib/apache2/modules/mod_fakephp.so" > fakephp.load

cd ../mods-enabled/
ln -s ../mods-available/fakephp.load fakephp.load
/etc/init.d/apache restart

понедельник, 5 апреля 2010 г.

.htaccess php_flag with fastcgi on debian

apt-get source apache2
cd apache2-2.2.9/
vi dummy_php_options.patch


--- httpd-2.0.59/server/core.c 2006-07-12 07:40:55.000000000 +0000
+++ httpd-2.0.59/server/core.c 2006-12-20 16:54:16.000000000 +0000
@@ -1638,6 +1638,11 @@
"> directive missing closing '>'", NULL);
}

+static const char *php_dummy_handler(cmd_parms *cmd, void *dummy, const char *name, const char *value)
+{
+ return NULL;
+}
+
static const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg)
{
const char *errmsg;
@@ -3155,6 +3160,10 @@

static const command_rec core_cmds[] = {

+/* Dummy php_* commands */
+AP_INIT_TAKE2("php_value", php_dummy_handler, NULL, OR_OPTIONS, "Dummy PHP Value Modifier"),
+AP_INIT_TAKE2("php_flag", php_dummy_handler, NULL, OR_OPTIONS, "Dummy PHP Flag Modifier"),
+
/* Old access config file commands */

AP_INIT_RAW_ARGS("


patch -p1 < dummy_php_options.patch

fakeroot debian/rules binary

dpkg -i ../apache...


wget http://pecl.php.net/get/htscanner-0.9.0.tgz
tar -xzf htscanner-0.9.0.tgz
cd htscanner-0.9.0
phpize
./configure

need php_flag patch
vi htscanner.c
search static int value_hnd
and change
//if (!strcasecmp(value, "On") || (value[0] == '1' && value[1] == '\0')) {
if (((value[0] == 'O' || value[0] == 'o' ) && value[1] == 'n' ) || (value[0] == '1')) {

make
make install

vi /etc/php5/conf.d/htscanner.ini
[htscanner]
extension="htscanner.so"
config_file=".htaccess"
default_docroot=/
default_ttl=300
stop_on_error = 0

пятница, 2 апреля 2010 г.

centos kernel 2.6.33 build rpm


install rpm-build
install redhat-rpm-config
yum install gcc
yum install ncurses-devel
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.bz2
tar -xjf linux-2.6.33.2.tar.bz2
cd linux-2.6.33.2
make menuconfig
General setup ---> enable deprecated sysfs features which may confuse old userspace
append scripts/package/mkspec

echo "%post"
echo "if [ \`uname -i\` == \"x86_64\" -o \`uname -i\` == \"i386\" ]; then"
echo " if [ -f /etc/sysconfig/kernel ]; then"
echo " /bin/sed -i -e 's/^DEFAULTKERNEL=kernel-smp$/DEFAULTKERNEL=kernel/' /etc/sysconfig/kernel || exit \$?"
echo " fi"
echo "fi"
echo "/sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install "$KERNELRELEASE" || exit \$?"
echo ""

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


make -j4 binrpm-pkg
rpm -ihv /usr/src/redhat/RPMS/x86_64/kernel-2.6.33.2-5.x86_64.rpm

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

perl stderr capture


use IO::CaptureOutput qw/capture/;
my ($stdout, $stderr);

capture sub {
system($command);
} => \$stdout, \$stderr;

четверг, 25 марта 2010 г.

среда, 24 марта 2010 г.

fix init bash ulimits

В debian
vi /etc/init.d/rc
прописываем например ulimit -n 999999

reboot

В centos по всей видимости /etc/rc.d/rc

А вообще скрипт ищется в /etc/inittab

суббота, 13 марта 2010 г.

adaptec raid 1 resize on linux

Допустим нам нужно поменять диски в adaptec'овском рэйде на более вместительные.
Ставим StorMan (пакет управления адаптеком под linux)
Меняем диски по очереди и ждем ребилд.
Потом говорим
arcconf modify 1 from 0 to MAX 1 0 0 0 1

И часа через 3 у нас появляется свободное место.
Проверяется командой fdisk -l /dev/sda

Грузимся с live cd/dvd например Ubuntu
sudo gparted

Удаляем swap, увеличиваем нужный раздел.
Добавляем swap.

Все.

суббота, 27 февраля 2010 г.

secure linux procfs permissions

Есть два способа обезопасить /proc

Первый самый простой и быстрый
chmod 550 /proc
И непривилегированный пользователь не увидит ничего, даже своих процессов.

Второй, пропатчить ядро чтобы пользователь мог видеть только свои процессы.

cd /usr/src/linux/fs/proc
vi base.c
и в функции proc_pid_instantiate меняем

inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
на
inode->i_mode = S_IFDIR|S_IRUSR |S_IXUSR;

Ну и до кучи запретим who и last

chmod 660 /var/run/utmp
chmod 660 /var/log/wtmp

На centos тоже самое поправить в /etc/rc.sysinit и в /etc/logrotate.conf
чтобы при загрузке права не слетали и в /etc/logrotate.conf

в debian /etc/init.d/bootmisc.sh

среда, 24 февраля 2010 г.

как быстро отучить mysql от socket'a и научить работать с localhost по tcp

Как правило нужно это для выноса mysql на отдельный сервер сохраняя при этом localhost в настройках соединения к базам.

Как известно mysql если видит что обращение идет к localhost'у то соединяется с сервером через локальный socket . И никакие настройки отучить его от этого не могут, т.к. это прошито в коде.

Отучить его от этого можно 2-мя способами.

1. Пересобрать mysql заменив
в файле include/mysql_com.h
#define LOCAL_HOST "localhost"

на что-нибудь типа
#define LOCAL_HOST "l0calhost"

После этого mysql не будет воспринимать localhost как нечто особенное, и будет работать с ним по tcp как с обычным хостом.

2. Второй способ - это бинарный патч клиентских библиотек.
Это очень быстро и безболезненно.

Ставим hexedit
hexedit /usr/lib64/mysql/libmysqlclient.so.15.0.0
жмем tab
ищем строку localhost
меняем одну букву и получаем например l0calhost
сохраняем и выходим Ctrl-X

Тоже самое делаем с /usr/lib64/mysql/libmysqlclient_r.so.15.0.0
Меняем IP в /etc/hosts для localhost на наш новый mysql сервер.
Все, теперь можем работать с удаленной базой как с локальной, даже авторизация не побьется, т.к. сервер на удаленной стороне будет авторизовать вас как localhost :)

пятница, 19 февраля 2010 г.

включаем show user_statistics patch на centos5 для mysql-5.0.77

wget http://mirror.corbina.net/pub/Linux/centos/5.4/os/SRPMS/mysql-5.0.77-3.el5.src.rpm
rpm -i mysql-5.0.77-3.el5.src.rpm

wget http://www.percona.com/percona-builds/Percona-SQL-5.0/Percona-SQL-5.0-5.0.87-b20/source/Percona-SQL-50-5.0.87-b20.6.rhel5.src.rpm

rpm -i Percona-SQL-50-5.0.87-b20.6.rhel5.src.rpm
cd /home/rpmbuild/rpm/SOURCES/
cd percona_mysql.5.0.77-b16/
mv * ../

cd /home/rpmbuild/rpm/SPECS/
vi mysql.spec

меняем все что касается патчей на
Patch1: show_patches.patch
Patch2: microslow_innodb.patch
Patch3: profiling_slow.patch
Patch4: userstatv2.patch
Patch5: microsec_process.patch
Patch6: innodb_io_patches.patch
Patch7: mysqld_safe_syslog.patch
Patch8: innodb_locks_held.patch
Patch9: innodb_show_bp.patch
Patch10: innodb_check_fragmentation.patch
Patch11: innodb_io_pattern.patch
Patch12: innodb_fsync_source.patch
Patch13: innodb_show_hashed_memory.patch
Patch14: innodb_dict_size_limit.patch
Patch15: innodb_extra_rseg.patch
Patch16: innodb_thread_concurrency_timer_based.patch
Patch18: innodb_misc_patch.patch
Patch120: innodb_rw_lock.patch
Patch21: mysql-test.patch

и
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch18 -p1
%patch120 -p1
%patch21 -p1

в %configure отключаем ssl
--without-openssl

и комментим make test
# make test

собираем
rpmbuild -bb mysql.spec

и инсталлируем
rpm --force -iv /home/rpmbuild/rpm/RPMS/x86_64/mysql-5.0.77-3.x86_64.rpm
rpm --force -iv /home/rpmbuild/rpm/RPMS/x86_64/mysql-server-5.0.77-3.x86_64.rpm

vi /etc/my.cnf

в [mysqld] добавляем

userstat_running=1


/etc/init.d/mysqld restart
mysql -u root -p

show user_statistics\G
User: root
Total_connections: 1
Concurrent_connections: 0
Connected_time: 707
Busy_time: 0
Cpu_time: 0
Bytes_received: 75
Bytes_sent: 4734
Binlog_bytes_written: 0
Rows_fetched: 0
Rows_updated: 0
Table_rows_read: 0
Select_commands: 0
Update_commands: 0
Other_commands: 3
Commit_transactions: 0
Rollback_transactions: 0
Denied_connections: 0
Lost_connections: 0
Access_denied: 0
Empty_queries: 0

работает

четверг, 18 февраля 2010 г.

установка ядра 2.6.32 на centos 5

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.bz2
tar -xjf linux-2.6.32.7.tar.bz2
cd linux-2.6.32.7
yum -y install gcc
yum -y install ncurses-dev

make menuconfig
обязательно отмечаем
General setup ---> enable deprecated sysfs features which may confuse old userspace
иначе ядро при загрузке выдаст
mount: could not find filesystem '/dev/root'
Kernel panic ...

make all
make modules_install
make install
reboot

включаем pam_limits в suexec под debian

apt-get install lsb-release
apt-get install debhelper
apt-get install libaprutil1-dev
apt-get install sharutils

apt-get source apache2-suexec

cd apache2-2.2.9/
wget http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=27;filename=suexec-203_suexec-pam.dpatch;att=1;bug=268569 -o suexec-203_suexec-pam.dpatch

patch -p1 < suexec-203_suexec-pam.dpatch

vi support/suexec.c

добавляем в начало
#define SUEXEC_PAM_SESSION 1

vi support/Makefile.in
и меняем
$(LINK) $(suexec_OBJECTS)
на
$(LINK) -lpam $(suexec_OBJECTS)
и
$(LINK) $(suexec-custom_OBJECTS)
на
$(LINK) -lpam $(suexec-custom_OBJECTS)

fakeroot debian/rules binary

cd ../
dpkg -i apache2-suexec_2.2.9-10+lenny6_amd64.deb

vi /etc/pam.d/suexec

вписываем
@include common-session
session required pam_limits.so

правим права в
/etc/security/limits.conf

/etc/init.d/apache2 restart

Теперь все cgi и fcgi процессы лимитируются через limits.conf

вторник, 16 февраля 2010 г.

заменить строку в файле с помощью perl

perl -p -i -e "s/Listen.*/Listen 8081/g" /etc/httpd2/ports.conf

воскресенье, 7 февраля 2010 г.

включаем show user_statictics в mysql под debian

apt-get source mysql-server
wget --no-check-certificate https://www.byte.nl/downloads/mysql/5.0.45-debian/99_mysql-dfsg-5.0_5.0.45-3~bpo40+1byte4.dpatch

cd mysql-dfsg-5.0-5.0.51a/
patch -p1 < 99_mysql-dfsg-5.0_5.0.45-3~bpo40+1byte4.dpatch

vi mysql-test/mysql-test-run
Вставляем exit 0; чтобы пропустить все тесты (очень долгое занятие)
#!/usr/bin/perl
# -*- cperl -*-
exit 0;


fakeroot debian/rules binary
cd ..
dpkg -i mysql-server-5.0_5.0.51a-24+lenny2+spu1_amd64.deb

mysql -u root -p

mysql> show user_statistics \G
*************************** 1. row ***************************
User: root
Total_connections: 1
Concurrent_connections: 1
Connected_time: 1158
Busy_time: 1
Rows_fetched: 4
Rows_updated: 2
Select_commands: 4
Update_commands: 8
Other_commands: 27
*************************** 2. row ***************************
User: debian-sys-maint
Total_connections: 30
Concurrent_connections: 0
Connected_time: 0
Busy_time: 13
Rows_fetched: 284
Rows_updated: 0
Select_commands: 53
Update_commands: 0
Other_commands: 2
2 rows in set (0.00 sec)

mysql>

пятница, 5 февраля 2010 г.

linux 2.6.32 & CONFIG_USER_SCHED=y

собираем linux 2.6.32 с CONFIG_USER_SCHED=y
и получаем

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8981 test1 20 0 4016 752 356 R 50 0.0 0:32.35 gzip
8982 test1 20 0 4016 756 356 R 50 0.0 0:32.23 gzip
8983 test1 20 0 4016 752 356 R 50 0.0 0:31.86 gzip
8984 test1 20 0 4016 756 356 R 50 0.0 0:31.35 gzip
8992 test2 20 0 4016 756 356 R 17 0.0 0:12.07 gzip
8987 test2 20 0 4016 756 356 R 17 0.0 0:13.72 gzip
8988 test2 20 0 4016 756 356 R 17 0.0 0:13.54 gzip
8993 test2 20 0 4016 756 356 R 17 0.0 0:11.98 gzip
8994 test2 20 0 4016 756 356 R 17 0.0 0:11.95 gzip
9010 test2 20 0 4016 756 356 R 17 0.0 0:04.18 gzip
9012 test2 20 0 4016 756 356 R 17 0.0 0:04.07 gzip
9013 test2 20 0 4016 756 356 R 17 0.0 0:04.07 gzip
9015 test2 20 0 4016 756 356 R 17 0.0 0:04.00 gzip
8985 test2 20 0 4016 756 356 R 16 0.0 0:14.04 gzip
8986 test2 20 0 4016 756 356 R 16 0.0 0:13.80 gzip
8991 test2 20 0 4016 760 356 R 16 0.0 0:12.17 gzip

смотрим на распределение %cpu
юзер test1 получает 50% (в системе 4 ядра) при наличии всего 4 процессов
в то время как юзер test2 получает все те же 50% размазанные на все его процессы.
Абсолютно справедливо, как и было заявлено.
Идеально для шаред хостинга.

nginx & apache .htaccess

Включаем контроль доступа по ip в схеме nginx frontend и apache backend

В .htaccess пишем

SetEnvIf Remote_Addr "^10\.11\.12\.13" realremoteaddr
Order Deny,Allow
Deny from all
allow from env=realremoteaddr

где 10.11.12.13 - это разрешенный ip

четверг, 4 февраля 2010 г.

меняем timezone в debian


dpkg-reconfigure tzdata

посмотреть конфиг сборки пакета в debian

apt-get source exim4-daemon-heavy
cd exim4-4.69
fakeroot debian/rules unpack-configs
vi EDITME.exim4-heavy