FastNetMon

Tuesday 30 November 2010

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

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

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

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

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

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

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

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

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

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

Monday 29 November 2010

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

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

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

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

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

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

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

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

import yaml

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

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

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

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

import yaml

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

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

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

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

Saturday 27 November 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Friday 26 November 2010

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

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

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

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

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

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

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

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

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

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

Option DisableAutoUpdate

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

Wednesday 24 November 2010

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

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

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

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

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

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

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

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

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

Tuesday 23 November 2010

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

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

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

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

Замечания

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

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

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

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

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

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

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


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

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

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

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

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

Sunday 21 November 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Saturday 20 November 2010

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

zen-kernel - vanilla ядро ++

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

Friday 19 November 2010

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

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

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

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

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

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

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

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

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

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

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

Thursday 18 November 2010

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. Preemption is turned off in the Server Edition.

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Wednesday 17 November 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Tuesday 16 November 2010

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

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

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

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

На:
DEFAULTKERNEL=kernel-PAE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Monday 15 November 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

на

#!/bin/sh -x

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


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

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

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

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

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

Debian: ERROR: Failed to build gem native extension

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

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

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

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

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

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

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

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

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

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

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

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

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

http://wiki.openvz.org/Vswap

Sunday 14 November 2010

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

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

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

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

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

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

Легко:
killall -u user_name

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

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

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

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

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

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

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

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

Advanced - Advanced Network - Enable UPnP.

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

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

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

Saturday 13 November 2010

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

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

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

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

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

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

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

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

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

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

http://timetobleed.com/

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

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

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

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

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

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

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

Какой эффект разгрузки процессора дает использование tso для сетевой карты?

Очень неплохой ни потоках более гигабита: http://kerneltrap.org/node/397

Tx/Rx TCP file send long (bi-directional Rx/Tx):
w/o TSO: 1500Mbps, 82% CPU
w/ TSO: 1633Mbps, 75% CPU

Tx TCP file send long (Tx only):
w/o TSO: 940Mbps, 40% CPU
w/ TSO: 940Mbps, 19% CPU

По материалам: http://timetobleed.com/slides-from-highload/

Реализация SQL поверх NoSQL хранилища Redis

http://code.google.com/p/redisql/wiki/CommandReference

Жесть! Жесть!

По наводке: http://slach.livejournal.com/315623.html

Friday 12 November 2010

Что такое Linux capabilities?

А это есть очень охрененная штука: http://linux.die.net/man/7/capabilities

Как пример использования - бинд непривилегированного сервиса на порт ниже 1024го.

На OpenVZ mainstream, есть патчи от grsecurity

Вот обнаружил такую фишку на ядре 2.6.18-194.17.1.el5.028stab070.7:

find /proc/| grep grse
/proc/sys/fs/grsecurity
/proc/sys/fs/grsecurity/grsec_lock
/proc/sys/fs/grsecurity/tpe_restrict_all
/proc/sys/fs/grsecurity/tpe_gid
/proc/sys/fs/grsecurity/tpe

Вот такой вот частичный порт. Но обращаю внимание, что бОльшая часть фич Grsecurity не работает в OpenVZ по причине, что механизмы OpenVZ и Grsecurity часто перескаются.

Что же такое этот tpe?

Trusted path execution is another optional feature that can be used to prevent users from executing binaries that are not owned by the root user, or are world-writable. This is useful to prevent users from executing their own malicious binaries or accidentally executing world-writable system binaries that could have been modified by a malicious user.

Источник: http://wiki.openvz.org/Grsecurity

Breaking chroot()

Отлично знаю, что если в chroot попадает юзер с root привилегиями, то он может оттуда сбежать. Но никогда не понимал механизма, как это делается, вот отличная инструкция: http://www.bpfh.net/simes/computing/chroot-break.html

Проблема c10k

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

Apache mod_ruid2 - suexec new generation или нет ?

