Skip to content

Commit

Permalink
stages: add org.osbuild.erofs
Browse files Browse the repository at this point in the history
Erofs is "a lightweight read-only file system"[1]. Imagine squashfs, but with
faster reads.

This commit adds support for creating it. The new stage is heavily inspired by
the squashfs one. I've decided to add all features of mkfs.erofs that looked
useful: All compression types and most of extended options (excluding the
compatibility ones, we can always add them later).

[1]: https://en.wikipedia.org/wiki/EROFS
  • Loading branch information
ondrejbudai authored and mvo5 committed Nov 9, 2023
1 parent b9ad7dd commit 39c54b5
Showing 1 changed file with 98 additions and 0 deletions.
98 changes: 98 additions & 0 deletions stages/org.osbuild.erofs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#!/usr/bin/python3
"""
Create a file containing an errofs filesystem named `filename`.
Buildhost commands used: `mkfs.erofs`
"""

import os
import subprocess
import sys

import osbuild.api

SCHEMA_2 = """
"options": {
"additionalProperties": false,
"required": ["filename"],
"properties": {
"filename": {
"description": "Filename for the output",
"type": "string"
},
"compression": {
"type": "object",
"additionalProperties": false,
"required": ["method"],
"properties": {
"method": {
"description": "Compression method",
"enum": ["lz4", "lz4hc", "lzma"]
},
"level": {
"description": "Compression level. Note that different methods support different levels. See mkfs.erofs(1) for more details",
"type": "number"
}
}
},
"options": {
"description": "Extended options for the filesystem, see mkfs.erofs(1)",
"type": "array",
"minItems": 1,
"items:": {
"enum": [
"all-fragments",
"dedupe",
"force-inode-compact",
"force-inode-extended",
"force-inode-blockmap",
"force-chunk-indexes",
"fragments",
"noinline_data",
"ztailpacking"
]
}
}
}
},
"inputs": {
"type": "object",
"additionalProperties": false,
"required": ["tree"],
"properties": {
"tree": {
"type": "object",
"additionalProperties": true
}
}
}
"""


def main(inputs, output_dir, options):
source = inputs["tree"]["path"]
filename = options["filename"].lstrip("/")
compression = options.get("compression")

target = os.path.join(output_dir, filename)

cmd = ["mkfs.erofs", target, source]

if compression:
method = compression["method"]
if compression.get("level"):
method += f",{compression['level']}"
cmd += ["-z", method]

if options:
cmd += ["-E", ",".join(options)]

subprocess.run(cmd, check=True)

return 0


if __name__ == '__main__':
args = osbuild.api.arguments()
r = main(args["inputs"], args["tree"], args["options"])
sys.exit(r)

0 comments on commit 39c54b5

Please sign in to comment.