Skip to content

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

使用 R2 搭建私有软件镜像站示意图

背景与需求

在日常开发和运维工作中,我们经常需要分发各种大型软件包、ISO 镜像或团队内部构件。无论是跨团队协作、多地办公,还是为 CI/CD 流水线提供稳定的依赖源,一个规范、快速、稳定的内部下载站都至关重要。

直接使用官方源或公共网盘往往面临以下问题:

  • 速度慢:官方源在国外,下载大文件耗时漫长
  • 版本乱:同一软件的不同版本散落在各处,难以追溯
  • 链接失效:网盘链接过期、官方旧版本被下架
  • 无校验:缺少完整性校验文件,下载损坏难以察觉

本文以 VMware ESXi 8.0 ISO 为例,展示如何使用 Cloudflare R2 + rclone 搭建一个规范化、可扩展的私有镜像站。这套方法同样适用于 Ubuntu ISO、JDK 安装包、Docker 镜像备份等任何软件分发的场景。

为什么选择 Cloudflare R2?

  • 免出口流量费:这是 R2 相比 AWS S3 的最大优势,尤其适合分发大文件
  • S3 兼容 API:可以使用 rcloneawscli 等成熟工具管理
  • 自带 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.comdl. 子域名语义化,明确表示 Download,与主站业务分离
厂商vmware/一级分类,便于未来扩展其他厂商(如 centos/microsoft/
产品esxi/同一厂商可能有多个产品线(vCenter、NSX、Workstation),提前隔离
大版本8.0/ESXi 的大版本号,小版本(U3e)放在文件名中,目录保持纯净
文件命名VMware-VMvisor-Installer-8.0U3e-...保留官方完整文件名,包含小版本和 Build Number,方便人工识别

为什么不在路径中重复版本号?

最初曾考虑过 /vmware/8.0/ 的结构,但存在两个问题:

  1. 扩展性差:如果将来要放 VMware Tools 或补丁包,无处归类
  2. 数据冗余:文件名已包含 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 config

rclone 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.sha256

macOS 终端:

bash
shasum -a 256 VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso > \
  VMware-VMvisor-Installer-8.0U3e-24677879.x86_64.iso.sha256

Windows 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 使用注意事项

  1. 公开访问权限:在 R2 控制台明确设置存储桶为「公共」或「私有」,避免意外暴露敏感数据
  2. 请求费用:虽然 R2 免出口流量费,但 B 类操作(读取请求) 是收费的。如果文件被大量下载,建议在 Cloudflare 仪表板设置用量告警
  3. 防盗链:为防止他人盗用链接,可在 Cloudflare 配置 Referer 白名单 或使用 有效期签名 URL
  4. 大文件上传优化:对于超大文件(>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 版本,如有变动请以官方文档为准。

最后更新2026/08/09 12:57
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal