mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-08-27 04:20:14 +03:00
UEFI improvements for Qemu VMs
* Add OVMF firmware directory configuration * Automatically add a Random Number Generator (RNG) device when using uefi option is enabled
This commit is contained in:
parent
a58fa8602b
commit
896b4fc56a
@ -103,6 +103,8 @@ enable_hardware_acceleration = True
|
|||||||
require_hardware_acceleration = False
|
require_hardware_acceleration = False
|
||||||
; Allow unsafe additional command line options
|
; Allow unsafe additional command line options
|
||||||
allow_unsafe_options = False
|
allow_unsafe_options = False
|
||||||
|
; Path to the OVMF firmware directory
|
||||||
|
ovmf_firmware_dir = "/usr/share/OVMF"
|
||||||
|
|
||||||
[VMware]
|
[VMware]
|
||||||
; First vmnet interface of the range that can be managed by the GNS3 server
|
; First vmnet interface of the range that can be managed by the GNS3 server
|
||||||
|
|||||||
@ -35,6 +35,7 @@ import time
|
|||||||
import json
|
import json
|
||||||
import psutil
|
import psutil
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
from gns3server.utils import parse_version, shlex_quote
|
from gns3server.utils import parse_version, shlex_quote
|
||||||
from gns3server.utils.asyncio import subprocess_check_output, cancellable_wait_run_in_executor
|
from gns3server.utils.asyncio import subprocess_check_output, cancellable_wait_run_in_executor
|
||||||
from .qemu_error import QemuError
|
from .qemu_error import QemuError
|
||||||
@ -2057,15 +2058,17 @@ class QemuVM(BaseNode):
|
|||||||
options.extend(["-bios", self._bios_image.replace(",", ",,")])
|
options.extend(["-bios", self._bios_image.replace(",", ",,")])
|
||||||
|
|
||||||
elif self._uefi:
|
elif self._uefi:
|
||||||
|
ovmf_firmware_dir = self._manager.config.get_section_config("Qemu").get("ovmf_firmware_dir", "/usr/share/OVMF")
|
||||||
|
system_ovmf_firmware_dir = Path(ovmf_firmware_dir)
|
||||||
|
log.info("Using OVMF firmware directory: {}".format(system_ovmf_firmware_dir))
|
||||||
old_ovmf_vars_path = os.path.join(self.working_dir, "OVMF_VARS.fd")
|
old_ovmf_vars_path = os.path.join(self.working_dir, "OVMF_VARS.fd")
|
||||||
if os.path.exists(old_ovmf_vars_path):
|
if os.path.exists(old_ovmf_vars_path):
|
||||||
# the node has its own UEFI variables store already, we must also use the old UEFI firmware
|
# the node has its own UEFI variables store already, we must also use the old UEFI firmware
|
||||||
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE.fd")
|
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE.fd")
|
||||||
else:
|
else:
|
||||||
system_ovmf_firmware_path = "/usr/share/OVMF/OVMF_CODE_4M.fd"
|
system_ovmf_firmware_path = next(system_ovmf_firmware_dir.glob("OVMF_CODE_4M.fd", case_sensitive=False), None)
|
||||||
if os.path.exists(system_ovmf_firmware_path):
|
if system_ovmf_firmware_path:
|
||||||
ovmf_firmware_path = system_ovmf_firmware_path
|
ovmf_firmware_path = str(system_ovmf_firmware_path)
|
||||||
else:
|
else:
|
||||||
# otherwise, get the UEFI firmware from the images directory
|
# otherwise, get the UEFI firmware from the images directory
|
||||||
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE_4M.fd")
|
ovmf_firmware_path = self.manager.get_abs_image_path("OVMF_CODE_4M.fd")
|
||||||
@ -2074,9 +2077,9 @@ class QemuVM(BaseNode):
|
|||||||
options.extend(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_firmware_path)])
|
options.extend(["-drive", "if=pflash,format=raw,readonly,file={}".format(ovmf_firmware_path)])
|
||||||
|
|
||||||
# try to use the UEFI variables store from the system first
|
# try to use the UEFI variables store from the system first
|
||||||
system_ovmf_vars_path = "/usr/share/OVMF/OVMF_VARS_4M.fd"
|
system_ovmf_vars_path = next(system_ovmf_firmware_dir.glob("OVMF_VARS_4M.fd", case_sensitive=False), None)
|
||||||
if os.path.exists(system_ovmf_vars_path):
|
if system_ovmf_vars_path:
|
||||||
ovmf_vars_path = system_ovmf_vars_path
|
ovmf_vars_path = str(system_ovmf_vars_path)
|
||||||
else:
|
else:
|
||||||
# otherwise, get the UEFI variables store from the images directory
|
# otherwise, get the UEFI variables store from the images directory
|
||||||
ovmf_vars_path = self.manager.get_abs_image_path("OVMF_VARS_4M.fd")
|
ovmf_vars_path = self.manager.get_abs_image_path("OVMF_VARS_4M.fd")
|
||||||
@ -2092,6 +2095,10 @@ class QemuVM(BaseNode):
|
|||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise QemuError("Cannot copy OVMF_VARS_4M.fd file to the node working directory: {}".format(e))
|
raise QemuError("Cannot copy OVMF_VARS_4M.fd file to the node working directory: {}".format(e))
|
||||||
options.extend(["-drive", "if=pflash,format=raw,file={}".format(ovmf_vars_node_path)])
|
options.extend(["-drive", "if=pflash,format=raw,file={}".format(ovmf_vars_node_path)])
|
||||||
|
|
||||||
|
# edk2 firmware requires a Random Number Generator (RNG) device in order to turn network adapters on
|
||||||
|
options.extend(["-object", "rng-random,filename=/dev/urandom,id=rng0 "])
|
||||||
|
options.extend(["-device", "virtio-rng-pci,rng=rng0"])
|
||||||
return options
|
return options
|
||||||
|
|
||||||
def _linux_boot_options(self):
|
def _linux_boot_options(self):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user