21.12.2011

Как по фэн-шую установить нужную версию Java на Debian/Ubuntu

Вариантов вообще много. От дебиановского пути до аналога RVM/PyEnv под Java.
Я покажу ручной.

Сначала скачиваем ее на сайте Oracle под свою платформу в tar.gz.

Затем распаковываем и получаем в результате директорию вроде jdk1.7.0_02 :
tar xzf jdk-7u2-linux-x64.tar.gz
Если у Вас старая версия Java, у которой расширение .bin, то надо сделать так:
chmod +x jdk-1_5_0_22-linux-amd64.bin
./jdk-1_5_0_22-linux-amd64.bin

Эту директорию мы переносим туда, где должны храниться все Java-машины:
mkdir /usr/lib/jvm
mv jdk1.7.0_02 /usr/lib/jvm/.

Так как в перспективе будут выходить новые версии Java, то мы создадим симлинк и будем работать только с ним, а в случае установки новой версии, просто положим ее рядом и перенаправим симлинк:
cd /usr/lib/jvm/
ln -s jdk1.7.0_02 java-7-sun

Маленькая ремарка для незнакомых: во всех операционных системах есть переменная $PATH, которая содержит набор путей, где должны лежать программы. То есть если Вы не пишете полный путь к программе (например /bin/ls), а просто пишете ls (понятно, что в текущей директории этого бинарника нету), то система возьме переменную $PATH и проверит в каждой из этих директорий. Как правило, если Вы напишете слово java, то искать его система будет в /usr/bin/java - и он там есть. Но обратите внимание, что это не бинарник, а всего лишь ссылка (симлинк) на него:

# ls -l /usr//bin/java
lrwxrwxrwx 1 root root 22 2011-12-21 13:23 /usr/bin/java -> /etc/alternatives/java

И обратите внимание, что ведет она опять же не туда, где у нас лежит Java-машина, а в alternatives - то есть в точку, где мы можем "диспетчерить" направление между версиями.

Далее смотрим какие у нас версии уже заданы:
update-alternatives --display java

И видим, что на сейчас у нас сконфигурирован всего лишь один путь: /usr/lib/jvm/java-6-sun/jre/bin/java (или вообще ничего нету, а может наоборот накопились версии).
Главное обратите внимание: последний столбик - приоритет. Чем он больше, чем выше.

Но нам нужно добавить свою альтернативу. И добавляем ее со своим приоритетом (обратите внимание, что путь идет до бинарника включительно, и причем идет через симлинк, а не через версию конкретной Java):
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-sun/bin/java 99

Ну вот и все.
Если захотите откатить, то просто переконфигурируйте с выбором другого номера пути:
update-alternatives --config java

А вот команда для тех, кто еще хочет поставить плагин на FireFox (внимание на архитектуру, поставьте свою: amd64 или i386):
update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so" "mozilla-javaplugin.so" "/usr/bin/java java /usr/lib/jvm/java-7-sun/lib/amd64/libnpjp2.so" 1

Проверяется переходом в FireFox на страничку about:plugins


06.12.2011

Как заставить Suexec игнорировать несоответствие UID/GID директорий, программ и запускающего

Вариант для Debian.
Придется пересобрать Suexec.

Нам понадобятся следующие пакеты:
apt-get install dpatch libaprutil1-dev libapr1-dev sharutils libcap-dev autoconf devscripts
Переходим в директорию, где обычно все собираем:
cd /usr/src
Скачиваем:
apt-get source apache2-suexec
Переходим в директорию, из которой надо работать:
cd apache2-2.2.16
Редактируем исходный код:
vi +569 support/suexec.c

И комментируем полностью весь блок:
    /* if ((uid != dir_info.st_uid) ||
        (gid != dir_info.st_gid) ||
        (uid != prg_info.st_uid) ||
        (gid != prg_info.st_gid)) {
        log_err("target uid/gid (%ld/%ld) mismatch "
                "with directory (%ld/%ld) or program (%ld/%ld)\n",
                uid, gid,
                dir_info.st_uid, dir_info.st_gid,
                prg_info.st_uid, prg_info.st_gid);
        exit(120);
    } */

Теперь собираем то, что получилось:
debuild -uc -us
По истечении этой команды директорией выше появятся много пакетов Apache. Нам нужен только один из этих двух:
ls -l ../apache2-suexec*


03.12.2011

Управление хардверным RAID-контроллером LSI MegaSAS

Начну с того, что очень не рекомендую пользоваться контроллерами этого производителя даже не смотря на то, что он показывает неплохие результаты бенчмарков на фоне конкурентов. Причина: полное отсутсвие документации на сайте. Даже опция -help выглядит как издевательство:
...
MegaCli -PdMarkMissing -physdrv[E0:S0,E1:S1,...] -aN|-a0,1,2|-aALL
MegaCli -PdGetMissing -aN|-a0,1,2|-aALL
MegaCli -PdReplaceMissing -physdrv[E0:S0] -arrayA, -rowB -aN
MegaCli -PdPrpRmv [-UnDo] -physdrv[E0:S0] -aN|-a0,1,2|-aALL
MegaCli -EncInfo -aN|-a0,1,2|-aALL
MegaCli -EncStatus -aN|-a0,1,2|-aALL
MegaCli -PhyInfo -phyM -aN|-a0,1,2|-aALL
MegaCli -PhySetLinkSpeed -phyM -speed -aN|-a0,1,2|-aALL
...

Так впечатление, что писать документацию отдали на аутсурс в ЦРУ :)
Так что будем пытаться допереть научным тыком - благо он не раз нас спасал.


Существуют следующие утилиты:
MegaCLI - (CLI - command line interface). Основная управляющая утилита для просмотра состояния и конфигурирования работы контроллера.
MegaRC -  устаревшая текстовая утилита для управления контроллером.
MegaMon - (Mon - monitoring). Демон + клиент для мониторинга.
MegaSM - (SM - storage manager). Какая-то неведомая GUI-ёвая херня на Java. Весит как ядро Linux и требует иксов, что на сервере неприемлемо (не знаю для кого писали, не уж то для десктопов с адаптерами по несколько сотен долларов...).

В официальных репозиториях основных дистрибутивов, видимо, утилиты не распространяются, но скачать их можно тут: LSI public downloads.

Но для Linux там есть только .rpm пакет и неподходящая по битности библиотека lybsysfs.
Пользователи Debian x64 могут воспользоваться собранным мной .deb-пакетиком для 64-битных ОС из всего этого.

Итак следующие команды помогут облегчить жизнь:

22.11.2011

Трассировка iptables

Включаем модуль в ядре:
modprobe ipt_LOG

Включаем правила, которые будут перебрасывать все на трейс (обратите внимание на новую цепочку raw вместо nat/filter). В моем случае я трассировал ping'и и потому включил для ICMP, но Вам надо отконфигурировать под свою задачу:
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

И смотрим за трафиком:
tailf /var/log/kern.log


