[elbe-devel] [PATCH 04/37] init: attach open filedescriptors to init domain

Benedikt Spranger b.spranger at linutronix.de
Wed Feb 7 15:28:31 CET 2024


From: Thomas Weißschuh <thomas.weissschuh at linutronix.de>

libvirt can access the disk file through these open filedescriptors.
This removes the need for libvirt to have direct access to the file
which may require loosened permissions on a users homedirectory.

Especially since Debian bookworm the default permissions of home
directories prevent such a direct access from libvirt.

Fixes #391
Signed-off-by: Thomas Weißschuh <thomas.weissschuh at linutronix.de>
[fix hunk in elbepack/init/libvirt.xml.mako]
Signed-off-by: Benedikt Spranger <b.spranger at linutronix.de>
---
 elbepack/init/libvirt.xml.mako |  8 +++++++-
 elbepack/initvmaction.py       | 19 +++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/elbepack/init/libvirt.xml.mako b/elbepack/init/libvirt.xml.mako
index 0b37237b..341d531d 100644
--- a/elbepack/init/libvirt.xml.mako
+++ b/elbepack/init/libvirt.xml.mako
@@ -23,6 +23,7 @@ memory = size_to_int(prj.text('mem', default=defs, key='mem')) // 1024
 
 imagetype = prj.text('img', default=defs, key='img')
 img = os.path.join(opt.directory, 'initvm.img')
+img_base = os.path.join(opt.directory, 'initvm-base.img')
 
 emulator = shutil.which(prj.text('interpreter', default=defs, key='interpreter'))
 nicmac = prj.text('buildimage/NIC/MAC', default=defs, key='nicmac')
@@ -70,8 +71,13 @@ xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
     <memballoon model='none' />
     <disk type='file' device='disk'>
     <driver name='qemu' type='${imagetype}' />
-    <source file='${img}' />
+    <source file='${img}' fdgroup='initvm.img' />
       <target dev='vda' bus='virtio' />
+      <backingStore type='file'>
+        <format type='qcow2'/>
+        <source file='${img_base}' fdgroup='initvm-base.img'/>
+        <backingStore/>
+      </backingStore>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x07'
       function='0x0' />
     </disk>
diff --git a/elbepack/initvmaction.py b/elbepack/initvmaction.py
index 412fe393..b4a37874 100644
--- a/elbepack/initvmaction.py
+++ b/elbepack/initvmaction.py
@@ -153,6 +153,23 @@ class StartAction(InitVMAction):
     def __init__(self, node):
         InitVMAction.__init__(self, node)
 
+    def _attach_disk_fds(self, _initvmdir):
+        # libvirt does not necessarily have permissions to directly access the
+        # image file. libvirt 9.0 provides FDAssociate() to pass an open file
+        # descriptor to libvirt which is used to access files via the context
+        # of the client, which has permissions.
+
+        if not hasattr(self.initvm, 'FDAssociate'):
+            return
+
+        # Use raw unmanaged FDs as libvirt will take full ownership of them.
+        self.initvm.FDAssociate('initvm.img', [
+            os.open(os.path.join(_initvmdir, "initvm.img"), os.O_RDWR),
+        ])
+        self.initvm.FDAssociate('initvm-base.img', [
+            os.open(os.path.join(_initvmdir, "initvm-base.img"), os.O_RDONLY),
+        ])
+
     def execute(self, _initvmdir, _opt, _args):
         import libvirt
 
@@ -160,6 +177,8 @@ class StartAction(InitVMAction):
             print('Initvm already running.')
             sys.exit(20)
         elif self.initvm_state() == libvirt.VIR_DOMAIN_SHUTOFF:
+            self._attach_disk_fds(_initvmdir)
+
             # Domain is shut off. Let's start it!
             self.initvm.create()
             # Wait five seconds for the initvm to boot
-- 
2.43.0



More information about the elbe-devel mailing list