Виртуализация тема интересная и удобство работы с виртуальными машинами
в домашней лаборатории основано на изначально правильно выбранном сетевом
"ядре" виртуальной сети.
Часто в учебном процессе появляется необходимость смоделировать ситуацию,
проверить различные сетевые модели и протестировать работу служб и сервисов.
Пользуюсь попеременно и в разных комбинациях как одиночными запусками
гостевых машин, непосредственно в qemu-kvm, так и работая с фермой виртуальных
машин с установкой через virt-install и управлением через консольный virsh, а
так же бывает полезной простая работа во фронтенде - virt-manager.
более того всегда оставляю возможность для подключения к общей виртуальной
сети отдельных программ, например подключение другой виртуальной сети
созданной на базе лаборатории gns3 с более сложной топологией.
Все запускаемые системы на целевом хосте я попытаюсь параллельно с написанием этой
статьи объединить одним сетевым ядром в виде программного коммутатора openvswitch,
по максимуму упростив установку, настройку и запуск.
Каждая подключенная к сети машина должна быть доступна всем равноправным
участниками этой сети и иметь доступ в глобальную
сеть через домашний роутер напрямую, минуя маршрутизацию на целевом хосте
и это позволит отказаться от дополнительного преобразования адресов через таблицу
нат и как результат, отказаться от проброса портов для выхода за барьер nat,
принимая все виртуальные хосты как отдельные самостоятельные устройства.
Fedora WorkStation сама является по сути маршрутизатором. Не верите?
Запустите в терминале установленной из коробки системы
Код: Выделить всё
cat /proc/sys/net/ipv4/ip_forwardмаршрутизации пакетов. Причина тому очень проста. Предустановленная
виртуальная сеть в федоре с ядром на bridge.
Говоря "упростив установку и настройку", мне вспомнился старый родительский
кассетный магнитофон с ползунками эквалайзера и с кучей дополнительных
ручек настроек звука. На его фоне современный плеер выглядит коробкой
с рубильником. При том освободилось место для управлялок более полезных
функций плеера. Пример для меня поучительный, а направление
прогресса более чем очевидно. Делаем так Как учила баба Шура,
чтобы вставил и все работало.
Для начала продумаем систему восстановления если в процессе
эксперимента что то пойдет не так. Вариантов здесь множество,
но я воспользуюсь уже встроенной в файловую систему btrfs возможностью
создавать снэпшоты и откатываться на них при необходимости букавально
несколькими командами в консоли. Если все пройдет гладко то ни что
не помешает весь полученный опыт перенести на любимую
вами файловую систему.
Реализация идеи. В качестве дистрибутива для установки выберу
нашего флагмана виртуализации fedora 25. На свободном месте диска
при установке создам три раздела, swap, загрузочный /boot на ext2 и корневой / на btrfs.
Субтом создастся при этом автоматически и по дефолту будет имеет имя root00
Система установлена, доступ в интернет присутствует.
Что у меня есть из коробки?
Маршрутизатор раздающий динамические адреса всем страждущим в
локальной сети. Домашний компьютер смотрящий одним интерфейсом на
реальном железе в локальную сеть и вторым интерфейсом в виде моста
объединяет виртуальные точки входа гостевых систем. Все подключаемые
виртуалки так же получают динамический адрес через dhcp и посредством ната
предоставляющим netfilter c интерфейсом iptables и надстройкой firewalld
имеют связь с внешним миром. Ядро домашнего компьютера при этом переведено
в режим маршрутизации пакетов. Вот так наворотили из коробки. А все почему?
Потому что совершенно не известно какого типа у вас будет подключение к сети и это
правильно. Но в домашней сети с подключением по локальной сети через роутер
это выглядит мягко сказать избыточно и сильно отвлекает. Нам нужно объединить
две сети, виртуальную и локальную в одну и переложить бремя выделения адресов
на плечи домашнего роутера.
Как работает обыкновенный коммутатор второго уровня?
Вставляешь провода и он связывает всех со всеми. Удобно для домашней
виртуальной сети? Для меня однозначно да и это еще если не брать в расчет
возможность перейти на третий уровень и настроить вланы. Алгоритм работы:
1. Создаем учебную систему на которой будем отрабатывать навыки сетевого
администрирования с обязательной опцией отката в начальную точку при неудачи.
2. Выпиливаем посредника - bridge и отключаем избыточные сервисы.
3. Устанавливаем необходимый софт и настраиваем его.
4.Создаем и запускаем виртуальные машины
а)через virt-install и libvirt
б)через графический фронтенд virt-manger, которым я кстати
сказать пользуюсь очень редко. Но котоый нам может упростить жизнь
в связи с переходом с иксов на wayland и делающим в этот переходной
период невозможным подключение через virt-viewer c условием конечно
что вы планируете работу в gnome на wayland.
с)Через скрипт непосредственно запуск в qemu-kvm и другие продукты
способные работать через виртуальный интерфейс tap0 такие например как gns3
Что я имею из коробки? Установленную систему федора на комп с одной сетевой
картой(1 картой - это важно, иначе придется выставить на второй запрет на поднятие
интерфейса при загрузке).
Плюс, виртуальный мост для подключения виртуальных интерфейсов гостевых
машин. Со всеми наворотами, С пробросом портов, с натом, с кучей статических
адресов, с включенной маршрутизацией пакетов в ядре.
Ядро нашей виртуальной сети будет состоять из програмного коммутатора.
Считаю что файервол удобная надстройка для управления работой netfilter
для тех кто ранее не был знаком с интрефейсом iptables. Но более менее
хорошо разбираясь в синтаксисе правил iptables поселять в свою голову
дублирующие знания по управлению netfilter через нтерфейс firewalld
думаю так же избыточно. Его мы непременно отключим.
Небольшая ремарка для возможных последователей переписать скрипт скажем
на debian отмечу небольшое различие. Если вы войдете в обе системы через команду sudo и
наберете в терминале echo $USER то получите в дебиан root а в федоре имя юзера через
которого зашли в систему. Поэтому имейте ввиду, в строчке кода нужно будет переменную $USER
заменить соответственно на ваш системный логин в ручную. Поведение переменных окружения
по крайней мере в двух этих системах различается.
Запускаем первый скрипт именно через sudo, а не через su.
Есть и небольшая ложка дегтя, как я отметила выше, к вобщем то в целом сладкой
fedorа 25. По умолчанию она использует сервер вайланд и при установки в данный
переходной период через virt-install могут возникнуть проблеммы с подключением virt-viewer.
Есть два простых решения. Первое использовать для подключению к дисплею
сам virt-manager после старта установочного скрипта или запускать целевой хост
в сесии "gnome на X11" выбрав при запуске соответственную строчку в дисплейном
мененджере.
Предыстория закончилась, поехали. Загрузимся в флешки, с лайв
образа с которого устанавливали систему.
Код: Выделить всё
sudo suКод: Выделить всё
mount /dev/sdaX /mnt
cd /mntКод: Выделить всё
lsКод: Выделить всё
mv root00{,_template}Код: Выделить всё
btrfs subvolume snapshot root00{_template,}
cd -
umount /mnt
rebootЗапускаем Манускрипт и после перезагрузки радуемся.
Код: Выделить всё
#!/usr/bin/env bash
: << SPRAVKA
Если есть вторая сетевая карта надо установить в ней параметр ONBOOT=no
Для замены fiewalld на интерфейс iptables уберите со строк одиночный знак коментария.
Если работаете в vim достаточно набрать в командной строке :2,$s/^#//
Повторите команду в vim если хотите полностью очистить таблицы iptables
SPRAVKA
if [ $(whoami) == root ] && [ $USER != root ]; then
echo "Запускаем скрипт"
else
echo "Запустить скрипт через sudo su \
!Не использовать команду su -"
exit 1
fi
DIR="/etc/sysconfig/network-scripts/"
IFACE="ifcfg-$(ip r | grep -om 1 'enp[^ ]\+')"
###IFACE="" #Задать в ручную
echo "Отправляем селинукс на Гавайи"
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
echo "Установка пакетов"
dnf update -y
dnf install -y virt-manager openvswitch libvirt virt-install tunctl virt-viewer
#dnf install -y iptables-services
systemctl enable openvswitch
systemctl enable network
#echo "Firewalld в топку!"
#systemctl disable firewalld && systemctl stop firewalld && systemctl mask firewalld
#systemctl enable iptables && systemctl start iptables
###echo "Отключим ipv6 через параметр ядра"
###cp /etc/default/grub{,_$$.bak}
###sed -i '/GRUB_CMDLINE/s/\"$/ ipv6.disable=1\"/' /etc/default/grub
###grub2-mkconfig -o /boot/grub2/grub.cfg
echo "Отключим ipv6, у него в будущем тяжелый график"
echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf
sysctl -p
echo "Нам уже не нужен маршрутизатор в ядре!"
cat /proc/sys/net/ipv4/ip_forward
##echo "Очистим все табилцы в iptables"
##for table in $(</proc/net/ip_tables_names); do
##iptables -t $table -F
##iptables -t $table -X
##iptables -t $table -Z
##done
##
##iptables -P INPUT ACCEPT
##iptables -P FORWARD ACCEPT
##iptables -P OUTPUT ACCEPT
##
##if [ ! -f /etc/sysconfig/iptables_*.bak ]; then
## mv /etc/sysconfig/iptables{,_$$.bak}
##fi
##
##/usr/sbin/service iptables save
echo "Разрушим дефолтную виртуальную сеть"
sleep 1
virsh net-destroy default
virsh net-autostart --disable default
virsh net-undefine default
echo "Сделаем бэкап"
cp ${DIR}${IFACE}{,_$$.bak}
echo "Создадим новые конфиги интерфейсов"
cat>${DIR}ifcfg-ovsbr0<<\STOP
DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
ONBOOT=yes
BOOTPROTO=dhcp
STOP
sed -i '/HWADDR/!d' ${DIR}${IFACE}
cat>>${DIR}${IFACE}<<STOP
DEVICE=${IFACE#*-}
ONBOOT=yes
NETBOOT=yes
TYPE=OVSPort
BOOTPROTO=none
DEVICETYPE=OVSIntPort
OVS_BRIDGE=ovsbr0
STOP
echo "Стартуем коммутатор"
systemctl start openvswitch
echo "Запустим сеть, дождитесь, это займет некоторое время..."
systemctl start network
echo "Создадим новую дефолтную виртуальную сеть"
sleep 1
cat>/tmp/default.xml<<\STOP
<network>
<name>default</name>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
</network>
STOP
echo "Зарегистрируем новую дефолтную сеть и запустим ее"
virsh net-define /tmp/default.xml
virsh net-start default
virsh net-autostart default
###echo "Создадим пул в домашней директории"
###mkdir /POOL
###virsh pool-define-as POOL dir --target /POOL
###virsh pool-build POOL
###virsh pool-start POOL
###virsh pool-autostart POOL
###virsh pool-list
echo "Добавим пользователя в дополнительные группы"
usermod -aG libvirt,qemu,kvm $USER
#####systemctl restart libvirtd
#####echo export LIBVIRT_DEFAULT_URI="qemu:///system" >> /home/$USER/.bashrc
echo "Конфигурация закончена, через 10 секунд компьютер будет перезагружен.
Для отмены нажмите Ctrl+C. Для поднятия сети нужна перезагрузка!"
for((i=10; i != 0; i--)); do
echo $i
sleep 1
done
echo "Перезагружа-а-а-юсь! ,,,(o_O)?"
rebootбольше не является маршрутизатором по определению
Код: Выделить всё
cat /proc/sys/net/ipv4/ip_forwardВо второй части сделаем необходимый тюнинг и добавим для удобства
запуска виртуалок несколько скриптов.
Если что то пошло не так, возвращаемся назад и пытаемся проанализировать
ошибки. Если старания не привели к успеху и вы окончательно запутались,
то вернем систему к отправной точке - в первородное ее состояние.
Это займет несколько минут а при следующем старте скрипта можно ввести
дополнительные строчки индикаторы и тогда очередной старт
будет сопровождаться дополнительным выводом всего что происходит на
каждом его этапе работы.
Загрузимся с лайв диска и откатим систему.
Код: Выделить всё
sudo su
mount /dev/sdaX /mnt
cd /mnt
btrfs subvolume delete root00
btrfs subvolume snapshot root00{_template,}
cd -
umount /mnt
reboot--------------
Продолжение здесь