Когда попользуетесь, не забудьте удалить правила, а то раздел /var забьете (а многие и рутовый):
iptables -t raw -D OUTPUT -p icmp -j TRACE 
iptables -t raw -D PREROUTING -p icmp -j TRACE



Proxmox: гибридная сеть Bridge+NAT

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

Итак у нас есть интерфейс eth0 с сетью 222.111.123.231 (маска и шлюз тоже имеются) и ничего больше. Пусть внутренняя сеть имеет адресацию 192.168.0.0/24.

Сначала нам понадобится дополнительный интерфейс-пустышка, у которого будет собственный внутренний адрес, чтобы хост-машина могла общаться со своими виртуалками, а также работать им шлюзом:
lsmod | grep dummy

Если вывода не было, значит нужно подключить модуль, а если показалось что-то, то этот шаг пропустить.
Импорт модуля:
echo "dummy" >> /etc/modules
modprobe dummy

Теперь надо настроить два интерфейса (реальный eth0 и виртуальный dummy0) и два бриджа (в реальную сеть vmbr0 и в виртуальную vmbr1). Вот так изменится конфиг интерфейсов:
vi /etc/network/interfaces

# Loopback device:
auto lo
iface lo inet loopback

# Wide Area Network
auto vmbr0
iface vmbr0 inet static
  address  
222.111.123.231
  netmask   255.255.255.196
  gateway  
222.111.123.227
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0

# Real phisical device: eth0
auto  eth0
iface eth0 inet manual

# default route to access subnet
up route add -net
222.111.123.226 netmask 255.255.255.196 gw 222.111.123.227 vmbr0

# Local Area Network
auto vmbr1
iface vmbr1 inet static
  address  192.168.0.1
  netmask  255.255.255.0
  bridge_ports dummy0
  bridge_stp off
  bridge_fd 0
  post-up echo 1 > /proc/sys/net/ipv4/ip_forward
  post-up    iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o vmbr0 -j SNAT --to-source
222.111.123.231
  post-up    iptables -t nat -A POSTROUTING -o vmbr1 -j SNAT --to-source 192.168.0.1
  post-down  iptables -t nat -D POSTROUTING -s 192.168.0.0/16 -o vmbr0 -j SNAT --to-source 222.111.123.231
  post-down  iptables -t nat -D POSTROUTING -o vmbr1 -j SNAT --to-source 192.168.0.1


# Dummy device for LAN
auto  dummy0
iface dummy0 inet manual

20.11.2011

Как запретить обычным пользователям биндиться на все порты, включая непривилегированные

Нужно ковыряться в ядре.


Вот здесь объявляется символическое имя:
grep -B 1 PROT_SOCK include/net/sock.h

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024 

А здесь PROT_SOCK используется:
Infiniband: drivers/infiniband/core/cma.c
SCTP: net/sctp/socket.c
IPv6: net/ipv6/af_inet6.c
IPv4: net/ipv4/af_inet.c
SunRPC: net/sunrpc/svc_xprt.c

15.11.2011

Как обычному пользователю забиндиться на привилегированный порт (1-1023)

Как известно все ядра компилируют так, чтобы не-root не мог забиндится на порт 1-1023. Можно конечно пересобрать ядро и поменять эту настройку до компиляции, но поменять этот параметр на готовой работающей системе нельзя.
Есть еще вариант забиндить на непривилегированный порт, а привилегированный туда соединить либо через rinetd, либо через iptables такой командой:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Но зачастую это не подходит, особенно когда TCP-демон возвращает свой URI для работы, а не тот, за которым маскируется.


Неподходят также и варианты запуска через sudo, так как нам не нужен демон, запущенный от рута по причинам безопасности.


Единственные три варианта, это

либо использовать возможность setcap/getcap в новых ядрах:
apt-get install libcap2-bin
setcap 'cap_net_bind_service=+ep' /path/to/daemon

запуск:
/path/to/daemon

либо запускать через authbind:
apt-get install authbind
install -o my_user -m 500 /dev/null /etc/authbind/byport/443

запуск:
authbind /path/to/daemon

либо воспользоваться посредником supervisor:
apt-get install supervisor
и отконфигурировать его так.


***************
вообще команда install не особо популярна, но я ее написал, чтобы сократить количество команд. Если не понимаете, что она делает, то просто сделайте так:
touch /etc/authbind/byport/443
chown my_user /etc/authbind/byport/443
chmod 500 /etc/authbind/byport/443
***************

10.11.2011

Как заставить OpenLDAP работать на основе posixGroup и groupOfNames одновременно

Обычно все при установке применяют схему nis.schema, чтобы была совместимость с Samba и тем самым переводят работу LDAP с groupOfNames на posixGroup.
К сожалению это имеет обратный негативный момент:

"Its use is strongly discouraged because it is very inefficient, but mostly because posixGroup membership is a badly designed grouping philosophy"

Получается, что мы не сможем подключить к нашему LDAP множество хороших сервисов, как например Atlassian Jira. Нужно подключать groupOfNames.

Переходим в директорию со схемами:
cd /etc/ldap/slapd.d/cn=config

Открываем для редактирования схему, посвященную загрузке модулей:
vi cn=module{0}.ldif

В ней будет уже подгружен один модуль - бэкэнд hdb (или bdb):
dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb
structuralObjectClass: olcModuleList
entryUUID: 0a04d41e-3161-1030-9fef-abf604861a01
creatorsName: cn=admin,cn=config
createTimestamp: 20110622211920Z
entryCSN: 20110622211920.678877Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20110622211920Z

07.11.2011

SSH JailKit

Устанавливаем необходимые для сборки пакеты:
apt-get install debhelper devscripts

И желательные для конфигурации:
apt-get install libcap-dev

Переходим в директорию, где будем собирать пакет:
cd /usr/src

Скачиваем его:
wget http://olivier.sessink.nl/jailkit/jailkit-2.14.tar.gz

Распаковываем:
tar xzf jailkit-2.14.tar.gz

Переходим в директорию с пакетом и с удивлением находим, что самый обычный тарбол с сорцами уже готов к сборке на Debian (об этом говорит директория debian с внутренними файлами):
cd jailkit-2.14

В пакете есть неболшой косячок с LSB-тэгами, поэтому можно их до сборки руками поправить:
vi extra/jailkit
#!/bin/sh
#
### BEGIN INIT INFO
# Provides:          jailkit
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the jailkit syslog daemon
### END INIT INFO
#
Осталось только запустить сборку. Во время прохождения инструкций, сборщик споткнется об отсутствие файла *orig*, но не беда. Жмем на Y и идем дальше:
debuild -uc -us
Устанавливаем свежесобранный пакет:
 dpkg -i ../jailkit_2.14-1_i386.deb
Конфигурирование находится под катом.



25.10.2011

Просмотр трафика MySQL

Сначала соберем пакет.

Установим pcap-библиотеку:
apt-get install libpcap-dev

Создаем и переходим в директорию:
mkdir /usr/src/mysqlsniffer
cd /usr/src/mysqlsniffer

Скачиваем:
wget hackmysql.com/code/mysqlsniffer.tgz

Разархивируем:
tar xzf mysqlsniffer.tgz

Компилируем:
gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c

Кидаем утилиту туда, куда полагается по фэн-шую FHS:
mv mysqlsniffer /usr/bin/


Ну и пользуемся благами общества:
mysqlsniffer --verbose --no-mysql-hdrs eth0 | grep COM_QUERY

23.10.2011

Использование WevDAV как замена FTP/FTPS/SFTP/SMB/CIFS

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

Сначала включаем необходимые модули в Apache:

a2enmod dav dav_fs


Далее включаем в виртхосте использование этого модуля директивой DAV On (опять же я опущу все некасающиеся данной темы настройки как например логи, хэндлры и аутентификация):
<VirtualHost *:443>
ServerName upload.nodesquad.com
DocumentRoot /var/www/upload

<Location />
DAV On
<
/Location>

</VirtualHost>
И перегружаем его, чтобы применились настройки:
invoke-rc.d apache2 restart

Теперь можно использовать.
Windows-GUI-клиенты:
плагин WebDAV для Total Commander
JScape AnyClient
WebDrive
BitKinex

Debian-CLI-клиенты:
cadaver и nd - просто консольные клиенты
davfs2 - монтировка ресурсов на постоянной основе как полноценная файловая система
fusedav - тоже самое, что davfs2, только с использованием FUSE

ВНИМАНИЕ: возможность подключить и зааплоадить файлы есть у любого человека, включая злоумышленника. Поэтому в секцию Location очень желательно добавить авторизацию:
<Location />
DAV On

AuthName "My DAV service"
AuthType Basic
AuthUserFile /etc/some_site/htpasswd.users
AuthUserFile /etc/some_site/htpasswd.users
Require valid-user

<
/Location>




22.10.2011

Несохранение вкладок при закрытии FireFox 4-7

Раньше в 3-м FF при первом закрытии браузера с двумя и более табами, он предлагал сохранить табы. При следующем запуске мы могли продолжить с места, где остановились - все табы на месте. В 4-м FF это убрали. Чинится так:
1) Набираем в адресной строке:  about:config и жмем Enter. Тем самым попадаем в полный список настроек, многих из которых нет в менюшках.
2) Находим настройку browser.showQuitWarning и переводим ее в состояние true.

Кстати, раз уж мы тут, можно еще одну настройку подкрутить. Обратили внимание, что если копировать из адресной строки кирилические символы, то они отображаются кракозябрами при последующей вставке (например, когда копируете ссылку из браузера другу в аську)?
Например:
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82,_%D0%B4%D1%80%D1%83%D0%B7%D1%8C%D1%8F!

А теперь там же в about:config сменим network.standard-url.escape-utf8 на false.
И вот уже скопировав строчку при вставке мы видим нормальные http://ru.wikipedia.org/wiki/Привет,_друзья!

12.10.2011

Анекдот

Вот никогда не постил анекдоты в блог, но этот - просто роскошь. Не запощу - потом потеряю.


Едут в одном купе такой подтянутый, в годах, хорошо одетый мужчина и сногсшибательная юная особа, с томным взглядом. Он читает газету, она делает вид, что читает книгу, то и дело постреливая на него глазками. Через некоторое время меж ними происходит следующий диалог:
— Молодой человек, а я вам совсем неинтересна?
— Отчего же, — отвечает тот, — вы просто само очарование.
— Но тогда почему же вы ничего не предпринимаете, ведь это так увлекательно, завоевывать, развлекать женщину, соблазнять ее, вы наверняка умеете это в совершенстве, и быть может тогда вам достанется главный приз.. — вдохновенно улыбалась девушка.
— А смысл? — спросил мужчина, — вот например, скажем, вы любите по утрам свежие круазаны?
— О, да, они такие хрустя..
— А тесто месить любите?
— Ну что вы, мне проще пойти и купить их в булочной, — неудоумевая ответила юная дама.
— Вот и я человек небедный.

Сборка MySQL под Debian

Сначала поставим пакет поддержки AIO (асинхронный ввод-вывод к диску), чтобы движки стораджей, которые это умеют (например InnoDB), скомпилировались с этой поддержкой:
apt-get install libaio1 libaio-dev
Ну и еще поставим специфические для сборки пакеты:
apt-get install debhelper devscripts cmake libedit-dev libreadline-dev

Переходим в директорию, где будем работать:
cd /usr/src

На страничке Download MySQL Community Server переключаем выпадающее меню из "Linux-Generic" в "Source Code". Важно знать, что версии выше 5.1 не соберутся по этому мануалу, потому что у них используется configure.cmake вместо configure. Качайте 5.1.
Загружаем нужную версию, помеченную как Generic Linux (Architecture Independent), Compressed TAR Archive.

Кладем этот пакет в /usr/src


Далее нужно выбрать опции конфигурирования. Их описание имеется тут.

Опубликую сначала стандартные опции конфигурирования MySQL на Debian (добытые утилитой mysqlbug):
./configure  '--build=x86_64-linux-gnu' '--host=x86_64-linux-gnu' '--prefix=/usr' '--exec-prefix=/usr' '--libexecdir=/usr/sbin' '--datadir=/usr/share' '--localstatedir=/var/lib/mysql' '--includedir=/usr/include' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-server-suffix=-24+lenny5' '--with-comment=(Debian)' '--with-system-type=debian-linux-gnu' '--enable-shared' '--enable-static' '--enable-thread-safe-client' '--enable-local-infile' '--with-big-tables' '--with-unix-socket-path=/var/run/mysqld/mysqld.sock' '--with-mysqld-user=mysql' '--with-libwrap' '--without-openssl' '--with-yassl' '--without-docs' '--with-bench' '--without-readline' '--with-extra-charsets=all' '--with-innodb' '--with-archive-storage-engine' '--with-csv-storage-engine' '--with-federated-storage-engine' '--with-blackhole-storage-engine' '--with-sphinx-storage-engine' '--without-embedded-server' '--with-ndbcluster' '--with-ndb-ccflags=-fPIC' '--with-ndb-shm' '--without-ndb-sci' '--without-ndb-test' '--with-embedded-server' '--with-embedded-privilege-control' '--without-ndb-docs' 'CC=gcc' 'CFLAGS=-DBIG_JOINS=1 -O2 -fPIC' 'CPPFLAGS=' 'CXXFLAGS=-DBIG_JOINS=1 -felide-constructors -fno-rtti -O2' 'CXX=g++' 'FFLAGS=-g -O2' 'LDFLAGS=' 'build_alias=x86_64-linux-gnu' 'host_alias=x86_64-linux-gnu' 'CFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -O2 -fPIC  ' 'CXXFLAGS= -DDBUG_OFF -DBIG_JOINS=1 -felide-constructors -fno-rtti -O2   -fno-implicit-templates -fno-exceptions -fno-rtti'

 А мы добавим еще несколько настроек (Вам оно может и не надо, я в качестве примера просто показываю):
