21.09.2022

Кровожадные пацифисты

Попробую собрать мысли в одну стройную кучу. 


Сразу скажу, я не симпатизирую ни той ни другой стороне. Я хочу не обосновать "войну" или "мир", а вытащить на поверхность суть конфликта.
Для этого надо просто разрушить все мифы и в конце сделать заключение трезвыми глазами.

Итак.

Последние лет 50 коллективный Запад практикует терминологические войны. Это я сам термин придумал, не надо его гуглить. Смысл терминологической войны заключается в нарушении закона тождества логики. Условно, слушатель мысли представляет что-то одно, а ему вталкивают что-то совсем другое под тем же названием. 

Приведу пример. В женском спорте появились мужчины. Изначально спорт делится на разные группы во избежание столкновения спортсменов с совсем разными возможностями. Спорт делится на обычный и паралимпийский, есть также весовые категории. По комбинации хромосом люди тоже разные: у кого-то XX [м], у кого-то XY [ж].  Не может человек, напичканный эстрагеном конкурировать с человеком, напичканным тестостероном. 
И тогда спорт разделили на женский и мужской, подразумевая комплект хромосом и, как следствие, физические возможности спортсмена. 

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

К чему я это? К тому, что для дальнейшего чтения нам придется определиться с несколькими терминами на всю длину статьи. 

Демократия.

Вообще термин зародился пару тысяч лет назад и не имел внятного определения. Уж точно демократией не называли систему "один человек - один голос". 

Что же является демократией сегодня? Россия, в которой есть электоральные циклы, как скажет любой здоровый человек, - не демократия. США, где за президента голосуют 200 человек из 350 миллионов, причем они не обязаны голосовать так, как народ сказал, - демократией является.
Значит наличие голосования не является критерием. 

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

И еще два ярких примера, прежде чем попробовать сделать выводы, что есть демократия: Швейцария и Исландия. В Швейцарии каждый кантон - полноценное государство. Автономность даже шире, чем у Техаса, который является единственным штатом США, который сам принимает решение быть ли вообще в составе США.
Каждый кантон вообще никак не пересекается с соседними кантонами и даже чтобы водить в другом кантоне, надо менять права. Кстати, Берн не является столицей.
Так вот Швейцария имеет референдумы по каждому поводу. Вообще по каждому. Они на них ходят чаще, чем на работу. То есть мнение большинства реально там имеет вес. 
Тоже самое в Исландии. После банковского кризиса они выделили группы по 900 человек и толпой написали новую Конституцию.


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


Является ли Россия демократией, конечно вопрос очевидный для всех сторон. С Украиной сложнее. Посмотрим на нее более близко. 

Кем являлась Украина до Майдана? Явно демократией. Причем демократией настоящей: со скандалами, встречными векторами интересов и прочими аттрибутами отсутствия дисциплины. Один президент тянет в ЕС, следующий к России. Потом меняются. 
Демократия? Да чистейшая.

После Майдана все до единого президенты имели абсолютно одинаковую направленность как под копирку. Все в сторону ЕС. Исключений и сомнений быть не может. 
Как такое могло произойти? В 2014-м весь народ поменял мнение? Так не бывает. Ответ прост: Украина после 2014-го не является демократией. У нее есть все признаки демократии, как и у США. Но демократией она не является.

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

Я также дам краткую сводку фактов, которые освещают события:
1. В военное время в Украине запретили все оппозиционные политические партии и СМИ. Этого не может быть в демократии, потому что демос себе такое не придумает. Это решение сверху.
2. В 2014-м сожгли 40 инакомыслящих людей в Одессе. В демократии инакомыслящих не жгут.
3. Регион ДНР/ЛНР никогда не был сепаратистским. Предложение ввести автономии по типу Швейцарии были из Харькова, а не из Донецка или Луганска. ДНР/ЛНР только восстали против насильственной смены демократической власти. То есть за демократию. И тут же их начали убивать (ролики как Вика Завируха расстреливает миро спящие дома из гранатомета ходят по всему интернету). При демократии инакомыслящих терпят, а не расстреливают.


Я предлагаю читателю самостоятельно сейчас выбрать какая из двух Украин была/является демократией.

Выводы: 
Россия - не демократия
Украина - не демократия

Помните, я обещал не занимать экстремальных позиций? Я начинаю выполнять обещанное.


Едем дальше. 
Следующий термин...

Независимость.

Что есть независимость? Польша - независимая страна? Казалось бы, сами решают, кто у них правительство, сами решают с кем торговать, сами решают какой сделать уголовный и трудовой кодекс. 
Да ладно. В Брюсселе решают, в каких рамках должна держать курс Польша. Есть четкий список и она этому списку соответствует. Как вести себя с мигрантами, с какими странами торговать, что производить и в каких количествах.

Я бы взял независимость в том плане, в котором его понимают те, кто придумал все эти Дни Независимости во всех странах. Как в США, например. Если у тебя нет кого-то сверху, кто тебе диктует хоть что-нибудь, ты независим.

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

Вывод: на Январь 2022, Украина имела независимость.

