CentOS自建yum倉庫

akiya發表於2019-10-26

由於後面工作中可能會遇到伺服器在無公網的情況下使用,那麼這個時候就可能需要在本地搭建私有yum倉庫了。正好趁著週末學習一下如何搭建,以下是我學習自建yum倉庫的筆記。

服務端設定

安裝Nginx

這裡我預設大家都會編譯安裝Nginx,所以使用yum的方式安裝以減少文章篇幅。

  • 新增Nginx源
# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
複製程式碼
  • 安裝Nginx
# yum -y install nginx
複製程式碼
  • 啟動Nginx
# systemctl start nginx
# systemctl enable nginx
複製程式碼
  • 新增mirrors.conf
# vim /etc/nginx/conf.d/mirrors.conf
複製程式碼

內容如下:

server {
    listen 80 default_server;
    server_name _;

    location / {
        # 倉庫檔案路徑
        root /opt/aliyun-mirrors/;
        # 開啟目錄顯示功能
        autoindex on;
        # 關閉詳細檔案大小統計,預設為b,以kb、mb、gb為單位顯示
        autoindex_exact_size off;
        # 開啟以伺服器時區顯示檔案修改日期
        autoindex_localtime on;
        # 以html風格將目錄展示在瀏覽器中
        autoindex_format html;
        charset utf-8,gbk;
    }
}
複製程式碼
  • 過載配置
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# nginx -s reload
複製程式碼

搭建yum倉庫

使用Everything版本ISO搭建

Everything版本的ISO映象檔案相對rpm包要豐富一些,且使用ISO映象來搭建倉庫是比較方便快捷的。

  • 上傳iso映象檔案至伺服器
  • 建立掛載路徑
# mkdir /mnt/centos7-iso
複製程式碼
  • 掛載iso映象
# mount -o loop -t iso9660 /tmp/CentOS-7-x86_64-Everything-1908.iso /mnt/centos7-iso/
mount: /dev/loop0 is write-protected, mounting read-only
# echo "/tmp/CentOS-7-x86_64-Everything-1908.iso /mnt/centos7-iso/ iso9660 defaults 0 0" >> /etc/fstab
複製程式碼

掛載完成,使用方法見下方

使用阿里雲映象站搭建本地倉庫

安裝必備工具

  • createrepo 命令用於建立yum源(軟體倉庫),即為存放於本地特定位置的眾多rpm包建立索引,描述各包所需依賴資訊,並形成後設資料
  • reposync 命令是一個python指令碼。包含在yum-utils包中。因此,我們如果要使用reposync命令的時候,需要安裝yum-utils包。
# yum -y install createrepo yum-utils
複製程式碼

獲取阿里雲映象站配置檔案

# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
複製程式碼

建立儲存倉庫路徑

# mkdir -p /opt/aliyun-mirrors/centos/7/os/{base,extras,updates}
複製程式碼

使用reposync同步映象到本地,命令格式:reposync -r 倉庫名(一般為base) -p 目標目錄

# reposync -r base -p /opt/aliyun-mirrors/centos/7/os/
# reposync -r extras -p /opt/aliyun-mirrors/centos/7/os/
# reposync -r updates -p /opt/aliyun-mirrors/centos/7/os/
複製程式碼

建立yum倉庫

# createrepo /opt/aliyun-mirrors/centos/7/os/base/
# createrepo /opt/aliyun-mirrors/centos/7/os/extras/
# createrepo /opt/aliyun-mirrors/centos/7/os/updates/
複製程式碼

至此映象同步完成,現在配置nginx提供外部訪問即可,配置檔案如上述nginx部署中配置檔案,修改本地倉庫地址為你所建立地址即可,訪問瀏覽器如下介面

CentOS自建yum倉庫

rsync同步映象站使用

慎用!因為檔案總量很大,會佔用伺服器較多資源,並且由於流量過大可能會封IP,如非必要請儘量避免使用該方式

同步指令碼如下:

#!/bin/bash
kill -9 $(ps -aux | grep rsync | grep -v grep | awk '{print $2}')
# 待同步倉庫
repos=("centos" "epel" "ceph")
# repo儲存路徑
mirrorsdir="/opt/mirrors/"
# 中科大映象站rsync地址
# URL="rsync://rsync.mirrors.ustc.edu.cn/repo/"
# 清華大學映象站rsync地址
URL="rsync://mirrors.tuna.tsinghua.edu.cn/"
if [ ! -d "${mirrorsdir}" ]; then
    echo "建立映象倉庫路徑:${mirrorsdir}"
    mkdir -p ${mirrorsdir}
fi
# 同步倉庫
for repo in ${repos[@]}; do
    if [ ! -d "${mirrorsdir}/${repo}" ]; then
        echo "建立${repo}映象倉庫路徑"
        mkdir -p ${mirrorsdir}/${repo}
    fi
    echo "開始同步${repo}相關映象檔案"
    rsync -avzPH --delete ${URL}${repo}/ ${mirrorsdir}${repo}/
done
複製程式碼

儲存指令碼後直接執行即可,同步完成後可以在瀏覽器看到相應的檔案列表

CentOS自建yum倉庫

客戶端設定

使用ISO檔案後設定

如果單機使用,則在/etc/yum.repos.d/CentOS-Base.repobaseurl的值為file:///倉庫檔案路徑,提供給區域網其他伺服器的話需要使用Nginx或者Apache,並且baseurl的值為倉庫伺服器的IP或者域名

以下為客戶端修改repo的指令碼,使用時修改倉庫地址及IP部分即可

#!/bin/bash
# 自建倉庫IP
repoIP="10.100.5.80"
echo "新增域名解析到hosts檔案"
cat /etc/hosts | grep ${repoIP}
if [ $? == 1 ]; then
    echo "${repoIP} mirrors.akiya.org" >>/etc/hosts
    echo "備份CentOS-Base.repo"
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    echo "寫入自建源repo配置檔案"
    cat >/etc/yum.repos.d/CentOS-Base.repo <<EOF
[akiya-mirror]
name=CentOS-$releasever - Base
# 如果是本地倉庫則填寫本地檔案路徑即可
# 注意:file:///是三斜線,一定要記住路徑不能寫錯,寫錯你就走遠了,老弟
baseurl=file:///mnt/centos7-iso/
# 遠端倉庫則填寫對應的遠端倉庫地址
# baseurl=http://mirrors.akiya.org/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
    yum clean all
    yum repolist
fi
複製程式碼

儲存並執行指令碼後可以看到已有我們的自建源了。

複製程式碼
# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                                               repo name                                                               status
akiya-mirror                                                          CentOS- - Base                                                          10,097
repolist: 10,097
複製程式碼

可以看到我們安裝軟體的時候Repository顯示為我們自己設定的akiya-mirror

CentOS自建yum倉庫

使用阿里雲同步後設定

使用下述指令碼,修改domain值為倉庫所在伺服器的IP域名即可。

#!/bin/bash
# 自建倉庫IP
repoIP="10.100.5.80"
domain="mirrors.akiya.org"
echo "新增域名解析到hosts檔案"
cat /etc/hosts | grep ${repoIP}
if [ $? == 1 ]; then
    echo "${repoIP} ${domain}" >>/etc/hosts
    echo "備份CentOS-Base.repo"
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    echo "寫入自建源repo配置檔案"
    cat >/etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS-\$releasever - Base - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/base/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-\$releasever - Updates - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/updates/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-\$releasever - Extras - ${domain}
failovermethod=priority
baseurl=http://${domain}/centos/\$releasever/os/extras/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
    yum clean all
    yum repolist
fi
複製程式碼

使用rsync同步後設定

使用此方法自建源後/etc/yum.repos.d/CentOS-Base.repo修改內容請參考中科大CentOS 源使用幫助,把baseurl的域名替換為你自建倉庫伺服器的IP或者域名即可。

總結

使用iso映象:

  • 體積:CentOS-7-x86_64-Everything-1908.iso大小約(10098):11GB
  • 優點:方便已攜帶,整體由單一iso檔案,既可以安裝作業系統又能掛載用作本地yum倉庫
  • 缺點:rpm包版本可能存在老舊問題,無法獲取到較新版本

使用reposync同步阿里雲等映象倉庫對應發行版本:

  • 體積:CentOS7 1908約:base(10097):9.8GB;extras(305):408MB;updates(680):5.5GB;合計:16GB
  • 優點:包版本為當前同步時最新官方倉庫版本
  • 缺點:倉庫需要聯網才能完成同步與更新

使用rsync同步完整倉庫:

  • 體積:?原諒我同步了20多個小時被封了IP,於2019-10-26未同步完成。目前已經下載了150GB,估計CentOS相關倉庫檔案用500G磁碟應該夠了
  • 優點:完整的映象站克隆
  • 缺點:整體體積過大,不利於同步、複製、轉存內網

相關文章