'--enable-profiling' '--with-debug' '--with-vio' '--with-charset=utf8'

И наоборот удалим '--with-yassl' и '--without-openssl', потому что они переведены в depricated.


Как вернуть консоль, если приложение зависло.

Маленький ликбез для тех, у кого на экране что-то застряло и нужно попасть на этот же компьютер с возможностью давать команды:

1) Если есть сеть, то самое простое - подключиться по SSH.
2) Можно запускать задачу в скрине (команда screen). И потом отдетачиться от него командой (после нажатия Ctrl+a ничего визуально не изменится, жмите d не ожидая реакции):
Ctrl+a d
3) Переключиться в другую консоль: Ctrl+Alt+F1 (F2,F3,...,F9).
Чтобы вернуться в основную консоль Ctrl+Alt+F7
4) У Вас над кнопкой Insert на клавиатуре есть неприметная клавиша SysRq. Нажмите на Alt+SysRq+e с указанием PID.
5) Можно отправить job в бэкграунд клавишей Ctrl+Z. Это тоже самое, что запустить команду с & (например /some/path/command &).
Команда jobs покажет все задания с их состоянием. Обратите внимание, что теперь она в состоянии Stopped. Чтобы вернуть ее, нажмите fg, а чтобы заставить работать в бэкграунде, нажмите bg.

Устройство файловой системы

Прекраснейшая статья об устройстве и потрохах файловой системы. Написано очень доступно и с картинками:


Фрагментация под Linux: Настройка файловой системы Ext3

05.10.2011

Сборка Nginx под Debian

Поставим сначала пакеты. Возможно вам пригодятся еще какие-то, но об этом вы узнаете, если какая-то команда не запустится:
apt-get install libpcre++-dev libssl-dev libgeoip-dev dh-make autotools-dev gcc-4.3 debhelper devscripts
Также перед началом вписываем себе в переменное окружение (~/.bashrc) наши опознавательные знаки:

DEBEMAIL="email.address@example.org"
DEBFULLNAME="Имя Фамилия"
export DEBEMAIL DEBFULLNAME

И применяем их:
source ~/.bashrc

Переходим в директорию, где будем работать:
cd /usr/src

Выбираем нужную версию программы на сайте. И скачиваем её:
wget http://nginx.org/download/nginx-1.0.8.tar.gz

Распаковываем, но сам тарбол не стираем и оставляем его на месте(!!!):
tar xzf nginx-1.0.8.tar.gz

Теперь нужно переименовать директорию с сорцами, потому что далее сборщик deb-пакета возьмет название и номер версии отсюда. Правило одно - слева имя пакета (оставим его nginx, чтобы он заменял стандартный) и следом первый дефис. А второй дефис разделяет версию пакета и версию мейнтейнера. И никаких подчеркиваний! Итак меняем версию:
mv nginx-1.0.8 nginx-1.0.8-nsq1

Высокий Load Average при почти полном простое сервера

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


И тут мы видим:
load average: ~14
us (время процессора, занятого обработкой пользовательских тредов): в среднем 19,8%
sy (время процессора, занятого обработкой драйверов и ядра): в среднем 9,75%
id (время бездействия процессора): в среднем 51,1%
wa (время процессора, занятого ожиданием ответа от диска): в среднем 18,7%.
Суммарно все 4 параметра естественно дают 100%.

Возникает вопрос - какого лешего процессор 51% времени ничего не делает в то время, как к нему в очереди стоят аж из 14 процессов, жаждущих, чтобы ими тоже занялись?

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

Вывод: То есть если вдвое загрузить еще сервер, то Load Average не изменится. Пока idle(id) не упрется в 0%, а us, соответственно, не упрется в сумму wa+sy, можно смело догружать сервер, не боясь, что LA вырастет.

Подробнее тут.

28.09.2011

Сборка ядра на Debian

Для начала поставим пакеты:
apt-get install kernel-package fakeroot build-essential libncurses5-dev
Здесь:
kernel-package - система для создания пакетов, касающихся ядра. Этот пакет содержит утилиту make-kpkg, которая нам сделает не просто собранное ядро, а deb-пакет, который мы потом сможем установить на любую другую систему.

fakeroot - специальная команда, которая позволит подхватить переменное окружение рута обычному пользователю и тем самым создавать файлы и директории, назначая им владельцем рута.
build-essential - этот пакет сам по себе кроме информации ничего не несет, но не установится без зависимостей: make, dpkg-dev, gcc, g++ и так далее. То есть поставив этот пустой пакет, мы поставим многие необходимые утилиты и компиляторы.

Кроме того, нам скорее всего понадобятся комплекты подключаемых библиотек для компиляции ядра. Поэтому проверим, какая у нас платформа:
uname -m
Поищем в репозитории подходящий пакет для нашей платформы:
apt-cache search linux-headers

Выпадет несколько пакетов на выбор. Установим только тот, что подходит нам. Например у меня 32-битная система и потому я ставлю:
apt-get install linux-headers-2.6-686

Также понадобится библиотека zlib:
apt-get install libzlcore-dev zlib1g-dev

Теперь переходим в директорию, где будем работать:
cd /usr/src

Идем в репозиторий и выбираем себе пакет, который начинается с linux-2.6_2.6.NN.orig.tar.gz
Обратите внимание, что это ядро будет заметно больше других файлов по размеру (от 50Mb и выше) и не скачайте просто патч. На данный момент доступны только 26-е, 30-е и 32-е ядра.

Итак выбираем ядро и загружаем его:
wget http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-2.6_2.6.32.orig.tar.gz

27.09.2011

Как создать директорию в памяти

Создаем директорию в любом месте, в которую будем монтировать кусок памяти:
mkdir /mnt/directory_name

В файле /etc/fstab делаем запись, что файловая система будет типа tmpfs, а размер диска 1024Mb. Все остальное наверно уже знакомо по обычным файловым системам:
vi /etc/fstab
tmpfs          /mnt/directory_name            tmpfs  size=1024m,noatime,nodiratime,relatime,nosuid,nodev,noexec 0 0

А теперь смонтируем её:
mount /mnt/directory_name

13.09.2011

Кластерная файловая система. iSCSI + OCFS2

Многие сталкиваются с проблемой, что после того, как установлен iSCSI и один диск роздан по сети на две и более машин, начинаются проблемы с файловой системой. То вместо владельца файла будут знаки вопроса, то файл не до конца запишется, то еще какая беда....

Проблема в том, что была неверно выбрана файловая система. Нельзя на диск, к которому обращается более одного шедулера (читай более одной операционной системы) ставить обычную файловую систему. Нужна только кластерная. Например GFS2 или OCFS2.

