from mkosi.kmod import gen_required_kernel_modules, loaded_modules, process_kernel_modules
from mkosi.log import ARG_DEBUG, complete_step, die, log_notice, log_step
from mkosi.manifest import Manifest
-from mkosi.mounts import finalize_certificate_mounts, finalize_source_mounts, mount_overlay
+from mkosi.mounts import (
+ finalize_certificate_mounts,
+ finalize_source_mounts,
+ finalize_volatile_tmpdir,
+ mount_overlay,
+)
from mkosi.pager import page
from mkosi.partition import Partition, finalize_root, finalize_roothash
from mkosi.qemu import (
if volatile:
context.lowerdirs = [d]
context.upperdir = Path(
- stack.enter_context(tempfile.TemporaryDirectory(prefix="volatile-overlay"))
+ stack.enter_context(
+ tempfile.TemporaryDirectory(
+ prefix="volatile-overlay.",
+ dir=finalize_volatile_tmpdir(),
+ )
+ )
)
os.chmod(context.upperdir, d.stat().st_mode)
else:
from mkosi.config import BuildSourcesEphemeral, Config
from mkosi.log import die
-from mkosi.sandbox import OverlayOperation
+from mkosi.sandbox import OVERLAYFS_SUPER_MAGIC, OverlayOperation, statfs
from mkosi.util import PathString, flatten
entry.unlink()
+def finalize_volatile_tmpdir() -> Path:
+ if tempfile.tempdir and statfs(tempfile.tempdir) != OVERLAYFS_SUPER_MAGIC:
+ return Path(tempfile.tempdir)
+
+ for path in ("/var/tmp", "/tmp", "/dev/shm"):
+ if Path(path).exists() and statfs(path) != OVERLAYFS_SUPER_MAGIC:
+ return Path(path)
+
+ die(
+ "Cannot find temporary directory for volatile overlayfs upperdir",
+ hint="Either /var/tmp, /tmp or /dev/shm must exist and not be located on overlayfs",
+ )
+
+
@contextlib.contextmanager
def mount_overlay(
lowerdirs: Sequence[Path],
) -> Iterator[Path]:
with contextlib.ExitStack() as stack:
if upperdir is None:
- upperdir = Path(stack.enter_context(tempfile.TemporaryDirectory(prefix="volatile-overlay")))
+ upperdir = Path(
+ stack.enter_context(
+ tempfile.TemporaryDirectory(
+ prefix="volatile-overlay.",
+ dir=finalize_volatile_tmpdir(),
+ )
+ )
+ )
st = lowerdirs[-1].stat()
os.chmod(upperdir, st.st_mode)
upperdir.mkdir(mode=src.stat().st_mode, exist_ok=True)
else:
upperdir = Path(
- stack.enter_context(tempfile.TemporaryDirectory(prefix="volatile-overlay."))
+ stack.enter_context(
+ tempfile.TemporaryDirectory(
+ prefix="volatile-overlay.",
+ dir=finalize_volatile_tmpdir(),
+ )
+ )
)
os.chmod(upperdir, src.stat().st_mode)