From: Daan De Meyer Date: Tue, 27 Jun 2023 13:05:31 +0000 (+0200) Subject: Use a separate workdir for each overlay mount X-Git-Tag: v15~97^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4c2f21240d19df21c672893b069a1fcacaf96c8;p=thirdparty%2Fmkosi.git Use a separate workdir for each overlay mount --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 3972b0f22..b108d1658 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -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: diff --git a/mkosi/mounts.py b/mkosi/mounts.py index 87ab0e548..1725cc487 100644 --- a/mkosi/mounts.py +++ b/mkosi/mounts.py @@ -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 diff --git a/mkosi/state.py b/mkosi/state.py index d1a57797f..48f556b90 100644 --- a/mkosi/state.py +++ b/mkosi/state.py @@ -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"