Эффективное использование нескольких сетевых портов для виртуальных машин, запущенных на сервере
Привет, ЛОР)))
Пришла мне в голову донельзя гениальная и простая мысля, и я спешу с вами ею поделиться! Есть у меня такой вот сервер:
В конфигурации один 2609v3 и 16 ГБ памяти, и с усиленным радиатором, чтобы лучше охлаждал. И чтобы как-то утилизировать всю его мощность, было принято решение крутить на серваке виртуалки. А чтобы виртуалки не упирались в сеть, я решил утилизировать все 4 порта на сервере.
Смотрите, смотрите как я это сделал! Создаем четыре бриджа и в каждый бридж подключаем порт:
# find /etc/rc.d/net.*
/etc/rc.d/net.br1
/etc/rc.d/net.br2
/etc/rc.d/net.br3
/etc/rc.d/net.br4
/etc/rc.d/net.eno1
/etc/rc.d/net.eno2
/etc/rc.d/net.eno3
/etc/rc.d/net.eno4
for DEV in br1 br2 br3 br4; do
/sbin/ip link add ${DEV} type bridge
/sbin/ip link set ${DEV} type bridge stp_state 0
/sbin/ip link set ${DEV} type bridge forward_delay 0
/sbin/ip link set ${DEV} up
done
for DEV in eno1 eno2 eno3 eno4; do
case "$DEV" in
"eno1") BRIDGE="br1" ;;
"eno2") BRIDGE="br2" ;;
"eno3") BRIDGE="br3" ;;
"eno4") BRIDGE="br4" ;;
esac
/sbin/ip link set ${DEV} master ${BRIDGE}
/sbin/ip link set ${DEV} up
done
eno{1..4}
— это имена сетевых интерфейсов у HP. Вот так вот:
- eno1 подключен в br1;
- eno2 подключен в br2;
- eno3 подключен в br3;
- eno4 подключен в br4.
Теперь смотрите! Запускаем виртуалки, а виртуалки должны быть с tap-интерфейсом и тоже входить в бридж:
lrwxrwxrwx 1 root root 15 Oct 12 12:07 /etc/qemu-ifdown -> qemu-ifdown.br1 -rwxr-xr-x 1 root root 98 Oct 12 12:03 /etc/qemu-ifdown.br1 -rwxr-xr-x 1 root root 98 Oct 11 08:46 /etc/qemu-ifdown.br2 -rwxr-xr-x 1 root root 98 Oct 12 12:03 /etc/qemu-ifdown.br3 -rwxr-xr-x 1 root root 98 Oct 12 12:03 /etc/qemu-ifdown.br4 lrwxrwxrwx 1 root root 13 Oct 12 12:07 /etc/qemu-ifup -> qemu-ifup.br1 -rwxr-xr-x 1 root root 104 Oct 12 12:03 /etc/qemu-ifup.br1 -rwxr-xr-x 1 root root 104 Oct 11 08:46 /etc/qemu-ifup.br2 -rwxr-xr-x 1 root root 104 Oct 12 12:03 /etc/qemu-ifup.br3 -rwxr-xr-x 1 root root 104 Oct 12 12:03 /etc/qemu-ifup.br4
для примера приведу один скрипт:
# cat /etc/qemu-ifup.br1 #!/bin/sh BRIDGE=br1 VLAN=$1 /sbin/ip link set ${VLAN} master ${BRIDGE} /sbin/ip link set ${VLAN} up /bin/ln -sf /etc/qemu-ifup.br2 /etc/qemu-ifup
Смотрите, в чём прикол: qemu при запуске с сетью tap автоматически выполняет скрипт /etc/qemu-ifup, в котором этот tap-интерфейс заходит в бридж, выполняется скрипт-симлинк /etc/qemu-ifup, который ведёт на /etc/qemu-ifup.br1, и когда этот tap-интерфейс зайдёт в br1, дальше скрипт с br1 переделает символическую ссылку на br2. При последующем запуске br2 он его заведёт в бридж br2, а затем переделает на br3, а когда очередь дойдёт до br4, он снова сделает симлинк на br1.
Таким образом получается круговая ротация: каждая новая виртуалка заходит в br1, br2, br3, br4 по очереди. Все сетевые интерфейсы будут утилизированы виртуалками по очереди, вот так вот!
# /usr/bin/qemu-system-x86_64 -nic tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
Пользуйтесь на здоровье, у кого много сетевых портов на сервере!
А чтобы виртуалки могли выходить в сеть, не забудьте настроить iptables:
iptables -t filter -A FORWARD -i br1 -j ACCEPT iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE iptables -t filter -A FORWARD -i br2 -j ACCEPT iptables -t nat -A POSTROUTING -o eno2 -j MASQUERADE iptables -t filter -A FORWARD -i br3 -j ACCEPT iptables -t nat -A POSTROUTING -o eno3 -j MASQUERADE iptables -t filter -A FORWARD -i br4 -j ACCEPT iptables -t nat -A POSTROUTING -o eno4 -j MASQUERADE sysctl -w net.ipv4.ip_forward=1