mussolene/rdrkit
GitHub: mussolene/rdrkit
rdrkit 是一个跨平台只读工具,用于在 macOS 和 Linux 上无需专有软件即可解析和挂载 R-Drive Image 的 .rdr 磁盘镜像文件。
Stars: 0 | Forks: 0
# rdrkit
[](https://github.com/mussolene/rdrkit/actions/workflows/ci.yml)
[](https://github.com/mussolene/rdrkit/actions/workflows/security.yml)
[](https://github.com/mussolene/rdrkit/releases)
[](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, 可视化界面, 数据恢复, 文件系统, 磁盘镜像, 通知系统