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
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
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:
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
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
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)
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"