7 个版本 (4 个重大变更)
0.18.0 | 2024年5月25日 |
---|---|
0.17.0 | 2024年5月6日 |
0.16.0 | 2024年4月26日 |
0.15.0 | 2024年3月24日 |
0.14.2 | 2024年1月17日 |
#1299 in 文件系统
每月487次下载
215KB
4K SLoC
backhand
用于读取、创建和修改 SquashFS 文件系统的库和二进制文件。
- 库 — Backhand 为程序对 Squashfs 4.0 图像进行编程分析提供了一种简单的方法,包括图像的提取和修改。
- 功能标志 — 支持的压缩和解压缩是以功能标志的形式实现的,因此您的最终二进制文件(或
unsquashfs
)只需要包含提取一种图像类型的代码。 - 非常规支持 — 除了支持正常的 Linux 内核 SquashFS 4.0 之外,我们还通过
Kind
结构体支持“令人惊叹的供应商格式世界”。这允许更改魔术字节、自定义压缩算法以及数据或元数据字段的 Endian-ness。
库
编译器支持:需要 rustc 1.72.1+
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
backhand = "0.18.0"
读取/写入/修改固件
use std::fs::File;
use std::io::{Cursor, BufReader};
use backhand::{FilesystemReader, FilesystemWriter, NodeHeader};
// read
let file = BufReader::new(File::open("file.squashfs").unwrap());
let read_filesystem = FilesystemReader::from_reader(file).unwrap();
// convert to writer
let mut write_filesystem = FilesystemWriter::from_fs_reader(&read_filesystem).unwrap();
// add file with data from slice
let d = NodeHeader::default();
let bytes = Cursor::new(b"Fear is the mind-killer.");
write_filesystem.push_file(bytes, "a/d/e/new_file", d);
// add file with data from file
let new_file = File::open("dune").unwrap();
write_filesystem.push_file(new_file, "/root/dune", d);
// modify file
let bytes = Cursor::new(b"The sleeper must awaken.\n");
write_filesystem.replace_file("/a/b/c/d/e/first_file", bytes).unwrap();
// write into a new file
let mut output = File::create("modified.squashfs").unwrap();
write_filesystem.write(&mut output).unwrap();
二进制文件
编译器支持:需要 rustc 1.74+
这些目前处于开发中,缺少功能,欢迎提交MR!
安装,请运行 cargo install backhand-cli --locked
,或从 最新的 GitHub 发布版 下载。
有关更多信息,请参阅 --help
。
unsquashfs-backhand
tool to uncompress, extract and list squashfs filesystems
Usage: unsquashfs-backhand [OPTIONS] [FILESYSTEM]
Arguments:
[FILESYSTEM] Squashfs file
Options:
-o, --offset <BYTES> Skip BYTES at the start of FILESYSTEM [default: 0]
-a, --auto-offset Find first instance of squashfs --kind magic
-l, --list List filesystem, do not write to DEST (ignores --quiet)
-d, --dest <PATHNAME> Extract to [PATHNAME] [default: squashfs-root]
-i, --info Print files as they are extracted
--path-filter <PATH_FILTER> Limit filesystem extraction [default: /]
-f, --force If file already exists then overwrite
-s, --stat Display filesystem superblock information (ignores --quiet)
-k, --kind <KIND> Kind(type of image) to parse [default: le_v4_0] [possible
values: be_v4_0, le_v4_0, avm_be_v4_0]
--completions <COMPLETIONS> Emit shell completion scripts [possible values: bash, elvish,
fish, powershell, zsh]
--quiet Silence all progress bar and RUST_LOG output
-h, --help Print help (see more with '--help')
-V, --version Print version
add-backhand
tool to add a file or directory to squashfs filesystems
Usage: add-backhand [OPTIONS] <IMAGE> <FILE_PATH_IN_IMAGE>
Arguments:
<IMAGE> Squashfs input image
<FILE_PATH_IN_IMAGE> Path of file once inserted into squashfs
Options:
-d, --dir Create empty directory
-f, --file <FILE> Path of file to read, to write into squashfs
-o, --out <OUT> Squashfs output image [default: added.squashfs]
--mode <MODE> Override mode read from <FILE>
--uid <UID> Override uid read from <FILE>
--gid <GID> Override gid read from <FILE>
--mtime <MTIME> Override mtime read from <FILE>
-h, --help Print help
-V, --version Print version
replace-backhand
tool to replace files in squashfs filesystems
Usage: replace-backhand [OPTIONS] <IMAGE> <FILE> <FILE_PATH_IN_IMAGE>
Arguments:
<IMAGE> Squashfs input image
<FILE> Path of file to read, to write into squashfs
<FILE_PATH_IN_IMAGE> Path of file replaced in image
Options:
-o, --out <OUT> Squashfs output image [default: replaced.squashfs]
-h, --help Print help
-V, --version Print version
性能
请参阅 BENCHMARK.md。
测试
请参阅 backhand-test。
依赖项
~15–26MB
~399K SLoC