针对“不买新服务器、不加磁盘空间、不使用机械硬盘”的条件最务实可行的方案是将代码与编译产物分离用 SquashFS 压缩基础源码 OverlayFS 写时复制让每位开发者的磁盘只保存自己的修改和编译输出从根本上消除多份相同源码的重复占用。文章目录核心思路具体方案SquashFS OverlayFS1. 总体架构2. 为什么 Git 可以正常使用3. 空间收益估算实施步骤阶段一制作基础镜像以 Android 13 为例阶段二为开发者配置 Overlay 工作环境阶段三逐步切换释放空间阶段四多版本管理辅助优化进一步榨空间总结核心思路当前磁盘紧张的根本原因是每个开发者独立存放一份完整的 SDK含 Git 仓库每人约 300 GB编译后out目录又占约 300 GB5 块盘上有大量完全相同的安卓平台代码和 Git 历史如果们把一份公共的只读基础代码共享给所有人每人只在自己的盘上存自己的修改文件通常 10 GB一份或多份编译输出可独立放置就能节省出数 TB 的空间完全可以应付后续新增的 Android 版本。具体方案SquashFS OverlayFS1. 总体架构在机房服务器上选一或多个剩余空间较多的分区存放各 Android 版本的SquashFS 只读压缩镜像。每位开发者在其“自己那块磁盘”上创建两个目录upperdir存放对源码的修改写时复制层workdirOverlayFS 内部工作目录空通过 OverlayFS 将“公共压缩镜像 个人修改层”合并挂载到一个工作目录如~/android供开发者直接使用。编译输出通过export OUT_DIR/media/自己盘/out_android13指定到独立路径绝不放在 merged 目录内避免把几百 GB 写进 upper 层。2. 为什么 Git 可以正常使用基础镜像保留完整的.git目录。挂载后整个仓库在只读层可读当开发者执行git add / commit时只有被修改的 Git 对象、索引、引用等文件会通过写时复制自动进入upperdir历史对象仍共享只读层。因此开发者可以像往常一样拉代码、改代码、提交到 Gerrit无需改变工作习惯。3. 空间收益估算一套 Android 源码约 300 GB经 SquashFSxz 或 zstd压缩后大概100 ~ 150 GB。19 套版本若全部制作镜像约需1.9 ~ 2.8 TB但也可以先只做当前在用的版本。每名开发者原本独占 300 GB 源码切换后只需upperdir少量修改 10 GBout目录 ≈ 300 GB可按版本保留 1~2 个5 人 *300 GB 源码≈ 1.5 TB 重复文件被消除加上可集中清理旧的out现有 17.5 TB 总量能够重新被利用起来满足后续多个新版本。实施步骤阶段一制作基础镜像以 Android 13 为例找一块剩余空间最多的盘如/media/4剩余 354 GB作为“公共镜像区”。# 1. 从 Gerrit 完整拉取一套代码含 .git不编译cd/media/4mkdirbase_srccdbase_src repo init-ugerrit://your-server/manifest-bandroid13reposync-c--no-tags# 2. 生成压缩镜像推荐 zstd速度与压缩率均衡mksquashfs /media/4/base_src/android13 /media/4/images/android13.sqfs\-compzstd -Xcompression-level6-noappend# 3. 挂载为只读写入 /etc/fstab 持久化mkdir-p/mnt/ro/android13mount-tsquashfs-oloop /media/4/images/android13.sqfs /mnt/ro/android13阶段二为开发者配置 Overlay 工作环境假设开发者 A 的磁盘是/media/1。# 准备目录mkdir-p/media/1/{upper_13,work_13,merged_13,out_13}# 挂载 OverlayFS可加入 fstab用 systemd mount 管理mount-toverlay overlay_13\-olowerdir/mnt/ro/android13,upperdir/media/1/upper_13,workdir/media/1/work_13\/media/1/merged_13# 设置编译输出exportOUT_DIR/media/1/out_13cd/media/1/merged_13sourcebuild/envsetup.shlunch xxx此后开发者进入/media/1/merged_13即看到完整源码可修改、编译。所有修改自动存进/media/1/upper_13占空间极小。卸载 Overlay 后upper 目录里就是全部改动可直接备份或迁移。git push到 Gerrit 的行为与原来完全一致。阶段三逐步切换释放空间先让一个在/media/4工作的开发者切换到 Overlay 方案验证编译和提交流程后删除其原来那份 300 GB 的源码目录。此时/media/4会多出 300 GB 空间可用它继续制作下一个版本的镜像。依次把所有人迁移过来原先各自磁盘上重复的源码都可以删掉空间越迁越宽裕。阶段四多版本管理每人可能同时负责多个 Android 版本只需为每个版本挂一个merged目录指定各自的upper、out。例如同时维护 Android 13 和 14merged_13→out_13300 GBmerged_14→out_14300 GB3.5 TB 磁盘可以轻松放 5~6 个out完全够用。不用的out直接删除需要时重新编译即可。辅助优化进一步榨空间启用 ccacheexportUSE_CCACHE1exportCCACHE_DIR/media/1/ccache prebuilts/misc/linux-x86/ccache/ccache-M50G跨版本、重复编译的对象会被复用既能提速又能减少out重复。清理无用中间文件编译完可以只保留镜像刷机包和符号删除obj、host等中间产物需要时可重编。利用磁盘现有的空闲空间开始无需一次性腾出 TB 级连续空间利用/media/4剩 354 G先存第一个镜像滚雪球式释放其他磁盘。总结通过SquashFS 压缩共享基础代码 OverlayFS 写时复制在不买新服务器、不加硬盘、不用机械盘的前提下能够消除≥1.5 TB 的多份重复源码为未来增加更多 Android 版本提供足够的弹性空间让开发者无感使用 Git 和 Gerrit保持原有工作流所有改动都基于现有 SSDI/O 性能和编译速度影响可控压缩镜像只读CPU 开销很小。这套方案在嵌入式、Android 系统开发中已有成熟先例