[lxc-devel] [lxd/master] virtio-fs fixes

monstermunchkin on Github lxc-bot at linuxcontainers.org
Fri Oct 30 11:02:29 UTC 2020


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/20201030/8e153f2b/attachment-0001.bin>
-------------- next part --------------
From 6d6aa4316fab5a127073cbbdfb9a807aa7007853 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Fri, 30 Oct 2020 11:02:37 +0100
Subject: [PATCH 1/3] lxd/instance/drivers: Issue warning if virtiofsd is
 missing

Issue a warning instead of failing, if virtiofsd is missing.

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 lxd/instance/drivers/driver_qemu.go | 74 +++++++++++++++--------------
 1 file changed, 39 insertions(+), 35 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 8b59e1ea5b..17dfa3c246 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -884,37 +884,37 @@ func (vm *qemu) Start(stateful bool) error {
 		}
 	}
 
-	if cmd == "" {
-		return fmt.Errorf("Required binary 'virtiofsd' couldn't be found")
-	}
+	if cmd != "" {
+		// Start the virtiofsd process in non-daemon mode.
+		proc, err := subprocess.NewProcess(cmd, []string{fmt.Sprintf("--socket-path=%s", sockPath), "-o", fmt.Sprintf("source=%s", filepath.Join(vm.Path(), "config"))}, "", "")
+		if err != nil {
+			return err
+		}
 
-	// Start the virtiofsd process in non-daemon mode.
-	proc, err := subprocess.NewProcess(cmd, []string{fmt.Sprintf("--socket-path=%s", sockPath), "-o", fmt.Sprintf("source=%s", filepath.Join(vm.Path(), "config"))}, "", "")
-	if err != nil {
-		return err
-	}
+		err = proc.Start()
+		if err != nil {
+			return err
+		}
 
-	err = proc.Start()
-	if err != nil {
-		return err
-	}
+		revert.Add(func() { proc.Stop() })
 
-	revert.Add(func() { proc.Stop() })
+		pidPath := filepath.Join(vm.LogPath(), "virtiofsd.pid")
 
-	pidPath := filepath.Join(vm.LogPath(), "virtiofsd.pid")
+		err = proc.Save(pidPath)
+		if err != nil {
+			return err
+		}
 
-	err = proc.Save(pidPath)
-	if err != nil {
-		return err
-	}
+		// Wait for socket file to exist
+		for i := 0; i < 10; i++ {
+			if shared.PathExists(sockPath) {
+				break
+			}
 
-	// Wait for socket file to exist
-	for i := 0; i < 10; i++ {
-		if shared.PathExists(sockPath) {
-			break
+			time.Sleep(50 * time.Millisecond)
 		}
-
-		time.Sleep(50 * time.Millisecond)
+	} else {
+		logger.Warn("Unable to use virtio-fs for config drive, using 9p as a fallback: virtiofsd missing")
 	}
 
 	// Setup background process.
@@ -1898,18 +1898,22 @@ func (vm *qemu) generateQemuConfigFile(busName string, devConfs []*deviceConfig.
 		return "", err
 	}
 
-	devBus, devAddr, multi = bus.allocate(busFunctionGroup9p)
-	err = qemuDriveConfig.Execute(sb, map[string]interface{}{
-		"bus":           bus.name,
-		"devBus":        devBus,
-		"devAddr":       devAddr,
-		"multifunction": multi,
-		"protocol":      "virtio-fs",
+	sockPath := filepath.Join(vm.LogPath(), "virtio-fs.config.sock")
 
-		"path": filepath.Join(vm.LogPath(), "virtio-fs.config.sock"),
-	})
-	if err != nil {
-		return "", err
+	if shared.PathExists(sockPath) {
+		devBus, devAddr, multi = bus.allocate(busFunctionGroup9p)
+		err = qemuDriveConfig.Execute(sb, map[string]interface{}{
+			"bus":           bus.name,
+			"devBus":        devBus,
+			"devAddr":       devAddr,
+			"multifunction": multi,
+			"protocol":      "virtio-fs",
+
+			"path": sockPath,
+		})
+		if err != nil {
+			return "", err
+		}
 	}
 
 	devBus, devAddr, multi = bus.allocate(busFunctionGroupNone)

From 5254f369911c7d12042e070ece5ce3c1104c13b3 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Fri, 30 Oct 2020 11:03:04 +0100
Subject: [PATCH 2/3] lxd/device: Issue warning if virtiofsd is missing

Issue a warning instead of failing, if virtiofsd is missing.

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 lxd/device/disk.go | 48 +++++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/lxd/device/disk.go b/lxd/device/disk.go
index b20ac4a2ed..92e9c6b598 100644
--- a/lxd/device/disk.go
+++ b/lxd/device/disk.go
@@ -573,37 +573,37 @@ func (d *disk) startVM() (*deviceConfig.RunConfig, error) {
 					}
 				}
 
-				if cmd == "" {
-					return nil, fmt.Errorf("Required binary 'virtiofsd' couldn't be found")
-				}
+				if cmd != "" {
+					// Start the virtiofsd process in non-daemon mode.
+					proc, err := subprocess.NewProcess(cmd, []string{fmt.Sprintf("--socket-path=%s", sockPath), "-o", fmt.Sprintf("source=%s", srcPath)}, logPath, logPath)
+					if err != nil {
+						return nil, err
+					}
 
-				// Start the virtiofsd process in non-daemon mode.
-				proc, err := subprocess.NewProcess(cmd, []string{fmt.Sprintf("--socket-path=%s", sockPath), "-o", fmt.Sprintf("source=%s", srcPath)}, logPath, logPath)
-				if err != nil {
-					return nil, err
-				}
+					err = proc.Start()
+					if err != nil {
+						return nil, errors.Wrapf(err, "Failed to start virtiofsd for device %q", d.name)
+					}
 
-				err = proc.Start()
-				if err != nil {
-					return nil, errors.Wrapf(err, "Failed to start virtiofsd for device %q", d.name)
-				}
+					revert.Add(func() { proc.Stop() })
 
-				revert.Add(func() { proc.Stop() })
+					pidPath := filepath.Join(d.inst.DevicesPath(), fmt.Sprintf("virtio-fs.%s.pid", d.name))
 
-				pidPath := filepath.Join(d.inst.DevicesPath(), fmt.Sprintf("virtio-fs.%s.pid", d.name))
+					err = proc.Save(pidPath)
+					if err != nil {
+						return nil, errors.Wrapf(err, "Failed to save virtiofsd state for device %q", d.name)
+					}
 
-				err = proc.Save(pidPath)
-				if err != nil {
-					return nil, errors.Wrapf(err, "Failed to save virtiofsd state for device %q", d.name)
-				}
+					// Wait for socket file to exist
+					for i := 0; i < 10; i++ {
+						if shared.PathExists(sockPath) {
+							break
+						}
 
-				// Wait for socket file to exist
-				for i := 0; i < 10; i++ {
-					if shared.PathExists(sockPath) {
-						break
+						time.Sleep(50 * time.Millisecond)
 					}
-
-					time.Sleep(50 * time.Millisecond)
+				} else {
+					logger.Warnf("Unable to use virtio-fs for device %q, using 9p as a fallback: virtiofsd missing", d.name)
 				}
 			}
 

From 0281f7f66e460c5ad93c228e8fc2ec3910bf93ab Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Fri, 30 Oct 2020 12:00:37 +0100
Subject: [PATCH 3/3] lxd/instance/drivers: Fix lxd-agent systemd unit
 conditions

This fixes the lxd-agent mount service files, so that the 9p fallback
actually works.

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 lxd/instance/drivers/driver_qemu.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 17dfa3c246..cbe3770793 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -1465,7 +1465,7 @@ Documentation=https://linuxcontainers.org/lxd
 ConditionPathExists=/dev/virtio-ports/org.linuxcontainers.lxd
 After=local-fs.target lxd-agent-virtiofs.service
 DefaultDependencies=no
-ConditionPathExists=!/run/lxd_config/drive
+ConditionPathIsMountPoint=!/run/lxd_config/drive
 
 [Service]
 Type=oneshot
@@ -1491,7 +1491,7 @@ ConditionPathExists=/dev/virtio-ports/org.linuxcontainers.lxd
 After=local-fs.target
 Before=lxd-agent-9p.service
 DefaultDependencies=no
-ConditionPathExists=!/run/lxd_config/drive
+ConditionPathIsMountPoint=!/run/lxd_config/drive
 
 [Service]
 Type=oneshot


More information about the lxc-devel mailing list