Но чего хочет правительство Украины сегодня?
Последние 8 лет шли дорожкой в ЕС. Именно под список, который выкатили Украине как условие для вступления в ЕС и под который она не может подтянуться по ряду пунктов.

Причем, ЕС - не НАТО. Он не спасает от военной угрозы. Он изначально был создан для борьбы с финансовой и торговой независимостью Италии против Германии (чтобы те лиры не девальвировали ради повышения сальдо внешнеторгового баланса). То есть русской агрессией вступление в ЕС не объяснить никак.

Резюмируем, что Украина движется от независимости к зависимости по собственной воле и это никак не связано с последними событиями.


Промежуточный итог:
Вам врали, что Украина - демократия.
Вам врали, что Украина борется за независимость.



Хватит? Переходим к русским?
Нет, не хватит.
Последний термин: член НАТО (девчонки сейчас покраснеют, но вообще я про другой член)


Я, как и ты, мой дорогой читатель, являюсь хищником. Ем шашлыки и сосиски. Есть ли у меня справка хищника? Нет. Отменяет ли это факт того, что я хищник и опасен? Не отменяет.
Бумага и надписи на ней не формируют реальность. Физические расклады формируют.

Я дам небольшой список:

  • Украина полностью финансируется из бюджета только НАТО-вских стран
  • Специалисты НАТО тренируют по 5 украинских батальонов в год (на момент начала войны было 30 батальонов) по стандартам НАТО. Эти стандарты означают, что любой украинский солдат, случайно попавший, скажем, в турецкие или канадские ряды войск, будет полностью понимать что и как ему делать.
  • На Украине размещены биологические лаборатории. Это не бред кремлевских пропогандонов. Это признание Виктории Нуланд на слушаниях в Конгрессе США.
  • Значительная часть техники в ВСУ - техника произведенная странами НАТО. Исключение только то, что осталось от СССР.
  • и <барабанная дробь>.... Украина воюет в составе НАТО при разрушении других стран. (сейчас плюньте в лицо тому, кто вам говорил про несчастную мирную Украину). 
    Так на официальном сайте Армии США, написано, что "The Ukrainians served as the third-largest Coalition forces contingent in Iraq".
    Third, мать его, largest! Какое рвение! Какая инициатива! 

    Fun fact: войну в Ираке украинцы называли Operation Iraqi Freedom, а не войной.
    Но СВО - это война. Это ж другое... 


Так что такое "член НАТО"? Тот, кому бумажку не выдали, чтобы был волк оставался в шкуре овцы или тот, кто является волком, пусть даже в шкуре овцы?

Резюмируем наши выводы:

Вам врали, что Украина - демократия.
Вам врали, что Украина борется за независимость.

Вам врали, что Украина не в составе НАТО.

Она борется за тоталитаризм и зависимость от ЕС, а в перерывах топит в крови арабских пастухов.

С тоталитаризмом тут надо пояснить. Речь идет о формате deep state + марионеточное правительство, когда фамилии президентов меняются для имитации демократии, а политический вектор - нет. Но ведь мы же называем вещи своими именами?
К слову, именно поэтому я не считаю Зеленского злодеем. Уверен, что он сам уже проклял тот день, когда стал президентом.

12.02.2015

Красивое отображение статусов команд в bash-скрипте

Объявляем функцию, которой скармливаем результат последней команды ($1) и текст ($2):
function check_error() {
  if [[ "${1}" -eq 0  ]]  
then echo  -e "$2:\t\e[1;32m[OK]\e[0m"  
else echo  -e "$2:\t\e[1;31m[ERROR]\e[0m"  
fi 
}

И после нужно команды вызываем ее:
rm -f file 
check_error $? "Removing file"
=============================================

Перехват ошибок в сислог.

set -e # fail on any error
set -u # treat unset variables as errors
# ======[ Trap Errors ]======#
set -E # let shell functions inherit ERR trap
# Trap non-normal exit signals:
# 1/HUP, 2/INT, 3/QUIT, 15/TERM, ERR
trap err_handler 1 2 3 15 ERR
function err_handler {
local exit_status=${1:-$?}
logger -s -p "syslog.err" -t "ootync.deb" "supersh.deb script '$0' error code $exit_status (line $BASH_LINENO: '$BASH_COMMAND')"
exit $exit_status
}
your_command some args
===========================================

Как логировать одновременно и в консоль и в сислог

Сначала объявляем функцию:

log() { logger -t scriptname "$@"; echo "$@"; }

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

log "text to be logged";





04.08.2013

Установка Node.js + Fugue

Вообще nodejs появился в стандартном репо Debian Jessie. Но если нет желания подцеплять его репо, то будет ставить вручную.

Перейдем в директорию, где он будет у нас жить:
cd /opt/

