Определение и вызов fabric task в одном Python скрипте

Библиотека fabric для Python является хорошим средством для автоматизации действий (админимстрирования, deployment и т. д.) для инфраструктуры серверов под управлением ОС Linux. Библиотека использует протокол open ssh для выполнения команд и перемещения данных.

Подробнее о библиотеке можно прочитать на официальном сайте или здесь.

Бывают ситуации, когда необходимо в одном скрипте и объявить таск из библиотеки fabric и выполнить его.

Пример структуры такого скрипта:

#!/usr/bin/env python
# Script dependencies: python-devel, fabric (https://github.com/fabric/fabric/archive/master.zip)
# Usage: python script.py
import fabric
from fabric.api import *
# Define ssh-like address user@server_hostname
remote_host = user@server

def some_fab_task():
# Define fabric task here
# hide('everything') helps to execute task with minimum output to console
with settings(hide('everything')):
try:
....
except:
....

# Main function
if __name__ == '__main__':
# Call fabric task from here
fabric.tasks.execute(some_fab_task, hosts=[remote_host])

Для того, чтобы скрипт выполнялся “тихо” – без запросов на ввод пароля для удаленного пользователя, необходимо организовать доступ на удаленноый сервер с помощью ssh-ключей,  например как я описывал здесь.

Update:

Для передачи аргументов в скрипт, указываем их перед hosts=.

fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host])

Для передачи xargs, можно указывать их также до или после hosts=

fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host], xarg1=value1)
http://geckich.blogspot.com/

Автоматизация скриптов с помощью expect

Недавно открыл для себя интересную консольную утилиту expect. Сия утилита является интерпретатором (со своим языком) для взаимодействия с интерактивными (т. е. требующими какого-либо ввода от пользователя) программами.
Дабы не писать много лишнего, рассмотрим использование expect на примере.
Допустим,

  • есть удалённый sftp-сервер с адресом 192.168.1.2,
  • к которому у нас есть доступы вида user/SECRET, порт 20022,
  • нам нужно автоматически брать с этого сервера файл вида TODAYDATE_smtng_important.txt, где TODAYDATE – текущая дата вида YYYYMMDD,
  • файлик лежит в корневой директории.

При авторизации на sftp-сервере требуется ввод пароля, который никак ни опцией ни указать, ни ключ не прокинуть (предположим, нет административного доступа на sftp-сервер).
Вот именно здесь в автоматизации этой задачи поможет нам линуксовая консольная утилита expect.
создаем файл get_file.sh со следующим содержимым:
#!/usr/bin/expect
# Script to get important file from sftp quetly. Uses expect (yum install expect -y)
# Usage: ./get_file.sh YYYYMMDD
# where YYYYMMDD – today’s date

set today [lindex $argv 0]
spawn sftp -oPort=20022 user@192.168.1.2:${today}_smtng_important.txt /home/user/${today}_smtng_important.txt
expect “password:”
send “SECRET\n”;
interact

Строки после комментария:

  1. Создаем переменную today, присваивая ей первый аргумент, переданный скрипту при запуске.
  2. Выполняем команду для подключения к sftp, где вместо ${today} интерпретатор вставляет значение даты (переданное скрипту)
  3. Далее скрипт ждет указанного запроса (prompt) – здесь возможно много вариантов, в т. ч. и таймауты и различные prompt-ы, об этом можно прочитать в мане или в более расширенных статьях.
  4. Получив указанный выше промпт, посылаем в ответ наш пароль и знак окончания строки (аналог нажатия пользователем [Enter])
  5. Далее скрипт полностью передает управление пользователю.

Запускать скрипт, понятное дело после chmod o+x, например так:
./get_file.sh 20142902
Минусом изложенного подхода, конечно же, является хранение пароля для sftp в открытом, не зашифрованном виде.
Ссылки:

  1. Хорошая статья по командам expect
  2. Туториал по expect
  3. Ман по sftp в Linux
http://geckich.blogspot.com/

Установка системы мониторинга Nagios Core 4 на Linux Debian 6

