Wednesday, 27 February 2013

Как практически посчитать максимальный объем памяти на платформе?



  1. ддр обычная - 8 гб для планки пределх
  2. ддр регистровая - есть планки до 32 гб на одну железку
  3. число каналов на процессоре
  4. из пункта 3 следует число планок на матери суммарное (оно кратно числу каналов)
  5. поддержка процессором регистровой памяти (онли серверные)
  6. на основании 1-5 можно посчитать предел, но с поправкой на то, что память развивается и завтра появятся более емкие планки
  7. мультисковетность, если проца два - планок вдвое больше сходу
Это довольно примерный план, на оснвоании которого можно посчитать максимальную практическую емкость памяти на платформе.

Сниффер UNIX сокета - как реализовать?

При именно такой постановке задача довольно сложная. Как простое решение рекомендую strace:
strace -s 1024 -f -p 4478 -e trace=read,write

Thursday, 21 February 2013

Установка WHDD

Утилита позиционируется как аналог mhdd, но, к сожалению, не является им в чистом виде.

Все тривиально:
apt-get install -y git cmake gcc make libncurses5-dev libncursesw5-dev
git clone https://github.com/krieger-od/whdd.git
cd whdd
cmake . && make && make install
У утилиты есть две версии - whdd-curses и whdd-cli.

Из приятных фишек - очень информативные read/write тесты. Минусы - работа со smart сводится к отображению параметров в  стиле smartctl.

Monday, 18 February 2013

Аналог vzps на bash


Довольно топорно, но работает:
#!/bin/bash
for i in `ps aux | awk '{print $2}'`; do vzpid $i|grep -v CTID | awk '{print $1 " " $2}'|grep $1 | awk '{print $1}'  ;done
Пример использования:

/usr/bin/vzprocess 2001
5839
5840
5841
6400
6461
6462
6595
6602
6662
6785
6803
6865


Определение CPU, на которых выполняются процессы определенного контейнера?

До начала работ требуется поставить вот это дело: http://www.stableit.ru/2009/12/openvz-vztop-vzps.html

Далее же все осуществляется простой Bash командой:

for i in `vzps -E 1023 --no-headers   |awk '{print $2}'`; do cat /proc/$i/stat|awk '{print $39}';done|sort | uniq -c
Выдача будет примерно следующая:
      1 0
      3 1
      8 10
      7 11
      4 12
      3 13
      9 22
     11 23
      4 3
      2 4
      1 6
     12 8
     17 9
Обращаю внимание, что первый столбец - число процессов на заданном процессоре, второй - номер логического процессора.

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

for i in `vzps -E 1023 --no-headers   |awk '{print $2}'`; do cpu=$(cat /proc/$i/stat|awk '{print $39}'); cat /sys/devices/system/cpu/cpu$cpu/topology/physical_package_id; done|sort | uniq -c
Ее выдача имеет похожий вид:
     44 0
     38 1

Linux: physical id/processor mapping

How to get list of logical cores per every physical cpu in Linux?

It's very tricky and we need use Perl:
cat /proc/cpuinfo |egrep '(^processor)|(physical id)' | awk -F": " '{printf $2 " "}'| perl -e '$_=<>; @list=split/\s+/,$_; $hs={}; while(scalar @list > 0) { ($a,$b) = (shift @list, shift @list); push @{$hs->{$b}}, $a;} for my $cpu (keys %$hs) {print "cpu:$cpu\n";print join ",", @{$hs->{$cpu}}; print "\n"}' 
Sample script output looks like:
cpu:1
6,7,8,9,10,11,18,19,20,21,22,23
cpu:0
0,1,2,3,4,5,12,13,14,15,16,17 
But we have a very simple solution (works pretty on 2.6.18/rhel5):
for i in `ls /sys/devices/system/node|grep node`; do cpu=$(echo $i|sed 's/node//'); echo -n "$cpu: "; cat /sys/devices/system/node/$i/cpulist|sed 's/-/../g' | perl -e 'print join ",", (eval(<>)); '; echo  ;done 
Sample output is very similar, but script is too short.
0: 0,1,2,3,4,5,12,13,14,15,16,17
1: 6,7,8,9,10,11,18,19,20,21,22,23
Sample content of cpilist elements in proc fs:

# cat /sys/devices/system/node/node1/cpulist
6-11,18-23
# cat /sys/devices/system/node/node0/cpulist
0-5,12-17

Как узнать число физических процессоров в Linux?

