Нет сети при запуске виртуальных машин через qemu на Arch хосте.

Вопрос или проблема

Я установил qemu и virt manager на Arch, но продолжаю получать ошибки при установке виртуальных машин:

В системе нет virtbr0 при выполнении ip addr show при первом запуске системы, выполнение virsh net-list –all также ничего не показывает. Я искал решения и нашел, что нужно отключить dnmasq и некоторые другие команды, которые я ввел в chat gpt, чтобы получить сценарий:

#!/bin/bash

# Переменные
NETWORK_XML="/etc/libvirt/qemu/networks/default.xml"
RESOLV_CONF="/etc/resolv.conf"
BRIDGE_NAME="br0"
MAIN_INTERFACE="eth0"  # Замените на ваш основной интерфейс (например, eth0, ens33)

# Функция проверки, работает ли сервис
is_service_running() {
    systemctl is-active --quiet "$1"
}

# Функция остановки конфликтующих сервисов, если они работают
stop_conflicting_services() {
    echo "Проверка конфликтующих сервисов..."

    # Остановка systemd-resolved (если работает)
    if is_service_running systemd-resolved; then
        echo "Остановка systemd-resolved..."
        sudo systemctl stop systemd-resolved
        sudo systemctl disable systemd-resolved
        # Убедиться, что resolv.conf не является символической ссылкой
        sudo rm -f "$RESOLV_CONF"
        echo "nameserver 8.8.8.8" | sudo tee "$RESOLV_CONF" > /dev/null
    fi

    # Проверка, запущен ли dnsmasq (если необходим для libvirt)
    if is_service_running dnsmasq; then
        echo "Остановка конфликтующего dnsmasq..."
        sudo systemctl stop dnsmasq
    fi

    # НЕ отключайте NetworkManager, если это не необходимо
    if is_service_running NetworkManager; then
        echo "NetworkManager работает. Не отключаем его, чтобы избежать отключения."
    fi
}

# Функция создания и определения сети по умолчанию для libvirt
create_default_network() {
    echo "Создание файла default.xml для сети virtbr0..."

    # Создание содержимого default.xml
    cat <<EOF | sudo tee "$NETWORK_XML" > /dev/null
<network>
  <name>default</name>
  <forward mode="nat"/>
  <bridge name="$BRIDGE_NAME"/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.2" end="192.168.122.254"/>
    </dhcp>
  </ip>
</network>
EOF

    # Определение, запуск и активация сети
    sudo virsh net-define "$NETWORK_XML"
    sudo virsh net-start default
    sudo virsh net-autostart default
}

# Функция обеспечения правильного запуска libvirtd
enable_libvirtd() {
    echo "Включение libvirtd для автозапуска..."
    sudo systemctl enable --now libvirtd
}

# Функция создания постоянного моста с использованием systemd-networkd
create_persistent_bridge() {
    echo "Создание постоянного моста с использованием systemd-networkd..."

    # Создание файла конфигурации моста
    sudo bash -c 'cat <<EOF > /etc/systemd/network/10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
EOF'

    sudo bash -c 'cat <<EOF > /etc/systemd/network/10-br0.network
[Match]
Name=br0

[Network]
DHCP=ipv4
EOF'

    # Создание конфигурации интерфейса для добавления основного интерфейса в мост
    sudo bash -c "cat <<EOF > /etc/systemd/network/10-${MAIN_INTERFACE}.network
[Match]
Name=${MAIN_INTERFACE}

[Network]
Bridge=br0
EOF"

    # Перезапуск systemd-networkd для применения изменений
    sudo systemctl restart systemd-networkd
}

# Запуск процесса
stop_conflicting_services
create_default_network
create_persistent_bridge
enable_libvirtd

echo "Конфигурация завершена. Сеть 'default' теперь должна быть активной и установлена на автозапуск."

это как-то решает проблему, теперь я иногда вижу virtbr0 и default при выполнении ip addr show и net-list –all соответственно.

Проблема в том, что если это работает, я могу установить виртуальные машины: я установил как Rocky Linux, который был создан с IP 10.0.5.2 и недоступен при пинге или ssh с хост-машины, так и Debian, который был создан с IP 192.168.122.51 и был доступен. (Я пытался подключиться через ssh, так как пытался написать скрипты установки postgresSQL и хочу, чтобы они работали отдельно от моей хост-машины). Соединения также исчезают кажущемся случайными интервалами, и если я перезапускаю скрипт без перезагрузки машины, он не работает.

Я не очень разбираюсь в сетях и мне нужно знать, как мне сделать эти настройки постоянными, чтобы я мог подключаться к своим виртуальным машинам и как сделать так, чтобы Rocky Linux и другие (будут ли другие дистрибутивы на базе RHEL такими же?) подключались таким образом, чтобы к ним можно было получить доступ.

Ответ или решение

Теория

Вы столкнулись с достаточно распространенной проблемой при использовании QEMU и virt-manager в качестве инструментов для виртуализации на Arch Linux. Во-первых, отсутствие virtbr0 и результата при выполнении команды virsh net-list --all указывает на то, что сетевая конфигурация в libvirt не активирована. Это ограничивает возможность виртуальных машин взаимодействовать с хостовой системой или выходить в Интернет.

Пример

Ваш скрипт пытается автоматически настраивать сеть для libvirt с использованием команд для создания NAT-моста. Основной компонент здесь — создание и активация сети default с использованием virsh. Однако, похоже, что эта сеть иногда не работает или выходит из строя. Вы указали, что Debian-машина получает IP-адрес из корректного диапазона (192.168.122.*), в то время как Rocky Linux получает IP в другом диапазоне (10.0.5.*), что может быть симптомом неправильной конфигурации сети на уровне гостевой системы или libvirt.

Применение

  1. Проверка libvirt: Убедитесь, что демоны libvirtd и virtqemud активны и работают корректно:

    sudo systemctl enable --now libvirtd
    sudo systemctl enable --now virtqemud
  2. Создание и активация сети NAT:

    Убедитесь, что файл конфигурации сети default присутствует и корректен. Созданный вами default.xml должен быть правильно задан:

    <network>
     <name>default</name>
     <forward mode='nat'/>
     <bridge name='virbr0' stp='on' delay='0'/>
     <ip address='192.168.122.1' netmask='255.255.255.0'>
       <dhcp>
         <range start='192.168.122.2' end='192.168.122.254'/>
       </dhcp>
     </ip>
    </network>

    Далее выполните:

    sudo virsh net-define /etc/libvirt/qemu/networks/default.xml
    sudo virsh net-start default
    sudo virsh net-autostart default
  3. Проблемы с соединением:

    • Убедитесь, что файервол на хосте и гостевых системах не блокирует трафик. На хосте:

      sudo firewall-cmd --zone=libvirt --add-interface=virbr0 --permanent
      sudo firewall-cmd --reload
    • Проверьте настройки в файле гостевой системы, например /etc/network/interfaces или файлы сети в /etc/sysconfig/network-scripts/, в зависимости от дистрибутива.

  4. Проблемы с IP-адресами:

    — Rocky Linux возможно неправильно настроен на получение IP-адреса (стационарный IP или другой DHCP сервер). Убедитесь в правильной настройке DHCP на гостевой системе:

    dhclient -v <интерфейс>
  5. Настройка постоянного моста:

    Если вы хотите, чтобы конфигурации были постоянными, рассмотрите использование /etc/netctl или systemd network для управления соединениями без перезапусков ip-addr.

Дополнительные советы

  1. Журналирование: Всегда следите за журналами systemctl и libvirt для выявления и устранения скрытых ошибок:

    sudo journalctl -xe
  2. Обновление системы: Убедитесь, что все пакеты и компоненты актуальны:

    sudo pacman -Syu
  3. Виртуальные сети: Если определенная виртуальная сеть не работает или нестабильна, рассмотрите возможность ее удаления и переопределения:

    sudo virsh net-destroy default
    sudo virsh net-undefine default

Применяя эти шаги, вы должны быть в состоянии создать стабильную и надежную сеть для ваших виртуальных машин, загружаемых через QEMU и virt-manager на Arch Linux.

Оцените материал
Добавить комментарий

Капча загружается...