如何建立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

參考資料

visidata

很酷的工具,個人覺得是終端機的神器。

一般在終端機要察看 csv / json / yaml 等檔案,就是用 less 或 vim 來看,然後自己腦補進行閱讀。visidata 就是用來解決這個痛點,他會自動解析資料內容,然後以表格方式呈現,這在閱讀上就帶來很大的便利。

安裝很簡單,像 ArchLinux 或 Ubuntu 都已經有了,所以只要用套件管理工具安裝 visidata 就可以。在 RHEL8 ,就需要用 pip3 來安裝。其他發行版的安裝可以參考 Install VisiData | VisiData

安裝

ArchLinux

pacman -S visidata

Ubuntu

sudo apt install visidata

RHEL8

sudo yum install python3-pip
sudo pip3 install visidata

使用

安裝完成以後,就可以用了。

visidata <your_json_file>
visidata <your_csv_file>
visidata <your_yaml_file>

我有試著用在 Ansible playbook 或是 Kubernetes YAML 上,在這類型的 YAML 檔,欄位型態常有 dict 的情況。如果該欄位型態是 dict,按下 Enter ,會再展開,讓你一層一層進去,意外的發現 visidata 挺方便的。

剛剛看了一下 “–help” ,發現挺多選項的,之後再來持續挖掘吧。

tuned-套用適合的系統設定

RHEL 跟 Ubuntu 都有提供這個系統服務,可以啟用這個系統服務來微調系統的設定,以達到預期的效能。

安裝

印象中,RHEL8 預設已經安裝,若沒有,可以用以下指令來安裝

yum install -y tuned

Ubuntu 可以使用以下指令來安裝

sudo apt install tuned

使用

使用相當簡單,啟動系統服務以後就可以了。

systemctl start tuned

之後就可以使用 tuned-adm 來做一些操作,這邊先說明一下什麼是 profile 。

profile 就是一組針對特定用途所提供的系統設定,例如網路最佳化或是資料庫最佳化等等的,不同的用途要調整的設定也不一樣。在啟動 tuned 以後,會啟用預設的 profile ,以 ubuntu 來說,是啟動 balanced 這個 profile。

tuned-adm 有以下子指令可以使用,以進行 profile 的操作:

子指令用途
list列出所有可用的 profile,每個 Linux 發行版所提供的 profile 都不太一樣。
active列出目前啟用的 profile
off關閉所有調整
profile切換到指定的 profile
profile_info顯示指定的 profile 資訊
recommend顯示建議的 profile
verify檢查
auto_profile自動選擇 profile
profile_mode顯示目前是自動選擇 profile 還是手動指定 profile

如果要客製化自己的 profile,也是可以的,這邊可以參考 /usr/lib/tuned 裡的 profile 來做複製跟改動。

Ubuntu LivePatch

Ubuntu LivePath 是一個動態修補 kernel 漏洞的機制。在傳統作法上,如果修補、更新了 kernel ,就一定要重新開機,讓新的 kernel 生效才能真正的修補漏洞。LivePatch 則提供了一個不需要重開機的方法,他會動態的修補在目前的 kernel 裡。在 ubuntu 的 How kernel livepatching works 有圖片說明。

Canonical 很佛心的提供了 Personal token,只要去 ubuntu.com 註冊,就可以取得。

取得 token 以後,就可以使用以下指令啟用

sudo ua attach <token>
sudo ua enable livepatch

啟用後,若想知道目前套用了哪些修補,可以用 canonical-livepatch 指令察看

canonical-livepatch status

若是公司使用,會需要購買企業訂閱。若是想把修補放到公司內部來節省頻寬,可以參考 Livepatch on-prem 的說明來進行。我大致看了一下,說是會把修補放到 S3 上面,離線的作法或許可以架設 minio 來代替 S3。這部份因為沒用到,就先跳過不看了。

SSH登入使用2FA驗證

Ubuntu 跟 RHEL 的設定方法大同小異:

  • Ubuntu: sudo apt install libpam-google-authenticator
  • RHEL: sudo yum install -y google-authenticator qrencode

步驟1

google-authenticator 產生所需的設定檔。

產生出來的檔案會在 ~/.google_authenticator

步驟2

設定 /etc/pam.d/sshd

加入

auth required pam_google_authenticator.so

步驟3

在 SSHD 設定檔 /etc/ssh/sshd_config 裡找到 ChallengeResponseAuthentication ,將其後的值改為 yes

ChallengeResponseAuthentication yes

修改完成後,重新啟動 sshd。

有陷阱!!

大致就這樣,在 RHEL8 會踩到 SELinux 的雷,這邊要修改 /etc/pam.d/sshd 的設定,將之前加入的那行改為

auth required pam_google_authenticator.so secret=/home/${USER}/.ssh/.google_authenticator

然後把 ~/.google_authenticator 檔案搬到 ~/.ssh/google_authenticator

處理一下 SELinux 權限

restorecon -Rv ~/.ssh/google_authenticator

然後一樣,重新啟動 sshd

圖形介面

參考資料裡的後半段有關於 GUI 登入的設定,這邊我就沒試過了。

參考資料

CentOS 用 yum 出現 Failed to download metadata for repo ‘AppStream’

在使用 vagrant 架設 CentOS 環境時,yum 安裝套件出現 Failed to download metadata for repo 'AppStream' 的錯誤。

本來以為是有打錯字什麼的,後來發現沒啥問題,就請 Google 幫忙找找看,就找到這篇:Failed to download metadata for repo ‘AppStream’ [CentOS]

看完以後,簡單整理如下:

  1. 因為 CentOS 從 2021/12/31 開始就進入不維護狀態, repo 也跟著調整,mirror.centos.org 不再提供 repo metadata 。用白話講,就是 yum 無法取得套件資料庫。
  2. 要處理此問題,就需要把 mirrorlist.centos.org 替換掉,這時候可以用文章裡提供的指令來做。
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

這邊是使用 sed 指令來做替換,不確定指令做什麼的話,可以直接用 vim 或熟悉的文字編輯器打開 /etc/yum.repos.d 目錄下所有以 CentOS-* 開頭的所有檔案,做兩項變更:

  1. 把裡面的 mirror.centos.org 換為 vault.centos.org。
  2. 註解 mirrorlist 開頭的那一行。

這樣修改以後,就可以執行 yum 了。

Linux OOM-Killer

一般程序在使用過多記憶體時,就會被 Kernel 結束掉,在 Kernel 裡的負責這工作的就是 OOM Killer 。

如果想要把這功能關掉,可以用 sysctl 來作。

sudo -s sysctl -w vm.oom-kill=0

那要啟用,就是用

sudo -s sysctl -w vm.oom-kill=1

一般預設是啟用的。

另外一個設定是當出現 OOM 時,Kernel 要不要 Panic

這可以藉由察看 /proc/vm/oom_kill 的內容,得知此設定有沒有啟用。

cat /proc/sys/vm/panic_on_oom

要啟用,可以直接把 1 寫到這檔案裡。

echo "1" | sudo tee /proc/sys/vm_panic_on_oom

要關閉,就是寫 0

除了啟用跟關閉之外,還可以做一點細部的控制,就是 vm_overcommit_memory 。先說明 overcommit 的意思,當程序跟 kernel 申請記憶體時,kernel 通常是允許,因為不會立刻就使用,這樣就有機會可以執行更多程序,這就是 overcommit 過度使用。

這個值是 0 的時候,表示過度使用記憶體時的處理是由 kernel 自己決定,這也是預設值。

用 1 ,表示 kernel 永遠都可以過度使用,這設定有點危險,因為會有機會導致 OOM;2 表示不會使用超過指定的比率。

那就可以針對個別程序去做調整,OOM killer 在處理時,會去參考程序的 oom_score 來決定是砍不砍,所以可以調整 oom_score_adj 數值來影響 oom_score。

比如我們希望 pid 是 3813 的程序可以不要被 OOM killer 砍掉,就可以這樣調整

echo "-100" | sudo tee /proc/3813/oom_score_adj

或者是在 systemd service 裡加入

[Service]
OOMScoreAdjust=-100

這個設定在一般情況下不太會被用到,基本上用預設設定就可以。主要還是用在系統調校或是正式環境時,才會去動到。

參考資料

Ubuntu 22.04 的 Firefox

Ubuntu 22.04 的 Firefox 變成 snap 軟體套件了,依據之前的經驗,這樣會卡到輸入法。果不其然,升級到 22.04 以後,Firefox 無法輸入中文。(我使用的是 gcin )

好在 Mozilla team 有推 debian package 的套件庫,依照這篇:How to Install Firefox as a .Deb on Ubuntu 22.04 (Not a Snap) 來進行,很容易就可以換回 debian package 版的 Firefox

方法如下:

步驟1,移除 snap 版的 firefox

sudo snap remove firefox

步驟2,增加 Mozilla team 的 PPA

sudo add-apt-repository ppa:mozillateam/ppa

步驟3,調整 apt 的設定,新增 /etc/apt/preferences.d/mozilla-firefox 檔案,內容貼上以下內容

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001

再新增 /etc/apt/apt.conf.d/51unattended-upgrades-firefox ,內容貼上以下內容

Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";

最後,就可以用 apt 安裝 firefox 了

sudo apt install firefox

這方法的風險在於 Mozilla team 不知道會維護多久,但就先這樣用吧。

顯示指令執行進度-pv

在進行備份或者是複製大檔的時候,通常會想知道進度,但這通常需要指令本身有處理這塊,例如 rsync,否則一般是沒進度的。

那麼,有方法可以做到這件事情嗎?有的,就是使用 pv 這個指令。

安裝

安裝 pv 很簡單,在 Debian/Ubuntu 裡,用 apt 就可以安裝。

sudo apt install pv

在 RHEL/CentOS 裡,需要加入 EPEL 這個 repository (安裝方法sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm )

再使用 yum 安裝即可

sudo yum install pv

使用

看了參考資料的文章以後,我個人的理解是這樣子的,第一種使用方法,是把檔案當作參數,pv 會讀取檔案,然後輸出到 stdout,pv 就是依照檔案的長度來做進度顯示。直接來看看幾個例子

例1:複製大檔

pv big-file > /tmp/big-file

例2:壓縮大檔

pv big-file | bzip2 > /tmp/big-file.bz2

例3:用 tar 來備份,這邊的 -p –timer –rate –bytes 是因應不知道檔案大小所加上去的設定,這邊也可以看到 pv 可以接收 stdin 的資料,顯示進度,然後再寫到 stdout。

tar -czf - ./Downloads/ | (pv -p --timer --rate --bytes > backup.tgz)

例4:同時看多個處理動作的狀況

pv -cN raw file | gzip | pv -cN gzip > file.gz

例5:備份跟還原整顆磁碟

pv -EE /dev/sda > disk-image.img
pv disk-image.img > /dev/sda

例6:複製目錄

rsync -avr --progress Downloads /mnt

等等,不是說好用 pv 嗎?對,你沒看錯,用 rsync,不要用 pv 去串了,這樣比較清楚。

參考資料