Очевидный вариант:
cat /proc/cpuinfo | grep 'physical id'  | sort | uniq | wc -l
Неочевидный (точно работает на 2.6.18/rhel5, 2.6.32/rhel6):
ls /sys/devices/system/node|grep node|wc -l 

Как посмотреть, на каком процессоре/ядре работают процессы?

top, f => j => Enter. И в поле: P будет номер используемого CPU.

Например, вот так:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P COMMAND                                                                
 6020 whistler  18   0 8853m 649m  10m S    2  4.1   4:32.05 1 java                                                                  

 7503 root      18   0 18944 1284 1024 R    0  0.0   0:00.01 3 top                                                                    
    1 root      18   0  8364  836  712 S    0  0.0   0:01.82 1 init                                                                    
 1517 root      19   0 54572  996  496 S    0  0.0   0:00.00 0 saslauthd                                                              

 1518 root      19   0 54572  656  156 S    0  0.0   0:00.00 0 saslauthd                                                              

 1525 root      15   0  5988  728  568 S    0  0.0   0:00.14 0 syslogd                                                                
 1529 daemon    18   0 18720  432  272 S    0  0.0   0:00.00 2 atd                                                                    
 1542 bind      21   0  177m  17m 2280 S    0  0.1   0:00.04 4 named                                                                  
 1560 root      18   0  352m  18m  11m S    0  0.1   0:01.03 2 apache2                                                                
 1563 www-data  15   0  136m 3284  476 S    0  0.0   0:00.28 2 apache2                                                                

 1582 root      15   0 20916  992  764 S    0  0.0   0:00.03 2 cron                                                                    
 1588 messageb  16   0 23276  880  632 S    0  0.0   0:00.00 0 dbus-daemon                 

Sunday, 17 February 2013

Script for netconsole activation on Debian squeeze

Данный скрипт использовать НЕ РЕКОМЕНДУЕТСЯ!!!! Рекомендую использовать новый: http://www.stableit.ru/2013/03/netconsole-debian-squeeze.html

Вот такой скриптец. http://fastvps.googlecode.com/svn/trunk/scripts/activate_netconsole.pl

Что он делает? Он включает логгирование ошибок ядра (netconsole) на сервер и пор, указаные в начале кода.

Как им пользоваться? Крайне просто:
wget http://fastvps.googlecode.com/svn/trunk/scripts/activate_netconsole.pl
perl activate_netconsole.pl 
В результате этих операций в текущей сессии будет загружен модуль netconsole, а также будет настроена его автозагрузка при следующем запуске системы.

У модуля есть недостаток - netconsole отвалится в случае, если машина, на которую идет логгирование будет доступна без роутинга, напрямую. Также он отвалится в случае, если поменяется mac роутера.

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

Добавление модулей в автозагрузку Debian на примере netconsole

Особенность Debian в том, что само имя модуля нужно добавлять в /etc/modules, а сами настройки модуля в /etc/modprobe.d/имя_модуля.conf.

Например:
echo 'netconsole' >> /etc/modules
echo 'options netconsole netconsole=6666@5.9.yy.xx/eth0,514@78.47.xx.zz/78:fe:3d:43:4f:96' > /etc/modprobe.d/netconsole.conf

Friday, 15 February 2013

OpenVZ: самый быстрый способ вывести load average на всех конетейнерах

Вот такой хитрый хак:
vzlist -o ctid,laverage 
Пример выдачи:
      1041 0.00/0.00/0.00
      1042 0.00/0.00/0.00
      1303 0.66/0.52/0.35
      4226 0.65/0.97/1.52
      7846 0.48/0.23/0.33
      7924 0.00/0.00/0.00
      8126 0.00/0.00/0.00
      8218 0.07/0.04/0.02
      8284 0.00/0.01/0.00
      8447 0.10/0.16/0.17

OpenVZ: Показать число running процессов с детализацией по контейнерам

Вот такой вот набор команд на баше:
 for i in `ps aux|awk '{if($8=="R"){print $2}}'`; do vzpid $i | grep -v CTID | awk '{print $2}';done |sort | uniq -c
      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039
Выдача примерно такая:

      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039

Thursday, 14 February 2013

grub, lenny: The file /boot/grub/stage1 not read correctly.

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

Фикс следующий - ждать конца синхронизации.

Тут лучше использовать grub shell, так как у него ошибки адекватнее:

grub> root (hd1,1)
root (hd1,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)          
setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... failed (this is not fatal)
 Running "embed /boot/grub/e2fs_stage1_5 (hd1,1)"... failed (this is not fatal)
 Running "install /boot/grub/stage1 (hd1) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
Done.
grub> root (hd0,1)
root (hd0,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no
Error 15: File not found

Tuesday, 12 February 2013

Автодополнение команд в bash при наличии sudo

В случае использования sudo на Debian, при вызове команд не выполняется автодополнение.

Ставим спец-пакет:
apt-get intsall -y bash-completion

Результат наших трудов:

sudo apt
apt-cache                     apt-file                      aptitude-create-state-bundle  apt-mark
apt-cdrom                     apt-ftparchive                aptitude-curses               apt-rdepends
apt-config                    apt-get                       aptitude-run-state-bundle     apt-sortpkgs
apt-extracttemplates          aptitude                      apt-key                       

Выдача имени пакета при попытке запуска команды из неустановленного пакета

Такой вот своего рода Ubuntu way :) Фича может быть удобна в ряде случаев.

Установка как всегда крайне проста:
apt-get install -y command-not-found

После установки нужно сформировать кэш:
update-command-not-found
После установки у обычных пользователей, при попытке что-либо вызвать будет появляться сообщение в стиле Ubuntu:
mysql
The program 'mysql' is currently not installed.  To run 'mysql' please ask your administrator to install the package 'mysql-client-5.1'
mysql: command not found

Monday, 11 February 2013

Monit, debian, status not monitored

Если монит в своем статусе пишет, что сервис не могиторится и, как следствие, не ребутает его, то нужно сделать следующее (предварительно основановив monit):
sudo cp /dev/null /var/lib/monit/monit.state
Это обнулит его state данные и все заработает ок. 

Как запретить ntpd слушать внешние соединения вообще?

Это довольно просто, открываем конфиг:
vim /etc/ntp.conf

Вносим там:

interface ignore wildcard
interface listen 127.0.0.1
Перезапускаем:
/etc/init.d/ntp restart 
Убеждаемся, что все ок:
sudo netstat -lnpu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 127.0.0.1:123           0.0.0.0:*                           16625/ntpd    
udp6       0      0 ::1:123                 :::*                                16625/ntpd    
Источник: http://serverfault.com/questions/475635/how-to-prevent-ntpd-to-listen-on-0-0-0-0123/475639#475639 

Защита серверов на Debian Squeeze от брутфорса посредством fail2ban

Ставим:
apt-get install -y fail2ban
Сервис сразу же запустится и будет добавлен в автозапуск.

Также fail2ban сразу создаст свою цепочку, через которую будет пропускать трафик (забаниваемые адрес) конкретного сервера (и как следвствие - крайне низкий оверхед, что плюс):

sudo iptables -nvL
Chain INPUT (policy ACCEPT 845 packets, 149K bytes)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 815 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           



Открываем конфиг:
vi /etc/fail2ban/jail.conf

Там будет ряд блоков с заголовками вида - [ssh], это блоки правил, описывающих, какие именно сервисы контролируются и защищаются от брутфорса. Стандартно включен лишь один - ssh, он нам и нужен. Обращаю внимание! Что здесь нужно исправить порт, если он у Вас отличается от стандартного (я рекомендую это сделать!).


[ssh]
enabled = true
port    = 1022
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6


Теперь самое важное - внесите свой IP адрес (если он постоянный) в белый список fail2ban, это делается в том же файле в блоке:
ignoreip = 127.0.0.1 178.xx.yy.zz

Применяем измененный конфиг (если внесли туда коррективы):

/etc/init.d/fail2ban restart

Лог работы сервиса fail2ban можно смотреть так:

tail -f /var/log/fail2ban.log

Теперь настало время проверить fail2ban в деле - пробуем 6 раз ввести неверно ssh пароль со внешнего хоста, чтобы нас забанило.

Забаненые айпи можно смотреть вот так (либо в фаероволле):

sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list: /var/log/auth.log
|  |- Currently failed: 1
|  `- Total failed: 7
`- action
   |- Currently banned: 1
   |  `- IP list: 188.40.74.10
   `- Total banned: 1

Раазбанивать ошибочно забаненых юзеров вот так (криво, да, но прямой механизм в fail2ban появится лишь к 0.9 версии, да и-то не факт):

sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 77613 packets, 15M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
1      974 75898 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 1022
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 75761 packets, 30M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
num   pkts bytes target     prot opt in     out     source               destination      
1       25  2596 DROP       all  --  *      *       188.xx.xx.xx         0.0.0.0/0        
2      949 73302 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Разбаниваем (очень аккуратно, чтобы ):

sudo iptables -D fail2ban-ssh 1


Источник: http://debianclusters.cs.uni.edu/index.php/Fail2Ban:_Preventing_Brute_Force_SSH