Такая файловая система имеет свой кластер. Вообще у всех в голове сразу появится "мне не нужен кластер, мне просто диск надо раздать по сети в совместное пользование" - все в порядке. Кластер ставится две минуты и не будет большим усложнением системы.

Делается это легко. Сначала устанавливаем пакеты поддержки такой файловой системы и кластер:
apt-get install ocfs2-tools ocfs2console

09.08.2011

Форвард с HTTP на HTTPS в Nexus (Jetty) и Tomcat

Чтобы все было по фэн-шую, корпоративные ресурсы нужно делать только по HTTPS, так как там везде аутентификацию и, соответственно, передаются данные, которые можно легко перехватить.
В случае, если Вы используете Apache или Nginx, то все тривиально, но если ресурс на Jetty/Tomcat, как например TeamCity или Nexus, то придется немножко помучаться.

Jetty.
Итак начнем с Jetty (рассматривается на примере Nexus):
Первое, что требуется - научить его работать одновременно и с HTTP и с HTTPS. Для этого в файл свойств jetty добавим еще один порт:
vim /opt/nexus/conf/plexus.properties


application-port=80
application-port-ssl=443
...

Далее в конфигурационном файле Jetty, создадим еще один коннектор.

Был только один коннектор:
    <Call name="addConnector">
        <Arg>
            <New class="org.mortbay.jetty.nio.SelectChannelConnector">
              <Set name="host">${application-host}</Set>
              <Set name="port">${application-port}</Set>
            </New>
        </Arg>
    </Call>

А мы сделаем два одновременно (второй пообширнее, так как там сертификат описывается):

        <Call name="addConnector">
        <Arg>
            <New class="org.mortbay.jetty.nio.SelectChannelConnector">
              <Set name="host">${application-host}</Set>
              <Set name="port">${application-port}</Set>
            </New>
        </Arg>
    </Call>

    <Call name="addConnector">
        <Arg>
            <New class="org.mortbay.jetty.security.SslSelectChannelConnector">
              <Set name="host">${application-host}</Set>
              <Set name="port">${application-port-ssl}</Set>
              <Set name="keystore">/etc/ssl/keystore</Set>
              <Set name="keyPassword">Meik8hahTi5ooXoong3aiv1maiteed</Set>
              <Set name="truststore">/etc/ssl/keystore</Set>
              <Set name="password">Meik8hahTi5ooXoong3aiv1maiteed</Set>
              <Set name="trustPassword">Meik8hahTi5ooXoong3aiv1maiteed</Set>
            </New>
        </Arg>
    </Call>
Теперь заменяем объявление существующего handler/context-collection на отдельный context-collection. А именно просто убираем обрамляющий тег .

26.07.2011

Проблема с локалью на Debian после установки какого-то пакета

Работать в шелле невозможно. Половина текста вот такой трэш:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = "en_GB.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

Возможные варианты решения (у всех своя причина и потому свой путь):
dpkg-reconfigure locales
dpkg-reconfigure console-setup
update-locale

25.07.2011

Ошибка ODBC-подключения

Проверяем ODBC настройки:

[root@localhost etc]# isql -v default
[MYODBCUtilReadDataSource.c][233][ERROR] Unknown attribute (Servername).
[MYODBCUtilReadDataSource.c][233][ERROR] Unknown attribute (Username).
[ISQL]ERROR: Could not SQLConnect

такие вещи бывают, если неправильно указать поля в ODBC, например Servername вместо Server или Username вместо User.

