mussolene/rdrkit

GitHub: mussolene/rdrkit

rdrkit 是一个跨平台只读工具,用于在 macOS 和 Linux 上无需专有软件即可解析和挂载 R-Drive Image 的 .rdr 磁盘镜像文件。

Stars: 0 | Forks: 0

# rdrkit [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/mussolene/rdrkit/actions/workflows/ci.yml) [![Security](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/116530ae2b0dfb0390d7e5d43e4b803c1d427fbd70342e6f6fee028ad54a6dac.svg)](https://github.com/mussolene/rdrkit/actions/workflows/security.yml) [![Release](https://img.shields.io/github/v/release/mussolene/rdrkit?display_name=tag)](https://github.com/mussolene/rdrkit/releases) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) `rdrkit` 提供对存储在索引 R-Drive Image `.rdr` 归档中的磁盘对象的只读访问。它读取归档中嵌入的 chunk 目录,将一个对象通过 localhost NFSv3 作为可寻址的原始文件公开,并允许标准操作系统工具挂载该文件系统。 完整的原始磁盘**不会**写入临时存储。仅读取和解压操作系统请求的 chunk。 ## 为什么开发 rdrkit RDR 镜像可能包含大型的 NTFS、FAT 或其他文件系统对象,但原始挂载软件并非在所有操作系统上都可用,且可能依赖于内核驱动程序。`rdrkit` 将专有容器的关注点保持在最小:它将索引的 RDR chunk 转换为标准的只读字节流,然后将文件系统处理委托给成熟的主机工具。 ## 支持矩阵 | 主机 | 架构 | 发布的二进制文件 | 挂载路径 | | --- | --- | --- | --- | | macOS | Apple Silicon (`aarch64`) | 是 | NFSv3 → `hdiutil` | | macOS | Intel (`x86_64`) | 是 | NFSv3 → `hdiutil` | | Linux | ARM64 (`aarch64`) | 是 | NFSv3 → 只读 loop 挂载 | | Linux | x86-64 | 是 | NFSv3 → 只读 loop 挂载 | 源 RDR 归档永远不会以写入方式打开。 ## 快速开始 ### 1. 安装 从 [GitHub Releases](https://github.com/mussolene/rdrkit/releases) 下载适合您平台的归档,使用 `SHA256SUMS` 进行验证,然后安装该二进制文件: ``` tar -xzf rdrkit-v0.1.0-.tar.gz chmod +x rdrkit sudo install -m 0755 rdrkit /usr/local/bin/rdrkit ``` 或者从源码构建: ``` git clone https://github.com/mussolene/rdrkit.git cd rdrkit cargo build --release --locked sudo install -m 0755 target/release/rdrkit /usr/local/bin/rdrkit ``` ### 2. 列出对象 这会读取嵌入的归档目录和紧凑索引;它不会扫描 完整镜像: ``` rdrkit list backup.rdr ``` 输出示例: ``` image=backup.rdr size=459.00 GiB object=0 size=499.00 MiB chunks=1996 chunk_size=256.00 KiB object=1 size=512.00 MiB chunks=2048 chunk_size=256.00 KiB object=2 size=128.00 MiB chunks=512 chunk_size=256.00 KiB object=3 size=929.31 GiB chunks=3806464 chunk_size=256.00 KiB ``` ### 3. 提供服务 在卷挂载期间保持此进程运行: ``` rdrkit serve backup.rdr --object 3 --listen 127.0.0.1:11111 ``` NFS 导出包含一个名为 `object-3.raw` 的只读虚拟文件。 ## 在 macOS 上挂载 在第二个终端中: ``` mkdir -p "$HOME/Library/Caches/rdrkit/object-3" mount_nfs \ -o nolocks,vers=3,tcp,rsize=131072,actimeo=1,port=11111,mountport=11111 \ localhost:/ "$HOME/Library/Caches/rdrkit/object-3" hdiutil attach \ -readonly \ -nomount \ -imagekey diskimage-class=CRawDiskImage \ "$HOME/Library/Caches/rdrkit/object-3/object-3.raw" ``` `hdiutil` 会打印一个设备,例如 `/dev/disk7`。以只读方式挂载: ``` diskutil mount readOnly /dev/disk7 ``` 在停止 `rdrkit` 之前,按相反顺序卸载: ``` diskutil unmount /dev/disk7 hdiutil detach /dev/disk7 umount "$HOME/Library/Caches/rdrkit/object-3" ``` 无需第三方的 macOS 内核扩展。 ## 在 Linux 上挂载 Linux 需要 NFS 客户端、loop-device 支持以及所含卷的文件系统支持。包名因发行版而异。 ``` sudo mkdir -p /mnt/rdrkit-nfs /mnt/rdr-volume sudo mount -t nfs \ -o ro,nolock,vers=3,tcp,port=11111,mountport=11111 \ 127.0.0.1:/ /mnt/rdrkit-nfs LOOP_DEVICE=$(sudo losetup --find --show --read-only /mnt/rdrkit-nfs/object-3.raw) sudo mount -o ro "$LOOP_DEVICE" /mnt/rdr-volume ``` 在停止 `rdrkit` 之前卸载: ``` sudo umount /mnt/rdr-volume sudo losetup --detach "$LOOP_DEVICE" sudo umount /mnt/rdrkit-nfs ``` 如果自动文件系统检测不可用,请指定文件系统类型, 例如 `sudo mount -t ntfs3 -o ro ...`。 ## 命令 ``` rdrkit list IMAGE.rdr List indexed objects quickly. rdrkit serve IMAGE.rdr --object N [--listen 127.0.0.1:11111] Export one object as a seekable read-only raw file over NFSv3. rdrkit extract IMAGE.rdr --object N --output OBJECT.raw [--force] Materialize one sparse raw object. This can require substantial storage. rdrkit inspect IMAGE.rdr [--max-records N] Low-level sequential diagnostics for format research. ``` 运行 `rdrkit --help` 或 `rdrkit --help` 查看当前选项。 ## 工作原理 ``` RDR footer ↓ directory pointer archive directory (object id → index frame) ↓ zlib compact chunk index (logical chunk → record offset and length) ↓ on-demand read raw or zlib RDR data record ↓ seekable virtual .raw file over localhost NFSv3 ↓ hdiutil (macOS) or loop device (Linux) ↓ host filesystem driver, mounted read-only ``` 该实现会验证: - 外部文件大小和 record magic; - footer 目录指针和目录边界; - 对象 ID、compact-index 编码、几何参数和单调偏移量; - 在提供服务前对第一个、中间和最后一个 record 进行采样; - 每个请求 record 的逻辑偏移量和解码长度。 提供服务路径中没有线性扫描回退机制。缺失、格式错误或不支持的 compact index 会产生明确的错误。 有关净室格式说明、 record 布局和确切的读取器选择逻辑,请参阅 [docs/rdr-format.md](docs/rdr-format.md)。 ## 当前限制 - 仅支持只读操作。 - 不支持加密、增量、拆分和未知的 RDR 变体。 - 当前前端为每个进程提供一个对象。 - Linux loop 挂载需要主机特权和兼容的文件系统工具。 - `inspect` 和 `extract` 是诊断路径;`serve` 使用嵌入式索引。 支持有意保持保守:该工具会拒绝其无法验证的格式,而不是返回可能已损坏的字节。 ## 安全与隐私 - 除了明确请求的 localhost 监听器外,未启用任何遥测或网络服务。 - NFS 监听器默认为 `127.0.0.1`;请勿将其暴露给不受信任的网络。 - 磁盘镜像、原始文件、私钥、日志和本地环境文件均被 `.gitignore` 排除。 - CI 会运行密钥扫描、依赖漏洞检查以及许可证/源代码 策略检查。 有关私密的漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。 ## 开发 ``` cargo fmt --all -- --check cargo clippy --all-targets --all-features -- -D warnings cargo test --all-features --locked cargo build --release --locked gitleaks detect --source . --no-banner --redact ``` 贡献必须使用合成的或可重新分发的测试数据。请勿提交 包含专有二进制文件或私人信息的磁盘镜像。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 版本控制与发布 该项目遵循 [Semantic Versioning](https://semver.org/)。标签使用 `vMAJOR.MINOR.PATCH`。每个标签都会构建并发布以下归档: - `aarch64-apple-darwin` - `x86_64-apple-darwin` - `aarch64-unknown-linux-gnu` - `x86_64-unknown-linux-gnu` 每个 GitHub 发布还包含 `SHA256SUMS`。发布详情维护在 [CHANGELOG.md](CHANGELOG.md) 中。 ## 许可证 基于 [MIT License](LICENSE) 授权。
标签:NFSv3, R-Drive Image, 可视化界面, 数据恢复, 文件系统, 磁盘镜像, 通知系统