libvirt и qemu-kvm

Короче, я тут на днях беглым взглядом просматривал документацию на libvirt, на предмет того, как можно автоматизировать процесс извлечения ядра и initrd из файловой системы гостя. И оказалось, что libvirt несколько раз запускает файл с хуком, в строку запуска его отдавая параметры и xml’ку виртуальной машины. Для меня это стало, прямо скажем, открытием. Во времена появления libvirt’а, модой на системы виртуализации правила VMware, фактически предлагавшая десктопную виртуализацию, отмасштабированную до размеров сервера. Основной целевой аудиторией были виндоводы, которым было лень иметь под не прожорливые сервисы отдельные физические машины. Да, в первую очередь речь шла именно о ссаживании на одной железке того, что нельзя мешать в рамках одной ОС, а не об обеспечении быстрой миграции и не о прочих «киллер-фичах виртуализации». Конечно[…]

Контейнеры

Последние несколько недель я изучал контейнеризацию окружений, точнее то, как нынче принято это делать. И повод есть: anotherhosting.net весь в виртуалках живёт, виртуалки содержаться на моём «облаке», ну а контейнеризация, насколько известно, помогает снизить накладные расходы, что ведёт к росту КПД «облака». Ну это в теории. Да и глупо это, казалось бы, иметь гипервизор, виртуализацию в CPU, когда любой продакшн-дистрибутив умеет и cgroup и namespaces. Но нет… Счастья не будет. Если сильно не растекаться мыслью по листу… по текстбоксу, да, то всё упёрлось в недалёкость разработчиков современных. Вот что делали годные хардкорные админы при инициализации сервисов: приложение запускается, открывает все нужные для работы дескрипторы, которые нельзя открыть из chroot’а, например порты и сокеты; делается chroot куда-то; сброс привилегий до заданного[…]

Никогда такого не было!) Пост ниочём, но я очень удивлён, так как только что виртуальной машине dhcp отдал адрес из начала пула… А значит он давно виртуальным машинам ничего не назначал. Ну чтож, учимся НЕ работать в свободное время!

xfce4-terminal и rm -Rf

Когда-то весьма давно я топил за использование vde_switch для организации сети виртуальных машин в домашних условиях. Использовал я его вместо мост-устройства, как этакий сетевой хаб. Ну и на каждую сеть по такому хабу. Потом захотелось окошек, virt-manager’а и прочих извращённых утех от Red Hat’а. Но я вернулся… Короче, отринем же этот велосипед на базе linux-bridge/netfilter/dnsmasq в пользу настоящего виртуального сетевого L2-свитча! С возможностью раскидать L2-сегменты внутри этого свитча как вам заблагорассудится! Итак, конфиг vde_switch’а: port/setnumports 24 port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto port/createauto vlan/create 1 vlan/create 2 vlan/create 3 port/setvlan 2 1 port/setvlan 3 1 port/setvlan 4 1 port/setvlan 5 1 port/setvlan 6 2 port/setvlan 7 2 port/setvlan 8 2 port/setvlan 9 2 port/setvlan 10[…]

Много серверов в стойках

Я думаю, что никто не будет спорить с наличием в IT-сообществе трендов на понижение стоимости решений и повышение их эффективности. Под стоимостью при этом понимается как стоимость инфраструктуры и оборудования, так и стоимость обслуживания решения. Мощности — в аренду! Админ — на аутсорс! Решения — только типовые! Вершиной этого «развития» стало «приватное виртуальное облако», — масштабный кластер виртуализации с централизованным управлением, где клиенты могут сами управлять своими виртуальными машинами, их количеством, выделением вычислительных ресурсов под них. А тарифицируется только то, что клиент распределил под свои машины. Почти что фактическое использование ресурсов. И это ещё не все: клиенту нет дела до фактической архитектуры среды виртуализации. Так если выйдет из строя тот сервер, где исполняется его виртуальная машина, то средства управления облаком[…]

Vim-gtk с perl-документом

Я уже выкладывал старый Скрипт бэкапа для LVM-образов виртуальных машин… Но это всё было очень давно — не менее шести лет прошло с того момента, как он был закинут на боевой сервер. Короче, надо было давно это переписать. До уровня полноценной программы. На perl’е. Потому что perl решает… И чтобы не было лишних внешних зависимостей. Это же не скрипт какой-то!) Итак, теперь программа (make-vg-backup) делает инкрементальные бэкапы. С шагом, который укажет пользователь. Все, что не изменилось с прошлого бэкапа — будет слинкованно жёсткой ссылкой на фрагмент из предыдущего бэкапа. Таки образом у нас всегда есть полноценный бэкап. И места лишнего мы не тратим. Спасибо создателями rsnapshot’а за идею. Из минусов — необходимость использования отдельной утилиты для восстановления. Но её я[…]

Решил я подуть на воду и предусмотреть блочный бэкап виртуальных машин. Таки давненько мне такого не надо было, что даже не смог с первого раза найти реализацию, которую использовал на старых серверах. Можно было бы написать новую, но если на то пошло, стоило бы сразу предусмотреть возможность инкрементального бэкапа. Но так лень… Короче, решил я поискать получше. И нашлось: #!/bin/sh VGROUP=»vg1″ # Name of VG STORAGE=»/mnt/backup» # Path to backups folder LVSIZE=»50G» # Size of backup partition MAXDAYS=13 # Maximal days before delete DATE=`/bin/date ‘+%d.%m.%y’` /usr/bin/find «${STORAGE}» -name ‘*.img.xz’ -mtime «+${MAXDAYS}» -type f -exec rm -f {} \; for i in `/bin/ls «/dev/${VGROUP}»` ; do /sbin/lvcreate -s -nsnap -L${LVSIZE} «/dev/${VGROUP}/${i}» /bin/dd bs=10M if=»/dev/${VGROUP}/snap» | /usr/bin/xz -0 > ${STORAGE}/${i}_${DATE}.img.xz /sbin/lvremove -f[…]

Первым постом поставим рецепт для поваренной книги! А то тут недавно аж на боевые сервера пришлось ломится, чтобы посмотреть, как оно настроено… Итак, по-умолчанию система под управлением ОС GNU/Linux отвечает на любые ARP запросы, полученные на любых «поднятых» интерфейсах, лишь бы они казались ей запросом «локального» IP-адреса. Это может вызвать ряд проблем, если это сервер виртуализации, например. Ведь как мы будем объяснять клиенту, что ему нельзя использовать «определённые» адреса… Короче, берём и скармливаем в sysctl следующие параметры: net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2