Created
July 13, 2026 09:16
-
-
Save dmi3mis/e18a07bf72d76fbfd2b0241c08d0c460 to your computer and use it in GitHub Desktop.
Скрипт подготовки рабочего места для курса VM-603
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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