Skip to content

Instantly share code, notes, and snippets.

@dmi3mis
Created July 13, 2026 09:16
Show Gist options
  • Select an option

  • Save dmi3mis/e18a07bf72d76fbfd2b0241c08d0c460 to your computer and use it in GitHub Desktop.

Select an option

Save dmi3mis/e18a07bf72d76fbfd2b0241c08d0c460 to your computer and use it in GitHub Desktop.
Скрипт подготовки рабочего места для курса VM-603
#!/bin/bash
# Скрипт автоматической подготовки рабочего места для курса VM-603
# Основан на документе "VM-603_Подготовка рабочего места_2026-06-30.pdf"
# Требует запуска с правами sudo
set -euo pipefail
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Функция для вывода сообщений
info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
# Проверка прав суперпользователя
if [[ $EUID -ne 0 ]]; then
error "Скрипт должен запускаться с правами root (используйте sudo)."
fi
# Определение имени локального администратора (пользователя, запустившего sudo)
if [[ -n "${SUDO_USER:-}" ]]; then
LOCAL_USER="$SUDO_USER"
else
LOCAL_USER="$USER"
fi
info "Локальный администратор: $LOCAL_USER"
# ----------------------------------------------------------------------
# 1. Установка необходимых пакетов
# ----------------------------------------------------------------------
info "Установка необходимых пакетов..."
apt update
apt install -y astra-kvm libosinfo-bin unzip qemu-utils virtinst
# Проверка, что нужные утилиты доступны
for cmd in virsh virt-install qemu-img unzip; do
if ! command -v $cmd &> /dev/null; then
error "Утилита $cmd не найдена. Возможно, установка прошла неудачно."
fi
done
# ----------------------------------------------------------------------
# 2. Проверка поддержки виртуализации
# ----------------------------------------------------------------------
info "Проверка поддержки виртуализации..."
virt-host-validate qemu || warn "Некоторые проверки виртуализации могут не проходить, но это допустимо."
# ----------------------------------------------------------------------
# 3. Добавление пользователя в группы libvirt
# ----------------------------------------------------------------------
info "Добавление пользователя $LOCAL_USER в группы libvirt..."
usermod -a -G kvm,libvirt,libvirt-qemu,libvirt-admin "$LOCAL_USER"
# Чтобы изменения вступили, нужно перелогиниться, но мы продолжим с текущими правами.
# ----------------------------------------------------------------------
# 4. Удаление существующих виртуальных сетей VM-603-* (если они есть)
# ----------------------------------------------------------------------
for net in VM-603-1 VM-603-2 VM-603-3; do
if virsh -c qemu:///system net-list --all --name | grep -qx "$net"; then
info "Удаление существующей сети $net"
virsh -c qemu:///system net-destroy "$net" 2>/dev/null || true
virsh -c qemu:///system net-undefine "$net" 2>/dev/null || true
fi
done
# ----------------------------------------------------------------------
# 5. Создание конфигурационных файлов сетей и их определение
# ----------------------------------------------------------------------
info "Создание виртуальных сетей VM-603-1, VM-603-2, VM-603-3..."
cat > /tmp/VM-603-1-network.xml <<EOF
<network>
<name>VM-603-1</name>
<forward mode="nat">
<nat>
<port start="1024" end="65535"/>
</nat>
</forward>
<bridge name="virbr10" stp="on" delay="0"/>
<domain name="VM-603-1"/>
<ip address="192.168.110.1" netmask="255.255.255.192">
</ip>
</network>
EOF
cat > /tmp/VM-603-2-network.xml <<EOF
<network>
<name>VM-603-2</name>
<forward mode="nat">
<nat>
<port start="1024" end="65535"/>
</nat>
</forward>
<bridge name="virbr11" stp="on" delay="0"/>
<domain name="VM-603-2"/>
<ip address="192.168.110.65" netmask="255.255.255.192">
</ip>
</network>
EOF
cat > /tmp/VM-603-3-network.xml <<EOF
<network>
<name>VM-603-3</name>
<forward mode="nat">
<nat>
<port start="1024" end="65535"/>
</nat>
</forward>
<bridge name="virbr12" stp="on" delay="0"/>
<domain name="VM-603-3"/>
<ip address="192.168.110.129" netmask="255.255.255.192">
</ip>
</network>
EOF
for net in VM-603-1 VM-603-2 VM-603-3; do
virsh -c qemu:///system net-define "/tmp/${net}-network.xml"
virsh -c qemu:///system net-start "$net"
virsh -c qemu:///system net-autostart "$net"
done
rm -f /tmp/VM-603-*-network.xml
# ----------------------------------------------------------------------
# 6. Создание пула хранения
# ----------------------------------------------------------------------
POOL_DIR="/AstraLab/pool1"
info "Создание пула хранения в $POOL_DIR"
mkdir -p "$POOL_DIR"
chown "$LOCAL_USER:$LOCAL_USER" "$POOL_DIR"
chmod 777 "$POOL_DIR"
# Если пул уже существует, удалим его (чтобы пересоздать)
if virsh -c qemu:///system pool-list --all --name | grep -q pool1; then
virsh -c qemu:///system pool-destroy pool1 2>/dev/null || true
virsh -c qemu:///system pool-undefine pool1 2>/dev/null || true
fi
virsh -c qemu:///system pool-define-as pool1 --type dir --target "$POOL_DIR"
virsh -c qemu:///system pool-build pool1
virsh -c qemu:///system pool-start pool1
virsh -c qemu:///system pool-autostart pool1
# Проверка статуса пула
info "Проверка пула хранения:"
virsh -c qemu:///system pool-list --all
virsh -c qemu:///system pool-info pool1
# ----------------------------------------------------------------------
# 7. Загрузка и распаковка архивов виртуальных дисков
# ----------------------------------------------------------------------
ARCHIVES=(
"VM-603-freeipa.zip"
"VM-603-master.zip"
"VM-603-node1.zip"
"VM-603-node2.zip"
"VM-603-node3.zip"
"VM-603-repo.zip"
"VM-603-stor.zip"
)
# Проверяем наличие архивов в текущем каталоге, если нет – запрашиваем путь
for arch in "${ARCHIVES[@]}"; do
if [[ ! -f "$arch" ]]; then
warn "Архив $arch не найден в текущем каталоге."
read -p "Введите полный путь к архиву $arch (или нажмите Enter, чтобы пропустить): " user_path
if [[ -n "$user_path" && -f "$user_path" ]]; then
# Копируем или используем путь
cp "$user_path" ./ 2>/dev/null || ln -s "$user_path" "./$arch"
else
error "Архив $arch не найден. Скрипт остановлен."
fi
fi
done
# Распаковка в /var/tmp и перемещение в пул
TMP_EXTRACT="/var/tmp"
for arch in "${ARCHIVES[@]}"; do
base="${arch%.zip}"
info "Распаковка $arch в $TMP_EXTRACT"
unzip -q "$arch" -d "$TMP_EXTRACT"
qcow="${base}.qcow2"
if [[ -f "$TMP_EXTRACT/$qcow" ]]; then
mv "$TMP_EXTRACT/$qcow" "$POOL_DIR/"
info "Перемещён $qcow в $POOL_DIR"
else
error "Файл $qcow не найден после распаковки $arch"
fi
done
# ----------------------------------------------------------------------
# 8. Создание дополнительных дисков OSD для узлов
# ----------------------------------------------------------------------
info "Создание дисков OSD размером 96G с preallocation=metadata..."
for node in 1 2 3; do
disk="$POOL_DIR/OSD-node${node}.qcow2"
qemu-img create -f qcow2 -o preallocation=metadata "$disk" 96G
chown "$LOCAL_USER:$LOCAL_USER" "$disk"
done
# ----------------------------------------------------------------------
# 9. Создание доменов виртуальных машин
# ----------------------------------------------------------------------
info "Создание виртуальных машин..."
# Функция для создания ВМ с заданными параметрами
create_vm() {
local name=$1
local disk=$2
local vcpus=$3
local memory=$4
local network=$5
local extra_opts=${6:-}
if virsh -c qemu:///system list --all --name | grep -q "^$name$"; then
warn "ВМ $name уже существует. Пропускаем создание."
return 0
fi
virt-install --connect qemu:///system \
--name "$name" \
--disk path="$disk",cache=none \
--import \
--vcpus "$vcpus" \
--memory "$memory" \
--video virtio \
--os-variant=alse18 \
--network network="$network" \
--graphics=spice \
$extra_opts \
--noautoconsole
}
# Создаём все ВМ согласно инструкции
create_vm "VM-603-freeipa" "$POOL_DIR/VM-603-freeipa.qcow2" 2 4096 "VM-603-1" "--noreboot"
create_vm "VM-603-master" "$POOL_DIR/VM-603-master.qcow2" 4 8192 "VM-603-1" "--noreboot"
create_vm "VM-603-node1" "$POOL_DIR/VM-603-node1.qcow2" 4 10240 "VM-603-1" ""
create_vm "VM-603-node2" "$POOL_DIR/VM-603-node2.qcow2" 4 10240 "VM-603-1" ""
create_vm "VM-603-node3" "$POOL_DIR/VM-603-node3.qcow2" 4 10240 "VM-603-1" ""
create_vm "VM-603-repo" "$POOL_DIR/VM-603-repo.qcow2" 2 4096 "VM-603-1" "--noreboot"
create_vm "VM-603-stor" "$POOL_DIR/VM-603-stor.qcow2" 2 4096 "VM-603-3" "--noreboot"
# ----------------------------------------------------------------------
# 10. Завершение работы узлов (node1, node2, node3) для добавления устройств
# ----------------------------------------------------------------------
info "Остановка ВМ node1, node2, node3 для добавления дополнительных сетей и дисков..."
for node in 1 2 3; do
vm="VM-603-node$node"
if virsh -c qemu:///system list --state-running | grep -q "$vm"; then
virsh -c qemu:///system shutdown "$vm"
# Ждём остановки
timeout=60
while [[ $timeout -gt 0 ]] && virsh -c qemu:///system list --state-running | grep -q "$vm"; do
sleep 2
((timeout-=2))
done
if virsh -c qemu:///system list --state-running | grep -q "$vm"; then
warn "ВМ $vm не остановилась gracefully, принудительно выключаем..."
virsh -c qemu:///system destroy "$vm"
fi
fi
done
# ----------------------------------------------------------------------
# 11. Добавление дополнительных сетевых интерфейсов и дисков
# ----------------------------------------------------------------------
info "Добавление дополнительных сетевых интерфейсов и дисков OSD..."
# Функция для добавления сетевого интерфейса к ВМ
attach_network() {
local vm=$1
local network=$2
# Генерируем MAC-адрес (можно автоматически)
virsh -c qemu:///system attach-interface "$vm" network "$network" --model virtio --config --live 2>/dev/null || \
virsh -c qemu:///system attach-interface "$vm" network "$network" --model virtio --config
}
# Функция для добавления диска к ВМ
attach_disk() {
local vm=$1
local disk_path=$2
virsh -c qemu:///system attach-disk "$vm" "$disk_path" vdb --cache none --subdriver qcow2 --config --live 2>/dev/null || \
virsh -c qemu:///system attach-disk "$vm" "$disk_path" vdb --cache none --subdriver qcow2 --config
}
# Для master добавляем сети VM-603-2 и VM-603-3 (у него уже есть VM-603-1)
attach_network "VM-603-master" "VM-603-2"
attach_network "VM-603-master" "VM-603-3"
# Для каждого узла добавляем три сети (VM-603-1, VM-603-2, VM-603-3)
# При создании уже была одна сеть VM-603-1, поэтому добавим две остальные, но для единообразия добавим все три (если уже есть, то пропустит)
for node in 1 2 3; do
vm="VM-603-node$node"
attach_network "$vm" "VM-603-1"
attach_network "$vm" "VM-603-2"
attach_network "$vm" "VM-603-3"
# Добавляем диск OSD
attach_disk "$vm" "$POOL_DIR/OSD-node${node}.qcow2"
done
# ----------------------------------------------------------------------
# 12. Запуск узлов после добавления устройств
# ----------------------------------------------------------------------
info "Запуск ВМ node1, node2, node3 после добавления устройств..."
for node in 1 2 3; do
vm="VM-603-node$node"
virsh -c qemu:///system start "$vm"
done
# ----------------------------------------------------------------------
# 13. Создание снимков всех ВМ
# ----------------------------------------------------------------------
info "Создание снимков состояния всех виртуальных машин..."
for vm in VM-603-freeipa VM-603-master VM-603-node1 VM-603-node2 VM-603-node3 VM-603-repo VM-603-stor; do
if virsh -c qemu:///system list --all --name | grep -q "^$vm$"; then
virsh -c qemu:///system snapshot-create "$vm"
info "Снимок для $vm создан."
else
warn "ВМ $vm не найдена, снимок не создан."
fi
done
# ----------------------------------------------------------------------
# 14. Завершающие инструкции
# ----------------------------------------------------------------------
info "==================================================="
info "Подготовка рабочего места завершена."
info "После завершения настройки внутри гостевых ОС (NetworkManager) необходимо:"
info " - Войти в каждую ВМ node (логин: astra, пароль: A\$tra1inux2026)"
info " - В апплете NetworkManager привязать соединение net1 к eth0 (или настроить вручную)."
info " - После настройки рекомендуется перезагрузить ВМ."
info " - При необходимости выполните ручную настройку IP-адресов согласно таблице."
info "==================================================="
info "Все виртуальные машины и снимки готовы к работе."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment