游戏 ROM 压缩成 CHD 省下六成空间:chdman 与 ROMm 实操教程
【免费下载链接】rommA beautiful, powerful, self-hosted ROM manager and player.项目地址: https://gitcode.com/GitHub_Trending/rom/romm
上个月盘点 NAS 时我发现,PS2 和 PS1 的 ISO 光镜像就占了 310 GB,2.3TB 的整块盘只剩 400 GB 余量,删哪款都肉疼。后来我用 chdman 把游戏 ROM 压缩成 CHD,再交给 ROMm 统一管理,整个收藏缩水六成,读取速度反而略快。整个过程就是几条命令的事,今天把这套 CHD 压缩教程完整讲一遍。
先看收益:CHD 压缩到底能省多少空间
| 游戏碟片 | 压缩前(ISO) | 压缩后(CHD) | 空间省掉 |
|---|---|---|---|
| PS2 单碟 | 4.4 GB | 约 1.5 GB(高压缩档) | 约 65% |
| PS2 单碟 | 4.4 GB | 约 2.2 GB(快速档) | 约 50% |
| PS1 单碟 | 700 MB | 约 300 MB | 约 60% |
原因不复杂:光盘镜像里真正装游戏数据的区域不到一半,剩下是间隙填充和空轨道,CHD 把这些直接跳过不存,而通用压缩会把它们一字不落地压进去。
5 分钟准备:安装并验证 chdman
chdman 是 MAME 官方出品的转换工具,主流平台都有现成包:
| 目标系统 | 安装命令 | 验证命令 |
|---|---|---|
| Ubuntu/Debian | sudo apt install mame-tools | chdman --version |
| Fedora/RHEL | sudo dnf install mame-tools | chdman --version |
| Arch Linux | sudo pacman -S mame-tools | chdman --version |
| macOS | brew install mame | chdman --version |
| Windows | MAME 官网下载二进制包 | chdman.exe --version |
装完敲一条验证命令:
chdman --version能回显版本号就说明环境就绪,可以开始干活了。
压出你的第一张 CHD:以 700 MB 的 PS1 ISO 为例
先拿一张约 700 MB 的 PS1 ISO 试手,转换只需一条命令:
chdman createcd -i game.iso -o game.chd -1四个参数各管一件事:
-i:输入文件,这里指原始 ISO;-o:输出文件,即要生成的 CHD;-1:高压缩档,优先把体积压到最小;-0:快速档,优先保证速度,体积大约省一半。
压完用下面这条命令回读文件头,确认版本和哈希正常输出即成功:
chdman info -i game.chd然后把.chd文件直接丢进 ROMm 对应平台的库目录(在 ROMm 配置里指定库目录,可参考 examples/config.example.yml),扫描后就会出现在游戏列表里。ROMm 靠读取 CHD v5 文件头里内嵌的 SHA1 哈希来识别游戏——这个哈希来自压缩前的原始数据,所以即使两次压缩产出的字节不同,库里的记录照样对得上,去重和完整性校验全靠它。
背后的原理:CHD 凭什么比 ZIP/7Z 更省更快
ZIP、7Z 这类通用压缩眼里只有"一个文件":整包打包,光盘里的空区域一个字节都省不掉,而且必须整包解压才能读。CHD 是照着"光盘长什么样"来压缩的,套路完全不同:
- 按光盘真实布局把数据切成可独立寻址的块;
- 空区域直接不存;
- 音频轨单独走 FLAC 编码;
- 每个块都能单独解压,模拟器读某个扇区时只解对应的那一块,不动整个文件。
| 能力对比 | 传统 ZIP | 传统 7Z | CHD 格式 |
|---|---|---|---|
| 平均省空间 | 20%–30% | 30%–40% | 40%–60% |
| 读取模式 | 整包解压 | 随机访问慢 | 分块即读 |
| 完整性校验 | 基础 CRC | 基础 CRC | 头部内嵌原始 SHA1 |
| 多盘处理 | 手动 | 手动 | 按盘分块/多盘组 |
一句话总结:CHD 懂光盘,通用压缩只懂文件。
按你的库规模选压法
单碟大作:用 -1 高压缩档
PS1/PS2 的单碟大作建议直接上-1。以一张 4.4 GB 的 PS2 单碟为例,压完通常落在 1.5 GB 上下,省六成空间。代价是转换期间 CPU 会满载一段时间,睡前挂着跑就行 😌 日常反复折腾、想快速出片的,用-0,几分钟搞定,体积大约省一半。
多碟游戏集:逐碟转换,文件名保留盘号
双碟、四碟作品按盘分别转换,然后把所有 CHD 放进同一个游戏文件夹:
chdman createcd -i game-disc1.iso -o game-disc1.chd -0 chdman createcd -i game-disc2.iso -o game-disc2.chd -0注意文件名要保留盘号规律(game-disc1.chd、game-disc2.chd)。ROMm 会把同一文件夹下的多张盘归到一款游戏下,Web 端播放时按盘号自动选盘,切换体验和 ISO 时代没有区别。
千款级大库:一行 find 批量搞定
上千款游戏的手动转换不现实,用下面这段脚本一把梭:
find /roms/ps2 -name "*.iso" -print0 | \ while IFS= read -r -d '' f; do chdman createcd -i "$f" -o "${f%.iso}.chd" -0 done它会扫出目录下所有.iso,逐个压成同名的.chd。跑完先别删原文件,用du -sh前后对比一下目录体积,确认省下的空间符合预期再清理:
du -sh /roms/ps2出错了怎么办:排障速查
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 压缩进度卡在 99% 不动 | 源镜像里有坏扇区 | 先试chdman fix -i game.chd修复输出文件;修复不了就换一张质量更好的镜像源,硬压出来的文件加载时也会出鬼 |
| 压完 CHD 反而比 ISO 大 | 源文件本身已压缩过(如 7z 再套一层) | 解回原始 ISO 再压;确实要硬来就给createcd加--force强制转换,但体积收益别期待 |
| 模拟器加载闪退或卡死 | 压缩档位过高,或模拟器版本太老 | 档位从-1降到-0重压一次,同时把模拟器更新到最新版——老版 CHD 驱动对新参数支持不全 |
| 多盘游戏换盘失败 | 各盘 CHD 不在同一文件夹,或文件名没有盘号规律 | 归到同一游戏文件夹,文件名恢复game-disc1.chd这类带盘号的写法 |
最后留个验证习惯:跑chdman info -i game.chd,拿输出里对应原始数据的 SHA1 去和镜像源发布的 SHA1 比对,一致就说明压得干干净净。这个哈希同样存在 ROMm 库里,重复导入同一款游戏时能自动识别,不用手动查重。
第一步就这么简单:找一张单碟 ISO,把createcd和info两条命令跑通,再把生成的 CHD 丢进 ROMm 库看效果。第一张验证没问题,剩下的就是批量复制粘贴的事 🚀
【免费下载链接】rommA beautiful, powerful, self-hosted ROM manager and player.项目地址: https://gitcode.com/GitHub_Trending/rom/romm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考