一、脚本核心功能与架构
该脚本实现了基于本地光盘自动搭建 FTP Yum 源服务器的功能,主要包含以下模块:
- 环境准备:检查依赖命令、挂载光盘、备份并配置本地 Yum 源
- 依赖安装:通过本地 Yum 源安装 vsftpd、createrepo 等工具
- 仓库构建:创建 FTP 目录结构,复制光盘内容,生成元数据
- 服务配置:启动 VSFTPD 服务,配置防火墙规则
- 信息展示:输出访问地址和测试命令
二、关键技术点解析
-
光盘挂载与验证
mount_cdrom() { if ! mountpoint -q "$MOUNT_POINT"; then umount "$MOUNT_POINT" 2>/dev/null # 清理残留挂载 mount "$CDROM_DEVICE" "$MOUNT_POINT" || log_error "挂载失败" fi # 验证光盘内容完整性 [[ ! -d "$MOUNT_POINT/Packages" || ! -d "$MOUNT_POINT/repodata" ]] && log_error "光盘内容不完整" }
- 技术细节:
- 使用
mountpoint -q
检查挂载状态,避免重复挂载 - 通过验证
Packages
和repodata
目录确保光盘内容完整
- 使用
- 技术细节:
-
临时 Yum 源配置
setup_local_repo() { # 备份原有配置 mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ # 创建本地Yum源配置 cat > /etc/yum.repos.d/local-cdrom.repo <<EOF [local-cdrom] name=CentOS-7 Local CDROM baseurl=file://$MOUNT_POINT enabled=1 gpgcheck=0 # 临时关闭GPG校验 EOF }
- 设计思路:
- 临时切换到本地 Yum 源,确保后续依赖安装成功
- 关闭 GPG 校验避免公钥缺失导致的安装失败
- 设计思路:
-
FTP 仓库构建
# 创建目录结构 for dir in "${REPO_DIRS[@]}"; do mkdir -p "$FTP_ROOT/$dir/x86_64" done # 复制光盘内容并生成元数据 cp -r "$MOUNT_POINT"/* "$FTP_ROOT/os/x86_64/" for dir in "${REPO_DIRS[@]}"; do createrepo -v "$FTP_ROOT/$dir/x86_64/" done
- 目录结构:
/var/ftp/pub/centos/7/ ├── os │ └── x86_64 ├── updates │ └── x86_64 ├── extras │ └── x86_64 └── epel └── x86_64
- 目录结构:
-
服务与防火墙配置
# 启动VSFTPD服务 systemctl enable vsftpd --now # 配置防火墙(CentOS 7+) firewall-cmd --add-service=ftp --permanent firewall-cmd --reload
- 安全考量:
- 使用 systemd 管理服务,确保开机自启
- 仅开放必要的 FTP 端口(TCP/21)
- 安全考量:
三、应用场景与优势
-
适用环境
- 内网环境中无法访问外网 Yum 源
- 多服务器需要统一软件安装源
- 服务器性能有限,避免重复下载相同软件包
-
核心优势
- 离线安装:基于本地光盘,无需外网连接
- 高效部署:一次性配置,多服务器共享使用
- 版本一致:确保所有服务器使用相同版本的软件包
四、使用方法与验证
-
执行命令
chmod +x setup_ftp_yum_server.sh sudo ./setup_ftp_yum_server.sh
-
客户端配置示例
在需要使用该 FTP Yum 源的客户端服务器上:# 创建Yum源配置文件 cat > /etc/yum.repos.d/ftp-base.repo <<EOF [ftp-base] name=CentOS-7 FTP Base baseurl=ftp://<服务器IP>/pub/centos/7/os/x86_64/ enabled=1 gpgcheck=0 [ftp-updates] name=CentOS-7 FTP Updates baseurl=ftp://<服务器IP>/pub/centos/7/updates/x86_64/ enabled=1 gpgcheck=0 EOF # 测试Yum源 yum clean all yum repolist
-
验证方法
# 检查可用软件包 yum --enablerepo=ftp-base list # 尝试安装测试包 yum --enablerepo=ftp-base install tree -y
五、优化建议与注意事项
-
扩展功能
- 自动更新机制:添加定时任务同步外网更新
cat > /etc/cron.daily/update-ftp-repo <<EOF #!/bin/bash mount -o remount "$CDROM_DEVICE" "$MOUNT_POINT" cp -ru "$MOUNT_POINT"/* "$FTP_ROOT/os/x86_64/" createrepo -v --update "$FTP_ROOT/os/x86_64/" EOF chmod +x /etc/cron.daily/update-ftp-repo
- 自动更新机制:添加定时任务同步外网更新
-
安全强化
- 启用 GPG 校验:
# 在Yum源配置中启用gpgcheck=1 # 导入CentOS GPG密钥 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
- 启用 GPG 校验:
-
故障排查
- 无法访问 FTP:检查防火墙规则和 SELinux 状态
# 临时关闭SELinux测试 setenforce 0 # 检查VSFTPD日志 tail -f /var/log/vsftpd.log
- 无法访问 FTP:检查防火墙规则和 SELinux 状态
-
注意事项
- 确保服务器有足够空间(至少 8GB 用于存储 CentOS 7 完整内容)
- 复制过程可能需要数分钟,取决于服务器性能
- 光盘内容变化时需重新执行脚本或手动更新
六、总结
该脚本通过自动化手段将本地光盘转换为可共享的 FTP Yum 源,解决了内网环境中软件包安装与更新的难题。通过标准化的目录结构和元数据生成,实现了高效、一致的软件部署方案。在企业级环境中,可进一步结合自动化工具(如 Ansible)实现多服务器的集中配置与管理,提升运维效率。
#!/bin/bash
# 功能:基于本地光盘搭建FTP Yum源(强制挂载到/mnt)
# 用法:chmod +x setup_ftp_yum_server.sh && sudo ./setup_ftp_yum_server.sh
# 配置参数
CDROM_DEVICE="/dev/sr0" # 光盘设备
MOUNT_POINT="/mnt" # 强制挂载点
FTP_ROOT="/var/ftp/pub/centos/7"
REPO_DIRS=("os" "updates" "extras" "epel")
# 日志函数
log_info() { echo -e "\033[1;32m[INFO]\033[0m $1"; }
log_warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; }
log_error() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; }
# 检查命令是否存在
check_cmd() {
command -v $1 >/dev/null 2>&1 || log_error "未找到命令:$1,请检查系统环境"
}
# 检查文件/目录是否存在
check_path() {
[[ ! -e "$1" ]] && log_error "路径不存在:$1"
}
# 检查并挂载光盘
mount_cdrom() {
log_info "检查光盘挂载状态..."
if ! mountpoint -q "$MOUNT_POINT"; then
log_warn "挂载点 $MOUNT_POINT 未挂载,尝试挂载..."
# 卸载可能的残留挂载
umount "$MOUNT_POINT" 2>/dev/null
# 强制挂载光盘到/mnt
mount "$CDROM_DEVICE" "$MOUNT_POINT" || log_error "挂载失败:$CDROM_DEVICE → $MOUNT_POINT"
log_info "已成功挂载到 $MOUNT_POINT"
else
log_info "挂载点 $MOUNT_POINT 已挂载"
fi
# 验证光盘内容
[[ ! -d "$MOUNT_POINT/Packages" || ! -d "$MOUNT_POINT/repodata" ]] && {
log_error "光盘内容不完整!请确保插入的是CentOS 7安装光盘"
}
}
# 配置本地Yum源
setup_local_repo() {
log_info "配置本地Yum源..."
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 2>/dev/null
cat > /etc/yum.repos.d/local-cdrom.repo <<EOF
[local-cdrom]
name=CentOS-7 Local CDROM
baseurl=file://$MOUNT_POINT
enabled=1
gpgcheck=0 # 临时关闭校验,避免公钥问题
EOF
yum clean all >/dev/null 2>&1
log_info "尝试生成Yum缓存..."
yum makecache || {
log_error "Yum缓存生成失败!请检查:
1. 光盘是否正确挂载 ($MOUNT_POINT)
2. 光盘内容是否完整 (Packages/repodata目录)
3. 配置文件 /etc/yum.repos.d/local-cdrom.repo"
}
log_info "本地Yum源配置成功"
}
# 安装依赖
install_dependencies() {
log_info "安装必要软件包..."
yum install -y vsftpd createrepo yum-utils || {
log_error "依赖安装失败!尝试手动安装:
1. cd $MOUNT_POINT/Packages
2. rpm -ivh createrepo-*.rpm"
}
log_info "依赖安装完成"
}
# 主流程
main() {
log_info "开始配置FTP Yum源服务器..."
check_cmd mount
check_cmd createrepo
check_cmd yum
mount_cdrom
setup_local_repo
install_dependencies
log_info "创建FTP目录结构..."
mkdir -p "$FTP_ROOT"
for dir in "${REPO_DIRS[@]}"; do
mkdir -p "$FTP_ROOT/$dir/x86_64"
done
log_info "复制光盘内容到FTP仓库..."
cp -r "$MOUNT_POINT"/* "$FTP_ROOT/os/x86_64/" || {
log_error "复制失败!请检查挂载点权限或空间是否充足"
}
log_info "生成仓库元数据..."
for dir in "${REPO_DIRS[@]}"; do
createrepo -v "$FTP_ROOT/$dir/x86_64/" 2>/dev/null || {
log_warn "仓库 $dir 元数据生成失败(可能为空)"
}
done
log_info "配置并启动VSFTPD服务..."
systemctl enable vsftpd --now || log_error "VSFTPD服务启动失败!"
log_info "配置防火墙..."
firewall-cmd --add-service=ftp --permanent >/dev/null 2>&1 || {
log_warn "防火墙配置失败!请手动开放端口21"
}
firewall-cmd --reload >/dev/null 2>&1
# 恢复原有Yum源配置
log_info "恢复原有Yum源配置..."
mv /etc/yum.repos.d/bak/*.repo /etc/yum.repos.d/ 2>/dev/null
yum clean all >/dev/null 2>&1
SERVER_IP=$(hostname -I | awk '{print $1}')
echo "========================================"
echo "FTP Yum源配置完成!"
echo " - 服务器IP: $SERVER_IP"
echo " - 访问路径: ftp://$SERVER_IP/pub/centos/7/"
echo " - 测试命令: yum --enablerepo=local-base list"
echo "========================================"
}
main