基于本地光盘搭建 FTP Yum 源脚本解析与应用指南(附脚本)

一、脚本核心功能与架构

该脚本实现了基于本地光盘自动搭建 FTP Yum 源服务器的功能,主要包含以下模块:

  1. 环境准备:检查依赖命令、挂载光盘、备份并配置本地 Yum 源
  2. 依赖安装:通过本地 Yum 源安装 vsftpd、createrepo 等工具
  3. 仓库构建:创建 FTP 目录结构,复制光盘内容,生成元数据
  4. 服务配置:启动 VSFTPD 服务,配置防火墙规则
  5. 信息展示:输出访问地址和测试命令
二、关键技术点解析
  1. 光盘挂载与验证

    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检查挂载状态,避免重复挂载
      • 通过验证Packagesrepodata目录确保光盘内容完整
  2. 临时 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 校验避免公钥缺失导致的安装失败
  3. 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
      
  4. 服务与防火墙配置

    # 启动VSFTPD服务
    systemctl enable vsftpd --now
    
    # 配置防火墙(CentOS 7+)
    firewall-cmd --add-service=ftp --permanent
    firewall-cmd --reload
    
     
    • 安全考量
      • 使用 systemd 管理服务,确保开机自启
      • 仅开放必要的 FTP 端口(TCP/21)
三、应用场景与优势
  1. 适用环境

    • 内网环境中无法访问外网 Yum 源
    • 多服务器需要统一软件安装源
    • 服务器性能有限,避免重复下载相同软件包
  2. 核心优势

    • 离线安装:基于本地光盘,无需外网连接
    • 高效部署:一次性配置,多服务器共享使用
    • 版本一致:确保所有服务器使用相同版本的软件包
四、使用方法与验证
  1. 执行命令

    chmod +x setup_ftp_yum_server.sh
    sudo ./setup_ftp_yum_server.sh
    
  2. 客户端配置示例
    在需要使用该 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
    
  3. 验证方法

    # 检查可用软件包
    yum --enablerepo=ftp-base list
    
    # 尝试安装测试包
    yum --enablerepo=ftp-base install tree -y
    
五、优化建议与注意事项
  1. 扩展功能

    • 自动更新机制:添加定时任务同步外网更新
      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
      
  2. 安全强化

    • 启用 GPG 校验:
      # 在Yum源配置中启用gpgcheck=1
      # 导入CentOS GPG密钥
      rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
      
  3. 故障排查

    • 无法访问 FTP:检查防火墙规则和 SELinux 状态
      # 临时关闭SELinux测试
      setenforce 0
      
      # 检查VSFTPD日志
      tail -f /var/log/vsftpd.log
      
  4. 注意事项

    • 确保服务器有足够空间(至少 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值