如何用RomM管好CHD压缩ROM库
2026/9/13 19:34:20 网站建设 项目流程

如何用RomM管好CHD压缩ROM库

【免费下载链接】rommA beautiful, powerful, self-hosted ROM manager and player.项目地址: https://gitcode.com/GitHub_Trending/rom/romm

RomM 是一款自托管的 ROM 管理工具,原生支持扫描 CHD 压缩 ROM:它直接读取文件头内嵌的 SHA1 哈希来识别游戏,不用解压、不用转格式,建库又快又准。

为什么光盘镜像适合 CHD 压缩

一张 PS2 的 DVD 镜像动辄 4~8GB,一百个游戏就能吃掉近 500GB 硬盘。CHD(Compressed Hunks of Data)是 MAME 团队做的无损压缩格式,只存有效数据块,典型光盘镜像能省下 30%~70% 的体积,而且模拟器支持流式读取,游玩时无需先解压。

如果你的收藏已经转成了 .chd,下一个问题是:管理工具认不认它?多数工具按整文件算哈希,但 CHD 的压缩结果每次生成都可能不同,文件哈希根本没法和 ROM 数据库对账。RomM 的取舍不一样——它不算 CHD 文件本身的哈希,而是把 CHD 头部自己记录的“原始光盘 SHA1”取出来用。

RomM 的游戏库浏览界面,扫描后按平台自动展示封面与元数据

clone 仓库,一条命令起容器

官方推荐用 Docker 部署,仓库里带了现成的 compose 文件,填好数据库账号和密钥就能跑:

git clone https://gitcode.com/GitHub_Trending/rom/romm cd romm docker compose up -d

代码片段来自:docker-compose.yml

环境变量说明可以参考 examples/docker-compose.example.yml 里的逐行注释。记得把游戏目录挂载到容器的 /romm/library,并按“平台/游戏名”两级文件夹组织文件,CHD 文件放平台目录下即可。首次启动会自动全库扫描,CHD 文件会被识别并进入哈希匹配流程。

RomM 识别 CHD 文件的两步逻辑

识别代码在 backend/utils/archives.py,思路是两步:

先用扩展名或 libmagic 判断文件是不是 CHD;确认后再读文件头前 124 字节,校验 MComprHD 签名和版本号,最后取出内嵌的 raw+meta SHA1:

version = int.from_bytes(header[CHD_VERSION_OFFSET:version_end], "big") if version != CHD_V5_VERSION: return "" sha1_bytes = header[CHD_V5_SHA1_OFFSET:sha1_end] return sha1_bytes.hex()

代码片段来自:backend/utils/archives.py

扫描时这个值会写进 rom_files 表的 chd_sha1_hash 字段(该列由迁移脚本 0080_add_chd_sha1_hash.py 添加),后续的所有哈希检索都依赖它。

用内嵌 SHA1 给 CHD 游戏对账

数据库查询端把 40 位十六进制摘要同时映射到 sha1_hash 和 chd_sha1_hash 两个字段:

ROM_FILE_HASH_COLUMNS_BY_DIGEST_LENGTH = { 8: (RomFile.crc_hash,), 32: (RomFile.md5_hash, RomFile.ra_hash), 40: (RomFile.sha1_hash, RomFile.chd_sha1_hash), }

代码片段来自:backend/handler/database/roms_handler.py

也就是说,MAMERedump 等数据库公布的是原始光盘的 SHA1,而你的文件是被压缩过的 CHD——两者照样能对上,这正是“存内嵌哈希”而不是“算文件哈希”的价值。多碟游戏同理:逐文件保留各自哈希,方便逐张对账。

三个容易踩的坑

只认 CHD v5

代码写死了只处理 v5 版本,这是和 MAMERedump 数据库对齐的结果。老版 chdman 生成的 v4 文件取不到哈希,建议用新版 chdman 重新转换。

RetroAchievements 要特殊处理

RAHasher 不支持用 /* 通配符处理 CHD 路径。RomM 扫描时会挑出该游戏下体积最大的 CHD 直接传给 RAHasher(见 backend/handler/filesystem/roms_handler.py),所以成就进度追踪不会因为你用 CHD 而失效。

文件夹结构别偷懒

CHD 也要按平台目录存放:ps1/ 放 PS1 的 .chd,ps2/ 放 PS2 的。平台匹配错了,扫描结果就全乱了。

官方 Android 应用 Argosy 扫码配对 RomM 后,可下载游戏并在掌机上播放

库建好之后,把 RomM 同步到 Playnite 或官方掌机应用,游戏按需下载、存档自动回传,CHD 的压缩收益才算完整落地。现在就去把首次扫描跑起来,看看有多少游戏能被正确识别吧。

【免费下载链接】rommA beautiful, powerful, self-hosted ROM manager and player.项目地址: https://gitcode.com/GitHub_Trending/rom/romm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询