如何建立YUM mirror server

在企業裡,因為不會讓所有伺服器都對外,一般會在內部架設一台 YUM mirror server ,定期去 mirror 外部的 RHEL 套件庫。

坦白說,我不知道用哪個名字比較好,知道的名字有

  • Local mirror
  • YUM repository server
  • YUM mirror server

總之,用途都是一致的。

作法

首先這台要作為 mirror 的伺服器必須要對外,接著在伺服器裡,以 subscription-manager 註冊到 RHEL 服務去。

安裝做 mirror 的套件,這邊選用 apache,也可以用 nginx,路徑跟設定調整一下就可以。

yum install yum-utils createrepo httpd

使用 subscription-manager 查看可以下載的 repository

subscription-manager repos --list

接著對需要做 mirror 的 repository 去做 mirror

mkdir -p /var/www/html/{baseos,appstream}
reposync -p /var/www/html/baseos \
        --download-metadata \
        --repo=rhel-8-for-x86_64-baseos-rpms \
        --delete \
        --downloadcomps

reposync -p /var/www/html/appstream \
        --download-metadata \
        --repo=rhel-8-for-x86_64-appstream-rpms \
        --delete \
        --downloadcomps

這邊可以寫成一個腳本,然後設定 cron,定期去執行 mirror。

一般會再多寫一個 repo 檔案,放在 /var/www/html ,後續到其他主機時,可以直接下載這個 repo 檔案,放到 /etc/yum.repos.d 裡面,就可以直接 yum update 。

[baseos]
name=baseos
baseurl=http://<ip>/rhel-8-for-x86_64-baseos-rpms/
enabled=1
gpgcheck=0

[appstream]
name=appstream
baseurl=http://<ip>/rhel-8-for-x86_64-appstream-rpms/
enabled=1
gpgcheck=0

最後啟用 httpd,就大功告成了。

systemctl enable --now httpd

限制

使用這個方法,基本上一台主機就是對應一個版本,例如 7.9, 8, 8.5, 8.6 這樣,沒辦法有多個版本,若需要有多個版本,建議使用 Foreman 或是 Satellite 會比較方便。

參考資料

bash arguments cheatsheet

記錄關於 bash argument 的幾則常用語法。

argument 一般翻譯為引數或參數,帶有 — 的,會被稱為選項。

prog arg1 arg2 arg3
prog --output option1 arg1

arg1, arg2, arg3 就是引數;–output option1 就是選項。

寫 shell script 時,是不管 — 的,在 prog 之後的,都叫做引數。以下用法均以 prog arg1 arg2 arg3 作為範例

用法說明結果
$#取得引數個數3
$@所有引數arg1 arg2 arg3
myArray=(“$@”)轉為 Array 會印出 arg1,要遍訪,需用 for:
myArray=(“$@”)
echo “${myArray}”
只印出Array第一個元素arg1
for arg in “${myArray[@]}”; do echo -n “${arg},”; done遍訪Array所有元素arg1,arg2,arg3,
myArray=( “$@” )
arraylength=${#myArray[@]}
for (( i=0; i<${arraylength}; i++ ));
do
echo “${myArray[$i]}”
done
遍訪Array所有元素的另一個作法,用索引方式。arg1
arg2
arg3
if ["$#" -eq 0]; then echo "no argument"; fi判斷是有否引數若無引數,印出 “no argument”
B=(“${myArray[@]:1:2}”)
echo “${B[@]}”
做slicearg2 arg3
version=4.7.1
A=( ${version//./ } )
echo “${A[@]}”
split4 7 1
a=”HELLO WORLD”
echo "${a,,}"
echo “${a,,[AEIUO]}”
轉小寫hello world
HeLLo WoRLD
a=”hello world”
echo "${a^^}"
轉大寫HELLO WORLD

參考資料