Недавно возникла необходимость установить систему мониторинга Nagios Core 4 на сервер под управлением Linux Debian 6 (Squeeze). Здесь изложу свой опыт. В принципе, на Debian 7, Ubuntu, а также RHEL-ы (CentOS, Oracle Linux, Fedora) Nagios ставится походим образом. Необходимо лишь учитывать особенности путей на этих системах и наименования пакетов для установки.

Подробнее про Nagios, различие его редакций и т. д. можно прочитать на официальном сайте проекта.

Планируется установить следующие компоненты:

  • Nagios Core, 
  • Nagios Plugins, 
  • NRPE, 
  • Nagios V-Shell (симпатичный фронт-энд для Nagios Core). 

Установить можно как из пакетов, так и путём компиляции из исходников. В данной статье использован второй метод, т. к. он обеспечивает инсталляцию наиболее последней версии Nagios, а так же лучшую интеграцию компонентов между собой.


1. Установка зависимостей

apt-get install wget build-essential apache2 php5-gd libgd2-xpm libgd2-xpm-dev libapache2-mod-php5 php-apc libssl-dev

2. Создание пользователей и групп

useradd -m nagios
groupadd nagios
groupadd nagcmd
usermod -a -G nagcmd nagios

3. Скачивание необходимых архивов. На момет написания статьи последняя версия Nagios Core – 4.0.2, NRPE – 2.15

mkdir downloads
cd downloads
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-4.0.2.tar.gz
wget http://assets.nagios.com/downloads/nagiosplugins/nagios-plugins-master.tar.gz
wget http://assets.nagios.com/downloads/exchange/nagiosvshell/vshell.tar.gz
wget http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz

4. Распаковка архивов

tar zxvf nagios-4.0.2.tar.gz
tar zxvf nagios-plugins-master.tar.gz
tar -xzvf vshell.tar.gz
tar -xzvf nrpe-2.15.tar.gz

5. Компиляция и установка Nagios Core

cd nagios-4.0.2
./configure –with-nagios-group=nagios –with-command-group=nagcmd –with-mail=/usr/bin/sendmail
make all
make install 
make install-init
make install-config
make install-commandmode
make install-webconf
cp -R contrib/eventhandlers/ /usr/local/nagios/libexec/
chown -R nagios:nagios /usr/local/nagios/libexec/eventhandlers
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

6. А здесь я столкнулся с такой проблемой, что скрипты запуска в 4-й версии написаны несовместимо с Debian 6. Поэтому, необходимо содержимое файла /etc/init.d/nagios заменить на следующее:

#!/bin/sh

### BEGIN INIT INFO
# Provides: nagios
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start nagios daemon at boot time
# Description: Nagios 4.0.2 daemon 
### END INIT INFO

#
# chkconfig: 345 99 01
# description: Nagios network monitor
#
# File : nagios
#
# Author : Jorge Sanchez Aymar (jsanchez@lanchile.cl)
#
# Description: Starts and stops the Nagios monitor
#              used to provide network services status.
#
# Load any extra environment variables for Nagios and its plugins

if test -f /etc/sysconfig/nagios; then
 . /etc/sysconfig/nagios
fi
status_nagios ()
{
 if test -x $NagiosCGI/daemonchk.cgi; then
  if $NagiosCGI/daemonchk.cgi -l $NagiosRunFile; then
          return 0
  else
   return 1
  fi
 else
  if ps -p $NagiosPID > /dev/null 2>&1; then
          return 0
  else
   return 1
  fi
 fi
 return 1
}
printstatus_nagios()
{
 if status_nagios $1 $2; then
  echo “nagios (pid $NagiosPID) is running…”
 else  echo “nagios is not running”
 fi
}
killproc_nagios ()
{
 kill $2 $NagiosPID
}
pid_nagios ()
{
 if test ! -f $NagiosRunFile; then
  echo “No lock file found in $NagiosRunFile”
  exit 1
 fi
 NagiosPID=`head -n 1 $NagiosRunFile`
}
# Source function library
# Solaris doesn’t have an rc.d directory, so do a test first
if [ -f /etc/rc.d/init.d/functions ]; then
 . /etc/rc.d/init.d/functions
elif [ -f /etc/init.d/functions ]; then
 . /etc/init.d/functions
fi
prefix=/usr/local/nagios
exec_prefix=${prefix}
NagiosBin=${exec_prefix}/bin/nagios
NagiosCfgFile=${prefix}/etc/nagios.cfg
NagiosStatusFile=${prefix}/var/status.dat
NagiosRetentionFile=${prefix}/var/retention.dat
NagiosCommandFile=${prefix}/var/rw/nagios.cmd
NagiosVarDir=${prefix}/var
NagiosRunFile=${prefix}/var/nagios.lock
NagiosLockDir=/var/lock/subsys
NagiosLockFile=nagios
NagiosCGIDir=${exec_prefix}/sbin
NagiosUser=nagios
NagiosGroup=nagios
# Check that nagios exists.
if [ ! -f $NagiosBin ]; then
    echo “Executable file $NagiosBin not found.  Exiting.”
    exit 1
fi
# Check that nagios.cfg exists.
if [ ! -f $NagiosCfgFile ]; then
    echo “Configuration file $NagiosCfgFile not found.  Exiting.”
    exit 1
fi
# See how we were called.
case “$1” in
 start)
  echo -n “Starting nagios:”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   su – $NagiosUser -c “touch $NagiosVarDir/nagios.log $NagiosRetentionFile”
   rm -f $NagiosCommandFile
   touch $NagiosRunFile
   chown $NagiosUser:$NagiosGroup $NagiosRunFile
   $NagiosBin -d $NagiosCfgFile
   if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi
   echo ” done.”
   exit 0
  else
   echo “CONFIG ERROR!  Start aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 stop)
  echo -n “Stopping nagios: “
  pid_nagios
  killproc_nagios nagios
   # now we have to wait for nagios to exit and remove its
   # own NagiosRunFile, otherwise a following “start” could
   # happen, and then the exiting nagios will remove the
   # new NagiosRunFile, allowing multiple nagios daemons
   # to (sooner or later) run – John Sellens
  #echo -n ‘Waiting for nagios to exit .’
   for i in 1 2 3 4 5 6 7 8 9 10 ; do
       if status_nagios > /dev/null; then
    echo -n ‘.’
    sleep 1
       else
    break
       fi
   done
   if status_nagios > /dev/null; then
       echo ”
       echo ‘Warning – nagios did not exit in a timely manner’
   else
       echo ‘done.’
   fi
  rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile $NagiosCommandFile
  ;;
 status)
  pid_nagios
  printstatus_nagios nagios
  ;;
 checkconfig)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo ” OK.”
  else
   echo ” CONFIG ERROR!  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 restart)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo “done.”
   $0 stop
   $0 start
  else
   echo ” CONFIG ERROR!  Restart aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 reload|force-reload)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo “done.”
   if test ! -f $NagiosRunFile; then
    $0 start
   else
    pid_nagios
    if status_nagios > /dev/null; then
     printf “Reloading nagios configuration…”
     killproc_nagios nagios -HUP
     echo “done”
    else
     $0 stop
     $0 start
    fi
   fi
  else
   echo ” CONFIG ERROR!  Reload aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 *)
  echo “Usage: nagios {start|stop|restart|reload|force-reload|status|checkconfig}”
  exit 1
  ;;
esac
# End of this script

7. Далее добавляем Nagios в автостарт и запускаем демона
update-rc.d nagios defaults
service nagios start

8. Настройка веб-сервера Apache
8.1. Создаем пользователя и пароль для веб-интерфейса Nagios:

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 

8.2. Теперь настроим ssl, т. к. использовать незашифрованное соединение – это как-то не спортивно.

Конечно, максимальную защиту даст только сертификат, выданный CA, но он стоит денег (около 99$ в год – зависит от цен конкретной CA), а бесплатно увеличить безопасность – пусть и не идеально – можно и с помощью самоподписанного сертификата. Конечно, при этом вы остаётесь уязвимыми для т. н. man-in-the-middle attack.

Если необходимо, то создать самоподписанный сертификат можно следующим образом:

mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout nagios.key -out nagios.crt

Предположим, мы будем использовать дефолтный файл конфигурации apache2 для ssl.
Удаляем конфиг, скопированный при установке, предварительно скопировав его содержимое:

rm /etc/apache2/conf.d/nagios.conf

Редактируем дефолтный конфиг ssl:

nano /etc/apache2/sites-available/default-ssl.conf

