• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Nyarime
V2EX  ›  程序员

对 Symantec Ghost 的 GHO 格式研究

  •  3
     
  •   Nyarime · May 6 · 2070 views
    This topic created in 38 days ago, the information mentioned may be changed or developed.

    五一假期结束,公司运维紧急找到我,说是 1T 多的 GHO 系统备份无法通过 Ghost 还原,使用 GhostExp 也无法打开提示“Out of Memory”( OOM )。 应该是 Norton Ghost 的浏览器在读取 GHO 文件时全加载进内存里了,不过现在跟 VMware 一样都是博通的了 undefined

    得亏系统没格,不然跟搜狐上这个《 2.8TB 外贸数据生死救援! GHOST 备份崩溃后,我们如何 100%恢复? 》一样完蛋 按某数据恢复工程师提供的思路,研究了 GHO 文件结构:

    [File Header]                  (512 字节)
        │
        ├── [Record: Track 0]      (类型 0x0006)  → MBR + 引导扇区
        │
        ├── [Record: Partition]    (类型 0x0603)  → 分区描述符
        │
        ├── [FEEF Partition Header] (512 字节)    → 该分区的压缩参数
        │
        ├── [Compressed Data Blocks]              → 实际数据( 32KB 对齐)
        │       ├── Block 1 (2B 长度 + 数据)
        │       ├── Block 2 ...
        │       └── ...
        │
        ├── [Record: Continuation] (类型 0x0703)  → 跨文件续卷标记(多文件时出现)
        │
        └── [Record: End]          (类型 0x0023)  → 文件结束标记
    

    赛门铁克的压缩方法,是一个比较黑盒的自定义 LZ77 变种,每个块解压后固定 32KB:

    [2 字节 stored_len] [1 字节 控制字节] [数据...]
    

    附:哈希表( 4096 条) h = ((-24993 * (b2 ^ (16 * (b1 ^ (16 * b0))))) >> 4) & 0xFFF 其中 b0 、b1 、b2 是当前 3 字节窗口,在 2000 年那会比较常见的一种轻量级高压缩比的老格式了,新的诺顿克隆精灵似乎用的是 i2v 格式,但我从小到大见过的 Ghost 镜像都是 gho 格式的

    具体的代码已开源: https://github.com/nyarime/gho

    14 replies    2026-05-30 10:48:04 +08:00
    ysc3839
        1
    ysc3839  
       May 6 via Android
    请问 Ghost 备份文件是基于块还是基于文件系统进行存储?
    如果是基于块,那 Ghost 程序在恢复 NTFS 分区时,允许目标分区大小与备份时不一致,以及恢复时会显示文件名,是如何实现的?难不成是 Ghost 内部再去解析文件系统结构?
    Nyarime
        2
    Nyarime  
    OP
       May 6   ❤️ 3
    @ysc3839 Ghost 是基于块存储备份的,而且它内部确实会解析文件系统结构
    简单说,它是一个文件系统感知的块级备份工具。存储格式是扇区流,但备份和恢复过程中都会解析文件系统结构来做智能优化

    存储层面:GHO 文件存的是分区的原始扇区数据,按 32KB 一个 block 切片后压缩( Fast LZ 或 zlib )。解压出来就是一个完整的分区镜像,可以直接 dd 到磁盘。所以本质是基于块的备份
    但 Ghost 不是无脑 dump 每个扇区,它会解析源分区的文件系统( NTFS/FAT/ext2/3 ),识别哪些块是"已使用"的,只备份有数据的块。这就是为什么一个 100GB 的分区如果只用了 20GB ,GHO 文件远小于 100GB 的原因

    这也解释了你提到的两个现象:
    1. 恢复时允许目标分区大小不一致:因为 Ghost 知道文件系统结构,它可以在恢复时调整文件系统的元数据( NTFS 的 $Bitmap 、$MFT 、BPB 中的分区大小字段等),把数据块写到新位置。本质上是在做一个"带文件系统感知的块级克隆+resize"
    2. 恢复时显示文件名:Ghost 解析了文件系统的目录结构( NTFS 的 MFT ),可以在恢复过程中展示当前正在写入哪个文件对应的扇区。这纯粹是 UI 功能,底层写入仍然是按扇区顺序
    mercury233
        3
    mercury233  
       May 6
    题外话,最新版本是 12.0.0.13027 ,也许已经修复了 oom 问题

    duchenpaul
        4
    duchenpaul  
       May 6
    GHOST? 现在还用? 感觉是上世纪的东西了
    Nyarime
        5
    Nyarime  
    OP
       May 6 via Android
    @mercury233 博通在新版本加了混淆,11.5 的 Ghostexp.exe 才 2.9MB ( 12.0 是 10.8MB ),小很多
    lisxour
        6
    lisxour  
       May 6
    @Nyarime #5 管它混不混淆,能正常使用备份恢复备份就行了啊,而且服务器备份为啥用上古工具来做
    FrankAdler
        7
    FrankAdler  
       May 6 via Android
    前阵子我用 ghost 备份了下 c 盘然后重装系统了,完事从里面找文件的时候右键删除了几个文件,然后 gho 文件就打不开了,具体报错忘记了
    如果 gho 文件不删,我还有救吗
    lovejoy
        8
    lovejoy  
       May 6
    @duchenpaul 因为它最出名大家使用起来最熟悉,除了它我第一反应也想不起来其他的用来系统备份恢复的软件
    qW7bo2FbzbC0
        9
    qW7bo2FbzbC0  
       May 6
    这个头像是 Y 上那个流量比较高的 sim 卡博主奶咪吗
    qgswzmz
        10
    qgswzmz  
       May 6
    太强了,致敬手撕,还开源出来
    Nyarime
        11
    Nyarime  
    OP
       May 6 via Android
    @FrankAdler 可以打包以后发给我,如果方便的话,我尝试帮你 dump 出来这样
    https://t.me/baipiaozhenxiang
    FrankAdler
        12
    FrankAdler  
       May 6 via Android
    @Nyarime 😭我当时以为没救了 所以文件删了 啊 而且好几百 g 呢
    NewYear
        13
    NewYear  
       May 9
    ghostexp 一直是这么垃圾

    打不开 gho 文件的情况太正常了。
    beck8
        14
    beck8  
       May 30
    @qW7bo2FbzbC0 是的,就是那个佬
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1053 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 18:37 · PVG 02:37 · LAX 11:37 · JFK 14:37
    ♥ Do have faith in what you're doing.