Вот порекомендовали mod_ruid2 с такой вот заявкой приятных фич:
mod_ruid2 is a suexec module for apache 2.0, based on mod_ruid and mod_suid2

-it runs only on linux because afaik only linux has implemented posix 1003.1e capabilities

-it has better performance than mod_suid2 because it doesn`t need to kill httpd children after one request. it makes use of kernel capabilites and after receiving a new request suids again.

-there are some security issues, for instance if attacker successfully exploits the httpd process, he can set effective capabilities and setuid to root. i recommend to use some security patch in kernel (grsec), or something..

Интересный вариант, однако.

Из недостатков - подозрения, что это потенциально небезопасно. Из используемых технологий - Linux capabilities (да, да, как раз из-за них требуется Posix и Линукс). Из принципа работы - при отфорке процесса даем ему capabilities CAP_SETGID и CAP_SETGID (то есть, работая от обычного пользователя он получает возможность менять себе uid/gid, как пожелает) и если следующий запрос идет к другому сайту (точнее - сайту принадлежащему другому пользователю), с чистой совестью меняем uid / gid на него и продолжаем обработку.

Thursday 11 November 2010

Apache MPM Prefork vs ITK

Вот тесты: http://blog.penumbra.be/2010/05/hosting-attack-mitigation-p1/

Раза в полтора ITK тормознее. Надо бы свои тесты провести.

А вот еще интересные тесты: http://workingdirectory.net/posts/2010/benchmarking-php/

Установка MaxMind php5-geoip на Debian

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

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

Ради теста проверяем путь к базе данных IP:
php -r 'print geoip_db_filename(GEOIP_COUNTRY_EDITION); echo "\n";'
/usr/share/GeoIP/GeoIP.dat

Ради теста получаем страну, где расположен сайт компании FastVPS (ага, все верно, Германия):
php -r 'print geoip_country_code_by_name("85.10.205.196"); echo "\n";'
DE


Вот мануал по обновлению MaxMind базы: http://www.electrictoolbox.com/update-geoip-dat-debian-5/

Источник: http://pecl.php.net/package/geoip

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

Вот такой вот опцией ядра, установив ее в единицу:
cat /proc/sys/vm/oom_kill_allocating_task

Подробнее:
/proc/sys/vm/oom_kill_allocating_task (since Linux 2.6.24)
This enables or disables killing the OOM-triggering task in out-of-
memory situations.

If this is set to zero, the OOM-killer will scan through the entire
tasklist and select a task based on heuristics to kill. This normally
selects a rogue memory-hogging task that frees up a large amount of
memory when killed.

If this is set to nonzero, the OOM-killer simply kills the task that
triggered the out-of-memory condition. This avoids a possibly
expensive tasklist scan.

If /proc/sys/vm/panic_on_oom is nonzero, it takes precedence over
whatever value is used in /proc/sys/vm/oom_kill_allocating_task.

The default value is 0.

Для sysctl.conf это будет строчка:
vm.oom_kill_allocating_task = 1

Установка Confluence WIki на Debian 5 Lenny

Что это: http://www.atlassian.com/software/confluence/

Вот официальная инструкция по установке: http://confluence.atlassian.com/display/DOC/Confluence+Installation+Guide

Ставить будем в режиме EAR/WAR + Tomcat. Для начала ставим Tomcat: http://phpsuxx.blogspot.com/2010/11/apache-tomcat-55-debian-5-lenny.html

Следом поставим MySQL http://phpsuxx.blogspot.com/2009/12/mysql-debian5-lenny.html и создадим в ней пользователя и базу confluence с неким паролем.

Обращаю внимание, что MySQL нужно переконфигурировать следующим образом (источник):
vi /etc/mysql/my.cnf

И в блок [mysqld] добавить строку:
default-character-set=utf8

И применить изменения:
/etc/init.d/mysql restart

После этого нужно затюнить Tomcat, иначе настройки безопасности не дадут confluence запуститься:
vi /etc/default/tomcat5.5

И в самом низу добавляем:
TOMCAT5_SECURITY=no

Если же забыть это сделать, то в логах получим такой вот ужас и неработающий confluence:
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:56 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: start: Starting web application at '/confluence'
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:56 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: start: Starting web application at '/confluence'
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:56,819 INFO [http-8180-Processor25] [com.atlassian.confluence.lifecycle] contextInitialized Starting Confluence 3.4.1 (build #2030)
Nov 11 04:23:56 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:56,924 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [bootstrapContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,380 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [setupContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,421 INFO [http-8180-Processor25] [beans.factory.xml.XmlBeanDefinitionReader] loadBeanDefinitions Loading XML bean definitions from class path resource [bootstrapCacheContext.xml]
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,517 ERROR [http-8180-Processor25] [atlassian.confluence.setup.ConfluenceConfigurationListener] contextInitialized An error was encountered while bootstrapping Confluence (see below): #012Error creating bean with name 'com.atlassian.confluence.plugin.PluginsClassLoaderConfigurationListener' defined in class path resource [bootstrapContext.xml]: Cannot resolve reference to bean 'uberClassLoader' while setting bean property 'delegationClassLoader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012org.springframework.beans.facto
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: ry.BeanCreationException: Error creating bean with name 'com.atlassian.confluence.plugin.PluginsClassLoaderConfigurationListener' defined in class path resource [bootstrapContext.xml]: Cannot resolve reference to bean 'uberClassLoader' while setting bean property 'delegationClassLoader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uberClassLoader' defined in class path resource [bootstrapContext.xml]: Instantiation of bean failed; nested e
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: xception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.atlassian.confluence.util.ConfluenceUberClassLoader]: Constructor threw exception; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)#012#011at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)#012#011at java.security.AccessController.checkPermission(AccessController.java:546)#012#011at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)#012#011at java.lang.SecurityManager.checkCreateClassLoader(SecurityMa
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: nager.java:594)#012#011at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:178)#012#011at java.lang.ClassLoader.(ClassLoader.java:226)#012#011at com.atlassian.confluence.util.ConfluenceUberClassLoader.(ConfluenceUberClassLoader.java:20)#012#011at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)#012#011at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)#012#011at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)#012#011at java.lang.reflect.Constructor.newInstance(Constructor.java:513)#012#011at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:85)#012#011at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanIns
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: tance(AbstractAutowireCapableBeanFactory.java:722)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:386)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)#012#011at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)#012#011at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:267)#012#011at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBea
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: nFactory.java:1100)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:862)#012#011at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)#012#011at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)#012#011at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)#012#011at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:248)#012#011at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:820)#012#011at org.springframework.context.support.
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: AbstractApplicationContext.registerListeners(AbstractApplicationContext.java:597)#012#011at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:349)#012#011at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:122)#012#011at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:76)#012#011at com.atlassian.confluence.setup.ConfluenceClassPathXmlApplicationContext.(ConfluenceClassPathXmlApplicationContext.java:26)#012#011at com.atlassian.confluence.setup.ConfluenceConfigurationListener.initialiseBootstrapContext(ConfluenceConfigurationListener.java:75)#012#011at com.atlassian.confluence.setup.ConfluenceConfigurationListener.contextInitialized(ConfluenceConfigurationListener.java:40)#012#011at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)#012#011at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)#012#011at org.apache.catalina.manager.M
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: anagerServlet.start(ManagerServlet.java:1173)#012#011at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:549)#012#011at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)#012#011at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)#012#011at java.lang.reflect.Method.invoke(Method.java:597)#012#011at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)#012#011at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)#012#011at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)#012#011at org.apache.catalina
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: .core.Ap
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: plicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)#012#011at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:192)#012#011at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)#012#011at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)#012#011at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)#012#011at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)#012#011at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)#012#011at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)#012#011at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)#012#011at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)#012#011at org.apach
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: e.coyote.http11.Http11Processor.process(Http11Processor.java:874)#012#011at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)#012#011at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)#012#011at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)#012#011at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)#012#011at java.lang.Thread.run(Thread.java:619)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,525 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.config.bootstrap.BootstrappedContextLoaderListener.canInitialiseContainer(BootstrappedContextLoaderListener.java:26)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,529 ERROR [http-8180-Processor25] [ContainerBase.[Catalina].[localhost].[/confluence]] listenerStart Exception sending context initialized event to listener instance of class com.atlassian.confluence.languages.ReloadBundlesContextListener#012java.security.AccessControlException: access denied (java.util.PropertyPermission confluence.i18n.reloadbundles read)#012#011at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)#012#011at java.security.AccessController.checkPermission(AccessController.java:546)#012#011at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)#012#011at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)#012#011at java.lang.System.getProperty(System.java:650)#012#011at java.lang.Boolean.getBoolean(Boolean.java:221)#012#011at com.atlassian.confluence.languages.ReloadBundlesContextListener.contextInitialized(ReloadBundlesContextListener.java:22)#012#011at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)#012#011at org.apache.catali
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: na.core.StandardContext.start(StandardContext.java:4216)#012#011at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1173)#012#011at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:549)#012#011at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:105)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)#012#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)#012#011at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)#012#011at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)#012#011at java.lang.reflect.Method.invoke(Method.java:597)#012#011at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)#012#011at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)#012#011at org.apache.c
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: atalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)#012#011at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)#012#011at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:192)#012#011at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)#012#011at java.security.AccessController.doPrivileged(Native Method)#012#011at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)#012#011at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)#012#011at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)#012#011at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)#012#011at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)#012#011at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)#012#011at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 108)#012#011at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)#012#011at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)#012#011at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)#012#011at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)#012#011at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)#012#011at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)#012#011at java.lang.Thread.run(Thread.java:619)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,530 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.confluence.setup.ValidLicenseContextListener.shouldRunListener(ValidLicenseContextListener.java:48)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,530 WARN [http-8180-Processor25] [atlassian.config.util.BootstrapUtils] getBootstrapManager Attempting to retrieve bootstrap manager before it is set up: com.atlassian.confluence.upgrade.UpgradeLauncherServletContextListener.contextInitialized(UpgradeLauncherServletContextListener.java:22)
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Error listenerStart
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Error listenerStart
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Context [/confluence] startup failed due to previous errors
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.StandardContext start#012SEVERE: Context [/confluence] startup failed due to previous errors
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: 2010-11-11 04:23:57,532 INFO [http-8180-Processor25] [com.atlassian.confluence.lifecycle] contextDestroyed Stopping Confluence
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'
Nov 11 04:23:57 Debian-50-lenny-64-minimal jsvc.exec[24303]: Nov 11, 2010 4:23:57 AM org.apache.catalina.core.ApplicationContext log#012INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'

Далее увеличиваем размер используемой памяти с 128 стандартных мегабайт до гигабайта (или как минимум 256 мегабайт):
vi /etc/default/tomcat5.5

JAVA_OPTS="-Djava.awt.headless=true -Xmx1024M -XX:MaxPermSize=192m"

Если же оставить стандартные 128, то confluence будет стопорится через раз с ошибкой "java.lang.OutOfMemoryError: Java heap space". Аналогично (офдокументация) с XX:MaxPermSize, у меня без указания явного выдавалась ошибка "jsvc.exec[27023]: Exception in thread "http-8180-Processor25" java.lang.OutOfMemoryError: PermGen space".

Теперь нужно скачать само приложение в формате EAR/WAR, открываем страницу http://www.atlassian.com/software/confluence/ConfluenceDownloadCenter.jspa, там выбираем Linux и щелкаем "Show all", из всего появившегося многообразия нам требуется "Confluence 3.4.1 - EAR/WAR (TAR.GZ Archive)", в данный момент прямая ссылка такая:
http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.4.5.tar.gz

Скачиваем:
mkdir /opt/confluence_distrib
cd /opt/confluence_distrib
wget http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.4.5.tar.gz
tar -xf confluence-3.4.5.tar.gz
cd confluence-3.4.5

Далее переходим к конфигурации:
vi /opt/confluence_distrib/confluence-3.4.5/confluence/WEB-INF/classes/confluence-init.properties

И добавляем там в самый низ:
confluence.home=/opt/confluence/

В этой папке confluence будет хранить все свои данные, не нужно указывать в ее качестве папку с дистрибутивом. Создаем ее:
mkdir /opt/confluence

Даем tomcat`у права на запись в нее:
chown tomcat55:root /opt/confluence