Куда помещаем следующее, изменяя на свои значения, если есть различия:

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
BrowserMatch “MSIE [2-6]”
nokeepalive ssl-unclean-shutdown
downgrade-1.0 force-response-1.0
BrowserMatch “MSIE [17-9]” ssl-unclean-shutdown
<Directory />
  Options -Indexes
</Directory>
ScriptAlias /nagios/cgi-bin “/usr/local/nagios/sbin”
<Directory “/usr/local/nagios/sbin”>
   SSLRequireSSL
   Options ExecCGI
   AllowOverride None
   Order allow,deny
   Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
   AuthName “Nagios Access”
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Requir
e valid-user

</Directory>
Alias /nagios “/usr/local/nagios/share”
<Directory “/usr/local/nagios/share”>
   SSLRequireSSL
   Options None
   AllowOverride None
   Order allow,deny
   Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
   AuthName “Nagios Access”
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Require valid-user
</Directory>
</VirtualHost>
</IfModule>

Включаем модуль ssl, разрешаем наш ssl-сайт и перезапускаем службу:

a2enmod ssl
a2enmod cgi
a2ensite default-ssl
/etc/init.d/apache2 restart

Теперь приверяем. Заходим по адресу https://IP/nagios и после авторизации мы должны увидеть страшный веб-интерфейс Nagios Core:

Также походите по ссылкам в нём, чтобы проверить работоспособность скриптов.

9. Устанавливаем Nagios plugins

cd ../nagios-plugins-1.5-8-g9db76
which openssl
./configure –with-nagios-user=nagios –with-nagios-group=nagios –with-openssl=/usr/bin/openssl –enable-perl-modules –enable-libtap
make
make install

10. Устанавливаем NRPE

cd ../nrpe-2.15
./configure –with-ssl=/usr/bin/openssl –with-ssl-lib=/usr/lib/x86_64-linux-gnu
make
make all
make install
make install-plugin
make install-daemon
make install-daemon-config
cp init-script.debian /etc/init.d/nrpe
chmod 700 /etc/init.d/nrpe
/etc/init.d/nrpe start

Радактируем стартовый скрипт

nano /etc/init.d/nrpe

И для совместимости с Debian добавляем в начало файла:

#!/bin/sh
# Start/stop the nrpe daemon.
#
# Contributed by Andrew Ryder 06-22-02
# Slight mods by Ethan Galstad 07-09-02

### BEGIN INIT INFO
# Provides: nrpe
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start nrpe daemon at boot time
# Description: nrpe daemon 2.15
### END INIT INFO

Включаем в автозапуск:

update-rc.d nrpe defaults

Также не забываем в файл с командами Nagios’a /usr/local/nagios/etc/objects/commands.cfg дописать определение команды для NRPE серверной части:

define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30
        }

11. Устанавливаем vshell. Не забываем в файле install.php закомментировать строчку для RHEL дистрибутивов:

//define(‘APACHECONF’,”/etc/httpd/conf.d”);

А раскомментировать валидную для Debian:

define(‘APACHECONF’,”/etc/apache2/conf.d”);

Команды:

cd ../vshell
nano install.php
./install.php

Проверяем переходя по ссылке https://IP/vshell.
Далее необходимо приступить к настройке Nagios и серверов, которые планируется мониторить. Но, это уже тема для другой статьи. 
Надеюсь – данная будет полезной тем, кто только начал обустраивать свой мониторинг.
Ссылки:
1. Исправлены ошибки в статье.

2. Если возникает ошибка “Starting nagios:No directory, logging in with HOME=/” это значит, что вы не создали домашнюю директорию для пользователя nagios. Делаем: 
mkdir /home/nagios
chown-R nagios:nagios /home/nagios
http://geckich.blogspot.com/

Автодополнение в командной строке Linux

Автодополнение в командной строке Linux – это крайне удобная вещь. Вот скажем, нужно вам посмотреть информацию о пакете, скажем, php-mcrypt, но вы не помните как точно он пишется. С автодополнением достаточно в команде написать первые буквы и двойное нажатие [TAB] покажет вам варианты, а одинарное – дополнит, если вариант единственный:

rpm -q ph [TAB][TAB]

phonon-backend-gstreamer  php-devel                 php-mysql
php                       php-gd                    php-pdo
php-cli                   php-mbstring              php-xml
php-common                php-mcrypt                
Эта полезная фишка содержится в пакете bash-completion. При установке Debian-based систем этот пакет устанавливается по-умолчанию.А во многих же RHEL-дистрибутивах (например, Oracle Linux) – почему-то нет. Устанавливаем командой:

yum install bash-completion
aptitude install bash-completion

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

ls /etc/bash_completion.d

autoconf       gdbus-bash-completion.sh      mysqladmin        scl.bash
automake       getent                        ncftp             screen
bash-builtins  gpg2                          net-tools         service
bind-utils     gsettings-bash-completion.sh  nmap              sh
brctl          gzip                          ntpdate           shadow
bzip2          iconv                         openssl           smartctl
chkconfig      iftop                         perf              sqlite3
configure      ifupdown                      perl              ssh
coreutils      info                          pkg-config        strace
cpan2dist      iproute2                      pm-utils          subversion
cpio           iptables                      postfix           tar
crontab        java                          procps            tcpdump
cryptsetup     lsof                          python            util-linux
cups           lvm                           qdbus             wireless-tools
cvs            lzma                          quota-tools       xmllint
dd             make                          redefine_filedir  xmlwf
dhclient       man                           rfkill            xsltproc
e2fsprogs      mc                            rpcdebug          xz
findutils      mdadm                         rpm               yp-tools
gcc            minicom                       rsync             yum.bash
gdb            module-init-tools             samba             yum-utils.bash
http://geckich.blogspot.com/

Как получить размер свободного дискового пространства точки монтирования в Python (Linux)

Чтобы получить размер свободного пространства для точки монтирования (или размер свободное место на разделе, где находится указанная папка), необходимо выполнить следующее:

import os
st = os.statvfs("/home")
du = st.f_bsize * st.f_bavail
print(du)

Получим значение в байтах, чтобы получить значение, например, в Мб:

du = st.f_bsize * st.f_bavail / 1024 / 1024
http://geckich.blogspot.com/

Отправка почты (e-mail) из консоли Linux

Иногда необходимо отправить письмо из консоли/скрипта в Linux. Сделать это достаточно просто:

echo “Тело письма” | mail -s “Тема письма” recipient@example.com

или, чтобы вставить содержимое тектового файла как тело письма:

mail -s “Тема письма” recipient@example.com < /var/log/some.log

Параметры команды:

-s subject – тема письма
-c email-address 
– адрес для копии
-b email-address – 
адрес для невидимой копии

http://geckich.blogspot.com/

Linux Out-of-Memory Killer (OOM)

OOM Killer – это компонент ядра Linux, призванный решать проблему недостатка памяти. Известно, что виртуальной памяти может быть бесконечно много (в пределах адресации), а вот физической – вполне конечное число. Ядро выделяет память процессам “с запасом” в сумме превышающую физическую память системы. В основном, всё разруливается нормально (вся выделенная память одновременно редко требуется), но бывает ситуация когда становится нужно памяти больше, чем ее физически есть. И системе тогда нужно завершить какой-то процесс, чтобы продолжить работу. Вот этим и занимается OOM Killer.

Текущая реализация OOM Killer в Linux стремится выбрать наименее важный процесс. Он выбирается среди всех процессов, кроме init и kernel threads, на основе подсчета для всех процессов очков и тот, что набрал больше всех очков – убивается. Алгоритм анализа достаточно сложен и я не буду его приводить здесь.
Бывает, необходимо защитить определенный, важные процессы от “убиения”. В конце подсчета очков для процесса, число возводится в степень приоритета, которая может принимать значения -15…15 или -17. “-17” означает, что процесс не будет принудительно завершен вообще. Значение приоритета хранится в файлике /proc/$PID/oom_adj. Т. е. этот файлик создается для каждого процесса и уничтожается с его завершением.

Соответственно, дабы защитить процесс от “убиения”, необходимо узнать PID этого процесса и записать в его файл oom_adj значение -17. Например, для процесса sshd, можно использовать команду:

pgrep -f “/usr/sbin/sshd” | while read PID; do echo -17 > /proc/$PID/oom_adj; done

