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, 客户端加密, 数字取证, 文件系统, 磁盘镜像分析, 自动化脚本