一、原理
1.1 Yum源工作原理
Yum(Yellowdog Updater Modified)是RPM包管理器的高级封装工具,通过解析软件包的元数据依赖关系,自动解决软件安装时的依赖问题。其核心要素包括:
-
仓库元数据:包含软件包列表、依赖关系、版本信息
-
仓库路径:支持file://(本地)、http://(网络)、ftp://等多种协议
-
缓存机制:通过
makecache
生成元数据缓存加速查询
1.2 三种部署模式对比
类型 | 适用场景 | 核心原理 | 优势 |
---|---|---|---|
本地Yum源 | 无外网环境/快速安装 | 挂载系统镜像ISO文件 | 无需网络,速度快 |
远端Yum源 | 常规服务器环境 | 使用云镜像站仓库地址 | 版本新,包全 |
局域网Yum源 | 多节点内网环境 | HTTP服务共享仓库目录 | 统一管理,节省带宽 |
二、背景
2.1 背景需求
-
离线环境部署:物理隔离环境需安装基础软件
-
加速软件安装:解决官方源访问慢的问题
-
统一内网管理:批量设备使用相同软件版本
2.2 脚本设计目标
-
自动化完成三种Yum源部署
-
降低人工配置出错概率
-
支持主流通用镜像源切换
三、部署步骤详解
3.1 本地Yum源部署流程
# 脚本执行逻辑:
1. 创建挂载点:/mnt/cdrom
2. 挂载ISO镜像:mount /dev/cdrom
3. 备份原repo配置
4. 创建local.repo配置文件
5. 重建Yum缓存
3.2 远端镜像源切换
# 支持的镜像站:
- 阿里云:https://mirrors.aliyun.com
- 腾讯云:http://mirrors.cloud.tencent.com
- 清华源:https://mirrors.tuna.tsinghua.edu.cn
# 关键命令: wget -O /etc/yum.repos.d/CentOS-Base.repo [镜像URL]
3.3 局域网Yum源搭建
# 实现步骤:
1. 安装配置Apache:yum install httpd -y
2. 共享仓库目录:/var/www/html/yum-local/
3. 生成客户端配置文件
4. 全网段开放防火墙:
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
四、常见问题与解决方案
4.1 挂载光盘失败
# 现象:
mount: /dev/sr0 is write-protected, mounting read-only
mount: no medium found on /dev/sr0
# 解决方案:
1. 确认虚拟机已连接ISO镜像文件
2. 检查设备路径:lsblk查看光盘设备
3. 重载设备:echo " - - -" > /sys/class/scsi_host/host0/scan
4.2 镜像源下载失败
# 错误提示:
Could not resolve host: mirrors.cloud.tencent.com
# 处理步骤:
1. 检查DNS配置:cat /etc/resolv.conf
2. 测试网络连通性:ping -c 4 114.114.114.114
3. 更换下载工具:curl -O 替代wget
4.3 局域网客户端无法访问
# 排障流程:
1. 服务端检测:systemctl status httpd
2. 端口检测:netstat -tunlp | grep :80
3. 客户端测试:curl http://server-ip/yum-local/
4. 关闭SELinux(临时):
setenforce 0
五、总结与心得
5.1 实践收获
-
灵活应对多场景:通过脚本实现三种部署模式的快速切换
-
配置文件优先级:理解/etc/yum.repos.d/目录下.repo文件的读取顺序
-
自动化运维思维:减少重复劳动,提升部署效率
5.2 优化建议
-
增加镜像完整性校验(如sha256检查)
-
实现局域网源自动同步功能
-
添加HTTPS支持增强安全性
5.3 使用注意事项
-
部署前务必进行配置备份
-
局域网部署需统一所有客户端的时间
-
定期执行
yum clean all
清理旧缓存
>> 脚本获取
#!/bin/bash
# 一键部署本地/远端/局域网Yum源脚本
# 最后更新:2024.12.22
# 颜色定义
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}错误:此脚本必须以root身份运行${RESET}"
exit 1
fi
# 错误处理函数
check_command() {
if [ $? -ne 0 ]; then
echo -e "${RED}错误:$1 执行失败${RESET}"
exit 1
fi
}
# 本地Yum源部署
function bendi(){
echo -e "${YELLOW}[开始部署本地Yum源]${RESET}"
# 创建挂载目录
mkdir -p /mnt/cdrom 2>/dev/null
check_command "创建挂载目录"
# 挂载光盘
echo -e "${YELLOW}正在挂载光盘...${RESET}"
mount /dev/cdrom /mnt/cdrom || {
echo -e "${RED}光盘挂载失败!请检查:"
echo -e "1. 虚拟机是否已加载ISO镜像"
echo -e "2. 物理机是否插入安装光盘${RESET}"
exit 1
}
# 备份原配置
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null
# 创建本地repo文件
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=Local CD-ROM
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
EOF
# 重建缓存
echo -e "${YELLOW}正在重建Yum缓存...${RESET}"
yum clean all >/dev/null
yum makecache >/dev/null
check_command "Yum缓存重建"
echo -e "${GREEN}本地Yum源部署成功!${RESET}"
}
# 远端Yum源部署
function yuanduan(){
# 阿里云源
function aliyun(){
echo -e "${YELLOW}正在配置阿里云源...${RESET}"
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
check_command "下载阿里云Repo文件"
}
# 腾讯云源
function tenxun(){
echo -e "${YELLOW}正在配置腾讯云源...${RESET}"
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
check_command "下载腾讯云Repo文件"
}
# 清华源
function qinghua(){
echo -e "${YELLOW}正在配置清华源...${RESET}"
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/repo/Centos-7.repo
check_command "下载清华源Repo文件"
}
echo "请选择镜像源:"
echo "1. 阿里云"
echo "2. 腾讯云"
echo "3. 清华大学"
read -p "请输入选项(1-3): " choice
case $choice in
1) aliyun ;;
2) tenxun ;;
3) qinghua ;;
*)
echo -e "${RED}无效选项,退出脚本${RESET}"
exit 1
;;
esac
# 重建缓存
yum clean all >/dev/null
yum makecache >/dev/null
check_command "Yum缓存重建"
echo -e "${GREEN}远端Yum源配置成功!${RESET}"
}
# 局域网Yum源部署
function jyw(){
echo -e "${YELLOW}[开始部署局域网Yum源]${RESET}"
# 获取源目录
read -p "请输入本地Yum源目录路径:" YUM_SOURCE_DIR
[ ! -d "$YUM_SOURCE_DIR" ] && {
echo -e "${RED}错误:目录不存在或不可访问${RESET}"
exit 1
}
# 安装Apache
echo -e "${YELLOW}正在安装Apache服务...${RESET}"
yum install -y httpd
check_command "Apache安装"
# 配置防火墙
echo -e "${YELLOW}配置防火墙规则...${RESET}"
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
# 启动服务
systemctl start httpd
systemctl enable httpd
# 创建发布目录
WEB_DIR="/var/www/html/yum-local"
mkdir -p $WEB_DIR
# 同步文件
echo -e "${YELLOW}正在同步Yum仓库文件...${RESET}"
rsync -av $YUM_SOURCE_DIR/ $WEB_DIR/
check_command "文件同步"
# 生成repo文件
LOCAL_IP=$(hostname -I | awk '{print $1}')
cat > /etc/yum.repos.d/local.repo << EOF
[local-lan]
name=Local LAN Repository
baseurl=http://$LOCAL_IP/yum-local
enabled=1
gpgcheck=0
EOF
echo -e "${GREEN}局域网Yum源部署完成!客户端可使用以下地址访问:"
echo -e "http://$LOCAL_IP/yum-local${RESET}"
}
# 主菜单
while true; do
clear
echo -e "${YELLOW}=== Yum源部署工具 ===${RESET}"
echo "1. 部署本地Yum源"
echo "2. 切换远端镜像源"
echo "3. 搭建局域网Yum源"
echo "4. 退出"
read -p "请输入选项(1-4): " main_choice
case $main_choice in
1) bendi ;;
2) yuanduan ;;
3) jyw ;;
4)
echo -e "${GREEN}已退出脚本${RESET}"
exit 0
;;
*)
echo -e "${RED}无效选项,请重新输入${RESET}"
sleep 1
;;
esac
read -n1 -p "按任意键继续..."
done