[lxc-devel] [lxd/master] Add support for aarch64 VMs
stgraber on Github
lxc-bot at linuxcontainers.org
Fri Nov 22 19:49:06 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191122/38c2fce3/attachment.bin>
-------------- next part --------------
From dc59d48749631cccb1cc7f1cdd3e2b4ca80df69f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 22 Nov 2019 01:14:09 -0500
Subject: [PATCH 1/2] lxd/vm: Add support for aarch64
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/vm_qemu.go | 53 +++++++++++++++++++++++++++++++++-----------------
1 file changed, 35 insertions(+), 18 deletions(-)
diff --git a/lxd/vm_qemu.go b/lxd/vm_qemu.go
index 3e6bd600bb..b1b2d5b192 100644
--- a/lxd/vm_qemu.go
+++ b/lxd/vm_qemu.go
@@ -540,18 +540,24 @@ func (vm *vmQemu) Start(stateful bool) error {
devConfs = append(devConfs, runConf)
}
- confFile, err := vm.generateQemuConfigFile(devConfs)
+ // Get qemu configuration
+ qemuBinary, qemuType, qemuConfig, err := vm.qemuArchConfig()
+ if err != nil {
+ return err
+ }
+
+ confFile, err := vm.generateQemuConfigFile(qemuType, qemuConfig, devConfs)
if err != nil {
return err
}
// Check qemu is installed.
- _, err = exec.LookPath("qemu-system-x86_64")
+ _, err = exec.LookPath(qemuBinary)
if err != nil {
return err
}
- _, err = shared.RunCommand("qemu-system-x86_64", "-name", vm.Name(), "-uuid", vmUUID, "-daemonize", "-cpu", "host", "-nographic", "-serial", "chardev:console", "-nodefaults", "-readconfig", confFile, "-pidfile", vm.pidFilePath())
+ _, err = shared.RunCommand(qemuBinary, "-name", vm.Name(), "-uuid", vmUUID, "-daemonize", "-cpu", "host", "-nographic", "-serial", "chardev:console", "-nodefaults", "-readconfig", confFile, "-pidfile", vm.pidFilePath())
if err != nil {
return err
}
@@ -559,6 +565,27 @@ func (vm *vmQemu) Start(stateful bool) error {
return nil
}
+func (vm *vmQemu) qemuArchConfig() (string, string, string, error) {
+ if vm.architecture == osarch.ARCH_64BIT_INTEL_X86 {
+ conf := `
+[global]
+driver = "ICH9-LPC"
+property = "disable_s3"
+value = "1"
+
+[global]
+driver = "ICH9-LPC"
+property = "disable_s4"
+value = "1"
+`
+ return "qemu-system-x86_64", "q35", conf, nil
+ } else if vm.architecture == osarch.ARCH_64BIT_ARMV8_LITTLE_ENDIAN {
+ return "qemu-system-aarch64", "virt", "", nil
+ }
+
+ return "", "", "", fmt.Errorf("Architecture isn't supported for virtual machines")
+}
+
// deviceVolatileGetFunc returns a function that retrieves a named device's volatile config and
// removes its device prefix from the keys.
func (vm *vmQemu) deviceVolatileGetFunc(devName string) func() map[string]string {
@@ -887,29 +914,19 @@ echo "To start it now, unmount this filesystem and run: systemctl start lxd-agen
// generateQemuConfigFile writes the qemu config file and returns its location.
// It writes the config file inside the VM's log path.
-func (vm *vmQemu) generateQemuConfigFile(devConfs []*deviceConfig.RunConfig) (string, error) {
+func (vm *vmQemu) generateQemuConfigFile(qemuType string, qemuConf string, devConfs []*deviceConfig.RunConfig) (string, error) {
var sb *strings.Builder = &strings.Builder{}
// Base config. This is common for all VMs and has no variables in it.
- sb.WriteString(`
+ sb.WriteString(fmt.Sprintf(`
# Machine
[machine]
graphics = "off"
-type = "q35"
+type = "%s"
accel = "kvm"
usb = "off"
graphics = "off"
-
-[global]
-driver = "ICH9-LPC"
-property = "disable_s3"
-value = "1"
-
-[global]
-driver = "ICH9-LPC"
-property = "disable_s4"
-value = "1"
-
+%s
[boot-opts]
strict = "on"
@@ -969,7 +986,7 @@ addr = "0x0"
# Console
[chardev "console"]
backend = "pty"
-`)
+`, qemuType, qemuConf))
// Now add the dynamic parts of the config.
err := vm.addMemoryConfig(sb)
From 1062bd93910820f4aabb80dca97e92034aa8ce60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 22 Nov 2019 12:41:12 -0500
Subject: [PATCH 2/2] api: Add virtual-machines API extension
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
doc/api-extensions.md | 3 +++
shared/version/api.go | 1 +
2 files changed, 4 insertions(+)
diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index a9eca7d47c..9031630d42 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -883,3 +883,6 @@ redirect filesystem mounts to their fuse implementation. To this end, set e.g.
## container\_disk\_ceph
This allows for existing a CEPH RDB or FS to be directly connected to a LXD container.
+
+## virtual\_machines
+Add virtual machine support.
diff --git a/shared/version/api.go b/shared/version/api.go
index 2f57e00682..1afdc1b2d0 100644
--- a/shared/version/api.go
+++ b/shared/version/api.go
@@ -178,6 +178,7 @@ var APIExtensions = []string{
"container_nic_routed",
"container_syscall_intercept_mount_fuse",
"container_disk_ceph",
+ "virtual-machines",
}
// APIExtensionsCount returns the number of available API extensions.
More information about the lxc-devel
mailing list