#!/bin/bash # Подготовка хоста к запуску стенда. # # ./host-prereq.sh загрузить модуль openvswitch # ./host-prereq.sh --shim дополнительно поднять macvlan-shim, чтобы стенд # можно было проверять с самого хоста # ./host-prereq.sh --shim-down снять shim # # Про shim: macvlan-интерфейс контейнера и физический интерфейс хоста не видят # друг друга напрямую — это ограничение macvlan, а не стенда. Клиент из # 192.168.5.0/24 обращается к стенду без всяких shim; shim нужен только если # проверять хочется с самой машины 192.168.5.9. set -euo pipefail PARENT=${PARENT:-enp3s0} SHIM=${SHIM:-hpnn-shim} SHIM_IP=${SHIM_IP:-192.168.5.13/32} LB_IP=${LB_IP:-192.168.5.20} VIP=${VIP:-192.168.5.21} log() { echo "[host-prereq] $*"; } shim_up() { if ! ip link show "$SHIM" >/dev/null 2>&1; then ip link add "$SHIM" link "$PARENT" type macvlan mode bridge log "создан $SHIM поверх $PARENT" fi ip addr replace "$SHIM_IP" dev "$SHIM" ip link set "$SHIM" up ip route replace "$LB_IP/32" dev "$SHIM" ip route replace "$VIP/32" dev "$SHIM" log "shim поднят: $SHIM_IP, маршруты на $LB_IP и $VIP" } shim_down() { ip link del "$SHIM" 2>/dev/null && log "$SHIM удалён" || log "$SHIM отсутствует" } case "${1:-}" in --shim-down) shim_down exit 0 ;; esac if ! grep -q '^openvswitch ' /proc/modules; then modprobe openvswitch log "модуль openvswitch загружен" else log "модуль openvswitch уже загружен" fi # Чтобы стенд переживал перезагрузку хоста. if [ -d /etc/modules-load.d ] && [ ! -f /etc/modules-load.d/openvswitch.conf ]; then echo openvswitch > /etc/modules-load.d/openvswitch.conf log "модуль добавлен в автозагрузку (/etc/modules-load.d/openvswitch.conf)" fi [ "${1:-}" = "--shim" ] && shim_up log "готово"