Эта команда для всех процессов демона sshd назначает приоритет. Но нужно быть осторожным с приоритетами – система может вести себя непредсказуемо, если защищенный таким образом процесс займет всю память (скорее всего закончится это т. н. kernel panic). Поэтому рекомендуют ставить минимальный приоритет “-15”.
Приведенную выше команду нужно выполнять после запуска процесса, т. е. или в конце стартового скрипта или по cron-у.
Ссылки на более детальную информацию:
http://geckich.blogspot.com/

Полезные Bash Shell команды и однострочные скрипты

Т. к. количество всяких полезный команд и скриптиков для консоли Linux неуклонно растет и всех их не упомнишь, буду записывать сюда что-нибудь эдакое полезное.
Статья будет дополняться.
1. Сделать что-либо со всеми файлами в папке, например, распаковать все zip архивы в текущей папке:
for f in *.zip ; do unzip $f ; done
2. То же самое, только с файлами из поддиректорий текущей. Например, установить rpm пакеты:
for D in *; do [ -d “${D}” ] && yum install ${D}/*.rpm ; done
3. Добавить пользователя в группу:
usermod -a -G group user
4. Как расшарить содержимое папки по протоколу HTTP.
Заходим в нужную папку и выполняем команду:
python -m SimpleHTTPServer 8080
Далее зайдя в браузере по адресу http://ip_of_that_server:8080, мы увидим содержимое с возможностью навигации и скачивания файлов:

5. Получение информации о Virtual Hosts для apache2 в Debian Linux:
apache2ctl -t -D DUMP_VHOSTS
6. Создание файла заданного размера:
truncate -s 14M filename

7. Замена строчек в текстовом файле:
sed -Ei ‘s/foo|bar|baz/foobar/g’ file
Заменить foo, bar или baz на foobar
8. Подмонтировать CD-ROM с указанием типа файловой системы:
mount -t iso9660 /dev/scd0 /media/cdrom
9. Посмотреть параметры загрузки ядра Linux:
cat /proc/cmdline
10. Максимальный уровень компрессии в tar:
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

Анализ падения ядра в Linux (kernel crash dump)

Завалить ядро линукс не так то и просто (если не преднамеренно, конечно), но такое случается… не все баги выловлены, а новые “фишки” приносят новые баги.

Итак, для сохранения дампа при падении ядра в Linux или kernel panic, необходимо настроить сервис kdump и установить несколько дополнительных пакетов.
Сам механизм представляет собой дополнительное маленькое ядро, смысл существования которого состоит в том, чтобы после падения основного ядра системы, перехватить управление, сохранить дамп и перезагрузить систему.

Для Fedora Linux устанавливается всё хозяйство просто командой:

yum install –enablerepo=fedora-debuginfo –enablerepo=updates-debuginfo kexec-tools crash kernel-debuginfo

А вот для Oracle Linux 6.4 чуть сложнее:

yum install crash -y
export DLP=”https://oss.oracle.com/ol6/debuginfo”

wget ${DLP}/kernel-uek-debuginfo-`uname -r`.rpm 
wget ${DLP}/kernel-uek-debuginfo-common-`uname -r`.rpm

rpm -Uhv kernel-uek-debuginfo-`uname -r`.rpm kernel-uek-debuginfo-common-`uname -r`.rpm

Команды приведены для текущего ядра системы. Если нужны пакеты для других версий ядра, то нужно указать версию вместо `uname -r`.

Далее, необходимо добавить в конфиг загрузчика (/boot/grub/grub.conf или /boot/efi/EFI/redhat/grub.conf – зависит от того, используется UEFI при загрузке сервера или нет): параметр ядра “crashkernel=128M“. Цифра указывает, сколько ОЗУ резервируется под резервное ядро. Через @ можно указать так же смещение в памяти, если необходимо. Например 128M@16 – зарезервирует 128 Мб ОЗУ начиная с физического адреса 0x01000000 (16MB).

Находим запись с нужной версией ядра (или можно ко всем добавить) и в итоге получим что-то в виде:
kernel /boot/vmlinuz-2.6.39-400.109.4.el6uek.x86_64 ro root=UUID=<> rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet crashkernel=128M

Теперь надо включить службу kdump для автозагрузки:

chkconfig kdump on

Также можно подредактировать конфиг /etc/kdump, но он и по-умолчанию достаточно хорош.
Теперь перезагрузим сервер, чтобы ядро загрузилось с новым параметром:

shutdown -r now

Проверяем, правильно загрузилось ядро с нашими параметрами:

cat /proc/cmdline

Также проверим, работает ли kdump:

service kdump status
Kdump is operational

Теперь, искусственно вызовем kernel panic командой:

echo c > /proc/sysrq-trigger

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

После перезагрузки, мы сможем найти наши дампы (по-умолчанию) в папке /var/crash. Запускаем анализатор дампа:

crash /var/crash/2009-07-17-10:36/vmcore /usr/lib/debug/lib/modules/`uname -r`/vmlinux

После запуска crash покажет нам некоторую полезную инфу и даст свою командную строку:

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-unknown-linux-gnu”…

      KERNEL: /usr/lib/debug/lib/modules/2.6.39-400.210.2.el6uek.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2013-11-13-12:04:56/vmcore  [PARTIAL DUMP]
        CPUS: 2
        DATE: Wed Nov 13 12:03:52 2013
      UPTIME: 00:21:58
LOAD AVERAGE: 0.23, 0.17, 0.10
       TASKS: 93
    NODENAME: nagios
     RELEASE: 2.6.39-400.210.2.el6uek.x86_64
     VERSION: #1 SMP Thu Oct 17 16:28:13 PDT 2013
     MACHINE: x86_64  (3292 Mhz)
      MEMORY: 2 GB
       PANIC: “Oops: 0002 [#1] SMP ” (check log for details)
         PID: 1902
     COMMAND: “bash”
        TASK: ffff880037a88200  [THREAD_INFO: ffff880037f86000]
         CPU: 1
       STATE: TASK_RUNNING (PANIC)

crash>

Помощь по командам: help или help command

Core dump от любого процесса также можно посмотреть командой: gdb path_to_core
Но, чтобы создавались дампы от процессов необходимо подредактировать файл /etc/limits.conf, например, командой:

sed -i ‘s/.. *soft *core *0/*tsoftttcorettunlimited/g’ /etc/security/limits.conf

Более подробно по командам можно почитать здесь:
http://docs.oracle.com/cd/E37670_01/E41138/html/ch10s02.html

Всем удачи и поменьше багов! 🙂

http://geckich.blogspot.com/

Запуск графических приложений на удаленной Linux-машине с помощью Putty и Xming (export display)

Суть задачи в следующем. Есть у нас сервер, на котором нету X-сервера, только консоль. А нам нужно, к промеру, установить Oracle Solaris Studio и запусктаь ее удаленно. Или какое-то другое приложение, работающее в GUI-режиме.
Для решения этой задачи выполняем следующее.
1. На сервере устанавливаем пакеты xauth и xterm. Например, для Oracle Linux (или другого RHEL):
yum install xauth xterm

2. Также, нужно проверить, включено ли X11 Forwarding в конфигурационном файле SSH-демона:

nano /etc/ssh/sshd_config

X11Forwarding yes

3. Eсли вы заходите с помощью Windows-машины, то вам необходимо установить Xming – X-эмулятор для форточек.  Ну и, собсно, сам Putty – ssh-клиент для Windows.

Установка Xming тривиальна, по типу далее, далее, далее. Только поставить галочку, что мы будем использовать его вместе с Putty. Сам Putty так же устанавливаем.
4. Запускаем Xming, он свернется в трей и после этого запускаем Putty и на вкладке Connection / SSH / X11 отмечаем галочку Enable X11 forwarding, а также дописываем в поле X display location значение localhost:0.

4. Далее подключаемся к удаленному серверу и запускаем наше приложение. Например, Solaris Studio:
/opt/oracle/solarisstudio12.3/bin/solstudio

Когда всё подгрузиться, вы увидите заветное окошко:

Для тех, кто работает в Linux-среде всё еще проще. Запускать приложения на удаленной машине можно, добавляя к подключению по ssh ключ -X.

Если нужно запустить графическое приложение на удаленной машине, не доступной с вашей рабочей, но доступной через третью машину, то на этой третьей машине необходимо сделать форвардинг 22го порта для ssh и 6010 порта (для дисплея localhost:0) TCP.