воскресенье, 22 мая 2016 г.

Как "правильно" настроить программный RAID в CentOS 6

Везде пишут как настроить программный RAID в Центе. Здесь я обращу внимание на ошибки, которые я допустил, из-за чего настройка заняла много времени.
Задача возникла при смене неисправного диска в существующем RAID-1.

Разметить новый диск по аналогии со старым - не проблема. Однако у меня оказалась GPT, поэтому fdisk не мог его разметить, пришлось устанавливать gdisk. Отличия в интерфейсе между ними не значительные.
Тут появилась первая проблема. При попытке добавить раздел в RAID возникала ошибка, сообщающая что раздел, который добавляется в RAID слишком маленький. Оказалось, что после работы gdisk информация о разделах диска не обновляется в ядре линукса. Проблема решается путем запуска программы partprobe.

Дальше эксперименты проводил на виртуалке. И никак не мог правильно поставить загрузчик, при том, что каталог /boot  у меня на отдельном разделе. Тут выяснилась вторая ошибка. Как и рекомендовано в некоторых инструкциях, под раздел boot был создан отдельный RAID, в котором создан primary-раздел. Не надо было создавать отдельный RAID. Нужно взять обычный раздел Linux (с кодом 83) и добавить его в RAID. В итоге он вроде как и обычный раздел, виден загрузчику, а вроде как и RAID и синхронизируется со вторым диском.

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

default=0
timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-504.el6.x86_64) (RAID)         root (hd0,0)         kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/md1p1 rd_NO_LUKS rd_NO_LVM rd_MD=/dev/md0,/dev/md1 LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet         initrd /initramfs-2.6.32-504.el6.x86_64.img
(Не забыть перед установкой grub обновить загрузчик командой mkinitrd.)
А вот при установке grub'а нужно постараться. Так как предполагается, что при  аварии второй диск станет первым, grub нужно устанавливать как на первый диск, дав вначале команду device (hd0) /dev/sdb:

grub> device (hd0) /dev/sdb
device (hd0) /dev/sdb
grub> find /grub/stage1
find /grub/stage1
 (hd0,0)
 (hd1,0)
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"... failed (this is not fatal)
 Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
 Running "install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf "... succeeded
Done.


четверг, 26 февраля 2015 г.

GRE traceroute

Потребовалось проверить на каком участке режется GRE тоннель (IP-пакеты c 47-м протоколом). Смог найти только одну программку для тестирования - hping.
Распространяется она в исходных кодах, требует для компиляции (на CentOS'е) libpcap-devel, неплохо работает без TCL. Процедура компилирования стандартная:
./configure --no-tcl
 make
 make install
При компиляции ругается
libpcap_stuff.c:19:21: error: net/bpf.h: Нет такого файла или каталога
Оказалось в моей версии libpcap (1.4.0-1.20130826) bpf.h расположен в каталоге pcap. Необходимо изменить 19-ю строчку в файле libpcap_stuff.c, заменить net/ на pcap/. После этого компилируется без ошибок и достаточно быстро.

Собственно для трассирования сети GRE-пакетами необходимо выполнить команду 
hping -0 -H 47 -e '0123456789' --traceroute <адрес>
где параметр -0 говорит что трассировка идет пакетами с произвольным содержанием;
параметр -H 47 - протокол IP-пакетов 47 (GRE);
параметр -e '0123456789' - содержимое пакетов (пустые пакеты не маршрутизируются).

Если при трассировании попадаются узлы которые не отвечают на пакеты, трассировка останавливается. Дальше можно продолжить в ручном режиме указав эти два ключа --tr-keep-ttl -t 13

воскресенье, 2 ноября 2014 г.

putty x11 forwarding и русский язык

При запуске графических приложений с просмотром рабочего окна на Винде возникло две проблемы. Набор текста на кириллице и его отображение.
Если с первой проблемой интернет мне помог (http://toster.ru/q/72850), то настройка отбражения кириллических шрифтов через Xming никак не давалось. Для настройки требовалась программа mkfontscale, которой в бесплатной версии не было.
Как оказалось, есть клон Xming, который называется VcXsrv, со встроенными кириллическими шрифтами (достаточными по крайней мере для моего случая). И настраивается он такими же ключами как и Xming. Так что переключение раскладки настраивается точно так же.
Последние бинарники не работают с Windows XP. У меня на XP заработала версия 1.14.2.1
Для автоматизации запуска X-сервера ярлык на него размещаем в "Автозагрузке" Windows и добавляем следующие параметры
-xkblayout us,ru -xkbvariant winkeys -xkboptions grp:alt_shift_toggle

вторник, 22 апреля 2014 г.

Как реанимировать RAID на Centos при использовании Partitionable RAID1

Есть в Centos механизм создания программного рейда при котором зеркалируются не отдельные разделы, а весь диск целиком (что вроде бы облегчает процедуру восстановления после замены диска). Описана она здесь: http://wiki.centos.org/HowTos/Install_On_Partitionable_RAID1
Однако, после выполнения всех действий по инструкции, система отказывается загружаться с одного диска, появляется сообщение: Kernel panic - not syncing: Attempted to kill init!
После изучения этого обсуждения сформировался такой алгоритм действий в подобной ситуации.
1. Если в grub.conf изначально, в параметрах загрузки ядра, не был указан аргумент rdshell, на экране выбора операционной системы при запуске нажимаем "a" и дописываем его ручками.
2. Когда процесс загрузки доходит до подключения корневой файлововй системы, ядро уже не вываливается, а появляется урезанная командная оболочка загрузчика.
3. Выводим состояние массивов cat /proc/mdstat и видим, что наш массив не активен.
4. Принудительно его запускаем: mdadm --run /dev/md_d0 (или как он у вас называется)
5. Проверяем, что он перешел в состояние active, так же через cat /proc/mdstat.
6. Выходим из оболочки загрузчка (Ctrl+D), и наблюдаем успешный процесс загрузки системы.
Причем, после однократного выполнения этих действий, последующие перезагрузки проходят успешно, пока не будет установлен второй диск и не собрано зеркало.
Зеркало собирается командой mdadm --add /dev/md_d0 /dev/sdb, если добавленный диск определился системой как sdb. Процесс синхронизации можно так же наблюдать через cat /proc/mdstat 

пятница, 20 сентября 2013 г.

Справочник рабочих дней для Астериска

Долго искал способ как настроить Астериск правильно учитывать праздничные дни и перенесенные выходные. Пришел к выводу, что лучше всего - база данных с занесенным в неё официальным производственным календарем. Поскольку многие встречаются с подобной проблемой, думаю такой календарь рабочих дней будет полезен.

Справочник доступен по адресам api1.vasha-ats.ru и api2.vasha-ats.ru. Запросы, естественно, принимаются через http. Строка запроса следующая.

/daytype.php?date=<yyyy-mm-dd>&friday=1&celebration=1

Все параметры не обязательные.
  • date - дата, о которой нужно получить информацию. Если не указывать, берется текущая дата по московскому времени. На данный момент в базу занесен календарь на 2013 и 2014 год.
  • friday - отделять пятницы от обычных рабочих дней. У многих по пятницам график работы отличается от обычных дней. Если указать этот параметр (не важно с каким значением), то в пятницу будет возвращаться "4", если не указывать - "0".
  • celebration - отделять праздники от выходных дней. Если его указать, то в праздники будет возвращаться "3", если не указывать - "1", как в обычный выходной день. Актуально для тех, кто работает по выходным, но не работает в праздники.
В ответ на полученный запрос должны вернуться две строчки

Date: YYYY-MM-DD\n
DayType: X\n

Я думаю, значение Date объяснять не надо. Его можно использовать для контроля.
Значение DayType одно из следующих.
  • 0 - рабочий день,
  • 1 -  выходной день,
  • 2 - предпраздничный день,
  • 3 - праздничный день, если в запросе был параметр  celebration,
  • 4 - пятница, если в запросе был параметр friday.

Мысли о том, как проще пользоваться этим API будут приведены в следующей статье.

P.S. Если кому-то этот сервис помог сэкономить время, нервы, средства, буду рад пожертвованиям на Яндекс.Кошелек 41001771457230

среда, 21 августа 2013 г.

Попытался поставить qutim из исходников на Centos 6. Долго бился над сообщением The CXX compiler identification is unknown и, как следствие, your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Установка переменной не помогла.
Оказалось, не доставился пакет gcc-c++ (C++ support for GCC). Причем поиск по C++ его не находил :-(

суббота, 20 июля 2013 г.

Получение, установка и проверка SSL сертификата, подписанного StartSSL

1. Необходимо доказать права на управление доменом.

Идем в Validation Wizard, выбираем валидацию домена и получаем письмо на postmaster@домен с кодом проверки. Валидация действует 90 дней, после чего валидацию необходимо повторить, если необходимо.

2. В Certificates Wizard выбираем Web Server SSL/TLS Certificate.

Вводим полностью доменное имя, для которого нужно сгенерировать сертификат. Можно ввести до пяти доменных имен на один сертификат, что полезно когда не поддерживаются виртуальные хосты, например на почтовом сервере.
Генерируем файл запроса сертификата (CSR) openssl req -newkey rsa:2048 -keyout ssl.key -out ssl.csr . Содержимое ssl.csr вставляем в текстовое поле на странице. Нажимаем "Submit", в ответ получаем архив с набором сертификатов под различные нужды.
При генерации файла запроса сертификата создается закрытый ключ ssl.key, защищенный паролем, без которого набор сертификатов бесполезен. Поэтому необходимо сделать его резервную копию и не забыть пароль.

3. Устанавливаем сертификаты.

Так как наш закрытый ключ защищен паролем, и вводить его каждый раз при запуске сервера сложно, необходимо пароль снять. Для этого выполняем команду openssl rsa -in ssl.key -out ssl.key , сохраняем измененный закрытый ключ в специальной папке (на CentOS 6 это /etc/pki/tls/private/) и проверяем права доступа к нему (типично доступ должен быть только у рута на чтение).

Для работы многих программ (lighttpd, dovecot, postfix) необходим единственный файл сертификата, содержащий все промежуточные сертификаты. Он делается простой конкатенацией сертификатов из архива OtherServer: cat 2_домен.crt 1_Intermediate.crt root.crt >/etc/pki/tls/certs/server.pem .

3.1. Настройка Апача.

В Апаче сертификаты описываются следующими параметрами конфигурационного файла.
SSLCertificateKeyFile /etc/pki/tls/private/ssl.key # наш закрытый ключ, незащищенный паролем
SSLCertificateFile /etc/pki/tls/certs/ssl.crt # файл из архива сертификатов для Апача с именем 2_домен.crt
SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt # файл из архива сертификатов для Апача с именем 1_root_bundle.crt
Не забываем проверить остальные настройки SSL, какими они должны быть подробно описано в Интернете.

3.2. Настройка Postfix

В Postfix'е за SSL-сертификаты отвечают следующие параметры конфигурационного файла main.cf.
smtpd_tls_cert_file = /etc/pki/tls/certs/server.pem # созданный объединением сертификатов из архива OtherServer
smtpd_tls_key_file = /etc/pki/tls/private/ssl.key # наш закрытый ключ, незащищенный паролем
Также для работы шифрования должны быть установлены следующие параметры
smtpd_tls_security_level = may
smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
tls_random_source = dev:/dev/urandom

3.3. Настройка Dovecot

В Dovecot'е за SSL-сертификаты отвечают следующие параметры конфигурационного фала.
ssl_cert = </etc/pki/tls/certs/server.pem
ssl_key = </etc/pki/tls/private/ssl.key
Также для работы шифрования необходимо установить параметр
ssl = required

3.4. Настройка Lighttpd

В Lighttpd цепочка сертификатов и закрытый ключ объединяются в один файл cat /etc/pki/tls/private/ssl.key /etc/pki/tls/certs/server.pem >/etc/pki/tls/private/lighttpd.pem (не забываем про права доступа к файлу).
И прописывается в конфигурационном файле в параметре ssl.pemfile = "/etc/pki/tls/private/lighttpd.pem"
Нужно не забыть включить ssl параметром ssl.engine = "enable"

4. Проверяем сертификаты.

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

Для проверки корректности шифрования необходимо выполнить команду: openssl s_client -showcerts -connect localhost:443. В ответ должны получить что-то типа Verify return code: 0 (ok).
Если для запуска шифрования необходима команда STARTTLS, то проверка будет запускаться таким образом: openssl s_client -starttls smtp -showcerts -connect localhost:25

При выполнении проверки мне встречались такие ошибки. Verify return code: 20 (unable to get local issuer certificate) и Verify return code: 21 (unable to verify the first certificate). Они говорит о том, что openssl не знает, где взять ключи издателей. Нужно ему подсказать, добавив ключ -CApath /etc/ssl/certs или -CAfile /usr/share/curl/ca-bundle.crt, у меня они нашлись в этом файле.

Команда openssl с опцией -showcerts показывает сертификаты в закодированном виде. Чтобы увидеть их содержимое можно использовать команду openssl x509 -noout -text -startdate -enddate -in /tmp/cert, где /tmp/cert - файл, в котором сохранен закодированный сертификат.

Для проверки надежности шифрования можно воспользоваться сервисом Qualis SSL Labs