[lxc-devel] [lxd/master] lxd/virtiofs: Fix handling of config drive

stgraber on Github lxc-bot at linuxcontainers.org
Mon Nov 2 20:32:15 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 354 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20201102/822a8bb4/attachment.bin>
-------------- next part --------------
From df7fface1c16a688d9c86d3ca4dfd1e2e5c803ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 2 Nov 2020 15:31:59 -0500
Subject: [PATCH] lxd/virtiofs: Fix handling of config drive
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/device/disk.go                  |  6 +-
 lxd/instance/drivers/driver_qemu.go | 97 +++++++++++++++--------------
 2 files changed, 56 insertions(+), 47 deletions(-)

diff --git a/lxd/device/disk.go b/lxd/device/disk.go
index 92e9c6b598..da3f862a68 100644
--- a/lxd/device/disk.go
+++ b/lxd/device/disk.go
@@ -595,13 +595,17 @@ func (d *disk) startVM() (*deviceConfig.RunConfig, error) {
 					}
 
 					// Wait for socket file to exist
-					for i := 0; i < 10; i++ {
+					for i := 0; i < 20; i++ {
 						if shared.PathExists(sockPath) {
 							break
 						}
 
 						time.Sleep(50 * time.Millisecond)
 					}
+
+					if !shared.PathExists(sockPath) {
+						return nil, fmt.Errorf("virtiofsd failed to bind socket within 2s")
+					}
 				} else {
 					logger.Warnf("Unable to use virtio-fs for device %q, using 9p as a fallback: virtiofsd missing", d.name)
 				}
diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index cbe3770793..a05c27b9cd 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -699,6 +699,7 @@ func (vm *qemu) Start(stateful bool) error {
 		return err
 	}
 
+	// Create all needed paths.
 	err = os.MkdirAll(vm.LogPath(), 0700)
 	if err != nil {
 		op.Done(err)
@@ -717,6 +718,56 @@ func (vm *qemu) Start(stateful bool) error {
 		return err
 	}
 
+	// Setup virtiofsd for config path.
+	sockPath := filepath.Join(vm.LogPath(), "virtio-fs.config.sock")
+
+	// Remove old socket if needed.
+	os.Remove(sockPath)
+
+	cmd, err := exec.LookPath("virtiofsd")
+	if err != nil {
+		if shared.PathExists("/usr/lib/qemu/virtiofsd") {
+			cmd = "/usr/lib/qemu/virtiofsd"
+		}
+	}
+
+	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
+		}
+
+		err = proc.Start()
+		if err != nil {
+			return err
+		}
+
+		revert.Add(func() { proc.Stop() })
+
+		pidPath := filepath.Join(vm.LogPath(), "virtiofsd.pid")
+
+		err = proc.Save(pidPath)
+		if err != nil {
+			return err
+		}
+
+		// Wait for socket file to exist
+		for i := 0; i < 20; i++ {
+			if shared.PathExists(sockPath) {
+				break
+			}
+
+			time.Sleep(50 * time.Millisecond)
+		}
+
+		if !shared.PathExists(sockPath) {
+			return fmt.Errorf("virtiofsd failed to bind socket within 1s")
+		}
+	} else {
+		logger.Warn("Unable to use virtio-fs for config drive, using 9p as a fallback: virtiofsd missing")
+	}
+
 	// Get a UUID for Qemu.
 	vmUUID := vm.localConfig["volatile.vm.uuid"]
 	if vmUUID == "" {
@@ -872,51 +923,6 @@ func (vm *qemu) Start(stateful bool) error {
 		forkLimitsCmd = append(forkLimitsCmd, fmt.Sprintf("fd=%d", 3+i))
 	}
 
-	sockPath := filepath.Join(vm.LogPath(), "virtio-fs.config.sock")
-
-	// Remove old socket if needed.
-	os.Remove(sockPath)
-
-	cmd, err := exec.LookPath("virtiofsd")
-	if err != nil {
-		if shared.PathExists("/usr/lib/qemu/virtiofsd") {
-			cmd = "/usr/lib/qemu/virtiofsd"
-		}
-	}
-
-	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
-		}
-
-		err = proc.Start()
-		if err != nil {
-			return err
-		}
-
-		revert.Add(func() { proc.Stop() })
-
-		pidPath := filepath.Join(vm.LogPath(), "virtiofsd.pid")
-
-		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
-			}
-
-			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.
 	p, err := subprocess.NewProcess(vm.state.OS.ExecPath, append(forkLimitsCmd, qemuCmd...), vm.EarlyLogFilePath(), vm.EarlyLogFilePath())
 	if err != nil {
@@ -1899,7 +1905,6 @@ func (vm *qemu) generateQemuConfigFile(busName string, devConfs []*deviceConfig.
 	}
 
 	sockPath := filepath.Join(vm.LogPath(), "virtio-fs.config.sock")
-
 	if shared.PathExists(sockPath) {
 		devBus, devAddr, multi = bus.allocate(busFunctionGroup9p)
 		err = qemuDriveConfig.Execute(sb, map[string]interface{}{


More information about the lxc-devel mailing list