и скачаем Node.js:
wget http://nodejs.org/dist/v0.10.15/node-v0.10.15-linux-x64.tar.gz
Распакуем:
tar xzf node-v0.10.15-linux-x64.tar.gz
Следующий шаг объясню чуть подробнее. Дело в том, что номер версии node.js отображается в названии директории. При обновлении у нас появится рядом еще одна директория с новой версией. Для быстрого переключения, пусть они так и останутся, а мы будем переключаться между ними симлинками. Но пока у нас только одна директория, то симлинк будет вести на нее:
ln -s node-v0.10.15-linux-x64 node.js
Можем перейти в нее и попасть в Node.js:
cd node.js
Обязательно надо добавить в $PATH, чтобы вызывать интерпретатор из любой директории (синюю строчку надо добавить непосредственно перед export PATH):
vi /etc/profile
PATH="$PATH:/opt/node.js/bin" 
И перечитаем новые настройки на лету:
source /etc/profile
Теперь мы можем создать тестовый файл и запустить его в Node.js:
mkdir /var/www/cat > /var/www/hello.js
var http = require('http');
http.createServer(function (request, response) {    response.writeHead(200, {'Content-Type': 'text/plain'});    response.end('Hello World\n');}).listen(8080);
console.log('Server started');

Как видно выше, мы сделали порт 8080. Теперь запускаем:
node /var/www/hello.js
Так как это однотредовая модель, то рано или поздно мы получим проблему с производительностью. Во избежание этого прогноза нам надо установить Fugue:

(coming soon...)
http://nodejs.org/docs/latest/api/cluster.html

26.07.2013

Массовая миграция пользователей между серверами ISPmanager

Прижала меня жизнь, как видно из названия. И прижала сильно. Перенос 2300 пользователей - это чистейшей воды ад. Я дам только основные этапы. 99% работы придется допиливать по месту.

Первый этап:

Если оставить дефолтные настройки MySQL на принимающем сервере, более половины баз не вгрузятся - и вот тогда на помощь придет веревка и мыло. Дабы избежать главной и самой досадной ошибки, увеличим размер единовременно вгружаемого пакета команд в MySQL:
set global max_allowed_packet = 104857600;
Да, пусть это будет на лету, а не с конфига. Мы все равно перезагружать MySQL не будем. А после того, как все импортируется, нас больше не будет интересовать эта настройка.

Второй этап:

Если Вы переносите пользователей с нескольких разных серверов, то у Вас будет затык с одинаковыми названиями баз и/или имен пользователей MySQL. Не бывает серверов, на котором какой-нибудь умник не заведет базу под названием joomla, wp или admin.

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

Как решать: берете список на каждом из серверов, чистите его от мусора, сортируете, diif.
Списки тут:
select db from mysql.db;select user from mysql.user;
В случае обнаружения одинаковых пользователей нужно создать пользователю базу с более уникальным именем или более уникального пользователя. Затем вписать это в конфиг сайта.

Третий этап:

Дисковое пространство. Места, куда мы бэкапимся, должно хватить на сумму файлов /var/www и /var/lib/mysql. Например мы нашли место на /var/backups/

Четвертый этап:

Возможно когда-то пользователи перемещались между серверами. При этом на исходном он не был удален, а был просто выключен. Но! Мы не можем просто взять и сдампить только включенных - ведь есть те, кого выключили за неуплату. Быть может завтра он оплатит - а ему нечего включать - его данные остались на исходном сервере.

29.05.2013

Опрятные логи Nginx

Хочу поделиться своим вариантом формата access-лога. Очень уж мне нравится. Не могу держать в себе :)

        log_format verbose  '[$time_iso8601] || '
                            ' STATUS: $status || '
                            ' HOST: $host || '
                            ' CONN#: $connection || '
                            ' $remote_addr --> $server_addr || '
                            ' REQ_TIME: $request_time || '
                            ' UPSTR_RESP_TIME: $upstream_response_time || '
                            ' USER_AGENT: "$http_user_agent" || '
                            ;


18.05.2013

Как подцепиться к FastCGI-процессу напрямую

Как известно, telnet'ом тут не пообщаться. На помощь приходит утилита cgi-fcgi

Устанавливаем пакет, в котором она есть. Вариант для Debian:
apt-get install libfcgi0ldbl

У CentOS пакет называется, вроде как, fcgi.


Далее мы можем делать запросы скармливая его утилите cgi-fcgi либо прямо из командной строки либо помещая их в простой советский CGI-скрипт. Формат общения примерно следующий:

cgi-fcgi -bind -connect адрес:порт
Если не передавать никакой запрос или не передать минимально необходимые данные, то вернутся просто стандартные теги:

# cgi-fcgi -bind -connect 127.0.0.1:9000
X-Powered-By: PHP/5.4.4-14Content-type: text/html
Но нам нужно сделать какой-нибудь реальный запрос. Минимальный набор передававаемых переменных составляет:
REQUEST_METHOD - метод HTTP, например GET или POST
SCRIPT_FILENAME - полный путь с скрипту. Например: /var/www/index.php
более полный список стандартных переменных можно посмотреть например в файле /etc/nginx/fastcgi_params или в массиве $_SERVER в PHP.

Самый простой вариант - прямо в командной строке задать все переменные и обратиться к FastCGI-процессу:
# SCRIPT_FILENAME=/var/www/index.php
# REQUEST_METHOD=GET
# cgi-fcgi -bind -connect 127.0.0.1:9000

, где # - это приглашение командной строки и его писать не надо.


Ну и в помощь простейшая команда, которая выступит в качестве мониторинга количества процессов (не забудьте настрить парметр pm.status_path в pool.d/www.conf):
watch SCRIPT_NAME=/fpm-status SCRIPT_FILENAME=/fpm-status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000