Теперь confluence нужно подключить к Tomcat, открываем конфиг:
vi /etc/tomcat5.5/Catalina/localhost/confluence.xml

И добавляем там следующее:
<Context path="/confluence" docBase="/opt/confluence_distrib/confluence-3.4.5/confluence" debug="0" reloadable="true">
</Context>

Если же Вы хотите, чтобы wiki была доступа по /, то прочтите следующее:
To run Confluence without a context path, change the path in the Context tag to an empty string (""). If not using a context path, your config will need to be saved as ROOT.xml rather than confluence.xml.

In Tomcat, a context path name follows the name of its xml file (except for ROOT.xml where no context path is used. Hence if you wish to change the context path to a different name, change both the context path and the name of the xml file. eg. "/wiki" context path should be saved in file wiki.xml.

То есть, если хотим, чтобы Confluence был доступен по /, то открываем файл:
vi /etc/tomcat5.5/Catalina/localhost/ROOT.xml

И добавляем в него:
<Context path="" docBase="/opt/confluence_distrib/confluence-3.4.5/confluence" debug="0" reloadable="true">
</Context>

Но при этом отвалится "Browse" - "Confluence Admin", это происходит из-за конфликта URL "/admin" админ-интерфейса Confluence c админкой TomCat:
HTTP Status 404 - /admin/console.action
type Status report
message /admin/console.action
description The requested resource (/admin/console.action) is not available.
Apache Tomcat/5.5

Пофиксить это можно отключением admin-интерфейса Tomcat:
mv /etc/tomcat5.5/Catalina/localhost/admin.xml /etc/tomcat5.5/Catalina/localhost/admin.old
/etc/init.d/tomcat5.5 restart

Открываем отладочный лог Tomcat:
tail -f /var/log/daemon.log

Перезапускаем Tomcat для применения настроек:
/etc/init.d/tomcat5.5 restart

Все, теперь заходим по адресу:
http://xx.xx.xx.xx:8180/confluence/

И там нас приветствует инсталлятор confluence и готовимся ввести регистрационные ключи. Далее выбираем "Production Install", External Database -> MySQL, далее выбираем тип соединения "Direct JDBC Connection". У нас язык русский, так что нам грозит использование UTF8, не забываем об этом при конфигурировании СУБД (также вписываем данные от ранее созданной базы):

Driver Class Name:
com.mysql.jdbc.Driver

Database URL:
jdbc:mysql://localhost/confluence?autoReconnect=true&sessionVariables=storage_engine%3DInnoDB&useUnicode=true&characterEncoding=utf8

После этого начинаем загрузку базы, далее выбираем "Example Site", чтобы забить вики тестовым контентом. Далее вписываем свои данные и начинаем разбираться во всей этой байде :)

Далее нужно немного разобраться с настройками. Указываем доменное имя: Browse, Confluence Admin, General Configuration, Edit и в поле "Server Base Url" вписываем доменное имя нашего сервера вместо IP.

Настройка почты. Browse, Confluence Admin, General Configuration, Mail Servers, Add a new SMTP mail server, SMTP Host Address: 127.0.0.1, from wiki@yourdomain.ru, Create.