Linux定期自动更新本地yum源的rpm包
一、原理
本地 Yum 源本质是存放 rpm 包的目录,通过repodata索引文件(记录包依赖、版本等信息)供客户端识别。定期更新的核心逻辑是:
- 从上游 Yum 源(如麒麟官方镜像、第三方仓库)同步最新的 rpm 包到本地目录;
- 生成 / 更新本地目录的repodata索引文件,确保客户端能识别新包。
二、具体实现步骤
1. 准备工具:reposync和createrepo
- reposync:用于从上游 Yum 源同步 rpm 包到本地(需安装yum-utils);
- createrepo:用于生成 / 更新repodata索引文件(需安装createrepo)。
安装命令:
yum install -y yum-utils createrepo
2. 创建同步脚本
vi /etc/yum.repos.d/update_local_yum.sh
新建脚本,实现rpm包自动同步和索引更新,内容如下:
#!/bin/bash # 配置参数 - 多个上游Yum源的repo ID数组 UPSTREAM_REPOS=("ks10-adv-os", "ks10-adv-updates" ) # 本地Yum源根目录 LOCAL_YUM_DIR="/data/yum/kylin/V10SP3" # 日志文件路径 LOG_FILE="/var/log/update_local_yum.log" # 可根据实际环境改为dnf reposync REPOSYNC_CMD="reposync" # 确保本地根目录存在 mkdir -p "$LOCAL_YUM_DIR" || { echo "[$(date)] 无法创建目录 $LOCAL_YUM_DIR" >> "$LOG_FILE"; exit 1; } # 记录开始时间 echo "===== 开始批量同步:$(date) =====" >> "$LOG_FILE" # 循环处理每个仓库 for repo in "${UPSTREAM_REPOS[@]}"; do echo "----- 开始处理仓库: $repo ($(date)) -----" >> "$LOG_FILE" # 从上游同步rpm包 $REPOSYNC_CMD --repo "$repo" -p "$LOCAL_YUM_DIR" --delete >> "$LOG_FILE" 2>&1 # 检查同步是否成功 if [ $? -eq 0 ]; then echo "仓库 $repo 同步完成,开始更新索引..." >> "$LOG_FILE" # 检查目标目录是否存在 repo_dir="$LOCAL_YUM_DIR/$repo" if [ -d "$repo_dir" ]; then # 更新repodata索引 createrepo --update "$repo_dir" >> "$LOG_FILE" 2>&1 echo "仓库 $repo 索引更新完成" >> "$LOG_FILE" else echo "错误:仓库 $repo 的同步目录 $repo_dir 不存在" >> "$LOG_FILE" fi else echo "仓库 $repo 同步失败!错误代码:$?" >> "$LOG_FILE" fi echo "----- 结束处理仓库: $repo ($(date)) -----" >> "$LOG_FILE" done echo "===== 批量同步结束:$(date) =====" >> "$LOG_FILE"
关键参数说明:
- UPSTREAM_REPO:需对应/etc/yum.repos.d/中配置的上游源 ID(如CentOS-Base.repo中的[base]);
- LOCAL_YUM_DIR:本地 Yum 源目录(需确保客户端可访问,如通过 HTTP 服务暴露,需配置 Nginx/Apache);
- --delete(reposync):删除本地过时包,避免磁盘占用过大;
- --update(createrepo):仅更新新增 / 修改的包,比全量生成索引更高效。
3. 配置定时任务(crontab)
通过crontab设置定期执行脚本(每周日5点执行),命令如下:
# 赋予脚本执行权限chmod +x /usr/local/bin/update_local_yum.sh
# 编辑定时任务crontab -e
# 添加如下内容(每周日5点执行)
* 5 * * 0 sh /etc/yum.repos.d/update_local_yum.sh &
4. 验证本地 Yum 源可用性
- 客户端配置本地 Yum 源(新建/etc/yum.repos.d/kylin_aarch64_update.repo):
[ks10-adv-os-update] name = Kylin Linux Advanced Server 10 - Os baseurl = http://10.33.0.xx/V10/V10SP3-2403/ks10-adv-os/ gpgcheck = 0 enabled = 1 [ks10-adv-news-updates] name = Kylin Linux Advanced Server 10 - Updates baseurl = http://10.33.0.xx/V10/V10SP3-2403/ks10-adv-updates/ gpgcheck = 0 enabled = 1
客户端测试:
yum clean all && yum makecache # 清除缓存并加载新索引 yum list updates # 查看是否能识别到新包