Appearance
使用 R2 搭建私有软件镜像站:从路径规划到文件上传

背景与需求
在日常开发和运维工作中,我们经常需要分发各种大型软件包、ISO 镜像或团队内部构件。无论是跨团队协作、多地办公,还是为 CI/CD 流水线提供稳定的依赖源,一个规范、快速、稳定的内部下载站都至关重要。
直接使用官方源或公共网盘往往面临以下问题:
- ❌ 速度慢:官方源在国外,下载大文件耗时漫长
- ❌ 版本乱:同一软件的不同版本散落在各处,难以追溯
- ❌ 链接失效:网盘链接过期、官方旧版本被下架
- ❌ 无校验:缺少完整性校验文件,下载损坏难以察觉
本文以 VMware ESXi 8.0 ISO 为例,展示如何使用 Cloudflare R2 + rclone 搭建一个规范化、可扩展的私有镜像站。这套方法同样适用于 Ubuntu ISO、JDK 安装包、Docker 镜像备份等任何软件分发的场景。
为什么选择 Cloudflare R2?
- 免出口流量费:这是 R2 相比 AWS S3 的最大优势,尤其适合分发大文件
- S3 兼容 API:可以使用
rclone、awscli等成熟工具管理 - 自带 CDN 加速:绑定自定义域名后,全球访问速度都有保障
本文目标:为团队内部或公开用户提供规范、稳定、可验证的软件下载源,并记录完整的路径规划思路与操作步骤。
目录结构设计(核心经验)
最终目录树
dl.fishfinal.com
└── vmware/
└── esxi/
└── 8.0/
├── VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso
└── VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256对应的 R2 存储桶路径为:
cloudflare-r2:fishfinal-dl/vmware/esxi/8.0/设计原则解读
| 层级 | 示例 | 设计理由 |
|---|---|---|
| 域名 | dl.fishfinal.com | dl. 子域名语义化,明确表示 Download,与主站业务分离 |
| 厂商 | vmware/ | 一级分类,便于未来扩展其他厂商(如 centos/、microsoft/) |
| 产品 | esxi/ | 同一厂商可能有多个产品线(vCenter、NSX、Workstation),提前隔离 |
| 大版本 | 8.0/ | ESXi 的大版本号,小版本(U3e)放在文件名中,目录保持纯净 |
| 文件命名 | VMware-VMvisor-Installer-8.0U3e-... | 保留官方完整文件名,包含小版本和 Build Number,方便人工识别 |
为什么不在路径中重复版本号?
最初曾考虑过 /vmware/8.0/ 的结构,但存在两个问题:
- 扩展性差:如果将来要放 VMware Tools 或补丁包,无处归类
- 数据冗余:文件名已包含
8.0U3e,路径中再写一次8.0会造成脚本处理时的困扰
最终方案在 "脚本友好" 和 "人工可读" 之间取得了平衡。
实践操作步骤
准备工作
1. R2 存储桶创建与域名绑定
在 Cloudflare Dashboard 中:
- 创建 R2 存储桶(如命名为
fishfinal-dl) - 在「R2 → 存储桶 → 设置」中绑定自定义域名
dl.fishfinal.com - 配置存储桶为「公共访问」(如需公开下载)
2. rclone 安装与配置
bash
# macOS / Linux 安装
brew install rclone # macOS
sudo apt install rclone # Ubuntu/Debian
# 配置 R2
rclone configrclone config 的交互式配置可参考 R2 官方文档,关键配置项为:
- Type:
s3 - Provider:
Cloudflare - Access Key ID / Secret Access Key: 在 R2 管理页生成
- Endpoint:
https://<account-id>.r2.cloudflarestorage.com
文件上传
使用 rclone copy 命令将 ISO 文件上传至目标路径:
bash
rclone copy VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso \
cloudflare-r2:fishfinal-dl/vmware/esxi/8.0 --progress参数说明:
copy:复制文件(若目标已存在则覆盖,与sync行为不同)--progress:显示实时传输进度
上传过程中的输出示例:
Transferred: 1.2 GiB / 1.2 GiB, 100%, 45 MiB/s, ETA 0s
Transferred: 1 / 1, 100%
Elapsed time: 27.3s生成校验文件
为了确保下载者能够验证文件完整性,需要生成 .sha256 校验文件。
Linux 终端:
bash
sha256sum VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso > \
VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256macOS 终端:
bash
shasum -a 256 VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso > \
VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256Windows PowerShell:
powershell
(Get-FileHash -Path "VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso" -Algorithm SHA256).Hash + " VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso" | Out-File -FilePath "VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256"生成后的 .sha256 文件内容示例:
a1b2c3d4e5f6...(64位哈希值) VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso上传校验文件并验证公开访问
将校验文件上传至同一目录:
bash
rclone copy VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256 \
cloudflare-r2:fishfinal-dl/vmware/esxi/8.0 --progress输出示例(文件极小,传输很快):
Transferred: 118 B / 118 B, 100%, 58 B/s, ETA 0s
Transferred: 1 / 1, 100%
Elapsed time: 2.0s公网访问测试:在浏览器中打开校验文件链接,确认内容可正常读取:
https://dl.fishfinal.com/vmware/esxi/8.0/VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256下载者的验证方法:
bash
# 下载校验文件
wget https://dl.fishfinal.com/vmware/esxi/8.0/VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256
# 验证 ISO 完整性(输出 "OK" 表示文件完整)
sha256sum -c VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256踩坑与优化
路径规划的迭代过程
| 版本 | 路径示例 | 问题 |
|---|---|---|
| v1(初版) | /vmware/8.0/ | 缺少产品层(ESXi/vCenter),扩展性差;路径与文件名中的版本号重复 |
| v2(最终版) | /vmware/esxi/8.0/ | 引入产品层,命名清晰,脚本友好 |
反思:域名中的 dl 虽然语义明确,但限制了该存储桶未来存放非下载类数据的可能性。如果后续有备份需求,建议新建独立存储桶,而非混用。
R2 使用注意事项
- 公开访问权限:在 R2 控制台明确设置存储桶为「公共」或「私有」,避免意外暴露敏感数据
- 请求费用:虽然 R2 免出口流量费,但 B 类操作(读取请求) 是收费的。如果文件被大量下载,建议在 Cloudflare 仪表板设置用量告警
- 防盗链:为防止他人盗用链接,可在 Cloudflare 配置 Referer 白名单 或使用 有效期签名 URL
- 大文件上传优化:对于超大文件(>10GB),可在
rclone copy中添加--multi-thread-streams 8参数启用多线程上传
自动化脚本示例
如果你需要频繁上传 ISO 并生成校验文件,可以使用以下脚本:
bash
#!/bin/bash
# upload-iso.sh - 一键上传 ISO 并生成校验文件
ISO_FILE="$1"
R2_PATH="cloudflare-r2:fishfinal-dl/vmware/esxi/8.0/"
if [ -z "$ISO_FILE" ]; then
echo "用法: $0 <ISO文件名>"
exit 1
fi
# 生成校验文件
sha256sum "$ISO_FILE" > "${ISO_FILE}.sha256"
# 上传 ISO
rclone copy "$ISO_FILE" "$R2_PATH" --progress
# 上传校验文件
rclone copy "${ISO_FILE}.sha256" "$R2_PATH" --progress
echo "上传完成!"
echo "ISO: https://dl.fishfinal.com/vmware/esxi/8.0/$ISO_FILE"
echo "校验文件: https://dl.fishfinal.com/vmware/esxi/8.0/${ISO_FILE}.sha256"总结与扩展
当前成果
通过本文的操作,我们完成了一个规范、可扩展的 VMware 镜像站雏形:
- ✅ 清晰的目录结构(厂商 → 产品 → 大版本 → 文件)
- ✅ 完整的文件校验(ISO + .sha256 配套)
- ✅ 公网可访问的下载链接(通过 Cloudflare R2 + 自定义域名)
未来计划
- 多产品支持:按照相同结构添加 vCenter、NSX、Workstation 等产品
- 自动化同步:使用 GitHub Actions 定期检查官方新版本并自动上传
- 索引页建设:在
/vmware/esxi/8.0/下生成index.html,列出所有可用文件 - 监控与告警:配置 R2 用量监控,避免意外超量
对读者的启发
同样的方法论可以应用于任何软件分发场景:
- Linux 发行版 ISO(如 Ubuntu、CentOS、Debian)
- 开发工具安装包(如 JDK、Python、Node.js)
- 容器镜像备份(如 Docker 镜像导出文件)
- 团队内部构件(如编译产物、测试数据)
参考资源
更新日志:本文操作基于 Cloudflare R2(2026年8月)和 rclone v1.65 版本,如有变动请以官方文档为准。
