RAID’ы

Года полтора назад столкнулся с заменой винта в RAID10. Всё прошло гладко, но возникла мысль о его устойчивости.
RAID10 почему-то слишком часто считается самым быстрым и одним из надёжных из существующих. Но! Очевидно, что он не может потерять больше 1 диска с сохранением всех данных. Нет, он конечно может потерять 2 диска, но только в одном случае из 3х, т.е. по удачному стечению обстоятельств.
Так вот что получается. Imho RAID10 не выгоден ни с точки зрения использования дискового пространства, ни с точки зрения устойчивости, ни даже с точки зрения производительности в общем случае. Разумеется речь идёт об аппаратных массивах, т.е. где основной процессор(ы) системы не задействован.
Итак.
RAID 10 требует минимум 4 дисков. Их и рассмотрим как самый попсовый вариант для небольших серверов.
RAID5:
+ даёт на треть больше дискового пространства;
= устойчив к потере одного любого диска;
+ в теории позволяет наращивать массив по одному диску (в моей практике не было таких наращиваний);
+ производительность на чтение уделывает RAID 10. На запись — тот же уровень.
RAID6:
= даёт такой же объём;
+ устойчив к потере двух абсолютно любых дисков;
+ в теории позволяет наращивать массив по одному диску (в моей практике не было таких наращиваний);
= производительность чтения и записи такая же.

О производительности надо оговорить следующее:
— аппаратный RAID берёт на себя всё обсчёты данных для их «размазыванию» по физическим дискам и это не заметно на уровне ОС;
— большинство попсовых систем больше читают данные, чем пишут;
— при количестве дисков больше 4х есть куда более производительные и надёжные варианты.

Беспонтовый lvm cache

/dev/sda — основной винт
/dev/sdb — ssd
data — lvgroup
DataLV — lv

# pvcreate /dev/sdb
# vgextend data /dev/sdb

Два раздела под данные и под метаданные. Под данные в 1000 раз больше места надо чем под меты.

# lvcreate -n DataLVcache -L19.9G data /dev/sdb
# lvcreate -n DataLVcacheMeta -L20M data /dev/sdb

# lvconvert —type cache-pool —cachemode writethrough —poolmetadata data/DataLVcacheMeta data/DataLVcache

writeback VS writethrough — неясно. Типа writethrough более надёжный, а writeback более быстрый. На чтение вообще никак не влияет.

# lvconvert —type cache —cachepool data/DataLVcache data/DataLV

Типа готово.

Режим кэширования меняется так:
# lvconvert —cachemode writethrough|writeback VG/CacheLV

Плюс нашёл только один — всё меняется на лету. Без перемонтирования и перезагрузок. Данные не страдают.

Огромный минус — не смог загрузиться с кэшированной rootfs. Предлагают только танцы с бубном с пересборкой ядра. А это не наш метод.

Ненавистный audit в Fedora

Боремся:
You can quickly disable audit temporarily with

$ sudo auditctl -e 0

and temporarily remove all the rules with

$ sudo auditctl -D

For future boots you could try disabling its start with

$ sudo systemctl disable auditd

До кучи:
# systemctl disable systemd-journald-audit.socket
# systemctl stop systemd-journald-audit.socket

Назлоамерикосам: замена батареи в APC BX650CI

В инструкции написано, что юзер не может сам заменить батарею и требуется нести его в сервисный центр. Но почему-то нигде не написано как вырвать мерзкую пищалку которая не переставая сверлит мозг если УПС решил, что ему надо заменить батарейку.
С пищалкой я так и не разобрался, но до батарейки добрался и теперь знаю как её ЛЕГКО сменить не сломав УПС. Итак, батарейка за передней крышкой, которая из себя представляет кусок пластмассы и больше ничего. Прежде чем туда лезть — выдерните предохранитель (желтый такой) с задней стенки УПСа.
Чтобы снять эту крышку нужно:
1. открутить крестовой отвёрткой два самореза внизу передней панели.
2. нажать на панель сверху вниз и она съедет на 1-1.5 см. вниз
3. потянуть панель на себя
В итоге перед вами стоящий на боку аккумулятор GP1272F2. Дальше всё еще проще:
1. скидываете клеммы и вытягиваете аккумулятор на себя
2. ставите новый и накидываете клеммы обратно
3. в обратном порядке ставите панель назад
4. возвращаете предохранитель
5. включаете УПС

Поздравляю. А я пока допёр до этого всего сломал три защёлки на передней панеле. 😉

Почта для кириллических доменов

На текущий момент только один почтовик заявляет и выпускает хоть какие-то релизы с поддержкой SMTPUTF8 или RFC 6531. Это экспериментальные релизы Postfix 2.12.
Но даже при наличии поддержки в нём система доставки кириллической почты просто так не заработает. Поэтому запасаемся напильником.
Настраивать сервер будем под Debian 7. В моём случает он внутри VZ контейнера, а эксперименты проводились внутри LXC контейнера.
После создания контейнера сносим оттуда штатный почтовик, если он есть:

apt-get purge exim* sendmail* и пр.

Качаем последнюю версию Postfix 2.12 experimental release:

wget http://mirrors-ru.go-parts.com/postfix/source/experimental/postfix-2.12-20140905.tar.gz

Заранее создаём юзера и группу:

useradd postfix -s /bin/false
groupadd postdrop

Распаковываем:

tar -zxf postfix-2.12-20140905.tar.gz

Патчим src/smtpd/smtpd.c:

apt-get install patch
patch postfix-2.12-20140905/src/smtpd/smtpd.c smtpd.patch

где smtpd.patch имеет содержимое:

--- smtpd.c	2014-10-06 00:15:18.000000000 +0400
+++ smtpd.c.force.smtputf8	2014-10-07 15:36:21.352884670 +0400
@@ -2317,21 +2317,8 @@
 	return (-1);
     }
 