Проблема не в том, что Вы опечатались. Проблема в том, что в интернете половина примеров выложены именно с неправильными именами. Причина - отсутствие единого стандарта :( Тут ничего не поделать. Примеры для CentOS совсем не подходят для SLES и наоборот, хотя эти системы очень похожи.

20.07.2011

PPTP с авторизацией в LDAP через RADIUS

Жизнь штука интересная. Всегда преподносит сюрпризы. К сожалению, прекрасный VPN продукт, лучший в мире из софтверных, - OpenVPN, оказался плох тем, что не поддерживается на нативном уровне ни одной популярной операционной системой. А ставить клиента, сертификаты и конфиги оказалось непосильной задачей для особо "интеллектуальных" людей (и это при простейшем мануале в три клика).
"Искаропки" и Windows и Ubuntu и MacOS и Symbian и Android поддерживают только PPTP.

Итак приступим. Схема будет такая:
клиент соединяется по PPTP с PPTP-сервером. Организуется тоннель. Внутри этого тоннеля соединяются PPP-клиент и PPP-сервер и первый запрашивает у второго логин с паролем в форме MS-CHAPv2 (почему именно его - опишу ниже). PPP-сервер берет эти данные и просит RADIUS-сервер провести аутентификацию. Так как наши пользователи хранятся в LDAP-каталоге, то RADIUS обращается к этому каталогу, биндится от имени администратора, берет из него хэши пользователя и сравнивает с теми, что ему дал PPP-сервер. После чего дает ответ PPP-серверу пускать клиента или не пускать.


Теперь маленькая ремарка о том, почему единственно возможный вариант передачи пароля - MS-CHAPv2 (v2 - вторая версия). Есть четыре основных варианта: PAP (без шифрования), CHAP (с шифрованием), MS-CHAPv1/v2 (с шифрованием, совместимым с NT/LM) и EAP.
PAP для нас не подходит потому, что по умолчанию при создании PPTP-подключения Windows требует шифрования. Можно это изменить в свойствах настройки, но это требует целых два клика мышью, что опять таки делает задачу невыполнимой для многих.
CHAP для нас не подходит потому, что по умолчанию в LDAP хранятся только NT/LM хэши паролей, а CHAP-хешей там нет. Провести аутентификацию RADIUS не сможет. Можно было позаботиться об этом при разворачивании LDAP-сервера, чтобы были и CHAP-пароли, но теперь уже поздно. Если добавить это поле, что нужно заставлять клиентов сменить пароль, чтобы это поле заполнилось.
EAP, если я не путаю, не будет работать с LDAP по каким-то другим причинам, описанным в конфиге его модуля. Могу ошибаться. Не суть важно.
Остается настраивать MS-CHAPv2.

10.07.2011

Свершилось: вышел CentOS 6

Скачать можно здесь. Но внимание на заметку тестировщиков:

Mirrors are picking up the release. The mirrors will remain "bit-flipped" (read: locked from public access) until it's decided that the release has made it to a sufficient number of mirrors for release. Watch the CentOS-Announce mailing list and/or #centos IRC channel for more info on the release. Anything you download from mirrors before the announcement may not be the final packages, and you may put your system into a funky state -- use at your own risk.

Думаю, будет уместно дать ссылку на детальный обзор улучшений в RHEL 6.

05.07.2011

Установка Nagios на Debian с авторизацией в LDAP

Для начала устанавливаем вэб-сервер, через который мы будем работать с Nagios, а также включаем аутентификационные и авторизационные модули:
aptitude install apache2
a2enmod auth_basic authn_file authnz_ldap authz_default authz_groupfile authz_host authz_user

Далее ставим сам Nagios, документацию к нему, которая будет доступна из вэб-интерфейса, плагин, при помощи которого Nagios будет обращаться за данными к другим машинам, а также утилиты для построения графиков:
aptitude install nagios3 nagios3-doc nagios-nrpe-plugin nagiosgrapher

При установке aptitude поставит все необходимые зависимости.

По умолчанию доступ к панели Nagios осуществляется как-то по-деревенски:
http://IP.ADD.RE.SS/nagios3, а мы сделаем красиво: http://nagios.nodesquad.com
Для этого создадим конфиг виртхоста:

04.07.2011

Организация сервера сбора логов со всех серверов на единый syslog-сервер

На syslog-сервере.

Открываем настройки rsyslog и раскомментируем модуль и порт (желательно TCP):

vim /etc/rsyslog.conf

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

После изменений перегружаем демон:
invoke-rc.d rsyslog restart

На стороне каждого из логируемых серверов.

Открываем конфиг и добавляем туда где-нибудь сверху перенаправление на удаленный syslog-сервер (порт такой же, как указан у сервера):
vim /etc/rsyslog.conf

# transfer logs to common Syslog-server
*.*   @@syslog.nodesquad.com:514

После изменений перегружаем демон:
invoke-rc.d rsyslog restart

А еще есть возможность собирать dmesg со всех серверов!

Ну все, теперь можно парсить логи всякими logrotate'ами или чем душе угодно. Все укромно, все в одном месте. Очень рекомендую еще поставить LogAnalyzer с приятной вэб-мордочкой и удобным управлением и фильтрами. В репо Debian его нету, так что можно поставить deb-пакет отсюда.

Ну и в качестве наводки, вот еще более продвинутая система: Graylog2.

26.06.2011

Установка OpenVPN (client-to-site) с авторизацией внешних клиентов по LDAP (Debian)

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

Обзор сети
Например у нас есть подсеть 10.0.1.0/24, в которой находятся серверы внутри офиса компании.
Есть сервер gate.nodesquad.com со следующими адресами:
eth0 10.0.1.1 - этим интерфейсом он соединен с офисной подсетью.
eth1 123.45.67.89 - этим интерфейсом он соединен с Интернетом.
tun0 10.0.2.1 - этого интерфейса пока нет. Но он будет смотреть в сторону VPN-клиентов.

И есть клиенты извне, которые будут подцепляться через Интернет к адресу 123.45.67.89 и получать адрес из новой подсети 10.0.2.1/24. Их трафик внутрь сети будет идти таким образом:
Пакет выходит с их внутрннего интерфейса (например 10.0.2.123), идти на VPN-сервер 10.0.2.1, затем раутиться на 10.0.1.1 и уже дальше доходить до любого узла внутри офисной сети.

Тут нужно знать разницу между TUN и TAP. TUN используется для раутинга (а мы как раз планируем раутинг сделать соответственно схеме в предыдущем абзаце), а TAP нам не понадобится, потому что он для вариантов с бриджами.

Предварительная подготовка
Для начала проверим, установлены ли у нас виртуальные драйверы TUN/TAP:
modprobe tun; lsmod | grep tun

Проверяем установлен ли у нас LZO:
dpkg -l | grep lzo

Первое, что требует сделать - поставить пакеты. Пакет самого OpenVPN, пакет его модуля для авторизации в LDAP и пакет, конвертирующий регулярные выражения в C/C++ :
aptitude install openvpn openvpn-auth-ldap re2c

24.06.2011

Извлечение ключей CRT/KEY из JKS (keystore) и наоборот

Изначальные данные: JKS-файл, ПАРОЛЬ и АЛИАС.
Например у нас есть:
имя ключа (keystore): nodesquad.com.jks
пароль: FDs6aGh7
алиас: server
=========

Загрузите Java-программу, которая распаковывает .KEY-файл из.JKS: ExportPrivateKey.zip

Вытащите .KEY-файл (обратите внимание, что ExportPrivateKey.zip должен быть расположен в той же директории, где работаем):
java -jar ExportPrivateKey.zip jks-file-name.jks JKS 'ПАРОЛЬ' АЛИАС key-file-name.key
Например:
java -jar ExportPrivateKey.zip nodesquad.com.jks JKS 'FDs6aGh7' server nodesquad.com.key


Вытащите .CRT-файл:
keytool -export -alias ALIAS -keystore jks-file-name.jks > der-file-name.der
openssl x509 -in der-file-name.der -inform DER -out crt-file-name.crt -outform PEM
Например:
keytool -export -alias server -keystore nodesquad.com.jks > nodesquad.com.der
openssl x509 -in nodesquad.com.der -inform DER -out nodesquad.com.crt -outform PEM

**************************


А теперь тоже самое, только наоборот. Имея ключи .crt и .key соберем один .jks
Кстати, если у Вас нету .key-файла, то скорее всего Вы просто обновили сертификат. В таком случае нужно взять .key файл от старого сертификата. Но уж если он не сохранился, то его можно либо выбрать из старого .jks, по схеме как описано выше либо сделать re-key в трастовой компании, где получали сертификат.

Соберем .pkcs12 сертификат из двух разобранных:
openssl pkcs12 -export -out nodesquad.com.pkcs12 -in nodesquad.com.crt -inkey nodesquad.com.key
И импортируем его в keystore:
keytool -importkeystore -srckeystore nodesquad.com.pkcs12 -srcstoretype PKCS12 -keystore nodesquad.com.jks


21.06.2011

Установка RedMine на Debian Squeeze

В качестве СУБД будем использовать MySQL. В качестве вэб-сервера - Apache. Поэтому подразумевается, что они уже установлены на сервер.

Ввиду предостережения (не помню где увиденного), что лучше использовать пакеты мейнтенеров Debian, чем gem, то будем работать только с aptitude.

Вообще все нижеперечисленное можно поставить одной командой, так как все вышеперечисленное - есть зависимости для пакета Redmine, но мы сделаем по порядку, чтобы было понятно что и к чему в этой Ruby-кухне.

Итак ставим самое главное: интерпретатор языка Ruby:
aptitude install ruby libdbd-mysql-ruby libmysql-ruby

Так как система Redmine написана на фреймворке Ruby on Rails, то нам понадобятся и он тоже. Он будет лежать отдельно от сайта Redmine (и вообще никак его не касаться), а все приложения (в том числе и Redmine) будут пользоваться его библиотеками:
aptitude install rails

09.06.2011

Как быстро перевести сайт на самоподписанный SSL в Apache на Debian

Создаем директорию под сертификат:
mkdir /etc/apache2/ssl

Включаем SSL:
a2enmod ssl

Генерируем сертификат и ключ (3650 дней = 10 лет):
openssl req -new -x509 -days 3650 -nodes -out /etc/apache2/ssl/example.com.pem -keyout /etc/apache2/ssl/example.com.pem

Изменяем виртхост нужного нам сайта:
vim /etc/apache2/sites-available/example.com

<VirtualHost :443>

...

    SSLEngine On
    SSLCertificateFile /etc/apache2/ssl/example.com.pem
    SSLCertificateKeyFile /etc/apache2/ssl/example.com.pem
</VirtualHost>

Перезагружаем Apache:
invoke-rc.d apache2 restart

08.06.2011

Как приинклудить .schema-файлы в Squeeze/Ubuntu, если в них уже нет slapd

Ввиду того, что от slapd отказались (в Lenny он еще присутствует), то добавлять можно только в базу данных напрямую. Include'ы больше не используются. Поэтому все добавляемые схемы должны быть в .ldif формате, а не .schema. Если у Вас есть только .schema, то можно преобразовать их по этому методу. Итак приступим:

Например так добавляются GOsa схемы:
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/gosa/example.ldif

Причем если добавлять именно GOsa, то следует делать это в заданной последовательности. Сначала добавить gosystem.ldif, затем goto.ldif, и уже затем gosa-samba3.ldif

А вот такой командой можно просмотреть какие схемы уже импортированы:
ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
А вот такой список всех objectclass'ов:
ldapsearch -s base -b "cn=Subschema" -LLL -Y EXTERNAL -H ldapi:/// objectclass=subschema objectclasses  | grep NAME | awk -F "NAME" {'print $2'} | awk -F "'" {'print $2'}

28.05.2011

Устранение RHEL-вского бардака с виртхостами в одном конфиге

Debian сделали намного умнее, у них каждый виртхост - это отдельный файл. Никто не срет в общий апачий конфиг. У RHEL/CentOS до сих пор этого нет по какой-то неведомой причине.

Поэтому чтобы не убивать свою систему и не ловить косяки по подобию ISPmanager, сделаем простые действия:

Создадим папку, где у нас будут только виртхосты:
mkdir /etc/httpd/vhosts.d

Откроем основной конфиг:
vi /etc/httpd/conf/httpd.conf

Находим строчку в конфиге:
Include conf.d/*.conf

И рядышком, под ней, подключим новую директорию:
#
# Load virtual hosts files from the vhosts directory "/etc/httpd/vhosts.d".
#
Include vhosts.d/*.conf
Вот! Пара движений, а как теперь аккуратненько получается!
Кроме того, теперь можно написать простейшую утилиту типа a2ensite/a2dissite, которая будет включать и выключать виртхосты. Только не симлинками, как в Debian, а просто переименовывать .conf на конце во что-то другое, тем самым не давая приинклудиться.


Установка Apache Traffic Server (ATS)

Интересная сравнительная статья между основными конкурентами: Nginx, Varnish, Squid, HAProxy и ATS. К сожалению, Oops, DeleGate, Crossroads, Perlbal и Pound в ней не участвуют.

Устанавливаем репозиторий:
wget http://mirrors.netdna.com/NetDNA/netdna/x86_64/netdna-release-0.2.0-1netdna.x86_64.rpm && rpm -ivh netdna-release-0.2.0-1netdna.x86_64.rpm

Ставим сервер:
yum install trafficserver


Закрываем репозиторий:
vi /etc/yum/repos.d/netdna.repo
везде поставить enabled = 0

Открываем конфиг и настраиваем его, как написано ниже:
vi /etc/trafficserver/records.config


22.05.2011

Fatal error: Allowed memory size of NNNNNN bytes exhausted (tried to allocate NNN bytes) in ...

Достаточно часто встречающаяся проблема. В интернете все советуют исправить memory_limit (как в php.ini, а и через php_value в .htaccess). Однако размер памяти, выделенной для php-процесса - не единственаня причина, которая могла вызвать ошибку.
Если Вы выкрутили memory_limit до упора, а проблема не исчезла, то попробуйте закомментировать disable_functions в php.ini - очень сильно сузите круг возможных причин.

14.05.2011

Java+ConsoleGUI

Для того, чтобы отрисовать нормальную интерактивную консоль в Windows, можно скачать Eric Berkowitz's в любую директорию, где хранятся jar-файлы. Затем открыть свойства проекта в Eclipse и перейти в раздел, где подключаются библиотеки и добавить этот файл через кнопку Add External JARs...



Теперь в функции main() можно просто создать экземпляр консоли:
        new eric.Console(XXX);
где XXX - размер скроллинга.

10.05.2011

Простейшее скрещивание Python и Apache

Сразу предупреждаю, что на боевые сервера этого ставить нельзя. Во-первых для них существует более современный mod_wsgi, который ставится сложнее и который дает возможность использовать фреймворки, во-вторых данный вариант небезопасный, потому что код будет читаться Апачем, а аналога open_basedir, как у PHP, для Python нет. Этот пример только для тех, кто учит Python и кому нужно побыстренькому поднять вэб-сервер, сосредоточившись на языке, а не на системном администрировании. Вариант для Debian.

Устанавливаем модули Апача, чтобы научить его "хэндлить" Python'ий код:
apt-get install libapache2-mod-python libapache2-mod-python-doc

Пишем общий для всего сервера конфиг Апача, который говорит, что все файлы, которые заканчиваются на .py или .psp, обрабатывать питоньим интерпретатором:
tee > /etc/apache2/mods-available/python.conf

<IfModule mod_python.c>
        AddHandler mod_python .py .psp
        PythonHandler mod_python.publisher | .py
        PythonHandler mod_python.psp | .psp
</IfModule>

07.05.2011

Различие между Ctrl+C и Ctrl+D

Недавно понял в чем разница между этими двумя "горячими клавишами".
Когда пользователь логинится в систему, то терминал, который при этом запускается имеет ряд своих настроек. Вообще он регулируется через ioctl, как положено любому девайсу, но как правило используют через врапперы.
Есть утилита, основанная на ioctl: stty. Через нее можно просматривать и менять настройки терминала.

Если запустить ее с флагом -a, то она покажет все настройки, в том числе и наборы символов, которые терминал понимает так, настроено в этих настройках.


~# stty -a
speed 38400 baud; rows 31; columns 224; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Таким образом ^C означает interrupt (прервать), а ^D означает конец файла.

17.03.2011

Эмуляция Fence-Device на KVM (Xen тоже подходит) для кластерных гостевых машин

Fence - это вывод сломанной ноды из кластера. Для фэнсинга используется устройство вроде IPMI, но если кластер строится в виртуальной среде, то естественно никаких устройств как IPMI нет. Поэтому есть эмуляция этих устройств.

Схема работы выглядит следующим образом. Допустим у нас несколько хост-машин (Dom0), на каждой из которых крутятся  по нескольку гостевых машин (DomU). Все гостевые машины состоят в едином кластере.
ВНИМАНИЕ: вводить хост-машины в кластер нельзя, потому что в случае ее отказа, фэнсинг выведет ее из строя, а вместе с ней зацепит и все гостевые машины. После этого может случиться так, что кворум не получит уже никто и кластер полностью рухнет.

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

26.02.2011

Настройка Debian в качестве iSCSI-target


Ориентировка для начала. Есть два типа подключения хранилища данных: DAS (прямое подключение стораджа) и NAS (подключение стораджа через сеть). Реализация первого - типичный жесткий диск как у каждого из нас в домашнем компьютере, подключенный по ATA(PATA/SATA) или SCSI(PAS/SAS). Второй вариант состоит из клиентской части (сервера к которому подключают удаленный диск) и серверной. Если серверная часть состоит не из примитивного узла с дисками, а целой сети, отграниченной от клиентской части файбер-свитчем, то это уже называется SAN (сеть хранения данных). Соединять эти две точки между собой можно по Ethernet, FibreChannel или Infiniband. Протоколов подключения NAS и обмену данными существует множество и на разных уровнях приближения к аппаратной части. Есть на уровне файловой системы: SMB, NFS или SSHFS, есть на более глубоком аппаратном уровне: iSCSI, AoE и FCoE.

Теперь поговорим об iSCSI и как поднять сторадж на Debian Squeeze.

10.02.2011

Установка PHP-расширения PDO на Debian

Устанавливаем утилиты и репозиторий пакетов:
apt-get install php5-dev php-pear

Собираем пакеты:
pecl install pdo
pecl install pdo_mysql

Ставим конфиги:
mv /etc/php5/conf.d/pdo.ini.disabled /etc/php5/conf.d/pdo.ini
mv /etc/php5/conf.d/pdo_mysql.ini.disabled /etc/php5/conf.d/pdo_mysql.ini

Проверяем результат:
php -i | grep -i pdo

Перезагружаем Apache:
invoke-rc.d apache2 restart

Установка GPG-ключей на Debian и Ubuntu

Периодически apt-get update выдает:
W: GPG error: http://packages.medibuntu.org jaunty Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 2EBC26B60C5A2783
W: You may want to run apt-get update to correct these problems

Решение #1:
apt-get install debian-archive-keyring

Решение #2(если первое не помогло):
Берем номер из текста ошибки:
2EBC26B60C5A2783
И пробуем его искать на серверах. Перебираем сервера, пока не найдем (такими серверами забит весь Интернет):
gpg --keyserver keys.gnupg.net --recv-key 2EBC26B60C5A2783
gpg --keyserver pgp.mit.edu --recv-key 2EBC26B60C5A2783
gpg --keyserver opepksd.org --recv-key 2EBC26B60C5A2783
gpg --keyserver pgp.nic.ad.jp --recv-key 2EBC26B60C5A2783
Сервер отрежет последние 8 символов от номера: 0C5A2783. Это и есть ключ.

Теперь его импортируем:
gpg -a --export 0C5A2783 | sudo apt-key add -
Теперь заново обновляем:
apt-get update

06.02.2011

Первое знакомство с IPv6

Начать нужно обязательно со статьи Переход на IPv6. Из этой статьи можно понять основы какие существуют механизмы передачи данных в условиях перехода с IPv4 на IPv6, что такое тоннели и какие они бывают. Короче, необходимый минимум вводной теории.

Далее можно приступать к практике. Хороший мануал: Настрой себе IPv6 в Debian и Ubuntu.
А вот другой хороший мануал: Running IPv6 in practice.

Вот здесь можно зарегистрировать себе тоннель: Hurricane Electric.

Конвертер IPv4/IPv6.

Полная информация о том как и что работает: Linux IPv6 HOWTO.



30.01.2011

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

Новый (а может уже и не новый) вариант распространения книг. Не надо ничего покупать каждый раз и платить за полную книгу. Просто возьми месячный абонемент в библиотку (как когда-то в детстве делали) и читай книги онлайн. При этом, если раньше почти все книги покупали в бумажном варианте, то вот все есть в электронном. На выбор тысячи технических книг и видео тьюториалов от всевозможных издателей начиная от Microsoft Press и заканчивая O'Reilly. Все что душе угодно and even more...

А главное, что теперь все меньше и меньше искушение скачать ворованную книгу в .PDF. Высокое качество за копейки - вот, что спасет литературу от пиратов :)
За $10/мес. можно получить разрешение на 5 книг на полке в месяц.
За $23/мес. - 10 книг + возможность скачивать их в PDF.

18.01.2011

Установка Mercurial на RHEL-like

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

Сначала следует добавить все необходимые пакеты
1) Установить httpd:
sudo yum install httpd

добавить его в автозапуск:
sudo chkconfig httpd on

и запустить:
sudo service httpd start

2) Установить модуль WSGI для Apache (модуль для работы с Python):
sudo yum install mod_wsgi

17.01.2011

Введение в I/O скедулеры

Для начала хочу напомнить, что дисковая адресация состоит из трех параметров CHS - цилиндры, головки и сектора. Набор этих трех параметров дает точное месторасположение физического блока. Изначально, чтобы обратиться к нужному блоку нужно знать эти параметры, но современные диски не заставляют операционную систему обладать такими знаниями. Вместо этого у них есть собственные таблицы уникальных номеров блоков, где каждый блок имеет свой номер и соответствующую ему триаду CHS. А современные операционные системы умеют этим пользоваться при помощи механизма LBA - logical block address. То есть другими словами, операционная система передает диску только номер блока, а тот сам по таблице находит куда ему идти. Однако есть очень важный факт: в такой таблице адреса не последовательны. То есть если после номера блока 412 идет блок 413, это еще не означает, что на диске эти блоки расположены последовательно.
Файловые системы, будучи чисто программной сущностью, оперируют своими логическими блоками. Как правило один логический блок файловой системы это целое число физических блоков диска.

Теперь о скедулерах. У скедулера есть две базовые задачи: слияние нескольких запросов в один единый и упорядочивание запросов.

03.01.2011

Почему на хостинге нельзя ставить права 666/777 и откуда берутся советы поставить такие права?

Если не вдаваться в подробности, то это резко занижает уровень безопасности Ваших файлов. Тем не менее ни один сайт не станет более работоспособным, если повысить права до 777.


Технические подробности:
Что значат сами цифры в таких тройках.
простые:
0 - право отсутствует
1 - право на запуск
2 - право на изменение содержимого
4 - право на чтение содержимого
сборные:
5 - право на чтение и запуск (5=4+0+1)
6 - право на чтение и изменение (6=4+2+0)
7 - право на чтение, изменение и запуск (7=4+2+1)

В трехзначных цифрах как например 777, первая цифра значит права для владельца файла(директории), вторая для членов группы, которой принадлежит файл и третья для всех остальных. То есть, например, в правах 751 владелец файла имеет права на чтение, запись и исполнение; участник одной группы с файлом имеет право на чтение и исполнение (на правку не имеет); а все остальные только на исполнение файла (но даже прочитать содержимого они не смогут).