Прошлый раз я закончил на том что мне удалось завести сертификат для 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.
Плюнул и создал каталог /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 сайтов.
TL;DR; Статья грустная, в которой ничего почти не получилось, зато узнано много нового.
Почти вся полезная нагрузка сервера – это веб-сервера. Маленькие и не очень, требующие много места и просто пустышки. Так как я хочу сделать так, что бы все сервера были видны из интернета по SSL, то придется сделать ход конем.
Все запросы на http/https будут приходить на nginx. А тот будет работать SSL-декриптором и общаться с серверами уже по чистому http. Делать двойное шифрование-расшифрование я смысла не вижу – только трата процессорного времени. А те, кто знает про ipv6 – получат прямой доступ.
Из особенностей: машинам присваиваю имена сразу в полном формате: nginx.local.multik.org. При этом домен не пересекается с реальным, но является субдоменом. Потом, когда я буду поднимать единую систему авторизации, это сильно облегчит жизнь.
И ничего не работает. Вернее, все попытки возвращаются как connection refused. Однако если на хосте поднять nc -l 80, то все получается. Вывод – не работает порт-форвардинг.
Перезагружаю и вижу в браузере уже заставку 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
И все работает. Добавляю – падает. Читаю вывод iptables -S и понимаю, что там тупо все пакеты пытаются завернуться на nginx. Ни слова про интерфейс или адрес. Читаю маны и понимаю, что оно должно, но не работает. Пробую создать спец-правила
Но правила все равно продолжают добавляться. Нашел еще один баг 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
Итак, надо виртуализироваться. Виртуализироваться будем через KVM потому что опять же продвигается редхатом, всеми поддерживается и так далее и тому подобное.
Для начала ставим кучку жутко “необходимого” софта: yum install qemu-kvm libvirt python-virtinst bridge-utils
Опять же, ничего такого вроде не появилось, за исключением пары интерфейсов с названиями 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
И добавим еще одно определение сети.
virsh net-start default
а в логах должно быть что-то похожее на
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
И выкачиваю дистрибутив 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
Значение каждого параметра либо понятны сразу, либо описаны в документации или интернете. Если все сделали правильно (я каюсь, не сразу все сделал правильно, но это оставим за скобками), то вы должны увидеть текстовый интерфейс, очень похожий расположением элементов на графический. Инсталлятор понятен любому, кто хоть раз ставил центось. В общем, после указания всех шагов получим наглядную иллюстрацию процесса инсталляции.
После установки мы увидим консоль сервера и может туда залогиниться и даже попинговать ipv4 адреса. ipv6 не пингуется, потому что на интерфейсе сидит только локальный адрес.
Более того, можно даже немного поэстетствовать и использовать графический virt-manager. Правда, придется добавить немного пакетов, что бы графическая часть морды не ругалась.
Если virt-manager ругается на то, что консоль занята, значит вы не отцепились (Ctrl-]) от текстовой в другом терминале
Ну и затем с любого линукса ssh -X на машину и я получаю вот это.
В принципе, полный контроль над машинами. Иногда очень удобно, иногда нет.
Но я отвлекся. В виртуальной машине 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 (вернее, его роутинг в линуксе) ведет себя немного “странней”, чем для 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) и оставляю только описание интерфейса.
И сеть в ней сразу заработала без каких-либо дополнительных команд. То, что и требовалось получить. Теперь можно и виртуалки клепать.
Как выдаются адреса? А очень просто: простым маппингом мак-адреса сетевой. Опять же за подробностями в документацию.
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 адреса из “приватной” сети. Фаирволл, обновление и выключение ненужного – наше все.
Не страшно и не сложно, но помнить надо.
Итак, считаю, что очередной шаг закрыт. Теперь надо переносить существующее (разумеется, с одновременным апгрейдом)
Пришла ко мне рассылка от hetzner. Дескать, дорогой валуабный клиент, сделали мы новую линейку серверов. Памяти больше, проц быстрее, диски толще а денег надо меньше. Приходи и заказывай. Походил я кругами и заказал. А то на старом уже диски сыпаться начали и своп образовываться.
Но просто так переносить сервисы абсолютно не интересно: на старом сервере у меня стоит OpenVZ и весь перенос будет заключаться в паре команд, да смене имен в DNS. Где же развитие и толчок вперед? В общем, потыкался я и решил:
– Сменить основную OS с CentOS 6 на CentOS 7. systemd, firewalld и прочие d в полном изобилии. Некий опыт есть, но чего-то в голову лезут пошлые мысли про RHCE.
– Привести в порядок DNS. Сейчас у меня часть серверов тут, часть там, часть вообще через одно место. Пусть все будет одинаковым и у меня.
– ipv6. Не очень-то и надо, но смотреть выше про развитие.
– SNI. Хватит тратить ipv4 адреса на каждый SSL сервер (да и дешевле будет).
– Да и вообще, надо все закриптовать. А то стыдоба – личный SVN голым ходит.
– Ну и KVM надо. Иногда жутко как требуется винда “в прекрасном и далеком”, а городить туннели не охота. Заодно получится бесплатный терминальный сервер для меня любимого.
– OwnCloud тоже не помешал бы, как и OpenVPN сервер для разностей нехороших.
– Ну и остальное по вкусу.
Практика прошлых лет показала, что принцип “ставим один сервер, выкидываем с него лишнее, а все сервисы в виртуалки” оправдал себя на все 100%. Да, при настройке чуть-чуть подумать надо, но зато потом абсолютно никаких проблем и заморочек. Ни с хакерами, ни с распределением нагрузки, ни с резервным копированием … да вообще ни с чем. Так буду и тут делать.
Идем в админку и заказываем новый сервер. Ждем получения письма, в котором пишут радостное:
Заходим, нас пускают …
Для приличия делаем passwd root и начинаем осматриваться. Сразу замечаю, что немцы стойко держат флаг “мы делаем нах ордунг” и сделали два больших рейда по 2Тб. Один отдали под /, другой под /home. Интересно, какой у них был сценарий использования? Но в любом случае, мне такое не надо.
Идем опять в консоль и перегружаемся в rescue
Выглядит именно тем, что я и заказывал (каюсь, да, не посмотрел раньше). Поэтому сразу набираем installimage
Там нам дают в mcedit поправить конфиг. Там я меняю имя сервера на tower.multik.org и ниже я показал, как указываю 16 гигов свопа, 512 мегабайт для /boot и все остальное отдать в LVM. В LVM прошу создать раздел / размером в 16 гигов. Остальное оставить нетронутым. Почему так мало? Так потому что все остальное – в виртуалки! В корне сервера делать лишнему абсолютно нечего, тут будут только штуки, связанные с внешним миром типа фаирволла.
Сохраняю (F2 или ESC-2), выхожу (ESC-0 или F10) и жду перезаливки сервера
Потом reboot, снова захожу (про ключи и их смену не говорю) и вуаля! Я в новом сервере.
Опять меняю пароль 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
и побалуемся с командой firewall-cmd
Если я правильно понял, то никаких активных правил нет, просто стоит public по умолчанию, в которой разрешен только dhcp-клиент и ssh. Все остальное запрещено. Вполне логичные правила, но опять же, мне не сильно подходят. Будем менять.
И вижу фигу. Ничего не изменилось. Оказывается, это фича. Скрипт видит, что зона public и так применена (ну и что, что по умолчанию, поэтому ничего не делает).
Меняю зону на home и обратно. Вот теперь показывает
Но лично мне не нужно, что бы было правило для dhcp клиента
Ну вот теперь хорошо. Ничего лишнего, все закрыто и замуровано. Остался последний шаг – применить все, что я тут натворил, в реальность
firewall-cmd --reload
Все, теперь и iptables показывает именно то, что полагается.
Как говорится, первый шаг сделан. Следующим – виртуализироваться. Но виртуализироваться хардкорно, поэтому ставим SELINUX=permissive для начала и перезагружаемся, проверяя правильность всего преднастроенного.
У меня выползла одна единственная проблема – предустановленный немцами chrony мешался ntpd. Удаляем его (yum remove chrony) и все.
Вообще-то этот пост я задумывал давно. И пытался писать давно – вон, в черновиках штуки три лежит. Но все получалось не то и не туда. Попробую в четвертый раз. Пусть будет нечто вроде сказки про жизнь.
Итак, некоторое время назад ко мне в руки попала инфраструктура, которая за 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. Солярка в изучении чуть сложнее линукса, в основном из-за очень кривой и слабой документации. Изучать целенаправленно смысла нет, разве что в удовольствие.
В принципе, в программировании микроконтроллеров под Linux нет ничего сложного. Более-менее доступны средства разработки, а некоторые производители и вовсе официально поддерживают Linux как среду разработки.
TI тоже имеет свою фирменную среду, но она … скажем так, для хардкорных железячников. Старый, тормознутый эклипс и какие-то невнятные настройки. Залитие прошивки и ее отладка тоже доставляют много удовольствия привыкшим к нормальным средам.
В общем, долой разврат – будем делать все по-правильному, что бы программирование доставляло удовльствие, а не требовало героического преодоления трудностей.
Расписывать я буду под Fedora Linux (21), потому что я сейчас под ней. Под другие дистрибутивы инструкций как-то больше.
В чем проблема с федорой? Ведь они кровь и плоть от редхата, а тот официально поддерживает msp430-gcc, который использует и сама TI. Проблема в том, что это федора, а значит в ней все нестабильное и вообще может не работать.
И с MSP430 случилось ЭТО. В 20й версии он работал, а в 21й – уже нет. Подробнее можно посмотреть тут. Если кратко, то в федоре сломали линкер.
Что делать? Есть несколько вариантов, из которых самый простой это взять старую версию компилятора из CCS или Energia. Но добрый Brandon Nielsen решил эту проблему по-другому: просто сделал репозиторий со правильными версиями.
Открываем рутовую консоль и подключаем нужный репозитарий
dnf copr enable nielsenb/msp430-development-tools
И ставим все необходимое, соглашаясь с тем, что никто ни за что не отвечает.
Теперь скопипастим 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 показывает табуляцию. Поправьте где надо.
Теперь осталось поправить параметры 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 С автором, чьи наработки я использовал, можно познакомиться тут
Летом по интернету прокатилась волна новостей, как с того или иного ресурса стащили базу паролей. В принципе мне все эти новости довольно параллельны: я на тех ресурсах не бывал, да и есть у меня большой опыт именно в хранении паролей и другой “нежной” информации …
Но через некоторое время я раз за разом возвращался к этой теме. Ладно мои пароли, которые я генерирую по известным мне правилам и которые согласно всем канонам считаются достаточно трудно ломаемыми. Но что делать с паролями, которые вообще-то не мои, но мне приходится их использовать, не имея возможности сменить?
Одновременно опять возникло желание сделать что-нибудь этакое, что бы при моих переездах с машины на машину и с операционки на операционку весь этот шлейф паролей оставался бы управляемым …
Решение в лоб
Первое, что приходит в голову, это использовать обычный бумажный блокнотик. Э-э-э .. в общем, объяснять минусы не буду. Да и мы с компьютерами работаем, а не с бумажными архивами …
Затем мысль обычно доходит до создания какое-либо места для хранения паролей, которое с одной стороны будет неизменным при моих переездах, а с другой стороны, не будет ограничивать меня в моих извращениях.
Сразу на ум приходят два решения: папка в почтовом ящике и какое-нибудь облачное хранилище файлов.
Папка в почте хороша тем, что до почты-то в нынешнее время можно добраться несколькими способами: и через почтовый клиент и через браузер. Но как хранилище нежной информации оно ни о чем: до писем может добраться администратор почтового сервера и любой, кто доберется до вашего компьютера. Более того, почту обожают индексировать всякие роботы и нет никаких гарантий, что эти роботы, встретив ваши пароли, оставят их вашими.
Использовать файлы в облаках тоже идея не на пять баллов, но гораздо лучше предыдущей. А если почесать затылок и начать использовать какую-нибудь кросс-платформенную систему шифрования вроде truecrypt, то данный вариант становится очень даже привлекательным.
Как вариант можно использовать evernote или catch или .. в общем, всем всё понятно.
Но … Опять эти “НО” …
Человек чудовищно ленивая скотина. Сначала ему будет лень постоянно открывать-закрывать контейнер или записывать в почту. Потом он плюнет на все и снова поставит галочку “запоминать пароли в почте”, а затем в очередной раз он обновится/сменит браузер и все начнется сначала.
Я тоже ленивая скотина.
Да, я тоже прошел не раз и не два через эти моменты, пока наконец не решил избавиться от пережитков прошлого (первые записи в моих анналах датируются 99м годом). Для начала я решил составить список требований
– максимальная кросс-платформенность. Решение должно позволить мне получить доступ до моих паролей на OS X, Windows, Linux и Android. IPhone хорошо, но совершенно не критично. Остальные платформы мне совершенно не критичны, ибо устройств под их управлением у меня нет.
– максимальное удобство при настройках по умолчанию. То есть загрузили, прошли через инсталлятор и вспоминаем о решении только когда возникает необходимость зайти в какую-нибудь тьмутаракань.
– максимальное умение выживать при переездах. В идеале решению должно быть абсолютно все равно, где вводят пароли, а где их используют.
– ну и решение должно иметь минимальное число проблем в моей конфигурации (macbook air, samsung galaxy s, windows 7 дома и linux, windows7 и os x на работе)
На возражения в духе “ну как можно отдать свое самое сокровенное какой-то программе” я давно махнул рукой: то, что можно достать в результате взлома этих баз, мне принесет только моральные расстройства. А вот удобства они добавляют много.
Гугл всемогущий даст мне ответ
Пошел я в гугл искать на предмет “best password manager” и “лучший менеджер паролей”. Число страниц меня удивило …
В общем, на мой внутренний ринг выходят RoboForm, 1Password, LastPass и KeePass. Другие отсеялись еще на этапе просмотра сайтов. К примеру если я не понимаю, за счет чего зарабатывает проект, то я автоматом подозреваю его автора в самых нехороших намерениях.
Каждой программе был предоставлен снапшот виртуалки с windows7, где у меня стоит зоопарк из ie, firefox и safari. Затем борцы со всем арсеналом перемещались на аналогичные виртуалки с linux и os x, и только после отсутствия ошибок получали возможноcть показать себя на реальном ноутбуке с os x и на моем samsung galaxy s (рутованный на 2.3.6 и без каких-то особенных извращений)
На всякий случай выдам предупреждение: все ошибки и глюки мои, я вообще первый раз эти программы увидел и вообще, у вас может сложиться совершенно другое впечатление.
Шышел-мышел … в общем, первый вышел.
RoboForm. Еще во времена выпуска печатной версии “компьютерры” я читал много хвалебных отзывов о этой программе. Голубицкий только что шоколадом онную не мазал. Ну и гугл при выдаче результатов не обделял данную программу вниманием.
Первый звонок прозвенел на этапе обустройства: для доступа в личный кабинет используется один пароль, а для открытия парольной базы – другой. И зная первый пароль, можно легко удалить аккаунт вместе с парольной базой. Неаккуратненько.
Второй звонок был чисто субъективный. RoboForm выглядит этаким монстром даже по меркам windows: куча менюшек, настроек и кнопочек. И вся эта куча этак неряшливо собрана под одним заголовком … Но на вкус и цвет все фломастеры разные, поэтому не стал обращать внимание: вдруг привыкну.
Но третий звонок стал завершающим для RoboForm: его сайт не принимал установленный из под Internet Explorer мастер-пароль, когда я его вводил из под Firefox под Linux. Поначалу я не понял и не поверил: ну взял и ошибся или на русском языке остался. Раз проверил, два. Менял пароль и вводил его с удвоенным вниманием … Не принимает.
Ну, такой менеджер паролей мне не нужен.
Даешь опенсурс!
Расстроенный предидущим обстоятельством, решил метнуться в стан открытых решений. KeePass.
Простой заход на страницу закачки подтверждает, что данное решение пользуется популярностью. Я попытался придумать вариант, который невозможно реализовать, но не смог: после первого же запроса “хренотень keepass howto” гугл тут же выдавал пару-тройку вполне внятных сайтов.
Но эта же открытость встала мне боком: что бы заставить работать это решение, потребовалось довольно много телодвижений. Может, мой опыт уже начал играть против меня, но мне уже стало как-то некомфортно … А зачем себя мучать?
В общем, я решил посмотреть на другие.
LastPass или “точно последний раз?”
Самый первый подход чуть было не завершился крахом: я забыл мастер-пароль к базе буквально через 5 минут после его ввода. А восстановить его нельзя.
Найти как пересоздать аккаунт удалось только с помощью гугла. Что, неужели такая неуверенность?
После установки LastPass бабахнул бальзамом на мои раны: после установки он единственный предложил забрать все пароли из браузеров и потом удалить их.
Поход по сайтам тоже не выявил никаких проблем за исключением категорического стилевого непопадания сообщений. Или говоря другими словами, он выглядит совершенно чужеродно. В принципе это хорошо, потому что будет очень тяжело пропустить или спутать LastPass с чем-то другим.
LastPass легко прошел все поставленные мной барьеры и без проблем обосновался на ноутбуке и смартфоне.
Последний 1Password
Скажу честно, на 1Password я глядел со скептицизмом. Во-первых, мне заранее было известно об отсутствии клиента под Linux и “только чтением” под Android. Во-вторых, я не понимал какой дурак будет платить 49 баксов за версию только под одну платформу, когда тот же LastPass предлагает тот же функционал за бакс в месяц для всех платформ, а если забыть про мобильные, то и вовсе бесплатно …
Расширенный функционал по хранению логинов-паролей ко всяким ftp и database серверам мне не нужен. Хранить лицензии можно и в записках. Всякие кредитки и прочее … В общем, совершенно ненужное мне.
Но оставлю, да. Должна же быть какая-нибудь конкуренция LastPass …
Жизнь – она многогранна …
Было довольно интересно наблюдать, как LastPass и 1Password наперебой предлагают мне сохранить или ввести пароли. Я оценивал установки по умолчанию, удобство управления и прочие характеристики, которые каждый примеряет на себя.
И по прошествии полутора недель (триал у LastPass составляет 14 дней, а мне еще хотелось запаса) ситуация оказалась перевернутой с ног на голову. Но давайте по-порядку.
1) Получив доступ к базе 1Password (скажем, сперев флешку), я могу легко узнать имена файлов, которые хранятся в базе. Нет, сами файлы вроде зашифрованы, но имена может прочитать любой.
2) LastPass при экспорте файлов из секретного хранилища (надо же их когда-нибудь использовать) зачем-то меняет им имена на хешеподобные. Совершенно убийственная вещь, особенно когда файл не один … .
3) LastPass предполагает что у вас всегда есть доступ к сети. Никаких флешек и прочих извращений. Облако и все хранится в нем. 1Password более демократичный: либо укажи сам где, либо я положу базу в DropBox.
4) Почему-то LastPass не предлагает никаких горячих клавиш для заполнения полей. 1Password в данном случае выглядит гораздо гуманней: Cmd- и он либо вводит все сам, либо предлагает выбрать из имеющихся. Мне, как имеющему 5 логинов на nic.ru, такое поведение очень по душе.
5) Настройки по-умолчанию в 1Password более “секурные”. 12 символов в пароле вместо 8, программа раньше закрывает базу и тому подобное. В LastPass все можно сделать аналогично, но кто-нибудь делает это?
6) LastPass переводили на русский автоматическим переводчиком: “взломать локальный логин” на титульном экране андроида оказалось в оригинале “force local login” …
7) 1Password есть в AppStore, а LastPass нет. Для маковладельцев это довольно весомый аргумент.
8) Доступ до базы 1Password можно получить практически на любой машине без установки чего-нибудь и в оффлайне!
И в качестве финального выстрела: LastPass не смогла обновить базу на моем Samsung Galaxy S. Просто сообщала, что нет соединения с сервером. Хотя браузер браузерил и facebook фэйсбучил. И такое “нет соединения” меня ну очень напрягло. 1Password рядом после ввода мастер-пароля сообщил, что он обнаружил обновления, забрал их и показал мне мою базу.
В общем, мои $49 уходит авторам 1Password. Я оказался одним из тех дураков, которых раньше не понимал.