-    /*
-     * XXX The sender address comes first, but the optional SMTPUTF8
-     * parameter determines what address syntax is permitted. We must process
-     * this parameter early.
-     */
-    if (var_smtputf8_enable
-	&& (state->ehlo_discard_mask & EHLO_MASK_SMTPUTF8) == 0) {
-	for (narg = 3; narg < argc; narg++) {
-	    arg = argv[narg].strval;
-	    if (strcasecmp(arg, "SMTPUTF8") == 0) {	/* RFC 6531 */
-		smtputf8 = 1;
-		break;
-	    }
-	}
-    }
+    smtputf8 = 1;
+
     if (extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR,
 		     var_strict_rfc821_env, smtputf8) != 0) {
 	state->error_mask |= MAIL_ERROR_PROTOCOL;

Нужно это для того, чтобы почтовые клиенты, которые на данный момент не готовы полностью к таким серверам, могли через них всё-таки почту отправлять.
Дело в том, что эта сборка Postfix для активации SMTPUTF8 режима должна на входе получить:

RCPT TO:< юзер@домен.рус> SMTPUTF8

Быстрая проверка показала, что даже почтовые клиенты заявившие о поддержке IDN почты не отправляют SMTPUTF8 в RCPT TO и тем самым создают себе проблемы с отправкой.

Готовимся к сборке:

apt-get install build-essential libdb-dev libicu-dev libssl-dev
apt-get install checkinstall
apt-get install rsyslog telnet

Заодно готовимся к использованию Dovecot в качестве средства авторизации:

apt-get install dovecot-imapd dovecot-pop3d

Собираем с поддержкой SASL и TLS:

cd postfix-2.12-20140905
make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\" -DUSE_TLS' AUXLIBS="-ldb -lnsl -lresolv -lssl"
make
make install

Теперь надо это всё настроить:
В /etc/dovecot/conf.d/10-master.conf правим сокет для авторизации (95 строка примерно):

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

В /etc/dovecot/conf.d/10-auth.conf (99 строка примерно) добавляем любимые способы авторизации, например:

auth_mechanisms = plain login

Перезапускаем:

/etc/init.d/dovecot restart

Должно заработать.

После правки конфиг Postfix /etc/postfix/main.cf получился такой:

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = postfix.regtime.net
mydomain = postfix.regtime.net
inet_interfaces = all
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
home_mailbox = Mailbox
 
mail_spool_directory = /var/mail
  
debug_peer_level = 6
debugger_command =
	 PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
	 ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = no
inet_protocols = ipv4
meta_directory = /etc/postfix
shlib_directory = no

smtputf8_autodetect_classes = all
smtputf8_enable = yes

virtual_mailbox_domains = русскийдомен.рф
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

smtpd_tls_CAfile = /etc/ssl/certs/ca.pem
smtpd_tls_CApath = /etc/ssl/certs
smtpd_tls_cert_file = /etc/dovecot/dovecot.pem
smtpd_tls_key_file = /etc/dovecot/private/dovecot.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
smtpd_use_tls = yes

# Enable STARTTLS encryption 
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca.pem
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtpd_tls_security_level = may

smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = no
tls_random_source = dev:/dev/urandom

Настройка для довольно простого использования обычных системых mailbox’ов на одном кириллическом домене. Те кто разбирается в Postfix чуть более глубоко — может это легко перенастроить под более привычные ему варианты.

В /etc/postfix/virtual_mailbox пишем:

имя.фамилия@русскийдомен.рф  user1

где user1 — системный юзер, которого нужно добавить штатной командой:

useradd user1 -s /bin/false

А в /etc/postfix/uid_maps:

имя.фамилия@русскийдомен.рф  1000

где 1000 — это uid для user1.

Тут же становится понятно, что для авторизации будет использован классический ASCII логин user1 и пароль к нему. В качестве POP3/IMAP4/SMTP сервера postfix.regtime.net.

Преобразуем это в хэш:

postmap /etc/postfix/aliases
postmap /etc/postfix/virtual_mailbox
postmap /etc/postfix/uid_maps

Перечитываем конфиг или запускаем, перезапускаем Postfix:

postfix reload/stop/start

Проверяем:

# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 postfix.regtime.net ESMTP Postfix
EHLO localhost
250-postfix.regtime.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
quit
221 2.0.0 Bye
Connection closed by foreign host.

Теперь когда сервер умеет работать с кириллическими адресами настало время выбрать клиента.
Гарантировано работает Claws Mail начиная с версии 3.9.3.
Evolution 3.10.4 тоже справляется с этой задачей.
Есть специальный клиент — EAI-SMTPUTF8 v.2.0
Гарантированно не работает Mozilla Thunderbird.

Mustek 1248UB and Fedora 20

Напомню себе, что в Fedora недостаточно поставить sane и xsane со всеми зависимостями, чтобы Mustek 1248UB заработал. Закачать прошивку с оффсайта http://www.meier-geinitz.de/sane/gt68xx-backend/index_ru.html тоже не поможет. Еще нужен sane-backends-drivers-scanners
Это логично, но не очевидно. 😉

Пробрасываем порты

Существует как минимум два самых известных способа пробросить порт через Linux машину.
1. iptables
2. ssh
Недавно начал использовать еще один очень просто вариант — xinetd.
Сначала поставим его: apt-get install xinetd
Теперь настраиваем произвольные порты, например:

service proxy7001
{
        disable = no
        type = UNLISTED
        socket_type = stream
        protocol = tcp
        wait = no
        bind = 127.0.0.1
        user = www-data
        redirect = 172.18.1.3 7001
        port = 7001
}

Что имеем? Локальный порт tcp 7001, который форвардится на сервер с IP 172.18.1.3 и порт 7001.

В некоторых случаях это проще и легче, чем iptables и ssh. Действуйте по ситуации. 😉

RTC на Raspberry Pi B

Были закуплены вот такие модули. На ds 1307. Годны для использования на Raspberry Pi B.
Подключаются довольно просто:
VCC — 5V, GND — 0, SCL — к GPIO 1, SDA — к GPIO 0.
Картинки для простоты понимания:

ds1307

PiGPIOs

Далее на Raspberry делаем следующие:

# apt-get install i2c-tools
# modprobe i2c-bcm2708
# modprobe rtc-ds1307
# modprobe -r i2c-bcm2708
# i2cdetect 1
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# hwclock -r

После чего должно появиться некое время и дата с подключенного модуля.
Если всё получилось, то оставляем это на постоянку:

# echo 'i2c-dev' >> /etc/modules
# echo 'rtc-ds1307' >> /etc/modules
# sed -i 's/blacklist i2c-bcm2708/#blacklist i2c-bcm2708/' /etc/modprobe.d/raspi-blacklist.conf

В /etc/rc.local добавляем перед exit следующее:

for bus in $(ls -d /sys/bus/i2c/devices/i2c-*);
do
  echo ds1307 0x68 >> $bus/new_device;
  if [ -e /dev/rtc0 ];
  then
    break; # RTC found, bail out of the loop
  else
    echo 0x68 >> $bus/delete_device
  fi
done
hwclock -s

iSCSI Quorum Disk

Вот здесь описано как сделать iSCSI Quorum Disk для двухголового Proxmox’а, но на RH-based Linux, что довольно странно, т.к. сам Proxmox построен на Debian, хотя и с RedHat ядром.
Но у меня реально есть только Дебианы и там не везде есть LVM.
Итак…

dd if=/dev/zero of=/var/proxmox2quorumdisk bs=1024 count=100

И никакого lvm не надо.
Ставим сервер aka target.


apt-get install iscsitarget iscsitarget-dkms
echo "ISCSITARGET_ENABLE=true" > /etc/default/iscsitarget

В /etc/iet/ietd.conf пишем:


Target iqn.2013-02.tld.domain.host:p1qdisk.lun1
IncomingUser rquser rqpass
OutgoingUser
Lun 0 Path=/var/proxmox2quorumdisk,Type=fileio
Alias LUN1
MaxConnections 4

echo "iqn.2013-02.tld.domain.host:p1qdisk.lun1 IP1,IP2,IP3" > /etc/iet/initiators.allow

И… запускаем:

/etc/init.d/iscsitarget start

Теперь может возникнуть желание расшарить этот диск только с определенного IP. Статная обёртка в Debian этого не позволяет. Пропатчить можно так:

echo "ISCSITARGET_OPTIONS='--address=IP'" >> /etc/default/iscsitarget

И правим в /etc/init.d/iscsitarget в функции ietd_start строку:

start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $ISCSITARGET_OPTIONS

Перезапускаем:

/etc/init.d/iscsitarget restart

Теперь настроим клиента aka initiator.

apt-get install open-iscsi

Правим /etc/iscsi/iscsid.conf:

node.startup = automatic

/etc/init.d/open-iscsi restart

Подключаем диск:


iscsiadm -m discovery -t st -p IP
iscsiadm -m node

iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.authmethod --value=CHAP
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.username --value=rquser
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.password --value=rqpass
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --login

По идее после этого должен появиться новый диск. У меня это /dev/sdc

Теперь на нём создадим Quorum Disk:

fdisk /dev/sdc

Далее создаём новый раздел: n, p, 1, w. Ну там для размера Enter понажимаем для подтверждения полного размера.

mkqdisk -c /dev/sdc1 -l p1qdisk

Перезагружаем клиентов на клиентах:

/etc/init.d/open-iscsi restart

А дальше по тексту оригинальной инструкции и всё сработает.

Внезапно: Простоквашино

Уже неделю смотрю с сыном мультики про троих из Простоквашино. Сейчас они воспринимаются по-другому. Матроскин и Шарик постоянно ругаются и спорят, а мамаша Дяди Фёдора вообще злобная истеричка.
Самый добрый из последнего вновь увиденного — «Жил был пёс»