
在开始之前,先明确目标:是否需要全量镜像 Apple 更新、提供内部测试(staging)catalog、或仅使用缓存服务。准备工作包括:一台 Linux/macOS 服务器(至少 100GB 空间,网络带宽按客户端规模规划)、SSH 访问、域名与 HTTPS 证书、MDM(如 Jamf、Intune、Mosyle 等)或有能力下发配置描述文件的系统。
常见方案:1) Apple Content Caching(适合少量内部设备,简单启用);2) Reposado(开源,能镜像 Apple 的更新 catalog 并选择产品);3) 第三方产品(Munki、MunkiReport 配合 Repo)。企业级推荐 Reposado + HTTPS。选择后准备好 Web 服务(nginx/apache)和空间。
1. 安装依赖:在 Ubuntu 上 sudo apt update && sudo apt install git python3 python3-pip apache2 -y。2. 克隆 reposado:git clone https://github.com/wdas/reposado.git /opt/reposado。3. 编辑 /opt/reposado/code/preferences.py,设置 ADMIN_EMAIL、BASEURL(本地 URL 如 https://updates.example.com)。4. 运行 repo_sync:cd /opt/reposado && ./repoutil.py sync_all_products,首次同步耗时较长。5. 配置 Web:将 /opt/reposado/repos 下的目录映射到 Apache 的 DocumentRoot 或配置虚拟主机并启用 HTTPS。
使用 Let's Encrypt 或企业 CA 签发证书,配置 nginx/apache 强制 TLS。为防止被外部访问,使用防火墙限制只允许内部网段访问,或通过 VPN。为管理 API/同步使用单独管理端口并配置 HTTP 基本认证或IP白名单。
短期测试可用命令行:sudo softwareupdate --set-catalog https://updates.example.com/catalogs/others/index.sucatalog。验证:sudo softwareupdate --list 会根据新的 catalog 列出可用更新。恢复默认:sudo softwareupdate --clear-catalog 或删除 /Library/Preferences/com.apple.SoftwareUpdate.plist 中的 CatalogURL 键。
创建配置描述文件 payload,Domain 为 com.apple.SoftwareUpdate,Key 为 CatalogURL(String),值为镜像地址。将该描述文件通过 MDM 下发到目标设备组。优点:可针对不同设备组(测试/生产)下发不同 URL,便于切换。
Jamf:Devices → Configuration Profiles → New → Custom 或 Software Update payload,添加 com.apple.SoftwareUpdate 的 CatalogURL 字段并下发到 smart group。Intune:通过 macOS 设备配置文件上传自定义 .mobileconfig 并部署。同样可通过 scope 控制部署对象。
把 reposado 的 manifest(/opt/reposado/repos)或你维护的 catalog 配置放到 Git 仓库:每次同步/修改都提交变更,并使用分支区分环境(main=production,staging=test)。使用标签(tag)标记推送到生产的时间点与版本号,便于回滚。
建立自动化流程:1) 定期(或手动)同步 Apple 更新到 staging 仓库;2) 触发 CI(脚本自动运行基本兼容测试,如下载并检查校验和);3) 将 staging catalog 指向少量 pilot 设备;4) 通过 MDM 更改生产组的 CatalogURL 为生产库;5) 在 Git 中打 tag,记录版本与变更日志。
回滚原则:保持旧 catalog 可用。步骤:1) 如果新 catalog 有问题,将 MDM 中生产组的 CatalogURL 指向之前的 tag 对应 URL(或临时清除并指向 Apple 官方);2) 通知客户端执行 sudo softwareupdate --clear-catalog 或等待下次策略更新;3) 在 Git 中记录回滚原因与修复计划。
确保镜像目录只能被受信任管理员写入。Catalog 文件最好通过 HTTPS 发布并使用受信任证书。不要修改 Apple 的签名包内容。对外暴露时要限制访问,记录访问日志以便审计。
服务端:监控磁盘、带宽、sync 脚本失败告警。客户端:使用 sudo softwareupdate --list 检查可见更新;查看 /var/log/install.log 或使用 Console.app 检查失败原因。在 MDM 中查看策略下发状态与设备反馈。
如果设备仍然从 Apple 官方拉取更新,检查:1) CatalogURL 是否生效(profiles -P 或 defaults read /Library/Preferences/com.apple.SoftwareUpdate CatalogURL);2) HTTPS 证书是否可信;3) 是否存在网络直连策略或 PAC 文件覆盖;4) MDM 下发的配置是否已生效。
为大量客户端建议:1) 在多个地点部署镜像或使用 CDN;2) 使用内容缓存服务器(Apple Content Caching)减轻带宽;3) 将同步窗口安排在非高峰时段并做带宽限制;4) 将大型完整安装器通过另一路径(比如内部文件共享)分发。
答:在客户端执行 sudo softwareupdate --clear-catalog(或用 MDM 删除/替换 com.apple.SoftwareUpdate 的 CatalogURL 配置),然后重启或等待策略生效。确认方法:sudo defaults read /Library/Preferences/com.apple.SoftwareUpdate CatalogURL 返回空或不存在。
答:设置 CatalogURL 会改变客户端查询的更新源,但自动更新(系统偏好中的“自动保持我的 Mac 最新”)仍然按原有策略运行;只是更新项来自指定的 catalog。确保镜像中包含需要的更新与元数据,否则可能导致部分更新不可见。
答:采用分阶段推广:先在 staging 同步并测试,然后在小范围 pilot 设备组验证;使用 MDM 将生产组临时指向新 catalog,监控错误与回滚概率;在 Git 中记录每次 promotion 并打 tag,以便快速回退到先前的 catalog。