]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Use a separate workdir for each overlay mount
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 27 Jun 2023 13:05:31 +0000 (15:05 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 2 Jul 2023 17:15:12 +0000 (19:15 +0200)
mkosi/__init__.py
mkosi/mounts.py
mkosi/state.py

index 3972b0f22d0b82d04bb46924d2db1aa9a66f7dee..b108d1658c1e0d8b94c25a8d7701f622b791cf51 100644 (file)
@@ -81,7 +81,7 @@ def mount_image(state: MkosiState) -> Iterator[None]:
                 else:
                     die(f"Unsupported base tree source {path}")
 
-            stack.enter_context(mount_overlay(bases, state.root, state.workdir, state.root, read_only=False))
+            stack.enter_context(mount_overlay(bases, state.root, state.root, read_only=False))
 
         yield
 
@@ -273,7 +273,7 @@ def mount_cache_overlay(state: MkosiState) -> Iterator[None]:
     d = state.workspace / "cache-overlay"
     d.mkdir(mode=0o755, exist_ok=True)
 
-    with mount_overlay([state.root], d, state.workdir, state.root, read_only=False):
+    with mount_overlay([state.root], d, state.root, read_only=False):
         yield
 
 
@@ -281,7 +281,7 @@ def mount_build_overlay(state: MkosiState, read_only: bool = False) -> ContextMa
     d = state.workspace / "build-overlay"
     if not d.is_symlink():
         d.mkdir(mode=0o755, exist_ok=True)
-    return mount_overlay([state.root], state.workspace.joinpath("build-overlay"), state.workdir, state.root, read_only)
+    return mount_overlay([state.root], state.workspace.joinpath("build-overlay"), state.root, read_only)
 
 
 def run_prepare_script(state: MkosiState, build: bool) -> None:
index 87ab0e54882d1b4a8b77782d241338c0d50c14ac..1725cc4870f7b3be2d59e7148e42a058b925770e 100644 (file)
@@ -5,6 +5,7 @@ import contextlib
 import os
 import platform
 import stat
+import tempfile
 from collections.abc import Iterator, Sequence
 from pathlib import Path
 from typing import Callable, Deque, Optional, TypeVar, Union, cast
@@ -88,22 +89,22 @@ def mount(
 def mount_overlay(
     lowerdirs: Sequence[Path],
     upperdir: Path,
-    workdir: Path,
     where: Path,
     read_only: bool = True,
 ) -> Iterator[Path]:
-    options = [f"lowerdir={lower}" for lower in lowerdirs] + [f"upperdir={upperdir}", f"workdir={workdir}"]
-
-    # userxattr is only supported on overlayfs since kernel 5.11
-    if GenericVersion(platform.release()) >= GenericVersion("5.11"):
-        options.append("userxattr")
-
-    try:
-        with mount("overlay", where, options=options, type="overlay", read_only=read_only):
-            yield where
-    finally:
-        with complete_step("Cleaning up overlayfs"):
-            delete_whiteout_files(upperdir)
+    with tempfile.TemporaryDirectory(dir=upperdir.parent, prefix=f"{upperdir.name}-workdir") as workdir:
+        options = [f"lowerdir={lower}" for lower in lowerdirs] + [f"upperdir={upperdir}", f"workdir={workdir}"]
+
+        # userxattr is only supported on overlayfs since kernel 5.11
+        if GenericVersion(platform.release()) >= GenericVersion("5.11"):
+            options.append("userxattr")
+
+        try:
+            with mount("overlay", where, options=options, type="overlay", read_only=read_only):
+                yield where
+        finally:
+            with complete_step("Cleaning up overlayfs"):
+                delete_whiteout_files(upperdir)
 
 
 @contextlib.contextmanager
index d1a57797f12c036679e3a39c40c4d0661807fce1..48f556b907143d1bf85a2eb0ef80e61157345a69 100644 (file)
@@ -39,7 +39,6 @@ class MkosiState:
         self.installer = instance
 
         btrfs_maybe_make_subvolume(self.config, self.root, mode=0o755)
-        self.workdir.mkdir()
         self.staging.mkdir()
         self.pkgmngr.mkdir()
         self.install_dir.mkdir(exist_ok=True)
@@ -54,10 +53,6 @@ class MkosiState:
     def root(self) -> Path:
         return self.workspace / "root"
 
-    @property
-    def workdir(self) -> Path:
-        return self.workspace / "workdir"
-
     @property
     def staging(self) -> Path:
         return self.workspace / "staging"