]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
qemu: Become root when copying for Ephemeral=
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 7 Dec 2023 21:49:16 +0000 (22:49 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 8 Dec 2023 11:08:36 +0000 (12:08 +0100)
To copy the directory, we need to be root (either real or in the
user namespace), so let's do just that.

mkosi/qemu.py

index 07d20a33f38bad2e78ffd31a9a203075a7d27b93..512d709d1129e70d9b583e0ac817c5acc15931d3 100644 (file)
@@ -33,7 +33,14 @@ from mkosi.config import (
 )
 from mkosi.log import die
 from mkosi.partition import finalize_root, find_partitions
-from mkosi.run import MkosiAsyncioThread, become_root, find_binary, run, spawn
+from mkosi.run import (
+    MkosiAsyncioThread,
+    become_root,
+    find_binary,
+    fork_and_wait,
+    run,
+    spawn,
+)
 from mkosi.tree import copy_tree, rmtree
 from mkosi.types import PathString
 from mkosi.util import INVOKING_USER, StrEnum
@@ -407,10 +414,26 @@ def copy_ephemeral(config: MkosiConfig, src: Path) -> Iterator[Path]:
     tmp = src.parent / f"{src.name}-{uuid.uuid4().hex}"
 
     try:
-        copy_tree(src, tmp, use_subvolumes=config.use_subvolumes)
+        def copy() -> None:
+            if config.output_format == OutputFormat.directory:
+                become_root()
+
+            copy_tree(
+                src, tmp,
+                preserve_owner=config.output_format == OutputFormat.directory,
+                use_subvolumes=config.use_subvolumes
+            )
+
+        fork_and_wait(copy)
         yield tmp
     finally:
-        rmtree(tmp)
+        def rm() -> None:
+            if config.output_format == OutputFormat.directory:
+                become_root()
+
+            rmtree(tmp)
+
+        fork_and_wait(rm)
 
 
 def qemu_version(config: MkosiConfig) -> GenericVersion: