由於後面工作中可能會遇到伺服器在無公網的情況下使用,那麼這個時候就可能需要在本地搭建私有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部署中配置檔案,修改本地倉庫地址為你所建立地址即可,訪問瀏覽器如下介面
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
複製程式碼
儲存指令碼後直接執行即可,同步完成後可以在瀏覽器看到相應的檔案列表
客戶端設定
使用ISO檔案後設定
如果單機使用,則在/etc/yum.repos.d/CentOS-Base.repo
中baseurl
的值為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
使用阿里雲同步後設定
使用下述指令碼,修改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磁碟應該夠了 - 優點:完整的映象站克隆
- 缺點:整體體積過大,不利於同步、複製、轉存內網