Saturday, 9 February 2013

Работа с zabbix из Python

Под это дело уже есть готовый компонент:
easy_install pyzabbix
Простейший код с выводом версии АПИ и тестом соединения:

#!/usr/bin/python
from pyzabbix import ZabbixAPI
zapi = ZabbixAPI("https://zabbix.domain.ru")
zapi.login("admin", "xxx")
print "Connected to Zabbix API Version %s" % zapi.api_version()
for h in zapi.host.get(extendoutput=True):
    print h['host']

Если работать будете от имени админа, то нужно добавить его в группу API access, иначе доступа не будет.


Источник: https://github.com/lukecyca/pyzabbix/wiki

Wednesday, 6 February 2013

Облачный ssh-copy-id - ssh-import-id

Подробнее:
http://blog.dustinkirkland.com/2012/02/ssh-import-id-gaining-some-steam.html и http://manpages.ubuntu.com/manpages/precise/man1/ssh-import-id.1.html

Суть идеи в создании авторизованного безопасного хранилища для публичных rsa/ssh ключей, откуда их можно быстро вытянуть и внести в систему.

Риквестую подобное вне убунт! 

Monday, 4 February 2013

Как на уровне iptables отсечь DNS запросы определенного типа к определенному домену?

Итак, нам нужен спец-скрипт, берем его по адресу: http://www.bortzmeyer.org/files/generate-netfilter-u32-dns-rule.py  (зеркало).

Генерируем правило для модуля u32 iptables и сохраняем его в переменной:
rule=$(python generate-netfilter-u32-dns-rule.py --qname suxx.us --qtype ANY)
Добавляем это правило для фльтрации:
iptables -A INPUT -p udp --dport 53 --match u32 --u32 "$rule" -j ACCEPT 
Делаем откуда-либо извне запрос:
host -t any suxx.usaa dns-server.ru
После этого, фиксируем попадание правила в фаерволл:
iptables -nvL|grep u32
    4   212 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 u32 0x0>>0x16&0x3c@0x14=0x4737578&&0x0>>0x16&0x3c@0x18=0x78027573&&0x0>>0x16&0x3c@0x1c&0xffffff00=0xff00 
 Как можно убедиться, модуль u32 дает почти неограниченную гибкость для фильтрации различных протоколов.
 

Универсальный мониторинг любого DNS сервера


Все очень просто
apt-get install -y dnstop
Вот пример выдачи (включен режим анонимизации, флаг -a, который скрывает реальные адреса):
Queries: 594 new, 7867 total                                                                  Mon Feb  4 09:05:11 2013
Sources        Count      %
---------- --------- ------
::34.0.0.0      3313   42.1
::               182    2.3
::2.0.0.0         47    0.6
::3.0.0.0         44    0.6
::20.0.0.0        43    0.5
::31.0.0.0        42    0.5
::37.0.0.0        34    0.4
::24.0.0.0        34    0.4
::22.0.0.0        34    0.4
::42.0.0.0        33    0.4
::4.0.0.0         33    0.4
::5.0.0.0         28    0.4
::1.0.0.0         23    0.3
::47.0.0.0        19    0.2
::35.0.0.0        19    0.2
::45.0.0.0        18    0.2
::46.0.0.0        18    0.2
::48.0.0.0        16    0.2
::43.0.0.0        15    0.2
Обращаю внимание, что программа имеет множество команд в интерактивном режиме, например, для получения распределения по типам запросов нужно нажать t и будет выдано примерно следующее:

Queries: 707 new, 51766 total                                                                 Mon Feb  4 09:11:00 2013
Query Type     Count      %
---------- --------- ------
ANY?           26750   51.7
A?             18165   35.1
AAAA?           2755    5.3
MX?             2356    4.6
PTR?            1208    2.3
TXT?             222    0.4
NS?              208    0.4
SPF?              61    0.1
SOA?              32    0.1
SRV?               7    0.0
CNAME?             2    0.0

Friday, 1 February 2013

Установка puppet из репозитория от разработчиков

В ряде случаев это предпочтительно использованию встроенной в дистрибутив версии: http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#open-source-repositories

Переход со стандартной версии (обновление) довольно прост:
wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
apt-get upgrade
apt-get dist-upgrade
Для установки новой версии:

wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
sudo apt-get install -y puppet

ERROR 1436 (HY000): Thread stack overrun: 8384 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.

Данная ошибка фиксится довольно просто.

Открываем конфиг:

vim /etc/mysql/my.cnf
И корректируем там:
thread_stack            = 512K


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

/etc/init.d/mysql restart