]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Added support for generating an XFS UsrOnly root
authorMichael A Cassaniti <michael@cassaniti.id.au>
Mon, 18 Jul 2022 04:10:20 +0000 (14:10 +1000)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 18 Aug 2022 16:03:40 +0000 (18:03 +0200)
mkosi/__init__.py

index e34fcf8b0e4809cb4d37537135e4dd099c339ff0..74c1c6061db917c8d309577c20d5365605ef51f2 100644 (file)
@@ -3675,6 +3675,39 @@ def generate_btrfs(args: MkosiArgs, root: Path, label: str, for_cache: bool) ->
     return f
 
 
+def generate_xfs(args: MkosiArgs, root: Path, label: str, for_cache: bool) -> Optional[BinaryIO]:
+    if args.output_format != OutputFormat.gpt_xfs:
+        return None
+    if for_cache:
+        return None
+
+    @contextlib.contextmanager
+    def get_loopdev(f: BinaryIO) -> Iterator[Path]:
+        c = run(["losetup", "--find", "--show", f.name], stdout=PIPE, text=True)
+        l = Path(c.stdout.strip())
+        try:
+            yield l
+        finally:
+            run(["losetup", "--detach", l])
+
+    with complete_step("Creating xfs root file system…"):
+        f: BinaryIO = cast(
+            BinaryIO,
+            tempfile.NamedTemporaryFile(prefix=".mkosi-mkfs-xfs", dir=os.path.dirname(args.output))
+        )
+
+        f.truncate(args.root_size)
+        run(mkfs_xfs_cmd(label) + [f.name])
+
+        xfs_dir = workspace(root) / "xfs"
+        xfs_dir.mkdir()
+        with get_loopdev(f) as loopdev:
+            with mount_loop(args, loopdev, xfs_dir) as mp:
+                copy_path(root, mp)
+
+    return f
+
+
 def make_generated_root(args: MkosiArgs, root: Path, for_cache: bool) -> Optional[BinaryIO]:
 
     if not is_generated_root(args):
@@ -3683,6 +3716,8 @@ def make_generated_root(args: MkosiArgs, root: Path, for_cache: bool) -> Optiona
     label = "usr" if args.usr_only else "root"
     patched_root = root / "usr" if args.usr_only else root
 
+    if args.output_format == OutputFormat.gpt_xfs:
+        return generate_xfs(args, patched_root, label, for_cache)
     if args.output_format == OutputFormat.gpt_ext4:
         return generate_ext4(args, patched_root, label, for_cache)
     if args.output_format == OutputFormat.gpt_btrfs: