Как запустить виртуальную машину qemu в фоновом режиме (это означает, что она должна работать между процессами, но на экране ничего не должно отображаться).

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

Я хотел бы запустить виртуальную машину qemu, которая, как вы видите ниже, работает между процессами, поэтому я не хочу видеть ни монитора, ни графического интерфейса, ни терминального окна, ничего не должно отображаться на экране.

/usr/local/bin/qemu-system-x86_64 -machine q35 \
-cpu kvm64,hv_relaxed,hv_time,hv_synic -m 1G -nographic \ 
-drive file=Debian-warp.img,format=raw -rtc base=localtime \
-device usb-ehci,id=usb,bus=pcie.0,addr=0x3 -device usb-tablet \
-device usb-kbd -smbios type=2 -nodefaults \
-netdev tap,id=mynet0,ifname=tap20,script=no,downscript=no \
-device e1000,netdev=mynet0,mac=52:55:00:d1:55:01 \
-device ich9-ahci,id=sata \
-drive if=pflash,format=raw,readonly=on,file=/usr/local/share/edk2-qemu/QEMU_UEFI_CODE-x86_64.fd \
-drive if=pflash,format=raw,file=/usr/local/share/edk2-qemu/QEMU_UEFI_VARS-x86_64.fd

Я попробовал передать параметр -nographic: он способен поставить виртуальную машину в фоновый режим, но я не могу пинговать IP-адрес, назначенный Debian, так что что-то не работает внутри виртуальной машины. Вместо этого ниже вы видите, что происходит, если я использую параметр -daemonize:

скриншот

это создает две проблемы: 1) он не пингует и 2) я вижу это маленькое окно в верхнем левом углу экрана, которое я не хочу видеть.

Эта виртуальная машина основана на Debian 12 и запускается с помощью менеджера grub. Она ждет 3 секунды, и если клавиши не нажимаются, она загружает операционную систему. Я настроил автоматический вход пользователя, поэтому, когда он аутентифицирован, автоматически выполняется скрипт ниже:

function jumpto
{
label=$1

cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$') 

eval "$cmd"       

exit
}

start=${1:-"start"}

jumpto $start

start:

warp-cli disconnect

OLD_IP="$(curl -s api.ipify.org)"

sudo iptables -A POSTROUTING -t nat -s 192.168.1.5 -j

MASQUERADE

warp-cli connect

NEW_IP="$(curl -s api.ipify.org)"

echo Подключено к Cloudflare Warp...echo СТАРЫЙ IP - $OLD_IP ,

НОВЫЙ IP - $NEW_IP

mid :

if [ "$OLD_IP = $NEW_IP" ]

then

echo СТАРЫЙ IP - $OLD_IP , НОВЫЙ IP - $NEW_IP : он больше не работает,

переподключение...

sleep 10

jump foo

else

echo СТАРЫЙ IP - $OLD_IP , НОВЫЙ IP - $NEW_IP : он все еще работает.

sleep 10

fi

jumpto mid

foo:

warp-cli disconnect

OLD_IP="$(curl -s api.ipify.org)"

warp-cli connect

NEW_IP="$(curl -s api.ipify.org)"echo СТАРЫЙ IP - $OLD_IP ,

НОВЫЙ IP - $NEW_IP : он снова работает.

jumpto mid

Если вместо -nographic я использую -vga std, виртуальная машина работает должным образом, но это не то, что я хочу. Я хочу, чтобы виртуальная машина работала скрыто.

2

Похоже, это работает для меня:

qemu ... -nographic -serial none -monitor none &

Но я, вероятно, вместо этого использовал бы сетевая последовательная консоль, чтобы я все еще мог получить доступ к консоли, если это необходимо:

qemu ... -nographic -serial tcp:127.0.0.1:1234,server=on,wait=off -monitor none &

Спасибо большое, Larsks. Я именно искал способ запустить ВМ с QEMU в фоновом режиме и не мог его найти. У меня хорошо сработало “qemu … -nographic -serial none -monitor none &”. Мне не удалось заставить это работать с “-daemon”.

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

Чтобы запустить виртуальную машину (VM) QEMU в фоновом режиме без отображения графического интерфейса или терминалов, необходимо использовать параметры командной строки, которые обеспечивают скрытое выполнение VM. Данная задача может быть решена несколькими способами, и я предложу вам наиболее эффективный и безопасный метод.

Способы запуска QEMU VM в фоновом режиме

  1. Использование параметров -nographic, -serial none и -monitor none:
    Данные параметры позволяют отключить любые графические выходы, последовательные порты и консольные мониторы. Пример команды будет выглядеть следующим образом:

    /usr/local/bin/qemu-system-x86_64 -machine q35 \
    -cpu kvm64,hv_relaxed,hv_time,hv_synic -m 1G -nographic \
    -serial none -monitor none \
    -drive file=Debian-warp.img,format=raw -rtc base=localtime \
    -device usb-ehci,id=usb,bus=pcie.0,addr=0x3 -device usb-tablet \
    -device usb-kbd -smbios type=2 -nodefaults \
    -netdev tap,id=mynet0,ifname=tap20,script=no,downscript=no \
    -device e1000,netdev=mynet0,mac=52:55:00:d1:55:01 \
    -device ich9-ahci,id=sata \
    -drive if=pflash,format=raw,readonly=on,file=/usr/local/share/edk2-qemu/QEMU_UEFI_CODE-x86_64.fd \
    -drive if=pflash,format=raw,file=/usr/local/share/edk2-qemu/QEMU_UEFI_VARS-x86_64.fd &

    При этом:

    • -nographic отключает графический интерфейс и использует только текстовый вывод.
    • -serial none отключает последовательные порты.
    • -monitor none отключает монитор QEMU, что позволяет избежать появления ненужного окна.
  2. Запуск с сетевым последовательным портом:
    Если вам необходимо сохранить возможность доступа к консоли виртуальной машины, вы можете использовать сетевой последовательный порт. Это позволит вам подключаться к VM через TCP. Например:

    /usr/local/bin/qemu-system-x86_64 -machine q35 \
    -cpu kvm64,hv_relaxed,hv_time,hv_synic -m 1G -nographic \
    -serial tcp:127.0.0.1:1234,server=on,wait=off -monitor none \
    -drive file=Debian-warp.img,format=raw -rtc base=localtime \
    -device usb-ehci,id=usb,bus=pcie.0,addr=0x3 -device usb-tablet \
    -device usb-kbd -smbios type=2 -nodefaults \
    -netdev tap,id=mynet0,ifname=tap20,script=no,downscript=no \
    -device e1000,netdev=mynet0,mac=52:55:00:d1:55:01 \
    -device ich9-ahci,id=sata \
    -drive if=pflash,format=raw,readonly=on,file=/usr/local/share/edk2-qemu/QEMU_UEFI_CODE-x86_64.fd \
    -drive if=pflash,format=raw,file=/usr/local/share/edk2-qemu/QEMU_UEFI_VARS-x86_64.fd &

    Здесь вы сможете подключиться к порту 1234 с помощью telnet или другого клиента, чтобы получить доступ к консоли, не выводя никаких окон на экран.

Заключение

Эти методы позволяют вам запустить вашу виртуальную машину QEMU в фоновом режиме без графических или терминальных интерфейсов. Выбор между отключением всех интерфейсов и использованием сетевого последовательного порта зависит от ваших потребностей в доступе к консоли. Первый метод требует менее сложной настройки, в то время как второй обеспечивает более гибкий доступ к VM.

Если у вас возникли дополнительные вопросы или нужна помощь с настройкой, не стесняйтесь обращаться!

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

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