read data timeout in 40 seconds

Многие встречаются достаточно часто с этой ошибкой. Очень популярно мнение, что нужно увеличить параметр FcgidIOTimeout в конфиге FastCGI. Отчасти так оно и есть. 40 секунд - это дефолтное значение FcgidIOTimeout, если оно не задано в конфиге в явном виде.

Первое, на чем хотелось бы сделать акцент: FcgidIOTimeout - это время, которое отведено под то, что Апач пытается подсоединиться к приложению FastCGI. То есть это до того, как началось исполнение кода PHP и к PHP-интерпретатору и его ограничениям по времени никакого отношения не имеет. Поэтому не надо думать, что скрипту не хватает время для исполнения. На момент вылета этой ошибки, скрипт даже еще не начал исполняться - его никто не принимает в работу.

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

Вывод: искать в чем пробема нужно не глупым повышением цифры в FcgidIOTimeout, а выяснением, почему Апач не может обратиться к FastCGI аж в течении 40-ка секунд. 

30.04.2013

SSL Explorer

SSL Explorer был приобретен Барракудой, но похоже остается единственным опенсорсным решением для организации VPN, который не использует клиента. Хочу также отметить, что все clientless решения на самом деле не являются таковыми, потому что на браузере пользователя должна быть установлена Java, которая сама установит клиента. Есть действительно clienless (например CheckPoint Mobile Access), но на слово VPN они не тянут - заключаются они в том, что просто пропускают вэб-сайты через свой URL (при этом отрезая JavaScript/Flash/etc.).


Итак, переходим в директорию, где будет установлено приложение:
cd /opt

Установка prerequisites: Java и Ant.

Устанвливаем Java SDK по этому мануалу.
ВНИМАНИЕ: новые версии Java не подойдут. Качайте пятую версию (у меня 1.5.22 подошла).

Ставим также Ant на сервер. Скачиваем его в директорию /opt.
Распаковываем:
tar xf apache-ant-1.9.0-bin.tar.gz
И прописываем путь к его бинарнику
vi /etc/profile
PATH="$PATH:/opt/apache-ant-1.9.0/bin"
export PATH

Подхватываем новый /etc/profile для обновления изменений:
source /etc/profile
Проверяем:
ant -version

15.04.2013

Как стать системным администратором

Созрел я наконец для этой статьи. Навеяна она тем, что мне частенько приходится готовить своих друзей в системные администраторы. Каждый раз я придумываю им задачки и каждый раз заново придумываю, что же придумать. Пришло время дать начало полноценному мануалу.
В отличии от подобных, кстати очень интересных, статей, свою я напишу в форме тьюториала - достаточно атомарных шагов, которые усложняются от раза к разу. То есть пройдя по нему от начала и до конца, можно будет искать работы на деньги, сопоставимые со средней зарплатой в вашем городе, а может и побольше. При этом на собеседовании чувствовать себя очень уверенно. Те, у кого хватит терпения, могут использовать этот курс, как базу перед началом курсов о программировании. Очень удобно начинать программировать, когда уже хорошо ориентируешься в нижнем слое операционной системы. В конце будет также дана ссылка на мою короткую статью на тостере, о том, куда дальше двигаться, чтобы стать DevOps'ом.

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

Итак, какие администраторы бывают:
1) Универсальный администратор - администратор, который управляет операционными системами и сервисами на них (кроме совсем уже сложных сервисов, на которые есть собственные администраторы - см.п.2). Основные системы, с которыми работает системный администратор: Linux, Windows Server, Sun Solaris, BSD. Есть и менее популярные системы, на которые также требуются специалисты (они дороже, но предложений мало).

2) Узкопрофильный администратор сервиса (баз данных, кластеров, сетей, VoIP, MS Exchange и т.д.) - узкоспецилизированный администратор, заточенный на конкретные глубокие задачи. Как правило, все они бывышие универсальные администраторы, которые решили сосредоточиться на чем-то одном.

