aspann/advfs-fuse
GitHub: aspann/advfs-fuse
用于 DEC Alpha / Tru64 UNIX AdvFS 文件系统的只读 FUSE 驱动和数字取证工具包,支持在现代 Linux 上挂载镜像并扫描已删除文件。
Stars: 2 | Forks: 0
# advfs-fuse
用于 DEC Alpha / Tru64 UNIX 的 AdvFS 文件系统的只读 FUSE 驱动程序和取证工具包。
将原始 AdvFS vdisk 镜像挂载为现代 Linux 上的本地文件系统。
无需内核模块——完全通过 FUSE 在用户空间运行。
包含一个独立的 CLI 工具,用于镜像分析和已删除文件扫描,且无需 FUSE 即可工作。
尽管磁盘上的格式源自 2008 年起就在 GPL v2 下公开,但此前一直不存在适用于 Linux 的 AdvFS FUSE 驱动程序或内核模块。
## 支持的格式
- **ODS v3** -- Digital UNIX V4.x(基于 BMT,BSR_SHADOW_XTNTS)
- **ODS v4** -- Tru64 UNIX V5.x(基于 RBMT,BSR_XTRA_XTNTS)
支持单卷和多卷(条带化)域;
条带化文件会被解交织(需传入所有成员 vdisk)。只有在缺少成员卷时,读取才会回退到按列顺序进行,并发出警告。
## 构建
```
make # builds advfs-tool always, advfs-fuse when libfuse available
make tool # builds only advfs-tool (no FUSE dependency)
make fuse # builds only advfs-fuse (requires libfuse-dev)
make test # runs the test suite
make install # installs to /usr/local/bin (override with PREFIX= DESTDIR=)
```
环境要求:
- C11 编译器(GCC 或 Clang)
- `libfuse3-dev` 或 `libfuse-dev`(用于 FUSE 二进制文件,自动检测)
- `advfs-tool` 没有外部依赖
Gentoo:
```
emake DESTDIR="${D}" PREFIX="${EPREFIX}/usr" install
```
## 用法
### FUSE 挂载
```
advfs-fuse
advfs-fuse vol1.vdisk vol2.vdisk # multi-volume
advfs-fuse --fileset clone_snap # mount a clone
advfs-fuse --partition g # mount from partition
advfs-fuse --offset 0x3567e0000 # manual offset
```
将第一个非克隆文件集挂载为只读文件系统。
为条带化/多卷域提供多个 vdisk 路径。
`--fileset` 选择特定的文件集(例如克隆快照)。
`--partition` 读取 BSD/Alpha disklabel 并使用给定分区的字节偏移量(例如 `g` 表示 Tru64 上的 usr 域)。
`--offset` 设置 vdisk 文件中的手动字节偏移量。
标准的 FUSE 选项(`-d`、`-f`、`-s`)将被直接透传。
### CLI 工具
```
advfs-tool --info [vdisk2 ...] # metadata
advfs-tool --list [path] # ls -la
advfs-tool --list -r [path] # recursive count
advfs-tool --list --fileset clone_snap [path] # list clone
advfs-tool --list -r --partition g / # count in partition
advfs-tool --scan-deleted # find deleted
```
`--info` 显示 ODS 版本、域 ID、卷几何结构、BMT/RBMT 布局,以及带有条目计数的文件集清单。
`--scan-deleted` 递归遍历所有文件集,从目录块中恢复已删除的条目名称(AdvFS 在删除时仅将 header tag 清零;名称和尾部 tag 得以保留),并探测 BMTR_FS_STAT 以获取文件大小、类型和删除时间戳。
## 架构
| 模块 | 用途 |
|--------------|--------------------------------------------------|
| volume.c | 原始 vdisk I/O、magic 检测、分区偏移量 |
| bmt.c | BMT/RBMT 页面读取、mcell record 遍历 |
| domain.c | 域发现、BMT/RBMT extent map 引导 |
| extents.c | Extent map 解析(主 + shadow + extra) |
| fileset.c | 文件集枚举、tag-dir extent 解析 |
| dir.c | 目录解析(V3/V4)、已删除条目支持 |
| filedata.c | 文件数据读取(frags、extents、sparse holes) |
| fuse_ops.c | FUSE 回调(getattr、readdir、read、readlink) |
| main.c | FUSE CLI、volume/domain 初始化、fuse_main |
| advfs_tool.c | 独立 CLI(--info、--list [-r]、--scan-deleted) |
| ods.h | 磁盘上结构定义(来自 GPL bs_ods.h) |
| util.c | 日志记录、page/block 计算、BMT page 解析 |
## 实现说明
- AdvFS magic:在 block 16,字节偏移量 1372 处为 `0x11081953`
- BMT 不是连续的——使用其自身的 extent map(cell 0)
- ODS v3:没有 RBMT,BMT 位于 volume page 2,cells:BMT=0 SBM=1
BFSDIR=2 FTXLOG=3
- ODS v4:独立的 RBMT 位于 page 0,cells:RBMT=0 SBM=1 BFSDIR=2
FTXLOG=3 BMT=4 MISC=5 RBMT_EXT=6
- V3 extent chains:BSR_SHADOW_XTNTS(类型 6)
- V4 extent chains:BSR_XTRA_XTNTS(类型 5)
- Record header:4 字节位域(bCnt:16, type:8, version:8),
bCnt 包含 header
- Sub-page 文件存储在 frag 文件(fileset tag 1)中,1-7 KB 插槽
- Tru64 `cksum` 默认使用 BSD 算法;设置 `CMD_ENV=xpg4`
可输出 POSIX 1003.2 CRC
## 测试套件
```
make test
```
- 卷检测、域发现、文件集枚举、目录解析、extent 解析、条带检测
(V3 + V4)
- 文件数据读取,并根据 Tru64 参考值进行 POSIX cksum 验证
(V3 + V4)
- 克隆回退验证(PERM_HOLE 页面恢复)
- 合成边缘情况处理
测试镜像是在运行于模拟 AlphaServer ES40 (AXPbox) 的 Tru64 UNIX V5.1B 上创建的。
## 已知限制
- **克隆链**:clone-of-clone(嵌套快照)仅限一级回退;更深的链将进行零填充并发出警告。
- **索引目录**:不支持 V4 B-tree 索引目录;所有版本均使用线性目录扫描。
- **写入支持**:设计为只读;不支持 write、mkdir 或 unlink 操作。
## 参考
- [AdvFS GPL 源码 (TheSledgeHammer/AdvFS)][advfs-gh]
- [AdvFS Gen2 源码 (HP, 2008)][advfs-sf] -- GPL v2
- Hitchhiker's Guide to AdvFS v2.2(DEC/HP 内部文档)
- `bs_ods.h` -- 磁盘上结构定义(GPL,在 `src/ods.h` 中适配)
## 许可证
GPL-2.0-only
源自 Hewlett-Packard 于 2008 年发布的 GPL v2 AdvFS 源码。
标签:Bing搜索, FUSE, Tru64 UNIX, 客户端加密, 数字取证, 文件系统, 磁盘镜像分析, 自动化脚本