[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