Skip to content

Instantly share code, notes, and snippets.

@bczhc
Created December 6, 2025 03:27
Show Gist options
  • Select an option

  • Save bczhc/57712b5330091470d40f89d90b22ab3b to your computer and use it in GitHub Desktop.

Select an option

Save bczhc/57712b5330091470d40f89d90b22ab3b to your computer and use it in GitHub Desktop.
Wplace diff快照创建 VPS存储优化快速笔记(ChatGPT生成) #diff #wplace #vps

Wplace 快照存储与 diff 工具优化笔记

背景与问题

  • Wplace 的快照以 .tar.gz 格式发布在 murolem/wplace-archives 仓库。
  • 每个快照体积巨大(约 10GB)。
  • 为了节省存储,我在 bczhc/wplace-tools 实现了相邻快照间的 diff 生成策略,仅需存储一个完整快照 + 后续的连续 diff。
  • 运行环境为 VPS,硬盘仅有 20GB 可用空间。

第一阶段:基于目录的 diff(失败)

最初将 .tar.gz 解压为文件目录进行 diff,但发现 du -sh 显示的实际磁盘占用极大,远超 .tar.gz 本身大小。
du -sh --apparent-size 则与压缩包大小接近。

原因
解压后的大量细碎图片文件(PNG)导致文件系统元数据(inode、目录项等)开销巨大,且许多文件系统对大量小文件的存储效率较低(例如默认块大小为 4KB,即使文件很小也会占用一个块)。此外,文件系统可能因日志、备份元数据等进一步放大空间占用。


第二阶段:直接读取 .tar 文件

改为不解压,直接读取 .tar 文件:

  1. 在 VPS 上使用 curl + gzip -d 流式解压为 .tar(不压缩)。
  2. diff 程序先扫描 .tar,建立文件条目映射(文件名 → 偏移量 + 大小)。
  3. 需要文件时,通过 seek + take 直接读取 .tar 中的对应数据块。

这样做:

  • 避免解压到文件系统,空间占用接近 .tar 本身。

  • .tar.tar.gz 稍大,但仍在可接受范围。

  • 随着 Wplace 快照体积增长,存储仍逐渐吃紧。


第三阶段:使用 SquashFS 压缩存储

为了进一步压缩存储空间,采用 SquashFS:

SquashFS 创建方法(流式创建)

使用 AgentD/squashfs-tools-ng 工具进行流式创建:

  1. 创建索引文件 index

    file /a.tar 0755 0 0 /dev/stdin
    
  2. 流式生成命令

    curl -s <快照URL> | gzip -d | gensquashfs -c gzip -F index img.sqfs
  3. 结果

    • 生成的 img.sqfs 中包含一个文件 /a.tar,内容即为原始 .tar.gz 解压后的数据。
    • 支持透明压缩。

使用方式

  1. 挂载 SquashFS:

    mount img.sqfs /mnt -t squashfs -o loop
  2. diff 程序直接读取 /mnt/a.tar,通过预建的 .tar 索引实现快速文件定位。

优点

  • 进一步节省空间:SquashFS 对已压缩的 PNG 仍有少量压缩效果,且整体存储效率高于裸 .tar
  • 程序无需改动:diff 程序仍按原方式读取 .tar 文件。

缺点

  • 性能开销:SquashFS 的压缩/解压增加了 diff 创建时间。

未来可能的优化方向

  1. 利用空闲内存 服务器内存尚有富余,可考虑:
    • 使用 tmpfs + LVM 等方式创建一个更大的文件系统空间供 diff 程序使用。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment