forked from osbuild/osbuild
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
1 parent
b9ad7dd
commit 39c54b5
Showing
1 changed file
with
98 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |