对 Symantec Ghost 的 GHO 格式研究 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
Nyarime

对 Symantec Ghost 的 GHO 格式研究

  •  3
     
  •   Nyarime 12h 57m ago 1348 views

    五一假期结束,公司运维紧急找到我,说是 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

    12 replies    2026-05-06 19:00:54 +08:00
    ysc3839
        1
    ysc3839  
       12h 48m ago via Android
    请问 Ghost 备份文件是基于块还是基于文件系统进行存储?
    如果是基于块,那 Ghost 程序在恢复 NTFS 分区时,允许目标分区大小与备份时不一致,以及恢复时会显示文件名,是如何实现的?难不成是 Ghost 内部再去解析文件系统结构?
    Nyarime
        2
    Nyarime  
    OP
       12h 37m ago   2
    @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  
       12h 12m ago
    题外话,最新版本是 12.0.0.13027 ,也许已经修复了 oom 问题

    duchenpaul
        4
    duchenpaul  
       12h 7m ago
    GHOST? 现在还用? 感觉是上世纪的东西了
    Nyarime
        5
    Nyarime  
    OP
       12h 4m ago via Android
    @mercury233 博通在新版本加了混淆,11.5 的 Ghostexp.exe 才 2.9MB ( 12.0 是 10.8MB ),小很多
    lisxour
        6
    lisxour  
       11h 13m ago
    @Nyarime #5 管它混不混淆,能正常使用备份恢复备份就行了啊,而且服务器备份为啥用上古工具来做
    FrankAdler
        7
    FrankAdler  
       11h 10m ago via Android
    前阵子我用 ghost 备份了下 c 盘然后重装系统了,完事从里面找文件的时候右键删除了几个文件,然后 gho 文件就打不开了,具体报错忘记了
    如果 gho 文件不删,我还有救吗
    lovejoy
        8
    lovejoy  
       10h 23m ago
    @duchenpaul 因为它最出名大家使用起来最熟悉,除了它我第一反应也想不起来其他的用来系统备份恢复的软件
    qW7bo2FbzbC0
        9
    qW7bo2FbzbC0  
       10h 4m ago
    这个头像是 Y 上那个流量比较高的 sim 卡博主奶咪吗
    qgswzmz
        10
    qgswzmz  
       8h 7m ago
    太强了,致敬手撕,还开源出来
    Nyarime
        11
    Nyarime  
    OP
       7h 39m ago via Android
    @FrankAdler 可以打包以后发给我,如果方便的话,我尝试帮你 dump 出来这样
    https://t.me/baipiaozhenxiang
    FrankAdler
        12
    FrankAdler  
       1h 50m ago via Android
    @Nyarime 我当时以为没救了 所以文件删了 啊 而且好几百 g 呢
    About     Help     Advertise     Blog     API     FAQ     Solana     3310 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 12:50 PVG 20:50 LAX 05:50 JFK 08:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86