3) Build/Release-инженеры [иногда называют Configuration manager'ы] - бывшие системные администраторы, которые ударились в программирование и занимаются настройкой движения программного кода от IDE разработчика до сервера, на котором он будет работать. В это движение входят статический анализ кода, модульное тестирование, компиляция кода, упаковка программы, интеграционное/системное/регрессионное тестирование, выкладывание в репозитории и установка на серверы. Одним словом Continuous Delivery.
Как правило, это уже вершина карьеры системного администратора. В такие инженеры попадают только самые сильные и матёрые. И таких не более 5%.
Отдельно хотелось бы упомянуть, что стиль работы регулируется не только объемом технических знаний, но и "культурным" подходом, который называется DevOps. Заключается он в полной прозрачности процесса как для Developers (разработчиков) так и для Operations (системные администраторов). Причем не просто прозрачности, а качественной связи в обратную сторону тоже.
Основные инструменты, которые используют B/R-инженеры:
  • VCS (например Git, Mercurial, SVN, ...)
  • SCA (SonarQube, Veracode, Moose, ... )
  • Maven, Ant, Gradle, Rake, make, SCons, WAF, NuGet, ...
  • CI (например Bamboo, Jenkins, TeamCity, TFS, ...)
  • CD (например uDeploy, RunDeck, ...)
  • EM (например Vagrant, Docker, ...)
  • CM (например Ansible, Puppet, Chef, CFEngine, SaltStack, PowerShell DSC, ...)
  • Репозитории (например APT, YUM, Nexus, Artifactory, Archiva, Chocolatey, ...)

____

Теперь углубимся только в первый пункт, потому что статья ради него написана.
Как я уже оговорился, операционных систем много и, как правило, каждый системный администратор выбирает себе систему по душе. Мы же будем говорить только о Linux. Не холивара ради объясню почему.
Windows - бесспорно прекрасная система. Во многих отраслях она лидирует так, что за ней в принципе невозможно угнаться (тот же Exchange ушел лет на 10 вперед от Zimbra и ее альтернатив). Но:
1) Windows на пушечный выстрел не подпускают туда, где нужна надежность, скорость и прозрачность процессов - то есть к деньгам. Все до единого промышленные системы построены на Linux. Даже мосты в Петербурге разводят на нем же.
Например у крупного сотового оператора это выглядит так: на компанию 10k компьютеров с Windows (в качестве десктопов сотрудников и AD/почты) и порядка 400-500k промышленных серверов на Linux (обслуживают звонки абонентов - от OSS/BSS до биллинга). Понятно где вакансий больше?
2) Windows вообще не держит нагрузку :( Почти не кластеризуется нормально и не тюнится. И я это говорю не как дилетант, а как бывший ведущий специалист по Windows в Мегафоне.
3) Этой системе не повезло в том, что заточена она под офисную инфраструктуру. Занявшись Windows, Вы получите не только интересные сервисы от талантливых парней из Редмонда, но и полный набор коллег в виде нервозных бухгалтеров и недемократичных менеджеров, неспособных сформулировать не то что задачу, но даже собственные мысли. Работа в таком коллективе скорее сделает из Вас профессионала по подковерным интригам, чем системного администратора.
 В мире Linux/Unix все совсем по другому. Вход намного "дороже". Так просто не стартанешь, как в мире Windows, но зато, если стартанешь, выигрыш больше. Коллектив - все такие, как Вы. С уровнем интеллекта компьютерщиков, а не вопиюще тупых гуманитариев. Кроме того, Linux - открытая система, ее принципы понятны почти сразу и работает она прозрачно. Даже если захотите потом вернуться на Windows, Вы будете понимать его лучше, чем те, кто не прошел Linux-школу.

И все же главная выгода Linux от Windows, то что среди их команды попадаются вот такие девчонки!
Вот доказательство:




Базовых видов Linux всего 3: Debian, RHEL и Slackware. Все остальные названия, которые Вам приходилось слышать - это их дочерние варианты (например Ubuntu произошел из Debian).
Каждая из этих систем имеет свой набор плюсов и минусов, которые сводятся к тому, что под каждую задачу надо выбирать свой вариант. Все они имеют право на жизнь и все они по разному хороши. Но для начала лучше выбрать что-то одно. Переключиться потом будет очень просто. Мы будем работать на Debian.

Вкратце о деньгах: хороший специалист стоит дорого. Зарабатывать на этой специальности в 4 раза выше средней зарплаты при трехлетнем опыте в среднестатистическом российском городе-миллионнике вполне несложно. Есть кто работает и за 10 средних зарплат - но этого достигнут только самые трудолюбивые. Те, кто будет жадно пожирать новые технологии, соблюдать культуру (в том числе ITIL и DevOps) и никогда не задерживаться на работе более года. Потому что основная масса опыта идет только в первые месяцы работы и очень важно не почевать на лаврах, а вовремя уйти в другую команду, чтобы опять попасть на волну. Но за эти деньги вы полностью распрощаетесь с личной жизнью.

Последний важный момент: английский язык. Если его нет хотябы в зачаточном виде - до свидания. В мире ИТ делать без английского в принципе нечего. Английский на столько является само собой разумеющимся, что о нем даже не спросят на собеседовании и его не указывают в резюме. Так что либо марш учить, либо конец Вашей непостроенной карьере. В конце концов, давайте будем откровенны: на что вообще способен человек, который даже не может выучить иностранный язык? Мало на что.

Итак, в бой. Под катом уже пойдет последовательность действий.


09.01.2013

Repcache - кластеризация Memcache'а

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

Ну как водится, показываю как это сделать для Debian.

Сначала соберем пакет.
Нам понадобится одна зависимость и одна утилита:
apt-get install libevent-dev checkinstall

Создадим рабочую директорию:
mkdir /usr/src/repcached
cd /usr/src/repcached
Скачаем дистрибутив в эту директорию.

Распакуем его и перейдем внутрь:
tar xzf memcached-1.2.8-repcached-2.2.tar.gz
cd memcached-1.2.8-repcached-2.2
Далее есть баг, который заключается в том, что переменная IOV_MAX объявляется только для FreeBSD, а у нас Debian. Если этого не сделать, то ошибка при компиляции выскочит такая:
error: ‘IOV_MAX’ undeclared (first use in this function)

14.11.2012

Как работает компилятор gcc/g++

Не могу не поделиться ссылкой на роскошнейшую статью: О GCC, компиляции и библиотеках
Досконально разобраны все четыре этапа, написано как их прерывать и как продолжать с прерванной точки. И отличное продолжение этой статье GCC and Make

10.11.2012

Fatal: no entropy gathering module detected

Подобное сообщение появляется в том случае, если команда, запущенная из chroot'а требует генерации случайных чисел. Например svn checkout https://

Эта проблема достаточно хорошо освящена на просторах интернетов... людьми, которые не понимают, что говорят.

Итак, стандартное решение для нее - убедиться, что в системе есть эти девайсы. Если нет, то создать:
mknod -m 666 /dev/random c 1 8 
mknod -m 666 /dev/urandom c 1 9

Но в чруте эти девайсы так просто не окажутся. Потому чуть более продвинутые посоветуют создать сразу с ныжными путями:
mknod -m 666 /chroot/path/dev/random c 1 8
mknod -m 666 /chroot/path/dev/urandom c 1 9

или пробросить (команда для Jailkit):
jk_cp -v -j /chroot/path /dev/random
jk_cp -v -j /chroot/path /dev/urandom


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

Так о чем нам говорит именно эта ошибка?
Тут надо разобраться как работают эти две команды. Они залазят в буфер шумов от драйверов устройств и берут оттуда данные, из которых и составляются рандомные цифры. Стоп! Каких устройств? Мы же в чруте :)
Правильный вопрос - 50% ответа. Решение приходит само собой:
mount -o bind /dev /chroot/path/dev



UPD: как правильно заметил мой товарищ Павел, это резко понижает безопасность сервера, выкладывая диски в chroot. Так что нужно взвешивать такое решение.



18.09.2012

Установка почтового сервера Exim4 и Dovecot и проксирование IMAP через Nginx

Отличная подборка информации: Exim 4.70 (lissyara)


Сначала капельку терминологии:

MTA - mail transfer agent. Это сервис, который передает почту между серверами, используя протокол SMTP. (эту задачу будет выполнять Exim4).

MSA - mail submission agent. Этот сервис используется для отправки почты пользователем с сервера наружу. Именно он получает запрос на обработку исходящего письма от нашего пользователя по протоколу SMTP на портах 25 или 587 и передает ее MTA для дальнейшей транспортировки. То есть это сервис для исходящей почты. (эту задачу будет выполнять Exim4).

MDA - mail delivery agent. Это сервис, который раскладывает почту по папкам, после того как MTA принял какую-то почту извне сервера для нашего пользователя. То есть это сервис для входящей почты. (эту задачу будет выполнять Exim4).

MRA - mail retrieval agent. Это сервис, который достает почту из папок для клиента, пришедшего по протоколам POP/IMAP. (эту задачу будет выполнять Dovecot).

MUA - mail user agent. Это программа, предоставляющая человеческий интерфейс для обращения к MRA по протоколу POP/IMAP. Она может быть исполнена как вэб-приложение на том же сервере (RoundCube, Squirrel, Horde, etc.) так и быть десктопным приложением (Outlook, Thunderbird, The Bat). В любом случае это приложение подключается к MRA на порт 110/143 и работает по протоколу POP/IMAP. (эту задачу будет выполнять десктопный клиент на стороне пользователя).


Цепочка отправки письма выглядит так:
MUA(Outlook, отсылка, ivanov@abc.com)-->MSA-->MTA(abc.com)-->
>-----интернет----->
-->MTA(xyz.com)-->MDA-->MRA-->MUA(Outlook, прием, petrov@xyz.com)

Любой из вышеперечисленных сервисов может работать не только по обычным протоколам, но и по шифрованным. Такие протоколы обозначаются буквами S в конце. Например IMAPS. Номера портов соответственно тоже меняются.

Итак приступим...

24.07.2012

Как вытащить на свой терминал чужой процесс

Все очень просто:
apt-get install reptyr

Если процесс случайно оказался отдетаченным от PTY (например сеть отлетела), то так:
Смотрим PID своего процесса:
ps auxf 
И подключаемчя к нему:
reptyr PID-процесса

Но если надо рестартануть сервер, а процесс висит в данный момент и его жалко прекращать, то сначала надо его отцепить от сессии, а то он завершится, а не уйдет в бэкграунд:
Убираем его в jobs:
Ctrl+Z
Запускаем в бэкграунде:
bg
Делаем его сиротой:
disown
Отцепляемся. Прицепляемся потом с нового терминала и забираем его обратно через reptyr.

07.05.2012

Сборка пакета PAM-SQLite и NSS-SQLite

Как многим известно, аутентификация в Linux проходит централизованно в PAM. Стандартно PAM использует файлы /etc/passwd (и еще несколько: shadow, group,  и т.д.). В крупных компаниях предпочитают держать пользователей не в файлах, а в LDAP. Но если Вы пишете свое приложение, то наверняка хотите хранить пользователей в базе. Для MySQL и PostgreSQL в репозиториях Debian есть стандартные пакеты libpam-mysql и libpam-pgsql. Но что делать, если пользователи живут в SQlite? Об этом ниже, а пока небольшая вводная, важная к прочтению:

Подразумевается, что читатель знает разницу между аутентификацией и авторизацией.

Процесс происходит примерно так (рассмотрим на примере SSH). Демон SSH принимает соединение с логином и паролем.
Теперь перед SSH-демоном две задачи:
1) Identity. Установить, что пользователь вообще существует.
(это делается на первом слое: NSS)
2) Authnetication. Проверить его пароль.
(это делается на втором слое: PAM, если конечно в /etc/ssh/sshd_config стоит настройка "UsePAM yes" ).

Далее, через систему NSS он смотрит настройки. Находятся они в файле /etc/nsswitch.conf. По дефолту там стоит так:

passwd:         compat
group:           compat
shadow:        compat
compat - значит локальные файл (/etc/passwd,/etc/shadow,/etc/group)
Можно добавить своё, например:
passwd:         compat   ldap   sqlite
group:           compat   ldap   sqlite
shadow:        compat   ldap   sqlite
В таком случае система сначала будет искать пользователя в файлах, если нет, то в LDAP и наконец в SQLite.

Поэтому кроме пакета libpam-sqlite вам понадобится еще пакет libnss-sqlite, чтобы NSS вообще понимал такую инструкцию как "sqlite".

====
Теперь разберемся откуда брать код.
Поиск кода обоих приложений (libnss-sqlite и libpam-sqlite) приводит на аккаунт github Sectoid. Но ведет его достаточно вяло. libpam-sqlite остановился на версии 0.3. Эта версия поддерживает SQLite2, а вот SQLite3 - нет.
Версию 0.3 уже, в свою очередь форкнул ip1981 и добавил в неё поддержку SQLite3, назвав ее версией 0.4.
Но я внезапно нашел вот уже версию 1.0.1 (с поддержкой SQLite3).



Нам понадобятся пакеты:
apt-get install libpam0g-dev libmhash-dev libsqlite0-dev
И инструменты сборки:
apt-get install dh-make dpatch devscripts autoconf  shtool libtool
Переходим в директорию, где будем работать:
cd /usr/src
Скачиваем исходники с сайта:
git clone https://github.com/dtjm/pam_sqlite3.git libpam-sqlite-1.0.1

05.05.2012

Логин в RHEL/CentOS/OEL под рутом с RSA-ключом

RHEL-like операционные системы, в отличии от Debian, очень сильно защищены. Сразу после инсталляции Вы получите полный набор заборов в виде SElinux, iptables и прочих. Привыкшему человеку это нормально (оно как бы даже спокойнее), а вот новичка такое состояние приведет к эйфории эфтаназии.
Особо "грамотные" советуют выключить все это. Но я бы им по губам бил за такие советы. Умные дяденьки не для того нас оберегали от безопасности, чтобы мы ей пренебрегали. Подобные вопросы надо решать только по-спортивному.

Одна из таких засад: невозможность залогиниться под рутом с ключом.

Причин две.
1) В RHEL-вском SSH по умолчанию стоит StrictModes yes. Это значит, что мы должны создавать директории и файлы SSH с нормальными правами, а не как рубахи-парни.
mkdir /root/.ssh
chmod 700 /root/.ssh
и
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

2) Но и после этого законнектиться ключем будет невозможно. В этот раз вредит SElinux.
Чинится так:
restorecon -R -v /root/.ssh




29.04.2012

Сборка eAccelerator под Debian

Для начала установим необходимые пакеты для сборки PHP и вообще сборки пакетов:
apt-get install php5-dev dh-make autotools-dev gcc-4.3 debhelper devscripts
Так же нужно учесть одну особенность eAccelerator - он будет работать только с той версией PHP, с которой был собран. Если у Вас на тестовом сервере одна версия PHP, например 5.3.3-7+squeeze3,  а на продакшене 5.3.3-7+squeeze8, то eAccelerator не заведется и будет выкидывать такую ошибку:
[eAccelerator] This build of "eAccelerator" was compiled for PHP version 5.3.3-7+squeeze3. Rebuild it for your PHP version (5.3.3-7+squeeze8) or download precompiled binaries.

Чтобы этого избежать, нам надо подтянуть версию на тестовой машине до сервера, где будет использоваться eAccelerator:
apt-get install php5=5.3.3-7+squeeze8 php5-dev=5.3.3-7+squeeze8
Переходим в директорию, где будем работать:
cd /usr/src
Скачиваем туда тарбол с исходниками.

Распаковываем его:
unzip eaccelerator-0.9.6.1.zip
Так как все расширения PHP принято обзывать php5-extention (например php5-tidy, php5-memcached, php5-mysql и т.д.), а имя/версия пакета будет создано на основе имени директории, то переименуем директорию:
mv eaccelerator-0.9.6.1 php5-eaccelerator-0.9.6.1
Заходим в распакованную директорию:
cd php5-eaccelerator-0.9.6.1

Открываем конфиг и настраиваем под себя. Я, например, люблю когда кэш лежит там где он должен лежать по FHS - в /var/cache, а не в /tmp. А еще нужно поправить путь к логу, потому что у нас Debian, а там CentOS-вский путь:
vi eaccelerator.ini

Далее нужно PHP-зировать пакет - подогнать под API PHP:
phpize
И теперь уже можно его конфигурировать:
./configure --with-eaccelerator-debug

26.04.2012

Аутентификация SSH через LDAP public key

До того, как начать, нужно обязательно научить SSH работать с LDAP.  Без этого дальше можно не читать.


Первым делом мы должны определиться какую версию OpenSSH мы будем переделывать. Дело в том, что патчи есть не под все версии. Поэтому будем отталкиваться от тех, которые есть. Переходим на страничку патчей и ищем те, которые совпадают с номерами версий, выпущенных с релизами Debian.
Чтобы узнать какие версии шли с Debian, нужно зайти сюда и прощелкать справа сверху все версии.

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

Например. Мы видим, что есть патчи под 5.1, 5.3, 5.4. А у нас Squeeze, с которым идет 5.5. Значит смотрим Lenny - там шла 5.1. А на эту версию у нас патч как раз есть. Добавляем репозиторий Lenny:

vi /etc/apt/sources.list

## Debian Lenny base:
deb http://archive.debian.org/debian/ lenny main non-free contrib
deb-src http://archive.debian.org/debian/ lenny main non-free contrib
Обновляем:
apt-get update

Перейдем в директорию работы с исходным кодом:
cd /usr/src/

Смотрим какие версии нам стали доступны после подключения репозитория от Lenny:
apt-cache show openssh-server | grep Version
Скачаем исходники OpenSSH нужной нам 5.1-версии:
apt-get source openssh-server=1:5.1p1-5

И затем зайдем туда:
cd openssh-5.*p1

07.04.2012

Где достать репозитории Debian Lenny

С тех пор, как Lenny перешел в состояние устаревшего, все его репозитории переместили в archive*


## Debian Lenny base:
deb http://archive.debian.org/debian/ lenny main non-free contrib
deb-src http://archive.debian.org/debian/ lenny main non-free contrib

## Debian Lenny updates:
deb http://archive.debian.org/debian/ lenny-updates main non-free contrib
deb-src http://archive.debian.org/debian/ lenny-updates main non-free contrib

## Debian Lenny Security updates:
deb http://archive.debian.org/debian-security/ lenny/updates main contrib non-free
deb-src http://archive.debian.org/debian-security/ lenny/updates main contrib non-free

## Debian Volatile updates:
deb http://archive.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://archive.debian.org/debian-volatile lenny/volatile main contrib non-free

## Debian Lenny Backports
deb http://archive.debian.org/debian-backports lenny-backports main contrib non-free
deb-src http://archive.debian.org/debian-backports lenny-backports main contrib non-free

26.02.2012

Сборка PHP в Debian в альтернативную директорию

На просторах Интернета имеется достаточно большое количествео разнообразных мануалов на тему сборки PHP. К сожалению, всех их объединяет одно: все они делаются через make install (читайте: через интимное место). О причинах распыляться не буду, порекомендую лишь статью на Хабре с многоговорящим названием: Хочется взять и расстрелять, или ликбез о том, почему не стоит использовать make install.

В данном мануале я не ограничусь только сборкой одного пакета.Мы соберем все популярные версии и {в}рапперы для него.

Все, что собирается - собирается на Debian Squeeze для FastCGI. Шаг влево/шаг вправо и мануал уже не подходит. Например на Lenny даже близко не так все будет. Я очень рекомендую установить чистенькую свежую систему, чтобы не спотыкаться об пакеты из неродных репозиториев и их разломанными зависимостями.


Начнем с того, что поставим зависимости, которые возможно нам и не понадобятся, но они указаны к стандартному PHP мейнтейнерами:
apt-get install apache2-prefork-dev autoconf automake bison chrpath flex freetds-dev hardening-wrapper libapr1-dev  libbz2-dev libc-client-dev libcurl4-openssl-dev libenchant-dev libevent-dev libexpat1-dev libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev libglib2.0-dev libgmp3-dev libicu-dev libjpeg-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev libmysqlclient-dev libonig-dev libpam0g-dev libpng12-dev libpq-dev libpspell-dev libqdbm-dev librecode-dev libsasl2-dev libsnmp-dev libsqlite0-dev libsqlite3-dev libt1-dev libtidy-dev libtool libwrap0-dev libxmltok1-dev libxml2-dev libxslt1-dev locales-all mysql-server quilt re2c unixodbc-dev firebird2.1-dev libgdbm-dev libcurl4-openssl-dev libssl-dev  libreadline-dev libedit-dev

Отлично. Теперь поставим утилиту, которой будем собирать пакеты:
apt-get install checkinstall
Конечно эта утилита - детская лопатка для игры в песочнице. Настоящие мейнтейнеры таким не пользуются, но у меня пока не хватает знаний и ума сделать все вообще по высшему пилотажу. Да и quilty нам не особо пока нужен.

Создадим директории для работы над нашими пакетам:
mkdir -p /usr/src/php/php5.2 /usr/src/php/php5.3 /usr/src/php/php5.4 /usr/src/php/php-switcher

Итак перейдем с сборке первого пакета - PHP 5.2