]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Move creation of context.root out of Context() 2967/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 22 Aug 2024 11:42:20 +0000 (13:42 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 22 Aug 2024 12:52:17 +0000 (14:52 +0200)
On btrfs systems, we're unnecessarily creating a subvolume only to
remove it again immediately afterwards if we're building from a cached
image. So let's move the creation of root outside of Context() so
we can only create it as a subvolume after we've potentially checked
caches first.

mkosi/__init__.py
mkosi/context.py

index 68917f5d2f346534062c465ca9f821e7ac9ce222..9cc374e7aa9d19b1c276a5590703399b0432a7d1 100644 (file)
@@ -89,7 +89,7 @@ from mkosi.sandbox import (
     unshare,
     userns_has_single_user,
 )
-from mkosi.tree import copy_tree, move_tree, rmtree
+from mkosi.tree import copy_tree, make_tree, move_tree, rmtree
 from mkosi.types import PathString
 from mkosi.user import INVOKING_USER
 from mkosi.util import (
@@ -3877,6 +3877,19 @@ def createrepo(context: Context) -> Iterator[None]:
                 context.config.distribution.createrepo(context)
 
 
+def make_rootdir(context: Context) -> None:
+    if context.root.exists():
+        return
+
+    with umask(~0o755):
+        # Using a btrfs subvolume as the upperdir in an overlayfs results in EXDEV so make sure we create
+        # the root directory as a regular directory if the Overlay= option is enabled.
+        if context.config.overlay:
+            context.root.mkdir()
+        else:
+            make_tree(context.root, use_subvolumes=context.config.use_subvolumes, sandbox=context.sandbox)
+
+
 def build_image(context: Context) -> None:
     manifest = Manifest(context) if context.config.manifest_format else None
 
@@ -3885,6 +3898,8 @@ def build_image(context: Context) -> None:
     with mount_base_trees(context):
         install_base_trees(context)
         cached = reuse_cache(context)
+        make_rootdir(context)
+
         wantrepo = (
             (
                 not cached
@@ -4618,6 +4633,7 @@ def run_sync(args: Args, config: Config, *, resources: Path) -> None:
             resources=resources,
             package_cache_dir=config.package_cache_dir_or_default(),
         )
+        context.root.mkdir(mode=0o755)
 
         install_package_manager_trees(context)
         context.config.distribution.setup(context)
index 852fe756fdd94d20dbeee275391359728c3cf0de..dd575e5217fea26ae94fef76bc8a17cb80a79712 100644 (file)
@@ -6,8 +6,6 @@ from pathlib import Path
 from typing import Optional
 
 from mkosi.config import Args, Config
-from mkosi.sandbox import umask
-from mkosi.tree import make_tree
 from mkosi.types import PathString
 
 
@@ -30,20 +28,8 @@ class Context:
         self.resources = resources
         self.package_cache_dir = package_cache_dir or (self.root / "var")
         self.package_dir = package_dir or (self.workspace / "packages")
-        self.package_dir.mkdir(exist_ok=True)
-
-        with umask(~0o755):
-            # Using a btrfs subvolume as the upperdir in an overlayfs results in EXDEV so make sure we create
-            # the root directory as a regular directory if the Overlay= option is enabled.
-            if config.overlay:
-                self.root.mkdir()
-            else:
-                make_tree(
-                    self.root,
-                    use_subvolumes=self.config.use_subvolumes,
-                    sandbox=config.sandbox,
-                )
 
+        self.package_dir.mkdir(exist_ok=True)
         self.staging.mkdir()
         self.pkgmngr.mkdir()
         self.repository.mkdir()