Игрища с сервером – 1

Или даешь централизацию! Сервер установлен, некоторые виртуалки перенесены, а некоторые удалены. Надо облегчать себе жизнь.

Уже сейчас на хосте размещено с десяток виртуалок. И уже сейчас всеми ими рулить скучно. Зашел на одну, обновил, сходил на другую, обновил. А пароли поменять? А дать доступ очередному фрилансеру и потом не забыть его отобрать? В общем, тяжело. Было.

Первым делом надо поставить единую систему авторизации. Что бы все пароли были в одном месте и думать не надо было. Так как основной системой везде у меня CentOS, то самым логичным кандидатом на эту тему становится FreeIPA.

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

yum -y install ipa-server bind bind-dyndb-ldap ipa-server-dns
ipa-server-install --setup-dns --mkhomedir

Если что-то где-то накосячили (а вы в первый раз обязательно накосячите), то всегда можно убрать все в первоначальное состояние.
ipa-server-install --uninstall

В процессе установки у меня спросили два пароля – самого главного и админа. Плюс отказался от dns-forwarders (ибо пока в них смысла нет, но если надо, то потом можно поставить), а дальше просто соглашался со всем. Как увидите бегущие пунктики – значит вы прорвались и скоро получите настроенную систему.

Итак, оно вроде сказало, что готово. Чего делаем? Первым делом – сделаем, что бы у пользователей по умолчанию был шелл /bin/bash, а не /bin/sh.

kinit admin
ipa config-mod --defaultshell=/bin/bash

И добавлю себя любимого

# ipa user-add
First name: Viacheslav
Last name: Kaloshin
User login [vkaloshin]: multik
-------------------
Added user "multik"
-------------------
User login: multik
First name: Viacheslav
Last name: Kaloshin
Full name: Viacheslav Kaloshin
Display name: Viacheslav Kaloshin
Initials: VK
Home directory: /home/multik
GECOS: Viacheslav Kaloshin
Login shell: /bin/bash
Kerberos principal: multik@LOCAL.MULTIK.ORG
Email address: multik@local.multik.org
UID: 1624000001
GID: 1624000001
Password: False
Member of groups: ipausers
Kerberos keys available: False

и поменяем пароль мне (в принципе можно было это сделать и сразу, но так интересней)

# ipa user-mod multik --password
Password:
Enter Password again to verify:
----------------------
Modified user "multik"
----------------------
User login: multik
First name: Viacheslav
Last name: Kaloshin
Home directory: /home/multik
Login shell: /bin/bash
Email address: multik@local.multik.org
UID: 1624000001
GID: 1624000001
Account disabled: False
Password: True
Member of groups: ipausers
Kerberos keys available: True

Теперь в принципе можно проверить, залогинившись на хост свежесозданным пользователем

# ssh multik@10.100.0.10
multik@10.100.0.10's password:
Password expired. Change your password now.
Creating home directory for multik.
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user multik.
Current Password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Connection to 10.100.0.10 closed.

Как видим, система принудительно заставляет пользователя сменить пароль. Это хорошо.

В принципе, можно все необходимое делать из консоли, а можно и с веб-интерфейса – просто браузером сходите и все сами увидите.

Но это только начало. Нам надо к этой системе подключить остальные виртуалки. Для этого надо сделать две простые вещи: настроить DNS и поставить клиента ipa. Пока для проверки, я это сделаю только на одном хосте.

на виртуалке:

# cat /etc/resolv.conf
search local.multik.org
nameserver 10.100.0.10
nameserver 10.100.0.254

на ipa надо открыть днс:

firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --reload

и опять на виртуалке

# ping ipa -c 2
PING ipa.local.multik.org (10.100.0.10) 56(84) bytes of data.
64 bytes from ipa.local.multik.org (10.100.0.10): icmp_seq=1 ttl=64 time=0.344 ms
64 bytes from ipa.local.multik.org (10.100.0.10): icmp_seq=2 ttl=64 time=0.461 ms

--- ipa.local.multik.org ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.344/0.402/0.461/0.061 ms

Отлично. Теперь подключим виртуалку

На ipa

firewall-cmd --permanent --add-service={ntp,http,https,ldap,ldaps,kerberos,kpasswd}
firewall-cmd --reload

на виртуалке

yum install -y ipa-client
# ipa-client-install --mkhomedir
Discovery was successful!
Client hostname: vsemoe-com.local.multik.org
Realm: LOCAL.MULTIK.ORG
DNS Domain: local.multik.org
IPA Server: ipa.local.multik.org
BaseDN: dc=local,dc=multik,dc=org

Continue to configure the system with these values? [no]: yes
Synchronizing time with KDC...
Attempting to sync time using ntpd. Will timeout after 15 seconds
User authorized to enroll computers: admin
Password for admin@LOCAL.MULTIK.ORG:
Successfully retrieved CA cert
Subject: CN=Certificate Authority,O=LOCAL.MULTIK.ORG
Issuer: CN=Certificate Authority,O=LOCAL.MULTIK.ORG
Valid From: Mon Jan 25 12:03:20 2016 UTC
Valid Until: Fri Jan 25 12:03:20 2036 UTC

Enrolled in IPA realm LOCAL.MULTIK.ORG
Created /etc/ipa/default.conf
New SSSD config will be created
Configured sudoers in /etc/nsswitch.conf
Configured /etc/sssd/sssd.conf
Configured /etc/krb5.conf for IPA realm LOCAL.MULTIK.ORG
trying https://ipa.local.multik.org/ipa/json
Forwarding 'ping' to json server 'https://ipa.local.multik.org/ipa/json'
Forwarding 'ca_is_enabled' to json server 'https://ipa.local.multik.org/ipa/json'
Systemwide CA database updated.
Added CA certificates to the default NSS database.
Hostname (vsemoe-com.local.multik.org) does not have A/AAAA record.
Missing reverse record(s) for address(es): 10.100.0.178, 2a01:4f8:171:1a43:5054:ff:fe51:f70e.
Adding SSH public key from /etc/ssh/ssh_host_rsa_key.pub
Adding SSH public key from /etc/ssh/ssh_host_ecdsa_key.pub
Adding SSH public key from /etc/ssh/ssh_host_ed25519_key.pub
Forwarding 'host_mod' to json server 'https://ipa.local.multik.org/ipa/json'
SSSD enabled
Configured /etc/openldap/ldap.conf
NTP enabled
Configured /etc/ssh/ssh_config
Configured /etc/ssh/sshd_config
Configuring local.multik.org as NIS domain.
Client configuration complete.

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

[root@ipa ~]# host vsemoe-com
vsemoe-com.local.multik.org has address 10.100.0.178
vsemoe-com.local.multik.org has IPv6 address 2a01:4f8:171:1a43:5054:ff:fe51:f70e

Проверяю, как оно работает

[root@tower ~]# ssh multik@10.100.0.178
multik@10.100.0.178's password:
Creating home directory for multik.
[multik@vsemoe-com ~]$ whoami
multik
[multik@vsemoe-com ~]$ id
uid=1624000001(multik) gid=1624000001(multik) groups=1624000001(multik) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

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

Новый сервер с игрищами и блудницами – 5

Или баррикадируемся от подборщиков паролей.

Захожу я утром на свой сервер, а мне добрая система сообщает

Last failed login: Sat Jan 23 10:23:49 MSK 2016 from 183.3.202.106 on ssh:notty
There were 5278 failed login attempts since the last successful login.

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

-A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Как это работает, можно почитать на хабре в комментах.

Поглядел в логи – ляпота и чистота.

Теперь (лично мне) надо поставить 6ю центось. Надо по двум причинам: попробовать графическую консоль (ибо в полном тексте как 7я оно не ставится), и надо для OpenVZ, у которой опять же с 7й еще есть проблемы.

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

virt-install --name openvz --ram 8912 --disk path=/vm/openvz.qcow2,size=8,bus=virtio,cache=none --vcpus 4 --os-type linux --network bridge=virbr0,model=virtio -c /vm/iso/CentOS-6.7-x86_64-minimal.iso --accelerate --noautoconsole --graphics vnc,password=test,listen=10.100.0.254 -v --input tablet,bus=usb

Теперь ssh -L 5900:10.100.0.254:5900 root@host и любым VNC клиентом на 127.0.0.1:5900. Пароль, как видно из команды – test. Просто, удобно и понятно.

Но мне понравилось, что можно в машину забраться и через virsh console. В винтуальной машине делаем

cat /etc/init/ttyS0.conf
stop on runlevel[016]
start on runlevel[345]
respawn
instance /dev/ttyS0
exec /sbin/mingetty /dev/ttyS0

В самый конец /etc/securetty добавляем
ttyS0

И запускаем

initctl start ttyS0

И в общем, должны попасть через virsh console. Для логов загрузки, для kernel в /etc/grub.conf добавляем

console=ttyS0

У меня все получилось. Дальше иду как написано в вики OpenVZ. Ставлю, мигрирую и так далее.

Новый сервер с игрищами и блудницами – 4

Прошлый раз я закончил на том что мне удалось завести сертификат для vsemoe.com. Вручную, но тем не менее. Но доменчиков у меня целая куча и руками для них запрашивать сертификаты каждые три месяца … я слишком ленивый для этого. Да и интернет предлагает разные варианты решения этой проблемы.

Первым делом конфигурирую домены vsemoe.org и kaloshina.com аналогично vsemoe.com

bash-3.2$ host vsemoe.com
vsemoe.com has address 136.243.151.196
vsemoe.com has IPv6 address 2a01:4f8:171:1a43:5054:ff:fee4:b6d1
vsemoe.com mail is handled by 10 mail.multik.org.
bash-3.2$ host kaloshina.com
kaloshina.com has address 136.243.151.196
kaloshina.com has IPv6 address 2a01:4f8:171:1a43:5054:ff:fee4:b6d1
kaloshina.com mail is handled by 10 mail.multik.org.
bash-3.2$ host vsemoe.org
vsemoe.org has address 136.243.151.196
vsemoe.org has IPv6 address 2a01:4f8:171:1a43:5054:ff:fee4:b6d1
vsemoe.org mail is handled by 10 mail.multik.org.

В конфиг nginx добавил

location '/.well-known/acme-challenge' {
default_type "text/plain";
root /tmp/letsencrypt-auto;
}

и попробовал заказать сертификат

./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --agree-tos --webroot-path=/tmp/letsencrypt-auto/ -d kaloshina.com

Фигу. Создал там файлик test. Сервер в логах упорно ругается

[error] 1346#0: *3 open() "/tmp/letsencrypt-auto/.well-known/acme-challenge/test" failed (2: No such file or directory), client: 91.195.22.23, server: kaloshina.com, request: "GET /.well-known/acme-challenge/test HTTP/1.1", host: "kaloshina.com"

Хотя если проверить вручную, то этот фаил есть

cat /tmp/letsencrypt-auto/.well-known/acme-challenge/test
BLYA

Прочитал про пакость от systemd про приватные /tmp. Сменил

/lib/systemd/system/nginx.service
PrivateTmp=false

Не помогло.

Плюнул и создал каталог /opt/letsencrypt и переместил все туда

./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --agree-tos --webroot-path=/opt/letsencrypt/ -d vsemoe.org
Updating letsencrypt and virtual environment dependencies......
Requesting root privileges to run with virtualenv: /root/.local/share/letsencrypt/bin/letsencrypt certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --agree-tos --webroot-path=/opt/letsencrypt/ -d vsemoe.org

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/vsemoe.org/fullchain.pem. Your cert will
expire on 2016-04-18. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Сразу же скриптуем это 🙂

# cat /opt/ssl_get
#!/bin/bash
cd /root/letsencrypt
./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --agree-tos --webroot-path=/opt/letsencrypt/ -d $1

и для обновления

# cat ssl_renew
#!/bin/bash
cd /root/letsencrypt
./letsencrypt-auto --renew certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --agree-tos --webroot-path=/opt/letsencrypt/ -d $1
service nginx restart

Проверяем. У меня работает. При этом автоматом включился SNI и прекрасно раздает с одного ип-адреса много https сайтов.

Отлично, теперь пора переносить контент сайтов.

Новый сервер с игрищами и блудницами – 3

TL;DR; Статья грустная, в которой ничего почти не получилось, зато узнано много нового.

Почти вся полезная нагрузка сервера – это веб-сервера. Маленькие и не очень, требующие много места и просто пустышки. Так как я хочу сделать так, что бы все сервера были видны из интернета по SSL, то придется сделать ход конем.

Все запросы на http/https будут приходить на nginx. А тот будет работать SSL-декриптором и общаться с серверами уже по чистому http. Делать двойное шифрование-расшифрование я смысла не вижу – только трата процессорного времени. А те, кто знает про ipv6 – получат прямой доступ.

Из особенностей: машинам присваиваю имена сразу в полном формате: nginx.local.multik.org. При этом домен не пересекается с реальным, но является субдоменом. Потом, когда я буду поднимать единую систему авторизации, это сильно облегчит жизнь.

Делаем машинку для nginx

virt-install --name nginx --ram 1024 --disk path=/vm/nginx.qcow2,size=8,bus=virtio,cache=none --vcpus 2 --os-type linux --network bridge=virbr0,model=virtio --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics --accelerate

и для первого сервера vsemoe.com, на котором буду тренироваться.

virt-install --name vsemoe.com --ram 1024 --disk path=/vm/vsemoe.com.qcow2,size=8,bus=virtio,cache=none --vcpus 1 --os-type linux --network bridge=virbr0,model=virtio --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics --accelerate

На всякий случай проверяем, что машинки в автозапуске

virsh autostart nginx
virsh autostart vsemoe.com

На nginx – обновляемся, ставим epel-release, nginx, проколупываем дырки и ребутимся

yum update
yum install epel-release
yum install nginx
systemctl enable nginx
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

на vsemoe – обновляемся, ставим апач и далее по тексту

yum update
yum install httpd
systemctl enable httpd
firewall-cmd --permanent --zone=public --add-service=http

Nginx получил адреса 10.100.0.186 и 2a01:4f8:171:1a43:5054:ff:fee4:b6d1
vsemoe.com 10.100.0.178 и 2a01:4f8:171:1a43:5054:ff:fe51:f70e

Теперь иду на DNS и делаю так, что бы все видели vsemoe.com по правильным адресам

$ host vsemoe.com
vsemoe.com has address 136.243.151.196
vsemoe.com has IPv6 address 2a01:4f8:171:1a43:5054:ff:fe51:f70e

Добавляем на хосте

firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=10.100.0.186 --permanent

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

И ничего не работает. Вернее, все попытки возвращаются как connection refused. Однако если на хосте поднять nc -l 80, то все получается. Вывод – не работает порт-форвардинг.

Проверяю

[root@tower ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@tower ~]# cat /proc/sys/net/ipv4/ip_forward
1

Все на месте. Проверяю “ручной режим”

systemctl stop firewalld
iptables -t nat -A PREROUTING -d 136.243.151.196 -i eth0 -p tcp -m multiport --dports 80 -j DNAT --to-destination 10.100.0.186

Работает. Значит где-то проблема в правилах. Читаем вывод iptables -S и натыкаемся на баг 1079088

iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable

и все заработало. По крайней мере я увидел в браузере заставку от nginx.

firewall-cmd --permanent --zone=public --add-service=https --permanent
firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toaddr=10.100.0.186 --permanent

что бы не мучаться, я создал маленький скрипт

[root@tower ~]# cat > /usr/bin/firewall-restart
#!/bin/bash
firewall-cmd --reload && sleep 1 && iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
[root@tower ~]# chmod +x /usr/bin/firewall-restart

Пробуем телнетом

[root@outpost ~]# telnet vsemoe.com 80
Trying 2a01:4f8:171:1a43::2...
telnet: connect to address 2a01:4f8:171:1a43::2: Connection refused
Trying 136.243.151.196...
Connected to vsemoe.com.
Escape character is '^]'.

Так как ipv6 порты не форвардятся, то меняем адрес vsemoe.com на нормальный и пробуем

[root@outpost ~]# telnet vsemoe.com 80
Trying 2a01:4f8:171:1a43:5054:ff:fe51:f70e...
Connected to vsemoe.com.
Escape character is '^]'.
^]

Все, как и полагается. ipv4 идет на nginx, а ipv6 – напрямую на сервер.

Теперь правим nginx. Мне надо, что бы в логах указывалось, к какому серверу изначально был запрос. Добавляю “$server_name” в log-format

Добавляю описание сайта

# cat /etc/nginx/conf.d/vsemoe.com.conf
server {
listen 80;
server_name vsemoe.com www.vsemoe.com;

location ~ /.svn/ {
deny all;
}

location / {
proxy_pass http://10.100.0.178;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffer_size 4K;
proxy_buffers 64 4K;
}
}

Перезагружаю и вижу в браузере уже заставку apache. Значит, сработало. Сходил с ipv6 машинки – опять показало. Ура, значит еще один шаг сделан. Теперь надо зашифроваться.

Покупать сертификаты я пробовал – чертовски невыгодная штука. Но благодаря разным людям появился проект Let’s Encrypt, который позволяет получить сертификат бесплатно.

Что бы не мучаться с заставками, на vsemoe.com создал маленькую страничку

cat > index.html
this is vsemoe.com site
[root@outpost ~]# curl -4 vsemoe.com
this is vsemoe.com site
[root@outpost ~]# curl -6 vsemoe.com
this is vsemoe.com site

Опять же работает. Пора пробовать letsencypt

yum install git
git clone https://github.com/letsencrypt/letsencrypt letsencrypt

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

Убираю правила

firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toaddr=10.100.0.186 --permanent
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toaddr=10.100.0.186 --permanent

И все работает. Добавляю – падает. Читаю вывод iptables -S и понимаю, что там тупо все пакеты пытаются завернуться на nginx. Ни слова про интерфейс или адрес. Читаю маны и понимаю, что оно должно, но не работает. Пробую создать спец-правила

firewall-cmd --add-rich-rule='rule family="ipv4" destination address="136.243.151.196" forward-port to-addr="10.100.0.186" to-port="80" protocol="tcp" port="80"' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" destination address="136.243.151.196" forward-port to-addr="10.100.0.186" to-port="443" protocol="tcp" port="443"' --permanent

Интернет пропадает …

firewall-cmd --remove-rich-rule='rule family="ipv4" destination address="136.243.151.196" forward-port to-addr="10.100.0.186" to-port="80" protocol="tcp" port="80"' --permanent
firewall-cmd --remove-rich-rule='rule family="ipv4" destination address="136.243.151.196" forward-port to-addr="10.100.0.186" to-port="443" protocol="tcp" port="443"' --permanent

… и появляется. В конфигах (/etc/firewalld) все правильно, а в реальных правилах – ни слова про адреса. А день потерян …

Выкидываем firewalld и ставим старый добрый iptables

systemctl stop firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl enable ip6tables
systemctl start iptables
systemctl start ip6tables
iptables -t nat -A PREROUTING -d 136.243.151.196 -i eth0 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.100.0.186
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to-source 136.243.151.196
iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited
ip6tables -D FORWARD -j REJECT --reject-with icmp6-adm-prohibited
service iptables save
service ip6tables save
yum remove firewalld

И отправляю машину в ребут, что бы проверить. Вижу кучу лишних правил, которые насовал kvm, что бы выпустить машины в интернет.

virsh net-destroy default
virsh net-edit default
virsh net-start default

Но правила все равно продолжают добавляться. Нашел еще один баг 433484. Там предлагают на хуки повешать все.

Лень. Проще в /etc/rc.d/rc.local добавить строчки


echo "Waiting for libvirt start"
sleep 5
service iptables restart
service ip6tables restart

Теперь вроде работает. Все и везде.

git clone https://github.com/letsencrypt/letsencrypt letsencrypt
cd letsencrypt/
./letsencrypt-auto

Поставит дикую кучу всего, после чего завершится со словами

Creating virtual environment...
Updating letsencrypt and virtual environment dependencies......
Requesting root privileges to run with virtualenv: /root/.local/share/letsencrypt/bin/letsencrypt
No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually

Ну хорошо, торможу nginx

service nginx stop

И пускаю скриптик

./letsencrypt-auto certonly

Он у меня спрашивает разные вещи (типа емайла или домена) и завершается с

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/vsemoe.com/fullchain.pem. Your cert will
expire on 2016-04-16. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Быстренько копирую конфиг для сервера

cat vsemoe.com.conf
server {
listen 80;
listen [::]:80;
server_name vsemoe.com www.vsemoe.com;

location ~ /.svn/ {
deny all;
}

location ~ /.ht {
deny all;
}

location '/.well-known/acme-challenge' {
default_type "text/plain";
root /tmp/letsencrypt-auto;
}

location / {
return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl spdy;
listen [::]:443 ssl spdy;

ssl_certificate /etc/letsencrypt/live/vsemoe.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vsemoe.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/vsemoe.com/fullchain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;

# openssl dhparam -out /etc/nginx/dhparam.pem 2048
ssl_dhparam /etc/nginx/dhparam.pem;

# What Mozilla calls "Intermediate configuration"
# Copied from https://mozilla.github.io/server-side-tls/ssl-config-generator/
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=86400;
resolver_timeout 10;

location / {
proxy_pass http://10.100.0.178;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_buffer_size 4K;
proxy_buffers 64 4K;
}
}

Генерирую требуемое (долго идет)

openssl dhparam -out /etc/nginx/dhparam.pem 2048

Перезапускаю nginx, захожу браузером … и ляпота!

Screenshot 2016-01-17 20.37.26

Ну и проверка …

Screenshot 2016-01-17 20.47.00

Следующим шагом разрулим ситуацию с ipv6.

Новый сервер с игрищами и блудницами – 2

Итак, надо виртуализироваться. Виртуализироваться будем через KVM потому что опять же продвигается редхатом, всеми поддерживается и так далее и тому подобное.

Для начала ставим кучку жутко “необходимого” софта: yum install qemu-kvm libvirt python-virtinst bridge-utils

Затем запускаем установленное

systemctl start libvirtd
systemctl enable libvirtd

Опять же, ничего такого вроде не появилось, за исключением пары интерфейсов с названиями virbr и адресом 192.168.122.1/24.

3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 52:54:00:ba:d8:82 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
link/ether 52:54:00:ba:d8:82 brd ff:ff:ff:ff:ff:ff

Первым делом мне надо добавить ipv6 адрес. Только не вздумайте искать по совпадениям и править руками. Есть гораздо более приятные средства.

virsh net-destroy default
virsh net-edit default

Screenshot 2016-01-16 15.18.40

И добавим еще одно определение сети.

Screenshot 2016-01-16 15.27.38

virsh net-start default

Screenshot 2016-01-16 15.30.24

а в логах должно быть что-то похожее на

Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: DHCP, IP range 10.100.0.100 -- 10.100.0.200, lease time 1h
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: DHCPv6, IP range 2a01:4f8:171:1a43:8000::1000 -- 2a01:4f8:171:1a43:8000::2000, lease time 1h
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: router advertisement on 2a01:4f8:171:1a43::
Jan 16 13:28:36 tower dnsmasq-dhcp[3544]: IPv6 router advertisement enabled

Откуда появился 2a01:4f8:171:1a43:8000::2/96 ?

Дело в том, что hetzner выдал мне ipv6 адрес 2a01:4f8:171:1a43::2/64. Типа подсеть на хост и все такое. Я взял с серединки (:8000) кусочек в 32 бита (128-96) или 4 миллиарда адресов. Ну или столько, сколько сейчас адресов в интернете 🙂 Из этого диапазона я выделил малюсенький кусочек в тысячу адресов для виртуалок. Думаю, что мне этого хватит 🙂 Ну и заодно поменял адрес для ipv4 на более подходящий мне.

Теперь самое время проверить доступность с другого хоста.

[root@outpost ~]# ping6 2a01:4f8:171:1a43:8000::2 -c 2
PING 2a01:4f8:171:1a43:8000::2(2a01:4f8:171:1a43:8000::2) 56 data bytes
64 bytes from 2a01:4f8:171:1a43:8000::2: icmp_seq=1 ttl=59 time=0.864 ms
64 bytes from 2a01:4f8:171:1a43:8000::2: icmp_seq=2 ttl=59 time=0.490 ms

--- 2a01:4f8:171:1a43:8000::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.490/0.677/0.864/0.187 ms
[root@outpost ~]# ping6 2a01:4f8:171:1a43::2 -c 2
PING 2a01:4f8:171:1a43::2(2a01:4f8:171:1a43::2) 56 data bytes
64 bytes from 2a01:4f8:171:1a43::2: icmp_seq=1 ttl=59 time=0.341 ms
64 bytes from 2a01:4f8:171:1a43::2: icmp_seq=2 ttl=59 time=0.452 ms

--- 2a01:4f8:171:1a43::2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.341/0.396/0.452/0.058 ms

В общем, все как в ipv4, только маски дикие по размерам и не привычные.

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

Добавляем полезную утилиту для лентяев yum install virt-install virt-viewer

И останавливаемся. Потому что нам надо выделить немножко места для виртуалок.

lvcreate -L 100G -n vm vg0
mkfs.xfs /dev/vg0/vm
mkdir /vm
mcedit /etc/fstab
mount /vm

100Гб для начала хватит, а потом по необходимости растяну.

Так как я хардкорничаю, то добавляю необходимое для selinux

yum install policycoreutils-python
semanage fcontext -a -t virt_image_t "/vm(/.*)?"
restorecon -R /vm

И выкачиваю дистрибутив CentOS (Тут немного бальзама: качается по ipv6. Мелочь, а приятно)

mkdir /vm/iso
cd /vm/iso
wget http://ftp.funet.fi/pub/mirrors/centos.org/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso

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

virt-install --name test --ram 1024 --disk path=/vm/test.qcow2,size=8 --vcpus 1 --os-type linux --network bridge=virbr0 --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics

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

Screenshot 2016-01-16 16.40.05

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

Screenshot 2016-01-16 17.37.01

Более того, можно даже немного поэстетствовать и использовать графический virt-manager. Правда, придется добавить немного пакетов, что бы графическая часть морды не ругалась.

yum install xauth libcanberra-gtk3 PackageKit-gtk3-module dejavu-lgc-sans-fonts dejavu-lgc-sans-mono-fonts

Если virt-manager ругается на то, что консоль занята, значит вы не отцепились (Ctrl-]) от текстовой в другом терминале

Ну и затем с любого линукса ssh -X на машину и я получаю вот это.

Screenshot 2016-01-16 17.50.45

В принципе, полный контроль над машинами. Иногда очень удобно, иногда нет.

Но я отвлекся. В виртуальной машине ipv4 есть, получен и даже работает, а ipv6 нет. И еще тормозит по диску уж больно жутко.

Диск лечится просто: тормозим машину, virsh edit test и где driver добавляем cache=’unsafe’ (для рабочих не надо так делать). После запускаем и видим вполне себе шустро бегающую машинку.

Теперь с сетью. Заходим на тестовую машину, запускаем dhclient -6 ens3 (ens3 это у меня сетевой интерфейс). И видим в логах

Jan 16 16:30:58 tower dnsmasq-dhcp[3544]: no address range available for DHCPv6 request via virbr0

Оппа! А почему? Вроде же определили все и выдали тоже все …

Прибиваем в тестовой машине адрес 2a01:4f8:171:1a43:8000::99 и пингуем – пингуется, но только с хоста. Это нормально.

Как прибить? В /etc/sysconfig/network-scripts/ifcfg-ens3

#IPV6_AUTOCONF=yes
IPV6ADDR=2a01:4f8:171:1a43:8000::1234

и перезапустить network

Так, раз пингуется, значит проблема не в адресе, а в настройках. Судя по аналогичным сообщениям, у меня проблемы с маской. Почитав еще немного интернетов, я дошел до такой конфигурации.

<ip family='ipv6' address='2a01:4f8:171:1a43:8000::2' prefix='64'>
<dhcp>
<range start='2a01:4f8:171:1a43:8000::100' end='2a01:4f8:171:1a43:8000::200'/>
</dhcp>
</ip>

Как видите, разница только в маске. Как ни странно, но в этом отношении ipv6 (вернее, его роутинг в линуксе) ведет себя немного “странней”, чем для ipv4. Но в любом случае, прочитанное оказалось верным и машина получила свой адрес.

Jan 16 18:03:01 tower dnsmasq-dhcp[5491]: DHCPREQUEST(virbr0) 10.100.0.141 52:54:00:81:5b:8f
Jan 16 18:03:01 tower dnsmasq-dhcp[5491]: DHCPACK(virbr0) 10.100.0.141 52:54:00:81:5b:8f test
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: RTR-SOLICIT(virbr0)
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: RTR-ADVERT(virbr0) 2a01:4f8:171:1a43::
Jan 16 18:03:03 tower dnsmasq-dhcp[5491]: DHCPCONFIRM(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:04 tower dnsmasq-dhcp[5491]: DHCPSOLICIT(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:04 tower dnsmasq-dhcp[5491]: DHCPADVERTISE(virbr0) 2a01:4f8:171:1a43:8000::13c 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:05 tower dnsmasq-dhcp[5491]: DHCPREQUEST(virbr0) 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f
Jan 16 18:03:05 tower dnsmasq-dhcp[5491]: DHCPREPLY(virbr0) 2a01:4f8:171:1a43:8000::13c 00:01:00:01:1e:2d:1e:b1:52:54:00:81:5b:8f

Вывод ip addr

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:81:5b:8f brd ff:ff:ff:ff:ff:ff
inet 10.100.0.141/24 brd 10.100.0.255 scope global dynamic ens3
valid_lft 3590sec preferred_lft 3590sec
inet6 2a01:4f8:171:1a43:8000::13c/128 scope global dynamic
valid_lft 3595sec preferred_lft 3595sec
inet6 fe80::5054:ff:fe81:5b8f/64 scope link
valid_lft forever preferred_lft forever

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

Косвенным подтверждением является попытка попинговать адрес тестовой машины снаружи

[root@outpost ~]# ping6 2a01:4f8:171:1a43:8000::13c
PING 2a01:4f8:171:1a43:8000::13c(2a01:4f8:171:1a43:8000::13c) 56 data bytes
From 2a01:4f8:171:1a43::2 icmp_seq=1 Destination unreachable: Address unreachable
From 2a01:4f8:171:1a43::2 icmp_seq=2 Destination unreachable: Address unreachable

То есть пинг доходит до хоста, а тот отвечает, что не знает, куда роутить этот адрес. Аналогичное получим, если попытаемся напрямую с хоста попинговать. Ну нету этого адреса в таблице роутинга и все тут. Меняем маску на основном интерфейсе (64->128), что бы таблицу роутинга в порядок привести. Без перезагрузки

ip addr del 2a01:4f8:171:1a43::2/64 dev eth0
ip addr add 2a01:4f8:171:1a43::2/128 dev eth0

А с перезагрузкой в /etc/sysconfig/network-scripts/ifcfg-eth0

Что изменилось? С хоста началась пинговаться виртуалка и все. В общем, лично мне стало понятно, что ipv6 – это нифига не ipv4, только с бОльшими масками.

(чтение мануалов опущено)

В общем, с одной стороны все проще, а с другой – все сложнее. В ipv6 есть такая штука, как SLAAC, которая работает как некий навороченный DHCP сервер. Подробнее в маны.

Поэтому выкидываю нафиг все из настроек dnsmasq (virsh net-edit default) и оставляю только описание интерфейса.

<ip family='ipv6' address='2a01:4f8:171:1a43::3' prefix='64'>
</ip>

Ну и адрес попроще сделал. И сделал /etc/radvd.conf

interface virbr0
{
AdvSendAdvert on;
AdvManagedFlag off;
AdvOtherConfigFlag off;
prefix 2a01:4f8:171:1a43::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
RDNSS 2001:db8:0:a0a1::add:1010
2001:db8:0:a102::add:9999
2001:db8:0:a111::add:9898
{
};
};

Затем

systemctl enable radvd.service
systemctl start radvd.service

и перезагрузка виртуалки. Вуаля! Магия ipv6 сработала и виртуалка получила свой адрес.

inet6 2a01:4f8:171:1a43:5054:ff:fe81:5b8f/64 scope global noprefixroute dynamic
valid_lft 86170sec preferred_lft 14170sec

И даже пинги ходят во все стороны. То, что и требовалось получить.

Для проверки я создал еще одну виртуалочку (теперь с сразу с “быстрым” диском)

virt-install --name test2 --ram 1024 --disk path=/vm/test2.qcow2,size=8,bus=virtio,cache=none --vcpus 1 --os-type linux --network bridge=virbr0 --location /vm/iso/CentOS-7-x86_64-DVD-1511.iso --extra-args='console=tty0 console=ttyS0,115200n8 serial' --nographics

И сеть в ней сразу заработала без каких-либо дополнительных команд. То, что и требовалось получить. Теперь можно и виртуалки клепать.

Как выдаются адреса? А очень просто: простым маппингом мак-адреса сетевой. Опять же за подробностями в документацию.

link/ether 52:54:00:e4:63:05 brd ff:ff:ff:ff:ff:ff
inet6 2a01:4f8:171:1a43:5054:ff:fee4:6305/64 scope global noprefixroute dynamic

Главное изменение теперь в “политике безопасности”.

Раньше: вся сетевая безопасность лежала на хосте. Гости получали уже отфильтрованный трафик, только на те порты, которые разрешены. Можно было спокойно открывать порты, не опасаясь ничего.

Теперь: каждый гость выставлен наружу “напрямую” и требует соответствующей защиты. И не важно, что ipv4 адреса из “приватной” сети. Фаирволл, обновление и выключение ненужного – наше все.

Не страшно и не сложно, но помнить надо.

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

Новый сервер с игрищами и блудницами – 1

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

Но просто так переносить сервисы абсолютно не интересно: на старом сервере у меня стоит OpenVZ и весь перенос будет заключаться в паре команд, да смене имен в DNS. Где же развитие и толчок вперед? В общем, потыкался я и решил:

– Сменить основную OS с CentOS 6 на CentOS 7. systemd, firewalld и прочие d в полном изобилии. Некий опыт есть, но чего-то в голову лезут пошлые мысли про RHCE.
– Привести в порядок DNS. Сейчас у меня часть серверов тут, часть там, часть вообще через одно место. Пусть все будет одинаковым и у меня.
– ipv6. Не очень-то и надо, но смотреть выше про развитие.
– SNI. Хватит тратить ipv4 адреса на каждый SSL сервер (да и дешевле будет).
– Да и вообще, надо все закриптовать. А то стыдоба – личный SVN голым ходит.
– Ну и KVM надо. Иногда жутко как требуется винда “в прекрасном и далеком”, а городить туннели не охота. Заодно получится бесплатный терминальный сервер для меня любимого.
– OwnCloud тоже не помешал бы, как и OpenVPN сервер для разностей нехороших.
– Ну и остальное по вкусу.

Практика прошлых лет показала, что принцип “ставим один сервер, выкидываем с него лишнее, а все сервисы в виртуалки” оправдал себя на все 100%. Да, при настройке чуть-чуть подумать надо, но зато потом абсолютно никаких проблем и заморочек. Ни с хакерами, ни с распределением нагрузки, ни с резервным копированием … да вообще ни с чем. Так буду и тут делать.

Идем в админку и заказываем новый сервер. Ждем получения письма, в котором пишут радостное:

Screenshot 2016-01-16 10.52.41

Заходим, нас пускают …

Screenshot 2016-01-16 10.52.57

Для приличия делаем passwd root и начинаем осматриваться. Сразу замечаю, что немцы стойко держат флаг “мы делаем нах ордунг” и сделали два больших рейда по 2Тб. Один отдали под /, другой под /home. Интересно, какой у них был сценарий использования? Но в любом случае, мне такое не надо.

Идем опять в консоль и перегружаемся в rescue

Screenshot 2016-01-16 11.04.38

Выглядит именно тем, что я и заказывал (каюсь, да, не посмотрел раньше). Поэтому сразу набираем installimage

Там нам дают в mcedit поправить конфиг. Там я меняю имя сервера на tower.multik.org и ниже я показал, как указываю 16 гигов свопа, 512 мегабайт для /boot и все остальное отдать в LVM. В LVM прошу создать раздел / размером в 16 гигов. Остальное оставить нетронутым. Почему так мало? Так потому что все остальное – в виртуалки! В корне сервера делать лишнему абсолютно нечего, тут будут только штуки, связанные с внешним миром типа фаирволла.

Screenshot 2016-01-16 11.42.58

Сохраняю (F2 или ESC-2), выхожу (ESC-0 или F10) и жду перезаливки сервера

Screenshot 2016-01-16 11.10.30

Потом reboot, снова захожу (про ключи и их смену не говорю) и вуаля! Я в новом сервере.

Screenshot 2016-01-16 11.23.09

Опять меняю пароль root.

Итак, на этом этапе я получил пустой и голый сервер. Что он умеет? Да ничего. Добрые немцы выкусили из образа вообще все (вот тут реально молодцы!) и на сервере есть только ssh и настроенная ipv4/ipv6 сеть.

Первым (опять первым, но тут все такое) делом обновляемся. yum update

Добавляем полезные программки yum install mc screen bind-utils iotop iftop

Включаем синхронизацию времени systemctl start ntpd && systemctl enable ntpd

и переходим к фаирволлу. yum install firewalld ; systemctl enable firewalld ; systemctl start firewalld (Почему firewalld? Потому что мне лень править правила для ipv4 и ipv6 одновременно. Ну и редхатом проталкивается)

Внешне ничего не изменилось, но теперь снаружи на машину можно зайти только по 22му порту. Проверить можно посмотрев правила iptables. Но я-то двигаюсь вперед, поэтому все должно быть по фен-шую.

systemctl status firewalld

Screenshot 2016-01-16 12.13.29

и побалуемся с командой firewall-cmd

Screenshot 2016-01-16 12.15.57

Если я правильно понял, то никаких активных правил нет, просто стоит public по умолчанию, в которой разрешен только dhcp-клиент и ssh. Все остальное запрещено. Вполне логичные правила, но опять же, мне не сильно подходят. Будем менять.

Для начала попробую

firewall-cmd --zone=public --change-interface=eth0 --permanent
firewall-cmd --get-active-zones

И вижу фигу. Ничего не изменилось. Оказывается, это фича. Скрипт видит, что зона public и так применена (ну и что, что по умолчанию, поэтому ничего не делает).

Меняю зону на home и обратно. Вот теперь показывает

Screenshot 2016-01-16 12.27.56

Но лично мне не нужно, что бы было правило для dhcp клиента

firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
firewall-cmd --list-all

Ну вот теперь хорошо. Ничего лишнего, все закрыто и замуровано. Остался последний шаг – применить все, что я тут натворил, в реальность

firewall-cmd --reload

Все, теперь и iptables показывает именно то, что полагается.

Как говорится, первый шаг сделан. Следующим – виртуализироваться. Но виртуализироваться хардкорно, поэтому ставим SELINUX=permissive для начала и перезагружаемся, проверяя правильность всего преднастроенного.

У меня выползла одна единственная проблема – предустановленный немцами chrony мешался ntpd. Удаляем его (yum remove chrony) и все.

PS В запоминалку: настроить монитор raid.

ZFS, солярка и все-все-все …

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

Итак, некоторое время назад ко мне в руки попала инфраструктура, которая за 5 лет сменила пятерых же админов. Самым больным местом были стораджи, с них и начал разборки. Ситуация осложнялась тем, что сисадмины менялись то ли вместе с начальством, то ли у начальства были постоянно меняющиеся вектора “куда мы движемся” – мне выяснять лень.

Первым делом была проведена ревизия, чего же попало ко мне в руки.

– Стораджи на NetApp. Здесь был маленьких плюс: есть человек, которых ими управлял и какого-то внимания с моей стороны не требовал.
– Стораджи на ESX. То есть берем сервер с RAID контроллером, ставим туда ESX и вместе с хостингом виртуалок раздаем еще и диски.
– Стораджи на Nexenta. Некоторые с просроченными лицензиями.
– Стораджи на OmniTI. Некоторые с веб-мордами, некоторые “голые”.

И вот последних двух пунктов было много! Стал разбираться. Что нексента, что OmniTI построены на древнем ядре от solaris. Если кто-то из продаванов нексенты будет втирать, что они там что-то делали, модернизировали и так далее, не верьте – я из любопытства менял и ядра и библиотеки – никаких криков “ой, у меня тут сломалось” не было.

Все отличие нексенты от omniti/openindiana – это веб-мордочка с красивыми графиками, криво обкусанный шелл и всякие параметры по умолчанию.

Родной файловой системой для этих штук является ZFS. Поначалу по чтению документации у меня разгорались глаза: умеет сама делать raid, поддерживает сжатие и дедупликацию на ходу, снапшоты и прочее прилагаются.

Освободил один хост, обновил софт, обновил фирмварь … И все, солярка перестала загружаться – не может проинициализировать дисковый контроллер. Как говорится, оппа. Контроллеру 5 лет, солярка типа с последними обновлениями и не может. Побежал по инету – везде стоны про какое гавно ставит деллы в свои сервера. Поставил для проверки линукс – встал без каких-либо проблем.

Тут у меня поднялся флажочек: если солярка то не трогай фирмварь. 5 лет ей никто не занимался и больше заниматься не будет …

Ладно, благодаря новой политике у меня есть место, куда слить данные и освободить еще пару серверов для “на попробовать”.

Итак, два полностью одинаковых Dell R510. Вообще одинаковых – партнамберы из одной сотни. На одном – поставленная с нуля солярка, на другом – центось седьмая.

На солярке поднял zfs согласно лучшим шаманским методикам (там из духа “если число дисков четное и больше 9 – то лучше raidz3, иначе raidz2 и смотри не перепутай”), на линуксе – тупо software raid той же конфигурации, что и у солярки. И XFS поверх

И начал тупо заливать и сливать данные. NFS3, без каких-либо затей.

Солярка показала чистую, красивую и прибитую гвоздями “полку” на 3,5 гигабита. Линукс честно упирался в скорость сети и рисовал 10ку. Очень удивился. Ведь корпоративная система, типа ого-го и эге-гей!

Полез тюнить. А тюнить-то в общем и нечего. После линукса с его /sys и /proc солярка кажется очень бедным родственником. Методом последовательного теста выяснил, что у сети полка на 5 гигабит. И все – дальше проц умирает по загрузке. Древний драйвер, новее никто не делал.

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

Вывод: в стораджах солярке и ее производным делать нечего. Старый софт, никакой поддержки и теде и тепе. Если кто покажет на сайт соляриса, где типа недавно они выкатили новую версию, спешу огорчить, там то же самое ядро из 2010 года … я пробовал 🙂

Но может быть есть шанс ZFS завести под линуксом? Фигня вопрос: как раз приехал новый сервер. Ставим линукс, ставим ZFS, размечаем диски, запускаем туда клиентов … Поначалу все шло шикарно. Но внезапно клиенты стали жаловаться на то, что их машинки “умирают”. Пошел смотреть.

На сторадже занято примерно 65% диска, до обещанных ораклом 85% еще далеко. Решил посмотреть на производительность и немедленно поджег стул – 5 мегабайт в секунду. Представляете, 24 SAS диска и такая скорость? Сколько нервов я потерял, “раскидывая” этот сторадж и представить тяжело. Причем скорость выросла до приличных значений уже на практически пустом сторадже.

Попытался разобраться и не смог – по всем статьям, хаутушкам и прочим заклинаниям у нас должно быть более чем хорошо – и кешу место выделено и прочему раздано согласно документации. Ан нет – заливаешь на 40Тб сторадж 25ТБ и он “умирает”. И лежит “мертвым” до 5-10Тб занятого. Где-то какой-то глюк в драйверах zfs.

Стало понятно, что и ZFS на сторадже не жить. Перебилдил на софтверный raid, поставил xfs и все – все проблемы ушли.

Однако есть у меня место, где я недавно поставил пару новых хостов на солярке и аккуратно обновил старые. Это специальные хранилки, которые хранят снапшоты клиентских файловых систем. Вот там ZFS развернулась на всю катушку – и сжатие и дедупликация нужны как воздух. Опять же, я провел пару недель, гоняя данные между этими хостами (дедупликация работает гораздо лучше, когда одном сервере “давятся” одни и те же клиентские данные). В результате есть несколько … наблюдений

1. “Свежая” солярка, ZFS 28 и raidz3 – наше все. Оно даже на глаз быстрее работает того, что было 5 лет назад. Но линукс все равно быстрее.
2. Сжатие практически ничего не стоит для процессора, а давит в 1,5-2 раза. Можно включать.
3. Хочешь дедупликацию? Добавь памяти из расчета 1ТБ данных на диске – 5-6ГБ ОЗУ. Иначе будет тормозить.
4. Никогда (слышишь: никогда!) не забивай ZFS на 97-98%. Оно умирает даже на чтение до скоростей 100-200 килобайт в секунду. В принципе, мне именно поэтому не удалось забить на 100% – тесты умирали раньше. И вообще, для ZFS – 85% занятого – уже тревожный звонок.
5. Солярка в изучении чуть сложнее линукса, в основном из-за очень кривой и слабой документации. Изучать целенаправленно смысла нет, разве что в удовольствие.

Программируем микроконтроллеры в QtCreator

Это копия моей статьи, опубликованной на хабре

qbs03
Почему-то в интернете мало документации про qbs, пора немного исправить эту ситуацию.

Как-то у меня сложилось так, что практически исчезли проекты, в которых надо сделать что-то одно. Обычно надо и написать прошивку для микроконтроллера и управляющую программу для смартфона или десктопа. Можно делать все по старинке: писать код для каждого устройства в родной для него среде разработки.

Но поверьте, это довольно быстро задалбывает. Под виндовс – MSVC, под ARM – CooCox или Keil (приношу свои соболезнования вынужденным работать под IAR), под MSP – CCS, под андроид – eclipse, под ios – Xcode, под пики – MPLAB. И ладно бы, со всем этим работать можно было бы, но ведь фиг: везде свои заморочки, тонкости и неписанные правила. Все это накладывается на общую тормознутость так популярного эклипса помноженную на криворукие дополнения от производителей.

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

Но вот с микроконтроллерами ситуация не желала складываться категорически. В основном из-за того, что везде свои хотелки и желалки. Ну ладно, про это я уже жаловался. Я бы еще долго мучался, пока внезапно не наткнулся на краткое описание qbs.

Желающие могут пошариться по инету сами, но если кратко, то это заменитель всяких make и cmake, использующая нормальный (тут должен быть смаил) язык программирования. И сам QtCreator собирается с ее помощью, значит она уже вылезла из штанишек …

Да, документации по ней как обычно кот наплакал, но исходники еще никто не отменял, поэтому довольно быстро ко мне пришло понимание, что это практически то, что я искал. Посудите сами: сидишь в одной среде разработки (самой по себе очень приятной и быстрой) и спокойно пишешь и редактируешь файлы под несколько платформ. И тебе, как кодописателю, пофиг на наличие всяких там заморочек с “родными” средами.

Хватит излияний, пора попробовать. Создадим очень простой проект, в котором у нас будет десктопная и микроконтроллерная составляющая.

Открываем QtCreator, выбираем создать Non-Qt Project (что бы пока не заморачиваться сильно) и далее выбираем то, где присутствует C и Qbs. Обратите внимание на приятные взгляду слова Platform independent

qbs01

В результате получаем один main.c и qbs. Можно уже нажать “build” и получить вывод Hello World.

Открываем qbs и ничего не понимаем. Поэтому все стираем, вооружаемся интернетом и начинаем писать. Яваскрипт и все такое.

import qbs

Так, тут вроде понятно. Импортируем всякое необходимое для работы самого qbs.

Project {
name: "simple"
}

Сохраняем и наблюдаем исчезновение main.c с левой панели. При попытке запустить проект QtCreator спросит: а чего пускать-то? В принципе пока все логично.

Из чего состоит проект в терминологии qbs? Из продуктов. И их может быть несколько, но пока я сделаю один.

Project {
name: "simple"
Product {
name: "desktop"
}
}

Теперь для нашего “десктопного” укажем исходник.

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
}
}

При попытке скомпилировать не изменится ровным счетом ничего. Подсмотрим в некоторые обучалки и добавим зависимость от cpp и укажем, что вообще-то это приложение.

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
}

И вот теперь при попытке собрать приложение QtCreator пошуршит немного диском и в панельке Application Output появится искомое

qbs02

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

Depends {name: "cpp"}

Читаю документацию и понимаю, что данной командой я устанавливаю зависимость проекта от какого-то модуля с именем cpp. Понятней стало? Мне нет.

Простым поиском нахожу что-то подобное в /usr/share/qtcreator/qbs/share/qbs/modules/ (Если у вас другая операционка, то скорее всего аналогичное лежит где-то неподалеку от QtCreator). Если говорить коротко, то там куча яваскрипта, которая в зависимости от платформы подбирает компилятор под эту платформу. Полностью повторять подобное мне смысла нет, поэтому оставляю как есть.

type: "application". Из документации: The file tags matching the product’s target artifacts. Артефакт … An Artifact represents a single file produced by a Rule or Transformer. … ерр .. Rule? Creates transformers for input tags. Напоминает ситуацию про сепулькарий .. Transformer? Creates files, typically from other files.

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

Но вернемся к нашему проекту. Давайте добавим еще один продукт, только уже для микроконтроллера

Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
Product {
name: "micro"
files: "blink.c"
}
}

При попытке что-то сделать, нам сразу выскочит сообщение, что вообще-то файла blink.c нет. Ну, ок, добавим в проект фаил blink.c. Как видно из названия, это тот же HelloWorld, только для микроконтроллеров. Я взял из примеров для микроконтроллера семейства msp430.

#include <msp430.h>

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x01;

while (1) {
P1OUT ^= 0x01;
__delay_cycles(1000000); // 1 second @ 1MHz
}

return 0;
}

Будучи скомпилированным и залитым, он начнет дергать ножкой P1.0 с интервалом в одну секунду. А так как на этой ножке у большинства демо- и девелоперских плат висит светодиодик, то он замигает.

Теперь QtCreator не ругается, но и в микроконтроллер ничего не заливается. Странно, да?

Добавлять Depends {name: “cpp”} смысла нет, потому что установленный в системе родной gcc не в курсе про существование такой платформы, да и в дальнейшем пригодится, например для пиковских контроллеров, где вообще все свое.

Теперь воспользуемся обрывками тех сакральных буковок, что встретились раньше.

Для начала, я предпочитаю в микроконтроллерных проектах расписывать каждый функционал в своем файле. Записывать каждый файл руками? Лень. Подсматриваем решение и переписываем блок

Product {
name: "micro"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
}

Тут создаем группу файлов, которые обзываем “msp430 sources” и тупо включаем в нее все файлы, которые подходят под маску src/*.c. Для дальнейшей работы с ними тегируем их буквой С.

Что с ними делать? У qbs есть на этот случай две штуки – Rule и Transformer. По сути они близки, но немного разные. Счас попробую описать на пальцах разницу.

Rule умеет срабатывать на каждый файл, попадающий под что-то. Может срабатывать по разу на каждый фаил (например, для вызова компилятора), а может один раз на все (линкер).

Transformer предназначен для срабатывания только на один фаил, с заранее определенным именем. Например, прошивальщик или какой-нибудь хитрый скрипт.

Ок, добавляем правило, которое должно будет сработать на все наши файлы, промаркированные как “с”.

Product {
name: "micro"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "file passing"
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}
}

В принципе из синтаксиса уже все понятно. Есть inputs, есть prepare, в который засовывается яваскрипт, который выполняет необходимое. В данном случае он должен в окошке Compile Output показать file passing, и куда-то вывести Nothing to do. Ну по документации вроде так.

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

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

Ок, за это отвечают те самые артефакты. Под ними подразумеваются результаты деятельности Rule или Transformer. Лучше всего это объяснить на примере компиляции. Когда мы компилируем .с файл, то на выходе мы получим объектный файл .о. Он нам нужен для дальнейшей линковки, но с другой стороны, мы его можем удалить, так как потом спокойно сможем сгенерировать заново.

Опять копируем пример из документации и чуть-чуть модернизируем.

Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "Compiling "+ input.fileName
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}

Теперь мы говорим, что после нашей деятельности останутся артефакты в каталоге .obj (ну и я добавил вывод того, над каким файлом мы сейчас работаем). Запускаем. Опять ничего в ответ. Почему? Ответ тот же – никому не нужны файлы с тегом ‘obj’.

Хорошо, для проверки сделаем так, что они нужны нам. И вообще, наше приложение – это один сплошной obj.

Product {
name: "micro"
type: "obj"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var cmd = new JavaScriptCommand();
cmd.description = "Compiling "+ input.fileName
cmd.silent = false;
cmd.highlight = "compiler";
cmd.sourceCode = function() {
print("Nothing to do");
};
return cmd;
}
}
}

Пробуем, и удача! В окошке появился заветный “Compiling blink.c”. Теперь давайте добавим, что бы оно реально компилировало и сразу по-быдлокодерски, то есть тупо забив все необходимое в одну кучу.

prepare: {
var args = [];
args.push("-mmcu=cc430f5137")
args.push("-g")
args.push("-Os")
args.push("-Wall")
args.push("-Wunused")
args.push('-c');
args.push(input.filePath);
args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'compiling ' + input.fileName;
cmd.highlight = 'compiler';
return cmd;
}

Перекомпилируем все с нуля и смотрим в каталог .obj

$ ls -R1
.:
f27fede2220bcd32

./f27fede2220bcd32:
blink.c.o

Ура! Файлик появился. Теперь, для проверки я делаю еще один файлик, с хитрым названием hz.с. Если я прав, то после перекомпиляции рядом появится еще один объектный файл.

В выводе появилось

compiling blink.c
compiling hz.c

а в каталоге

./f27fede2220bcd32:
blink.c.o
hz.c.o

Все вроде ок. Теперь необходимо все это дело слинковать. А значит опять правило, только теперь для линковки.

Rule {
multiplex: true
inputs: ['obj']
Artifact {
fileTags: ['elf']
filePath: project.name + '.elf'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")

for (i in inputs["obj"])
args.push(inputs["obj"][i].filePath);

args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'linking ' + project.name;
cmd.highlight = 'linker';
return cmd;
}
}

Где отличия? Во-первых, добавился флаг multiplex, который говорит о том, что это правило обрабатывает сразу все файлы данного типа скопом. А во-вторых, во входных параметрах исчез input. Появился inputs, который является массивом файлов данного типа. Ну и я вопользовался именем продукта, что бы брать имя для финальной прошивки.

Ставим тип приложения elf и пробуем собрать. Через некотрое время мы в каталоге для сборки обнаружим файл simple.elf

$ file simple.elf
simple.elf: ELF 32-bit LSB executable, TI msp430, version 1, statically linked, not stripped

То, что нам и необходимо. Его можно уже заливать в плату и наслаждаться мигающим светодиодиком.

Исходная цель достигнута: мы в одной среде разработки делаем все: и редактирование и компиляцию.

На всякий случай конечный qbs

import qbs
Project {
name: "simple"
Product {
name: "desktop"
files: "main.c"
Depends {name: "cpp"}
type: "application"
}
Product {
name: "micro"
type: "elf"
Group {
name: "msp430 sources"
files: 'src/*.c'
fileTags: ['c']
}
Rule {
inputs: ["c"]
Artifact {
fileTags: ['obj']
filePath: '.obj/' + qbs.getHash(input.baseDir) + '/' + input.fileName + '.o'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")
args.push("-g")
args.push("-Os")
args.push("-Wall")
args.push("-Wunused")
args.push('-c');
args.push(input.filePath);
args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'compiling ' + input.fileName;
cmd.highlight = 'compiler';
return cmd;
}
}
Rule {
multiplex: true
inputs: ['obj']
Artifact {
fileTags: ['elf']
filePath: project.name + '.elf'
}
prepare: {
var args = [];
args.push("-mmcu=cc430f5137")

for (i in inputs["obj"])
args.push(inputs["obj"][i].filePath);

args.push('-o');
args.push(output.filePath);
var compilerPath = "/usr/bin/msp430-elf-gcc"
var cmd = new Command(compilerPath, args);
cmd.description = 'linking ' + project.name;
cmd.highlight = 'linker';
return cmd;
}
}
}
}

PS Вынос “захардкоденных” переменных в более удобное место оставлю на вашей совести, ибо это уже к обучалке по яваскрипту.

MSP430 и Fedora Linux

В принципе, в программировании микроконтроллеров под Linux нет ничего сложного. Более-менее доступны средства разработки, а некоторые производители и вовсе официально поддерживают Linux как среду разработки.

TI тоже имеет свою фирменную среду, но она … скажем так, для хардкорных железячников. Старый, тормознутый эклипс и какие-то невнятные настройки. Залитие прошивки и ее отладка тоже доставляют много удовольствия привыкшим к нормальным средам.

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

Расписывать я буду под Fedora Linux (21), потому что я сейчас под ней. Под другие дистрибутивы инструкций как-то больше.

В чем проблема с федорой? Ведь они кровь и плоть от редхата, а тот официально поддерживает msp430-gcc, который использует и сама TI. Проблема в том, что это федора, а значит в ней все нестабильное и вообще может не работать.

И с MSP430 случилось ЭТО. В 20й версии он работал, а в 21й – уже нет. Подробнее можно посмотреть тут. Если кратко, то в федоре сломали линкер.

Что делать? Есть несколько вариантов, из которых самый простой это взять старую версию компилятора из CCS или Energia. Но добрый Brandon Nielsen решил эту проблему по-другому: просто сделал репозиторий со правильными версиями.

Открываем рутовую консоль и подключаем нужный репозитарий

dnf copr enable nielsenb/msp430-development-tools

И ставим все необходимое, соглашаясь с тем, что никто ни за что не отвечает.

yum install msp430-elf-gcc msp430-elf-binutils msp430-elf-gdb mspds msp430flasher msp430-gcc-support-files dos2unix srecord

Теперь скопипастим Makefile
#
# Makefile for msp430
#
# 'make' builds everything
# 'make clean' deletes everything except source files and Makefile
# 'make install' builds everything, and programs the MSP430 using MSPFLASHER
# You need to set TARGET, MCU and SOURCES for your project.
# TARGET is the name of the executable file to be produced
# $(TARGET).elf $(TARGET).hex and $(TARGET).txt nad $(TARGET).map are all generated.
# The TXT file is used for BSL loading, the ELF can be used for JTAG use
#
TARGET = project0
MCU = msp430f5529
# MSP430Flasher name
MSPFLASHER = MSP430Flasher
# List all the source files here
# eg if you have a source file foo.c then list it here
SOURCES = main.c delay.c
# Include are located in the Include directory
INCLUDES = -IInclude
# Add or subtract whatever MSPGCC flags you want. There are plenty more
#######################################################################################
CFLAGS = -mmcu=$(MCU) -g -Os -Wall -Wunused $(INCLUDES)
ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp -Wa,-gstabs
LDFLAGS = -mmcu=$(MCU) -Wl,-Map=$(TARGET).map
########################################################################################
CC = msp430-elf-gcc
LD = msp430-elf-ld
AR = msp430-elf-ar
AS = msp430-elf-gcc
NM = msp430-elf-nm
OBJCOPY = msp430-elf-objcopy
RANLIB = msp430-elf-ranlib
STRIP = msp430-elf-strip
SIZE = msp430-elf-size
READELF = msp430-elf-readelf
MAKETXT = srec_cat
CP = cp -p
RM = rm -f
MV = mv
########################################################################################
# the file which will include dependencies
DEPEND = $(SOURCES:.c=.d)
# all the object files
OBJECTS = $(SOURCES:.c=.o)
all: $(TARGET).elf $(TARGET).hex $(TARGET).txt
$(TARGET).elf: $(OBJECTS)
echo "Linking $@"
$(CC) $(OBJECTS) $(LDFLAGS) $(LIBS) -o $@
echo
echo ">>>> Size of Firmware <<<<" $(SIZE) $(TARGET).elf echo %.hex: %.elf $(OBJCOPY) -O ihex $< $@ %.txt: %.hex $(MAKETXT) -O $@ -TITXT $< -I unix2dos $(TARGET).txt # The above line is required for the DOS based TI BSL tool to be able to read the txt file generated from linux/unix systems. %.o: %.c echo "Compiling $<" $(CC) -c $(CFLAGS) -o $@ $< # rule for making assembler source listing, to see the code %.lst: %.c $(CC) -c $(ASFLAGS) -Wa,-anlhd $< > $@
# include the dependencies unless we're going to clean, then forget about them.
ifneq ($(MAKECMDGOALS), clean)
-include $(DEPEND)
endif
# dependencies file
# includes also considered, since some of these are our own
# (otherwise use -MM instead of -M)
%.d: %.c
echo "Generating dependencies $@ from $<" $(CC) -M ${CFLAGS} $< >$@
.SILENT:
.PHONY: clean
clean:
-$(RM) $(OBJECTS)
-$(RM) $(TARGET).*
-$(RM) $(SOURCES:.c=.lst)
-$(RM) $(DEPEND)
install: $(TARGET).txt
$(MSPFLASHER) -n $(MCU) -w "$(TARGET).txt" -v -z [VCC]

Если при попытке компиляции Вы получите

Makefile:48: *** missing separator. Stop.

то это означает лишь то, что вы нарвались на tab-hell. Все отступы выше – это не пробелы, а символы табуляции. Если отвлечься и открыть этот фаил в mc, то вы должны увидеть следующее:

mc_tab

Обратите внимание на символы “<---->” – именно ими mc показывает табуляцию. Поправьте где надо.

Теперь осталось поправить параметры MCU под мой процессор и SOURCES под мой проект и запустить make. Если все сделано правильно, то вы должны увидеть побежавшие строки, завершающиеся чем-то похожим.

Linking blink.elf

>>>> Size of Firmware <<<< text data bss dec hex filename 2906 214 152 3272 cc8 blink.elf unix2dos: converting file blink.txt to DOS format...

Если оно так, то можете себя поздравить. Теперь можно развиваться дальше.

PS С автором, чьи наработки я использовал, можно познакомиться тут

Кластер против облака …

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

На всякий случай у меня под боком есть два компьютера. Ну как компьютеры … по нынешним меркам они скорее обзываются калькуляторами. Но тем не менее все необходимое у них есть. Пару-тройку виртуалок они потянут, а больше для меня и не надо.

Упражнение первое или “мама, у нас все сломалось”. Везде пишут (ну и я тоже), что системы виртуализации позволяют осуществлять онлайн-миграцию. А как это поисходит вживую?

cloud1

Вот вам пример. В одном окошке я запустил миграцию виртуальной машины с одной ноды “калькуляторного кластера” на другую, а во втором – просто посылал в сторону мигрируемой машины по пакету в секунду. Как видно на скриншоте, время недоступности машины составило 9 секунд. Общее время миграции было около 30 секунд. На настоящих кластерах время недоступности обычно не превышает и половины секунды. Много ли сервисов требуют для себя такого уровня доступности?

Или вот еще один пример, опять же многократно описываемый. Есть сервис, которому не хватает ресурсов.

cloud2

Если посмотрите на правое окошко (там консоль одной из виртуалок), то там openssl показывает, что он может подсчитать только 11 тысяч хешей md2 за 0.15с. А потом команда free докладывает, что памяти всего 256 мегабайт. Одна команда в левом окошке (на ноде) и openssl уже подсчитывает 540 тысяч за 3 секунды (или 27 тыщ за то же время), а памяти стало уже гигабайт. И все это без остановки или перезагрузки сервиса.

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

Для интереса предлагаю прикинуть, сколько потребуется времени и сил, что бы проделать подобное в обычной инфраструктуре. Удобно? Не то слово!

Надо развернуть новый сервер? Легко!

cloud3

17 секунд (калькулятор, да) и у вас есть готовая машина, которой надо только выделить ресурсы.

cloud4

А когда нужда в ней отпадет … секунда и ненужной машины больше нет.

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

Повторюсь, все это сейчас позволяет делать любая система виртуализации.

Но все-таки, чем отличаются облака от кластеров? Ведь они построены на одних и тех же принципах, позволяют делать одно и то же с одним и тем же результатом.

Отличаются они одним. Системой управления всем этим великолепием.

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

Во-вторых, системы управления заточены на разделение ресурсов. В кластере редко возникает необходимость отделить одну группу серверов от другой. В результате все сидят в нескольких VLAN’ах, разрулить которые легко руками. А в облаках тысячи (десятки, сотни – подставьте по вкусу) пользователей, которых надо развести по своим сетям и не давать серверам одного пользователя прямого доступа к серверам другого. Без системы управления, заточенной на облака, подобная затея попросту обречена на провал.

И наконец, облака тащат в себе всю … скажем так, специфику виртуализации. Скажем, для одного сервиса необходимы ноды, которые используют локальное хранилище, да и еще на SSD. А для другого хватит кусочка общего стораджа. Для каждого сервиса есть свои ограничения, требования, правила. И системы управления следят за тем (скажем, при миграциях), что бы каждый сервис работал на ресурсах того класса, который ему выделен, что бы не происходило overselling (или он был с заранее определенными параметрами) и так далее и тому подобное.

Поверьте, все это удержать в голове и рулить этим через консоль или какую-нибудь утилитку – абсолютно нереальная задача.

И вот за вот это вот снятие “головной боли админа” и просят производители денег. А так-то все можно сделать руками и из консоли …

Что нести в облачный офис?

Итак, несмотря на мои страшилки в предыдущих постах, вы все-таки решили использовать “облака” в своей деятельности. Хоть чуть-чуть, но использовать. Как выбрать то, что стоит нести в облака, а что не стоит?

Для этого есть несколько методик, ниже я попробую объяснить наиболее … подходящие, что ли.

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

“Ну ладно, веб-сайт понятно, а как же с почтой и телефоном? Их смогут читать/слушать чужие люди?”. Да, при наличии соответствующих навыков или всяких судебных решений их и так будут читать и слушать чужие люди. Если говорить про телефон, то на операторе (тот, который выдал вам телефонный номер) уже стоит система, позволяющая прослушивать все телефонные разговоры, проходящие через него. А что касается внутренних переговоров, то они в большинстве случаев абсолютно никому не интересны и способны забить любой сервер. То же самое касается и почты. Буквально пара команд у провайдера, который предоставляет вам доступ в интернет, как весь ваш трафик оказывается у него как на ладони. И не обольщайтесь насчет страшных слов SSL/TLS – в подавляющем большинстве случаев все вскрывается так же легко, особенно при наличии административного ресурса. Правда, вынужден добавить ложку меда: по разговорам со знакомыми, такое используют очень редко, ибо во-первых, принцип “неуловимого джо” никто не отменял, а во-вторых, через налоговую сделать все необходимое гораздо проще.

Следующая методика “берите все, что нам негоже”. Тут в облака отправляются данные, которые вам не нужны прямо сейчас или которые нужны всем. Тут главное установить принцип, насколько эти данные вам не нужны. Скажем, данные от систем резервного копирования вам именно сейчас не нужны, занимают много места и хранение их рядом с резервируемыми системами прямо противоречит всем нормам. Так зашифруйте их посильнее и пусть лежат где-нибудь в Америке. Что касается данных которые нужны всем: зачем устраивать на своем сервере каталог “для скачки”? Ролики, дистрибутивы программ и прочие подобные штуки с удовольствием примут к себе системы CDN. Будут довольные и пользователи, которые будут скачивать необходимое им быстро и Вы, так как канал до вас (или вашего сервера) не будет загружаться.

И наконец, в облака удобно/выгодно отправлять то, что относится ИТшному понятию R&D. Говоря кратко, то, что запускается “на посмотреть”, меняется по двадцать раз на дню и наполняется тестовыми или сильно устаревшими данными.

Теперь про данные, которые нельзя отправлять в облака. Понятное дело, Вы сами сможете определить список того, что позволить прочитать другим нельзя. У кого-то это будет бухгалтерия, у кого-то данные о техпроцессе, в общем, у каждого свое. Тут надо просто садиться и разбираться.

Но (по крайней мере для России) есть одна категория, которую нельзя отправить в “облако”: персональные данные. Говоря простыми словами туда попадает все от паспортных данных и места проживания и до всяких медицинских анализов и выписок. Нельзя не потому что не получится, а потому что “атата, если обнаружат”: ни одно известное мне “облако” не использует сертифицированных средств защиты информации. Вроде в России потихоньку начали появляться провайдеры, которые обеспечивают обработку персональных данных, но там от облаков только название, да и ресурсы, которые они могут предоставить, вызывают лишь недоумение.

А теперь абзац неприкрытой рекламы меня любимого: мне нравятся “облака” и я готов совершенно бесплатно (конечно, не откажусь и от оплаты, если предложите 🙂 ) поконсультировать/помочь/рассказать как сделать по поводу “облаков”. Просто из любви к теме. Я не связан с каким-либо провайдером или сервисом “облаков” или производителем систем виртуализции, поэтому мне абсолютно начхать на маркетинговые заморочки. Пишите письма на multik@multik.org, в skype пользователю kiltum или оставляйте комменты.

Дорогие мои облака …

В прошлый раз я обещал на пальцах показать, что облака дороже, но они дешевле. В принципе я уже писал про это, но это было давно и не правда.

Наверняка вы уже задумывались о использовании “облаков” в своем бизнесе, но простые расчеты на калькуляторе и консультации с ИТшниками неизменно приводили к обескураживающим результатам: стоимость аналогичного, но “облачного” сервиса неизменно оказывалась в 1,5-2 раза выше. Как же так? Ведь вон сколько компаний использует облака в своей работе и рапортуют о снижении расходов … А тут ИТшники опять начинают свою вечную волынку про недостаток серверов … Что делать?

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

1. Фаирволл. Он же брэндмауэр. Штука, которая выпускает вас в интернет, фильтрует лишнее и иногда служит HR-инструментом под названием “на какие сайты ходят сотрудники”. Хватит 50 тыщ.
2. Почтовый сервер. Без почты нынче никуда. Тут лучше заложить где-то в районе 100 тыщ.
3. Веб-сервер. Сайтик обычно много нагрузки не требует, поэтому тоже 50.
4. Сервер телефонии. Положим те же 50 тыщ.
5. Сервер бухгалтерии. Бухгалтера люди нервные, поэтому 100 тыщ и не надо экономить.
6. Файлопомойка. Сотрудникам надо файликами обмениваться. Возлагать это на почту – моветон. Тыщ 80 надо.
7. Резервное копирование. Есть компании, где уже теряли данные, а есть, где еще только будут. Тыщ 100.

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

Итого получается в районе 550 тысяч рублей. Эти 7 коробок жрут электричество, требуют охлаждения, запасных частей и квалифицированного присмотра. Через некоторое время их мощности начинает не хватать и начинаются узаконенные репресии пользователй в духе “более 500 мегабайт в почтовом ящике не хранить” и “бухгалтерия тормозит, потому что в сервере винт сдох” (хорошо, что тормозит. у некоторых просто падает). Знакомо?

Что делать? Бизнес растет, но на одних серверах разориться же можно … И тут в дело вступает хороший, качественный ИТшник. Срываю так сказать, покровы. Для начала: одиночные сервера никогда не загружены на 100%. Из-за разных там особенностей больше 60-70% нагрузку поднимать попросту нельзя: будет все ломаться.

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

Отсюда вытекает вполне логичное предложение: почему бы серверу резервного копирования не поделиться днем своими ресурсами? А серверу бухгалтерии и файлопомойки ночью? С использованием современных технологий – легко.

Сам процесс объединения стайки серверов в “облако” я пропущу. Вам это во-первых попросту неинтересно, а во-вторых, там слишком много нюансов, описанию которых пришлось бы посвятить много места.

В общем, сразу перескочу к моменту, когда из уголка админа раздаются невнятные, но несомненно радостные возгласы. Пропущу так же сложный процесс ломки мышления того же админа, пока он осознает, какие возможности он получил в свои руки.

Вам же главное знать то, что у вас теперь есть свое “облако”. Персональное, частное – называйте как хотите.

Что вы получаете?

– Возможность продать один-другой сервер. Подчеркиваю – возможность (ИТшники просто так не выпустят из своих рук 🙂 ). Ибо если одиночные сервера нельзя грузить на 100%, то в “облаке” вполне.
– Более высокую доступность серверов. Теперь в случае поломки одного из “железных” серверов есть возможность попросить “пододвинуться” другие, пусть и за счет уменьшения скорости работы.
– Возможность отдавать более мощный сервер (у нас же сервера не одинаковые изначально) на более необходимую сейчас работу. Скажем, днем самый мощный сервер будет помогать процессу сдачи бухгалтерского отчета, а ночью обрабатывать данные для системы резервного копирования.
– Более разумно распределять нагрузку. Скажем, отобрать ночью у почтового сервера ресурсы процессора в пользу других. Пусть письмо ходит не 1-2 секунды, как днем, а 10-20. Кому какая разница?

А теперь о более приятном. Если делать подобное с “нуля”, то более высокую производительность и бОльший запас по мощности всего комплекса можно получить с помощью пары серверов, каждый из которых стоит по 200тр. И эти серверы будут жрать меньше электричества, меньше греть окружающую среду и требовать меньший уход. 150 тысяч экономии прямо “в лоб”!

Но это “частное облако”. Как же можно заработать или сократить расходы с помощью публичных облаков?

Для начала можно легко увеличить безопасность вашего бизнеса. Не знаю как в других странах, но в России до сих пор не изжили “изъятие вещественных доказательств”. С одной стороны, счет не заблокирован и на нем есть деньги, а с другой – все данные остались на тех самых “вещественных доказательствах”. Вот для примера бухгалтерия. Объемы базы данных очень редко превышают еденицы гигабайт. Вот возьмите и дайте задачу, что бы система резервного копирования попутно заливала данные еще и туда. Для безопасности – хорошо зашифрованными. Сейчас стоимость хранения одного гигабайта на S3 – $0.03 в месяц. Да, я не ошибся – три цента за гигабайт в месяц. Добраться до архивов можно будет с любого компьютера, подключенного к интернету, а уж что с ними делать – дело ваше. Сравните со стоимостью хранения подобного где-нибудь на стороне “обычным” способом.

Затем рассмотрите свои бизнес-процессы и выделите те, которые требуют непродолжительных, но больших компьютерных ресурсов. Скажем, в каком-нибудь рекламном агенстве это может быть процесс рендеринга роликов. Покупать для этого отдельный мощный сервер, который будет 90% времени пинать балду – не выгодно. А без него никак. Куда лучше за $3 в час арендовать гораздо более мощный сервер в облаке и использовать его только тогда, когда надо. И кто мешает арендовать не один сервер, если роликов много?

Надо изредка рассылать большие объемы писем (и которые ни разу не спам)? Вон, SES берется доставить со всеми заморочками тысячу писем за 10 центов. Стоимость обычного почтового сервера, способного переварить хотя бы 20-30 тысяч писем за час, предлагаю узнать самостоятельно.

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

И наконец, можно заранее подготовиться к приятным, но внезапным неожиданностями. Для примера можно подготовить все необходимое, что бы ваш веб-сайт смог выдержать любой поток посетителей. В обычные времена ваш веб-сайт крутится у вас за стенкой. Но стоит возрасти нагрузке (скажем, отдел рекламы провел успешную компанию), как ваш веб-сайт сначала переездет к провайдеру (что бы не загружать ваш канал в интернет), а при дальнейшем повышении нагрузки начнет поднимать у провайдера свои копии. И так до тех пор, пока весь поток посетителей не схлынет. Схлынул – сайт вернулся в родные пенаты. Не верьте мне, просто возьмите калькулятор в руки и подсчитайте стоимость подобного решения. Если у вас подобные случаи случаются регулярно, то вы будете очень обрадованы открывшимися возможностями.

И подобных возможностей в каждой компании – уйма. Честно.

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

А таких – мало.

Облака, белогривые лошадки …

… или о облаках простыми словами.

Покупайте наших слонов, теперь и в облаках! Самые облачные облака по выгодным тарифам!

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

Для начала маленький экскурс в историю. Давным-давно компьютеры умели выполнять только одну задачу за раз. И если он начинал считать, сколько будет 2+2, то нипочем не хотел останавливаться. Потом компьютеры научили делать сразу несколько задач. Они могли одновременно считать сколько будет 2+2 и спрашивать у пользователя, сколько ему лет. Потихоньку увеличивая мощность компьютеров дошли до того, что один мощный компьютер мог представляться для окружающих кучей слабых. Ведь для очень многих задач куча слабых компьютеров гораздо удобней и выгодней одного, но очень мощного.

Но тут пришли продавцы и маркетологи. Первым надо было увеличить продажи, а вторые помогали первым, ведь им тоже перепадал кусок пирога.

Поначалу шаги было очень осторожными. Практически все шло под лозунгом “сократи расходы на сервера”. Ведь в самом деле, поставить и обслуживать один мощный сервер гораздо дешевле, чем кучку маленьких. Тут и стали называть эти маленькие сервера виртуальными. Ведь их нельзя пощупать, но они есть. Постепенно технологии дошли до того, что стало возможно объединять мощные сервера между собой так, что они могли “делиться” с соседями виртуальными серверами без их остановки. И на всех схемах сети такая конструкция обозначалась облаком. Типа мы знаем, что сервер там, но детали реализации от нас скрыты.

Ушлые маркетологи мгновенно раскопали ассоциацию и начали толкать “облака” в массы. В результате вышеописанное (несколько мощных серверов, которые стоят в серверной у вас за стенкой) стали называть “частное облако” или private cloud.

Тут же появились провайдеры, которые стали предлагать “облака” для всех страждущих. Такие облака стали называть “публичными облаками” или public cloud. Услуга довольно быстро стала популярной: ведь большинству людей не нужны для своих задач мощные компьютеры, а провайдерам очень дорого обслуживать обычные слабые сервера.

Следующим появились на свет “гибридные облака”. Это когда часть виртуальных серверов работает в серверной за стенкой, а часть – у провайдера. А для вас – ну абсолютно никакой разницы, где они размещены. Вы работаете с ними одинаково во всех случаях.

Больше всего “облакам” радовались ИТшники. Благодаря “облакам” у них исчезло очень много нудной работы по обслуживанию серверов … Конечно, появилось много другой работы, но это тема уже для другой статьи.

Итак, в чем же основное преимущество облаков?

– Снижение расходов на серверный парк. По моим прикидкам, переход с классической схемы (один сервис – один сервер) на облачную (много серверов – много сервисов) дает экономию примерно в 20-30% просто от самого факта использования.
– Снижение времени простоя. Теперь для обслуживания “железного” сервера нет необходимости останавливать работу размещенных на нем сервисов.
– Резкое ускорение специфических для ИТ задач. Поднять новый сервер или скопировать работающий – дело минут, но никак не часов.
– Возможность при наличии соответствующих навыков кратковременно и очень резко увеличивать мощность какого-либо сервиса.

Вот за эту особенность и ухватились в очередной раз маркетологи. И как обычно, выкинув самые значимые слова (я про навыки), ринулись на следующий виток. Необходимость как-то разделять “облака” их надолго не остановила и они придумали новые слова.

“Старые” облака (провайдер вам предоставляет один или несколько серверов, возможно объединяя их в одну сеть с вашей) стали называть IaaS (Infrastructure as a service). Инфраструктура как сервис. Легко понимаемая всеми ИТшниками модель. Яркий пример – Amazon

Вон та возможность резко увеличивать мощность (повторюсь, при наличии навыков!) привела к следующему варианту облаков: PaaS (Platform as a service). Платформа как сервис. Пример – Azure. Суть простая. Берет провайдер толковых спецов, которые настраивают какой-либо сервис как надо. А потом продает этот сервис вам. Скажем, у вас есть веб-сайт, на который приходит 1000 человек в день. Ваши маркетологи, продавцы и прочие товарищи что-то такое замутили, что к вам внезапно пришло 100000 человек. Обычно веб-сайт в таких случаях тупо умирает под нагрузкой. В случае PaaS правильно настроенный сервис начинает поднимать для внезапно свалившейся нагрузки еще сервера. Десять, сто, тыщу. В общем пока не переварит весь поток. А потом точно так же берет и “убивает” ставшие ненужными сервера. В итоге все довольны: пользователи увидели ваш сайт, а не сообщение о недоступности, вы получили новые заказы, а провайдер – деньги.

Очень это понравилось маркетологам и они придумали SaaS (Software as a service) или программа как сервис. Оно очень похоже на PaaS, но про отдельный сервис. Скажем, вам нужен почтовый сервер. Можно сказать админу, он купит сервер, настроит его … А можно пойти к провайдеру и купить доступ к его почтовому серверу. Если у вас в компании 100 человек, так и купите кусочек провайдерского сервера на 100 человек. А провайдер пусть уже сам мучается с антивирусами, антиспамами и прочей фигней. Яркий пример – Office 365.

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

Думаете это кого-то остановило? Неа, просто стали продавать старое под новым соусом.

И для резюме нужно подвести итоги. Сравним их с привычной всем “своей серверой”

Преимущества:
– Быстрота развертывания. При наличии денег на карточке можно получить полностью готовый сервер или сервис за десятки минут. Причем в стране на выбор.
– Более высокая доступность. У провайдеров просто больше возможностей это обеспечить.
(ТОЛЬКО для частных облаков) – Более низкая стоимость обслуживания

Недостатки:
– Более высокая стоимость обслуживания. На данный момент – в 1,5-2 раза дороже. За тренд надо платить.
(для всех КРОМЕ частных облаков) – Полная потеря контроля за вашими данными. Что бы там не писали маркетологи в пресс-релизах и зазывалках, данные из облака очень легко (по сравнению с классической схемой) могут быть взяты без возможности какого-либо контроля с вашей стороны. Люди, которые имеют доступ к физическим серверам, всего лишь люди.

Тут обычно возникает мысль про то, что я (в смысле автор) ничего не понимаю. Ведь если “облака” стоят дороже, то почему ими пользуются? Люди же не настолько глупые …

Но где можно “выиграть в облаках”, я напишу в другой раз. Вдруг никому не надо и я только зря клавиатуру терзал? 🙂

Первый подход к SDR

Не так давно я примеривался к радиофикации машины. В принципе и до сих пор примериваюсь, но уже на более технологичном уровне.

Напомню, что мне очень нравится слушать. Всё, что доступно вокруг меня – от KB до переговоров крановщиков и спецслужб. Но все это не возможно без радиоприемника. Желательно вседиапазонного и с хорошей чувствительностью. И что бы разные модуляции понимал! И что бы … и надо … В общем, список требований к приемнику вскоре начинает напоминать длинную портянку с кучей непонятных большинству значков и буковок. А стоимость оборудования растет по какой-то дикой экспоненте.

И не так давно я обратил внимание на SDR или Software Definition Radio. Если говорить совсем грубо, то в приемнике оставлен только приемный тракт, а все остальное вынесено в компьютер. То есть “железка” принимает что-то и совсем не заморачиваясь выделением сигнала и прочими обязанностями, все в необработанном виде отдает в компьютер. А он, вооруженный мощными процессорами, перемалывает получаемый поток в нужное вам.

И более того, все это (кроме компьютера) можно получить себе буквально за тысячу рублей. Скажу сразу, я не поверил. Ну как так: вот стоит железка за полтора килобакса и вот эта фиговина за 20 баксов … и они по функционалу одинаковы? Забегая вперед, скажу сразу: за 20 баксов вы получите гораздо бОльший функционал. На порядки …

Ну хорошо, 20 баксов не такие большие деньги и я, проконсультировавшись с соответствующими сайтами, купил usb dvb-t приемник. Хитрость в том, что такой приемник должен быть построен на микросхеме RTL2832. Умельцы обнаружили, что эту микросхему можно насильно ввести в режим “широкополосный ADC” и заставить отдать полученное в компьютер. Эти тюнеры легко найти во всяких интернет-магазинах по улючевым словам RTL2832, DVB и SDR.

20131217_113700

Вот тот комплект, который я получил взамен на некоторое количество денежных знаков. Сделан кондово, но нигде ничего не торчит и не отваливается. Антеннка конечно … хлипкая, но намотав на нее кусок провода длиной полтора метра решаю, что пойдет. Особенно на первое время.

Следующим шагом станет установка программ. Для наших целей нужны специальные драйвера и специальные программы. Ищем в сети SDR# install и получаем пошаговую инструкцию с картинками. Правда, подписи на английском, но думаю, это для большинства не помеха.

Запускаю, все нужное нажимаю и после пары тыканий мышкой получаю вот такую вот картинку

sdr

На этой картинке я слушаю широковещательную радиостанцию на 105.2МГц и одновременно вижу состояние эфира от 103,2МГц до 105,6МГц. При этом любой участок я могу увеличить вплоть до десятков герц. Уменьшить (или “отдалиться”) не могу – у чипа ограничение по скорости передаваемого потока.

Но слушать вещалки – это не так интересно. Хоть и выглядит эффектно. Начинаю тестировать и сравнивать (правда в основном по обзорам других авторов).

Первое, что бросается в глаза – это шум. Ниже -60dB не опускается никогда. У “настоящих” и “дорогих” приемников этот показатель колеблется гда-то на уровне -100dB. Что правда, а что нет – не знаю. Измерить нечем.

Чувствительность. Опять же измерить нечем, что бы циферки показать. Но с намотанным метровым куском провода на штатную “антенну” (огрызок сантиметров 5 длиной) ловит так же, как и yeasu vx-6r на родную резинку. В смысле оба слышат одно и тоже. Но это на больших частотах. Где-то в районе 20-30МГц свисток попросту “умирает” и не слышит ничего вообще. Эта проблема давно известна и на этой случай давно продают рядом с свистками StepUp конверторы на 100 или 125МГц. Мой пока едет, поэтому сказать ничего не могу.

А вот теперь функциональность. Пока у меня она описывается словами “всё, что может прийти в голову”. Любые модуляции, кодировки и фильтры. В любом сочетании и без сопутствующих потерь, помех и ослаблений. Можно кусок эфира записать и гонять его туда-сюда, вылавливая необходимое. Можно записанным куском поделиться с кем-нибудь или наоборот послушать записанное другими. При этом работа “в записи” ничем не будет отличаться от работы “в живую”.

При этом уже есть куча программ, которые по функционалу покрывают промежуток от “для начинающих”, типа того же SDR# и заканчивая “для гуру” – GNU Radio. С последней можно вообще конструировать прямо на экране из модулей то, что надо именно сейчас. От простого приемника WFM до декордера NOAA … В общем всё, что пожелает душа и на что хватит знаний.

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

Телефонизируй это!

Всё началось с того, что я переехал с семьей на другую квартиру. Сьемная, на километр дальше от метро. Всё бы было хорошо, но сигналы мобильных операторов балансировали на уровнях между “плохо” и “нет вообще”. Соответственно, все прелести пропадающей связи были в комплекте: дозвониться на домашний мобильник иногда было невозможно, а когда дозванивался, то бульки превращали разговор в игру “угадай, что я сказал”. Нет, в квартире есть проводной телефон, но ходить с ним к холодильнику в ответе на вопрос “что купить” совершенно не комильфо …

В общем, надо было решать этот вопрос с телефонией. Главная задача: обеспечить канал связи между мной и женой. Второстепенные задачи: сделать это максимально дешево, незатратно и ненапряжно. Шикарно, если получится сделать городской номер, что бы раздавать знакомым и который не будет меняться при переездах.

Первое, что пришло в голову, это воспользоваться сервисом МультиФон от Мегафона, благо все мобильные номера от него и дома беспроводного интернета завались. В плюсах у него достаточно простая настройка, но в минусах продолжает танцевать жаба: все звонки оплачиваются по мобильным тарифам.

Следующим шагом стала мысль поставить на свой сервер VoIP АТС, на смартфоны sip клиентов, настроить все это и начать радоваться жизни.  В принципе задача совершенно реальная для меня, но в последнее время я стал предпочитать отдавать решение задач людям, которые специализируются на решении именно таких задач … В общем, надо идти к телефонным провайдерам.

Первым естественно в голову пришел sipnet. Старейший, толстейший и теде и тепе. Есть как свой клиент, так и наработанная база по подключению всего и всех. Из минусов – какая-то запредельная стоимость телефонного номера.

Дальше поиск привел к YouMagic от МТТ. В свое время я его тестировал и у меня остались двоякие впечатления: с одной стороны все есть, но с другой, это все подано таким винегретом … Но все равно зашел посмотреть что изменилось. Из наиболее видимого стала полная смена клиентов: когда я его тестировал, главным у них был клиент, написанный на java. Все прелести в виде тормозов, ресурсожручести и прочего в комплекте. Сейчас они договорились и сделали брендированную версию Bria (Её делает та же контора, которая делает X-Lite). А самый главный плюс был в том, что МТТ – ну очень толстая контора и владеет своей телефонной сетью, поэтому может позволить себе небольшие цены.

Следующим в списке стал Mango Office. Опять же, я давно его тестировал и он мне понравился. А сейчас у них всякие штучки, дрючки и свистелки с перделками. Я полюбовался на интеграцию их АТС с CRM и практически пошел создавать акканут, но по пути заглянул в раздел “тарифы” … В общем, по мобильникам с Дальнего Востока в Москву звонить дешевле.

Остальные мне не показались достойным упоминания. Они были или тупыми реселлерами кого-нибудь из потолще, либо обладали настолько невнятным сайтом, что я не мог в течении минуты-другой определить, что у них есть и за сколько …

Где-то на этом этапе я пришел к варианту взять номер у МТТ, поднять на своем сервере астериск, купить приличный sip клиент для iOS и Android, sip телефон домой и закрыть эту тему.

Стал читать интернет на предмет подводных камней и прочих заморочек с выбранной схемой. И внезапно обнаружил, что у МТТ есть youmagic.pro. Грубо говоря, виртуальная АТС с минимумом свистелок и перделок. За 300 рублей в месяц я получаю телефонный номер в Москве, 5 аккаунтов к нему, возможность создавать всякие простейшие диалпланы и голосовую почту в емаил.  Почему они не рекламируют эту услугу … в общем, наверняка руководству известно.

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

Ок, “заткнись и возьми мои деньги!”. Регистрация, выбор номера, я внутри. 5 дней на оплату, а то заблокируют.

Первый камешек меня ожидал на страничке оплаты. Она не изменилась с бета-тестовых времен. То есть то что там написано в реальности не применимо. Фигня, метод тыка и система соглашается с тем, что у нее есть этот аккаунт (если что, то валидным для нее является не 8499номер, не номер, а 499номер).

Второй камешек – то, что после оплаты вас пытаются послать на страницу magic.mtt.ru, которой так же нет еще со времен теста.

Но это все мелочи. На счете появились деньги и можно начинать звонить.

Первый звонок был совершен с компьютера на мобильный телефон. Слышимость нормальная, только голос глуховат. Пойдет …

Но все время так звонить “некузяво”. Надо стационарный sip телефон.

Опрос знакомых в мордокниге ожидаемо вывел на сименс гигасет с суффиксом ip на конце. Первая попытка купить его на горбушке или околометрошных магазинах электроники закончилась провалом: его нигде не было. Только развалы дектовских панасоников.

Вторая попытка была предпринята уже в магазине около работы. Там внезапно было обнаружено аж 3 точки, где наличествовал этот телефон. Методом “да и ну его” был выбран самый дорогой вариант – Siemens C610A IP. Почти четыре тысячи рублей.

Что было получено? Раздельные “стакан” и “база”. Очень удобно – не надо мучаться с выбором места установки. Обычные пальчиковые аккумуляторы – на предидущем телефоне были какие-то свои. В итоге оказалось дешевле выкинуть телефон, чем купить новый аккумулятор. Возможность работы с 5 sip провайдерами одновременно и какое-то слабое подобие диалплана. Ну и для резерва остается обычная телефонная линия, куда его тоже можно воткнуть.

Остальные фиговинки типа клиента электронной почты … в общем, маркетоидный бред, даже смотреть в ту сторону не стал.

Итак, финальная стадия в виде попытки все это собрать в одну кучу.

Базу в розетку, телефонную линию и ethernet в нее. Трубку на место старого телефона и тоже в розетку … Все сверкает и переливается, поэтому тупо понажимал “ок”, пока не прекратилось мельтешение.

Что получил в результате? Телефон с обновленной прошивкой, подключенный в обычную линию, к какому-то gigaset.net и аккаунт sipnet с кучей циферок. С sipnet получилось прикольно: телефон спросил меня, имею ли я какой-нибудь код автонастройки, а вместе с ним была бумажка от сипнета с этим самым кодом. Ну я и ввел его.

Но мне-то надо на МТТ! Пошел читать, как все это настраивать. На wiki от МТТ есть аж три варианта настроек именно этого телефона. Правда, отличаются они только методом “проникновения” на телефон. И опять же, если следовать им, то телефон даже в принципе не будет способен соединиться. Ибо прошивки новые, пункты не совпадают и так далее.

Потом сделал попытку воспользоваться автонастройкой. Толку было столько же, то есть нифига. Registration failed. Спасибо вам, маркетолухи сименса за сокрытие подробностей от пользователя! Ни логов, ни … в общем, вообще ничего нет. Почему оно не может – догадывайся сам. В качестве спасительного круга можно воспользоваться “вызовом мастера настройки АТС”, но это уже крайний случай …

(тут пропущены tcpdump, маты, расколупывание потока и конфигурирование роутера). В общем и если кратко, про хотя бы UPnP оно не в курсе, и надо давать ему “все на всех и везде”.

Наконец в страничке статуса я увидел registered. Тестовый звонок подтвердил, что все работает. Ура! Пошли настраивать дальше.

Тут в принципе можно было бы и завершать рассказку, ибо дальше каждый настраивает все под свой вкус … Но я оставлю резюме.

Итак, что я получил за четыре тысячи единовременных и 300 рублей постоянных затрат?

– Москвовский номер с кодом 499

– Возможность приема звонков с него как на мобильные телефоны (после установки клиентов), так и обратно.

– Стационарный телефон, с которым теперь можно бегать по квартире.

– Голосовую почту и возможность “наберите добавочный номер или дождитесь ответа оператора”. Слабенькое, дохлое, но есть.

– Практически мгновенную связь между внутренними клиентами. С мобильного-3G на стационарный-sip часто даже “гудков вызова” нет.

Что плохо?

– Тормозной сайт. Все выполняется медленно и печально.

– Куча бессистемно сваленной документации в формате “наотеб.сь”. Толку чуть больше нуля.

– На iOS запуск клиента приводит к остановке музыки (запуск, а не звонок!) и пожиранию батарейки. На андроиде не пробовал.

– Сименс страдает тем же, что и МТТ. К примеру, не умеет перерегистрироваться сам, без пинка в виде перезагрузки. Обещает индикацию состояния лампочкой на базе, но не показывает и так далее и тому подобное. Зато регулярно обещает “риск урагана” в Москве.

В общем, больше хорошего, чем плохого.

Как я живу без Google Reader

.. и даже не подозреваю, что я теряю.

Скажу честно, я до сих в некотором удивлении, наблюдая в сети форменную истерику о невозможности жить без Google Reader. Расскажу, как я сам живу. И вроде даже комфортно.

К сожалению, это доступно только OS X пользователям. Ибо в основе всего лежит iCloud, OS X и Safari. Это одна из немногих штук, которые у Apple получились не просто хорошо, а так, что ими можно пользоваться. Хотя наверняка можно аналогичного собрать их дополнений к другим браузерам.

Взглянем на левую верхнюю панель моего бразуера.

ыфафкш

 

Для начала первая иконка во втором ряду. Reading List. Сохраняет страницы, которые вы решили прочитать попозже. Подчеркну, safari сохраняет целиком страницы, а не ссылки на них. То есть их можно будет читать без доступа к сети и так далее. Почти как у evernote с его web clipper, только в браузере.

Затем иконка облачка.

safari iCloud

 

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

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

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

И наконец, закладки. Основной функционал в сафари абсолютно точно такой же, как и у всех браузеров. Нажал Cmd-D, урл попал в закладки. Открыл редактор закладок (он в виде книжечки открытой), рассовал закладки куда и как надо. Но есть и одно большое преимущество. Поглядите на “Утренняя почта”

tabs

Казалось бы, такое есть во всех браузерах. Но обратите внимание на последнюю строку “Open in Tabs”. При ее выборе браузер закрывает все открытые вкладки и открывает новые с адресами из закладки.

В итоге “чтение новостей” у меня происходит так:

– Пришел, открыл все вкладки в текущем окне. Ну или если во вкладках что-то нужное осталось со вчера, Cmd-N и в новом окне.

– Читаем сайты по порядку. Ссылки на интересное открываются в новых табах того же окна.

– Если сайт не обновлялся (чем грешил Бобук в последнее время) – Cmd-W и вкладка закрыта. Если уже надоедает необновление – пара жестов на тачпаде и сайт вынесен в другую категорию.

– Переходим следующей вкладке, закрывая текущую тем же Cmd-W. Если интересно – читаем сразу. Интересно и надо бы перечитать – заносим в Reader List. Совсем интересный сайт – в закладки.

– Вкладки кончились и браузер закрылся? Значит все, новости тоже кончились и можно начинать работать.

Изредка по выходным я делаю ревизию закладок и рассовываю их по группам. Сейчас у меня их три:

– “утренняя почта”. Сайты которые я открываю каждое утро.

– “Обычное”. Сайты, которые я открываю под настроение или использую в текущей работе.

– Остальное. Так, мусорка с кучей когда-то нужных сайтов. Регулярно чистится.

Ну и зачем мне какой-то агрегатор RSS?

Облачные мифы: перезагрузка

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

Итак, будем опять сравнивать обычный сервер: 16 гигов памяти, работает 100%. Рассчитывать будем на 3 года, ведь мы не просто так пришли на рынок …

Для амазона это m3.extralarge. Идем на страничку с ценами

На 3х годичном периоде мы должны будем заплатить $2640 сразу для получения стоимости $0.052 за час работы. Считаем сколько нам придеться заплатить:

365 дней * 24 часа * $0.115 * 3 года = $3022 + $2640 предоплата = $5662 за три года.

Для сравнения, подсчитаем, сколько мы потратим на простой on-demand:

365 дней * 24 часа * $0.500 * 3 года = $13140

Как видим, разница очень существенная. Платим чуть больше в начале, что бы выиграть потом. Внушает, поэтому берем сумму $5662 за три года в качестве базовой.

Для начала сравним с аналогичными тазиками от hetzner EX4

43 евро за установку + 43 евро в месяц * 12 месяцев * 3 года = 1591 евро * 1.34 курс = $2131

Берем аналогичный сервер от softlayer – $499 в месяц. Или $17964 за три года.

Rackspace даже смотреть не буду, там и так цены выше небес …

iWeb: $369 в месяц или $13284 за три года. Почти как on-demand у амазона!

Согласитесь, цифры говорят сами за себя. Это мы считали для тех серверов, которые должны быть доступны всегда. Но ведь есть сервера, которые должны быть доступны только в рабочее время. Скажем, сервер 1C. Кто-нибудь видел работающую ночью бухгалтерию?

Считаем:

У амазона это medium utilization сервера

365 дней * 24 часа * $0.167 * 3 года * 50% работы = $2154 + $2200 предоплата = $4354 за три года. А если заплатить как за heavy?

365 дней * 24 часа * $0.115 * 3 года * 50% работы = $1511 + $2640 предоплата = $4151 за три года.

И тут можно $200 на пиво сэкономить … Сравнивать с обычными серверами тут бессмысленно – выключай/не выключай их – сумма все равно будет одинаковой …

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

365 дней * 24 часа * $0.5 * 3 года * 10% работы = $1314

light:

365 дней * 24 часа * $0.272 * 3 года * 10% работы = $714 + $935 предоплаты = $1649

medium:

365 дней * 24 часа * $0.167 * 3 года * 10% работы = $438 + $2200 предоплата = $2638

heavy:

365 дней * 24 часа * $0.115 * 3 года * 10% работы = $302 + $2640 предоплата = $2942 за три года.

Как видим, в этом случае дешевле просто заплатить по on-demand плану.

Что там у нас осталось против облаков? Низкая пропускная способность? И тут меня ткнули носом в то, что у амазона появились машинки, у которых есть гарантированные I/O. Есть даже те, у которых диски на ssd размещены. Да, они дороже, но ведь и в обычной жизни такие машинки нужны далеко не всегда …

Итак, что у нас в резюме? Всё тоже самое: надо считать и считать правильно.

На данный момент с облаком от амазона могут конкурировать только бюджетные провайдеры типа того же hetzner. Остальные в 2-3 раза (а в особо исключительных случаях и в 10 раз) дороже.

Где же всё-таки засада? А засады нет. Так, мелкие заподлянки. Скажем, если вы организуете сервер закачек. У обычных провайдеров обычно планы в духе “до 100Гб трафика в месяц на сервер бесплатно”. У амазона – за 100Гб заплатите 99 * $0.12 = $11.88 сверху. Надо много дисков? $0.10 за гигабайт в месяц (или $102 за терабайт  в месяц). Плюс столько же за миллион операций с ними …

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

Скажем, если вы пожелаете разместить свой почтовый сервер у амазона, то тут же столкнетесь с тем, что весь адресный диапазон амазона сидит в перманентных блок-листах против спамеров. Вытаскивать оттуда адреса можно, но дико муторно … Зато у амазона есть сервис SES.  $0.10 за тысячу прошедших через него сообщений. Плюс еще немного за трафик … Поинтересуйтесь в логах своего почтового сервера, сколько он сообщений наружу отправляет. У меня получилось примерно 200 на аккаунт в месяц.

В общем, копеечка к копеечке и амазону хорошо. А вам – калькулятор в руки и считать 🙂

На этой ноте позвольте и завершить свой текст.

Облачные мифы

Что-то в моем окружении стало все больше и больше слов про то, какие “облачные технологии” крутые, какие “облака” дешевые и как станет всем хорошо, как только вы переведете свои сервера в “облака”.

Для начала немного о том, что же такое облака.

Давным-давно VMWare выпустила свой первый продукт для виртуализации одного компьютера на другом. Вы запускали программу, а в ее окошке – еще одну операционную систему. А если ресурсов у компьютера хватало, то и две. И при этом все системы могли быть разными.

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

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

Ну дальше начался взрывной рост виртуализированных систем всех возможных направлений. Xen, VirtualBox, Parallels на слуху у всех, поэтому повторяться не буду.

Первоначально все эти системы использовались под лозунгами экономии ресурсов (а в некоторых странах еще и экологии). В самом деле, большинство серверов большую часть времени не загружают процессор на 100% и попросту расходуют электроэнергию. А размещением нескольких виртуальных машин на одной физической мы более грамотно расходуем как физические ресурсы (место, электроэнергию), так и время обслуживающего персонала (то же резервное копирование делается гораздо проще, да и управлять одной железкой проще).

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

Все радовались возросшим возможностям, пока какому-то гениальному идиоту не пришла в голову идея, как еще можно заработать на этом. Придумали название “облачные вычисления”, дескать вы отдаете свое в некое безразмерное облако, а там выделяется сколько надо ресурсов … В общем, коммунизм, только в области ИТ.

И тут, как обычно, пришли маркетологи и совершенно не разбираясь в том, что они маркетят, начали обвешивать лозунгами всё, до чего они могут дотянуться. Я встречал утверждения в духе “теперь 99,999% надежности не предел”, “сервера сами адаптируются под нагрузку и вы платите только за то, что реально надо”, “сервера в облаке стоят гораздо дешевле” и прочий бред.

Почему бред? Ну давайте буду разбирать по пунктам. Начну с последнего. “Облачные сервера дешевле”. Для примера могу дать документ по TCO от самого Амазона:

Там одна из первых картинок:

AWS Price

 

Казалось бы, ура! Даже в самом плохом случае выигрыш аж 68%! Срочно надо заводить аккаунт и платить деньги.

Однако я предлагаю вам взять любую электронную таблицу и подсчитать самим, для себя. Итак, возьмем левую колонку. Сервера, которые всегда работают и готовы к обслуживанию посетителей.

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

Итак, почта. 200 ящиков, кучка списков рассылки и так далее. Никаких лимитов не ставится принципиально. Сначала диски:

root@mail:~# LANG=C df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 7.9G 3.4G 4.2G 45% /
tmpfs 2.0G 0 2.0G 0% /lib/init/rw
udev 2.0G 128K 2.0G 1% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/vdb2 194G 182G 2.4G 99% /opt

Как видим, 8Гб под систему и 200Гб под почту. Теперь память.

root@mail:~# free -go
total used free shared buffers cached
Mem: 3 3 0 0 0 0
Swap: 3 1 2

4Гб и еще один в свопе.

Про процы – там 4 ядра от ксеончика на 2,2ГГц откушено.

В общем-то ничего такого.

Теперь идем на амазоновский калькулятор и считаем, во сколько нам обойдется такая виртуалка. Немного подыграем амазону и выберем m1.medium:

M1 Medium Instance

3.75 GiB memory
2 EC2 Compute Unit (1 virtual core with 2 EC2 Compute Unit)
410 GB instance storage
32-bit or 64-bit platform
I/O Performance: Moderate
EBS-Optimized Available: No
API name: m1.medium

Как видим, почти один-в-один. Считаем:

AWSMedium

 

Как видим, амазон предположил, что при данных условиях нам наш почтовый сервер обойдется в 300 долларов за месяц. Э-э-э-э …

Ну у нас вообще-то не одна машина, а много (поглядел – порядка десятка крутятся на хосте) … Но все равно, давайте попробуем сравнить.

С демосом (закроем глаза на то, что там больше диска, процессоров и памяти, просто меньше не было).

Demos

Ну … можем сказать, что примерно тоже самое. А теперь возьмем самого дорогого буржуйского провайдера – RackSpace.

Rackspace

Ура! Цена-то офигеть какая! Ну и пофиг, что опять проца, памяти и диска больше. Но цифры-то практически приближаются к тем, о которых говорит амазон!

Сделаем шаг в сторону iWeb.

Screen Shot 2013-02-06 at 13.14.28

Упс … Как-то не вяжется, да? 100 баксов супротив 300 … Но это для дохлых машинок, они изначально дороже в эксплуатации …

Ладно, давайте поглядим, сколько будет стоить машинка с теми же характеристиками, которые используются хост-машиной. 2 ксеона, 16Гб памяти, 1Тб в рейде …

Амазоновский m1.extralarge – $654 в месяц

Демос: 11677 рублей в месяц.

RackSpace: $1089 в месяц

iWeb: $559 в месяц

И что бы закопать, Hetzner EX-4 – 49 евро в месяц

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

Итак, время подводить итоги. Во всех случаях, кроме RackSpace, амазон оказался дороже. И ни о каких “на 68% дешевле” даже речь идти не может.

Почему же так получилось с RackSpace? Просто это хостер так называемого “премиум”-сегмента. Когда я с ними работал, они присылали мне счета на офигенно приятной бумаге и шоколадку на новый год. Конечно, приятно, но я вполне удовлетворюсь счетом в окне почтового клиента, а шоколада за такие цены я смогу купить гораздо больше.

Но ведь не могут же быть люди настолько тупыми, что бы платить больше за меньшее? Да еще и в 2-3 раза больше … Могут, ибо велика сила маркетолухов! Но к счастью такие не все.

“облака” совершенно шикарно перебивают по всем параметрам обычные сервера в одном типе задач: класс “прибежал-посчитал-убежал”. То есть 100% работы сервера совершенно не нужно. Яркие примеры: системы видеоконференций (нужно поговорить – поднял. поговорили – опустил), системы для обсчета чего-либо громоздкого (скажем, спер образ блюрейного диска – включил, задавил в нужные форматы и выключил). Так что в той самой картинке уровень “правдивости” повышается к правой стороне 🙂

Перейдем к следующему лозунгу: “сервера могут размножиться для обработки большого потока обращений и потом лишние выключатся”.

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

Где засада? Засада в приложениях. Они как-то крайне фигово относятся к тому, что внезапно где-то появляется еще одна их копия, которая обрабатывает те же данные, что и они. А ведь эта копия практически точно так же может и внезапно пропасть … Почитайте, сколько волос админы вырвали себе из разных мест, когда пытались заставить что-либо работать в кластере …

В итоге опять почти правда – “саморазмножение” серверов удобно использовать, когда поток информации следует в одном направлении: сервера закачек к примеру. Вышел новый релиз, сервера размножились, что бы всех обработать, а потом самоуничтожились. Правда, в связи с развитием торрентов пример несколько натянутый, но тем не менее.

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

Опять провал.

Теперь про надежность. Я открою страшную тайну: сами по себе виртуалки падают точно так же, как и физические сервера. Абсолютно точно так же. И про надежность может идти речь только в области инфраструктуры: числе каналов наружу, числе резервного оборудования и так далее. И тут опять же разницы нет между обычными и “облачными” провайдерами. И я точно получу гораздо большую надежность у тоже же hetzner’а, попросту купив несколько серверов в разных датацентрах …

Вывод? Не ведитесь на модные слова и все новое – это хорошо забытое старое …

Задокументируй ЭТО!

Где отчет по загрузкам фиговины с хреновины за последний месяц? Мы его 26 секунд назад должны были послать! Заказчик в потолок кричит уже!

Или нет, лучше вот так:

Вот написал я совершенно шикарную (по моему скромному мнению) штуковину. Всем хороша штуковина: может делать так, а может делать сяк. Выложил я эту штуковину в интернет, а народ возьми и начинай спрашивать: а как этой штуковиной пользоваться-то? Где руководство пользователя, администратора и еще кого-нибудь?

Да не вопрос! Открыл новую вкладку в IDE, вдохновился и описал свой шедевр. Вернее, попытался описать. Диаграммку надо вот тут вставить, а вон там без скриншота не обойтись …

Так, добавляем нужные теги в файл, меняем его расширение в html. Все, готово! Еще надо в PDF? Ставим виртуальный принтер и печатаем на него. Как картинки поехали? Переносим написанное в Word или LibreOffice. Заказчик зубчиками недоволен? Данные для диаграмки поменялись? Скриншотик поменять надо?  А-а-а-а … Отвалите от меня! Все, нету больше документации! Вон остатки валяются, пусть технический писатель мучается, ему за это деньги платят!

Знакомо? Думаю да. Любой, кто прикасался к описанию чего-либо, готов часами материться от совместимости форматов, стилей, шрифтов и прочих ужасов. А если подобное надо делать регулярно и еще совместно с кем-нибудь …

Все, мощнейшая демотивация обеспечена. А это неправильно. Тут я пишу про обратное, поэтому нефиг тут. Будем исправлять ситуацию.

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

Задача 1: Регулярно отправлять Заказчику (Акционеру, Руководителю, Министерству, еще кому-нибудь) какой-нибудь Очень Важный Отчет. В отчете должны быть Очень Важные Цифры, и График, построенный по этим цифрам.

Задача 2: Задокументировать выполненный проект. На выходе должен получиться удобочитаемый документ, с диаграммами, отображающими получившуюся структуру, с форматированным текстом и вообще что бы выглядело не стыдно.

Усложняем задачи тем, что над ними работает не один человек, желательно результат получить в нескольких форматах и все полученное сохранить для потомков. Прибьем сверху условие, что все работают под разными платформами и посмеемся над полученным.

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

Как ни странно, для таких задач давно существует целый класс программ “то, что у вас в уме, то вы и получите”. Задача их состоит в том, что бы взять исходный текст и оформить его согласно правилам для того или иного выходного формата. Надо выложить на веб-сайт? Отрисовываем картинки в низком разрешении и генерируем  html. Надо подготовить для печати? Перегенерируем  рисунки в большом разрешении и выводим все в eps или pdf. Надо сделать справку для программы? Выбираем нужный формат и все.

Легкий поиск по гуглу легко обрушивает на нас ворох ссылок. Если вам некуда девать деньги и вы работаете только под Windows, то Help&Manual практически однозначный выбор (Helpinator тоже ничего). Если вы дружите с php, то взгляните на отечественный BullDoc, питонистам пригодится Sphinx и так далее.

Люди, давно живущие в интернете, тут же предложат какой-либо движок на Wiki с соответствующими плагинами. В общем, вариантов море.

Давайте я уточню условия:

– Эта штука должна максимально хорошо дружить с системами контроля версий.

– Эта штука должна быть максимально приспособлена под “пользователя тупого, необученного”. У меня нет желания лазить по очередному скоплению менюшек или рассматривать многотомное руководство по языку.

– Эта штука должна быть максимально рассчитана под групповую работу. Когда одну часть документа делает Вася, а другую Петя.

– Эта штука должна максимально автоматизироваться. Я ленивый.

– Бесплатность – это хорошо. Но можно и денег дать, если что.

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

Итак, за основу я предлагаю взять asciidoc. Есть для всех платформ и четко следует unix-идеологии выполнять хорошо только одну задачу. На входе обычный текст, а на выходе, особенно с использованием других программ, что угодно: от разметки для какой-нибудь wiki до pdf. После краткого просмотра команд становится непонятно, а почему раньше этим не пользовался …

Рисуночки и диаграммки отдадим на откуп gnuplot и graphviz. Они работают аналогично.

Решение задачи 1

Любым способом получаем так нам необходимые данные. Вытаскиваем руками из базы, пишем скрипт для сбора с оборудования, создаем большую таблицу в экселе. И сохраняем их в обычный и привычный всем csv формат. Скажем, мы получили вот такие данные:

Скажем, первый столбец означает число кирпичей, а второй объем выпитого кофе. Очень важные и секретные данные.

Для начала напишем, какие графики мы желаем построить по этим данным:

Очень нечитаемое, да? А в результате команды gnuplot for_gnuplot мы получим вот такую вот картинку в формате svg (формат можно и поменять), которую можно засунуть куда угодно.

Это я так, не выпендривался. Но если что, можно в этой картинке поменять все. От типа линий и заканчивая тем, чем будут рисоваться столбики.

Теперь точно таким же образом опишем сам отчет.

Правда, тут выяснилось, что я раньше сделал две ошибки: во-первых, есть проблемы с отображением svg inline, а во вторых, я как-то не нашел, как заставить asciidoc пропустить первую строчку в csv файле. Обе эти проблемы решаются просто, но мне уже лень переделывать скриншоты. Но в итоге получаем вполне симпатичный html.

Можно дальше его допиливать, а можно и так оставить.

Теперь осталась сущая мелочь: засунуть это в планировщик задач и наслаждаться автоматически отправляемыми отчетами.

К решению задачи 2 мы добавим еще одну программу – graphviz. Она шикарно умеет рисовать всякие диаграммки.

К примеру, нам надо нарисовать схему взаимоотношений в коллективе.

Одна команда и получаем:

Более того, команды для graphviz можно вставить прямо в исходники для asciidoc.

Шикарно? Шикарно!

А ведь я даже не упомянул и 1% возможностей этих программ. Хотя большинству и этого процента хватит за глаза.

А ведь все исходные данные в plain text, что очень понравится использующим системы контроля версий. И все замечательно скриптуется, что еще больше понравится таким лентяям как мне …

Я доволен, а вы?