<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Antony 筆記：技術原理與實務經驗 – 其他</title><link>https://blog.kubeantony.com/archive/misc/</link><description>Recent content in 其他 on Antony 筆記：技術原理與實務經驗</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><lastBuildDate>Mon, 29 Jun 2026 03:28:06 +0800</lastBuildDate><atom:link href="https://blog.kubeantony.com/archive/misc/index.xml" rel="self" type="application/rss+xml"/><item><title>跨叢集 CoreDNS AXFR 同步與 PodCIDR 路由設定紀錄</title><link>https://blog.kubeantony.com/archive/misc/20260629/</link><pubDate>Mon, 29 Jun 2026 03:28:06 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/20260629/</guid><description>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# us-tkcdc-01
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
tkdt-control-plane Ready control-plane 19h v1.34.3 172.22.16.1 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkdt-master1 Ready &amp;lt;none&amp;gt; 19h v1.34.3 172.22.16.2 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkdt-worker1 Ready &amp;lt;none&amp;gt; 19h v1.34.3 172.22.16.3 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkdt-worker2 Ready &amp;lt;none&amp;gt; 19h v1.34.3 172.22.16.4 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkdt-worker3 Ready &amp;lt;none&amp;gt; 19h v1.34.3 172.22.16.5 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
$ kubectl describe nodes | grep -i podcidr
PodCIDR: 10.244.16.0/25
PodCIDRs: 10.244.16.0/25
PodCIDR: 10.244.16.128/25
PodCIDRs: 10.244.16.128/25
PodCIDR: 10.244.17.0/25
PodCIDRs: 10.244.17.0/25
PodCIDR: 10.244.17.128/25
PodCIDRs: 10.244.17.128/25
PodCIDR: 10.244.18.0/25
PodCIDRs: 10.244.18.0/25
$ kubectl -n kube-system get cm kubeadm-config -o yaml | grep serviceSubnet
serviceSubnet: 10.98.16.0/24
sudo route add -net 172.22.26.0 netmask 255.255.255.128 gw 192.168.11.102
sudo route add -net 10.244.17.0 netmask 255.255.255.128 gw 172.22.16.3
sudo route add -net 10.244.17.128 netmask 255.255.255.128 gw 172.22.16.4
sudo route add -net 10.244.18.0 netmask 255.255.255.128 gw 172.22.16.5
sudo route add -net 10.244.25.0 netmask 255.255.255.128 gw 192.168.11.102
sudo route add -net 10.244.25.128 netmask 255.255.255.128 gw 192.168.11.102
sudo route add -net 10.244.26.0 netmask 255.255.255.128 gw 192.168.11.102
sudo route add -net 10.98.16.0 netmask 255.255.255.0 gw 172.22.16.5
sudo route add -net 10.98.24.0 netmask 255.255.255.0 gw 192.168.11.102
kubectl apply -f - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
apiVersion: v1
kind: Service
metadata:
name: nginx-tkdt
labels:
app: nginx-tkdt
spec:
clusterIP: None
selector:
app: nginx-tkdt
ports:
- port: 80
name: web
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-tkdt
spec:
serviceName: nginx-tkdt
replicas: 2
selector:
matchLabels:
app: nginx-tkdt
template:
metadata:
labels:
app: nginx-tkdt
spec:
containers:
- name: nginx-tkdt
image: nginx
ports:
- containerPort: 80
name: web
EOF
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tkdt-0 1/1 Running 0 36s 10.244.17.5 tkdt-worker1 &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;
nginx-tkdt-1 1/1 Running 0 33s 10.244.18.6 tkdt-worker3 &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;
$ kubectl get svc nginx-tkdt
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-tkdt ClusterIP None &amp;lt;none&amp;gt; 80/TCP 44s
$ curl -sI http://10.244.17.5 | head -n 1
HTTP/1.1 200 OK
$ curl -sI http://10.244.26.5 | head -n 1
HTTP/1.1 200 OK
$ dig @10.98.16.10 nginx-tkdt-0.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.17.5
$ dig @10.98.16.10 nginx-tkdt-1.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.18.6
$ dig @10.98.24.10 nginx-tkndt-0.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.26.5
$ dig @10.98.24.10 nginx-tkndt-1.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.25.5
$ kubectl -n kube-system edit cm coredns
transfer tkdt.k8s { # 其他人可以跟我用 AXFR 同步
to * # 來源 IP 問題，先開放給所有人
}
secondary tkndt.k8s { # 我向 tkndt 同步的 domain
transfer from 10.98.24.10 # tkndt 的 coredns svc ip
}
$ kubectl -n kube-system rollout restart deployment coredns
$ kubectl -n kube-system get pods -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-7d597fb798-5zx2n 1/1 Running 0 16s
coredns-7d597fb798-7xmg7 1/1 Running 0 16s
$ dig @10.98.16.10 nginx-tkndt-0.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.26.5
$ dig @10.98.16.10 nginx-tkndt-1.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.25.5
$ kubectl exec nginx-tkdt-0 -- curl -sI nginx-tkndt-0.nginx-tkndt.default.svc.tkndt.k8s | head -n 1
HTTP/1.1 200 OK
$ kubectl exec nginx-tkdt-0 -- curl -sI nginx-tkndt-1.nginx-tkndt.default.svc.tkndt.k8s | head -n 1
HTTP/1.1 200 OK
==========================================================================
# us-tkcdc-02
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
tkndt-control-plane Ready control-plane 18h v1.34.3 172.22.26.1 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkndt-master1 Ready &amp;lt;none&amp;gt; 18h v1.34.3 172.22.26.2 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkndt-worker1 Ready &amp;lt;none&amp;gt; 18h v1.34.3 172.22.26.3 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkndt-worker2 Ready &amp;lt;none&amp;gt; 18h v1.34.3 172.22.26.4 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
tkndt-worker3 Ready &amp;lt;none&amp;gt; 18h v1.34.3 172.22.26.5 &amp;lt;none&amp;gt; Debian GNU/Linux 12 (bookworm) 6.8.0-124-generic containerd://2.2.0
$ kubectl describe nodes | grep -i podcidr
PodCIDR: 10.244.24.0/25
PodCIDRs: 10.244.24.0/25
PodCIDR: 10.244.24.128/25
PodCIDRs: 10.244.24.128/25
PodCIDR: 10.244.25.0/25
PodCIDRs: 10.244.25.0/25
PodCIDR: 10.244.25.128/25
PodCIDRs: 10.244.25.128/25
PodCIDR: 10.244.26.0/25
PodCIDRs: 10.244.26.0/25
$ kubectl -n kube-system get cm kubeadm-config -o yaml | grep serviceSubnet
serviceSubnet: 10.98.24.0/24
sudo route add -net 172.22.16.0 netmask 255.255.255.128 gw 192.168.11.101
sudo route add -net 10.244.25.0 netmask 255.255.255.128 gw 172.22.26.3
sudo route add -net 10.244.25.128 netmask 255.255.255.128 gw 172.22.26.4
sudo route add -net 10.244.26.0 netmask 255.255.255.128 gw 172.22.26.5
sudo route add -net 10.244.17.0 netmask 255.255.255.128 gw 192.168.11.101
sudo route add -net 10.244.17.128 netmask 255.255.255.128 gw 192.168.11.101
sudo route add -net 10.244.18.0 netmask 255.255.255.128 gw 192.168.11.101
sudo route add -net 10.98.16.0 netmask 255.255.255.0 gw 192.168.11.101
sudo route add -net 10.98.24.0 netmask 255.255.255.0 gw 172.22.26.5
kubectl apply -f - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
apiVersion: v1
kind: Service
metadata:
name: nginx-tkndt
labels:
app: nginx-tkndt
spec:
clusterIP: None
selector:
app: nginx-tkndt
ports:
- port: 80
name: web
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-tkndt
spec:
serviceName: nginx-tkndt
replicas: 2
selector:
matchLabels:
app: nginx-tkndt
template:
metadata:
labels:
app: nginx-tkndt
spec:
containers:
- name: nginx-tkndt
image: nginx
ports:
- containerPort: 80
name: web
EOF
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tkndt-0 1/1 Running 0 29s 10.244.26.5 tkndt-worker3 &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;
nginx-tkndt-1 1/1 Running 0 23s 10.244.25.5 tkndt-worker1 &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;
$ kubectl get svc nginx-tkndt
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-tkndt ClusterIP None &amp;lt;none&amp;gt; 80/TCP 90s
$ curl -sI http://10.244.17.5 | head -n 1
HTTP/1.1 200 OK
$ curl -sI http://10.244.26.5 | head -n 1
HTTP/1.1 200 OK
$ dig @10.98.24.10 nginx-tkndt-0.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.26.5
$ dig @10.98.24.10 nginx-tkndt-1.nginx-tkndt.default.svc.tkndt.k8s &amp;#43;short
10.244.25.5
$ dig @10.98.16.10 nginx-tkdt-0.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.17.5
$ dig @10.98.16.10 nginx-tkdt-1.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.18.6
$ kubectl -n kube-system edit cm coredns
transfer tkndt.k8s { # 其他人可以跟我用 AXFR 同步
to * # 來源 IP 問題，先開放給所有人
}
secondary tkdt.k8s { # 我向 tkndt 同步的 domain
transfer from 10.98.16.10 # tkndt 的 coredns svc ip
}
$ kubectl -n kube-system rollout restart deployment coredns
$ kubectl -n kube-system get pods -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-7446d9745d-5pjh7 1/1 Running 0 11s
coredns-7446d9745d-5pxtj 1/1 Running 0 11s
$ $ dig @10.98.24.10 nginx-tkdt-0.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.17.5
$ dig @10.98.24.10 nginx-tkdt-1.nginx-tkdt.default.svc.tkdt.k8s &amp;#43;short
10.244.18.6
$ kubectl exec nginx-tkndt-0 -- curl -sI nginx-tkdt-0.nginx-tkdt.default.svc.tkdt.k8s | head -n 1
HTTP/1.1 200 OK
$ kubectl exec nginx-tkndt-0 -- curl -sI nginx-tkdt-1.nginx-tkdt.default.svc.tkdt.k8s | head -n 1
HTTP/1.1 200 OK&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Claude Code Best Practice</title><link>https://blog.kubeantony.com/archive/misc/claude-code-best-practice/</link><pubDate>Mon, 01 Jun 2026 03:25:26 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/claude-code-best-practice/</guid><description>
&lt;h2&gt;AGENTS.md (全域)&lt;span class="hx:absolute hx:-mt-20" id="agentsmd-全域"&gt;&lt;/span&gt;
&lt;a href="#agentsmd-%e5%85%a8%e5%9f%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano ~/.claude/AGENTS.md
# 全域偏好
- 回覆使用繁體中文
$ echo @AGENTS.md &amp;gt; ~/.claude/CLAUDE.md&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>資安事件報告 - 內部跳板伺服器遭加密貨幣挖礦惡意程式入侵</title><link>https://blog.kubeantony.com/archive/misc/%E8%B3%87%E5%AE%89%E4%BA%8B%E4%BB%B6%E5%A0%B1%E5%91%8A-%E5%85%A7%E9%83%A8%E8%B7%B3%E6%9D%BF%E4%BC%BA%E6%9C%8D%E5%99%A8%E9%81%AD%E5%8A%A0%E5%AF%86%E8%B2%A8%E5%B9%A3%E6%8C%96%E7%A4%A6%E6%83%A1%E6%84%8F%E7%A8%8B%E5%BC%8F%E5%85%A5%E4%BE%B5/</link><pubDate>Wed, 06 May 2026 08:09:20 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E8%B3%87%E5%AE%89%E4%BA%8B%E4%BB%B6%E5%A0%B1%E5%91%8A-%E5%85%A7%E9%83%A8%E8%B7%B3%E6%9D%BF%E4%BC%BA%E6%9C%8D%E5%99%A8%E9%81%AD%E5%8A%A0%E5%AF%86%E8%B2%A8%E5%B9%A3%E6%8C%96%E7%A4%A6%E6%83%A1%E6%84%8F%E7%A8%8B%E5%BC%8F%E5%85%A5%E4%BE%B5/</guid><description>
&lt;h2&gt;1. 事件概要&lt;span class="hx:absolute hx:-mt-20" id="1-事件概要"&gt;&lt;/span&gt;
&lt;a href="#1-%e4%ba%8b%e4%bb%b6%e6%a6%82%e8%a6%81" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;內部跳板與開發伺服器遭未授權入侵。經鑑識確認，本事件為典型的 &lt;strong&gt;加密貨幣資源劫持 (Cryptojacking)&lt;/strong&gt;，攻擊者透過對外暴露的 SSH 服務進行長期的密碼暴力破解，成功取得系統 &lt;code&gt;root&lt;/code&gt; 權限。&lt;/p&gt;
&lt;p&gt;攻擊者入侵後展現出高度的隱蔽技巧：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;降權躲避查緝&lt;/strong&gt;：取得 &lt;code&gt;root&lt;/code&gt; 後，刻意切換至一般使用者 A 的身分，於 &lt;code&gt;/var/tmp/&lt;/code&gt; 目錄下執行挖礦程式，以避免在系統資源監控（如 &lt;code&gt;top&lt;/code&gt;）中出現 &lt;code&gt;root&lt;/code&gt; 執行高耗能程序的突兀現象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雙軌營利模式&lt;/strong&gt;：同時運行傳統的 &lt;strong&gt;XMRig&lt;/strong&gt; 惡意挖礦（挖掘 Monero）與合法的 &lt;strong&gt;Vortix Cloud DePIN&lt;/strong&gt; 算力出租節點（&lt;code&gt;vortix-agent&lt;/code&gt;），多管齊下榨取伺服器算力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深度潛伏&lt;/strong&gt;：部署了 &lt;code&gt;sshdd.so&lt;/code&gt; (利用 &lt;code&gt;LD_PRELOAD&lt;/code&gt; 機制的 Userland Rootkit) 來隱藏實體檔案，並建立 &lt;code&gt;systemd&lt;/code&gt; 幽靈帳號與 &lt;code&gt;sudoers&lt;/code&gt; 免密碼提權後門，確保能長期掌控系統。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本事件未發現明確的資料外洩 (Data Exfiltration) 傳輸行為。初始調查中 &lt;code&gt;/var/tmp/syst3md.1~8&lt;/code&gt; 出現的 &lt;strong&gt;2025 年 11 月&lt;/strong&gt; 檔案時間戳記，經查證為攻擊者使用 &lt;code&gt;wget&lt;/code&gt; 或 &lt;code&gt;curl&lt;/code&gt; 下載工具時，保留了中繼伺服器上原始檔案之 &lt;code&gt;Last-Modified&lt;/code&gt; 時間所致（Time-stomping 假象），實際入侵時間確認為 &lt;strong&gt;2026 年 2 月 15 日&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. 受影響範圍評估&lt;span class="hx:absolute hx:-mt-20" id="2-受影響範圍評估"&gt;&lt;/span&gt;
&lt;a href="#2-%e5%8f%97%e5%bd%b1%e9%9f%bf%e7%af%84%e5%9c%8d%e8%a9%95%e4%bc%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;確診受害主機：&lt;/strong&gt; 內部跳板與開發伺服器（主機名稱與 IP 已匿名化）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初始感染源 (Patient Zero)：&lt;/strong&gt; 該伺服器本身（因 SSH 對外開放且密碼遭暴力破解），&lt;strong&gt;已排除終端使用者 A 之個人電腦遭惡意程式感染的風險&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;橫向移動風險評估：&lt;/strong&gt; 雖然攻擊者主要目標為挖礦，但因其曾掌握 &lt;code&gt;root&lt;/code&gt; 權限長達 80 餘天，伺服器上曾存放之使用者 B 的 SSH 私鑰、GitLab 密碼及各類環境變數 Token 均需視為「已遭曝露」。內網 K8s/RKE2 節點（30+ 台主機）具有潛在橫向感染風險，需全面清查。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3. 攻擊時間軸 (Timeline)&lt;span class="hx:absolute hx:-mt-20" id="3-攻擊時間軸-timeline"&gt;&lt;/span&gt;
&lt;a href="#3-%e6%94%bb%e6%93%8a%e6%99%82%e9%96%93%e8%bb%b8-timeline" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;發生時間&lt;/th&gt;
&lt;th style="text-align: left"&gt;攻擊階段&lt;/th&gt;
&lt;th style="text-align: left"&gt;關鍵事件與動作描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-01 至 02 月&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;初始存取 (Initial Access)&lt;/td&gt;
&lt;td style="text-align: left"&gt;系統遭來自多個海外 IP (如 121.64.89.228) 之持續性 SSH 暴力破解攻擊，導致 &lt;code&gt;btmp&lt;/code&gt; 錯誤登入日誌暴增至 258MB。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-02-15 13:06&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;破城與持久化&lt;/td&gt;
&lt;td style="text-align: left"&gt;攻擊者成功猜中 &lt;code&gt;root&lt;/code&gt;（或具 sudo 權限帳號）密碼。登入後上傳 Launcher (&lt;code&gt;/usr/bin/log&lt;/code&gt;)。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-02-15 13:07&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;佈署後門&lt;/td&gt;
&lt;td style="text-align: left"&gt;植入 Rootkit (&lt;code&gt;sshdd.so&lt;/code&gt;)；建立幽靈帳號 &lt;code&gt;systemd&lt;/code&gt; (UID 1003) 並修改 &lt;code&gt;/etc/sudoers&lt;/code&gt; 賦予免密碼提權能力。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-02-15 13:08&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;降權執行挖礦&lt;/td&gt;
&lt;td style="text-align: left"&gt;啟用 &lt;code&gt;/etc/ld.so.preload&lt;/code&gt; 隱藏行蹤；&lt;strong&gt;切換為使用者 A 身份&lt;/strong&gt;，下載並執行 XMRig 礦工 (&lt;code&gt;syst3md&lt;/code&gt; / &lt;code&gt;/var/log/log&lt;/code&gt;)。&lt;em&gt;(註：此時下載的檔案帶有 2025-11-19 之原始 HTTP 標頭時間)&lt;/em&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-03-02&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;工具更新&lt;/td&gt;
&lt;td style="text-align: left"&gt;攻擊者下載 &lt;code&gt;mOymN.gz&lt;/code&gt; (6MB 工具包)。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-03-28&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;部署 DePIN 獲利&lt;/td&gt;
&lt;td style="text-align: left"&gt;攻擊者上傳 &lt;code&gt;vortix-agent&lt;/code&gt; (15.7MB) 並執行，開始利用 Vortix Cloud 進行算力出租獲利。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-04-18&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;持續活動&lt;/td&gt;
&lt;td style="text-align: left"&gt;下載器腳本 &lt;code&gt;cli&lt;/code&gt; 進行最後一次更新。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;2026-05-06&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;偵測與應變&lt;/td&gt;
&lt;td style="text-align: left"&gt;管理員發現異常 (LD_PRELOAD 攔截)，展開鑑識，確認入侵路徑並進行緊急止血。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;4. 威脅指標 (IoCs)&lt;span class="hx:absolute hx:-mt-20" id="4-威脅指標-iocs"&gt;&lt;/span&gt;
&lt;a href="#4-%e5%a8%81%e8%84%85%e6%8c%87%e6%a8%99-iocs" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;4.1 惡意檔案與 Hash (SHA256)&lt;span class="hx:absolute hx:-mt-20" id="41-惡意檔案與-hash-sha256"&gt;&lt;/span&gt;
&lt;a href="#41-%e6%83%a1%e6%84%8f%e6%aa%94%e6%a1%88%e8%88%87-hash-sha256" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rootkit (&lt;code&gt;/usr/local/lib/sshdd.so&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;acb2e78d748e9a22e80c386a58f6377f683fce556bc64da2bd6d82b2a9207e3c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Launcher (&lt;code&gt;/usr/bin/log&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;c8e59338f471e255a40e13ef810db7db98ce018e417211ca0bdf90ef8cdd3894&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XMRig Miner (&lt;code&gt;/var/log/log&lt;/code&gt; &amp;amp; &lt;code&gt;/var/tmp/syst3md.1&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;dcf343df280816c4856ee164b9b4b14906a09b1fd4bfab604ee9370529ed61d1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vortix CLI (&lt;code&gt;/var/tmp/cli&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;c21fa4c1d6ed5342e49ef0561cc566a2cbe06a83f6298374fe9cb4f8027b6911&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vortix Agent (&lt;code&gt;/var/tmp/vortix-agent&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;c6b67c7ffc11c67eea889b8e0eef6891123123388297e0deaa490837a7b06833&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Archive (&lt;code&gt;/var/tmp/mOymN.gz&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;ac15860162f216d03e374d07f7eeb42944e4b0f08e78ea2468f3df9cbdb860cf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 系統入侵跡證&lt;span class="hx:absolute hx:-mt-20" id="42-系統入侵跡證"&gt;&lt;/span&gt;
&lt;a href="#42-%e7%b3%bb%e7%b5%b1%e5%85%a5%e4%be%b5%e8%b7%a1%e8%ad%89" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;檔案隱藏機制：&lt;/strong&gt; &lt;code&gt;/etc/ld.so.preload&lt;/code&gt; (內容包含 &lt;code&gt;/usr/local/lib/sshdd.so&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持久化服務：&lt;/strong&gt; &lt;code&gt;/etc/systemd/system/log.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cron 後門：&lt;/strong&gt; &lt;code&gt;/etc/cron.hourly/0&lt;/code&gt; (權限 &lt;code&gt;5777&lt;/code&gt;，大小 0 bytes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提權後門帳號：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/passwd&lt;/code&gt; 中存在偽裝帳號 &lt;code&gt;systemd:x:1003:1003:...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/sudoers&lt;/code&gt; 中存在越權設定 &lt;code&gt;systemd ALL=(ALL) NOPASSWD:ALL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 網路與通訊 (Network/C2)&lt;span class="hx:absolute hx:-mt-20" id="43-網路與通訊-networkc2"&gt;&lt;/span&gt;
&lt;a href="#43-%e7%b6%b2%e8%b7%af%e8%88%87%e9%80%9a%e8%a8%8a-networkc2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;77.221.157.206:6196&lt;/code&gt; (Rootkit 內建 C2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;141.95.72.59&lt;/code&gt; (Rootkit 內建 C2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;139.99.125.38&lt;/code&gt; (Rootkit 內建 C2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;139.99.123.196&lt;/code&gt; (Rootkit 內建 C2)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;141.94.96.71:3333&lt;/code&gt; (活動礦池)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;94.26.106.195&lt;/code&gt; (HTTP Staging Server，提供 &lt;code&gt;cli&lt;/code&gt; 等惡意程式下載)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pool.supportxmr.com:9000&lt;/code&gt; (合法 Monero 礦池，遭濫用)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 攻擊者 Vortix DePIN 識別標記 (Tokens)&lt;span class="hx:absolute hx:-mt-20" id="44-攻擊者-vortix-depin-識別標記-tokens"&gt;&lt;/span&gt;
&lt;a href="#44-%e6%94%bb%e6%93%8a%e8%80%85-vortix-depin-%e8%ad%98%e5%88%a5%e6%a8%99%e8%a8%98-tokens" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uUbGvGz7zAMgGtHsTo8EOi1krvj+OPi7SF5UMeoCJnU=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jUliaNLclI34oUpjC7ewra/HjEuw+UgYa7jrpxMBC3k=&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;5. 攻擊手法分析 (MITRE ATT&amp;amp;CK Mapping)&lt;span class="hx:absolute hx:-mt-20" id="5-攻擊手法分析-mitre-attck-mapping"&gt;&lt;/span&gt;
&lt;a href="#5-%e6%94%bb%e6%93%8a%e6%89%8b%e6%b3%95%e5%88%86%e6%9e%90-mitre-attck-mapping" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;階段策略&lt;/th&gt;
&lt;th style="text-align: left"&gt;技術編號&lt;/th&gt;
&lt;th style="text-align: left"&gt;技術名稱&lt;/th&gt;
&lt;th style="text-align: left"&gt;具體行為對應&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Initial Access&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1110.001&lt;/td&gt;
&lt;td style="text-align: left"&gt;Password Guessing&lt;/td&gt;
&lt;td style="text-align: left"&gt;針對伺服器對外 SSH 服務進行密集密碼暴力破解。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1059.004&lt;/td&gt;
&lt;td style="text-align: left"&gt;Unix Shell&lt;/td&gt;
&lt;td style="text-align: left"&gt;利用 Bash 執行 &lt;code&gt;wget&lt;/code&gt;/&lt;code&gt;curl&lt;/code&gt; 下載腳本與執行檔。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Privilege Escalation&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1548.003&lt;/td&gt;
&lt;td style="text-align: left"&gt;Sudo and Sudo Caching&lt;/td&gt;
&lt;td style="text-align: left"&gt;建立 &lt;code&gt;systemd&lt;/code&gt; 帳號並於 &lt;code&gt;/etc/sudoers&lt;/code&gt; 寫入 &lt;code&gt;NOPASSWD:ALL&lt;/code&gt; 後門。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Defense Evasion&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1070.006&lt;/td&gt;
&lt;td style="text-align: left"&gt;Timestomp&lt;/td&gt;
&lt;td style="text-align: left"&gt;利用 &lt;code&gt;wget&lt;/code&gt; 預設行為保留伺服器端舊時間戳記，造成調查干擾。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Defense Evasion&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1548.002&lt;/td&gt;
&lt;td style="text-align: left"&gt;Bypass User Account Control&lt;/td&gt;
&lt;td style="text-align: left"&gt;取得 &lt;code&gt;root&lt;/code&gt; 後刻意切換為使用者 A 身份執行耗能程式，規避直覺查緝。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Defense Evasion&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1574.006&lt;/td&gt;
&lt;td style="text-align: left"&gt;Dynamic Linker Hijacking&lt;/td&gt;
&lt;td style="text-align: left"&gt;植入 &lt;code&gt;sshdd.so&lt;/code&gt; 劫持 &lt;code&gt;LD_PRELOAD&lt;/code&gt;，攔截目錄與檔案讀取 API。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Persistence&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1546.004&lt;/td&gt;
&lt;td style="text-align: left"&gt;Unix shell Configuration&lt;/td&gt;
&lt;td style="text-align: left"&gt;利用 Systemd (&lt;code&gt;log.service&lt;/code&gt;) 與 Cron (&lt;code&gt;/etc/cron.hourly/0&lt;/code&gt;) 進行駐留。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;T1496&lt;/td&gt;
&lt;td style="text-align: left"&gt;Resource Hijacking&lt;/td&gt;
&lt;td style="text-align: left"&gt;同時執行 XMRig 與 Vortix Agent，劫持運算力進行雙重加密貨幣獲利。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;6. 處置與防護建議&lt;span class="hx:absolute hx:-mt-20" id="6-處置與防護建議"&gt;&lt;/span&gt;
&lt;a href="#6-%e8%99%95%e7%bd%ae%e8%88%87%e9%98%b2%e8%ad%b7%e5%bb%ba%e8%ad%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;6.1 立即止血 (Containment)&lt;span class="hx:absolute hx:-mt-20" id="61-立即止血-containment"&gt;&lt;/span&gt;
&lt;a href="#61-%e7%ab%8b%e5%8d%b3%e6%ad%a2%e8%a1%80-containment" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;強制中止惡意程序：&lt;/strong&gt; 中止 &lt;code&gt;/var/log/log&lt;/code&gt;、&lt;code&gt;/usr/bin/log&lt;/code&gt;、&lt;code&gt;cli&lt;/code&gt;、&lt;code&gt;vortix-agent&lt;/code&gt; 等程序，並全面停用 &lt;code&gt;log.service&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根除 Rootkit 與實體檔案：&lt;/strong&gt; 刪除 &lt;code&gt;/etc/ld.so.preload&lt;/code&gt; 解除系統攔截，清理 &lt;code&gt;/var/tmp/&lt;/code&gt; 下之所有惡意工具與備份。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;封堵後門帳號：&lt;/strong&gt; 於 &lt;code&gt;/etc/passwd&lt;/code&gt;、&lt;code&gt;/etc/shadow&lt;/code&gt; 刪除 &lt;code&gt;systemd&lt;/code&gt; 偽裝帳號，並修改 &lt;code&gt;/etc/sudoers&lt;/code&gt; 移除越權規則。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;網路封鎖：&lt;/strong&gt; 於上層防火牆 (Firewall/Security Group) 設定阻擋已知之 C2 節點、礦池 IP 及 Staging Server。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.2 系統重建與憑證輪替 (Eradication &amp;amp; Recovery)&lt;span class="hx:absolute hx:-mt-20" id="62-系統重建與憑證輪替-eradication--recovery"&gt;&lt;/span&gt;
&lt;a href="#62-%e7%b3%bb%e7%b5%b1%e9%87%8d%e5%bb%ba%e8%88%87%e6%86%91%e8%ad%89%e8%bc%aa%e6%9b%bf-eradication--recovery" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;作業系統重裝：&lt;/strong&gt; 由於伺服器曾遭 Rootkit 高度掌控逾 80 天，強烈建議從乾淨的 ISO 映像檔重新安裝作業系統，僅可遷移純資料檔案（如設定檔、資料庫 dump），切勿直接複製執行檔或系統腳本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全面撤銷與輪替憑證：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;強制重設所有伺服器本機帳號密碼。&lt;/li&gt;
&lt;li&gt;撤銷伺服器上使用者 A、使用者 B 等所有使用者的 SSH 私鑰，並重新核發。&lt;/li&gt;
&lt;li&gt;重設所有可能於伺服器上曝露之第三方憑證（如 GitLab Admin、K8s Secret 等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.3 長期安全強化 (Post-Incident)&lt;span class="hx:absolute hx:-mt-20" id="63-長期安全強化-post-incident"&gt;&lt;/span&gt;
&lt;a href="#63-%e9%95%b7%e6%9c%9f%e5%ae%89%e5%85%a8%e5%bc%b7%e5%8c%96-post-incident" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;阻斷暴力破解根源 (最高優先級)：&lt;/strong&gt; 修改 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;，設定 &lt;code&gt;PasswordAuthentication no&lt;/code&gt;，&lt;strong&gt;全面強制僅能使用 SSH 金鑰登入&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存取來源限制：&lt;/strong&gt; 透過防火牆限制 SSH 服務僅允許信任的來源 IP（如公司 VPN 網段）連線。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;橫向掃描與威脅通報：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;使用本報告之 IoC 腳本，清查使用者 B 曾登入過之內網 K8s 節點。&lt;/li&gt;
&lt;li&gt;（選用）附上攻擊者 Token 向 &lt;code&gt;abuse@vortix.cloud&lt;/code&gt; 提出檢舉，阻斷攻擊者利用合法 DePIN 平台之洗錢管道。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Gemini CLI `/init` 異常延遲重現步驟</title><link>https://blog.kubeantony.com/archive/misc/gemini-cli-init-%E7%95%B0%E5%B8%B8%E5%BB%B6%E9%81%B2%E9%87%8D%E7%8F%BE%E6%AD%A5%E9%A9%9F/</link><pubDate>Tue, 05 May 2026 02:08:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/gemini-cli-init-%E7%95%B0%E5%B8%B8%E5%BB%B6%E9%81%B2%E9%87%8D%E7%8F%BE%E6%AD%A5%E9%A9%9F/</guid><description>
&lt;h2&gt;背景&lt;span class="hx:absolute hx:-mt-20" id="背景"&gt;&lt;/span&gt;
&lt;a href="#%e8%83%8c%e6%99%af" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;原始 session 中,執行 &lt;code&gt;/init&lt;/code&gt; 後 Gemini CLI 花了約 1 小時 25 分鐘才完成 GEMINI.md 的產出。
從 log 抽出的 tool call 時間戳顯示有兩個明顯卡點:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;卡點 1&lt;/strong&gt;:&lt;code&gt;/init&lt;/code&gt; 送出 → 第一個 tool call,等了 &lt;strong&gt;約 45 分鐘&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡點 2&lt;/strong&gt;:list 根目錄 → list &lt;code&gt;openspec/specs&lt;/code&gt; 子目錄,等了 &lt;strong&gt;約 31 分鐘&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文件目的是讓問題可被重現,以利後續判斷成因或回報 bug。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;環境前置條件&lt;span class="hx:absolute hx:-mt-20" id="環境前置條件"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e5%89%8d%e7%bd%ae%e6%a2%9d%e4%bb%b6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;重現前需準備與原情境一致的環境:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini CLI 版本:&lt;strong&gt;0.40.1&lt;/strong&gt;(stable,2026 年 4 月底發布)&lt;/li&gt;
&lt;li&gt;OpenSpec 版本:&lt;strong&gt;1.3.1&lt;/strong&gt;(2026 年 4 月下旬發布,latest 為當下最新)&lt;/li&gt;
&lt;li&gt;Node.js / npm 已安裝(&lt;code&gt;openspec&lt;/code&gt; 需要 Node.js 20.19.0 或更新)&lt;/li&gt;
&lt;li&gt;OS:Linux&lt;/li&gt;
&lt;li&gt;使用者 preference:永遠使用繁體中文回應&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;若要重新驗證版本:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini CLI:&lt;code&gt;gemini /about&lt;/code&gt; 或 &lt;code&gt;gemini --version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OpenSpec:&lt;code&gt;openspec --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若要強制升級到當下最新 stable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini CLI:&lt;code&gt;npm install -g @google/gemini-cli@latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OpenSpec:&lt;code&gt;npm install -g @fission-ai/openspec@latest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;一鍵建立 workspace&lt;span class="hx:absolute hx:-mt-20" id="一鍵建立-workspace"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%80%e9%8d%b5%e5%bb%ba%e7%ab%8b-workspace" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/k8s/workload/graceful-shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm install -g @fission-ai/openspec
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/k8s/workload/graceful-shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openspec init --tools gemini&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;openspec init --tools gemini&lt;/code&gt; 會自動產出以下結構,內含 &lt;code&gt;.gemini/commands/opsx/&lt;/code&gt; 的 4 個 toml 指令、&lt;code&gt;.gemini/skills/openspec-*/&lt;/code&gt; 的 4 個 SKILL.md,以及 &lt;code&gt;openspec/changes/archive/&lt;/code&gt; 與 &lt;code&gt;openspec/specs/&lt;/code&gt; 兩個空目錄:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;graceful-shutdown/
├── .gemini/
│ ├── commands/opsx/
│ │ ├── apply.toml
│ │ ├── archive.toml
│ │ ├── explore.toml
│ │ └── propose.toml
│ └── skills/
│ ├── openspec-apply-change/SKILL.md
│ ├── openspec-archive-change/SKILL.md
│ ├── openspec-explore/SKILL.md
│ └── openspec-propose/SKILL.md
└── openspec/
├── changes/archive/
└── specs/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;啟動 CLI(建議開啟 debug log + YOLO 模式)&lt;span class="hx:absolute hx:-mt-20" id="啟動-cli建議開啟-debug-log--yolo-模式"&gt;&lt;/span&gt;
&lt;a href="#%e5%95%9f%e5%8b%95-cli%e5%bb%ba%e8%ad%b0%e9%96%8b%e5%95%9f-debug-log--yolo-%e6%a8%a1%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/k8s/workload/graceful-shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script -q /tmp/gemini-repro.log -c &lt;span class="s1"&gt;&amp;#39;gemini --debug --yolo&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--debug&lt;/code&gt; 在卡住時可以從 log 看出是 retry、thinking、還是在等 API。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--yolo&lt;/code&gt; 會自動同意所有 tool 呼叫的確認對話,避免重現過程被 plan / write_file / shell 的確認 prompt 打斷,確保延遲現象來自 Gemini 本身而非「等使用者按 yes」。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;script&lt;/code&gt; 指令會保留 TTY 讓互動模式正常運作,同時把整個 terminal session 錄到指定檔案。結束時按 &lt;code&gt;Ctrl+D&lt;/code&gt; 或輸入 &lt;code&gt;exit&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;替代方案:若不需要 log 檔,直接 &lt;code&gt;gemini --debug --yolo&lt;/code&gt; 即可。互動模式的 log 也會自動寫到 &lt;code&gt;~/.gemini/&lt;/code&gt; 底下,可在 CLI 內輸入 &lt;code&gt;/about&lt;/code&gt; 或 &lt;code&gt;/bug&lt;/code&gt; 查詢確切路徑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;重現步驟&lt;span class="hx:absolute hx:-mt-20" id="重現步驟"&gt;&lt;/span&gt;
&lt;a href="#%e9%87%8d%e7%8f%be%e6%ad%a5%e9%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Step 1 — 完整需求&lt;span class="hx:absolute hx:-mt-20" id="step-1--完整需求"&gt;&lt;/span&gt;
&lt;a href="#step-1--%e5%ae%8c%e6%95%b4%e9%9c%80%e6%b1%82" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;輸入:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;/plan 我想搭配 openspec 的流程開發一套 go 語言寫的 http server,這網站要能夠接住 sigint 和 sigterm 的訊號,並執行 graceful shutdown,這網站最終要部署在 K8s 上,並且 CNI 是 cilium 還有啟用 kubeproxy replacement,pod 狀態為 Terminating 的時候,要執行 prestop hook sleep 2s,不要寫在 source code 裡面&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;預期行為:Gemini 進入 &lt;strong&gt;Plan Mode&lt;/strong&gt;,使用 &lt;code&gt;openspec-propose&lt;/code&gt; skill 並輸出計畫摘要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/By-z2TLAZg.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Step 2 — 確認 plan(第一次)&lt;span class="hx:absolute hx:-mt-20" id="step-2--確認-plan第一次"&gt;&lt;/span&gt;
&lt;a href="#step-2--%e7%a2%ba%e8%aa%8d-plan%e7%ac%ac%e4%b8%80%e6%ac%a1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;輸入:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;好&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;✦ I have drafted the detailed implementation plan. Please review it below:
1 # Implementation Plan: Graceful Shutdown Go HTTP Server
2
3 ## Background &amp;amp; Motivation
4 The objective is to build a Go-based HTTP server capable of performing a graceful shutdown when receiving `SIGINT` or `SIGTERM` signals. The application
will be deployed on a Kubernetes cluster utilizing the Cilium CNI with kube-proxy replacement. To ensure zero downtime during pod termination, a `preStop`
hook sleeping for 2 seconds must be configured at the deployment level rather than being hardcoded in the application logic. The development process will be
guided by the `openspec` workflow.
5
6 ## Scope &amp;amp; Impact
7 - **Go Application**: Create a basic HTTP server in Go that listens for termination signals and shuts down gracefully using context timeouts.
8 - **Dockerization**: Create a `Dockerfile` to containerize the Go application.
9 - **Kubernetes Manifests**: Create a Deployment and Service manifest. The Deployment must include a `lifecycle.preStop` hook to execute `sleep 2`.
10 - **Process**: Utilize `openspec-propose` to generate standard artifacts (`proposal.md`, `design.md`, `tasks.md`).
11
12 ## Proposed Solution
13 1. **OpenSpec Setup**: Use the `openspec` CLI to scaffold a new change (`graceful-shutdown-go-server`) and generate the required artifacts.
14 2. **Implementation**:
15 - Write `main.go` using `net/http` and `os/signal`.
16 - Create a minimal `Dockerfile` (e.g., multi-stage build starting from `golang:alpine`).
17 - Define `deployment.yaml` with the `preStop` hook (`command: [&amp;#34;/bin/sh&amp;#34;, &amp;#34;-c&amp;#34;, &amp;#34;sleep 2&amp;#34;]`).
18 3. **Verification**: Confirm the application builds, the Docker image can be created, and the Kubernetes manifests are structurally correct and contain the
requested hooks.
19
20 ## Alternatives Considered
21 - *Hardcoding sleep in Go*: Rejected as per the requirement to handle the delay externally via Kubernetes lifecycle hooks to keep the application code
focused on application-level shutdown logic rather than orchestration-specific workarounds.
22
23 ## Phased Implementation Plan
24 - **Phase 1: OpenSpec Artifacts**: Exit Plan Mode, create the `openspec` change, and let the `openspec-propose` skill generate the documentation artifacts.
25 - **Phase 2: Code Implementation**: Write the Go source code and Dockerfile.
26 - **Phase 3: Kubernetes Manifests**: Write the Deployment and Service configurations, ensuring the `preStop` hook is correctly defined.
27
28 ## Verification
29 - Code review of the Go server to ensure signal handling and context usage.
30 - Verification of the `deployment.yaml` to confirm the presence of the `preStop` hook.
31
32 ## Migration &amp;amp; Rollback
33 - N/A (New deployment).
Does this detailed plan look correct to you? If so, I will proceed to formally submit it for approval so we can begin execution.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;Step 4 — 要求繁中&lt;span class="hx:absolute hx:-mt-20" id="step-4--要求繁中"&gt;&lt;/span&gt;
&lt;a href="#step-4--%e8%a6%81%e6%b1%82%e7%b9%81%e4%b8%ad" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;請注意永遠必須要使用繁體中文&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;✦ 接下來，我將讀取該變更的狀態，以確定需要產生哪些產出物。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec status --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 32 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;status&amp;#34;: &amp;#34;blocked&amp;#34;, │
│ &amp;#34;missingDeps&amp;#34;: [ │
│ &amp;#34;design&amp;#34;, │
│ &amp;#34;specs&amp;#34; │
│ ] │
│ } │
│ ] │
│ } │
│ Process Group PGID: 5697 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 根據狀態，我需要先建立 proposal。我會先獲取 proposal 的指令與模板。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec instructions proposal --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 7 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;instruction&amp;#34;: &amp;#34;Create the proposal document that establishes WHY this change is needed.\n\nSections:\n- **Why**: 1-2 sentences on the problem or │
│ opportunity. What problem does this solve? Why now?\n- **What Changes**: Bullet list of changes. Be specific about new capabilities, modifications, or │
│ removals. Mark breaking changes with **BREAKING**.\n- **Capabilities**: Identify which specs will be created or modified:\n - **New Capabilities**: List │
│ capabilities being introduced. Each becomes a new `specs/&amp;lt;name&amp;gt;/spec.md`. Use kebab-case names (e.g., `user-auth`, `data-export`).\n - **Modified │
│ Capabilities**: List existing capabilities whose REQUIREMENTS are changing. Only include if spec-level behavior changes (not just implementation details). │
│ Each needs a delta spec file. Check `openspec/specs/` for existing spec names. Leave empty if no requirement changes.\n- **Impact**: Affected code, APIs, │
│ dependencies, or systems.\n\nIMPORTANT: The Capabilities section is critical. It creates the contract between\nproposal and specs phases. Research │
│ existing specs before filling this in.\nEach capability listed here will need a corresponding spec file.\n\nKeep it concise (1-2 pages). Focus on the │
│ \&amp;#34;why\&amp;#34; not the \&amp;#34;how\&amp;#34; -\nimplementation details belong in design.md.\n\nThis is the foundation - specs, design, and tasks all build on this.\n&amp;#34;, │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我現在來撰寫 proposal.md。
✓ WriteFile proposal.md → Accepted (&amp;#43;24, -0)
1 ## Why
2
3 為了確保部署在 Kubernetes (使用 Cilium CNI 且啟用 kube-proxy replacement) 上的 Go HTTP 伺服器在 Pod 終止過程中不會遺失請求，我們需要實作 Graceful
Shutdown 機制，並搭配 Kubernetes 的 `preStop` hook。這樣可以確保在 Pod 進入 Terminating 狀態後，仍有緩衝時間處理剩餘請求。
4
5 ## What Changes
6
7 - 實作 Go 語言的 HTTP 伺服器，支援監聽 `SIGINT` 與 `SIGTERM` 訊號。
8 - 呼叫 `http.Server.Shutdown()` 方法以優雅地關閉連線。
9 - 提供 `Dockerfile` 用於容器化部署。
10 - 提供 Kubernetes Deployment 與 Service 清單 (Manifests)。
11 - 在 Deployment 中加入 `lifecycle.preStop` hook 執行 `sleep 2`。
12
13 ## Capabilities
14
15 ### New Capabilities
16 - `graceful-shutdown-server`: 提供一個具備訊號監聽與優雅關閉能力的 HTTP 伺服器，並包含 K8s 部署設定。
17
18 ### Modified Capabilities
19 &amp;lt;!-- 無 --&amp;gt;
20
21 ## Impact
22
23 - **應用程式**: 新增 `main.go` 處理伺服器啟動與關閉邏輯。
24 - **基礎設施**: 新增 K8s Deployment 與 Service 設定，影響 Pod 的生命週期管理。
✦ proposal.md 已建立。現在我再次檢查狀態，並獲取 design 的指令。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec status --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 26 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;status&amp;#34;: &amp;#34;blocked&amp;#34;, │
│ &amp;#34;missingDeps&amp;#34;: [ │
│ &amp;#34;design&amp;#34;, │
│ &amp;#34;specs&amp;#34; │
│ ] │
│ } │
│ ] │
│ } │
│ Process Group PGID: 5768 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我將先獲取 design 的指令。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec instructions design --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 13 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;path&amp;#34;: &amp;#34;proposal.md&amp;#34;, │
│ &amp;#34;description&amp;#34;: &amp;#34;Initial proposal document outlining the change&amp;#34; │
│ } │
│ ], │
│ &amp;#34;unlocks&amp;#34;: [ │
│ &amp;#34;tasks&amp;#34; │
│ ] │
│ } │
│ Process Group PGID: 5803 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 現在我來撰寫 design.md。
✓ WriteFile design.md → Accepted (&amp;#43;28, -0)
1 ## Context
2
3 目前需要一個能夠在 Kubernetes 環境中安全退場的 Go 伺服器。由於 Kubernetes 的 Service 負載平衡與 Pod 終止是非同步進行的，若不設定 `preStop` hook 與
Graceful Shutdown，可能會在 Pod 關閉期間漏掉部分請求。
4
5 ## Goals / Non-Goals
6
7 **Goals:**
8 - 實作訊號處理邏輯以支援優雅關閉。
9 - 配置 K8s 生命週期鉤子 (`preStop`)。
10 - 確保程式碼簡潔且符合 Go 最佳實踐。
11
12 **Non-Goals:**
13 - 實作複雜的業務邏輯。
14 - 設定進階的 Cilium 網路政策（僅關注 shutdown 流程）。
15
16 ## Decisions
17
18 - **訊號處理**: 使用 `os/signal` 監聽 `SIGINT` (Ctrl&amp;#43;C) 與 `SIGTERM` (K8s 終止訊號)。
19 - **優雅關閉**: 使用 `http.Server.Shutdown()` 並設定 5-10 秒的超時 context，確保進行中的請求有時間完成。
20 - **Kubernetes 整合**:
21 - 在 Deployment 中加入 `lifecycle.preStop.exec` 執行 `sleep 2`。
22 - 理由：這讓 Cilium CNI 有足夠的時間從 eBPF 表中移除該 Pod 的 IP，避免新的請求進來，而此時應用程式已進入關閉流程。
23 - **容器化**: 使用多階段建置 (multi-stage build) 以縮小映像檔體積並提高安全性。
24
25 ## Risks / Trade-offs
26
27 - **[Risk]**: `preStop` hook 時間過短。 → **Mitigation**: 預設 2 秒符合一般 Cilium 環境下 kube-proxy replacement 的收斂速度。
28 - **[Risk]**: 應用程式關閉時間超過 `terminationGracePeriodSeconds`。 → **Mitigation**: 確保 Go 的 `Shutdown` context timeout 小於 K8s 的預設 30 秒。
✦ design.md 已完成。現在我需要建立 specs。根據 proposal，我定義了一個新能力 graceful-shutdown-server。
我將獲取 specs 的指令。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec instructions specs --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 13 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;path&amp;#34;: &amp;#34;proposal.md&amp;#34;, │
│ &amp;#34;description&amp;#34;: &amp;#34;Initial proposal document outlining the change&amp;#34; │
│ } │
│ ], │
│ &amp;#34;unlocks&amp;#34;: [ │
│ &amp;#34;tasks&amp;#34; │
│ ] │
│ } │
│ Process Group PGID: 5850 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我將建立 openspec/changes/graceful-shutdown-go-server/specs/graceful-shutdown-server/spec.md。
✓ WriteFile spec.md → Accepted (&amp;#43;22, -0)
1 ## ADDED Requirements
2
3 ### Requirement: 訊號監聽 (Signal Handling)
4 伺服器必須監聽 `os.Interrupt` (SIGINT) 與 `syscall.SIGTERM` 訊號。
5
6 #### Scenario: 接收到終止訊號
7 - **WHEN** 伺服器接收到 SIGTERM 訊號
8 - **THEN** 伺服器啟動關閉程序並停止接受新請求
9
10 ### Requirement: 優雅關閉 (Graceful Shutdown)
11 伺服器必須在關閉前等待現有連線處理完畢，並設定超時機制。
12
13 #### Scenario: 關閉程序執行
14 - **WHEN** 呼叫 Shutdown 方法
15 - **THEN** 伺服器等待所有作用中請求完成，或直到達到 10 秒超時為止
16
17 ### Requirement: Kubernetes PreStop Hook
18 部署清單必須包含 PreStop 鉤子以延遲應用程式關閉。
19
20 #### Scenario: Pod 進入 Terminating 狀態
21 - **WHEN** Kubernetes 將 Pod 標記為 Terminating
22 - **THEN** PreStop 鉤子執行 `sleep 2`，延遲傳送 SIGTERM 訊號給容器
✦ 現在 proposal, design, specs 都已完成。最後我需要建立 tasks。
我將獲取 tasks 的指令。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec instructions tasks --change &amp;#34;graceful-shutdown-go-server&amp;#34; --json │
│ │
│ ... first 17 lines hidden (Ctrl&amp;#43;O to show) ... │
│ &amp;#34;id&amp;#34;: &amp;#34;design&amp;#34;, │
│ &amp;#34;done&amp;#34;: true, │
│ &amp;#34;path&amp;#34;: &amp;#34;design.md&amp;#34;, │
│ &amp;#34;description&amp;#34;: &amp;#34;Technical design document with implementation details&amp;#34; │
│ } │
│ ], │
│ &amp;#34;unlocks&amp;#34;: [] │
│ } │
│ Process Group PGID: 5894 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我將建立 tasks.md。
✓ WriteFile tasks.md → Accepted (&amp;#43;17, -0)
1 ## 1. 專案初始化與 Go 伺服器實作
2
3 - [ ] 1.1 初始化 Go 專案 (`go mod init`)
4 - [ ] 1.2 在 `main.go` 中實作基礎 HTTP 伺服器
5 - [ ] 1.3 實作訊號監聽邏輯 (`SIGINT`, `SIGTERM`)
6 - [ ] 1.4 實作優雅關閉邏輯 (`http.Server.Shutdown`)
7
8 ## 2. 容器化
9
10 - [ ] 2.1 撰寫多階段建置的 `Dockerfile`
11 - [ ] 2.2 測試本地映像檔建置
12
13 ## 3. Kubernetes 部署清單
14
15 - [ ] 3.1 撰寫 Service 清單
16 - [ ] 3.2 撰寫 Deployment 清單，並加入 `lifecycle.preStop` hook 與 `sleep 2`
17 - [ ] 3.3 驗證 Manifests 語法正確性
✦ 所有產出物均已建立。我將檢查最終狀態。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell openspec status --change &amp;#34;graceful-shutdown-go-server&amp;#34; │
│ │
│ ... first 2 lines hidden (Ctrl&amp;#43;O to show) ... │
│ Progress: 4/4 artifacts complete │
│ │
│ [x] proposal │
│ [x] design │
│ [x] specs │
│ [x] tasks │
│ │
│ All artifacts complete! │
│ Process Group PGID: 5950 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 所有 OpenSpec 產出物已準備就緒！
- 變更名稱: graceful-shutdown-go-server
- 位置: openspec/changes/graceful-shutdown-go-server/
- 已建立產出物:
- proposal.md: 概述為何需要此變更。
- design.md: 詳述技術決策（訊號處理、K8s Hook、多階段建置）。
- specs/graceful-shutdown-server/spec.md: 定義功能需求與測試情境。
- tasks.md: 實作檢查清單。
準備好開始實作了！
您可以輸入 /opsx:apply 或直接要求我開始執行任務。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;Step 5 — 觸發 &lt;code&gt;/init&lt;/code&gt;(關鍵卡點 1)&lt;span class="hx:absolute hx:-mt-20" id="step-5--觸發-init關鍵卡點-1"&gt;&lt;/span&gt;
&lt;a href="#step-5--%e8%a7%b8%e7%99%bc-init%e9%97%9c%e9%8d%b5%e5%8d%a1%e9%bb%9e-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;這是第一個延遲發生的位置。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 CLI 輸入:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;/init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Gemini CLI 會將其展開為內建的長 prompt(以「You are an AI agent that brings the power of Gemini directly into the terminal&amp;hellip;」開頭),要求模型分析當前目錄並產生 GEMINI.md。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;預期觀察&lt;/strong&gt;:模型可能長時間停留在「Thinking&amp;hellip;」狀態而未呼叫任何工具。原 session 此處等了約 45 分鐘。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;建議在此設定計時器&lt;/strong&gt;,若超過 5 分鐘無任何輸出,記錄當下時間。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Step 6 — Tool 執行間卡頓(關鍵卡點 2)&lt;span class="hx:absolute hx:-mt-20" id="step-6--tool-執行間卡頓關鍵卡點-2"&gt;&lt;/span&gt;
&lt;a href="#step-6--tool-%e5%9f%b7%e8%a1%8c%e9%96%93%e5%8d%a1%e9%a0%93%e9%97%9c%e9%8d%b5%e5%8d%a1%e9%bb%9e-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;不需輸入任何內容,此為自動發生。&lt;/p&gt;
&lt;p&gt;當 Gemini 終於開始動作後,會先 &lt;code&gt;list_directory .&lt;/code&gt;,然後嘗試 &lt;code&gt;list_directory openspec/specs&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;預期觀察&lt;/strong&gt;:這兩個 list_directory 呼叫之間可能再次出現長時間靜默。原 session 此處等了約 31 分鐘。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3&gt;Step 7 — 驗證 CLI 是否還活著&lt;span class="hx:absolute hx:-mt-20" id="step-7--驗證-cli-是否還活著"&gt;&lt;/span&gt;
&lt;a href="#step-7--%e9%a9%97%e8%ad%89-cli-%e6%98%af%e5%90%a6%e9%82%84%e6%b4%bb%e8%91%97" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;若你想確認 CLI 是否真的卡住而非完成,可在另一個視窗或等到回到 prompt 後輸入:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;hello?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;觀察重點與紀錄&lt;span class="hx:absolute hx:-mt-20" id="觀察重點與紀錄"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%80%e5%af%9f%e9%87%8d%e9%bb%9e%e8%88%87%e7%b4%80%e9%8c%84" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;建議用一個簡單表格記錄每次重現的結果:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步驟&lt;/th&gt;
&lt;th&gt;開始時間&lt;/th&gt;
&lt;th&gt;結束時間&lt;/th&gt;
&lt;th&gt;耗時&lt;/th&gt;
&lt;th&gt;備註&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Step 1-4(openspec 流程)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step 5(&lt;code&gt;/init&lt;/code&gt; 送出 → 第一個 tool call)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;卡點 1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step 6(list root → list specs)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;卡點 2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step 5-6 總和(&lt;code&gt;/init&lt;/code&gt; → 寫完 GEMINI.md)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;對照組建議(強烈建議跑)&lt;span class="hx:absolute hx:-mt-20" id="對照組建議強烈建議跑"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8d%e7%85%a7%e7%b5%84%e5%bb%ba%e8%ad%b0%e5%bc%b7%e7%83%88%e5%bb%ba%e8%ad%b0%e8%b7%91" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;為了確認延遲是否與 openspec 流程或累積 context 有關,建議再做以下對照:&lt;/p&gt;
&lt;h3&gt;對照組 A:空目錄獨立 &lt;code&gt;/init&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="對照組-a空目錄獨立-init"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8d%e7%85%a7%e7%b5%84-a%e7%a9%ba%e7%9b%ae%e9%8c%84%e7%8d%a8%e7%ab%8b-init" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;開新空目錄 &lt;code&gt;mkdir /tmp/clean-test &amp;amp;&amp;amp; cd /tmp/clean-test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;啟動 &lt;code&gt;gemini --debug&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;直接執行 &lt;code&gt;/init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;記錄完成時間&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;若 A 在數分鐘內完成,而原情境需 1 小時,可確認延遲與「已有檔案的目錄 + 累積 context」相關。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;對照組 B:同目錄但全新 session&lt;span class="hx:absolute hx:-mt-20" id="對照組-b同目錄但全新-session"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8d%e7%85%a7%e7%b5%84-b%e5%90%8c%e7%9b%ae%e9%8c%84%e4%bd%86%e5%85%a8%e6%96%b0-session" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;在原本的 &lt;code&gt;graceful-shutdown&lt;/code&gt; 目錄(已含 openspec 產物)&lt;/li&gt;
&lt;li&gt;開新 session(關閉舊的、重開 &lt;code&gt;gemini&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;直接執行 &lt;code&gt;/init&lt;/code&gt;,跳過 Step 1-4&lt;/li&gt;
&lt;li&gt;記錄完成時間&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;若 B 比原情境快很多,可確認延遲與「同 session 內累積的 context」相關。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;蒐集的資訊(回報 bug 時附上)&lt;span class="hx:absolute hx:-mt-20" id="蒐集的資訊回報-bug-時附上"&gt;&lt;/span&gt;
&lt;a href="#%e8%92%90%e9%9b%86%e7%9a%84%e8%b3%87%e8%a8%8a%e5%9b%9e%e5%a0%b1-bug-%e6%99%82%e9%99%84%e4%b8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;執行 &lt;code&gt;/about&lt;/code&gt; 取得:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CLI Version&lt;/li&gt;
&lt;li&gt;Git Commit&lt;/li&gt;
&lt;li&gt;Model(特別注意是不是 Auto / preview 模型)&lt;/li&gt;
&lt;li&gt;Auth Method&lt;/li&gt;
&lt;li&gt;Tier(免費/付費)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;並一併附上 &lt;code&gt;/tmp/gemini-repro.log&lt;/code&gt; 的 debug log。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;啟動 log 已透露的線索&lt;span class="hx:absolute hx:-mt-20" id="啟動-log-已透露的線索"&gt;&lt;/span&gt;
&lt;a href="#%e5%95%9f%e5%8b%95-log-%e5%b7%b2%e9%80%8f%e9%9c%b2%e7%9a%84%e7%b7%9a%e7%b4%a2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;第一次嘗試啟動時,雖然指令寫法錯誤導致 CLI 立即退出,但啟動階段的 debug log 已透露幾個與本案延遲可能相關的訊息,值得在後續分析時納入考量:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Ripgrep is not available. Falling back to GrepTool.&lt;/code&gt;&lt;/strong&gt;
此版本未安裝 ripgrep,搜尋將使用較慢的內建 GrepTool。&lt;code&gt;/init&lt;/code&gt; 需要掃描整個專案目錄,這雖不至於造成小時級延遲,但會放大整體耗時。
v0.40 開始已將 ripgrep bundle 進 SEA 版本,以 npm 安裝可能未包含,可考慮另外安裝 &lt;code&gt;ripgrep&lt;/code&gt; 套件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Experiment flag &lt;code&gt;45773134 = 300&lt;/code&gt;、&lt;code&gt;45773135 = 600&lt;/code&gt;&lt;/strong&gt;
數值單位推測為秒,對應 5 分鐘和 10 分鐘,符合常見的 timeout / retry backoff 閾值。若後續 debug log 出現的延遲區間是 5/10 分鐘的倍數,很可能就是這兩個 flag 控制的 retry 行為。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Experiment flag &lt;code&gt;45740200&lt;/code&gt; 的官方公告&lt;/strong&gt;
原文(節錄):「We are adding more robust detection of policy-violating use cases and changing how we prioritize traffic. This may result in higher capacity-related errors during periods of high traffic.」
說明 Google 近期正在調整 traffic 優先順序,&lt;strong&gt;確實可能讓 capacity-related error 增加&lt;/strong&gt;。這與「卡點期間其實是 backend 排隊或被節流」的推測相符。
公告連結:https://goo.gle/geminicli-updates&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;已知相關 issues(供參考)&lt;span class="hx:absolute hx:-mt-20" id="已知相關-issues供參考"&gt;&lt;/span&gt;
&lt;a href="#%e5%b7%b2%e7%9f%a5%e7%9b%b8%e9%97%9c-issues%e4%be%9b%e5%8f%83%e8%80%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以下三個 issue 與本案症狀高度相符,&lt;strong&gt;截至 v0.40.1(本文件撰寫時的最新 stable)仍為 open&lt;/strong&gt;,在 v0.39 ~ v0.40 的 changelog 中均未見對應 fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://github.com/google-gemini/gemini-cli/issues/22141"target="_blank" rel="noopener"&gt;google-gemini/gemini-cli#22141&lt;/a&gt; — Gemini CLI becomes extremely slow (1+ HOURS) / stuck during small code-edit tasks&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://github.com/google-gemini/gemini-cli/issues/17442"target="_blank" rel="noopener"&gt;google-gemini/gemini-cli#17442&lt;/a&gt; — CLI Agent Intermittent Long Loading Times/Hangs During Tool Execution&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://github.com/google-gemini/gemini-cli/issues/26126"target="_blank" rel="noopener"&gt;google-gemini/gemini-cli#26126&lt;/a&gt; — Stuck at &amp;ldquo;Thinking&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另一個與 &lt;code&gt;/init&lt;/code&gt; 直接相關但症狀不同的 issue(僅供參考):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://github.com/google-gemini/gemini-cli/issues/6984"target="_blank" rel="noopener"&gt;google-gemini/gemini-cli#6984&lt;/a&gt; — &lt;code&gt;/init&lt;/code&gt; command hangs at &amp;ldquo;Concluding the Process&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu XFCE 安裝繁體中文輸入法 &amp; 設定左 Shift 切換中英文</title><link>https://blog.kubeantony.com/archive/misc/ubuntu-xfce-%E5%AE%89%E8%A3%9D%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E8%BC%B8%E5%85%A5%E6%B3%95-%E8%A8%AD%E5%AE%9A%E5%B7%A6-shift-%E5%88%87%E6%8F%9B%E4%B8%AD%E8%8B%B1%E6%96%87/</link><pubDate>Mon, 04 May 2026 12:46:10 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/ubuntu-xfce-%E5%AE%89%E8%A3%9D%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E8%BC%B8%E5%85%A5%E6%B3%95-%E8%A8%AD%E5%AE%9A%E5%B7%A6-shift-%E5%88%87%E6%8F%9B%E4%B8%AD%E8%8B%B1%E6%96%87/</guid><description>
&lt;h2&gt;環境&lt;span class="hx:absolute hx:-mt-20" id="環境"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作業系統&lt;/strong&gt;:Ubuntu Desktop&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;桌面環境&lt;/strong&gt;:XFCE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;連線方式&lt;/strong&gt;:透過 RDP 連入(xrdp)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;輸入法框架&lt;/strong&gt;:IBus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目標&lt;/strong&gt;:使用 Chewing(新酷音)輸入繁體中文,並用&lt;strong&gt;單按左 Shift&lt;/strong&gt; 切換中英文&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;本文件適用於&lt;strong&gt;已使用 IBus 框架&lt;/strong&gt;的 XFCE 環境。如果你的桌面是 GNOME,設定方式會不同;GNOME Shell 不接受純 modifier 鍵當切換熱鍵。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;步驟一:確認環境&lt;span class="hx:absolute hx:-mt-20" id="步驟一確認環境"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e4%b8%80%e7%a2%ba%e8%aa%8d%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1-1 確認桌面環境&lt;span class="hx:absolute hx:-mt-20" id="1-1-確認桌面環境"&gt;&lt;/span&gt;
&lt;a href="#1-1-%e7%a2%ba%e8%aa%8d%e6%a1%8c%e9%9d%a2%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$XDG_CURRENT_DESKTOP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$DESKTOP_SESSION&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;XFCE
xfce&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1-2 確認目前的輸入法框架&lt;span class="hx:absolute hx:-mt-20" id="1-2-確認目前的輸入法框架"&gt;&lt;/span&gt;
&lt;a href="#1-2-%e7%a2%ba%e8%aa%8d%e7%9b%ae%e5%89%8d%e7%9a%84%e8%bc%b8%e5%85%a5%e6%b3%95%e6%a1%86%e6%9e%b6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GTK_IM_MODULE&lt;/span&gt; &lt;span class="nv"&gt;$QT_IM_MODULE&lt;/span&gt; &lt;span class="nv"&gt;$XMODIFIERS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;ibus ibus @im=ibus&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1-3 確認 IBus daemon 正常運作&lt;span class="hx:absolute hx:-mt-20" id="1-3-確認-ibus-daemon-正常運作"&gt;&lt;/span&gt;
&lt;a href="#1-3-%e7%a2%ba%e8%aa%8d-ibus-daemon-%e6%ad%a3%e5%b8%b8%e9%81%8b%e4%bd%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep ibus-daemon&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出(關鍵在 &lt;code&gt;--xim&lt;/code&gt; 參數要存在):&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred 5010 0.1 0.0 457360 8652 ? Ssl 20:33 0:00 /usr/bin/ibus-daemon --daemonize --xim&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;步驟二:確認 / 安裝中文輸入法引擎&lt;span class="hx:absolute hx:-mt-20" id="步驟二確認--安裝中文輸入法引擎"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e4%ba%8c%e7%a2%ba%e8%aa%8d--%e5%ae%89%e8%a3%9d%e4%b8%ad%e6%96%87%e8%bc%b8%e5%85%a5%e6%b3%95%e5%bc%95%e6%93%8e" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;2-1 確認系統有 Chewing 引擎&lt;span class="hx:absolute hx:-mt-20" id="2-1-確認系統有-chewing-引擎"&gt;&lt;/span&gt;
&lt;a href="#2-1-%e7%a2%ba%e8%aa%8d%e7%b3%bb%e7%b5%b1%e6%9c%89-chewing-%e5%bc%95%e6%93%8e" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus list-engine &lt;span class="p"&gt;|&lt;/span&gt; grep -i -E &lt;span class="s2"&gt;&amp;#34;chewing|pinyin|bopomofo|rime|cangjie&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出(看到 &lt;code&gt;chewing - Chewing&lt;/code&gt; 即代表已安裝):&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;language: Pinyin
chewing - Chewing
language: Tatar, Crimean
xkb:ua:crh_f:crh - Crimean Tatar (Turkish F)
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;2-2 若沒有 Chewing,執行以下指令安裝&lt;span class="hx:absolute hx:-mt-20" id="2-2-若沒有-chewing執行以下指令安裝"&gt;&lt;/span&gt;
&lt;a href="#2-2-%e8%8b%a5%e6%b2%92%e6%9c%89-chewing%e5%9f%b7%e8%a1%8c%e4%bb%a5%e4%b8%8b%e6%8c%87%e4%bb%a4%e5%ae%89%e8%a3%9d" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ibus-chewing
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus restart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;步驟三:確認輸入法清單包含 English 與 Chewing&lt;span class="hx:absolute hx:-mt-20" id="步驟三確認輸入法清單包含-english-與-chewing"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e4%b8%89%e7%a2%ba%e8%aa%8d%e8%bc%b8%e5%85%a5%e6%b3%95%e6%b8%85%e5%96%ae%e5%8c%85%e5%90%ab-english-%e8%88%87-chewing" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gsettings get org.freedesktop.ibus.general preload-engines&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[&amp;#39;xkb:us::eng&amp;#39;, &amp;#39;chewing&amp;#39;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如果清單不對,用以下指令設定:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gsettings &lt;span class="nb"&gt;set&lt;/span&gt; org.freedesktop.ibus.general preload-engines &lt;span class="s2"&gt;&amp;#34;[&amp;#39;xkb:us::eng&amp;#39;, &amp;#39;chewing&amp;#39;]&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;步驟四:設定環境變數(關鍵步驟)⭐&lt;span class="hx:absolute hx:-mt-20" id="步驟四設定環境變數關鍵步驟"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e5%9b%9b%e8%a8%ad%e5%ae%9a%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8%e9%97%9c%e9%8d%b5%e6%ad%a5%e9%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;這是讓設定能&lt;strong&gt;穩定生效&lt;/strong&gt;的關鍵。即使目前 &lt;code&gt;echo $GTK_IM_MODULE&lt;/code&gt; 顯示為 &lt;code&gt;ibus&lt;/code&gt;,也要把它寫入 &lt;code&gt;~/.xprofile&lt;/code&gt;,確保 XFCE session 啟動時一定會載入。&lt;/p&gt;
&lt;h3&gt;4-1 檢查目前狀態&lt;span class="hx:absolute hx:-mt-20" id="4-1-檢查目前狀態"&gt;&lt;/span&gt;
&lt;a href="#4-1-%e6%aa%a2%e6%9f%a5%e7%9b%ae%e5%89%8d%e7%8b%80%e6%85%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.xprofile 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.profile 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s2"&gt;&amp;#34;GTK_IM_MODULE|QT_IM_MODULE|XMODIFIERS&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如果兩個指令都沒輸出,代表環境變數沒寫在使用者層級的設定檔。雖然系統可能有臨時注入,但不夠穩定,要明確寫入。&lt;/p&gt;
&lt;h3&gt;4-2 寫入 ~/.xprofile&lt;span class="hx:absolute hx:-mt-20" id="4-2-寫入-xprofile"&gt;&lt;/span&gt;
&lt;a href="#4-2-%e5%af%ab%e5%85%a5-xprofile" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; ~/.xprofile &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export GTK_IM_MODULE=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export QT_IM_MODULE=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export XMODIFIERS=@im=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;4-3 確認檔案內容&lt;span class="hx:absolute hx:-mt-20" id="4-3-確認檔案內容"&gt;&lt;/span&gt;
&lt;a href="#4-3-%e7%a2%ba%e8%aa%8d%e6%aa%94%e6%a1%88%e5%85%a7%e5%ae%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.xprofile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;步驟五:設定左 Shift 為切換熱鍵&lt;span class="hx:absolute hx:-mt-20" id="步驟五設定左-shift-為切換熱鍵"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e4%ba%94%e8%a8%ad%e5%ae%9a%e5%b7%a6-shift-%e7%82%ba%e5%88%87%e6%8f%9b%e7%86%b1%e9%8d%b5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;5-1 開啟 IBus 設定&lt;span class="hx:absolute hx:-mt-20" id="5-1-開啟-ibus-設定"&gt;&lt;/span&gt;
&lt;a href="#5-1-%e9%96%8b%e5%95%9f-ibus-%e8%a8%ad%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus-setup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;5-2 設定 Next input method 為 Shift_L&lt;span class="hx:absolute hx:-mt-20" id="5-2-設定-next-input-method-為-shift_l"&gt;&lt;/span&gt;
&lt;a href="#5-2-%e8%a8%ad%e5%ae%9a-next-input-method-%e7%82%ba-shift_l" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;strong&gt;General&lt;/strong&gt; 分頁:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到 &lt;strong&gt;Keyboard Shortcuts&lt;/strong&gt; 區塊的 &lt;strong&gt;Next input method&lt;/strong&gt; 欄位&lt;/li&gt;
&lt;li&gt;點右側的 &lt;code&gt;...&lt;/code&gt; 按鈕開啟設定視窗&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;刪除清單裡所有現有的快捷鍵&lt;/strong&gt;(例如 &lt;code&gt;&amp;lt;Shift&amp;gt;space&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Key code&lt;/strong&gt; 欄位手動輸入:
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Shift_L&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifiers 區的所有勾選都不要勾&lt;/strong&gt;(Shift / Ctrl / Alt / Super 全部不勾)&lt;/li&gt;
&lt;li&gt;點 &lt;strong&gt;Add&lt;/strong&gt;,再點 &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定完成後主畫面的 Next input method 欄位應顯示為:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Shift_L&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;注意:Modifiers 一個都不能勾。如果勾了 &lt;code&gt;&amp;lt;Shift&amp;gt;&lt;/code&gt; 變成 modifier 用,或是寫成組合鍵(例如 &lt;code&gt;&amp;lt;Control&amp;gt;Shift_L&lt;/code&gt;),都會導致切換行為異常。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5-3 重啟 IBus&lt;span class="hx:absolute hx:-mt-20" id="5-3-重啟-ibus"&gt;&lt;/span&gt;
&lt;a href="#5-3-%e9%87%8d%e5%95%9f-ibus" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus restart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;步驟六:測試&lt;span class="hx:absolute hx:-mt-20" id="步驟六測試"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f%e5%85%ad%e6%b8%ac%e8%a9%a6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;開啟任一支援文字輸入的應用程式(文字編輯器、瀏覽器網址列等),按下&lt;strong&gt;左 Shift 鍵&lt;/strong&gt;,應該會看到:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;右上角(或工作列上)的 IBus 圖示在 &lt;code&gt;EN&lt;/code&gt; 與中文圖示之間切換&lt;/li&gt;
&lt;li&gt;切到中文模式後,可正常用注音輸入繁體中文&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shift + 字母鍵(如 Shift+a)&lt;/strong&gt; 仍然正常輸出大寫字母,&lt;strong&gt;不會誤觸切換&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;完整指令速查&lt;span class="hx:absolute hx:-mt-20" id="完整指令速查"&gt;&lt;/span&gt;
&lt;a href="#%e5%ae%8c%e6%95%b4%e6%8c%87%e4%bb%a4%e9%80%9f%e6%9f%a5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整個流程可以濃縮成以下幾步:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 確認環境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$XDG_CURRENT_DESKTOP&lt;/span&gt; &lt;span class="c1"&gt;# 應為 XFCE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GTK_IM_MODULE&lt;/span&gt; &lt;span class="nv"&gt;$QT_IM_MODULE&lt;/span&gt; &lt;span class="nv"&gt;$XMODIFIERS&lt;/span&gt; &lt;span class="c1"&gt;# 應為 ibus ibus @im=ibus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep ibus-daemon &lt;span class="c1"&gt;# 確認有 --xim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 確認引擎&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus list-engine &lt;span class="p"&gt;|&lt;/span&gt; grep -i chewing &lt;span class="c1"&gt;# 應看到 chewing - Chewing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gsettings get org.freedesktop.ibus.general preload-engines &lt;span class="c1"&gt;# 應為 [&amp;#39;xkb:us::eng&amp;#39;, &amp;#39;chewing&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 寫入環境變數(關鍵)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; ~/.xprofile &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export GTK_IM_MODULE=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export QT_IM_MODULE=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export XMODIFIERS=@im=ibus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 開設定 → Next input method 設成 Shift_L (Modifiers 全不勾)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus-setup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 重啟 IBus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ibus restart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;故障排除&lt;span class="hx:absolute hx:-mt-20" id="故障排除"&gt;&lt;/span&gt;
&lt;a href="#%e6%95%85%e9%9a%9c%e6%8e%92%e9%99%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;症狀&lt;/th&gt;
&lt;th&gt;可能原因&lt;/th&gt;
&lt;th&gt;解法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;按 Shift 完全沒反應&lt;/td&gt;
&lt;td&gt;環境變數未生效&lt;/td&gt;
&lt;td&gt;確認 &lt;code&gt;~/.xprofile&lt;/code&gt; 已寫入,登出再登入 RDP session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;按任何鍵都會觸發切換&lt;/td&gt;
&lt;td&gt;Modifiers 勾選了 &lt;code&gt;&amp;lt;Shift&amp;gt;&lt;/code&gt;,或 IBus 把 Shift_L 當 modifier 處理&lt;/td&gt;
&lt;td&gt;重新進 ibus-setup,確認 Modifiers 完全沒勾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;切換到中文後切不回英文&lt;/td&gt;
&lt;td&gt;快捷鍵設成 &lt;code&gt;&amp;lt;Control&amp;gt;Shift_L&lt;/code&gt; 等 modifier 組合,IBus 對這類組合切換不穩定&lt;/td&gt;
&lt;td&gt;改回單獨 &lt;code&gt;Shift_L&lt;/code&gt;,或改用 &lt;code&gt;&amp;lt;Shift&amp;gt;space&lt;/code&gt;、&lt;code&gt;&amp;lt;Super&amp;gt;space&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;螢幕中央跳出選單但右上角不變&lt;/td&gt;
&lt;td&gt;IBus 與桌面環境通訊不同步&lt;/td&gt;
&lt;td&gt;重啟 IBus(&lt;code&gt;ibus restart&lt;/code&gt;),必要時重新登入 session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shift+字母 變成切換而不是大寫&lt;/td&gt;
&lt;td&gt;同上(modifier 處理錯誤)&lt;/td&gt;
&lt;td&gt;重新檢查 ibus-setup 的設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;備註:為什麼 XFCE 可以這樣設,GNOME 不行&lt;span class="hx:absolute hx:-mt-20" id="備註為什麼-xfce-可以這樣設gnome-不行"&gt;&lt;/span&gt;
&lt;a href="#%e5%82%99%e8%a8%bb%e7%82%ba%e4%bb%80%e9%ba%bc-xfce-%e5%8f%af%e4%bb%a5%e9%80%99%e6%a8%a3%e8%a8%adgnome-%e4%b8%8d%e8%a1%8c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GNOME Shell&lt;/strong&gt; 會強制攔截輸入法熱鍵,並要求快捷鍵至少包含一個非 modifier 鍵,因此&lt;strong&gt;單按 Shift 在 GNOME 上做不到&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XFCE&lt;/strong&gt; 不會攔截熱鍵,IBus 可以完整接管,所以單按 Shift_L 切換才有機會穩定運作。&lt;/li&gt;
&lt;li&gt;如果一定要在 GNOME 上實現單按 Shift 切換,需要改用 &lt;strong&gt;Fcitx5&lt;/strong&gt; 框架(它自己接管熱鍵處理,可繞過 GNOME 的限制)。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>驗證 kubelet `serializeImagePulls` 行為差異</title><link>https://blog.kubeantony.com/archive/misc/%E9%A9%97%E8%AD%89-kubelet-serializeimagepulls-%E8%A1%8C%E7%82%BA%E5%B7%AE%E7%95%B0/</link><pubDate>Wed, 29 Apr 2026 08:17:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E9%A9%97%E8%AD%89-kubelet-serializeimagepulls-%E8%A1%8C%E7%82%BA%E5%B7%AE%E7%95%B0/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;透過實際部署多個 Pod,觀察 kubelet 在 &lt;code&gt;serializeImagePulls=true&lt;/code&gt; 與 &lt;code&gt;false&lt;/code&gt; 兩種設定下的 image 拉取行為差異。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;目錄&lt;span class="hx:absolute hx:-mt-20" id="目錄"&gt;&lt;/span&gt;
&lt;a href="#%e7%9b%ae%e9%8c%84" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="#%e8%83%8c%e6%99%af%e7%9f%a5%e8%ad%98"&gt;背景知識&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e5%89%8d%e7%bd%ae%e6%ba%96%e5%82%99"&gt;前置準備&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e7%ac%ac%e4%b8%80%e9%9a%8e%e6%ae%b5%e6%b8%ac%e8%a9%a6-serializeimagepullsfalse%e5%b9%b3%e8%a1%8c%e6%8b%89%e5%8f%96"&gt;第一階段:測試 &lt;code&gt;serializeImagePulls=false&lt;/code&gt;(平行拉取)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e7%ac%ac%e4%ba%8c%e9%9a%8e%e6%ae%b5%e6%b8%ac%e8%a9%a6-serializeimagepullstrue%e5%ba%8f%e5%88%97%e6%8b%89%e5%8f%96"&gt;第二階段:測試 &lt;code&gt;serializeImagePulls=true&lt;/code&gt;(序列拉取)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e7%ac%ac%e4%b8%89%e9%9a%8e%e6%ae%b5%e5%b0%8d%e7%85%a7%e5%88%86%e6%9e%90"&gt;第三階段:對照分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e9%82%84%e5%8e%9f%e6%ad%a5%e9%a9%9f"&gt;還原步驟&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85"&gt;注意事項&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%96%99"&gt;參考資料&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;背景知識&lt;span class="hx:absolute hx:-mt-20" id="背景知識"&gt;&lt;/span&gt;
&lt;a href="#%e8%83%8c%e6%99%af%e7%9f%a5%e8%ad%98" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;兩個層級的序列化&lt;span class="hx:absolute hx:-mt-20" id="兩個層級的序列化"&gt;&lt;/span&gt;
&lt;a href="#%e5%85%a9%e5%80%8b%e5%b1%a4%e7%b4%9a%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes 的 image pull 序列化行為其實有&lt;strong&gt;兩個層級&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;跨 Pod 層級&lt;/strong&gt;:由 &lt;code&gt;serializeImagePulls&lt;/code&gt; 控制,決定不同 Pod 之間的 image 拉取是序列還是平行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pod 內部層級&lt;/strong&gt;:kubelet 永遠會逐一處理同一個 Pod 內的 container,&lt;strong&gt;這個行為不受 &lt;code&gt;serializeImagePulls&lt;/code&gt; 影響&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;重要&lt;/strong&gt;:測試時若用「單一 Pod 多 container」,無論 &lt;code&gt;serializeImagePulls&lt;/code&gt; 設成什麼,都會看到序列行為。必須用「多 Pod 同時部署」才能觀察到差異。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;參數版本支援&lt;span class="hx:absolute hx:-mt-20" id="參數版本支援"&gt;&lt;/span&gt;
&lt;a href="#%e5%8f%83%e6%95%b8%e7%89%88%e6%9c%ac%e6%94%af%e6%8f%b4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Kubernetes &lt;strong&gt;1.27+&lt;/strong&gt;:&lt;code&gt;maxParallelImagePulls&lt;/code&gt; 為 Alpha&lt;/li&gt;
&lt;li&gt;Kubernetes &lt;strong&gt;1.28+&lt;/strong&gt;:升為 Beta&lt;/li&gt;
&lt;li&gt;Kubernetes &lt;strong&gt;1.32+&lt;/strong&gt;:加入 e2e 測試&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;前置準備&lt;span class="hx:absolute hx:-mt-20" id="前置準備"&gt;&lt;/span&gt;
&lt;a href="#%e5%89%8d%e7%bd%ae%e6%ba%96%e5%82%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1. 選定測試用的 worker node&lt;span class="hx:absolute hx:-mt-20" id="1-選定測試用的-worker-node"&gt;&lt;/span&gt;
&lt;a href="#1-%e9%81%b8%e5%ae%9a%e6%b8%ac%e8%a9%a6%e7%94%a8%e7%9a%84-worker-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;本次測試使用節點:&lt;code&gt;tk8s-worker2&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;2. 備份 kubelet 設定檔&lt;span class="hx:absolute hx:-mt-20" id="2-備份-kubelet-設定檔"&gt;&lt;/span&gt;
&lt;a href="#2-%e5%82%99%e4%bb%bd-kubelet-%e8%a8%ad%e5%ae%9a%e6%aa%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;SSH 到目標 worker node:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /var/lib/kubelet/config.yaml /var/lib/kubelet/config.yaml.bak&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;3. 準備測試用 YAML&lt;span class="hx:absolute hx:-mt-20" id="3-準備測試用-yaml"&gt;&lt;/span&gt;
&lt;a href="#3-%e6%ba%96%e5%82%99%e6%b8%ac%e8%a9%a6%e7%94%a8-yaml" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;建立檔案 &lt;code&gt;multi-pod-test.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pull-test-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tk8s-worker2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3600&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pull-test-2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tk8s-worker2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;redis:7.2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3600&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pull-test-3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tk8s-worker2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mysql:8.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3600&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pull-test-4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tk8s-worker2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres:16&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3600&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;第一階段:測試 &lt;code&gt;serializeImagePulls=false&lt;/code&gt;(平行拉取)&lt;span class="hx:absolute hx:-mt-20" id="第一階段測試-serializeimagepullsfalse平行拉取"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%b8%80%e9%9a%8e%e6%ae%b5%e6%b8%ac%e8%a9%a6-serializeimagepullsfalse%e5%b9%b3%e8%a1%8c%e6%8b%89%e5%8f%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;步驟 1:修改 kubelet 設定為 false&lt;span class="hx:absolute hx:-mt-20" id="步驟-1修改-kubelet-設定為-false"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-1%e4%bf%ae%e6%94%b9-kubelet-%e8%a8%ad%e5%ae%9a%e7%82%ba-false" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 worker node 上編輯設定檔:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo vi /var/lib/kubelet/config.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;加入或修改以下欄位:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;serializeImagePulls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maxParallelImagePulls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 2:重啟 kubelet&lt;span class="hx:absolute hx:-mt-20" id="步驟-2重啟-kubelet"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-2%e9%87%8d%e5%95%9f-kubelet" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status kubelet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;確認狀態為 &lt;code&gt;active (running)&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;步驟 3:驗證設定生效&lt;span class="hx:absolute hx:-mt-20" id="步驟-3驗證設定生效"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-3%e9%a9%97%e8%ad%89%e8%a8%ad%e5%ae%9a%e7%94%9f%e6%95%88" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get --raw &lt;span class="s2"&gt;&amp;#34;/api/v1/nodes/tk8s-worker2/proxy/configz&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;.kubeletconfig | {serializeImagePulls, maxParallelImagePulls}&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;serializeImagePulls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxParallelImagePulls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 4:清除節點上的舊 image&lt;span class="hx:absolute hx:-mt-20" id="步驟-4清除節點上的舊-image"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-4%e6%b8%85%e9%99%a4%e7%af%80%e9%bb%9e%e4%b8%8a%e7%9a%84%e8%88%8a-image" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 worker node 上執行:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo crictl rmi nginx:1.25 redis:7.2 mysql:8.0 postgres:16&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 5:開啟 events 監看視窗&lt;span class="hx:absolute hx:-mt-20" id="步驟-5開啟-events-監看視窗"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-5%e9%96%8b%e5%95%9f-events-%e7%9b%a3%e7%9c%8b%e8%a6%96%e7%aa%97" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;另開一個 terminal:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events --watch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 6:部署 Pod 進行測試&lt;span class="hx:absolute hx:-mt-20" id="步驟-6部署-pod-進行測試"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-6%e9%83%a8%e7%bd%b2-pod-%e9%80%b2%e8%a1%8c%e6%b8%ac%e8%a9%a6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f multi-pod-test.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 7:實際執行結果&lt;span class="hx:absolute hx:-mt-20" id="步驟-7實際執行結果"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-7%e5%af%a6%e9%9a%9b%e5%9f%b7%e8%a1%8c%e7%b5%90%e6%9e%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-1 Pulling image &amp;#34;nginx:1.25&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-2 Pulling image &amp;#34;redis:7.2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-3 Pulling image &amp;#34;mysql:8.0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-4 Pulling image &amp;#34;postgres:16&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-2 Successfully pulled image &amp;#34;redis:7.2&amp;#34; in 3.559s (3.559s including waiting). Image size: 44645040 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-2 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-2 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-3 Successfully pulled image &amp;#34;mysql:8.0&amp;#34; in 3.792s (3.792s including waiting). Image size: 233592821 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-3 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-3 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-4 Successfully pulled image &amp;#34;postgres:16&amp;#34; in 4.077s (4.077s including waiting). Image size: 160157788 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-4 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-4 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-1 Successfully pulled image &amp;#34;nginx:1.25&amp;#34; in 5.568s (5.568s including waiting). Image size: 71005258 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-1 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-1 Container started&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 8:結果判讀(平行拉取的證據)&lt;span class="hx:absolute hx:-mt-20" id="步驟-8結果判讀平行拉取的證據"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-8%e7%b5%90%e6%9e%9c%e5%88%a4%e8%ae%80%e5%b9%b3%e8%a1%8c%e6%8b%89%e5%8f%96%e7%9a%84%e8%ad%89%e6%93%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;pull time&lt;/th&gt;
&lt;th&gt;including waiting&lt;/th&gt;
&lt;th&gt;等待時間&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;redis:7.2&lt;/td&gt;
&lt;td&gt;3.559s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.559s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mysql:8.0&lt;/td&gt;
&lt;td&gt;3.792s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.792s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postgres:16&lt;/td&gt;
&lt;td&gt;4.077s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.077s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nginx:1.25&lt;/td&gt;
&lt;td&gt;5.568s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.568s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0s ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;判讀重點:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 四個 &lt;code&gt;Pulling&lt;/code&gt; 事件&lt;strong&gt;同時發生&lt;/strong&gt;(時間戳同為 &lt;code&gt;0s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ 每個 image 的 &lt;code&gt;pull time&lt;/code&gt; = &lt;code&gt;including waiting&lt;/code&gt;,代表&lt;strong&gt;沒有任何排隊等待&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ 完成順序與啟動順序&lt;strong&gt;不同&lt;/strong&gt;(redis 第一個拉完,但 nginx 第一個啟動)&lt;/li&gt;
&lt;li&gt;✅ 總時間 ≈ &lt;strong&gt;最慢 image 的時間&lt;/strong&gt;(~5.5 秒)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;步驟 9:清理測試環境&lt;span class="hx:absolute hx:-mt-20" id="步驟-9清理測試環境"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-9%e6%b8%85%e7%90%86%e6%b8%ac%e8%a9%a6%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete -f multi-pod-test.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;第二階段:測試 &lt;code&gt;serializeImagePulls=true&lt;/code&gt;(序列拉取)&lt;span class="hx:absolute hx:-mt-20" id="第二階段測試-serializeimagepullstrue序列拉取"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%ba%8c%e9%9a%8e%e6%ae%b5%e6%b8%ac%e8%a9%a6-serializeimagepullstrue%e5%ba%8f%e5%88%97%e6%8b%89%e5%8f%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;步驟 10:修改 kubelet 設定為 true&lt;span class="hx:absolute hx:-mt-20" id="步驟-10修改-kubelet-設定為-true"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-10%e4%bf%ae%e6%94%b9-kubelet-%e8%a8%ad%e5%ae%9a%e7%82%ba-true" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;SSH 到 worker node,編輯設定檔:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo vi /var/lib/kubelet/config.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改為:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;serializeImagePulls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意&lt;/strong&gt;:設為 &lt;code&gt;true&lt;/code&gt; 時必須&lt;strong&gt;移除或註解&lt;/strong&gt; &lt;code&gt;maxParallelImagePulls&lt;/code&gt; 那一行,否則 kubelet 會啟動失敗。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;步驟 11:重啟 kubelet&lt;span class="hx:absolute hx:-mt-20" id="步驟-11重啟-kubelet"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-11%e9%87%8d%e5%95%9f-kubelet" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status kubelet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 12:驗證設定生效&lt;span class="hx:absolute hx:-mt-20" id="步驟-12驗證設定生效"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-12%e9%a9%97%e8%ad%89%e8%a8%ad%e5%ae%9a%e7%94%9f%e6%95%88" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get --raw &lt;span class="s2"&gt;&amp;#34;/api/v1/nodes/tk8s-worker2/proxy/configz&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;.kubeletconfig.serializeImagePulls&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;預期輸出:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 13:清除節點上的 image&lt;span class="hx:absolute hx:-mt-20" id="步驟-13清除節點上的-image"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-13%e6%b8%85%e9%99%a4%e7%af%80%e9%bb%9e%e4%b8%8a%e7%9a%84-image" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 worker node 上執行:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo crictl rmi nginx:1.25 redis:7.2 mysql:8.0 postgres:16&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 14:重新部署 Pod 並監看 events&lt;span class="hx:absolute hx:-mt-20" id="步驟-14重新部署-pod-並監看-events"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-14%e9%87%8d%e6%96%b0%e9%83%a8%e7%bd%b2-pod-%e4%b8%a6%e7%9b%a3%e7%9c%8b-events" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get events --watch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;另開 terminal:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f multi-pod-test.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 15:實際執行結果&lt;span class="hx:absolute hx:-mt-20" id="步驟-15實際執行結果"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-15%e5%af%a6%e9%9a%9b%e5%9f%b7%e8%a1%8c%e7%b5%90%e6%9e%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-3 Pulling image &amp;#34;mysql:8.0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-1 Pulling image &amp;#34;nginx:1.25&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-2 Pulling image &amp;#34;redis:7.2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulling pod/pull-test-4 Pulling image &amp;#34;postgres:16&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-3 Successfully pulled image &amp;#34;mysql:8.0&amp;#34; in 3.858s (3.858s including waiting). Image size: 233592821 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-3 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-3 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-1 Successfully pulled image &amp;#34;nginx:1.25&amp;#34; in 4.783s (8.629s including waiting). Image size: 71005258 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-1 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-1 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-2 Successfully pulled image &amp;#34;redis:7.2&amp;#34; in 3.565s (12.188s including waiting). Image size: 44645040 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-2 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-2 Container started
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Pulled pod/pull-test-4 Successfully pulled image &amp;#34;postgres:16&amp;#34; in 3.585s (15.751s including waiting). Image size: 160157788 bytes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Created pod/pull-test-4 Container created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0s Normal Started pod/pull-test-4 Container started&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 16:結果判讀(序列拉取的證據)&lt;span class="hx:absolute hx:-mt-20" id="步驟-16結果判讀序列拉取的證據"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-16%e7%b5%90%e6%9e%9c%e5%88%a4%e8%ae%80%e5%ba%8f%e5%88%97%e6%8b%89%e5%8f%96%e7%9a%84%e8%ad%89%e6%93%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;順序&lt;/th&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;pull time&lt;/th&gt;
&lt;th&gt;including waiting&lt;/th&gt;
&lt;th&gt;等待時間&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;mysql:8.0&lt;/td&gt;
&lt;td&gt;3.858s&lt;/td&gt;
&lt;td&gt;3.858s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;nginx:1.25&lt;/td&gt;
&lt;td&gt;4.783s&lt;/td&gt;
&lt;td&gt;8.629s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.846s&lt;/strong&gt; ⏳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;redis:7.2&lt;/td&gt;
&lt;td&gt;3.565s&lt;/td&gt;
&lt;td&gt;12.188s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.623s&lt;/strong&gt; ⏳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;postgres:16&lt;/td&gt;
&lt;td&gt;3.585s&lt;/td&gt;
&lt;td&gt;15.751s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.166s&lt;/strong&gt; ⏳&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;判讀重點:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ 雖然四個 &lt;code&gt;Pulling&lt;/code&gt; 事件看起來也是同一秒(這是事件精度只到秒的觀察陷阱),但底層&lt;strong&gt;只有一個真的在下載&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;including waiting&lt;/code&gt; 時間&lt;strong&gt;遞增&lt;/strong&gt;(0s → 3.8s → 8.6s → 12.2s),代表後面的 image 都在排隊&lt;/li&gt;
&lt;li&gt;✅ 等待時間 ≈ 前面所有 image 的 pull time 累加&lt;/li&gt;
&lt;li&gt;✅ 總時間 ≈ &lt;strong&gt;所有 image 拉取時間總和&lt;/strong&gt;(~15.7 秒)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;步驟 17:清理測試環境&lt;span class="hx:absolute hx:-mt-20" id="步驟-17清理測試環境"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-17%e6%b8%85%e7%90%86%e6%b8%ac%e8%a9%a6%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl delete -f multi-pod-test.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;第三階段:對照分析&lt;span class="hx:absolute hx:-mt-20" id="第三階段對照分析"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%b8%89%e9%9a%8e%e6%ae%b5%e5%b0%8d%e7%85%a7%e5%88%86%e6%9e%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;兩種模式並列比較&lt;span class="hx:absolute hx:-mt-20" id="兩種模式並列比較"&gt;&lt;/span&gt;
&lt;a href="#%e5%85%a9%e7%a8%ae%e6%a8%a1%e5%bc%8f%e4%b8%a6%e5%88%97%e6%af%94%e8%bc%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;觀察項目&lt;/th&gt;
&lt;th&gt;&lt;code&gt;serializeImagePulls=false&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;serializeImagePulls=true&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;各 image 等待時間&lt;/td&gt;
&lt;td&gt;0s, 0s, 0s, 0s&lt;/td&gt;
&lt;td&gt;0s, 3.8s, 8.6s, &lt;strong&gt;12.2s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pull time&lt;/code&gt; vs &lt;code&gt;including waiting&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;兩者相同&lt;/td&gt;
&lt;td&gt;&lt;code&gt;including waiting&lt;/code&gt; 大於 &lt;code&gt;pull time&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;完成順序&lt;/td&gt;
&lt;td&gt;取決於 image 大小與網速&lt;/td&gt;
&lt;td&gt;接近啟動順序&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最後一個完成時間&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~5.5 秒&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~15.7 秒&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;總耗時特徵&lt;/td&gt;
&lt;td&gt;≈ 最慢 image 時間&lt;/td&gt;
&lt;td&gt;≈ 所有 image 時間總和&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;效能差異&lt;/td&gt;
&lt;td&gt;基準&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;慢約 2.85 倍&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;視覺化對照&lt;span class="hx:absolute hx:-mt-20" id="視覺化對照"&gt;&lt;/span&gt;
&lt;a href="#%e8%a6%96%e8%a6%ba%e5%8c%96%e5%b0%8d%e7%85%a7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;serializeImagePulls=false&lt;/code&gt;(平行)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;時間軸: 0s ─────────── 5.5s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql [████████] ← 同時下載
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx [██████████]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;redis [████████]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;postgres [██████████]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;serializeImagePulls=true&lt;/code&gt;(序列)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;時間軸: 0s ─────────────────────── 15.7s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql [████] ← 先下載
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx [█████] ← 等 mysql 完
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;redis [████] ← 再等
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;postgres [████] ← 最後&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;🎯 最關鍵的單一判斷依據&lt;span class="hx:absolute hx:-mt-20" id="-最關鍵的單一判斷依據"&gt;&lt;/span&gt;
&lt;a href="#-%e6%9c%80%e9%97%9c%e9%8d%b5%e7%9a%84%e5%96%ae%e4%b8%80%e5%88%a4%e6%96%b7%e4%be%9d%e6%93%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;看 &lt;code&gt;Pulled&lt;/code&gt; 事件訊息中的 &lt;strong&gt;&lt;code&gt;including waiting&lt;/code&gt;&lt;/strong&gt; 數字:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;in X (X including waiting)&lt;/code&gt; → &lt;strong&gt;平行拉取&lt;/strong&gt;(沒排隊)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in X (Y including waiting)&lt;/code&gt; 且 &lt;strong&gt;&lt;code&gt;Y &amp;gt; X&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;序列拉取&lt;/strong&gt;(有排隊)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這個欄位就是 Kubernetes 為了幫使用者判斷序列化行為而特別設計的觀察點。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;還原步驟&lt;span class="hx:absolute hx:-mt-20" id="還原步驟"&gt;&lt;/span&gt;
&lt;a href="#%e9%82%84%e5%8e%9f%e6%ad%a5%e9%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;步驟 18:還原 kubelet 設定&lt;span class="hx:absolute hx:-mt-20" id="步驟-18還原-kubelet-設定"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-18%e9%82%84%e5%8e%9f-kubelet-%e8%a8%ad%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /var/lib/kubelet/config.yaml.bak /var/lib/kubelet/config.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart kubelet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status kubelet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;步驟 19:確認還原成功&lt;span class="hx:absolute hx:-mt-20" id="步驟-19確認還原成功"&gt;&lt;/span&gt;
&lt;a href="#%e6%ad%a5%e9%a9%9f-19%e7%a2%ba%e8%aa%8d%e9%82%84%e5%8e%9f%e6%88%90%e5%8a%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get --raw &lt;span class="s2"&gt;&amp;#34;/api/v1/nodes/tk8s-worker2/proxy/configz&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;.kubeletconfig.serializeImagePulls&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;注意事項&lt;span class="hx:absolute hx:-mt-20" id="注意事項"&gt;&lt;/span&gt;
&lt;a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1. 測試節點選擇&lt;span class="hx:absolute hx:-mt-20" id="1-測試節點選擇"&gt;&lt;/span&gt;
&lt;a href="#1-%e6%b8%ac%e8%a9%a6%e7%af%80%e9%bb%9e%e9%81%b8%e6%93%87" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;選一台&lt;strong&gt;非生產關鍵&lt;/strong&gt;的 worker node。重啟 kubelet 期間該節點上的 Pod 會短暫斷線。&lt;/p&gt;
&lt;h3&gt;2. kubeadm 叢集警告&lt;span class="hx:absolute hx:-mt-20" id="2-kubeadm-叢集警告"&gt;&lt;/span&gt;
&lt;a href="#2-kubeadm-%e5%8f%a2%e9%9b%86%e8%ad%a6%e5%91%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;本機修改的 &lt;code&gt;/var/lib/kubelet/config.yaml&lt;/code&gt; 在執行 &lt;code&gt;kubeadm upgrade&lt;/code&gt; 時可能會被覆蓋。正式長期套用建議改 &lt;code&gt;kube-system&lt;/code&gt; 命名空間下的 &lt;code&gt;kubelet-config&lt;/code&gt; ConfigMap(但會影響全部節點)。&lt;/p&gt;
&lt;h3&gt;3. Image 必須不存在於節點&lt;span class="hx:absolute hx:-mt-20" id="3-image-必須不存在於節點"&gt;&lt;/span&gt;
&lt;a href="#3-image-%e5%bf%85%e9%a0%88%e4%b8%8d%e5%ad%98%e5%9c%a8%e6%96%bc%e7%af%80%e9%bb%9e" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每次測試前都要 &lt;code&gt;crictl rmi&lt;/code&gt;,否則 kubelet 會跳過 pull 階段直接顯示 &lt;code&gt;Container image already present&lt;/code&gt;,觀察不到差異。&lt;/p&gt;
&lt;h3&gt;4. &lt;code&gt;maxParallelImagePulls&lt;/code&gt; 限制規則&lt;span class="hx:absolute hx:-mt-20" id="4-maxparallelimagepulls-限制規則"&gt;&lt;/span&gt;
&lt;a href="#4-maxparallelimagepulls-%e9%99%90%e5%88%b6%e8%a6%8f%e5%89%87" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;需要 Kubernetes &lt;strong&gt;1.27+&lt;/strong&gt; 才支援&lt;/li&gt;
&lt;li&gt;設為 &lt;code&gt;≥ 2&lt;/code&gt; 時,&lt;strong&gt;必須&lt;/strong&gt;搭配 &lt;code&gt;serializeImagePulls: false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;若 &lt;code&gt;serializeImagePulls: true&lt;/code&gt;,則 &lt;code&gt;maxParallelImagePulls&lt;/code&gt; 必須設為 &lt;code&gt;1&lt;/code&gt; 或不設定&lt;/li&gt;
&lt;li&gt;違反規則 kubelet 會啟動失敗&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Pod 內 container 不受影響&lt;span class="hx:absolute hx:-mt-20" id="5-pod-內-container-不受影響"&gt;&lt;/span&gt;
&lt;a href="#5-pod-%e5%85%a7-container-%e4%b8%8d%e5%8f%97%e5%bd%b1%e9%9f%bf" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;kubelet &lt;strong&gt;永遠&lt;/strong&gt;逐一處理同一個 Pod 內的多個 container 的 image 拉取,這是固定設計,與 &lt;code&gt;serializeImagePulls&lt;/code&gt; 設定無關。所以驗證時務必使用「多 Pod 同時部署」的方式。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;參考資料&lt;span class="hx:absolute hx:-mt-20" id="參考資料"&gt;&lt;/span&gt;
&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%96%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://kubernetes.io/docs/concepts/containers/images/"target="_blank" rel="noopener"&gt;Kubernetes Documentation - Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3673-kubelet-parallel-image-pull-limit/README.md"target="_blank" rel="noopener"&gt;KEP-3673: Kubelet limit of Parallel Image Pulls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Install</title><link>https://blog.kubeantony.com/archive/misc/install/</link><pubDate>Tue, 18 Nov 2025 08:15:14 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/install/</guid><description>
&lt;h2&gt;Default monitoring stack components&lt;span class="hx:absolute hx:-mt-20" id="default-monitoring-stack-components"&gt;&lt;/span&gt;
&lt;a href="#default-monitoring-stack-components" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/BJ4uqjte-x.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;元件 (Component)&lt;/th&gt;
&lt;th style="text-align: left"&gt;描述 (Description)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Cluster Monitoring Operator&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;CMO 是監控堆疊的核心元件。它負責部署、管理並自動更新 Prometheus 和 Alertmanager 執行個體、Thanos Querier、Telemeter Client 以及metrics targets。CMO 是由 Cluster Version Operator (CVO)所部署。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Prometheus Operator&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;位於 &lt;code&gt;openshift-monitoring&lt;/code&gt; 專案中的 Prometheus Operator，負責建立、設定和管理平台的 Prometheus 執行個體與 Alertmanager 執行個體。它還會根據 Kubernetes 標籤查詢 (label queries) 自動產生監控目標設定。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;OpenShift Container Platform 監控堆疊是基於 Prometheus 監控系統。Prometheus 是一個時間序列資料庫 (time-series database) 和用於指標的規則評估引擎 (rule evaluation engine)。Prometheus 會將警示 (alerts) 傳送至 Alertmanager 進行處理。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Metrics Server&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Metrics Server 元件（上圖中的 MS）收集資源指標 (resource metrics)，並將它們公開在 &lt;code&gt;metrics.k8s.io&lt;/code&gt; Metrics API 服務中，以供其他工具和 API 使用，這使得核心平台的 Prometheus 堆疊無需處理此功能。請注意，自 OpenShift Container Platform 4.16 版本起，Metrics Server 取代了 Prometheus Adapter。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Alertmanager 服務處理從 Prometheus 接收到的警示。Alertmanager 還負責將警示傳送到外部通知系統。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;kube-state-metrics agent&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;kube-state-metrics 匯出器代理程式（exporter agent）（上圖中的 KSM）將 Kubernetes 物件 (objects) 轉換為 Prometheus 可以使用的指標。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;monitoring-plugin&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;monitoring-plugin dynamic plugin 元件，負責在 OpenShift Container Platform 網站主控台 (web console) 的「Observe」區塊中部署監控頁面。您可以使用 Cluster Monitoring Operator 的 config map 設定來管理網站主控台頁面的 monitoring-plugin 資源。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;openshift-state-metrics agent&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;openshift-state-metrics 匯出器（上圖中的 OSM）擴展了 kube-state-metrics 的功能，增加了 OpenShift Container Platform 特定資源的指標。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;node-exporter agent&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;node-exporter 代理程式（上圖中的 NE）收集叢集中每個節點 (node) 的指標。node-exporter 代理程式會部署在每個節點上。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Thanos Querier&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Thanos Querier 在一個單一的多租戶 (multi-tenant) 介面下，彙總 (aggregates) 核心 OpenShift Container Platform 指標和使用者定義專案的指標，並可選擇性地進行重複資料刪除 (deduplicates)。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Telemeter Client&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;Telemeter Client 將來自平台 Prometheus 執行個體的資料子集傳送到 Red Hat，以實現叢集的遠端健康狀況監控。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Quick install dive</title><link>https://blog.kubeantony.com/archive/misc/quick-install-dive/</link><pubDate>Thu, 02 Oct 2025 10:06:00 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/quick-install-dive/</guid><description>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;wget https://github.com/wagoodman/dive/releases/download/v0.13.1/dive_0.13.1_linux_amd64.tar.gz
sudo tar -xzf dive_0.13.1_linux_amd64.tar.gz -C /usr/local/bin dive
rm dive_0.13.1_linux_amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>VCF 5.2 資源</title><link>https://blog.kubeantony.com/archive/misc/vcf-5.2-%E8%B3%87%E6%BA%90/</link><pubDate>Mon, 22 Sep 2025 07:49:04 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/vcf-5.2-%E8%B3%87%E6%BA%90/</guid><description>
&lt;h2&gt;1. 教育訓練&lt;span class="hx:absolute hx:-mt-20" id="1-教育訓練"&gt;&lt;/span&gt;
&lt;a href="#1-%e6%95%99%e8%82%b2%e8%a8%93%e7%b7%b4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Operations&lt;span class="hx:absolute hx:-mt-20" id="operations"&gt;&lt;/span&gt;
&lt;a href="#operations" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://drive.google.com/drive/folders/12M1cjiOnf-IZ2uSJmRKcRmUgGmdqEmd1?usp=sharing"target="_blank" rel="noopener"&gt;https://drive.google.com/drive/folders/12M1cjiOnf-IZ2uSJmRKcRmUgGmdqEmd1?usp=sharing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Logs + Automation&lt;span class="hx:absolute hx:-mt-20" id="logs--automation"&gt;&lt;/span&gt;
&lt;a href="#logs--automation" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://drive.google.com/drive/folders/1hhqEBQU0Ac3HyrgZAwSo-7KcZtTD1UY9?usp=drive_link"target="_blank" rel="noopener"&gt;https://drive.google.com/drive/folders/1hhqEBQU0Ac3HyrgZAwSo-7KcZtTD1UY9?usp=drive_link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. VKS 安裝所需資源&lt;span class="hx:absolute hx:-mt-20" id="2-vks-安裝所需資源"&gt;&lt;/span&gt;
&lt;a href="#2-vks-%e5%ae%89%e8%a3%9d%e6%89%80%e9%9c%80%e8%b3%87%e6%ba%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;2.1. AVI Load Balancer&lt;span class="hx:absolute hx:-mt-20" id="21-avi-load-balancer"&gt;&lt;/span&gt;
&lt;a href="#21-avi-load-balancer" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;30.2.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;controller-30.2.2-9108.ova&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;下點連結: &lt;a
href="https://drive.google.com/drive/folders/1GO_6EWxozw7atau2rR6D6qy7_tgq1fcP?usp=drive_link"target="_blank" rel="noopener"&gt;https://drive.google.com/drive/folders/1GO_6EWxozw7atau2rR6D6qy7_tgq1fcP?usp=drive_link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2. vSphere Kuebrentes Service&lt;span class="hx:absolute hx:-mt-20" id="22-vsphere-kuebrentes-service"&gt;&lt;/span&gt;
&lt;a href="#22-vsphere-kuebrentes-service" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;3.4.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;3.4.0-package.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;官方下點連結: &lt;a
href="https://support.broadcom.com/group/ecx/productfiles?subFamily=vSphere%20Supervisor%20Services&amp;amp;displayGroup=vSphere%20Kubernetes%20Service&amp;amp;release=3.4%2Bv1.33&amp;amp;os=&amp;amp;servicePk=&amp;amp;language=EN&amp;amp;freeDownloads=true"target="_blank" rel="noopener"&gt;https://support.broadcom.com/group/ecx/productfiles?subFamily=vSphere%20Supervisor%20Services&amp;displayGroup=vSphere%20Kubernetes%20Service&amp;release=3.4%2Bv1.33&amp;os=&amp;servicePk=&amp;language=EN&amp;freeDownloads=true&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;私人下載連結：https://drive.google.com/drive/folders/1qLZ8OuEgfxIdVaoabTj9Q3N25rPTyo80?usp=sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3. Tanzu CLI&lt;span class="hx:absolute hx:-mt-20" id="23-tanzu-cli"&gt;&lt;/span&gt;
&lt;a href="#23-tanzu-cli" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;1.5.3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名:
&lt;ul&gt;
&lt;li&gt;VMware Tanzu CLI for Linux:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tanzu-cli-linux-amd64.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VMware Tanzu CLI for Windows:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tanzu-cli-windows-amd64.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VMware Tanzu CLI for Mac ARM64:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tanzu-cli-darwin-arm64.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;官方下點連結：https://support.broadcom.com/group/ecx/productfiles?subFamily=VMware%20Tanzu%20CLI&amp;amp;displayGroup=VMware%20Tanzu%20CLI&amp;amp;release=1.5.3&amp;amp;os=&amp;amp;servicePk=527720&amp;amp;language=EN&amp;amp;freeDownloads=true&lt;/li&gt;
&lt;li&gt;私人下載連結：https://drive.google.com/drive/folders/11naRiUvQ59GTIaV-EGgO-s-m3aDNPWqR?usp=drive_link&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4. Carvel Tools&lt;span class="hx:absolute hx:-mt-20" id="24-carvel-tools"&gt;&lt;/span&gt;
&lt;a href="#24-carvel-tools" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;N/A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Linux or Mac 安裝指令：
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl -L https://carvel.dev/install.sh | bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;官方下點連結：https://support.broadcom.com/group/ecx/productfiles?subFamily=VMware%20Tanzu%20Kubernetes%20Grid&amp;amp;displayGroup=VMware%20Tanzu%20Kubernetes%20Grid&amp;amp;release=2.5.4&amp;amp;os=&amp;amp;servicePk=&amp;amp;language=EN&lt;/li&gt;
&lt;li&gt;開源 Github 連結 : &lt;a
href="https://github.com/carvel-dev/carvel"target="_blank" rel="noopener"&gt;https://github.com/carvel-dev/carvel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5. Tanzu Plugin&lt;span class="hx:absolute hx:-mt-20" id="25-tanzu-plugin"&gt;&lt;/span&gt;
&lt;a href="#25-tanzu-plugin" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;vmware-vsphere/default:8.0.3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;tanzu-plugin-vsphere-8-0-3.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 Tanzu CLI 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令：
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;tanzu plugin download-bundle --group vmware-vsphere/default:v8.0.3 --to-tar tanzu-plugin-vsphere-8-0-3.tar
tanzu plugin upload-bundle --tar tanzu-plugin-vsphere-8-0-3.tar --to-repo ${HARBOR}/vks/tanzu-plugin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6. VKS Packages&lt;span class="hx:absolute hx:-mt-20" id="26-vks-packages"&gt;&lt;/span&gt;
&lt;a href="#26-vks-packages" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;檔名：&lt;code&gt;vks-standard-packages-v2025-6-17.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -b projects.packages.broadcom.com/vsphere/supervisor/packages/2025.6.17/vks-standard-packages:v2025.6.17 --to-tar vks-standard-packages-v2025-6-17.tar
imgpkg copy --tar vks-standard-packages-v2025-6-17.tar --to-repo ${HARBOR}/vks/vks-standard-packages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7. vSphere Kuebrentes Service Image&lt;span class="hx:absolute hx:-mt-20" id="27-vsphere-kuebrentes-service-image"&gt;&lt;/span&gt;
&lt;a href="#27-vsphere-kuebrentes-service-image" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;3.4.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;tkg-service-3-4-0.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -b projects.packages.broadcom.com/vsphere/iaas/tkg-service/3.4.0/tkg-service:3.4.0 --to-tar tkg-service-3-4-0.tar
imgpkg copy --tar vks-standard-packages-v2025-6-17.tar --to-repo ${HARBOR}/vks/tkg-service&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.8. netshoot&lt;span class="hx:absolute hx:-mt-20" id="28-netshoot"&gt;&lt;/span&gt;
&lt;a href="#28-netshoot" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;N/A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;netshoot.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -i nicolaka/netshoot --to-tar netshoot.tar
imgpkg copy --tar netshoot.tar--to-repo ${HARBOR}/library/netshoot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.9. nginx&lt;span class="hx:absolute hx:-mt-20" id="29-nginx"&gt;&lt;/span&gt;
&lt;a href="#29-nginx" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;N/A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;nginx.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -i nginx --to-tar nginx.tar
imgpkg copy --tar nginx.tar--to-repo ${HARBOR}/library/nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.10. loginsight-fluentd&lt;span class="hx:absolute hx:-mt-20" id="210-loginsight-fluentd"&gt;&lt;/span&gt;
&lt;a href="#210-loginsight-fluentd" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;1.4.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;fluentd-1-4-2.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -i projects.registry.vmware.com/vrealize_loginsight/fluentd:1.4.2--to-tar fluentd-1-4-2.tar
imgpkg copy --tar nginx.tar--to-repo ${HARBOR}/vks/loginsight-fluentd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.11. avi-api-proxy&lt;span class="hx:absolute hx:-mt-20" id="211-avi-api-proxy"&gt;&lt;/span&gt;
&lt;a href="#211-avi-api-proxy" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;N/A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;avi-api-proxy.tar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;需透過 imgpkg cli 安裝
&lt;ul&gt;
&lt;li&gt;安裝指令
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;imgpkg copy -i avinetworks/avi-api-proxy --to-tar avi-api-proxy.tar
imgpkg copy --tar nginx.tar--to-repo ${HARBOR}/vks/avi-api-proxy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.12. KR Template&lt;span class="hx:absolute hx:-mt-20" id="212-kr-template"&gt;&lt;/span&gt;
&lt;a href="#212-kr-template" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;v1.33&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;photon-ova.mf&lt;/code&gt;, &lt;code&gt;photon-ova.ovf&lt;/code&gt;, &lt;code&gt;photon-ova-disk1.vmdk&lt;/code&gt;, &lt;code&gt;photon-ova.cert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安裝指令：
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl https://wp-content.vmware.com/v2/latest/ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.mf -o ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.mf
curl https://wp-content.vmware.com/v2/latest/ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.ovf -o ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.ovf
curl https://wp-content.vmware.com/v2/latest/ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova-disk1.vmdk -o ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova-disk1.vmdk
curl https://wp-content.vmware.com/v2/latest/ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.cert -o ob-24790750-photon-5-amd64-v1.33.1---vmware.1-fips-vkr.2/photon-ova.cert&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.13. GOVC&lt;span class="hx:absolute hx:-mt-20" id="213-govc"&gt;&lt;/span&gt;
&lt;a href="#213-govc" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;0.51.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;govc_Windows_x86_64.zip&lt;/code&gt;, &lt;code&gt;govc_Windows_x86_64.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安裝指令：
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl https://github.com/vmware/govmomi/releases/download/v0.51.0/govc_Linux_x86_64.tar.gz -o govc_Linux_x86_64.tar.gz
curl https://github.com/vmware/govmomi/releases/download/v0.51.0/govc_Windows_x86_64.zip -o govc_Windows_x86_64.zip&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.14. YQ&lt;span class="hx:absolute hx:-mt-20" id="214-yq"&gt;&lt;/span&gt;
&lt;a href="#214-yq" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;版本: &lt;code&gt;4.47.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;檔名: &lt;code&gt;yq_linux_amd64.tar.gz&lt;/code&gt;, &lt;code&gt;yq_windows_amd64.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安裝指令：
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl https://github.com/mikefarah/yq/releases/download/v4.47.1/yq_linux_amd64.tar.gz
curl https://github.com/mikefarah/yq/releases/download/v4.47.1/yq_windows_amd64.zip&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>黃金太空人</title><link>https://blog.kubeantony.com/archive/misc/%E9%BB%83%E9%87%91%E5%A4%AA%E7%A9%BA%E4%BA%BA/</link><pubDate>Fri, 05 Sep 2025 10:08:20 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E9%BB%83%E9%87%91%E5%A4%AA%E7%A9%BA%E4%BA%BA/</guid><description>
&lt;p&gt;Prometheus
&lt;a
href="https://github.com/arthur-ehrle/Prometheus-PCA-course"target="_blank" rel="noopener"&gt;https://github.com/arthur-ehrle/Prometheus-PCA-course&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Istio&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://training.linuxfoundation.org/istio-certified-associate-ica-program-changes/#"target="_blank" rel="noopener"&gt;https://training.linuxfoundation.org/istio-certified-associate-ica-program-changes/#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://istio.io/v1.26/docs/"target="_blank" rel="noopener"&gt;https://istio.io/v1.26/docs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cilium
&lt;a
href="https://github.com/isovalent/CCA-Study-Guide"target="_blank" rel="noopener"&gt;https://github.com/isovalent/CCA-Study-Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Argo Project
&lt;a
href="https://paulyu.dev/article/capa-study-guide/"target="_blank" rel="noopener"&gt;https://paulyu.dev/article/capa-study-guide/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitOps
&lt;a
href="https://github.com/otkd/CGOA-Study-Guide"target="_blank" rel="noopener"&gt;https://github.com/otkd/CGOA-Study-Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Backstage&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://backstage.io/docs/getting-started/"target="_blank" rel="noopener"&gt;https://backstage.io/docs/getting-started/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://engineering.atspotify.com/2025/03/certified-backstage-associate-exam-tips"target="_blank" rel="noopener"&gt;https://engineering.atspotify.com/2025/03/certified-backstage-associate-exam-tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://ravikirans.com/cba-certified-backstage-associate-study-guide/"target="_blank" rel="noopener"&gt;https://ravikirans.com/cba-certified-backstage-associate-study-guide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://trainingportal.linuxfoundation.org/courses/introduction-to-backstage-developer-portals-made-easy-lfs142"target="_blank" rel="noopener"&gt;https://trainingportal.linuxfoundation.org/courses/introduction-to-backstage-developer-portals-made-easy-lfs142&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kyverno
&lt;a
href="https://kyverno.io/docs/introduction/quick-start/"target="_blank" rel="noopener"&gt;https://kyverno.io/docs/introduction/quick-start/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Linux
&lt;a
href="https://killer.sh/lfcs"target="_blank" rel="noopener"&gt;https://killer.sh/lfcs&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;大魔王&lt;span class="hx:absolute hx:-mt-20" id="大魔王"&gt;&lt;/span&gt;
&lt;a href="#%e5%a4%a7%e9%ad%94%e7%8e%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;OpenTelemetry&lt;span class="hx:absolute hx:-mt-20" id="opentelemetry"&gt;&lt;/span&gt;
&lt;a href="#opentelemetry" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Code-based, Zero-code 要背
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/concepts/instrumentation/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/concepts/instrumentation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API, SDK 定義要看
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/concepts/components/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/concepts/components/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;架構圖要熟
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/collector/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/collector/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;必考
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/concepts/context-propagation/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/concepts/context-propagation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenTelemetry Protocol (OTLP) 好像有兩題
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/specs/otel/protocol/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/specs/otel/protocol/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第一張圖要看一下 receivers, processors, exporters 要知道能幹嘛，還會考 connector
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/collector/architecture/"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/collector/architecture/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;考兩題
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/concepts/semantic-conventions"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/concepts/semantic-conventions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;兩個詞 題目會出現
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/concepts/signals/traces/#tracer-provider"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/concepts/signals/traces/#tracer-provider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API 與 SDK 的差別&lt;/li&gt;
&lt;li&gt;Span、Trace、Metrics、Logs 的架構與用途&lt;/li&gt;
&lt;li&gt;Receivers、Processors、Exporters、Connectors 四個 component 的主要用途，還有資料的處理順序&lt;/li&gt;
&lt;li&gt;Extensions 的角色&lt;/li&gt;
&lt;li&gt;Pipeline 最少需要哪些 component (Receivers + Exporters)&lt;/li&gt;
&lt;li&gt;常見 Processor (Batch, Memory Limiter, Schema Transform, etc.) 的用途&lt;/li&gt;
&lt;li&gt;使用 otelcol Debug / Validation 的方法 (otelcol validate &amp;ndash;config)&lt;/li&gt;
&lt;li&gt;Instrumentation 導入程式碼的方式，要修改 code 或是不修改 code 的方式&lt;/li&gt;
&lt;li&gt;SLI -&amp;gt; SLO 的定義方式&lt;/li&gt;
&lt;li&gt;OTLP 預設的資料格式 (Protobuf + JSON 並透過 gRPC 或 HTTP 之類的)&lt;/li&gt;
&lt;li&gt;Telemetry 資料如何處理&lt;/li&gt;
&lt;li&gt;Scaling Collector 的正確方式 (水平擴展 replicas + load balancer)&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exemplars:~:text=An%20exemplar%20is%20a%20recorded%20value%20that%20associates%20OpenTelemetry%20context%20to%20a%20metric%20event%20within%20a%20Metric.%20One%20use%20case%20is%20to%20allow%20users%20to%20link%20Trace%20signals%20w/%20Metrics"target="_blank" rel="noopener"&gt;https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exemplars:~:text=An%20exemplar%20is%20a%20recorded%20value%20that%20associates%20OpenTelemetry%20context%20to%20a%20metric%20event%20within%20a%20Metric.%20One%20use%20case%20is%20to%20allow%20users%20to%20link%20Trace%20signals%20w/%20Metrics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>撰寫 Go CGI 程式</title><link>https://blog.kubeantony.com/archive/misc/%E6%92%B0%E5%AF%AB-go-cgi-%E7%A8%8B%E5%BC%8F/</link><pubDate>Sat, 24 May 2025 16:33:00 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E6%92%B0%E5%AF%AB-go-cgi-%E7%A8%8B%E5%BC%8F/</guid><description>
&lt;h2&gt;實作目標&lt;span class="hx:absolute hx:-mt-20" id="實作目標"&gt;&lt;/span&gt;
&lt;a href="#%e5%af%a6%e4%bd%9c%e7%9b%ae%e6%a8%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;建立一個簡單的 Go 網頁伺服器，能夠提供靜態檔案服務，並透過 CGI（Common Gateway Interface）執行 Bash script。&lt;/p&gt;
&lt;h2&gt;章節&lt;span class="hx:absolute hx:-mt-20" id="章節"&gt;&lt;/span&gt;
&lt;a href="#%e7%ab%a0%e7%af%80" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;第一步：建立專案目錄並進入&lt;span class="hx:absolute hx:-mt-20" id="第一步建立專案目錄並進入"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%bb%ba%e7%ab%8b%e5%b0%88%e6%a1%88%e7%9b%ae%e9%8c%84%e4%b8%a6%e9%80%b2%e5%85%a5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ~/gocgi/&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/gocgi/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir ~/gocgi/&lt;/code&gt;：在使用者的家目錄下建立一個名為 &lt;code&gt;gocgi&lt;/code&gt; 的資料夾。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd ~/gocgi/&lt;/code&gt;：進入剛建立的 &lt;code&gt;gocgi&lt;/code&gt; 資料夾。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;：為專案建立一個獨立的工作目錄，便於管理相關的程式碼和資源。&lt;/p&gt;
&lt;h3&gt;第二步：撰寫 Go 程式碼並儲存為 &lt;code&gt;main.go&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="第二步撰寫-go-程式碼並儲存為-maingo"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e6%92%b0%e5%af%ab-go-%e7%a8%8b%e5%bc%8f%e7%a2%bc%e4%b8%a6%e5%84%b2%e5%ad%98%e7%82%ba-maingo" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;package main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;import (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;net/http&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;net/http/cgi&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;func cgiDB(w http.ResponseWriter, r *http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; handler := cgi.Handler{Path: &amp;#34;./www/cgi/cgidb.sh&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; handler.ServeHTTP(w, r)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;func cgiTBL(w http.ResponseWriter, r *http.Request) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; handler := cgi.Handler{Path: &amp;#34;./www/cgi/cgitbl.sh&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; handler.ServeHTTP(w, r)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;func main() {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; static := http.FileServer(http.Dir(&amp;#34;./www/&amp;#34;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; http.Handle(&amp;#34;/&amp;#34;, static)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; http.HandleFunc(&amp;#34;/db&amp;#34;, cgiDB)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; http.HandleFunc(&amp;#34;/tbl&amp;#34;, cgiTBL)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; http.ListenAndServe(&amp;#34;:8080&amp;#34;, nil)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;}&amp;#39;&lt;/span&gt; &amp;gt; main.go&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;這段指令使用 &lt;code&gt;echo&lt;/code&gt; 將多行的 Go 程式碼寫入 &lt;code&gt;main.go&lt;/code&gt; 檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;程式碼解析&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;package main&lt;/code&gt;：定義此程式屬於 &lt;code&gt;main&lt;/code&gt; 套件，表示這是一個可執行的程式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt;：引入標準庫中的 &lt;code&gt;net/http&lt;/code&gt; 和 &lt;code&gt;net/http/cgi&lt;/code&gt; 套件，用於建立 HTTP 伺服器和處理 CGI。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cgiDB&lt;/code&gt; 和 &lt;code&gt;cgiTBL&lt;/code&gt; 函式：分別處理 &lt;code&gt;/db&lt;/code&gt; 和 &lt;code&gt;/tbl&lt;/code&gt; 路徑的請求，執行對應的 Shell 腳本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; 函式：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http.FileServer&lt;/code&gt;：提供 &lt;code&gt;./www/&lt;/code&gt; 目錄下的靜態檔案服務。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.Handle&lt;/code&gt; 和 &lt;code&gt;http.HandleFunc&lt;/code&gt;：設定路由，將特定的路徑對應到處理函式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.ListenAndServe(&amp;quot;:8080&amp;quot;, nil)&lt;/code&gt;：啟動伺服器，監聽 8080 埠口。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：建立一個基本的網頁伺服器，能夠提供靜態檔案服務，並透過 CGI 執行特定的 Shell 腳本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第三步：初始化 Go 模組&lt;span class="hx:absolute hx:-mt-20" id="第三步初始化-go-模組"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e5%88%9d%e5%a7%8b%e5%8c%96-go-%e6%a8%a1%e7%b5%84" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go mod init gocgi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;go mod init gocgi&lt;/code&gt;：初始化一個名為 &lt;code&gt;gocgi&lt;/code&gt; 的 Go 模組，會在當前目錄下建立一個 &lt;code&gt;go.mod&lt;/code&gt; 檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;：使用 Go Modules 管理專案的相依性，這是 Go 官方推薦的依賴管理方式。&lt;/p&gt;
&lt;h3&gt;第四步：編譯 Go 程式&lt;span class="hx:absolute hx:-mt-20" id="第四步編譯-go-程式"&gt;&lt;/span&gt;
&lt;a href="#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e7%b7%a8%e8%ad%af-go-%e7%a8%8b%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux &lt;span class="nv"&gt;GOARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 go build -o main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CGO_ENABLED=0&lt;/code&gt;：禁用 CGO，確保編譯出的二進位檔案是純 Go 程式，無需依賴 C 語言的函式庫。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOOS=linux&lt;/code&gt;：設定目標作業系統為 Linux。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOARCH=amd64&lt;/code&gt;：設定目標架構為 64 位元。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go build -o main&lt;/code&gt;：編譯 &lt;code&gt;main.go&lt;/code&gt;，輸出為名為 &lt;code&gt;main&lt;/code&gt; 的可執行檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;總結&lt;span class="hx:absolute hx:-mt-20" id="總結"&gt;&lt;/span&gt;
&lt;a href="#%e7%b8%bd%e7%b5%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;整體流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立並進入專案目錄。&lt;/li&gt;
&lt;li&gt;撰寫並儲存 Go 程式碼，建立一個簡單的網頁伺服器。&lt;/li&gt;
&lt;li&gt;初始化 Go 模組，管理相依性。&lt;/li&gt;
&lt;li&gt;編譯程式，生成適用於 Linux 64 位元系統的可執行檔案。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;程式介紹&lt;span class="hx:absolute hx:-mt-20" id="程式介紹"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%bc%8f%e4%bb%8b%e7%b4%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;net/http&amp;#34;
&amp;#34;net/http/cgi&amp;#34;
)
func cgiDB(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;./www/cgi/cgidb.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func cgiTBL(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;./www/cgi/cgitbl.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func main() {
static := http.FileServer(http.Dir(&amp;#34;./www/&amp;#34;))
http.Handle(&amp;#34;/&amp;#34;,static)
http.HandleFunc(&amp;#34;/db&amp;#34;, cgiDB)
http.HandleFunc(&amp;#34;/tbl&amp;#34;, cgiTBL)
http.ListenAndServe(&amp;#34;:8080&amp;#34;, nil)
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;這段 Go 程式碼建立了一個簡單的 HTTP 伺服器，具備以下功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提供靜態檔案服務&lt;/strong&gt;：透過 &lt;code&gt;http.FileServer&lt;/code&gt;，伺服器會從 &lt;code&gt;./www/&lt;/code&gt; 目錄提供靜態檔案，如 HTML、CSS、JavaScript 等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;處理 CGI 請求&lt;/strong&gt;：對於特定路徑（&lt;code&gt;/db&lt;/code&gt; 和 &lt;code&gt;/tbl&lt;/code&gt;），伺服器會執行對應的 CGI 腳本（&lt;code&gt;cgidb.sh&lt;/code&gt; 和 &lt;code&gt;cgitbl.sh&lt;/code&gt;），並將其輸出作為 HTTP 回應返回給用戶端。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;📁 靜態檔案服務&lt;span class="hx:absolute hx:-mt-20" id="-靜態檔案服務"&gt;&lt;/span&gt;
&lt;a href="#-%e9%9d%9c%e6%85%8b%e6%aa%94%e6%a1%88%e6%9c%8d%e5%8b%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./www/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;static&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http.FileServer&lt;/code&gt; 建立一個處理器，用於提供指定目錄中的靜態檔案。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.Dir(&amp;quot;./www/&amp;quot;)&lt;/code&gt; 指定了靜態檔案的根目錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.Handle(&amp;quot;/&amp;quot;, static)&lt;/code&gt; 將根路徑 &lt;code&gt;/&lt;/code&gt; 的請求導向這個處理器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：當用戶端請求 &lt;code&gt;http://localhost:8080/index.html&lt;/code&gt; 時，伺服器會返回 &lt;code&gt;./www/index.html&lt;/code&gt; 檔案的內容。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;⚙️ CGI 處理器&lt;span class="hx:absolute hx:-mt-20" id="-cgi-處理器"&gt;&lt;/span&gt;
&lt;a href="#-cgi-%e8%99%95%e7%90%86%e5%99%a8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cgiDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cgi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./www/cgi/cgidb.sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cgiTBL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cgi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./www/cgi/cgitbl.sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;這兩個函式分別處理 &lt;code&gt;/db&lt;/code&gt; 和 &lt;code&gt;/tbl&lt;/code&gt; 路徑的請求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cgi.Handler&lt;/code&gt; 是 Go 標準庫 &lt;code&gt;net/http/cgi&lt;/code&gt; 提供的類型，用於執行 CGI 腳本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Path&lt;/code&gt; 指定了要執行的 CGI 腳本路徑。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServeHTTP&lt;/code&gt; 方法會執行指定的 CGI 腳本，並將其輸出作為 HTTP 回應返回給用戶端。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：當用戶端請求 &lt;code&gt;http://localhost:8080/db&lt;/code&gt; 時，伺服器會執行 &lt;code&gt;./www/cgi/cgidb.sh&lt;/code&gt; 腳本，並將其輸出返回給用戶端。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;🚀 主函式&lt;span class="hx:absolute hx:-mt-20" id="-主函式"&gt;&lt;/span&gt;
&lt;a href="#-%e4%b8%bb%e5%87%bd%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./www/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;static&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/db&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cgiDB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/tbl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cgiTBL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;設定靜態檔案服務處理器。&lt;/li&gt;
&lt;li&gt;註冊 &lt;code&gt;/db&lt;/code&gt; 和 &lt;code&gt;/tbl&lt;/code&gt; 路徑的處理函式。&lt;/li&gt;
&lt;li&gt;啟動 HTTP 伺服器，監聽本地端口 8080。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;📌 總結&lt;span class="hx:absolute hx:-mt-20" id="-總結"&gt;&lt;/span&gt;
&lt;a href="#-%e7%b8%bd%e7%b5%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;這段 Go 程式碼建立了一個基本的 HTTP 伺服器，能夠提供靜態檔案服務，並透過 CGI 腳本處理特定路徑的請求。這種架構適合用於簡單的網站或內部工具，但在實際部署時，仍需考慮安全性和錯誤處理等因素。&lt;/p&gt;</description></item><item><title>FETC</title><link>https://blog.kubeantony.com/archive/misc/fetc/</link><pubDate>Sun, 04 May 2025 08:44:24 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/fetc/</guid><description>
&lt;h2&gt;postgresql&lt;span class="hx:absolute hx:-mt-20" id="postgresql"&gt;&lt;/span&gt;
&lt;a href="#postgresql" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
$ kubectl patch storageclass local-path -p &amp;#39;{&amp;#34;metadata&amp;#34;: {&amp;#34;annotations&amp;#34;:{&amp;#34;storageclass.kubernetes.io/is-default-class&amp;#34;:&amp;#34;true&amp;#34;}}}&amp;#39;
$ cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-for-pg
labels:
type: local
spec:
capacity:
storage: 4Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: &amp;#34;local-path&amp;#34;
hostPath:
path: /home/bigred/pv
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- localhost.localdomain
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pg-pvc
namespace: psql-system
spec:
storageClassName: &amp;#34;local-path&amp;#34;
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
$ kubectl apply -f pv.yaml
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ kubectl create ns psql-system
$ helm template --namespace psql-system dev-pg bitnami/postgresql --version 11.9.13 --set primary.persistence.existingClaim=pg-pvc,auth.postgresPassword=pgpass,volumePermissions.enabled=true,primary.service.type=&amp;#39;NodePort&amp;#39;,image.tag=&amp;#39;14.8.0&amp;#39; &amp;gt; ~/workload/postgresql/postgresql.yaml
$ kubectl apply -f ~/workload/postgresql/postgresql.yaml
kubectl run -n psql-system dev-pg-postgresql-client --rm --tty -i --restart=&amp;#39;Never&amp;#39; --namespace psql-system --image docker.io/bitnami/postgresql:14.8.0 --env=&amp;#34;PGPASSWORD=$POSTGRES_PASSWORD&amp;#34; \
--command -- psql --host dev-pg-postgresql -U postgres -d postgres -p 5432&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Minio&lt;span class="hx:absolute hx:-mt-20" id="minio"&gt;&lt;/span&gt;
&lt;a href="#minio" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
kubectl create ns minio-system
mkdir -p ~/workload/minio
helm template minio \
--namespace=minio-system \
--set auth.rootUser=admin \
--set auth.rootPassword=admin123 \
--set image.registry=docker.io \
--set image.repository=bitnami/minio \
--set image.tag=2022.3.14-debian-10-r0 \
--set networkPolicy.enabled=false \
--set persistence.storageClass=local-path \
--set persistence.size=100Gi \
--set service.type=NodePort \
--set containerSecurityContext.enabled=false \
oci://registry-1.docker.io/bitnamicharts/minio &amp;gt; ~/workload/minio/minio.yaml
kubectl apply -f ~/workload/minio/minio.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>資訊人員的挑戰 (悲愁)</title><link>https://blog.kubeantony.com/archive/misc/%E8%B3%87%E8%A8%8A%E4%BA%BA%E5%93%A1%E7%9A%84%E6%8C%91%E6%88%B0-%E6%82%B2%E6%84%81/</link><pubDate>Sat, 26 Apr 2025 02:26:08 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E8%B3%87%E8%A8%8A%E4%BA%BA%E5%93%A1%E7%9A%84%E6%8C%91%E6%88%B0-%E6%82%B2%E6%84%81/</guid><description>
&lt;h2&gt;挑戰 1 : 應用系統安裝與設定 (人爲疏乎, 強勢主觀, &amp;hellip;..)&lt;span class="hx:absolute hx:-mt-20" id="挑戰-1--應用系統安裝與設定-人爲疏乎-強勢主觀-"&gt;&lt;/span&gt;
&lt;a href="#%e6%8c%91%e6%88%b0-1--%e6%87%89%e7%94%a8%e7%b3%bb%e7%b5%b1%e5%ae%89%e8%a3%9d%e8%88%87%e8%a8%ad%e5%ae%9a-%e4%ba%ba%e7%88%b2%e7%96%8f%e4%b9%8e-%e5%bc%b7%e5%8b%a2%e4%b8%bb%e8%a7%80-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;應用系統在安裝或設定的文件內容不完整，即使文件步驟撰寫相當完整流暢，真正執行的人可能會因為各種原因，也不一定會按照文件寫的內容或要求的順序去執行。&lt;/p&gt;
&lt;h3&gt;如何解決?&lt;span class="hx:absolute hx:-mt-20" id="如何解決"&gt;&lt;/span&gt;
&lt;a href="#%e5%a6%82%e4%bd%95%e8%a7%a3%e6%b1%ba" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;基礎設施&lt;span class="hx:absolute hx:-mt-20" id="基礎設施"&gt;&lt;/span&gt;
&lt;a href="#%e5%9f%ba%e7%a4%8e%e8%a8%ad%e6%96%bd" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用 Infrastructure as code 去做安裝與設定，可降低 Human Error 和節省時間，再搭配 AI 做程式的註解&lt;/p&gt;
&lt;h4&gt;應用系統&lt;span class="hx:absolute hx:-mt-20" id="應用系統"&gt;&lt;/span&gt;
&lt;a href="#%e6%87%89%e7%94%a8%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用 Application Container 技術，因為這項技術裡面有一個叫做 Dockerfile，裡面會記錄你的應用程式是如何封裝好的，另外也可以拿來做交接，並且也可以搭配 AI 作註解&lt;/p&gt;
&lt;h2&gt;挑戰 2 : 弄髒 作業系統 (殘留測試用帳號與設定, 不需存在的 Library, &amp;hellip;)&lt;span class="hx:absolute hx:-mt-20" id="挑戰-2--弄髒-作業系統-殘留測試用帳號與設定-不需存在的-library-"&gt;&lt;/span&gt;
&lt;a href="#%e6%8c%91%e6%88%b0-2--%e5%bc%84%e9%ab%92-%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1-%e6%ae%98%e7%95%99%e6%b8%ac%e8%a9%a6%e7%94%a8%e5%b8%b3%e8%99%9f%e8%88%87%e8%a8%ad%e5%ae%9a-%e4%b8%8d%e9%9c%80%e5%ad%98%e5%9c%a8%e7%9a%84-library-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在建置作業系統時，廠商或企業內部工程師時常會在作業系統中產生不必要的測試帳號或安裝不需存在的套件或 Library，這很容易會有資安疑慮。&lt;/p&gt;
&lt;h3&gt;如何解決?&lt;span class="hx:absolute hx:-mt-20" id="如何解決-1"&gt;&lt;/span&gt;
&lt;a href="#%e5%a6%82%e4%bd%95%e8%a7%a3%e6%b1%ba-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用 Application Container 技術，這項技術有自己的檔案系統，當你的 Application Container 被移除時，在其他新增的測試帳號或臨時安裝的 Packages 或 Library 也會跟著在作業系統上被移除。&lt;/p&gt;
&lt;h2&gt;挑戰 3 : 交接之痛 (人跑了, 沒有交接資訊, 交接資訊不易閱讀, &amp;hellip;)&lt;span class="hx:absolute hx:-mt-20" id="挑戰-3--交接之痛-人跑了-沒有交接資訊-交接資訊不易閱讀-"&gt;&lt;/span&gt;
&lt;a href="#%e6%8c%91%e6%88%b0-3--%e4%ba%a4%e6%8e%a5%e4%b9%8b%e7%97%9b-%e4%ba%ba%e8%b7%91%e4%ba%86-%e6%b2%92%e6%9c%89%e4%ba%a4%e6%8e%a5%e8%b3%87%e8%a8%8a-%e4%ba%a4%e6%8e%a5%e8%b3%87%e8%a8%8a%e4%b8%8d%e6%98%93%e9%96%b1%e8%ae%80-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在企業內部的員工離職並沒有留下交接資訊人就跑了，或是交接的文件不完整，不易閱讀，即使私下聯絡道前員工，人家對你的訊息也不讀不回。&lt;/p&gt;
&lt;h3&gt;如何解決?&lt;span class="hx:absolute hx:-mt-20" id="如何解決-2"&gt;&lt;/span&gt;
&lt;a href="#%e5%a6%82%e4%bd%95%e8%a7%a3%e6%b1%ba-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;採用 Kubernetes 技術，在 K8s 中以 Pod 的方式去執行的 Application，可以做到反向工程，可以把應用程式的設定檔 (YAML File) 匯出來，也可以將電腦規格及相關設定資訊匯出來。&lt;/p&gt;
&lt;h2&gt;挑戰 4 : 歷史除錯記錄遺失&lt;span class="hx:absolute hx:-mt-20" id="挑戰-4--歷史除錯記錄遺失"&gt;&lt;/span&gt;
&lt;a href="#%e6%8c%91%e6%88%b0-4--%e6%ad%b7%e5%8f%b2%e9%99%a4%e9%8c%af%e8%a8%98%e9%8c%84%e9%81%ba%e5%a4%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;企業在每次系統發生問題時，並未將問題發生的原因、狀況和如何解決的資訊紀錄下來。&lt;/p&gt;
&lt;h3&gt;如何解決?&lt;span class="hx:absolute hx:-mt-20" id="如何解決-3"&gt;&lt;/span&gt;
&lt;a href="#%e5%a6%82%e4%bd%95%e8%a7%a3%e6%b1%ba-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;搭配 AI 來做，一定要把 &amp;ldquo;產生&amp;rdquo; 這個動作去執行，期望可透過 AI 來有效的去維運，讓 AI 來回答與判斷系統發生了什麼情況，並提出解決辦法&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;2013 年 Docker 改寫 IT 歷史&lt;/h1&gt;&lt;p&gt;叫做 Application Container，他到處去幫客戶裝應用系統，裝到實在受不了，每位客戶的環境都不一樣，於是這家公司創造了 Application Container 技術，主要的目的是&lt;strong&gt;在不影響客戶既有環境的情況下，將應用系統快速部署到客戶端。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Containerization&lt;span class="hx:absolute hx:-mt-20" id="containerization"&gt;&lt;/span&gt;
&lt;a href="#containerization" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Containerization 的&lt;strong&gt;最高戰略目標 : 是要能讓企業的任何應用程式 (app) 輕鬆地在任意一台電腦上執行，並且不會影響或污染該台電腦的既有環境，也就是 &amp;ldquo;Running Any App Anywhere&amp;rdquo;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/B1e5BTekgl.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;那麼，要如何實現這個目標呢？&lt;span class="hx:absolute hx:-mt-20" id="那麼要如何實現這個目標呢"&gt;&lt;/span&gt;
&lt;a href="#%e9%82%a3%e9%ba%bc%e8%a6%81%e5%a6%82%e4%bd%95%e5%af%a6%e7%8f%be%e9%80%99%e5%80%8b%e7%9b%ae%e6%a8%99%e5%91%a2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Application Container - 軟體貨櫃&lt;span class="hx:absolute hx:-mt-20" id="application-container---軟體貨櫃"&gt;&lt;/span&gt;
&lt;a href="#application-container---%e8%bb%9f%e9%ab%94%e8%b2%a8%e6%ab%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;答案是透過 Application Container 的技術。Application Container 可以被看作是一種電腦，許多人可能對它感到陌生，這是因為真正理解其運作原理的人並不多。既然稱之為一台「電腦」，它就必須具備一般電腦所需的主機名稱、網路環境、檔案系統以及硬體資源管理等能力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主機名稱所使用的技術是 &lt;code&gt;Linux Namespace&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;檔案系統所使用的技術則是 &lt;code&gt;chroot&lt;/code&gt; 結合 &lt;code&gt;overlay2&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;網路環境所使用的技術則是 &lt;code&gt;Virtual Bridge&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;硬體資源限制與管理 (CPU, Memory, Network) 所使用的技術則是 &lt;code&gt;CGroup&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Application Container 與傳統電腦最大的差異，在於它會共用 Host 主機作業系統的 Kernel，以共享電腦內 CPU、記憶體與網路等硬體資源，因此能有效地執行應用程式並實現隔離。&lt;/p&gt;
&lt;h3&gt;那麼，什麼是 OCI 呢？&lt;span class="hx:absolute hx:-mt-20" id="那麼什麼是-oci-呢"&gt;&lt;/span&gt;
&lt;a href="#%e9%82%a3%e9%ba%bc%e4%bb%80%e9%ba%bc%e6%98%af-oci-%e5%91%a2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;OCI (Open Container Initiative) 組織針對 Application Container 制定了三個重要標準，主要目標即是實現「&lt;strong&gt;任何應用程式都能在任何地方執行&lt;/strong&gt;」(Running any app anywhere)。&lt;/p&gt;
&lt;p&gt;要做出 Application Container 的技術很難，但它帶來的好處很多，因此 &lt;strong&gt;OCI 組織便透過制定這三個標準，讓更多使用者能更快速、更簡單地實現與使用 Application Container。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OCI-image&lt;/strong&gt; 定義了一種標準化的格式，用來儲存應用程式及其相關的依賴檔案。這種標準格式主要由一個設定檔 (config) 和多個目錄區組成。設定檔 (config) 中包含了 Container 執行時所需的設定，例如預設執行的命令、環境變數等等；目錄區則包含應用程式與所需的所有相依檔案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCI-distribution&lt;/strong&gt; 制定了應用程式可在任意環境間自由移動的標準流程。具體作法是將應用程式及其相依檔案依照 OCI-image 標準打包成 image，再依據 OCI-distribution 標準規定的流程，將這個 image 上傳到 image registry。其他使用者便能透過相同的標準流程，將該 image 從 image registry 下載到本地電腦中使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCI-runtime&lt;/strong&gt; 負責實際利用 Linux Namespace、Virtual Bridge、overlay2、chroot、CGroup 等技術來做出 Application Container。因此，根據 OCI-runtime 標準，目前已有許多程式，如 runc、crun、runsc 等，透過這些程式使用者便能輕鬆地建立與執行 Application Container。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>離線安裝 RedHat Satelite Server</title><link>https://blog.kubeantony.com/archive/misc/%E9%9B%A2%E7%B7%9A%E5%AE%89%E8%A3%9D-redhat-satelite-server/</link><pubDate>Mon, 23 Sep 2024 08:37:56 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E9%9B%A2%E7%B7%9A%E5%AE%89%E8%A3%9D-redhat-satelite-server/</guid><description>
&lt;style&gt;
.indent-title-1{
margin-left: 1em;
}
.indent-title-2{
margin-left: 2em;
}
.indent-title-3{
margin-left: 3em;
}
&lt;/style&gt;
&lt;h2&gt;Chapter 1. 準備安裝環境&lt;span class="hx:absolute hx:-mt-20" id="chapter-1-準備安裝環境"&gt;&lt;/span&gt;
&lt;a href="#chapter-1-%e6%ba%96%e5%82%99%e5%ae%89%e8%a3%9d%e7%92%b0%e5%a2%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1.1. 系統要求&lt;span class="hx:absolute hx:-mt-20" id="11-系統要求"&gt;&lt;/span&gt;
&lt;a href="#11-%e7%b3%bb%e7%b5%b1%e8%a6%81%e6%b1%82" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;x86_64 架構&lt;/li&gt;
&lt;li&gt;最新版本的 Red Hat Enterprise Linux 8&lt;/li&gt;
&lt;li&gt;至少 4 Core 2.0 GHz CPU&lt;/li&gt;
&lt;li&gt;Satellite Server 至少需要 20 GB RAM 才能運作。 此外，還建議使用至少 4 GB RAM 的 swap space 。 在 RAM 小於最小值的情況下執行的 Satellite 可能無法正常運作。&lt;/li&gt;
&lt;li&gt;唯一的主機名稱，可包含小寫字母、數字、點 (.) 和連字線 (-)&lt;/li&gt;
&lt;li&gt;目前的 Red Hat Satellite 訂閱&lt;/li&gt;
&lt;li&gt;管理使用者 (root) 存取權限&lt;/li&gt;
&lt;li&gt;使用完全定義的網域名稱 (FQDN) 進行完全正向和反向 DNS 解析&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2. 儲存要求&lt;span class="hx:absolute hx:-mt-20" id="12-儲存要求"&gt;&lt;/span&gt;
&lt;a href="#12-%e5%84%b2%e5%ad%98%e8%a6%81%e6%b1%82" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/H17MtLcTA.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;1.3. 支援的作業系統&lt;span class="hx:absolute hx:-mt-20" id="13-支援的作業系統"&gt;&lt;/span&gt;
&lt;a href="#13-%e6%94%af%e6%8f%b4%e7%9a%84%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/S1U8YI9pA.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;Chapter 2. 開始安裝 Satellite Server&lt;span class="hx:absolute hx:-mt-20" id="chapter-2-開始安裝-satellite-server"&gt;&lt;/span&gt;
&lt;a href="#chapter-2-%e9%96%8b%e5%a7%8b%e5%ae%89%e8%a3%9d-satellite-server" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;2.1. 下載 binary DVD images&lt;span class="hx:absolute hx:-mt-20" id="21-下載-binary-dvd-images"&gt;&lt;/span&gt;
&lt;a href="#21-%e4%b8%8b%e8%bc%89-binary-dvd-images" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;連到 &lt;a
href="https://access.redhat.com/"target="_blank" rel="noopener"&gt;Red Hat Customer Portal&lt;/a&gt; 並登入.&lt;/li&gt;
&lt;li&gt;點選 &lt;strong&gt;DOWNLOADS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;選擇 &lt;strong&gt;Red Hat Enterprise Linux&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;確保使用正確的產品和版本。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Product Variant&lt;/strong&gt; 設定為 &lt;strong&gt;Red Hat Enterprise Linux for x86_64&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt; is set to the latest minor version of the product you plan to use as the base operating system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture&lt;/strong&gt; is set to the 64 bit version.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Product Software&lt;/strong&gt; tab 上, 下載 Binary DVD image for the latest &lt;strong&gt;Red Hat Enterprise Linux for x86_64&lt;/strong&gt; version.&lt;/li&gt;
&lt;li&gt;再次點選 &lt;strong&gt;DOWNLOADS&lt;/strong&gt; 並選擇 &lt;strong&gt;Red Hat Satellite&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;確保使用正確的產品和版本。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Product Variant&lt;/strong&gt; 設定為 &lt;strong&gt;Red Hat Satellite&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt; is set to the latest minor version of the product you plan to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Product Software&lt;/strong&gt; tab 上, 下載最新版 Red Hat Satellite 的 Binary DVD image.&lt;/li&gt;
&lt;li&gt;將 RHEL 8 的 ISO 檔複製到 Satellite OS 上的 &lt;code&gt;/var/tmp&lt;/code&gt; 或其他可存取的儲存裝置。
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ scp localfile username@hostname:remotefile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2. 設定 RHEL 8 使用離線的套件儲存庫&lt;span class="hx:absolute hx:-mt-20" id="22-設定-rhel-8-使用離線的套件儲存庫"&gt;&lt;/span&gt;
&lt;a href="#22-%e8%a8%ad%e5%ae%9a-rhel-8-%e4%bd%bf%e7%94%a8%e9%9b%a2%e7%b7%9a%e7%9a%84%e5%a5%97%e4%bb%b6%e5%84%b2%e5%ad%98%e5%ba%ab" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;建立一個目錄，作為與基本作業系統版本對應的 ISO 檔案的 mount point。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir /media/rhel8&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將 Red Hat Enterprise Linux 的 ISO 映像掛載到 mount point。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mount -o loop rhel8-DVD.iso /media/rhel8&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複製 ISO 檔案的儲存庫資料並變更權限，請輸入：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cp /media/rhel8/media.repo /etc/yum.repos.d/rhel8.repo
$ chmod u&amp;#43;w /etc/yum.repos.d/rhel8.repo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;編輯儲存庫資料檔，並新增 &lt;code&gt;baseurl&lt;/code&gt; 指令。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ vim /etc/yum.repos.d/rhel8.repo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;內容如下 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[RHEL8-BaseOS]
name=Red Hat Enterprise Linux BaseOS
mediaid=None
metadata_expire=-1
gpgcheck=0
cost=500
baseurl=file:///media/rhel8/BaseOS/
[RHEL8-AppStream]
name=Red Hat Enterprise Linux Appstream
mediaid=None
metadata_expire=-1
gpgcheck=0
cost=500
baseurl=file:///media/rhel8/AppStream/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;驗證儲存庫是否已設定。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ yum repolist&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立一個目錄，作為 Satellite Server ISO 檔案的 mount point。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir /media/sat6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將 Satellite Server 的 ISO image 掛載到 mount point。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mount -o loop sat6-DVD.iso /media/sat6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.3. 從離線套件儲存庫安裝 Satellite 套件&lt;span class="hx:absolute hx:-mt-20" id="23-從離線套件儲存庫安裝-satellite-套件"&gt;&lt;/span&gt;
&lt;a href="#23-%e5%be%9e%e9%9b%a2%e7%b7%9a%e5%a5%97%e4%bb%b6%e5%84%b2%e5%ad%98%e5%ba%ab%e5%ae%89%e8%a3%9d-satellite-%e5%a5%97%e4%bb%b6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;確保已掛載 Red Hat Enterprise Linux Server 和 Red Hat Satellite 的 ISO image&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ findmnt -t iso9660&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果應跟以下類似 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;TARGET SOURCE FSTYPE OPTIONS
/media/rhel8 /dev/loop0 iso9660 ro,relatime,nojoliet,check=s,map=n,blocksize=2048
/media/sat6 /dev/loop1 iso9660 ro,relatime,nojoliet,check=s,map=n,blocksize=2048&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;匯入 Red Hat GPG 金鑰&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確保基本作業系統是最新的&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ dnf update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;變更當前目錄至掛載 Satellite ISO 的目錄：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cd /media/sat6/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在掛載的目錄中執行安裝腳本：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./install_packages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果如下 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;This script will install the satellite packages on the current machine.
- Ensuring we are in an expected directory.
- Copying installation files.
- Creating Satellite Repository File
- Creating Maintenance Repository File
- Checking to see if Satellite is already installed.
- Importing the gpg key.
Problems in request:
Modular dependency problems with Defaults:
Problem: module satellite:el8:61520240903125913:30aa3ae0.x86_64 from Satellite-local requires module(postgresql:12), but none of the providers can be installed
- module postgresql:10:8090020240213200157:a75119d5.x86_64 from RHEL8-AppStream conflicts with module(postgresql:12) provided by postgresql:12:8090020240209130909:a75119d5.x86_64 from RHEL8-AppStream
- module postgresql:12:8090020240209130909:a75119d5.x86_64 from RHEL8-AppStream conflicts with module(postgresql:10) provided by postgresql:10:8090020240213200157:a75119d5.x86_64 from RHEL8-AppStream
- conflicting requests
- Installation repository will remain configured for future package installs.
- Installation media can now be safely unmounted.
Install is complete. Please run satellite-installer --scenario satellite&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;如果您已成功安裝 Satellite 套件，則會顯示下列訊息：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Install is complete. Please run satellite-installer --scenario satellite&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="indent-title-1"&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;p&gt;The script contains a command that enables the &lt;code&gt;satellite:el8&lt;/code&gt; module. Enablement of the module &lt;code&gt;satellite:el8&lt;/code&gt; warns about a conflict with &lt;code&gt;postgresql:10&lt;/code&gt; and &lt;code&gt;ruby:2.5&lt;/code&gt; as these modules are set to the default module versions on Red Hat Enterprise Linux 8. The module &lt;code&gt;satellite:el8&lt;/code&gt; has a dependency for the modules &lt;code&gt;postgresql:12&lt;/code&gt; and &lt;code&gt;ruby:2.7&lt;/code&gt; that will be enabled with the &lt;code&gt;satellite:el8&lt;/code&gt; module. These warnings do not cause installation process failure, hence can be ignored safely.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;2.4. Synchronizing the system clock with chronyd&lt;span class="hx:absolute hx:-mt-20" id="24-synchronizing-the-system-clock-with-chronyd"&gt;&lt;/span&gt;
&lt;a href="#24-synchronizing-the-system-clock-with-chronyd" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;為了將時間漂移的影響降至最低，您必須將要安裝 Satellite Server 的基本作業系統上的系統時鐘與網路時間協定 (NTP) 伺服器同步化。 如果基本作業系統時鐘設定不正確，證書驗證可能會失敗。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝 chrony 套件
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ dnf install chrony&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Start and enable the &lt;code&gt;chronyd&lt;/code&gt; service:
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ systemctl enable --now chronyd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.5. 設定 Satellite Server&lt;span class="hx:absolute hx:-mt-20" id="25-設定-satellite-server"&gt;&lt;/span&gt;
&lt;a href="#25-%e8%a8%ad%e5%ae%9a-satellite-server" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;輸入下列命令，並加上您要使用的其他選項：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ satellite-installer --scenario satellite \
--foreman-initial-organization &amp;#34;My_Organization&amp;#34; \
--foreman-initial-location &amp;#34;My_Location&amp;#34; \
--foreman-initial-admin-username admin_user_name \
--foreman-initial-admin-password admin_password&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="indent-title-2"&gt;
&lt;p&gt;執行成功的結果如下&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;2024-09-23 14:28:24 [NOTICE] [root] Loading installer configuration. This will take some time.
2024-09-23 14:28:30 [NOTICE] [root] Running installer with log based terminal output at level NOTICE.
2024-09-23 14:28:30 [NOTICE] [root] Use -l to set the terminal output log level to ERROR, WARN, NOTICE, INFO, or DEBUG. See --full-help for definitions.
2024-09-23 14:31:01 [NOTICE] [configure] Starting system configuration.
2024-09-23 14:31:32 [NOTICE] [configure] 250 configuration steps out of 1613 steps complete.
2024-09-23 14:32:04 [NOTICE] [configure] 500 configuration steps out of 1614 steps complete.
2024-09-23 14:32:18 [NOTICE] [configure] 750 configuration steps out of 1616 steps complete.
2024-09-23 14:33:16 [NOTICE] [configure] 1000 configuration steps out of 1641 steps complete.
2024-09-23 14:33:38 [NOTICE] [configure] 1250 configuration steps out of 1643 steps complete.
2024-09-23 14:38:39 [NOTICE] [configure] 1500 configuration steps out of 1643 steps complete.
2024-09-23 14:43:01 [NOTICE] [configure] System configuration has finished.
Success!
* Satellite is running at https://satellite.example.com
Initial credentials are admin / rancher
* To install an additional Capsule on separate machine continue by running:
capsule-certs-generate --foreman-proxy-fqdn &amp;#34;$CAPSULE&amp;#34; --certs-tar &amp;#34;/root/$CAPSULE-certs.tar&amp;#34;
* Capsule is running at https://satellite.example.com:9090
The full log is at /var/log/foreman-installer/satellite.log
Package versions are being locked.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;The script displays its progress and writes logs to &lt;code&gt;/var/log/foreman-installer/satellite.log&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Unmount the ISO images:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ umount /media/sat6
$ umount /media/rhel8&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.6. Disabling subscription connection&lt;span class="hx:absolute hx:-mt-20" id="26-disabling-subscription-connection"&gt;&lt;/span&gt;
&lt;a href="#26-disabling-subscription-connection" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在離線的 Satellite Server 上停用訂閱連線，以避免連線至 Red Hat Portal。 這也會讓您無法刷新 manifest (清單) 和更新 upstream entitlements (上游權限)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 Satellite Server 上輸入以下指令：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ hammer settings set --name subscription_connection_enabled --value false&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果如下 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Setting [subscription_connection_enabled] updated to [false].&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7. Exporting a Subscription Manifest from the Customer Portal&lt;span class="hx:absolute hx:-mt-20" id="27-exporting-a-subscription-manifest-from-the-customer-portal"&gt;&lt;/span&gt;
&lt;a href="#27-exporting-a-subscription-manifest-from-the-customer-portal" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Open &lt;a
href="https://access.redhat.com/"target="_blank" rel="noopener"&gt;https://access.redhat.com/&lt;/a&gt; in your browser and log in to your Red Hat account.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Subscriptions&lt;/strong&gt;, which is in the upper-left corner of the Customer Portal page.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Subscription Allocations&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;Name&lt;/strong&gt; column, select the name of the subscription allocation you want to export.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Details&lt;/strong&gt; pane, click &lt;strong&gt;Export Manifest&lt;/strong&gt; to download the subscription manifest file.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.8. Importing a Red Hat subscription manifest into Satellite Server&lt;span class="hx:absolute hx:-mt-20" id="28-importing-a-red-hat-subscription-manifest-into-satellite-server"&gt;&lt;/span&gt;
&lt;a href="#28-importing-a-red-hat-subscription-manifest-into-satellite-server" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;將 Red Hat subscription manifest (訂閱清單) 檔案從本機複製到 Satellite Server：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ scp ~/manifest_file.zip root@satellite.example.com:~/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以 &lt;code&gt;root&lt;/code&gt; 使用者身份登入 Satellite Server，並匯入 Red Hat 訂閱清單檔案：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ hammer subscription upload \
--file ~/manifest_file.zip \
--organization &amp;#34;SUSELab&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Chapter 3. Importing content&lt;span class="hx:absolute hx:-mt-20" id="chapter-3-importing-content"&gt;&lt;/span&gt;
&lt;a href="#chapter-3-importing-content" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;3.1. Products and repositories in Satellite&lt;span class="hx:absolute hx:-mt-20" id="31-products-and-repositories-in-satellite"&gt;&lt;/span&gt;
&lt;a href="#31-products-and-repositories-in-satellite" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Red Hat content 與 Satellite 中的自訂 content 有相似之處：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;產品與它的儲存庫之間的關係相同，儲存庫仍需要同步。&lt;/li&gt;
&lt;li&gt;自訂產品需要訂閱才能讓主機存取，與 Red Hat 產品的訂閱相似。 Satellite 會為您建立的每個自訂產品建立訂閱。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Red Hat 的 content 已經被組織成產品。 例如，Red Hat Enterprise Linux Server 是 Satellite 中的一個產品。 該 Product 的資源庫包含不同的版本、架構和附加元件。 對於 Red Hat repositories (套件庫)，產品會在啟用套件庫後自動建立。&lt;/p&gt;
&lt;p&gt;其他 content 可以隨您的喜好組織成自訂產品。 例如，您可以建立 EPEL (Extra Packages for Enterprise Linux) 產品，並將「EPEL 7 x86_64」套件庫加入其中。&lt;/p&gt;
&lt;h3&gt;3.2. Adding a default HTTP proxy to Satellite&lt;span class="hx:absolute hx:-mt-20" id="32-adding-a-default-http-proxy-to-satellite"&gt;&lt;/span&gt;
&lt;a href="#32-adding-a-default-http-proxy-to-satellite" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果您的網路使用 HTTP proxy，可以設定 Satellite Server 使用 HTTP 代理來處理對 Red Hat Content Delivery Network (CDN) 或其他 context 來源的請求。 盡可能使用 FQDN 而非 IP 位址，以避免因網路變更而失去連線。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;確認沒有設定 &lt;code&gt;http_proxy&lt;/code&gt;、&lt;code&gt;https_proxy&lt;/code&gt; 及 &lt;code&gt;no_proxy&lt;/code&gt; 變數。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ unset http_proxy
$ unset https_proxy
$ unset no_proxy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新增 HTTP proxy entry 到 Satellite：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ hammer http-proxy create --name=myproxy \
--url http://myproxy.example.com:8080 \
--username=proxy_username \
--password=proxy_password&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果如下&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Http proxy created.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定 Satellite 預設使用此 HTTP Proxy：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ hammer settings set --name=content_default_http_proxy --value=myproxy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行結果如下&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Setting [content_default_http_proxy] updated to [myproxy].&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3.3. Enabling Red Hat repositories&lt;span class="hx:absolute hx:-mt-20" id="33-enabling-red-hat-repositories"&gt;&lt;/span&gt;
&lt;a href="#33-enabling-red-hat-repositories" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;若要選擇要同步化的儲存庫，您必須先辨識包含儲存庫的產品，然後根據相關的發行版本和基本架構啟用該儲存庫。&lt;/p&gt;
&lt;h4&gt;適用於 Red Hat Enterprise Linux 8 主機&lt;span class="hx:absolute hx:-mt-20" id="適用於-red-hat-enterprise-linux-8-主機"&gt;&lt;/span&gt;
&lt;a href="#%e9%81%a9%e7%94%a8%e6%96%bc-red-hat-enterprise-linux-8-%e4%b8%bb%e6%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="indent-title-1"&gt;
&lt;p&gt;若要設定 Red Hat Enterprise Linux 8 主機，需要以下兩個套件庫。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h4&gt;適用於 Red Hat Enterprise Linux 7 主機&lt;span class="hx:absolute hx:-mt-20" id="適用於-red-hat-enterprise-linux-7-主機"&gt;&lt;/span&gt;
&lt;a href="#%e9%81%a9%e7%94%a8%e6%96%bc-red-hat-enterprise-linux-7-%e4%b8%bb%e6%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="indent-title-1"&gt;
&lt;p&gt;若要設定 Red Hat Enterprise Linux 7 主機，您需要 &lt;strong&gt;Red Hat Enterprise Linux 7 Server (RPMs)&lt;/strong&gt; 套件庫。&lt;/p&gt;
&lt;p&gt;將 Red Hat Enterprise Linux 作業系統發佈版本與 &lt;strong&gt;7Server&lt;/strong&gt; 套件庫或 &lt;strong&gt;7.X&lt;/strong&gt; 套件庫相關聯的差別在於，&lt;strong&gt;7Server&lt;/strong&gt; 套件庫包含所有最新的更新，而 &lt;strong&gt;Red Hat Enterprise Linux 7.X&lt;/strong&gt; 套件庫在下一個次要版本發佈之後就不再獲得更新。 請注意，Kickstart 套件庫只有 minor (次要)版本。&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;若要搜尋您的產品，請輸入下列指令：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ hammer product list --organization &amp;#34;My_Organization&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Ref&lt;span class="hx:absolute hx:-mt-20" id="ref"&gt;&lt;/span&gt;
&lt;a href="#ref" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://www.redhat.com/en/products/trials"target="_blank" rel="noopener"&gt;Red Hat 產品試用中心&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://docs.redhat.com/en/documentation/red_hat_satellite/6.15/html-single/installing_satellite_server_in_a_disconnected_network_environment/index#system-requirements_satellite"target="_blank" rel="noopener"&gt;Installing Satellite Server in a disconnected network environment - Red Hat Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Red Hat 訂閱命令</title><link>https://blog.kubeantony.com/archive/misc/red-hat-%E8%A8%82%E9%96%B1%E5%91%BD%E4%BB%A4/</link><pubDate>Mon, 23 Sep 2024 06:35:28 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/red-hat-%E8%A8%82%E9%96%B1%E5%91%BD%E4%BB%A4/</guid><description>
&lt;h2&gt;Register and automatically subscribe in one step&lt;span class="hx:absolute hx:-mt-20" id="register-and-automatically-subscribe-in-one-step"&gt;&lt;/span&gt;
&lt;a href="#register-and-automatically-subscribe-in-one-step" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager register --username &amp;lt;username&amp;gt; --password &amp;lt;password&amp;gt; --auto-attach&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Register with a specific pool&lt;span class="hx:absolute hx:-mt-20" id="register-with-a-specific-pool"&gt;&lt;/span&gt;
&lt;a href="#register-with-a-specific-pool" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager attach --pool=&amp;lt;POOL_ID&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are not sure of the pool ID needed, these and details such as expiration dates can be viewed using the following command:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager list --available --all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Un-registering a system&lt;span class="hx:absolute hx:-mt-20" id="un-registering-a-system"&gt;&lt;/span&gt;
&lt;a href="#un-registering-a-system" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager remove --all
$ subscription-manager unregister
$ subscription-manager clean&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>jq 命令</title><link>https://blog.kubeantony.com/archive/misc/jq-%E5%91%BD%E4%BB%A4/</link><pubDate>Sun, 15 Sep 2024 12:20:14 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/jq-%E5%91%BD%E4%BB%A4/</guid><description>
&lt;p&gt;好的，讓我們詳細解釋以下這個命令的作用和每個部分的功能：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skopeo list-tags docker://docker.io/rancher/k3s &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; [.Tags[] | select(test(&amp;#34;^v1\\.[0-9]+\\.[0-9]+-k3s1$&amp;#34;))]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | group_by(split(&amp;#34;.&amp;#34;)[1])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | map(max_by(split(&amp;#34;.&amp;#34;)[2] | split(&amp;#34;-&amp;#34;)[0] | tonumber))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | .[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;整體概述&lt;span class="hx:absolute hx:-mt-20" id="整體概述"&gt;&lt;/span&gt;
&lt;a href="#%e6%95%b4%e9%ab%94%e6%a6%82%e8%bf%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;這個命令的主要目的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用 skopeo 工具列出 Docker 映像 &lt;code&gt;rancher/k3s&lt;/code&gt; 的所有標籤（tags）。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 &lt;code&gt;jq&lt;/code&gt; 來處理輸出的 JSON 數據，篩選出符合特定版本格式的標籤。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根據次要版本號（&lt;code&gt;v1.x&lt;/code&gt;）對標籤進行分組。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在每個次要版本組中，選出修訂版本號（&lt;code&gt;v1.x.y&lt;/code&gt; 中的 &lt;code&gt;y&lt;/code&gt;）最大的標籤，即每個次要版本的最新版本。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最終，輸出每個次要版本的最新標籤，並以純文本形式顯示。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;逐步解釋&lt;span class="hx:absolute hx:-mt-20" id="逐步解釋"&gt;&lt;/span&gt;
&lt;a href="#%e9%80%90%e6%ad%a5%e8%a7%a3%e9%87%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1. 列出 Docker 映像的所有標籤&lt;span class="hx:absolute hx:-mt-20" id="1-列出-docker-映像的所有標籤"&gt;&lt;/span&gt;
&lt;a href="#1-%e5%88%97%e5%87%ba-docker-%e6%98%a0%e5%83%8f%e7%9a%84%e6%89%80%e6%9c%89%e6%a8%99%e7%b1%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skopeo list-tags docker://docker.io/rancher/k3s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;skopeo&lt;/code&gt;&lt;/strong&gt;：一個用於處理 Container Images 的工具，可以在不下載整個映像的情況下檢查遠程 Container Images 的內容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;list-tags docker://docker.io/rancher/k3s&lt;/code&gt;&lt;/strong&gt;：列出 &lt;code&gt;docker.io/rancher/k3s&lt;/code&gt; 的所有 Tags。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;執行此命令後，會得到一個包含所有標籤的 JSON 格式輸出，類似於：&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;docker.io/rancher/k3s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.16.15-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.17.17-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.18.20-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.19.16-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.20.15-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;2. 將輸出傳遞給 &lt;code&gt;jq&lt;/code&gt; 進行處理&lt;span class="hx:absolute hx:-mt-20" id="2-將輸出傳遞給-jq-進行處理"&gt;&lt;/span&gt;
&lt;a href="#2-%e5%b0%87%e8%bc%b8%e5%87%ba%e5%82%b3%e9%81%9e%e7%b5%a6-jq-%e9%80%b2%e8%a1%8c%e8%99%95%e7%90%86" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; [ ... ]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | group_by(...)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | map(...)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | .[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;|&lt;/code&gt;&lt;/strong&gt;：將前一個命令的輸出作為下一個命令的輸入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;jq -r&lt;/code&gt;&lt;/strong&gt;：&lt;code&gt;jq&lt;/code&gt; 是一個用於處理 JSON 的命令行工具。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-r&lt;/code&gt;&lt;/strong&gt;：表示輸出原始文本（raw output），不包含引號和轉義字符。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;3. 篩選符合特定格式的標籤&lt;span class="hx:absolute hx:-mt-20" id="3-篩選符合特定格式的標籤"&gt;&lt;/span&gt;
&lt;a href="#3-%e7%af%a9%e9%81%b8%e7%ac%a6%e5%90%88%e7%89%b9%e5%ae%9a%e6%a0%bc%e5%bc%8f%e7%9a%84%e6%a8%99%e7%b1%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[.Tags[] | select(test(&amp;#34;^v1\\.[0-9]&amp;#43;\\.[0-9]&amp;#43;-k3s1$&amp;#34;))]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.Tags[]&lt;/code&gt;&lt;/strong&gt;：從 JSON 數據中提取 &lt;code&gt;Tags&lt;/code&gt; 陣列，並展開為單個元素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;| select(test(&amp;quot;...&amp;quot;))&lt;/code&gt;&lt;/strong&gt;：使用正則表達式篩選符合特定格式的標籤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;test(&amp;quot;^v1\\.[0-9]+\\.[0-9]+-k3s1$&amp;quot;)&lt;/code&gt;&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;^&lt;/code&gt;&lt;/strong&gt;：表示字符串的開頭。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;v1\\.&lt;/code&gt;&lt;/strong&gt;：匹配字面量 &lt;code&gt;v1.&lt;/code&gt;，注意在正則表達式中，&lt;code&gt;.&lt;/code&gt; 需要轉義，因此寫作 &lt;code&gt;\\.&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[0-9]+&lt;/code&gt;&lt;/strong&gt;：匹配一個或多個數字。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;\\.&lt;/code&gt;&lt;/strong&gt;：匹配字面量 &lt;code&gt;.&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[0-9]+&lt;/code&gt;&lt;/strong&gt;：再次匹配一個或多個數字。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-k3s1$&lt;/code&gt;&lt;/strong&gt;：匹配字面量 &lt;code&gt;-k3s1&lt;/code&gt;，&lt;code&gt;$&lt;/code&gt; 表示字符串的結尾。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;整體作用&lt;/strong&gt;：選取形如 &lt;code&gt;v1.&amp;lt;次要版本號&amp;gt;.&amp;lt;修訂版本號&amp;gt;-k3s1&lt;/code&gt; 的標籤，例如 &lt;code&gt;v1.29.8-k3s1&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;[ ... ]&lt;/code&gt;&lt;/strong&gt;：將篩選後的標籤組成一個新的陣列，方便後續處理。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;篩選結果示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.29.7-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.29.8-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.0-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.1-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.2-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.3-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.4-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.31.0-k3s1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;4. 根據次要版本號分組&lt;span class="hx:absolute hx:-mt-20" id="4-根據次要版本號分組"&gt;&lt;/span&gt;
&lt;a href="#4-%e6%a0%b9%e6%93%9a%e6%ac%a1%e8%a6%81%e7%89%88%e6%9c%ac%e8%99%9f%e5%88%86%e7%b5%84" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;| group_by(split(&amp;#34;.&amp;#34;)[1])&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;split(&amp;quot;.&amp;quot;)&lt;/code&gt;&lt;/strong&gt;：將每個標籤按 &lt;code&gt;.&lt;/code&gt; 分割，得到一個陣列。
&lt;ul&gt;
&lt;li&gt;例如，&lt;code&gt;v1.29.8-k3s1&lt;/code&gt; 會被分割為 &lt;code&gt;[&amp;quot;v1&amp;quot;, &amp;quot;29&amp;quot;, &amp;quot;8-k3s1&amp;quot;]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[1]&lt;/code&gt;&lt;/strong&gt;：取陣列的第二個元素（索引從 0 開始），即次要版本號。
&lt;ul&gt;
&lt;li&gt;在上述例子中，&lt;code&gt;split(&amp;quot;.&amp;quot;)[1]&lt;/code&gt; 得到 &lt;code&gt;&amp;quot;29&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;group_by(...)&lt;/code&gt;&lt;/strong&gt;：根據次要版本號對標籤進行分組。
&lt;ul&gt;
&lt;li&gt;所有具有相同次要版本號的標籤將被分為一組。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;分組結果示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.29.7-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.29.8-k3s1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.0-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.1-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.2-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.3-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.4-k3s1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.31.0-k3s1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;5. 在每個分組中選取修訂版本號最大的標籤&lt;span class="hx:absolute hx:-mt-20" id="5-在每個分組中選取修訂版本號最大的標籤"&gt;&lt;/span&gt;
&lt;a href="#5-%e5%9c%a8%e6%af%8f%e5%80%8b%e5%88%86%e7%b5%84%e4%b8%ad%e9%81%b8%e5%8f%96%e4%bf%ae%e8%a8%82%e7%89%88%e6%9c%ac%e8%99%9f%e6%9c%80%e5%a4%a7%e7%9a%84%e6%a8%99%e7%b1%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;| map(max_by(split(&amp;#34;.&amp;#34;)[2] | split(&amp;#34;-&amp;#34;)[0] | tonumber))&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;map(...)&lt;/code&gt;&lt;/strong&gt;：對陣列中的每個元素（這裡是每個分組）應用一個函數，返回一個新陣列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;max_by(...)&lt;/code&gt;&lt;/strong&gt;：在分組中根據指定的鍵選取最大值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;split(&amp;quot;.&amp;quot;)[2]&lt;/code&gt;&lt;/strong&gt;：將標籤按 &lt;code&gt;.&lt;/code&gt; 分割，取得第三個元素，即修訂版本號和後綴。
&lt;ul&gt;
&lt;li&gt;例如，&lt;code&gt;v1.29.8-k3s1&lt;/code&gt; 變為 &lt;code&gt;[&amp;quot;v1&amp;quot;, &amp;quot;29&amp;quot;, &amp;quot;8-k3s1&amp;quot;]&lt;/code&gt;，取 &lt;code&gt;split(&amp;quot;.&amp;quot;)[2]&lt;/code&gt; 得到 &lt;code&gt;&amp;quot;8-k3s1&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;split(&amp;quot;-&amp;quot;)[0]&lt;/code&gt;&lt;/strong&gt;：將上一步的結果按 &lt;code&gt;-&lt;/code&gt; 分割，取得修訂版本號。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;8-k3s1&amp;quot;&lt;/code&gt; 分割後得到 &lt;code&gt;[&amp;quot;8&amp;quot;, &amp;quot;k3s1&amp;quot;]&lt;/code&gt;，取 &lt;code&gt;[0]&lt;/code&gt; 得到 &lt;code&gt;&amp;quot;8&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;tonumber&lt;/code&gt;&lt;/strong&gt;：將字符串轉換為數字，以便進行數值比較。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;整體作用&lt;/strong&gt;：在每個次要版本號的分組中，選出修訂版本號（&lt;code&gt;y&lt;/code&gt;）最大的標籤。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;選取結果示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.29.8-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.30.4-k3s1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;v1.31.0-k3s1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;6. 展開陣列並輸出結果&lt;span class="hx:absolute hx:-mt-20" id="6-展開陣列並輸出結果"&gt;&lt;/span&gt;
&lt;a href="#6-%e5%b1%95%e9%96%8b%e9%99%a3%e5%88%97%e4%b8%a6%e8%bc%b8%e5%87%ba%e7%b5%90%e6%9e%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;| .[]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.[]&lt;/code&gt;&lt;/strong&gt;：遍歷陣列中的每個元素，將其單獨輸出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;由於使用了 &lt;code&gt;-r&lt;/code&gt; 選項&lt;/strong&gt;，輸出將是純文本格式，不包含引號或其他符號。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最終輸出：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;v1.29.8-k3s1
v1.30.4-k3s1
v1.31.0-k3s1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;總結&lt;span class="hx:absolute hx:-mt-20" id="總結"&gt;&lt;/span&gt;
&lt;a href="#%e7%b8%bd%e7%b5%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;步驟 1&lt;/strong&gt;：使用 &lt;code&gt;skopeo&lt;/code&gt; 列出 &lt;code&gt;rancher/k3s&lt;/code&gt; 映像的所有標籤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步驟 2&lt;/strong&gt;：使用 &lt;code&gt;jq&lt;/code&gt; 篩選出符合 &lt;code&gt;v1.x.y-k3s1&lt;/code&gt; 格式的標籤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步驟 3&lt;/strong&gt;：根據次要版本號（&lt;code&gt;x&lt;/code&gt;）對標籤進行分組。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步驟 4&lt;/strong&gt;：在每個分組中，選出修訂版本號（&lt;code&gt;y&lt;/code&gt;）最大的標籤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步驟 5&lt;/strong&gt;：輸出每個次要版本的最新標籤，結果為純文本格式。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;為什麼要這樣做？&lt;span class="hx:absolute hx:-mt-20" id="為什麼要這樣做"&gt;&lt;/span&gt;
&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc%e8%a6%81%e9%80%99%e6%a8%a3%e5%81%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自動獲取最新版本&lt;/strong&gt;：這個命令可以自動獲取每個次要版本的最新可用版本，方便進行部署或升級。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;過濾無效或不需要的標籤&lt;/strong&gt;：通過正則表達式篩選，只保留符合預期格式的標籤，避免處理測試版、候選版或其他不符合標準的標籤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;簡化後續處理&lt;/strong&gt;：輸出為純文本格式，每個標籤佔一行，方便在腳本或其他工具中進行處理。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;相關函數和語法解釋&lt;span class="hx:absolute hx:-mt-20" id="相關函數和語法解釋"&gt;&lt;/span&gt;
&lt;a href="#%e7%9b%b8%e9%97%9c%e5%87%bd%e6%95%b8%e5%92%8c%e8%aa%9e%e6%b3%95%e8%a7%a3%e9%87%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;code&gt;test(&amp;quot;正則表達式&amp;quot;)&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="test正則表達式"&gt;&lt;/span&gt;
&lt;a href="#test%e6%ad%a3%e5%89%87%e8%a1%a8%e9%81%94%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：檢查字符串是否匹配指定的正則表達式，返回布爾值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;test(&amp;quot;^v1\\.[0-9]+\\.[0-9]+-k3s1$&amp;quot;)&lt;/code&gt; 檢查字符串是否符合版本格式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;split(&amp;quot;分隔符&amp;quot;)&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="split分隔符"&gt;&lt;/span&gt;
&lt;a href="#split%e5%88%86%e9%9a%94%e7%ac%a6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：將字符串按指定的分隔符分割為陣列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;&amp;quot;v1.29.8-k3s1&amp;quot; | split(&amp;quot;.&amp;quot;)&lt;/code&gt; 會得到 &lt;code&gt;[&amp;quot;v1&amp;quot;, &amp;quot;29&amp;quot;, &amp;quot;8-k3s1&amp;quot;]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;group_by(鍵)&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="group_by鍵"&gt;&lt;/span&gt;
&lt;a href="#group_by%e9%8d%b5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：根據指定的鍵對陣列進行分組，返回一個包含多個子陣列的陣列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;group_by(split(&amp;quot;.&amp;quot;)[1])&lt;/code&gt; 根據次要版本號對標籤進行分組。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;map(函數)&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="map函數"&gt;&lt;/span&gt;
&lt;a href="#map%e5%87%bd%e6%95%b8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：對陣列中的每個元素應用指定的函數，返回一個新陣列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;map(max_by(...))&lt;/code&gt; 對每個分組選取最大值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;max_by(鍵)&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="max_by鍵"&gt;&lt;/span&gt;
&lt;a href="#max_by%e9%8d%b5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：在陣列中根據指定的鍵選取最大值的元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;max_by(split(&amp;quot;.&amp;quot;)[2] | split(&amp;quot;-&amp;quot;)[0] | tonumber)&lt;/code&gt; 根據修訂版本號選取最大值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;tonumber&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tonumber"&gt;&lt;/span&gt;
&lt;a href="#tonumber" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：將字符串轉換為數字。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;&amp;quot;8&amp;quot; | tonumber&lt;/code&gt; 轉換為數字 &lt;code&gt;8&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;.[]&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="heading"&gt;&lt;/span&gt;
&lt;a href="#heading" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：遍歷陣列中的每個元素，將其單獨輸出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] | .[]&lt;/code&gt; 會輸出 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;、&lt;code&gt;c&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;實際應用示例&lt;span class="hx:absolute hx:-mt-20" id="實際應用示例"&gt;&lt;/span&gt;
&lt;a href="#%e5%af%a6%e9%9a%9b%e6%87%89%e7%94%a8%e7%a4%ba%e4%be%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假設您需要在自動化部署腳本中，獲取 &lt;code&gt;rancher/k3s&lt;/code&gt; 映像的每個次要版本的最新版本，可以使用此命令自動獲取，避免手動查詢和更新。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;注意事項&lt;span class="hx:absolute hx:-mt-20" id="注意事項"&gt;&lt;/span&gt;
&lt;a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;網絡連接&lt;/strong&gt;：需要能夠訪問 &lt;code&gt;docker.io&lt;/code&gt; 的網絡連接，以獲取映像標籤信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正則表達式&lt;/strong&gt;：確保正則表達式與您需要的版本格式匹配，必要時可以調整。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;總結&lt;span class="hx:absolute hx:-mt-20" id="總結-1"&gt;&lt;/span&gt;
&lt;a href="#%e7%b8%bd%e7%b5%90-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;這個命令結合了 &lt;code&gt;skopeo&lt;/code&gt; 和 &lt;code&gt;jq&lt;/code&gt; 的功能，自動化地從 Docker 映像庫中獲取特定格式的標籤，並選取每個次要版本的最新修訂版本，對於需要保持軟體版本更新的情況非常實用。&lt;/p&gt;
&lt;p&gt;如果您對某些部分仍有疑問，或者需要進一步的解釋，請隨時告訴我！&lt;/p&gt;</description></item><item><title>洞悉 FCB 腳本</title><link>https://blog.kubeantony.com/archive/misc/%E6%B4%9E%E6%82%89-fcb-%E8%85%B3%E6%9C%AC/</link><pubDate>Fri, 10 May 2024 02:54:24 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E6%B4%9E%E6%82%89-fcb-%E8%85%B3%E6%9C%AC/</guid><description>
&lt;h2&gt;腳本變數&lt;span class="hx:absolute hx:-mt-20" id="腳本變數"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e8%ae%8a%e6%95%b8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#色碼
RED=&amp;#39;\033[0;31m&amp;#39;
GREEN=&amp;#39;\033[0;32m&amp;#39;
BLUE=&amp;#39;\033[0;34m&amp;#39;
YELLOW=&amp;#39;\033[0;33m&amp;#39;
NC=&amp;#39;\033[0m&amp;#39;
bk_time=$(date &amp;#43;&amp;#34;%Y%m%d&amp;#34;)
check_failed=()
#判斷SUSE版本
SUSE_ver=&amp;#34;$(cat /etc/os-release |grep VERSION_ID | awk -F&amp;#39;&amp;#34;&amp;#39; &amp;#39;{print $2}&amp;#39;)&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\033[0m&lt;/code&gt;，關閉所有屬性&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;腳本 Function&lt;span class="hx:absolute hx:-mt-20" id="腳本-function"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac-function" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;all() {
filesystem
system_setting
system_service
software
network
audit
selinux
cron
account_permit
ssh
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;all&lt;/code&gt;: 套用全部FCB設定(除了firewalld以及iptable)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filesystem&lt;/code&gt;: 套用磁碟與檔案系統設定，【FCB29-31,322】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system_setting&lt;/code&gt;: 套用系統設定與維護設定，【FCB32-91,296,306-308,314-316,318-319】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system_service&lt;/code&gt;: 套用系統服務設定，【FCB92-101,303-305,317】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;software&lt;/code&gt;: 套用安裝與維護軟體設定，【FCB102-107】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;network&lt;/code&gt;: 套用網路設定，【FCB108-131】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audit&lt;/code&gt;: 套用日誌與稽核，【FCB132-184,293,297-302,321】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selinux&lt;/code&gt;: 套用SELinux部分設定(不啟用)，【FCB185-191】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cron&lt;/code&gt;: 套用cron設定，【FCB192-207】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account_permit&lt;/code&gt;: 套用帳號與存取控制設定，【FCB208-243,294-295,320】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;firewalld&lt;/code&gt;: 套用Firewalld配置SLES 15版本用，【FCB244-248】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iptable&lt;/code&gt;: 套用iptable配置SLES 12版本用，【FCB256-261】&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh&lt;/code&gt;: 套用SSH設定，【FCB262-292】&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;磁碟與檔案系統&lt;span class="hx:absolute hx:-mt-20" id="磁碟與檔案系統"&gt;&lt;/span&gt;
&lt;a href="#%e7%a3%81%e7%a2%9f%e8%88%87%e6%aa%94%e6%a1%88%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;FCB 29 項&lt;span class="hx:absolute hx:-mt-20" id="fcb-29-項"&gt;&lt;/span&gt;
&lt;a href="#fcb-29-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;這項原則設定決定所有具有全域寫入 (World-writable) 權限之目錄是否設定粘滯位 (Sticky bit)。&lt;/li&gt;
&lt;li&gt;設定粘滯位 (Sticky bit) 確保只有擁有者才能刪除或更名自己建立的檔案，以防止其他使用者任意刪除或更名其他使用者的檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo &amp;#34;此腳本為FCB for SUSE 磁碟與檔案系統設定(FCB29-31,322)&amp;#34;
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB29 設定全域寫入權限目錄之粘滯位:$NC&amp;#34;
echo -e &amp;#34;${YELLOW}在所有具有全域寫入(World-writable)權限之目錄設定粘滯位：
搜尋所有具有全域寫入(World-writable)權限之目錄${NC}&amp;#34;
output=$(df --local -P | awk &amp;#39;{if (NR!=1) print $6}&amp;#39; | xargs -I &amp;#39;{}&amp;#39; find &amp;#39;{}&amp;#39; -xdev -type d \( -perm -0002 -a ! -perm -1000 \))
if [ -n &amp;#34;$output&amp;#34; ]; then
echo -e &amp;#34;${RED}檢查出具有全域寫入(World-writable)權限之目錄&amp;#34;
df --local -P | awk &amp;#39;{if (NR!=1) print $6}&amp;#39; | xargs -I &amp;#39;{}&amp;#39; find &amp;#39;{}&amp;#39; -xdev -type d \( -perm -0002 -a ! -perm -1000 \)
echo -e &amp;#34;${NC}輸入以下指令設定設定粘滯位：
df --local -P | awk &amp;#39;{if (NR!=1) print $6}&amp;#39; | xargs -I &amp;#39;{}&amp;#39; find &amp;#39;{}&amp;#39; -xdev -type d \( -perm -0002 -a ! -perm -1000 \) 2&amp;gt;/dev/null | xargs -I &amp;#39;{}&amp;#39; chmod o&amp;#43;t &amp;#39;{}&amp;#39;&amp;#34;
check_failed&amp;#43;=(29)
else
echo -e &amp;#34;${GREEN}檢查通過${NC}&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;df --local -P&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;df&lt;/code&gt;：這個命令用來顯示硬碟使用情況。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--local&lt;/code&gt;：只顯示本地（非網絡）檔案系統。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-P&lt;/code&gt;：輸出格式使用 POSIX 標準格式，確保列數據對齊，方便後續處理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk '{if (NR!=1) print $6}'&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt;：處理字串的工具，這裡用來處理 df 的輸出。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{if (NR!=1) print $6}&lt;/code&gt;：如果不是第一行（通常是標題行），則打印每行的第六個字段，分隔符預設是一個空格，這是掛載點的位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;做到一樣事情但更簡單的命令 :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;df -l --output=target | tail -n +2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xargs -I '{}' find '{}' -xdev -type d \( -perm -0002 -a ! -perm -1000 \)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;xargs&lt;/code&gt;：把標準輸入的字串轉換成命令行參數。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-I '{}'&lt;/code&gt;：自定義替換字符串，這裡指定用 &lt;code&gt;{}&lt;/code&gt; 來替換。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find&lt;/code&gt;：尋找檔案的命令。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;'{}'&lt;/code&gt;：被 &lt;code&gt;xargs&lt;/code&gt; 替換的掛載點。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-xdev&lt;/code&gt;：不進入處於其他文件系統之上的目錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-type d&lt;/code&gt;：只尋找目錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\( -perm -0002 -a ! -perm -1000 \)&lt;/code&gt;：尋找至少擁有其他人可寫的權限（&lt;code&gt;-perm -0002&lt;/code&gt;）且沒有設定 sticky bit（&lt;code&gt;-perm -1000&lt;/code&gt;）的目錄。
&lt;ul&gt;
&lt;li&gt;至少擁有其他人可寫的權限的意思是，只要權限有其他人可寫的這個權限，不管 owner 和 group 權限設定多少，都會被找出來。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;將所有錯誤訊息重定向到黑洞裝置 &lt;code&gt;/dev/null&lt;/code&gt;（忽略錯誤訊息）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xargs -I '{}' chmod o+t '{}'&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;再次使用 &lt;code&gt;xargs&lt;/code&gt; 接收前一個命令的輸出。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod o+t '{}'&lt;/code&gt;：對找到的每個目錄設置 sticky bit，以防止非擁有者刪除或更改其他用戶的檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FCB 30 項&lt;span class="hx:absolute hx:-mt-20" id="fcb-30-項"&gt;&lt;/span&gt;
&lt;a href="#fcb-30-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-1"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;這項原則設定決定是否使用 autofs 服務&lt;/li&gt;
&lt;li&gt;autofs 服務可自動掛載或卸載光碟機、USB 裝置及 NFS 檔案系統的掛載點，讓任何使用者都可以使用 autofs 服務掛載裝置與檔案系統&lt;/li&gt;
&lt;li&gt;當系統不需自動掛載 NFS 檔案系統或可攜式儲存裝置時，建議停用此服務。如有掛載需求，建議透過設定 &lt;code&gt;/etc/fstab&lt;/code&gt; 檔案方式進行掛載&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-1"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB30 autofs服務&amp;#34;
output=$(systemctl status autofs)
if systemctl is-enabled autofs &amp;amp;&amp;gt; /dev/null; then
echo -e &amp;#34;${RED}autofs服務已啟用，需要禁用${NC}&amp;#34;
echo &amp;#34;輸入以下指令設定autofs禁用：
systemctl --now disable autofs&amp;#34;
check_failed&amp;#43;=(30)
else
echo -e &amp;#34;${GREEN}檢查通過${NC}&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-1"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl is-enabled autofs&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;is-enabled&lt;/code&gt;，檢查服務是否設為開機自動啟動了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;account_permit&lt;span class="hx:absolute hx:-mt-20" id="account_permit"&gt;&lt;/span&gt;
&lt;a href="#account_permit" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-2"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;備份檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-2"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo &amp;#34;此腳本為FCB for SUSE 帳號與存取控制(FCB208-243,294-295,320)&amp;#34;
#備份/etc/pam.d/common-password-pc
if [ ! -f &amp;#34;/etc/pam.d/common-password-pc.ori&amp;#34; ];then
cp -p &amp;#34;/etc/pam.d/common-password-pc&amp;#34; &amp;#34;/etc/pam.d/common-password-pc.ori&amp;#34;
else
cp -p &amp;#34;/etc/pam.d/common-password-pc&amp;#34; &amp;#34;/etc/pam.d/common-password-pc.bk$bk_time&amp;#34;
fi
#備份/etc/pam.d/login
if [ ! -f &amp;#34;/etc/pam.d/login.ori&amp;#34; ];then
cp -p &amp;#34;/etc/pam.d/login&amp;#34; &amp;#34;/etc/pam.d/login.ori&amp;#34;
else
cp -p &amp;#34;/etc/pam.d/login&amp;#34; &amp;#34;/etc/pam.d/login.bk$bk_time&amp;#34;
fi
#備份/etc/login.defs
if [ ! -f &amp;#34;/etc/login.defs.ori&amp;#34; ];then
cp -p &amp;#34;/etc/login.defs&amp;#34; &amp;#34;/etc/login.defs.ori&amp;#34;
else
cp -p &amp;#34;/etc/login.defs&amp;#34; &amp;#34;/etc/login.defs.bk$bk_time&amp;#34;
fi
#備份/etc/security/limits.conf
if [ ! -f &amp;#34;/etc/security/limits.conf.ori&amp;#34; ];then
cp -p &amp;#34;/etc/security/limits.conf&amp;#34; &amp;#34;/etc/security/limits.conf.ori&amp;#34;
else
cp -p &amp;#34;/etc/security/limits.conf&amp;#34; &amp;#34;/etc/security/limits.conf.bk$bk_time&amp;#34;
fi
###/etc/dconf/db/local.d/00-screensaver預設不存在，故不備份
#備份/etc/gdm/custom.conf
if [ ! -f &amp;#34;/etc/gdm/custom.conf.ori&amp;#34; ];then
cp -p &amp;#34;/etc/gdm/custom.conf&amp;#34; &amp;#34;/etc/gdm/custom.conf.ori&amp;#34;
else
cp -p &amp;#34;/etc/gdm/custom.conf&amp;#34; &amp;#34;/etc/gdm/custom.conf.bk$bk_time&amp;#34;
fi
#備份/etc/bash.bashrc
if [ ! -f &amp;#34;/etc/bash.bashrc.ori&amp;#34; ];then
cp -p &amp;#34;/etc/bash.bashrc&amp;#34; &amp;#34;/etc/bash.bashrc.ori&amp;#34;
else
cp -p &amp;#34;/etc/bash.bashrc&amp;#34; &amp;#34;/etc/bash.bashrc.bk$bk_time&amp;#34;
fi
#備份/etc/profile
if [ ! -f &amp;#34;/etc/profile.ori&amp;#34; ];then
cp -p &amp;#34;/etc/profile&amp;#34; &amp;#34;/etc/profile.ori&amp;#34;
else
cp -p &amp;#34;/etc/profile&amp;#34; &amp;#34;/etc/profile.bk$bk_time&amp;#34;
fi
###/etc/dconf/db/local.d/locks/session預設不存在，故不備份
#備份/etc/pam.d/su
if [ ! -f &amp;#34;/etc/pam.d/su.ori&amp;#34; ];then
cp -p &amp;#34;/etc/pam.d/su&amp;#34; &amp;#34;/etc/pam.d/su.ori&amp;#34;
else
cp -p &amp;#34;/etc/pam.d/su&amp;#34; &amp;#34;/etc/pam.d/su.bk$bk_time&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#FCB208-219
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB208-219 設定使用者帳號密碼設定規則:${YELLOW}請檢查輸出是否相符${NC}&amp;#34;
pam-config -a --cracklib-minlen=12 --cracklib-retry=3 --cracklib-lcredit=-1 --cracklib-ucredit=-1 --cracklib-dcredit=-1 --cracklib-ocredit=-1 --cracklib-reject_username=-1 --cracklib --cracklib-difok=3 --cracklib-maxclassrepeat=4 --cracklib-maxrepeat=3 --cracklib-enforce_for_root
echo -e &amp;#34;/etc/pam.d/common-password-pc目前設定:&amp;#34;
grep pam_cracklib.so /etc/pam.d/common-password-pc
echo -e &amp;#34;${YELLOW}範例:
password requisite pam_cracklib.so reject_username enforce_for_root retry=3 difok=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=3 maxclassrepeat=4${NC}&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-2"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;FCB208&lt;code&gt;--cracklib-retry=3&lt;/code&gt; 可設定密碼次數&lt;/li&gt;
&lt;li&gt;FCB 209 &lt;code&gt;--cracklib-enforce_for_root&lt;/code&gt; 強制root密碼須符合密碼規則&lt;/li&gt;
&lt;li&gt;FCB 210 &lt;code&gt;--cracklib-minlen=12&lt;/code&gt; 密碼最小長度&lt;/li&gt;
&lt;li&gt;FCB 211 &lt;code&gt;--cracklib-lcredit=-1 --cracklib-ucredit=-1 --cracklib-dcredit=-1 --cracklib-ocredit=-1 &lt;/code&gt; 密碼必須至少包含字元類別數量&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;firewalld&lt;span class="hx:absolute hx:-mt-20" id="firewalld"&gt;&lt;/span&gt;
&lt;a href="#firewalld" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;FCB 244-248 項&lt;span class="hx:absolute hx:-mt-20" id="fcb-244-248-項"&gt;&lt;/span&gt;
&lt;a href="#fcb-244-248-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-3"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;  這項原則設定決定是否安裝firewalld防火牆套件
*  藉由防火牆管理與設定，以保護系統安全&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-3"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo &amp;#34;SLSE 15 firewalld setup config&amp;#34;
echo -e &amp;#34;${BLUE}FCB244-245 firewalld防火牆套件安裝並啟用${NC}&amp;#34;
# FCB 244
zypper install firewalld
rpm -qa firewalld --qf &amp;#39;(%{INSTALLTIME:date}): %{NAME}-%{VERSION}\n&amp;#39;
# FCB 245
systemctl --now enable firewalld
systemctl status firewalld
echo -e &amp;#34;${BLUE}FCB246 停用並遮蔽iptables及nftables服務${NC}&amp;#34;
# FCB 246
systemctl --now mask iptables
# FCB 247
systemctl --now mask nftables
systemctl status iptables
systemctl status nftables
# FCB 248
firewall-cmd --list-all
echo -e &amp;#34;${YELLOW}請使用指令檢查目前firewall zone以及網路設定，設定範例如下:
firewall-cmd --set-default-zone=public
firewall-cmd --permanent --zone=public --add-interface=eth0
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --list-all
firewall-cmd --reload
systemctl restart firewalld${NC}&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;iptable&lt;span class="hx:absolute hx:-mt-20" id="iptable"&gt;&lt;/span&gt;
&lt;a href="#iptable" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;FCB256 - 261項&lt;span class="hx:absolute hx:-mt-20" id="fcb256---261項"&gt;&lt;/span&gt;
&lt;a href="#fcb256---261%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-4"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo &amp;#34;SLSE 12SP5 iptable setup config&amp;#34;
# FCB 256
echo -e &amp;#34;${BLUE}FCB256 iptables服務安裝並啟用${NC}&amp;#34;
zypper install iptable
rpm -qa iptables --qf &amp;#39;(%{INSTALLTIME:date}): %{NAME}-%{VERSION}\n&amp;#39;
#FCB 257
echo -e &amp;#34;${BLUE}FCB257 停用並遮蔽Firewalld服務${NC}&amp;#34;
systemctl --now mask firewalld
systemctl status firewalld
echo -e &amp;#34;${YELLOW}腳本自動套用iptable設定${NC}&amp;#34;
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
iptables -A FORWARD -j ACCEPT
# FCB 258
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# FCB 259
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -s 127.0.0.0/8 -j DROP
ip6tables --list-rules
ip6tables -A INPUT -j ACCEPT
ip6tables -A OUTPUT -j ACCEPT
ip6tables -A FORWARD -j ACCEPT
# FCB 260
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
# FCB 261
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
ip6tables -A INPUT -s ::1 -j DROP
iptables --list-rules
iptables-save &amp;gt; /etc/sysconfig/iptables
ip6tables-save &amp;gt; /etc/sysconfig/ip6tables
echo &amp;#34;iptables-restore /etc/sysconfig/iptables
ip6tables-restore /etc/sysconfig/ip6tables&amp;#34; &amp;gt;&amp;gt; /etc/init.d/after.local&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;ssh&lt;span class="hx:absolute hx:-mt-20" id="ssh"&gt;&lt;/span&gt;
&lt;a href="#ssh" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;備份 FCB 262-292項&lt;span class="hx:absolute hx:-mt-20" id="備份-fcb-262-292項"&gt;&lt;/span&gt;
&lt;a href="#%e5%82%99%e4%bb%bd-fcb-262-292%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-4"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;依時間備分sshd_config的設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-5"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#備份/etc/ssh/sshd_config
if [ ! -f &amp;#34;/etc/ssh/sshd_config.ori&amp;#34; ];then
cp -p &amp;#34;/etc/ssh/sshd_config&amp;#34; &amp;#34;/etc/ssh/sshd_config.ori&amp;#34;
else
cp -p &amp;#34;/etc/ssh/sshd_config&amp;#34; &amp;#34;/etc/ssh/sshd_config.bk$bk_time&amp;#34;
fi
#備份/etc/sysconfig/sshd
#if [ ! -f &amp;#34;/etc/sysconfig/sshd.ori&amp;#34; ];then
# cp -p &amp;#34;/etc/sysconfig/sshd&amp;#34; &amp;#34;/etc/sysconfig/sshd.ori&amp;#34;
#else
# cp -p &amp;#34;/etc/sysconfig/sshd&amp;#34; &amp;#34;/etc/sysconfig/sshd.bk$bk_time&amp;#34;
#fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-3"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cp -p&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;: 複製檔案保留檔案最原始的權限跟郵戳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[ ! -f &amp;quot;/etc/sysconfig/sshd.ori&amp;quot; ]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[! -f &amp;quot;/etc/sysconfig/sshd.ori&amp;quot; ]&lt;/code&gt; 檢查/etc/sysconfig/sshd.ori這個檔案是否不存在&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FCB 262 項&lt;span class="hx:absolute hx:-mt-20" id="fcb-262-項"&gt;&lt;/span&gt;
&lt;a href="#fcb-262-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-5"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;安裝sshd套件&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-6"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB262 安裝sshd套件 :$YELLOW 請檢查以下輸出$NC&amp;#34;
zypper install openssh-server.x86_64
systemctl --now enable sshd.service&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB 263 項&lt;span class="hx:absolute hx:-mt-20" id="fcb-263-項"&gt;&lt;/span&gt;
&lt;a href="#fcb-263-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-6"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;檢查SSH 的 Protocol設定使用SSHv2連線&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-7"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#SSH協定版本
if grep -qE &amp;#34;^Protocol\s&amp;#43;2$&amp;#34; /etc/ssh/sshd_config ; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB263 SSH協定版本:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^Protocol\s&amp;#43;2$&amp;#34; /etc/ssh/sshd_config
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB263 SSH協定版本:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^Protocol/#Protocol/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;Protocol 2&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增限制存取SSH參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^Protocol\s&amp;#43;2$&amp;#34; /etc/ssh/sshd_config
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-4"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;`&amp;ldquo;Protocol 2&amp;rdquo; &amp;raquo; &amp;ldquo;/etc/ssh/sshd_config&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Protocol 2&lt;/code&gt; 讓SSH 套用 SSHv2 協議
它的運作方式如下：將SSHv2伺服器設定為能夠接受SSH預設通訊埠22的連線；並關閉其他所有的通訊埠。 然後，將伺服器設定成用戶端能透過通訊埠22來存取其他的網路服務。 之後將用戶端設定成以通訊埠22連上網路，並將所有允許的服務全納入SSHv2的通道中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FCB264-265 項&lt;span class="hx:absolute hx:-mt-20" id="fcb264-265-項"&gt;&lt;/span&gt;
&lt;a href="#fcb264-265-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-7"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;更新/etc/ssh/sshd_config檔案權限&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-8"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#更新/etc/ssh/sshd_config檔案權限
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB264-265 更新/etc/ssh/sshd_config檔案權限:$GREEN 完成$NC&amp;#34;
chown root:root /etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config
ls -l /etc/ssh/sshd_config&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB266 項目&lt;span class="hx:absolute hx:-mt-20" id="fcb266-項目"&gt;&lt;/span&gt;
&lt;a href="#fcb266-%e9%a0%85%e7%9b%ae" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-8"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;限制存取SSH&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-9"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^AllowGroups\s&amp;#43;root\s&amp;#43;psca\s&amp;#43;psys\s&amp;#43;ppcs\s&amp;#43;pcop\s&amp;#43;pcmd1\s&amp;#43;pchgcmd\s&amp;#43;psftp\s&amp;#43;pftpid0\s&amp;#43;psam\s&amp;#43;pbasis$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB266 限制存取SSH參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^AllowGroups\s&amp;#43;root\s&amp;#43;psca\s&amp;#43;psys\s&amp;#43;ppcs\s&amp;#43;pcop\s&amp;#43;pcmd1\s&amp;#43;pchgcmd\s&amp;#43;psftp\s&amp;#43;pftpid0\s&amp;#43;psam\s&amp;#43;pbasis$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB274 限制存取SSH參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^AllowGroups/#AllowGroups/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;AllowGroups root psca psys ppcs pcop pcmd1 pchgcmd psftp pftpid0 psam pbasis&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增限制存取SSH參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^AllowGroups\s&amp;#43;root\s&amp;#43;psca\s&amp;#43;psys\s&amp;#43;ppcs\s&amp;#43;pcop\s&amp;#43;pcmd1\s&amp;#43;pchgcmd\s&amp;#43;psftp\s&amp;#43;pftpid0\s&amp;#43;psam\s&amp;#43;pbasis$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-5"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;^AllowGroups\s+root\s+psca\s+psys\s+ppcs\s+pcop\s+pcmd1\s+pchgcmd\s+psftp\s+pftpid0\s+psam\s+pbasis$&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;^&lt;/code&gt; 是 AllowGroups 開頭。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\s+&lt;/code&gt; 表示一個或多個空白字符。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt; 表示這行結束&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FCB267-270 項&lt;span class="hx:absolute hx:-mt-20" id="fcb267-270-項"&gt;&lt;/span&gt;
&lt;a href="#fcb267-270-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-9"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;設定SSH主機私鑰及公鑰檔案權限&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-10"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-10" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#FCB267-270
#設定SSH主機私鑰及公鑰檔案權限
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB267-270 設定SSH主機私鑰及公鑰檔案權限:$GREEN 完成$NC&amp;#34;
find /etc/ssh -xdev -type f -name &amp;#39;ssh_host_*_key&amp;#39; -exec chown root:root {} \;
find /etc/ssh -xdev -type f -name &amp;#39;ssh_host_*_key&amp;#39; -exec chmod 600 {} \;
find /etc/ssh -xdev -type f -name &amp;#39;ssh_host_*_key.pub&amp;#39; -exec chown root:root {} \;
find /etc/ssh -xdev -type f -name &amp;#39;ssh_host_*_key.pub&amp;#39; -exec chmod 644 {} \;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;關鍵命令解釋&lt;span class="hx:absolute hx:-mt-20" id="關鍵命令解釋-6"&gt;&lt;/span&gt;
&lt;a href="#%e9%97%9c%e9%8d%b5%e5%91%bd%e4%bb%a4%e8%a7%a3%e9%87%8b-6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;find /etc/ssh -xdev -type f -name 'ssh_host_*_key.pub' -exec chmod 644 {} \&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-xdev&lt;/code&gt; 在當前的檔案係中尋找此檔案 不會找掛載的其他檔案系&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{}&lt;/code&gt; 把 find 指令找到的每一個檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FCB271 項&lt;span class="hx:absolute hx:-mt-20" id="fcb271-項"&gt;&lt;/span&gt;
&lt;a href="#fcb271-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-10"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-10" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;設定SSH加密演算法:Ciphers設定、MACs設定、kexalgorithms設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-11"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-11" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#設定SSH加密演算法
#Ciphers設定
if grep -qE &amp;#34;^Ciphers\s&amp;#43;aes128-ctr,aes192-ctr,aes256-ctr$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法Ciphers:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^Ciphers\s&amp;#43;aes128-ctr,aes192-ctr,aes256-ctr$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法Ciphers:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^Ciphers/#Ciphers/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;Ciphers aes128-ctr,aes192-ctr,aes256-ctr&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH加密演算法Ciphers參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^Ciphers\s&amp;#43;aes128-ctr,aes192-ctr,aes256-ctr$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi
#MACs設定
if grep -qE &amp;#34;^MACs\s&amp;#43;hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法MACs:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^MACs\s&amp;#43;hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法MACs:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^MACs/#MACs/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH加密演算法MACs參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^MACs\s&amp;#43;hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi
#kexalgorithms設定
if grep -qE &amp;#34;^kexalgorithms\s&amp;#43;ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法kexalgorithms:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^kexalgorithms\s&amp;#43;ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB271 設定SSH加密演算法kexalgorithms:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^kexalgorithms/#kexalgorithms/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;kexalgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH加密演算法kexalgorithms參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^kexalgorithms\s&amp;#43;ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB272 項&lt;span class="hx:absolute hx:-mt-20" id="fcb272-項"&gt;&lt;/span&gt;
&lt;a href="#fcb272-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-11"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-11" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH LogLevel參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-12"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-12" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^LogLevel\s&amp;#43;INFO$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB272 SSH LogLevel參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^LogLevel\s&amp;#43;INFO$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB272 SSH LogLevel參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^LogLevel/#LogLevel/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;LogLevel INFO&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH LogLevel參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^LogLevel\s&amp;#43;INFO$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB273 項&lt;span class="hx:absolute hx:-mt-20" id="fcb273-項"&gt;&lt;/span&gt;
&lt;a href="#fcb273-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-12"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-12" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH X11Forwarding參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-13"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-13" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^X11Forwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB273 SSH X11Forwarding參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^X11Forwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB273 SSH X11Forwarding參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^X11Forwarding/#X11Forwarding/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;X11Forwarding no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH X11Forwarding參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^X11Forwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB274 項&lt;span class="hx:absolute hx:-mt-20" id="fcb274-項"&gt;&lt;/span&gt;
&lt;a href="#fcb274-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-13"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-13" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH MaxAuthTries參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-14"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-14" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^MaxAuthTries\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB274 SSH MaxAuthTries參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^MaxAuthTries\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB274 SSH MaxAuthTries參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^MaxAuthTries/#MaxAuthTries/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;MaxAuthTries 4&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH MaxAuthTries參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^MaxAuthTries\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB275 項&lt;span class="hx:absolute hx:-mt-20" id="fcb275-項"&gt;&lt;/span&gt;
&lt;a href="#fcb275-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-14"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-14" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH IgnoreRhosts參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-15"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-15" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^IgnoreRhosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB275 SSH IgnoreRhosts參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^IgnoreRhosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB275 SSH IgnoreRhosts參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^IgnoreRhosts/#IgnoreRhosts/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;IgnoreRhosts yes&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH IgnoreRhosts參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^IgnoreRhosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB276 項&lt;span class="hx:absolute hx:-mt-20" id="fcb276-項"&gt;&lt;/span&gt;
&lt;a href="#fcb276-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-15"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-15" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH HostbasedAuthentication參數&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^HostbasedAuthentication\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB276 SSH HostbasedAuthentication參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^HostbasedAuthentication\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB276 SSH HostbasedAuthentication參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^HostbasedAuthentication/#HostbasedAuthentication/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;HostbasedAuthentication no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH HostbasedAuthentication參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^HostbasedAuthentication\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB277 項&lt;span class="hx:absolute hx:-mt-20" id="fcb277-項"&gt;&lt;/span&gt;
&lt;a href="#fcb277-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-16"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-16" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH PermitRootLogin參數&lt;/li&gt;
&lt;li&gt;編輯 /etc/ssh/sshd_config 檔案, 設定參數如下: PermitRootLogin no&lt;/li&gt;
&lt;li&gt;開啟終端機, 執行以下指令, 重新啟動 SSH 服務使其生效:&lt;/li&gt;
&lt;li&gt;systemctl restart sshd&lt;/li&gt;
&lt;li&gt;注意: 請先通知 SSH 服務使用者, 再重啟 SSH 服務, 以避免影響使用者作業&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-16"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-16" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#if grep -qE &amp;#34;^PermitRootLogin\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
# echo -e &amp;#34;$BLUE&amp;#34;
# echo -e &amp;#34;FCB277 SSH PermitRootLogin參數:$GREEN 正確$NC&amp;#34;
# grep -E &amp;#34;^PermitRootLogin\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
#else
# echo -e &amp;#34;$BLUE&amp;#34;
# echo -e &amp;#34;FCB277 SSH PermitRootLogin參數:$GREEN 完成$NC&amp;#34;
# sed -i &amp;#39;s/^PermitRootLogin/#PermitRootLogin/g&amp;#39; /etc/ssh/sshd_config
# echo -e &amp;#34;PermitRootLogin no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
# echo &amp;#34;新增SSH PermitRootLogin參數至 /etc/ssh/sshd_config&amp;#34;
# grep -E &amp;#34;^PermitRootLogin\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
#fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB278 項&lt;span class="hx:absolute hx:-mt-20" id="fcb278-項"&gt;&lt;/span&gt;
&lt;a href="#fcb278-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-17"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-17" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH PermitEmptyPasswords參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-17"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-17" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^PermitEmptyPasswords\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB278 SSH PermitEmptyPasswords參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^PermitEmptyPasswords\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB278 SSH PermitEmptyPasswords參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^PermitEmptyPasswords/#PermitEmptyPasswords/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;PermitEmptyPasswords no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH PermitEmptyPasswords參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^PermitEmptyPasswords\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB279 項&lt;span class="hx:absolute hx:-mt-20" id="fcb279-項"&gt;&lt;/span&gt;
&lt;a href="#fcb279-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-18"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-18" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH PermitEmptyPasswords參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-18"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-18" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^PermitUserEnvironment\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB279 SSH PermitUserEnvironment參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^PermitUserEnvironment\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB279 SSH PermitUserEnvironment參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^PermitUserEnvironment/#PermitUserEnvironment/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;PermitUserEnvironment no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH PermitUserEnvironment參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^PermitUserEnvironment\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB280 項&lt;span class="hx:absolute hx:-mt-20" id="fcb280-項"&gt;&lt;/span&gt;
&lt;a href="#fcb280-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-19"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-19" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH ClientAliveInterval參數、ClientAliveCountMax參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-19"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-19" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^ClientAliveInterval\s&amp;#43;600$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB280 SSH ClientAliveInterval參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^ClientAliveInterval\s&amp;#43;600$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB280 SSH ClientAliveInterval參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^ClientAliveInterval/#ClientAliveInterval/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;ClientAliveInterval 600&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH ClientAliveInterval參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^ClientAliveInterval\s&amp;#43;600$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi
if grep -qE &amp;#34;^ClientAliveCountMax\s&amp;#43;0$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB280 SSH ClientAliveCountMax參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^ClientAliveCountMax\s&amp;#43;0$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB280 SSH ClientAliveCountMax參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^ClientAliveCountMax/#ClientAliveCountMax/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;ClientAliveCountMax 0&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH ClientAliveCountMax參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^ClientAliveCountMax\s&amp;#43;0$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB281 項&lt;span class="hx:absolute hx:-mt-20" id="fcb281-項"&gt;&lt;/span&gt;
&lt;a href="#fcb281-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-20"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-20" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH LoginGraceTime參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-20"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-20" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^LoginGraceTime\s&amp;#43;60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB281 SSH LoginGraceTime參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^LoginGraceTime\s&amp;#43;60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB281 SSH LoginGraceTime參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^LoginGraceTime/#LoginGraceTime/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;LoginGraceTime 60&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH LoginGraceTime參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^LoginGraceTime\s&amp;#43;60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB282 項&lt;span class="hx:absolute hx:-mt-20" id="fcb282-項"&gt;&lt;/span&gt;
&lt;a href="#fcb282-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-21"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-21" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH UsePAM參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-21"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-21" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^UsePAM\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB282 SSH UsePAM參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^UsePAM\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB282 SSH UsePAM參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^UsePAM/#UsePAM/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;UsePAM yes&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH UsePAM參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^UsePAM\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB283 項&lt;span class="hx:absolute hx:-mt-20" id="fcb283-項"&gt;&lt;/span&gt;
&lt;a href="#fcb283-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-22"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-22" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH AllowTcpForwarding參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-22"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-22" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^AllowTcpForwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB283 SSH AllowTcpForwarding參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^AllowTcpForwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB283 SSH AllowTcpForwarding參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^AllowTcpForwarding/#AllowTcpForwarding/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;AllowTcpForwarding no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH AllowTcpForwarding參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^AllowTcpForwarding\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB284 項&lt;span class="hx:absolute hx:-mt-20" id="fcb284-項"&gt;&lt;/span&gt;
&lt;a href="#fcb284-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-23"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-23" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH maxstartups參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-23"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-23" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^maxstartups\s&amp;#43;10:30:60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB284 SSH maxstartups參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^maxstartups\s&amp;#43;10:30:60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB284 SSH maxstartups參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^maxstartups/#maxstartups/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;maxstartups 10:30:60&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH maxstartups參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^maxstartups\s&amp;#43;10:30:60$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB285 項&lt;span class="hx:absolute hx:-mt-20" id="fcb285-項"&gt;&lt;/span&gt;
&lt;a href="#fcb285-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-24"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-24" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH MaxSessions參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-24"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-24" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^MaxSessions\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB285 SSH MaxSessions參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^MaxSessions\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB285 SSH MaxSessions參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^MaxSessions/#MaxSessions/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;MaxSessions 4&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH MaxSessions參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^MaxSessions\s&amp;#43;4$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB286 項&lt;span class="hx:absolute hx:-mt-20" id="fcb286-項"&gt;&lt;/span&gt;
&lt;a href="#fcb286-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-25"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-25" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH StrictModes參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-25"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-25" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^StrictModes\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB286 SSH StrictModes參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^StrictModes\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB286 SSH StrictModes參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^StrictModes/#StrictModes/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;StrictModes yes&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH StrictModes參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^StrictModes\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB287 項&lt;span class="hx:absolute hx:-mt-20" id="fcb287-項"&gt;&lt;/span&gt;
&lt;a href="#fcb287-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-26"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-26" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH Compression參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-26"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-26" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^Compression\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB287 SSH Compression參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^Compression\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB287 SSH Compression參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^Compression/#Compression/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;Compression no&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH Compression參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^Compression\s&amp;#43;no$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB288 項&lt;span class="hx:absolute hx:-mt-20" id="fcb288-項"&gt;&lt;/span&gt;
&lt;a href="#fcb288-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-27"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-27" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH IgnoreUserKnownHosts參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-27"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-27" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^IgnoreUserKnownHosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB288 SSH IgnoreUserKnownHosts參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^IgnoreUserKnownHosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB288 SSH IgnoreUserKnownHosts參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^IgnoreUserKnownHosts/#IgnoreUserKnownHosts/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;IgnoreUserKnownHosts yes&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH IgnoreUserKnownHosts參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^IgnoreUserKnownHosts\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB289 項&lt;span class="hx:absolute hx:-mt-20" id="fcb289-項"&gt;&lt;/span&gt;
&lt;a href="#fcb289-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-28"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-28" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;SSH PrintLastLog參數&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-28"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-28" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;if grep -qE &amp;#34;^PrintLastLog\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;; then
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB289 SSH PrintLastLog參數:$GREEN 正確$NC&amp;#34;
grep -E &amp;#34;^PrintLastLog\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
else
echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB289 SSH PrintLastLog參數:$GREEN 完成$NC&amp;#34;
sed -i &amp;#39;s/^PrintLastLog/#PrintLastLog/g&amp;#39; /etc/ssh/sshd_config
echo -e &amp;#34;PrintLastLog yes&amp;#34; &amp;gt;&amp;gt; &amp;#34;/etc/ssh/sshd_config&amp;#34;
echo &amp;#34;新增SSH PrintLastLog參數至 /etc/ssh/sshd_config&amp;#34;
grep -E &amp;#34;^PrintLastLog\s&amp;#43;yes$&amp;#34; &amp;#34;/etc/ssh/sshd_config&amp;#34;
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB290 項&lt;span class="hx:absolute hx:-mt-20" id="fcb290-項"&gt;&lt;/span&gt;
&lt;a href="#fcb290-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-29"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-29" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;移除shosts.equiv檔案&lt;/li&gt;
&lt;li&gt;開啟終端機, 執行以下指令, 尋找任何「shosts.equiv」檔案:
#find / -name shosts.equiv
若發現「shosts.equiv」檔案, 執行指令移除檔案, 範例如下:&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;rm /etc/ssh/shosts.equiv&lt;/h1&gt;&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-29"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-29" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB290 搜尋shosts.equiv檔案:$YELLOW 請檢查以下輸出$NC&amp;#34;
find / -name shosts.equiv
echo &amp;#34;&amp;#34;
echo -e &amp;#34;$YELLOW&amp;#34;
echo -e &amp;#34;若發現「shosts.equiv」檔案，執行指令移除檔案，範例：$RED rm 「該檔案」$NC&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB291 項&lt;span class="hx:absolute hx:-mt-20" id="fcb291-項"&gt;&lt;/span&gt;
&lt;a href="#fcb291-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-30"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-30" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;移除.shosts檔案&lt;/li&gt;
&lt;li&gt;開啟終端機, 執行以下指令, 尋找任何「.shosts」檔案:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# find / -name '*.shosts'&lt;/code&gt;
若發現「.shosts」檔案, 執行指令移除檔案, 範例如下:
&lt;code&gt;# rm $HOME/.shosts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-30"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-30" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;echo -e &amp;#34;$BLUE&amp;#34;
echo -e &amp;#34;FCB291 搜尋.shosts檔案:$YELLOW 請檢查以下輸出$NC&amp;#34;
find / -name *.shosts
echo &amp;#34;&amp;#34;
echo -e &amp;#34;$YELLOW&amp;#34;
echo -e &amp;#34;若發現「.shosts」檔案，執行指令移除檔案，範例：$RED rm 「該檔案」$NC&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;FCB292 項&lt;span class="hx:absolute hx:-mt-20" id="fcb292-項"&gt;&lt;/span&gt;
&lt;a href="#fcb292-%e9%a0%85" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;設定說明&lt;span class="hx:absolute hx:-mt-20" id="設定說明-31"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a%e8%aa%aa%e6%98%8e-31" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;停用覆寫全系統加密原則&lt;/li&gt;
&lt;li&gt;開啟終端機, 執行以下指令, 以停用覆寫全系統加密原則:
&lt;code&gt;# sed -ri &amp;quot;s/^\s*(CRYPTO_POLICY\s*=.*)$/# \1/&amp;quot; /etc/sysconfig/sshd&lt;/code&gt;
執行以下指令, 重新啟動 SSH 服務使其生效:
&lt;code&gt;# systemctl restart sshd&lt;/code&gt;
▪  注意：請先通知SSH服務使用者，再重啟SSH服務，以避免影響使用者作業&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;腳本內容&lt;span class="hx:absolute hx:-mt-20" id="腳本內容-31"&gt;&lt;/span&gt;
&lt;a href="#%e8%85%b3%e6%9c%ac%e5%85%a7%e5%ae%b9-31" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#echo -e &amp;#34;$BLUE&amp;#34;
#echo -e &amp;#34;FCB292 停用覆寫全系統加密原則:$GREEN 完成$NC&amp;#34;
#sed -ri &amp;#34;s/^\s*(CRYPTO_POLICY\s*=.*)$/# \1/&amp;#34; /etc/sysconfig/sshd
echo -e &amp;#34;$BLUE SSH設定修改完畢後，請通知SSH服務使用者，執行指令重啟SSH服務，以避免影響使用者作業:$RED systemctl restart sshd$NC&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>無標題</title><link>https://blog.kubeantony.com/archive/misc/%E7%84%A1%E6%A8%99%E9%A1%8C/</link><pubDate>Fri, 26 Apr 2024 09:16:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E7%84%A1%E6%A8%99%E9%A1%8C/</guid><description>
&lt;p&gt;logrotate 的機制是每天會 rotate 一次，假設原本的檔名是 cron.log ，在 rotate 之後檔案會被壓縮成 cron.log.&amp;lt;當天日期&amp;gt;.xz。
image.png&lt;/p&gt;
&lt;p&gt;而 log 會繼續被存在 cron.log 中，時間過一天之後，會再被 rotate 一次，檔案會再被壓縮成 cron.log.&amp;lt;當天日期&amp;gt;.xz。
image.png&lt;/p&gt;
&lt;p&gt;當壓縮檔累積 14 份，要在產生新的壓縮檔時，會刪除最舊的壓縮檔，讓壓縮檔永遠保存 14 天份的壓縮檔。
image.png&lt;/p&gt;</description></item><item><title>Google</title><link>https://blog.kubeantony.com/archive/misc/google/</link><pubDate>Fri, 19 Apr 2024 08:32:22 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/google/</guid><description>
&lt;style&gt;
.indent-title-1{
margin-left: 1em;
}
.indent-title-2{
margin-left: 2em;
}
.indent-title-3{
margin-left: 3em;
}
&lt;/style&gt;
&lt;ol&gt;
&lt;li&gt;今天我們為何要先學 GCP?
答: 因為要來 Run Google Kubernetes Engine (GKE)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Google Cloud Platform&lt;span class="hx:absolute hx:-mt-20" id="google-cloud-platform"&gt;&lt;/span&gt;
&lt;a href="#google-cloud-platform" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;GCP 只能 Run GKE 嗎?
答: GCP 還有提供很多服務，譬如還有 BigQuery (一種資料分析的工具)、Google Cloud Storage (會提供儲存空間讓你存資料)、Compute Engine (在 Google Cloud 上建立、啟動和管理虛擬機)&amp;hellip;等&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Cloud Identity&lt;span class="hx:absolute hx:-mt-20" id="cloud-identity"&gt;&lt;/span&gt;
&lt;a href="#cloud-identity" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="indent-title-1"&gt;
&lt;p&gt;Cloud Identity 是 Google Cloud Platform (GCP) 提供的一項服務，提供統一的方式來集中管理與建立使用者、多重身份驗證、設備管理&amp;hellip;等&lt;/p&gt;
&lt;p&gt;Cloud Identity 還有 Single Sign-On（SSO） 的特性，可以提供單一的登入入口，登入後就可以使用各種 Google 提供的服務。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;GKE&lt;span class="hx:absolute hx:-mt-20" id="gke"&gt;&lt;/span&gt;
&lt;a href="#gke" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;透過 kubectl 跟 Api Server 溝通
Control manager 會負責讓 application run 的長長久久穩穩當當
看不到也無法控制 Control plane&lt;/p&gt;
&lt;h2&gt;Command&lt;span class="hx:absolute hx:-mt-20" id="command"&gt;&lt;/span&gt;
&lt;a href="#command" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;dig 命令不會根據 /etc/resolv.conf 裡面的 Search Domain 去查詢。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat wulin/wkload/usdt/job-dtp-bucket.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apiVersion: batch/v1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kind: Job
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: job-dtp-bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; namespace: kube-system
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# If the field is set to 0, the Job will be eligible to be automatically deleted immediately after it finishes.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ttlSecondsAfterFinished: &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; template:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: job-dtp-bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; spec:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; containers:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - name: job-dtp-bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 以下 Image 有安裝 mc 命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: quay.io/cloudwalker/alp.base:24.01
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tty: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; command: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; args:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc config host add mios http://miniosnsd.kube-system:9000 minio minio123
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MinIO not exist&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz -O /tmp/hadoop-3.4.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar xvfz hadoop-3.4.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wget https://dlcdn.apache.org/hive/hive-4.0.0/apache-hive-4.0.0-bin.tar.gz -O /tmp/apache-hive-4.0.0-bin.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar xvfz apache-hive-4.0.0-bin.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz -O /tmp/apache-hive-3.1.3-bin.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar xvfz apache-hive-3.1.3-bin.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; shpass -p &lt;span class="s1"&gt;&amp;#39;bigred&amp;#39;&lt;/span&gt; scp -P &lt;span class="m"&gt;22100&lt;/span&gt; bigred@kube-kadm.kube-system:wulin/wkload/usdt/conf/hdp3.4/* /tmp/hadoop-3.4.0/etc/hadoop/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; shpass -p &lt;span class="s1"&gt;&amp;#39;bigred&amp;#39;&lt;/span&gt; scp -P &lt;span class="m"&gt;22100&lt;/span&gt; bigred@kube-kadm.kube-system:wulin/wkload/usdt/bin/* /tmp/hadoop-3.4.0/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; shpass -p &lt;span class="s1"&gt;&amp;#39;bigred&amp;#39;&lt;/span&gt; scp -P &lt;span class="m"&gt;22100&lt;/span&gt; bigred@kube-kadm.kube-system:~/wulin/wkload/usdt/conf/hive4.0/* /tmp/apache-hive-4.0.0-bin/conf/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; shpass -p &lt;span class="s1"&gt;&amp;#39;bigred&amp;#39;&lt;/span&gt; scp -P &lt;span class="m"&gt;22100&lt;/span&gt; bigred@kube-kadm.kube-system:~/wulin/wkload/usdt/conf/hive3.1.3/* /tmp/apache-hive-3.1.3-bin/conf/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc rm -r --force mios/dtp/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mc rb mios/dtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc mb mios/dtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc mb mios/dtp/hdp3.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc cp -r /tmp/hadoop-3.4.0/* mios/dtp/hdp3.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc mb mios/dtp/hive4.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc cp -r /tmp/apache-hive-4.0.0-bin/* mios/dtp/hive4.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc mb mios/dtp/hive3.1.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mc cp -r /tmp/apache-hive-3.1.3-bin/* mios/dtp/hive3.1.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restartPolicy: Never&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;cat wulin/wkload/usdt/pod-dtm1.yaml
apiVersion: v1
kind: Pod
metadata:
name: dtm1
namespace: kube-system
labels:
app: hdp
spec:
hostname: dtm1
subdomain: hdp
dnsPolicy: None
dnsConfig:
nameservers:
- 10.98.0.10
searches:
- hdp.kube-system.svc.k1.org
- kube-system.svc.k1.org
- svc.k1.org
volumes:
- name: nn
hostPath:
path: /var/dtm1-nn
- name: sn
hostPath:
path: /var/dtm1-sn
- name: hdpsys
hostPath:
path: /home/hdpsys
# emptyDir: {}
initContainers:
- name: volume-permissions
image: quay.io/cloudwalker/us.dt:24.01
command:
- /bin/sh
- -c
- |
chmod -R 755 /home/bigred/nn &amp;amp;&amp;amp; chown 1000:1000 /home/bigred/nn
chmod -R 755 /home/bigred/sn &amp;amp;&amp;amp; chown 1000:1000 /home/bigred/sn
volumeMounts:
- name: nn
mountPath: /home/bigred/nn
- name: sn
mountPath: /home/bigred/sn
containers:
- name: dtm1
image: quay.io/cloudwalker/us.dt:24.01
imagePullPolicy: Always
tty: true
securityContext:
privileged: true
volumeMounts:
- name: nn
mountPath: /home/bigred/nn
- name: sn
mountPath: /home/bigred/sn
- name: hdpsys
mountPath: /opt/dtp
mountPropagation: Bidirectional
- name: s3fs
image: quay.io/cloudwalker/alp.s3fs:24.01
imagePullPolicy: Always
securityContext:
privileged: true
volumeMounts:
- name: hdpsys
mountPath: /s3
mountPropagation: Bidirectional
env:
- name: USER
value: minio
- name: PASSWORD
value: minio123
- name: URL
value: http://miniosnsd.kube-system:9000
- name: BUCKET
value: dtp
- name: EXTARG
value: &amp;#34;-o uid=1000 -o gid=1000 -o umask=000&amp;#34;
- name: DEBUG
value: &amp;#34;-o dbglevel=info -o curldbg -f&amp;#34;
---&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>中華電信 POC</title><link>https://blog.kubeantony.com/archive/misc/%E4%B8%AD%E8%8F%AF%E9%9B%BB%E4%BF%A1-poc/</link><pubDate>Tue, 02 Apr 2024 05:40:46 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E4%B8%AD%E8%8F%AF%E9%9B%BB%E4%BF%A1-poc/</guid><description>
&lt;style&gt;
.indent-title-1{
margin-left: 1em;
}
.indent-title-2{
margin-left: 2em;
}
&lt;/style&gt;
&lt;h2&gt;驗測項目&lt;span class="hx:absolute hx:-mt-20" id="驗測項目"&gt;&lt;/span&gt;
&lt;a href="#%e9%a9%97%e6%b8%ac%e9%a0%85%e7%9b%ae" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;一、 安裝/管理議題：&lt;span class="hx:absolute hx:-mt-20" id="一-安裝管理議題"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%80-%e5%ae%89%e8%a3%9d%e7%ae%a1%e7%90%86%e8%ad%b0%e9%a1%8c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;底層作業系統為RHEL9主機 | 環境內連線需保持全程加密(SSL憑證) | 完成交付安裝建置文件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;完全離線架構下完成 RKE 叢集安裝，2個叢集 &amp;lt; RKE2架構｜v1.25版本｜ 3 control + 2 worker &amp;gt;（需包含 Elasticsearch、Grafana、cert-manager、hpa、istio、servicemesh、kiali、nmstate）&lt;/li&gt;
&lt;li&gt;透過 Racher 同時管理 2個最小架構 RKE2 ; 實現兩個叢集內同時部署 Deployment （基本 Nginx image）提供服務。&lt;/li&gt;
&lt;li&gt;透過 Prometheus/Grafana 監控 RKE2 運作狀況 ; 透過 Elasticsearch(EFK) 收容日誌並分析 ingress/叢集狀態。&lt;/li&gt;
&lt;li&gt;叢集/ingress 自動化憑證更新設置。&lt;/li&gt;
&lt;li&gt;ingress 限制同時間 Session 連線數量為 2000。&lt;/li&gt;
&lt;li&gt;RBAC 定義使用者角色 (Cluster-admin / project-admin / 限制project-admin無法查看secret ) 對應HTPASSWD帳號 ( rkeadmin / infra01 / ap001 )&lt;/li&gt;
&lt;li&gt;多租戶隔離 （負載管理/資源配額設定）&lt;/li&gt;
&lt;li&gt;測試告警發信&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;二、備份/還原議題：&lt;span class="hx:absolute hx:-mt-20" id="二備份還原議題"&gt;&lt;/span&gt;
&lt;a href="#%e4%ba%8c%e5%82%99%e4%bb%bd%e9%82%84%e5%8e%9f%e8%ad%b0%e9%a1%8c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;備份叢集組態資訊 (etcd)&lt;/li&gt;
&lt;li&gt;串接環境內提供 備份軟體 (Veritas/Veeam) 備份資料。 (可跳過)&lt;/li&gt;
&lt;li&gt;還原叢集組態設定。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三、升級議題：&lt;span class="hx:absolute hx:-mt-20" id="三升級議題"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%89%e5%8d%87%e7%b4%9a%e8%ad%b0%e9%a1%8c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;升級中透過迴圈持續打 nginx 網頁連線，測試網頁連線狀況。&lt;/li&gt;
&lt;li&gt;進行叢集升級 v1.25 &amp;gt; v1.26 &amp;gt; v1.27 測試升級時間及相關網頁連線狀況。&lt;/li&gt;
&lt;li&gt;退版測試 ( v1.27 &amp;gt; v1.26 )&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;實作&lt;/h1&gt;&lt;h2&gt;一、 安裝/管理議題&lt;span class="hx:absolute hx:-mt-20" id="一-安裝管理議題-1"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%80-%e5%ae%89%e8%a3%9d%e7%ae%a1%e7%90%86%e8%ad%b0%e9%a1%8c-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1.1. 完全離線架構下完成 RKE 叢集安裝，2個叢集 &amp;lt; RKE2架構｜v1.25版本｜ 3 control + 2 worker &amp;gt;（需包含 Elasticsearch、Grafana、cert-manager、hpa、istio、servicemesh[x]、kiali、nmstate[x]）&lt;span class="hx:absolute hx:-mt-20" id="11-完全離線架構下完成-rke-叢集安裝2個叢集--rke2架構v125版本-3-control--2-worker-需包含-elasticsearchgrafanacert-managerhpaistioservicemeshxkialinmstatex"&gt;&lt;/span&gt;
&lt;a href="#11-%e5%ae%8c%e5%85%a8%e9%9b%a2%e7%b7%9a%e6%9e%b6%e6%a7%8b%e4%b8%8b%e5%ae%8c%e6%88%90-rke-%e5%8f%a2%e9%9b%86%e5%ae%89%e8%a3%9d2%e5%80%8b%e5%8f%a2%e9%9b%86--rke2%e6%9e%b6%e6%a7%8bv125%e7%89%88%e6%9c%ac-3-control--2-worker-%e9%9c%80%e5%8c%85%e5%90%ab-elasticsearchgrafanacert-managerhpaistioservicemeshxkialinmstatex" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h3&gt;1.1.1. 準備 Harbor 並將 Container Images 都上傳進去&lt;span class="hx:absolute hx:-mt-20" id="111-準備-harbor-並將-container-images-都上傳進去"&gt;&lt;/span&gt;
&lt;a href="#111-%e6%ba%96%e5%82%99-harbor-%e4%b8%a6%e5%b0%87-container-images-%e9%83%bd%e4%b8%8a%e5%82%b3%e9%80%b2%e5%8e%bb" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;一台機器，最低規格: 4 CORE, 8G RAM, 250G Disk (建議 300G 以上)&lt;/li&gt;
&lt;li&gt;Disk 檔案系統為 Btrfs，需啟動 LVM，將 &lt;code&gt;/&lt;/code&gt; 目錄的可用空間設為 270G ，&lt;code&gt;/home&lt;/code&gt; 目錄 30G&lt;/li&gt;
&lt;li&gt;須能上網&lt;/li&gt;
&lt;li&gt;檢查 Docker 儲存 Image 的目錄應為 &lt;code&gt;/var/lib/docker&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 確認 Docker 儲存 Image 的目錄
$ sudo docker info -f &amp;#39;{{ .DockerRootDir}}&amp;#39;
# 檢查目錄的儲存容量
$ lsblk -o NAME,SIZE,MOUNTPOINTS
# 檢查 Docker 儲存 Image 目前已使用多大的儲存空間
$ sudo docker system df
# Download Git Repo
$ git clone https://github.com/braveantony/Prepare-AirGap-Installer.git &amp;amp;&amp;amp; \
cd Prepare-AirGap-Installer/ &amp;amp;&amp;amp; \
chmod &amp;#43;x *.sh
# 準備 harbor、rke2 和 Rancher 全離線安裝包
./podman-prepare.sh all
# 檢查是否符合預期
ls -lh compressed_files/
total 27G
-rw-r--r-- 1 rancher users 1.3G Mar 15 13:01 harbor-offline-v2.10.0.tar.gz
-rw-r--r-- 1 rancher users 25G Mar 15 11:47 rancher-airgap-v2.8.2.tar.gz
-rw-r--r-- 1 rancher users 956M Mar 15 13:59 rke2-airgap-v1.27.11.tar.gz
# SSH 連線至 Harbor 主機
$ ssh rancher@192.168.11.191
# 解壓縮 Harbor 全離線安裝包
$ tar -zxvf harbor-offline-v2.10.0.tar.gz &amp;amp;&amp;amp; cd harbor/v2.10.0
# 將 docker-compose 移至 PATH 目錄中，並修改權限
$ sudo mv docker-compose-linux-x86_64 /usr/bin/docker-compose &amp;amp;&amp;amp; sudo chmod 755 /usr/bin/docker-compose
# 解壓縮 harbor-offline-installer
$ tar -xvf harbor-offline-installer-v2.10.0.tgz harbor/; cd harbor/
# Generate a Certificate Authority Certificate
## Generate a CA certificate private key.
$ openssl genrsa -out ca.key 4096
## Generate the CA certificate.
$ openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj &amp;#34;/C=TW/ST=Taiwan/L=Taipei/O=example/OU=lab/CN=harbor.example.com&amp;#34; \
-key ca.key \
-out ca.crt
# Generate a Server Certificate
## Generate a private key.
$ openssl genrsa -out server.key 4096
## Generate a certificate signing request (CSR).
$ openssl req -sha512 -new \
-subj &amp;#34;/C=TW/ST=Taiwan/L=Taipei/O=example/OU=lab/CN=harbor.example.com&amp;#34; \
-key server.key \
-out server.csr
## Generate an x509 v3 extension file.
$ cat &amp;gt; v3.ext &amp;lt;&amp;lt;-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.example.com
DNS.2=example.com
DNS.3=harbor
EOF
## Use the v3.ext file to generate a certificate for your Harbor host.
$ openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
# Copy the server certificate and key into the certficates folder on your Harbor host.
$ sudo cp ca.crt /usr/share/pki/trust/anchors/ &amp;amp;&amp;amp; sudo cp ca.crt /etc/pki/trust/anchors/ &amp;amp;&amp;amp; sudo update-ca-certificates --fresh
# Convert server.crt to server.cert, for use by Docker.
$ openssl x509 -inform PEM -in server.crt -out server.cert
# Copy the server certificate, key and CA files into the Docker certificates folder on the Harbor host. You must create the appropriate folders first.
$ sudo mkdir -p /etc/docker/certs.d/example.com/ &amp;amp;&amp;amp; \
sudo cp server.cert /etc/docker/certs.d/example.com/ &amp;amp;&amp;amp; \
sudo cp server.key /etc/docker/certs.d/example.com/ &amp;amp;&amp;amp; \
sudo cp ca.crt /etc/docker/certs.d/example.com/ &amp;amp;&amp;amp; \
sudo systemctl restart docker
# 設定 harbor.yml
$ cp harbor.yml.tmpl harbor.yml &amp;amp;&amp;amp; nano harbor.yml
5 hostname: harbor.example.com
17 certificate: /etc/docker/certs.d/example.com/server.cert
18 private_key: /etc/docker/certs.d/example.com/server.key
# 安裝 Harbor
$ sudo ./install.sh --with-trivy
# 檢查 Harbor 服務運作狀態
$ sudo docker-compose ps
# 設定 Harbor 在機器開機時自動啟動
$ cat &amp;lt;&amp;lt;EOF | sudo tee /usr/lib/systemd/system/harbor.service &amp;amp;&amp;amp; sudo systemctl enable harbor --now
[Unit]
Description=Harbor start at boot
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF
# Login Harbor
$ sudo docker login harbor.example.com
# Create Harbor Project
$ curl -k -u &amp;#34;admin:Harbor12345&amp;#34; -X POST \
-H &amp;#34;Content-Type: application/json&amp;#34; \
&amp;#34;https://172.20.0.40.nip.io/api/v2.0/projects&amp;#34; \
-d &amp;#34;{\&amp;#34;project_name\&amp;#34;: \&amp;#34;rancher\&amp;#34;, \&amp;#34;metadata\&amp;#34;: {\&amp;#34;public\&amp;#34;: \&amp;#34;true\&amp;#34;}, \&amp;#34;storage_limit\&amp;#34;: -1}&amp;#34;
# 解壓縮 rancher 全離線安裝包
$ tar -xzvf ~/rancher-airgap-v2.8.2.tar.gz &amp;amp;&amp;amp; \
cd rancher/v2.8.2/
# Push Images to Harbor
$ rancher_image=$(sudo docker images --format &amp;#34;{{.Repository}}:{{.Tag}}&amp;#34; | grep &amp;#39;^harbor.example.com&amp;#39;)
$ for r in $rancher_image; do sudo docker push &amp;#34;${r}&amp;#34; || ( echo &amp;#34;${r}&amp;#34; push fail &amp;gt;&amp;gt; push.log &amp;amp;&amp;amp;
exit 1); done&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.2. 安裝 Upstream Cluster - RKE2 and Rancher&lt;span class="hx:absolute hx:-mt-20" id="112-安裝-upstream-cluster---rke2-and-rancher"&gt;&lt;/span&gt;
&lt;a href="#112-%e5%ae%89%e8%a3%9d-upstream-cluster---rke2-and-rancher" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# SSH 連線至 RKE2 主機
$ ssh rancher@192.168.11.185
# Configure DNS
$ sudo yast2 dns edit nameserver1=192.168.11.85
# 檢查 Harbor 和 Rancher 的名稱解析
$ dig @192.168.11.85 harbor.example.com &amp;#43;short
192.168.11.191
$ dig @192.168.11.85 rancher.example.com &amp;#43;short
192.168.11.185
# 解壓縮 rke2 全離線安裝包
$ tar -zxvf rke2-airgap-v1.27.11.tar.gz &amp;amp;&amp;amp; cd rke2/v1.27.11/
# 將 RKE2 全離線安裝包的物件，搬移至 /root/rke2-artifacts/
$ sudo mkdir /root/rke2-artifacts &amp;amp;&amp;amp; sudo mv * /root/rke2-artifacts/
# 切換為 root 使用者，並將工作目錄切換至 /root/rke2-artifacts/
$ sudo su
$ cd /root/rke2-artifacts/
# 執行 RKE2 安裝腳本
$ INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh
# 設定 RKE2 Node 之基本組態檔
$ mkdir -p /etc/rancher/rke2/ &amp;amp;&amp;amp; nano /etc/rancher/rke2/config.yaml
node-name:
- &amp;#34;rms&amp;#34;
token: my-shared-secret
$ exit
# Setup kubeconfig and kubectl
$ cd ~ &amp;amp;&amp;amp; mkdir ~/.kube &amp;amp;&amp;amp; \
sudo cp /etc/rancher/rke2/rke2.yaml .kube/config &amp;amp;&amp;amp; \
sudo chown rancher .kube/config &amp;amp;&amp;amp; \
sudo cp /var/lib/rancher/rke2/bin/* /usr/local/bin/
# 檢視 node 狀態
$ kubectl get nodes
# 安裝 Rancher Prime v2.8.2
$ tar -zxvf rancher-airgap-v2.8.2.tar.gz &amp;amp;&amp;amp; cd rancher/v2.8.2/
$ rm rancher-v2.8.2-image.tar.gz rancher-*-images.sh
$ tar -zxvf helm-v3.14.2-linux-amd64.tar.gz &amp;amp;&amp;amp; \
sudo cp linux-amd64/helm /usr/local/bin/
$ helm template cert-manager ./cert-manager-v1.11.0.tgz --output-dir . \
--namespace cert-manager \
--set image.repository=rancher/cert-manager-controller \
--set webhook.image.repository=rancher/cert-manager-webhook \
--set cainjector.image.repository=rancher/cert-manager-cainjector \
--set startupapicheck.image.repository=rancher/cert-manager-ctl \
--set installCRDs=true
$ kubectl create ns cert-manager
$ kubectl apply -R -f cert-manager/
$ kubectl -n cert-manager get pods
NAME READY STATUS RESTARTS AGE
cert-manager-554d4bf957-fqmtw 1/1 Running 0 4m21s
cert-manager-cainjector-687f649756-2jf92 1/1 Running 0 4m21s
cert-manager-startupapicheck-88t2l 0/1 Completed 0 17m
cert-manager-webhook-5d6598d446-tgkb7 1/1 Running 0 4m21s
$ helm template --validate rancher ./rancher-2.8.2.tgz --output-dir . --no-hooks --namespace cattle-system --set hostname=rancher.example.com --set certmanager.version=1.11.0 --set rancherImage=rancher/rancher --set systemDefaultRegistry=harbor.example.com --set useBundledSystemChart=true --set replicas=1
$ kubectl create namespace cattle-system
$ kubectl -n cattle-system apply -R -f rancher/
$ kubectl -n cattle-system get pods
NAME READY STATUS RESTARTS AGE
helm-operation-84qp9 0/2 Completed 0 2m15s
helm-operation-8588v 0/2 Completed 0 2m46s
helm-operation-dssm7 0/2 Completed 0 2m8s
helm-operation-qksdk 0/2 Completed 0 99s
rancher-594796d65c-rk8nk 1/1 Running 0 4m46s
rancher-webhook-6fbb4fc4cc-8ts9m 1/1 Running 0 2m3s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.3. 建立 DownStream Cluster&lt;span class="hx:absolute hx:-mt-20" id="113-建立-downstream-cluster"&gt;&lt;/span&gt;
&lt;a href="#113-%e5%bb%ba%e7%ab%8b-downstream-cluster" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;環境準備&lt;span class="hx:absolute hx:-mt-20" id="環境準備"&gt;&lt;/span&gt;
&lt;a href="#%e7%92%b0%e5%a2%83%e6%ba%96%e5%82%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 永久關閉防火牆
$ sudo systemctl disable --now firewalld.service
# 設定 NTP Client
$ sudo sed -i &amp;#39;3s|^|# |g&amp;#39; /etc/chrony.conf
$ sudo sed -i &amp;#39;4iserver 192.168.11.85&amp;#39; /etc/chrony.conf
$ sudo systemctl enable --now chronyd.service
$ sudo systemctl restart chronyd.service
$ systemctl is-active chronyd.service
active
$ chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? 192.168.11.85 11 6 1 13 -9053m[ -9053m] &amp;#43;/- 12ms
$ timedatectl
Local time: Wed 2024-03-13 02:32:52 CST
Universal time: Tue 2024-03-12 18:32:52 UTC
RTC time: Tue 2024-03-19 01:26:12
Time zone: Asia/Taipei (CST, &amp;#43;0800)
System clock synchronized: no
NTP service: active
RTC in local TZ: no&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;將註冊指命分別貼到 5 台 node 上&lt;/p&gt;
&lt;p&gt;設定 kubectl&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo cp /var/lib/rancher/rke2/bin/* /usr/local/bin/
$ mkdir -p $HOME/.kube &amp;amp;&amp;amp; sudo cp /etc/rancher/rke2/rke2.yaml $HOME/.kube/config &amp;amp;&amp;amp; sudo chown $(id -u):$(id -g) $HOME/.kube/config&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.4. 準備和測試 elasticsearch&lt;span class="hx:absolute hx:-mt-20" id="114-準備和測試-elasticsearch"&gt;&lt;/span&gt;
&lt;a href="#114-%e6%ba%96%e5%82%99%e5%92%8c%e6%b8%ac%e8%a9%a6-elasticsearch" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Helm install elasticsearch
# prepare node
$ mkdir -p ~/work/elasticsearch/8.5.1 &amp;amp;&amp;amp; cd ~/work/elasticsearch/8.5.1
$ helm repo add elastic https://helm.elastic.co &amp;amp;&amp;amp; \
helm repo update
$ helm fetch elastic/elasticsearch
$ helm template elasticsearch-*.tgz | awk &amp;#39;$1 ~ /image:/ {print $2}&amp;#39; | sed -e &amp;#39;s/\&amp;#34;//g&amp;#39;
docker.elastic.co/elasticsearch/elasticsearch:8.5.1
$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:8.5.1
$ sudo docker images docker.elastic.co/elasticsearch/elasticsearch:8.5.1
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/elasticsearch/elasticsearch 8.5.1 9d4620cd27bd 16 months ago 1.29 GB
$ sudo docker save harbor.example.com/elasticsearch/elasticsearch:8.5.1 | gzip --stdout &amp;gt; el
asticsearch-images-8.5.1.tar.gz
$ ls -lh
total 588M
-rw-r--r-- 1 rancher users 29K Mar 19 10:16 elasticsearch-8.5.1.tgz
-rw-r--r-- 1 rancher users 588M Mar 19 10:41 elasticsearch-images-8.5.1.tar.gz
$ cd ../..; tar -czvf compressed_files/elasticsearch-airgap-8.5.1.tar.gz elasticsearch/8.5.1
# 先在 Harbor 上建立 elasticsearch 專案
$ sudo docker push harbor.example.com/elasticsearch/elasticsearch:8.5.1
$ scp compressed_files/elasticsearch-airgap-8.5.1.tar.gz rancher@192.168.11.180:~
# on kubectl node
$ tar -zxvf elasticsearch-airgap-8.5.1.tar.gz &amp;amp;&amp;amp; \
cd elasticsearch/8.5.1/
$ helm template elasticsearch ./elasticsearch-8.5.1.tgz --output-dir . \
--namespace elasticsearch --create-namespace \
--set image=harbor.example.com/elasticsearch/elasticsearch \
--set replicas=2
$ sed -i &amp;#39;s|docker.elastic.co|harbor.example.com|g&amp;#39; ./elasticsearch/templates/test/test-elasticsearch-health.yaml
$ cat &amp;lt;&amp;lt;EOF &amp;gt; elasticsearch-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: elasticsearch-0
spec:
capacity:
storage: 30Gi
accessModes:
- ReadWriteOnce
local:
path: &amp;#34;/var/lib/elasticsearch-0&amp;#34;
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: In
values:
- &amp;#39;true&amp;#39;
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: elasticsearch-1
spec:
capacity:
storage: 30Gi
accessModes:
- ReadWriteOnce
local:
path: &amp;#34;/var/lib/elasticsearch-1&amp;#34;
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: In
values:
- &amp;#39;true&amp;#39;
EOF
$ kubectl create -f elasticsearch-pv.yaml
# 前往 worker 主機建 PV 宣告的目錄
$ ssh rancher@192.168.11.183 &amp;#39;sudo mkdir -p /var/lib/{elasticsearch-0,elasticsearch-1}&amp;#39;
$ ssh rancher@192.168.11.184 &amp;#39;sudo mkdir -p /var/lib/{elasticsearch-0,elasticsearch-1}&amp;#39;
$ kubectl apply -R -f elasticsearch/
$ kubectl replace -f elasticsearch/templates/test/test-elasticsearch-health.yaml --force
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
elasticsearch-jqhml-test 0/1 Completed 0 6s
elasticsearch-master-0 1/1 Running 0 4m8s
elasticsearch-master-1 1/1 Running 0 4m8s
elasticsearch-ppxis-test 0/1 Completed 0 6s
elasticsearch-zskgi-test 0/1 Completed 0 7s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;RUN Local Elastic Package Registry&lt;span class="hx:absolute hx:-mt-20" id="run-local-elastic-package-registry"&gt;&lt;/span&gt;
&lt;a href="#run-local-elastic-package-registry" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir -p ~/work/elasticsearch-package-registry/8.5.3 &amp;amp;&amp;amp; cd ~/work/elasticsearch-package-registry/8.5.3
# Pull the Docker image from the public Docker registry:
$ sudo docker pull docker.elastic.co/package-registry/distribution:8.5.3
$ sudo docker images docker.elastic.co/package-registry/distribution:8.5.3
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/package-registry/distribution 8.5.3 e37a947c8f56 15 months ago 2.64GB
$ sudo docker tag docker.elastic.co/package-registry/distribution:8.5.3 harbor.example.com/package-registry/distribution:8.5.3
$ sudo docker save harbor.example.com/package-registry/distribution:8.5.3 | gzip --stdout &amp;gt; ../../compressed_files/package-registry-images-8.5.3.tar.gz
$ ls -lh ../../compressed_files/package-registry-images-8.5.3.tar.gz
-rw-r--r-- 1 rancher users 1.9G Mar 25 15:09 ../../compressed_files/package-registry-images-8.5.3.tar.gz
$ sudo docker load &amp;lt; package-registry-images-8.5.3.tar.gz
$ sudo docker push harbor.example.com/package-registry/distribution:8.5.3
$ sudo docker run -d -p 8080:8080 harbor.example.com/package-registry/distribution:8.5.3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.5. 準備和測試 kiali&lt;span class="hx:absolute hx:-mt-20" id="115-準備和測試-kiali"&gt;&lt;/span&gt;
&lt;a href="#115-%e6%ba%96%e5%82%99%e5%92%8c%e6%b8%ac%e8%a9%a6-kiali" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Helm install kiali
$ helm repo add kiali https://kiali.org/helm-charts &amp;amp;&amp;amp; \
helm repo update
$ helm fetch kiali/kiali-operator
$ helm template kiali-operator-*.tgz | awk &amp;#39;$1 ~ /image:/ {print $2}&amp;#39; | sed -e &amp;#39;s/\&amp;#34;//g&amp;#39;
quay.io/kiali/kiali-operator:v1.81.0
$ sudo podman pull quay.io/kiali/kiali-operator:v1.81.0
$ sudo docker images quay.io/kiali/kiali-operator:v1.81.0
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/kiali/kiali-operator v1.81.0 1434ee8c1d9f 2 weeks ago 764MB&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.6. 準備和測試 Grafana&lt;span class="hx:absolute hx:-mt-20" id="116-準備和測試-grafana"&gt;&lt;/span&gt;
&lt;a href="#116-%e6%ba%96%e5%82%99%e5%92%8c%e6%b8%ac%e8%a9%a6-grafana" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;直接透過 Rancher 裝 &lt;strong&gt;Monitoring&lt;/strong&gt; cluster tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1.7. 準備和測試 istio、servicemesh、kiali&lt;span class="hx:absolute hx:-mt-20" id="117-準備和測試-istioservicemeshkiali"&gt;&lt;/span&gt;
&lt;a href="#117-%e6%ba%96%e5%82%99%e5%92%8c%e6%b8%ac%e8%a9%a6-istioservicemeshkiali" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在 Rancher 介面安裝 Istio Cluster Tools 即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1.8. 測試 hpa&lt;span class="hx:absolute hx:-mt-20" id="118-測試-hpa"&gt;&lt;/span&gt;
&lt;a href="#118-%e6%b8%ac%e8%a9%a6-hpa" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Run and expose nginx web server
$ cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: harbor.example.com/rancher/library-nginx:1.19.2-alpine
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
run: nginx
spec:
ports:
- port: 80
selector:
run: nginx
EOF
# Create the HorizontalPodAutoscaler
$ kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
$ kubectl get hpa
# Increase the load
$ kubectl create deployment load-generator --image=harbor.example.com/rancher/mirrored-library-busybox:1.36.1 -- /bin/sh -c &amp;#34;while sleep 0.01; do wget -q -O- http://nginx; done&amp;#34;
$ kubectl scale deploy load-generator --replicas=10
$ kubectl scale deploy load-generator --replicas=20
$ kubectl scale deploy load-generator --replicas=30
$ kubectl scale deploy load-generator --replicas=40
$ kubectl scale deploy load-generator --replicas=50
$ kubectl scale deploy load-generator --replicas=60
# more replicas
$ kubectl get hpa nginx
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 29%/50% 1 10 2 36m
# Stop generating load
$ kubectl scale deploy load-generator --replicas=0
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 1 89m&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.1.9. 準備和測試 nmstate&lt;span class="hx:absolute hx:-mt-20" id="119-準備和測試-nmstate"&gt;&lt;/span&gt;
&lt;a href="#119-%e6%ba%96%e5%82%99%e5%92%8c%e6%b8%ac%e8%a9%a6-nmstate" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# on prepare node
$ mkdir -p ~/work/nmstate/v0.81.0 &amp;amp;&amp;amp; cd ~/work/nmstate/v0.81.0
$ curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/nmstate.io_nmstates.yaml &amp;amp;&amp;amp; \
curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/namespace.yaml &amp;amp;&amp;amp; \
curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/service_account.yaml &amp;amp;&amp;amp; \
curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/role.yaml &amp;amp;&amp;amp; \
curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/role_binding.yaml &amp;amp;&amp;amp; \
curl -# -OL https://github.com/nmstate/kubernetes-nmstate/releases/download/v0.81.0/operator.yaml
$ cat ./* | grep image:
image: quay.io/nmstate/kubernetes-nmstate-operator:v0.81.0
$ sudo docker pull quay.io/nmstate/kubernetes-nmstate-operator:v0.81.0
$ sudo docker tag quay.io/nmstate/kubernetes-nmstate-operator:v0.81.0 harbor.example.com/nmstate/kubernetes-nmstate-operator:v0.81.0
# 先在 Harbor 建立一個 nmstate 專案
$ sudo docker push harbor.example.com/nmstate/kubernetes-nmstate-operator:v0.81.0
$ sudo docker save harbor.example.com/nmstate/kubernetes-nmstate-operator:v0.81.0 | gzip --stdout &amp;gt; nmstate-images.v0.81.0.tar.gz
$ cd ../..; tar -czvf compressed_files/nmstate-airgap-v0.81.0.tar.gz nmstate/v0.81.0
$ ls -lh compressed_files/nmstate-airgap-v0.81.0.tar.gz
-rw-r--r-- 1 rancher users 55M Mar 19 15:56 compressed_files/nmstate-airgap-v0.81.0.tar.gz
# on kubectl node
$ tar -zxvf nmstate-airgap-v0.81.0.tar.gz &amp;amp;&amp;amp; cd nmstate/v0.81.0
$ kubectl apply -f ./
# Configure Image Repo
$ sed -i &amp;#39;s|quay.io|harbor.example.com|g&amp;#39; operator.yaml
$ kubectl -n nmstate get pods
NAME READY STATUS RESTARTS AGE
nmstate-operator-77c48bc498-jjntx 1/1 Running 0 16s
$ cat &amp;lt;&amp;lt;EOF | kubectl create -f -
apiVersion: nmstate.io/v1
kind: NMState
metadata:
name: nmstate
EOF
$ kubectl -n nmstate get NMState
NAME AGE
nmstate 36s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Helm install kibana
# prepare node
$ mkdir -p ~/work/kibana/8.5.1 &amp;amp;&amp;amp; cd ~/work/kibana/8.5.1
$ helm repo add elastic https://helm.elastic.co &amp;amp;&amp;amp; \
helm repo update
$ helm fetch elastic/kibana
$ helm template kibana-*.tgz | awk &amp;#39;$1 ~ /image:/ {print $2}&amp;#39; | sed -e &amp;#39;s/\&amp;#34;//g&amp;#39;
docker.elastic.co/kibana/kibana:8.5.1
$ sudo docker pull docker.elastic.co/kibana/kibana:8.5.1
$ sudo docker images docker.elastic.co/kibana/kibana:8.5.1
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/kibana/kibana 8.5.1 1a5dbfe4bf27 16 months ago 707MB
$ sudo docker save docker.elastic.co/kibana/kibana:8.5.1 | gzip --stdout &amp;gt; kibana-images-8.5.1.tar.gz
$ cd ../..; tar -czvf compressed_files/kibana-airgap-8.5.1.tar.gz kibana/8.5.1
# Helm install logstash
# prepare node
$ mkdir -p ~/work/logstash/8.5.1 &amp;amp;&amp;amp; cd ~/work/logstash/8.5.1
$ helm repo add elastic https://helm.elastic.co &amp;amp;&amp;amp; \
helm repo update
$ helm fetch elastic/logstash
$ helm template logstash-*.tgz | awk &amp;#39;$1 ~ /image:/ {print $2}&amp;#39; | sed -e &amp;#39;s/\&amp;#34;//g&amp;#39;
docker.elastic.co/kibana/kibana:8.5.1
$ sudo docker pull docker.elastic.co/logstash/logstash:8.5.1
$sudo docker images docker.elastic.co/logstash/logstash:8.5.1
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/logstash/logstash 8.5.1 db6effbaf70b 16 months ago 746MB
$ sudo docker save docker.elastic.co/logstash/logstash:8.5.1 | gzip --stdout &amp;gt; logstash-images-8.5.1.tar.gz
$ cd ../..; tar -czvf compressed_files/logstash-airgap-8.5.1.tar.gz logstash/8.5.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.2. 實現兩個叢集內同時部署 Deployment （基本 Nginx image）提供服務。&lt;span class="hx:absolute hx:-mt-20" id="12-實現兩個叢集內同時部署-deployment-基本-nginx-image提供服務"&gt;&lt;/span&gt;
&lt;a href="#12-%e5%af%a6%e7%8f%be%e5%85%a9%e5%80%8b%e5%8f%a2%e9%9b%86%e5%85%a7%e5%90%8c%e6%99%82%e9%83%a8%e7%bd%b2-deployment-%e5%9f%ba%e6%9c%ac-nginx-image%e6%8f%90%e4%be%9b%e6%9c%8d%e5%8b%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo yum install git
# generate a private ssh key
$ ssh-keygen -t rsa -b 4096 -m pem -C &amp;#34;user@email.com&amp;#34; -P &amp;#39;&amp;#39;
$ kubectl create secret generic ssh-key -n fleet-default \
--from-file=ssh-privatekey=/home/rancher/.ssh/id_rsa \
--from-file=ssh-publickey=/home/rancher/.ssh/id_rsa.pub \
--type=kubernetes.io/ssh-auth
$ mkdir -p ~/fleet &amp;amp;&amp;amp; \
cd ~/fleet &amp;amp;&amp;amp; \
git config --global user.name &amp;#34;bobo&amp;#34; &amp;amp;&amp;amp; \
git config --global user.email &amp;#34;bobo@example.com&amp;#34; &amp;amp;&amp;amp; \
git config --global core.editor &amp;#34;nano&amp;#34; &amp;amp;&amp;amp; \
git config --list
$ git init
$ cat &amp;lt;&amp;lt;EOF &amp;gt; deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: hello-nginx
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: harbor.example.com/rancher/library-nginx:1.19.2-alpine
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
EOF
$ cat &amp;lt;&amp;lt;EOF &amp;gt; namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: hello-nginx
EOF
$ cat &amp;lt;&amp;lt;EOF &amp;gt; service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
run: nginx
namepsace: hello-nginx
spec:
ports:
- port: 80
selector:
run: nginx
EOF
$ git add . &amp;amp;&amp;amp; git commit -m &amp;#34;init repo&amp;#34;
# Create Cluster Groups
1. 在左側選單點選 Cluster Groups
2. 點選 Create 按鈕
Cluster Group: Create page will be displayed.
3. For the Name, enter rke2-group
4. 點選 Add Rule 然後輸入以下訊息 :
Key: provider.cattle.io
Operator: in list
Value: rke2
Notice the following message displayed:
Matches all 2 existing clusters
5. 點選 Create
# Configure a Git Repo
1. 在左側選單點選 Git Repos
2. 點選 Add Repository 按鈕
3. 輸入以下訊息
Name: hello-nginx
Repository URL: ssh://192.168.11.185/home/rancher/fleet
Branch Name master
Paths Add Path → hello-rancher
Deploy To rke-group
4. 點選 Create.
You will see the State starting with GitUpdating, then changing to Active.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.3. 透過 Prometheus/Grafana 監控 RKE2 運作狀況 ; 透過 Elasticsearch(EFK) 收容日誌並分析 ingress/叢集狀態。&lt;span class="hx:absolute hx:-mt-20" id="13-透過-prometheusgrafana-監控-rke2-運作狀況--透過-elasticsearchefk-收容日誌並分析-ingress叢集狀態"&gt;&lt;/span&gt;
&lt;a href="#13-%e9%80%8f%e9%81%8e-prometheusgrafana-%e7%9b%a3%e6%8e%a7-rke2-%e9%81%8b%e4%bd%9c%e7%8b%80%e6%b3%81--%e9%80%8f%e9%81%8e-elasticsearchefk-%e6%94%b6%e5%ae%b9%e6%97%a5%e8%aa%8c%e4%b8%a6%e5%88%86%e6%9e%90-ingress%e5%8f%a2%e9%9b%86%e7%8b%80%e6%85%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;離線裝 Elasticsearch&lt;span class="hx:absolute hx:-mt-20" id="離線裝-elasticsearch"&gt;&lt;/span&gt;
&lt;a href="#%e9%9b%a2%e7%b7%9a%e8%a3%9d-elasticsearch" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;點選 apps -&amp;gt; Charts -&amp;gt; Elasticsearch -&amp;gt; install&lt;/p&gt;
&lt;p&gt;values.yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;image: harbor.example.com/elasticsearch/elasticsearch
...
replicas: 2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;離線安裝 kibana&lt;span class="hx:absolute hx:-mt-20" id="離線安裝-kibana"&gt;&lt;/span&gt;
&lt;a href="#%e9%9b%a2%e7%b7%9a%e5%ae%89%e8%a3%9d-kibana" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;點選 apps -&amp;gt; Charts -&amp;gt; kibana -&amp;gt; install&lt;/p&gt;
&lt;p&gt;values.yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;image: harbor.example.com/kibana/kibana # 全離線再改
...
kibanaConfig:
kibana.yml: |
xpack.fleet.registryUrl: http://192.168.11.191:8080
...
service:
type: NodePort&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;安裝 Rancher Logging&lt;span class="hx:absolute hx:-mt-20" id="安裝-rancher-logging"&gt;&lt;/span&gt;
&lt;a href="#%e5%ae%89%e8%a3%9d-rancher-logging" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;點選 Cluster Tools -&amp;gt; Logging -&amp;gt; Install&lt;/p&gt;
&lt;p&gt;values.yaml&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;fluentbit:
...
inputTail:
Buffer_Chunk_Size: 1MB
Buffer_Max_Size: 5MB
...
resources:
limits:
cpu: &amp;#34;2&amp;#34;
memory: 2Gi
requests:
cpu: &amp;#34;1&amp;#34;
memory: 1Gi
fluentd:
...
resources:
limits:
cpu: &amp;#34;2&amp;#34;
memory: 2Gi
requests:
cpu: &amp;#34;1&amp;#34;
memory: 1Gi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;Run nginx&lt;span class="hx:absolute hx:-mt-20" id="run-nginx"&gt;&lt;/span&gt;
&lt;a href="#run-nginx" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl run nginx --image=harbor.example.com/rancher/library-nginx:1.19.2-alpine -l run=nginx
$ kubectl get pods -l run=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 2m23s 10.42.44.2 k2w1 &amp;lt;none&amp;gt; &amp;lt;none&amp;gt;
$ NGINX_PodIP=$(kubectl get pods -l run=nginx -o custom-columns=POD_IP:.status.podIP --no-headers)
$ curl http://$NGINX_PodIP&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;建立與設定 ClusterOutput&lt;span class="hx:absolute hx:-mt-20" id="建立與設定-clusteroutput"&gt;&lt;/span&gt;
&lt;a href="#%e5%bb%ba%e7%ab%8b%e8%88%87%e8%a8%ad%e5%ae%9a-clusteroutput" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Logging -&amp;gt; ClusterOutputs -&amp;gt; Create&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Name: &lt;code&gt;cluster-output-e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Output: &lt;code&gt;Elasticsearch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Target.Scheme: &lt;code&gt;https&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Target.Host: &lt;code&gt;elasticsearch-master.cattle-logging-system.svc.cluster.local&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Target.Port: &lt;code&gt;9200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Index Name: &lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Access.User: &lt;code&gt;elastic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Access.Password from Secret: &lt;code&gt;elasticsearch-master-credentials&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Access.Key: &lt;code&gt;password&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Connection: 取消勾選 &lt;code&gt;Verify SSL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;點選 &lt;code&gt;Create&lt;/code&gt; 按鈕&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/H15weUzJR.png" alt="image" loading="lazy" /&gt;
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SkZFgLGyR.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h4&gt;建立與設定 ClusterFlows&lt;span class="hx:absolute hx:-mt-20" id="建立與設定-clusterflows"&gt;&lt;/span&gt;
&lt;a href="#%e5%bb%ba%e7%ab%8b%e8%88%87%e8%a8%ad%e5%ae%9a-clusterflows" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Logging -&amp;gt; ClusterFlows -&amp;gt; Create&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Name: &lt;code&gt;clusterflow-nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Matches.Pod Label Key: &lt;code&gt;run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Matches.Pod Label Value: &lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Outputs.Cluster Outputs: &lt;code&gt;cluster-output-e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;點選 &lt;code&gt;Create&lt;/code&gt; 按鈕&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/B1Ea-Lf10.png" alt="image" loading="lazy" /&gt;
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/B17AZ8zyR.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;等新建立的 &lt;code&gt;rancher-logging-root-fluentd-configcheck-*&lt;/code&gt; Pod Completed 之後，&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ while true; do curl $NGINX_PodIP &amp;amp;&amp;gt; /dev/null; done &amp;amp;
# 停止 while true loop
$ kill $!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;連線至 kibana&lt;span class="hx:absolute hx:-mt-20" id="連線至-kibana"&gt;&lt;/span&gt;
&lt;a href="#%e9%80%a3%e7%b7%9a%e8%87%b3-kibana" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Service 找到 &lt;code&gt;kibana-kibana&lt;/code&gt; ，直接點 &lt;code&gt;NodePort&lt;/code&gt;，就會連線到 kibana 的網站。
登入的帳號密碼存在 &lt;code&gt;cattle-logging-system&lt;/code&gt; Namespace 底下的 &lt;code&gt;elasticsearch-master-credentials&lt;/code&gt; 這個 Secret 中。
要 Add Integrations -&amp;gt; 選擇 Kibana -&amp;gt; Settings -&amp;gt; Install&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/Hk_3DqfJC.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;大概過 3 分鐘後，連到 kibana 網站，點選 漢堡排 -&amp;gt; Stack Management -&amp;gt; Index Management&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/B13uk9MkA.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h4&gt;建立 kibana view data&lt;span class="hx:absolute hx:-mt-20" id="建立-kibana-view-data"&gt;&lt;/span&gt;
&lt;a href="#%e5%bb%ba%e7%ab%8b-kibana-view-data" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;漢堡排 -&amp;gt; Stack Management -&amp;gt; Kibana -&amp;gt; Data View -&amp;gt; Create Data view&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Name: &lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Index pattern: &lt;code&gt;nginx*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;Save data view to Kibana&lt;/code&gt; 按鈕&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/ByQO38MJ0.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h4&gt;查詢 log&lt;span class="hx:absolute hx:-mt-20" id="查詢-log"&gt;&lt;/span&gt;
&lt;a href="#%e6%9f%a5%e8%a9%a2-log" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;漢堡排 -&amp;gt; Dev Tools -&amp;gt; Console&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;POST /nginx/_search
{
&amp;#34;query&amp;#34;: {
&amp;#34;match_all&amp;#34;: {}
}
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/BkUZp8GJ0.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;1.4. 叢集/ingress 自動化憑證更新設置&lt;span class="hx:absolute hx:-mt-20" id="14-叢集ingress-自動化憑證更新設置"&gt;&lt;/span&gt;
&lt;a href="#14-%e5%8f%a2%e9%9b%86ingress-%e8%87%aa%e5%8b%95%e5%8c%96%e6%86%91%e8%ad%89%e6%9b%b4%e6%96%b0%e8%a8%ad%e7%bd%ae" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;安裝 Cert-manager 步驟: Apps -&amp;gt; Charts -&amp;gt; cert-manager -&amp;gt; install -&amp;gt; v1.11.0 -&amp;gt; 改 Image Tag 名稱 -&amp;gt; 改 installCRD = &lt;code&gt;true&lt;/code&gt; -&amp;gt; Next -&amp;gt; install&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 使用 cert-manager SelfSigned 部屬 ClusterIssuer
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-issuer
namespace: default
spec:
selfSigned: {}
## 檢查
$ kubectl get issuers -o wide
NAME READY STATUS AGE
selfsigned-issuer True 20s
# 生成憑證
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: test-ca
namespace: default
spec:
isCA: true
commonName: test-ca
subject:
organizations:
- ACME Inc.
organizationalUnits:
- Widgets
secretName: test-ca-secret
duration: 2h
renewBefore: 1h
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: selfsigned-issuer
kind: Issuer
group: cert-manager.io
# 透過 ca 憑證，產生 ingress 要用的憑證發布者
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: test-ca-issuer
spec:
ca:
secretName: test-ca-secret
# add an annotation indicating the issuer to use.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-nginx-ingress
namespace: default
annotations:
# add an annotation indicating the issuer to use.
cert-manager.io/issuer: test-ca-issuer
spec:
ingressClassName: nginx
tls:
- hosts:
- 192.168.11.174.nip.io
secretName: echo-cert
rules:
- host: 192.168.11.174.nip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
# 匯出 CA 憑證
$ kubectl get secret test-ca-secret -o jsonpath=&amp;#39;{.data.ca\.crt}&amp;#39; | base64 -d
# 裝 cmctl
$ tar xzf cmctl.tar.gz &amp;amp;&amp;amp; sudo mv cmctl /usr/local/bin
$ echo | openssl s_client -connect 192.168.11.174.nip.io:443 2&amp;gt;/dev/null | openssl x509 -noout -dates
notBefore=Mar 27 03:26:12 2024 GMT
notAfter=Jun 25 03:26:12 2024 GMT
$ kubectl get certificate
NAME READY SECRET AGE
echo-cert True echo-cert 104m
test-ca True test-ca-secret 106m
$ kubectl get certificaterequest --sort-by=.metadata.creationTimestamp
echo-cert-nbd69 True True test-ca-issuer system:serviceaccount:cert-manager:cert-manager 20s
$ echo | openssl s_client -connect 192.168.11.174.nip.io:443 2&amp;gt;/dev/null | openssl x509 -noout -dates&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;叢集自動更新&lt;span class="hx:absolute hx:-mt-20" id="叢集自動更新"&gt;&lt;/span&gt;
&lt;a href="#%e5%8f%a2%e9%9b%86%e8%87%aa%e5%8b%95%e6%9b%b4%e6%96%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;先檢查時間&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo ./k8s-cert_check
client-admin.crt: Mar 27 04:55:53 2025 GMT
client-auth-proxy.crt: Mar 27 04:55:53 2025 GMT
client-ca.crt: Mar 18 08:48:11 2034 GMT
client-ca.nochain.crt: Mar 18 08:48:11 2034 GMT
client-controller.crt: Mar 27 04:55:53 2025 GMT
client-kube-apiserver.crt: Mar 27 04:55:53 2025 GMT
client-kube-proxy.crt: Mar 27 04:55:53 2025 GMT
client-rke2-cloud-controller.crt: Mar 27 04:55:53 2025 GMT
client-rke2-controller.crt: Mar 27 04:55:53 2025 GMT
client-scheduler.crt: Mar 27 04:55:53 2025 GMT
client-supervisor.crt: Mar 21 08:26:55 2025 GMT
request-header-ca.crt: Mar 18 08:48:11 2034 GMT
server-ca.crt: Mar 18 08:48:11 2034 GMT
server-ca.nochain.crt: Mar 18 08:48:11 2034 GMT
serving-kube-apiserver.crt: Mar 27 04:55:53 2025 GMT
client-ca.crt: Mar 18 08:48:11 2034 GMT
client-kubelet.crt: Mar 27 04:55:55 2025 GMT
client-kube-proxy.crt: Mar 27 04:55:53 2025 GMT
client-rke2-controller.crt: Mar 27 04:55:53 2025 GMT
server-ca.crt: Mar 18 08:48:11 2034 GMT
serving-kubelet.crt: Mar 27 04:55:54 2025 GMT&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Rotate 叢集憑證&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再執行一次腳本確認&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.5. ingress 限制同時間 Session 連線數量為 2000&lt;span class="hx:absolute hx:-mt-20" id="15-ingress-限制同時間-session-連線數量為-2000"&gt;&lt;/span&gt;
&lt;a href="#15-ingress-%e9%99%90%e5%88%b6%e5%90%8c%e6%99%82%e9%96%93-session-%e9%80%a3%e7%b7%9a%e6%95%b8%e9%87%8f%e7%82%ba-2000" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;1.5.1. Enable the annotation validation feature with ingress nginx controller&lt;span class="hx:absolute hx:-mt-20" id="151-enable-the-annotation-validation-feature-with-ingress-nginx-controller"&gt;&lt;/span&gt;
&lt;a href="#151-enable-the-annotation-validation-feature-with-ingress-nginx-controller" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;修改 ingress nginx controller 的 YAML 檔&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Workloads -&amp;gt; DaemonSets -&amp;gt; kube-system -&amp;gt; Edit YAML&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/ByS_YO5RT.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;在 &lt;code&gt;spec.template.spec.containers.args&lt;/code&gt; 底下新增 &lt;code&gt;--enable-annotation-validation=true&lt;/code&gt; 參數，這樣可以開啟 annotations 功能，新增後按 Save&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SJrqUFcRp.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h4&gt;1.5.2. 測試單一 IP 位址允許的同時連線數&lt;span class="hx:absolute hx:-mt-20" id="152-測試單一-ip-位址允許的同時連線數"&gt;&lt;/span&gt;
&lt;a href="#152-%e6%b8%ac%e8%a9%a6%e5%96%ae%e4%b8%80-ip-%e4%bd%8d%e5%9d%80%e5%85%81%e8%a8%b1%e7%9a%84%e5%90%8c%e6%99%82%e9%80%a3%e7%b7%9a%e6%95%b8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;建立以下 Ingress&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-nginx-ingress
annotations:
nginx.ingress.kubernetes.io/limit-connections: &amp;#34;1&amp;#34;
spec:
ingressClassName: nginx
rules:
- host: 192.168.11.173.nip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Curl 網站測試&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ while true; do curl -s http://192.168.11.173.nip.io | grep 503 &amp;gt;&amp;gt; check.txt; done &amp;amp;
[1] 25917
$ cat check.txt
$ while true; do curl -s http://192.168.11.173.nip.io | grep 503 &amp;gt;&amp;gt; check.txt; done &amp;amp;
[2] 28690
$ cat check.txt
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;503 Service Temporarily Unavailable&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.7. 多租戶隔離 （負載管理/資源配額設定）&lt;span class="hx:absolute hx:-mt-20" id="17-多租戶隔離-負載管理資源配額設定"&gt;&lt;/span&gt;
&lt;a href="#17-%e5%a4%9a%e7%a7%9f%e6%88%b6%e9%9a%94%e9%9b%a2-%e8%b2%a0%e8%bc%89%e7%ae%a1%e7%90%86%e8%b3%87%e6%ba%90%e9%85%8d%e9%a1%8d%e8%a8%ad%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: default
spec:
hard:
requests.cpu: &amp;#34;1&amp;#34;
requests.memory: 256Mi
requests.nvidia.com/gpu: 1
limits.cpu: &amp;#34;2&amp;#34;
limits.memory: 1Gi
limits.nvidia.com/gpu: 2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;1.8. 測試告警發信&lt;span class="hx:absolute hx:-mt-20" id="18-測試告警發信"&gt;&lt;/span&gt;
&lt;a href="#18-%e6%b8%ac%e8%a9%a6%e5%91%8a%e8%ad%a6%e7%99%bc%e4%bf%a1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;1.8.1. 建立 SMTP 的 TLS Secret&lt;span class="hx:absolute hx:-mt-20" id="181-建立-smtp-的-tls-secret"&gt;&lt;/span&gt;
&lt;a href="#181-%e5%bb%ba%e7%ab%8b-smtp-%e7%9a%84-tls-secret" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl create ns cattle-monitoring-system
$ kubectl -n cattle-monitoring-system create secret generic smtp-tls-secret \
--from-file=tls.crt=/home/rancher/smtp/server.crt \
--from-file=tls.key=/home/rancher/smtp/server.key \
--from-file=ca.crt=/home/rancher/smtp/ca.crt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;需準備 CA 憑證、還有 SMTP Server 的憑證和私鑰&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.8.2. 建立 Rancher Monitoring&lt;span class="hx:absolute hx:-mt-20" id="182-建立-rancher-monitoring"&gt;&lt;/span&gt;
&lt;a href="#182-%e5%bb%ba%e7%ab%8b-rancher-monitoring" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;點選 Cluster Tools -&amp;gt; 找到 Monitoring 點選 Install
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/rkmcpDF06.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;勾選 Customize Helm options brfore install -&amp;gt; Next
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/ryioRDY0a.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;展開 Additional Secrets 選單，選擇 smtp-tls-secret
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SkZZ7dYCp.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SJzSQ_KR6.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝成功畫面
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SkPYEdKCa.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1.8.2. 設定 Alert-manager 告警對象為 E-mail&lt;span class="hx:absolute hx:-mt-20" id="182-設定-alert-manager-告警對象為-e-mail"&gt;&lt;/span&gt;
&lt;a href="#182-%e8%a8%ad%e5%ae%9a-alert-manager-%e5%91%8a%e8%ad%a6%e5%b0%8d%e8%b1%a1%e7%82%ba-e-mail" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;點選左側選單 Storage -&amp;gt; Secrets -&amp;gt; 選擇 &amp;ldquo;cattle-monitoring-system&amp;rdquo; Namespace -&amp;gt; 找到 &lt;code&gt;alertmanager-rancher-monitoring-alertmanager&lt;/code&gt; 這個 Secret -&amp;gt; 點選 Edit Config
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SyOqHdKCp.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複製以下 alertmanager.yaml 的內容，並再刪除所有原始的值後，貼到對應的 Value 欄位中&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;global:
resolve_timeout: 5m
route:
group_by: [Alertname]
# Send all notifications to me.
receiver: Mail Alert
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
routes:
- match:
alertname: DemoAlertName
receiver: &amp;#39;Mail Alert&amp;#39;
receivers:
- name: Mail Alert
email_configs:
- to: antony.chen@beeops.com.tw
from: rancher@lab.com
# Your smtp server address
smarthost: smtp.example.com:587
tls_config:
ca_file: /etc/alertmanager/secrets/smtp-tls-secret/ca.crt
cert_file: /etc/alertmanager/secrets/smtp-tls-secret/tls.crt
key_file: /etc/alertmanager/secrets/smtp-tls-secret/tls.key
headers:
From: rancher@lab.com
Subject: &amp;#39;Demo ALERT&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/By_IPdYR6.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;確認設定檔是否修改成功，點選 Monitoring -&amp;gt; Alert Manager
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/SkcJuutR6.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點選 Status
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/HJwwuOKRT.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;檢視 Config 內容
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/r1widuYRa.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打開信箱，看 Alert
&lt;img src="https://blog.kubeantony.com/images/hackmd-uploads/HkedkYdFR6.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;如果沒有 Alert 的話，可以透過 curl api 發送一個測試的 Alert&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ curl -H &amp;#39;Content-Type: application/json&amp;#39; -d &amp;#39;[{&amp;#34;labels&amp;#34;:{&amp;#34;alertname&amp;#34;:&amp;#34;myalert&amp;#34;}}]&amp;#39; http://10.43.130.225:9093/api/v1/alerts&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;10.43.130.225&lt;/code&gt; 為 Alertmanager Service 的 IP，執行以下命令可以找到
&lt;code&gt;$ kubectl -n cattle-monitoring-system get svc -l app=rancher-monitoring-alertmanager&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;二、備份/還原議題：&lt;span class="hx:absolute hx:-mt-20" id="二備份還原議題-1"&gt;&lt;/span&gt;
&lt;a href="#%e4%ba%8c%e5%82%99%e4%bb%bd%e9%82%84%e5%8e%9f%e8%ad%b0%e9%a1%8c-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;1. 備份叢集組態資訊 (etcd)&lt;span class="hx:absolute hx:-mt-20" id="1-備份叢集組態資訊-etcd"&gt;&lt;/span&gt;
&lt;a href="#1-%e5%82%99%e4%bb%bd%e5%8f%a2%e9%9b%86%e7%b5%84%e6%85%8b%e8%b3%87%e8%a8%8a-etcd" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;rancher 介面 Take Snapshot&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 串接環境內提供 備份軟體 (Veritas/Veeam) 備份資料。 (可跳過)&lt;span class="hx:absolute hx:-mt-20" id="2-串接環境內提供-備份軟體-veritasveeam-備份資料-可跳過"&gt;&lt;/span&gt;
&lt;a href="#2-%e4%b8%b2%e6%8e%a5%e7%92%b0%e5%a2%83%e5%85%a7%e6%8f%90%e4%be%9b-%e5%82%99%e4%bb%bd%e8%bb%9f%e9%ab%94-veritasveeam-%e5%82%99%e4%bb%bd%e8%b3%87%e6%96%99-%e5%8f%af%e8%b7%b3%e9%81%8e" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h3&gt;3. 還原叢集組態設定。&lt;span class="hx:absolute hx:-mt-20" id="3-還原叢集組態設定"&gt;&lt;/span&gt;
&lt;a href="#3-%e9%82%84%e5%8e%9f%e5%8f%a2%e9%9b%86%e7%b5%84%e6%85%8b%e8%a8%ad%e5%ae%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;rancher 介面 restore&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;三、升級議題：&lt;span class="hx:absolute hx:-mt-20" id="三升級議題-1"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%89%e5%8d%87%e7%b4%9a%e8%ad%b0%e9%a1%8c-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;升級中透過迴圈持續打 nginx 網頁連線，測試網頁連線狀況。&lt;/li&gt;
&lt;li&gt;進行叢集升級 v1.25 &amp;gt; v1.26 &amp;gt; v1.27 測試升級時間及相關網頁連線狀況。&lt;/li&gt;
&lt;li&gt;退版測試 ( v1.27 &amp;gt; v1.26 )&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3.1. 建 nginx 並跑 while 迴圈&lt;span class="hx:absolute hx:-mt-20" id="31-建-nginx-並跑-while-迴圈"&gt;&lt;/span&gt;
&lt;a href="#31-%e5%bb%ba-nginx-%e4%b8%a6%e8%b7%91-while-%e8%bf%b4%e5%9c%88" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: harbor.example.com/rancher/library-nginx:1.19.2-alpine
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
run: nginx
spec:
ports:
- port: 80
selector:
run: nginx
EOF
$ while true; do curl &amp;lt;service cluster ip&amp;gt;; done&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;3.2. TroubleShooting&lt;span class="hx:absolute hx:-mt-20" id="32-troubleshooting"&gt;&lt;/span&gt;
&lt;a href="#32-troubleshooting" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;問題描述&lt;span class="hx:absolute hx:-mt-20" id="問題描述"&gt;&lt;/span&gt;
&lt;a href="#%e5%95%8f%e9%a1%8c%e6%8f%8f%e8%bf%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;RKE2 從 v1.27.11 Restore 回 v1.26.11 的版本時，發現 m3 的 node 有異常&lt;/p&gt;
&lt;h4&gt;問題檢查&lt;span class="hx:absolute hx:-mt-20" id="問題檢查"&gt;&lt;/span&gt;
&lt;a href="#%e5%95%8f%e9%a1%8c%e6%aa%a2%e6%9f%a5" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ journalctl -u rke2-server.service --no-pager&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;看到以下錯誤訊息&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;...
{
&amp;#34;level&amp;#34;: &amp;#34;warn&amp;#34;,
&amp;#34;ts&amp;#34;: &amp;#34;2024-03-20T15:54:37.011625&amp;#43;0800&amp;#34;,
&amp;#34;logger&amp;#34;: &amp;#34;etcd-client&amp;#34;,
&amp;#34;caller&amp;#34;: &amp;#34;v3@v3.5.9-k3s1/retry_interceptor.go:62&amp;#34;,
&amp;#34;msg&amp;#34;: &amp;#34;retrying of unary invoker failed&amp;#34;,
&amp;#34;target&amp;#34;: &amp;#34;etcd-endpoints://0xc000775880/127.0.0.1:2379&amp;#34;,
&amp;#34;attempt&amp;#34;: 0,
&amp;#34;error&amp;#34;: &amp;#34;rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \&amp;#34;transport: Error while dialing: dial tcp 127.0.0.1:2379: connect: connection refused\&amp;#34;&amp;#34;
}
...
{
&amp;#34;level&amp;#34;: &amp;#34;info&amp;#34;,
&amp;#34;ts&amp;#34;: &amp;#34;2024-03-20T14:50:38.133657&amp;#43;0800&amp;#34;,
&amp;#34;logger&amp;#34;: &amp;#34;etcd-client&amp;#34;,
&amp;#34;caller&amp;#34;: &amp;#34;v3@v3.5.9-k3s1/client.go:210&amp;#34;,
&amp;#34;msg&amp;#34;: &amp;#34;Auto sync endpoints failed.&amp;#34;,
&amp;#34;error&amp;#34;: &amp;#34;context deadline exceeded&amp;#34;
}
...
level=error msg=&amp;#34;Failed to check local etcd status for learner management: context deadline exceeded&amp;#34; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;看 ETCD Member&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl -n kube-system exec -it etcd-k2m1 -- bash
$ ETCDCTL_ENDPOINTS=&amp;#39;https://127.0.0.1:2379&amp;#39; ETCDCTL_CACERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt&amp;#39; ETCDCTL_CERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.crt&amp;#39; ETCDCTL_KEY=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.key&amp;#39; ETCDCTL_API=3 etcdctl member list -w table&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;
| 6fc66799bcea7735 | started | k2m1-3cc51c7e | https://192.168.11.170:2380 | https://192.168.11.170:2379 | false |
| a7d16fd4a2d2688b | started | k2m2-308b0b3a | https://192.168.11.171:2380 | https://192.168.11.171:2379 | false |
&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;Root cause&lt;span class="hx:absolute hx:-mt-20" id="root-cause"&gt;&lt;/span&gt;
&lt;a href="#root-cause" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;m3 node 的 etcd 要加入 etcd cluster 的時候超過 Timeout 時間，因為 etcd 根據給定的端點，對 etcd 成員的儲存空間進行碎片整理預設 Timeout 時間為 5 秒&lt;/p&gt;
&lt;h4&gt;問題修復&lt;span class="hx:absolute hx:-mt-20" id="問題修復"&gt;&lt;/span&gt;
&lt;a href="#%e5%95%8f%e9%a1%8c%e4%bf%ae%e5%be%a9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl -n kube-system exec -it etcd-k2m1 -- bash
$ ETCDCTL_ENDPOINTS=&amp;#39;https://127.0.0.1:2379&amp;#39; ETCDCTL_CACERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt&amp;#39; ETCDCTL_CERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.crt&amp;#39; ETCDCTL_KEY=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.key&amp;#39; ETCDCTL_API=3 etcdctl --command-timeout=30s defrag&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Finished defragmenting etcd member[https://127.0.0.1:2379]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再看一次 ETCD Member&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl -n kube-system exec -it etcd-k2m1 $etcdpod -- bash
$ ETCDCTL_ENDPOINTS=&amp;#39;https://127.0.0.1:2379&amp;#39; ETCDCTL_CACERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt&amp;#39; ETCDCTL_CERT=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.crt&amp;#39; ETCDCTL_KEY=&amp;#39;/var/lib/rancher/rke2/server/tls/etcd/server-client.key&amp;#39; ETCDCTL_API=3 etcdctl member list -w table&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;
| 66077b12da5276cb | started | k2m3-e637cb23 | https://192.168.11.172:2380 | https://192.168.11.172:2379 | false |
| 6fc66799bcea7735 | started | k2m1-3cc51c7e | https://192.168.11.170:2380 | https://192.168.11.170:2379 | false |
| a7d16fd4a2d2688b | started | k2m2-308b0b3a | https://192.168.11.171:2380 | https://192.168.11.171:2379 | false |
&amp;#43;------------------&amp;#43;---------&amp;#43;---------------&amp;#43;-----------------------------&amp;#43;-----------------------------&amp;#43;------------&amp;#43;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;成功加入~&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>註冊 RHEL</title><link>https://blog.kubeantony.com/archive/misc/%E8%A8%BB%E5%86%8A-rhel/</link><pubDate>Mon, 25 Mar 2024 02:25:16 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E8%A8%BB%E5%86%8A-rhel/</guid><description>
&lt;h2&gt;設定 Http Proxy&lt;span class="hx:absolute hx:-mt-20" id="設定-http-proxy"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%ad%e5%ae%9a-http-proxy" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a
href="https://www.server-world.info/en/note?os=CentOS_Stream_9&amp;amp;p=squid&amp;amp;f=2"target="_blank" rel="noopener"&gt;https://www.server-world.info/en/note?os=CentOS_Stream_9&amp;p=squid&amp;f=2&lt;/a&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager config --server.proxy_hostname=proxy.example.com --server.proxy_port=8080 --server.proxy_user=admin --server.proxy_password=secret&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;註冊&lt;span class="hx:absolute hx:-mt-20" id="註冊"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%bb%e5%86%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ subscription-manager register --username &amp;lt;$INSERT_USERNAME_HERE&amp;gt; --password &amp;lt;$INSERT_PASSWORD_HERE&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Upload File to Google Drive from Linux Command Line</title><link>https://blog.kubeantony.com/archive/misc/upload-file-to-google-drive-from-linux-command-line/</link><pubDate>Mon, 18 Mar 2024 06:43:46 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/upload-file-to-google-drive-from-linux-command-line/</guid><description>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Download the latest release from Github
$ curl -# -OL https://github.com/prasmussen/gdrive/releases/download/2.1.1/gdrive_2.1.1_linux_amd64.tar.gz
# Unzip the Archive
$ tar -xvf gdrive_2.1.1_linux_amd64.tar.gz
# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>What is Reed–Solomon Code?</title><link>https://blog.kubeantony.com/archive/misc/what-is-reed-solomon-code/</link><pubDate>Mon, 11 Mar 2024 05:57:40 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/what-is-reed-solomon-code/</guid><description>
&lt;h2&gt;先備知識&lt;span class="hx:absolute hx:-mt-20" id="先備知識"&gt;&lt;/span&gt;
&lt;a href="#%e5%85%88%e5%82%99%e7%9f%a5%e8%ad%98" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;「錯誤更正碼」， Error–Correcting Codes， 通常縮寫成 ECC。 在日常生活中，我們經常可以遇到 ECC 的應用，譬如在買電腦的時候，老闆說他的 RAM 是 ECC RAM， 也就是說他的 RAM 有錯誤更正碼在裡面。&lt;/p&gt;
&lt;p&gt;這錯誤更正碼到底是做什麼用? 通常是應用在通訊的過程中， 實際上通訊分很多種， 平常想像 到的是在空間中做通訊， 譬如從地球的某一點傳資料到地球的另外一點。 另外還有一種通訊的情況， 就是在時間上做通訊， 像平常看到電腦裡的磁帶 (magnetic tape)、 磁碟 (magnetic disk); 又譬如雷射唱片 (compact disk， CD) 也是， 它在製造的時候把音樂寫進去， 然後再把它放到雷射唱盤 (CD player) 讀出來， 這也是一個在時間上做通訊的例子。 通常我們可以把通訊過程變成下面這個模型 (model)。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/rkuoKMhTT.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;就是說有一些資料 (data) 經過一個東西叫做通道 (channel)， 因為通道會有許多干擾或雜訊， 比方說你把音樂寫在 CD 片上， 不小心刮了一塊， 讀出來的時候那地方就錯了，或是當我們透過網路傳輸一些資料時，資料可能會因某些網路問題而損壞。由於幹擾或某些網路問題，資料內部的位元可能會被損壞，所以，經過通道之後， 就會變成有雜訊的資料 (noisy data)， 而基本上錯誤更正碼就是要對付雜訊或干擾， 把錯誤改正回來。&lt;/p&gt;
&lt;p&gt;原來 我們是從資料到通道這樣直接過來， 現在我們讓資料在傳出前先經過一個編碼器 ( encoder )&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/HySloGnpp.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;經過編碼器之後， 傳出來的東西除了原始的資料之外， 又加了一些多餘的資料 (redundant bits)， 使得裡面有一個數學的結構存在， 當經過通道以後不論是原始的資料或多餘的資料都可能有錯， 可是因為它裡面有數學結構， 就可以經由解碼器 (decoder)， 依原有的數學結構把錯誤的東西改回來， 這就是錯誤更正碼的基本構想。&lt;/p&gt;
&lt;h2&gt;Reed-Solomon codes&lt;span class="hx:absolute hx:-mt-20" id="reed-solomon-codes"&gt;&lt;/span&gt;
&lt;a href="#reed-solomon-codes" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Reed-Solomon codes 是由 Irving S. Reed 和 Gustave Solomon 提出的一種碼。Reed-Solomon code 是 non-binary BCH codes 的子分類。 The encoder of Reed-Solomon codes 與 binary encoder 不同之處在於，它對多個位元 ( multiple bits ) 而不是單一位元 ( individual bits ) 進行編碼。&lt;/p&gt;
&lt;p&gt;因此，從根本上說，Reed-Solomon codes 有助於恢復透過網路傳輸的損壞訊息。 在 Reed-Solomon codes 中，有分 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encoder&lt;/li&gt;
&lt;li&gt;Decoder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reed-Solomon codes encoder 接收資料後，在透過網路傳輸資料之前，會在原始資料位元上添加一些 parity bits ( 奇偶校驗位 )。&lt;/p&gt;
&lt;p&gt;另一方面，Reed-Solomon codes decoder，它能偵測出損壞的訊息，並從錯誤中恢復它們。&lt;/p&gt;
&lt;h3&gt;Representation of n-bits Reed-Solomon codes&lt;span class="hx:absolute hx:-mt-20" id="representation-of-n-bits-reed-solomon-codes"&gt;&lt;/span&gt;
&lt;a href="#representation-of-n-bits-reed-solomon-codes" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;img src="https://hackmd.io/_uploads/B1aIik2T6.png" alt="image" loading="lazy" /&gt;&lt;/p&gt;
&lt;h4&gt;Parameters of Reed-Solomon code:&lt;span class="hx:absolute hx:-mt-20" id="parameters-of-reed-solomon-code"&gt;&lt;/span&gt;
&lt;a href="#parameters-of-reed-solomon-code" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;(n， k) code is used to encode m-bit symbols.&lt;/li&gt;
&lt;li&gt;Block length(n) is given by 2m-1 symbols.&lt;/li&gt;
&lt;li&gt;In Reed-Solomon codes， message size is given by (n-2t) where t= number of errors corrected.&lt;/li&gt;
&lt;li&gt;Parity check size is given by = (n-k) or 2t symbols.&lt;/li&gt;
&lt;li&gt;Minimum distance(a) is given by = (2t+1).&lt;/li&gt;
&lt;li&gt;Message size is of k bits.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docusaurus Installation</title><link>https://blog.kubeantony.com/archive/misc/docusaurus-installation/</link><pubDate>Tue, 27 Feb 2024 09:44:44 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/docusaurus-installation/</guid><description>
&lt;h2&gt;Prerequest&lt;span class="hx:absolute hx:-mt-20" id="prerequest"&gt;&lt;/span&gt;
&lt;a href="#prerequest" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;在 Github 上已建立 Repo，並且已將主機的 SSH Public Key 匯入專案中
&lt;ul&gt;
&lt;li&gt;專案名稱需命名為 : &lt;code&gt;帳號.github.io&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;開始安裝 Docusaurus&lt;span class="hx:absolute hx:-mt-20" id="開始安裝-docusaurus"&gt;&lt;/span&gt;
&lt;a href="#%e9%96%8b%e5%a7%8b%e5%ae%89%e8%a3%9d-docusaurus" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;## 安裝 node.js 管理工具
## Node.js version 18.0 or above
$ sudo apk add --update npm
## 新建專案
$ npx @docusaurus/init@latest init my-website classic
$ cd my-website/
## 修改設定檔，將 url、organizationName 和 projectName 改成對應的 github 上的資訊
$ nano docusaurus.config.js
(module.exports = {
url: &amp;#39;https://nightmare315.github.io&amp;#39;
organizationName: &amp;#39;nightmare315&amp;#39;, // Usually your GitHub org/user name.
projectName: &amp;#39;nightmare315.github.io&amp;#39;, // Usually your repo name.
})
## 本機啟動網站測試
$ npm run start -- --host 0.0.0.0
## 部屬到 Github
$ USE_SSH=true GIT_USER=nightmare315 DEPLOYMENT_BRANCH=main npm run deploy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>專案管理淺談</title><link>https://blog.kubeantony.com/archive/misc/%E5%B0%88%E6%A1%88%E7%AE%A1%E7%90%86%E6%B7%BA%E8%AB%87/</link><pubDate>Thu, 31 Aug 2023 06:21:52 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E5%B0%88%E6%A1%88%E7%AE%A1%E7%90%86%E6%B7%BA%E8%AB%87/</guid><description>
&lt;ul&gt;
&lt;li&gt;專案: 不限人數須完成特定目標的任務&lt;/li&gt;
&lt;li&gt;專案分類: 根據人數&amp;quot;或&amp;quot;金額，分為大中小&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>縮排</title><link>https://blog.kubeantony.com/archive/misc/%E7%B8%AE%E6%8E%92/</link><pubDate>Sun, 02 Apr 2023 04:04:52 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E7%B8%AE%E6%8E%92/</guid><description>
&lt;style&gt;
.indent-title-1{
margin-left: 1em;
&lt;/style&gt;</description></item><item><title>Linux 開機程序</title><link>https://blog.kubeantony.com/archive/misc/linux-%E9%96%8B%E6%A9%9F%E7%A8%8B%E5%BA%8F/</link><pubDate>Sun, 19 Mar 2023 07:41:36 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/linux-%E9%96%8B%E6%A9%9F%E7%A8%8B%E5%BA%8F/</guid><description>
&lt;style&gt;
.indent-title-1{
margin-left: 1em;
}
.indent-title-2{
margin-left: 2em;
}
.indent-title-3{
margin-left: 3em;
}
&lt;/style&gt;
&lt;h2&gt;重要流程圖&lt;span class="hx:absolute hx:-mt-20" id="重要流程圖"&gt;&lt;/span&gt;
&lt;a href="#%e9%87%8d%e8%a6%81%e6%b5%81%e7%a8%8b%e5%9c%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/8nYFm5R.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;流程解釋&lt;span class="hx:absolute hx:-mt-20" id="流程解釋"&gt;&lt;/span&gt;
&lt;a href="#%e6%b5%81%e7%a8%8b%e8%a7%a3%e9%87%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;按開機鍵將電腦啟動後，第一個啟動的是 BIOS 或 UEFI (兩者最大的差別是 UEFI 滑鼠可以動)，然後會執行開機自我開機檢測 （Power-on Self Test，POST），BIOS 會來檢測硬體周邊的裝置，包含 CPU, 記憶體, 顯卡, 網卡和硬碟 …等，假如記憶體插錯，開機就有可能會聽到連續逼的聲音，如果裝置都正常就可以聽到逼一聲，代表開機正常&lt;/li&gt;
&lt;li&gt;接下來會去讀取可開機裝置的 MBR，可開機裝置指的是光碟,硬碟和隨身碟…等那些，只要他能開機，在 BIOS 有設定，他就會嘗試去找可開機裝置的第一個磁區(也就是 MBR)，在其中有一支儲存開機管理程式，叫作 Boot Loader&lt;/li&gt;
&lt;li&gt;Boot Loader 會提供開機選單，載入作業系統後，最重要的是把 Linux 核心 以及 initrd/initramfs 載入到記憶體裡面，並把 initrd/initramfs 的記憶體位址告訴 kernel，kernel 才能找到，之後把控制權給 Linux kernel&lt;/li&gt;
&lt;li&gt;Linux Kernel 拿到控制權後，會與 BIOS 一樣，做一件事情，就是檢測電腦週邊的硬體是不是都正常，因為 Kernel 要跟電腦做溝通，所以會再檢測一次，之後假設目前是用 SATA 硬碟開機，它會利用 initrd image 或是 initramfs，來讀取得真正的檔案系統的驅動程式，這樣子才能與硬體做溝通&lt;/li&gt;
&lt;li&gt;Kernal 確定驅動程式和檔案系統掛載都 ok 後，他就會啟動第一支程序，通常叫做 init 的 process，在大部分的 Linux 中用的是 &amp;ldquo;systemd&amp;rdquo;，而 Alpine 用的是 OpenRC&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1. BIOS (Basic Input/Output System)&lt;span class="hx:absolute hx:-mt-20" id="1-bios-basic-inputoutput-system"&gt;&lt;/span&gt;
&lt;a href="#1-bios-basic-inputoutput-system" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="indent-title-1"&gt;
&lt;h3&gt;BIOS 簡單介紹&lt;span class="hx:absolute hx:-mt-20" id="bios-簡單介紹"&gt;&lt;/span&gt;
&lt;a href="#bios-%e7%b0%a1%e5%96%ae%e4%bb%8b%e7%b4%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BIOS 是韌體，主要儲存在主機板上的 BIOS ROM 晶片&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;ROM 晶片的特色是 電腦關機後晶片存儲的內容也不會消失，它對應的是 RAM 晶片(記憶體)，電腦關機後資料會被清除
&lt;img src="https://i.imgur.com/jllM2m0.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BIOS 的設定儲存在 CMOS 晶片&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;設定項目包含 : 日期時間、開機順序 &amp;hellip;等&lt;/li&gt;
&lt;li&gt;CMOS 晶片在現在的主機板大部分的時候，會與其他晶片整合在一起&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMOS 晶片使用的電池稱為 CMOS 電池&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;當 CMOS 晶片被拔下來，導致 CMOS 晶片沒電，BIOS 的基本設定就會被清除
&lt;img src="https://i.imgur.com/7Kurdzx.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;筆電的 CMOS 電池通常會再接一條線，因為筆電沒有插槽&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EFI &amp;amp; UEFI 簡單介紹&lt;span class="hx:absolute hx:-mt-20" id="efi--uefi-簡單介紹"&gt;&lt;/span&gt;
&lt;a href="#efi--uefi-%e7%b0%a1%e5%96%ae%e4%bb%8b%e7%b4%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BIOS 通常在比較舊的電腦才會出現，新的電腦通常是 UEFI 的介面&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UEFI : 統一可延伸韌體介面（Unified Extensible Firmware Interface）
&lt;img src="https://i.imgur.com/NPEBXOB.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大特色 : 它的滑鼠可以動，顏色豐富，有的介面還有可能是紅色或綠色，可以設定的選項也比較多&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;EFI 由 CPU 的大廠 Intel 先提出來的介面，為了不讓 Intel 獨佔這門技術，所以各大廠成立一個聯盟，做出了統一的規範，為了與 EFI 區別，就在名稱前面多了 Unified 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;快速檢查 Linux 用 BIOS or UEFI&lt;span class="hx:absolute hx:-mt-20" id="快速檢查-linux-用-bios-or-uefi"&gt;&lt;/span&gt;
&lt;a href="#%e5%bf%ab%e9%80%9f%e6%aa%a2%e6%9f%a5-linux-%e7%94%a8-bios-or-uefi" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;程式概述 : 通常有使用 UEFI 的 Linux 作業系統，在 &lt;code&gt;/sys/firmware/efi&lt;/code&gt; 這個目錄下都會有檔案，所以用這個目錄的存在來判斷是否是 UEFI&lt;/p&gt;
&lt;p&gt;編輯一支程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano biosmode.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;內容 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
[ -d /sys/firmware/efi ] &amp;amp;&amp;amp; echo &amp;#39;UEFI&amp;#39; || echo &amp;#39;BIOS&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;賦予執行權限&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ chmod &amp;#43;x biosmode.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./biosmode.sh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;BIOS&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;快速檢查 Windows 10 用 BIOS or UEFI&lt;span class="hx:absolute hx:-mt-20" id="快速檢查-windows-10-用-bios-or-uefi"&gt;&lt;/span&gt;
&lt;a href="#%e5%bf%ab%e9%80%9f%e6%aa%a2%e6%9f%a5-windows-10-%e7%94%a8-bios-or-uefi" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打開 CMD 或 Windows + R 快捷打開執行&lt;/li&gt;
&lt;li&gt;輸入 &lt;code&gt;msinfo32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;找到 BIOS 模式
&lt;img src="https://i.imgur.com/29XrZOI.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h2&gt;2. MBR&lt;span class="hx:absolute hx:-mt-20" id="2-mbr"&gt;&lt;/span&gt;
&lt;a href="#2-mbr" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="indent-title-1"&gt;
&lt;h3&gt;MBR 介紹&lt;span class="hx:absolute hx:-mt-20" id="mbr-介紹"&gt;&lt;/span&gt;
&lt;a href="#mbr-%e4%bb%8b%e7%b4%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;主開機紀錄（Master Boot Record）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;位於可開機裝置的第一個磁區&lt;/li&gt;
&lt;li&gt;大小 512 Bytes ，其中 :
&lt;ul&gt;
&lt;li&gt;446 Bytes 儲存開機管理程式（Boot Loader）&lt;/li&gt;
&lt;li&gt;4 個 16 Bytes 儲存磁區分割表 ( C 或 D 槽要切幾個，就是儲存在這)&lt;/li&gt;
&lt;li&gt;2 Bytes 儲存檢查標誌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;446 + (4*16) + 2 = 512&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;磁碟分割表介紹&lt;span class="hx:absolute hx:-mt-20" id="磁碟分割表介紹"&gt;&lt;/span&gt;
&lt;a href="#%e7%a3%81%e7%a2%9f%e5%88%86%e5%89%b2%e8%a1%a8%e4%bb%8b%e7%b4%b9" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4&gt;MBR&lt;span class="hx:absolute hx:-mt-20" id="mbr"&gt;&lt;/span&gt;
&lt;a href="#mbr" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;最大的 Partition 大小，只能 2 TB&lt;/li&gt;
&lt;li&gt;Partition 最多只能切 4 個，需要進階的做法才能切更多&lt;/li&gt;
&lt;li&gt;只支援 BIOS&lt;/li&gt;
&lt;li&gt;作業系統支援 : Windows 7 或是更舊的，像是 Windows 95/98，Windows XP 32-bit, Windows 2000, Windows 2003 32-bit&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;GPT ( GUID Partition Table )&lt;span class="hx:absolute hx:-mt-20" id="gpt--guid-partition-table-"&gt;&lt;/span&gt;
&lt;a href="#gpt--guid-partition-table-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;最大的 Partition 大小，只能 9.4 ZB&lt;/li&gt;
&lt;li&gt;Partition 最多可以切 128 個磁區&lt;/li&gt;
&lt;li&gt;支援 UEFI 或是 MBR&lt;/li&gt;
&lt;li&gt;作業系統支援 : Windows 11, Windows 10 64-bit, Windows 8/8.1 64-bit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/8dWQyVW.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;檢查 SUSE Linux MBR or GPT&lt;span class="hx:absolute hx:-mt-20" id="檢查-suse-linux-mbr-or-gpt"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e6%9f%a5-suse-linux-mbr-or-gpt" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo gdisk /dev/sda -l&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;pre&gt;
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
&lt;font color=red&gt;Found valid GPT with protective MBR; using GPT.&lt;/font&gt;
Disk /dev/sda: 209715200 sectors, 100.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2D602B9D-31C0-488F-8C24-64B3B47D1B86
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 18431 8.0 MiB EF02
2 18432 83904511 40.0 GiB 8300
3 83904512 153907199 33.4 GiB 8300
4 153907200 193585151 18.9 GiB 8300
5 193585152 209715166 7.7 GiB 8200
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;3. Boot Loader&lt;span class="hx:absolute hx:-mt-20" id="3-boot-loader"&gt;&lt;/span&gt;
&lt;a href="#3-boot-loader" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="indent-title-1"&gt;
&lt;ul&gt;
&lt;li&gt;提供開機選單
&lt;ul&gt;
&lt;li&gt;可以讓使用者決定開哪個作業系統
&lt;img src="https://i.imgur.com/BaVpOeM.png" alt="" loading="lazy" /&gt;
&lt;img src="https://i.imgur.com/yGJqYaC.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chain loading（控制權轉交給其他 loader）
&lt;ol&gt;
&lt;li&gt;將 Linux 核心及 initramfs 載入到記憶體中&lt;/li&gt;
&lt;li&gt;將 initramfs 位址傳給 Kernel&lt;/li&gt;
&lt;li&gt;將控制權交給 Kernel&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;SUSE Linux 和 Ubuntu Linux 用的 Boot Loader 是 GRUB 2 (目前最受歡迎)&lt;/li&gt;
&lt;li&gt;Alpine Linux 用的 Boot Loader 是 syslinux&lt;/li&gt;
&lt;li&gt;tinycore 用的 Boot Loader 是 isolinux&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GRUB 2 啟動流程&lt;span class="hx:absolute hx:-mt-20" id="grub-2-啟動流程"&gt;&lt;/span&gt;
&lt;a href="#grub-2-%e5%95%9f%e5%8b%95%e6%b5%81%e7%a8%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BIOS 在 MBR 中啟動名稱為 boot.img 的 loader&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;階段 1
&lt;ul&gt;
&lt;li&gt;boot.img 負責載入階段 1.5 的 loader，名稱為 core.img&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;階段 1.5
&lt;ul&gt;
&lt;li&gt;core.img 包含檔案系統的驅動程式&lt;/li&gt;
&lt;li&gt;負責載入位於 /boot 目錄中的階段 2 檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;階段 2
&lt;ul&gt;
&lt;li&gt;將 Kernel 解壓縮到主記憶體中&lt;/li&gt;
&lt;li&gt;將 initrd/initramfs 載入記憶體，並將其位址傳給 Kernel&lt;/li&gt;
&lt;li&gt;將控制權交給 Kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;4. Kernel&lt;span class="hx:absolute hx:-mt-20" id="4-kernel"&gt;&lt;/span&gt;
&lt;a href="#4-kernel" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="indent-title-1"&gt;
&lt;h3&gt;initrd &amp;amp; initramfs&lt;span class="hx:absolute hx:-mt-20" id="initrd--initramfs"&gt;&lt;/span&gt;
&lt;a href="#initrd--initramfs" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;initrd (init ramdisk)，臨時用的檔案系統，與一般開機之後根目錄結構一模一樣的檔案系統，會由 Boot Loader 載入記憶體中，再給 Kernal 使用&lt;/li&gt;
&lt;li&gt;initrd 和 initramfs 是兩種不同的方法，但都是為了掛載真正的根目錄之前做準備&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;5. Init&lt;span class="hx:absolute hx:-mt-20" id="5-init"&gt;&lt;/span&gt;
&lt;a href="#5-init" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="indent-title-1"&gt;
&lt;h3&gt;確認 init 的 process，以 SUSE Linux 為例&lt;span class="hx:absolute hx:-mt-20" id="確認-init-的-process以-suse-linux-為例"&gt;&lt;/span&gt;
&lt;a href="#%e7%a2%ba%e8%aa%8d-init-%e7%9a%84-process%e4%bb%a5-suse-linux-%e7%82%ba%e4%be%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;方法一 :&lt;/p&gt;
&lt;p&gt;執行以下命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ls -al /sbin/init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;pre&gt;
lrwxrwxrwx 1 root root 26 May 12 2022 /sbin/init -&gt; ../usr/lib/systemd/&lt;font color=red&gt;systemd&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;由以上可以看到 &lt;code&gt;/sbin/init&lt;/code&gt; 這支程式指向 &lt;code&gt;systemd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;方法二 :&lt;/p&gt;
&lt;p&gt;執行以下命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ps --pid 1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;PID TTY TIME CMD
1 ? 00:00:00 systemd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;檢視 /boot [ SUSE Linux ]&lt;span class="hx:absolute hx:-mt-20" id="檢視-boot--suse-linux-"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e8%a6%96-boot--suse-linux-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;執行以下命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ls -al /boot/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;螢幕輸出&lt;/p&gt;
&lt;pre&gt;
total 69088
drwxr-xr-x 1 root root 696 Feb 27 08:09 .
drwxr-xr-x 1 root root 156 Feb 27 08:03 ..
-rw-r--r-- 1 root root 65 May 12 2022 .vmlinuz-5.14.21-150400.22-default.hmac
-rw-r--r-- 1 root root 5036251 May 12 2022 System.map-5.14.21-150400.22-default
-rw-r--r-- 1 root root 1725 May 8 2022 boot.readme
-rw-r--r-- 1 root root 250502 May 12 2022 config-5.14.21-150400.22-default
&lt;font color=red&gt;drwxr-xr-x 1 root root 140 Feb 27 08:08 grub2&lt;/font&gt;
&lt;font color=red&gt;lrwxrwxrwx 1 root root 32 Feb 27 08:06 initrd -&gt; initrd-5.14.21-150400.22-default&lt;/font&gt;
-rw------- 1 root root 18222292 Feb 27 08:08 initrd-5.14.21-150400.22-default
-rw------- 1 root root 19143144 Feb 27 08:09 initrd-5.14.21-150400.22-default-kdump
-rw-r--r-- 1 root root 451623 May 12 2022 symvers-5.14.21-150400.22-default.gz
-rw-r--r-- 1 root root 484 May 12 2022 sysctl.conf-5.14.21-150400.22-default
-rw-r--r-- 1 root root 16548932 May 12 2022 vmlinux-5.14.21-150400.22-default.gz
&lt;font color=red&gt;lrwxrwxrwx 1 root root 33 Feb 27 08:06 vmlinuz -&gt; vmlinuz-5.14.21-150400.22-default&lt;/font&gt;
-rw-r--r-- 1 root root 11058176 May 12 2022 vmlinuz-5.14.21-150400.22-default
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Boot Loader 、 initrd 和 vmlinuz 都放在 &lt;code&gt;/boot&lt;/code&gt; 這個目錄
&lt;ul&gt;
&lt;li&gt;vmlinuz 指的是 Linux 的 Kernal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;Kubernetes 升級&lt;/h1&gt;&lt;p&gt;Given an existing Kubernetes cluster running version 1.24.1, upgrade all of Kubernetes control plane and node components on the master node only to version 1.24.2&lt;/p&gt;
&lt;p&gt;You are also expected to upgrade kubelet and kubectl on the master node.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Be sure to drain the master node before upgrading it and uncordon it after the upgrade.
Do not upgrade the worker nodes, etcd, the container manager, the CNI plugin, the DNS service or any other addons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;對 Linux 套件 kubeadm 進行升級&lt;span class="hx:absolute hx:-mt-20" id="對-linux-套件-kubeadm-進行升級"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8d-linux-%e5%a5%97%e4%bb%b6-kubeadm-%e9%80%b2%e8%a1%8c%e5%8d%87%e7%b4%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# ssh 連進 control plane node
$ ssh &amp;lt;control plane node&amp;gt;
# 提權
$ sudo -i
# 更新套件清單
$ apt update
# 看當前主機可以升級 kubeadm 的那些版本
$ apt-cache madison kubeadm
# 將 kubeadm 升級至 1.22.1 版
## hold ，讓系統 update 或 upgrade 的時候，忽略 hold 的套件
## unhold ，取消忽略
$ apt-mark unhold kubeadm &amp;amp;&amp;amp; \
apt-get update &amp;amp;&amp;amp; apt-get install -y kubeadm=1.24.2-00 &amp;amp;&amp;amp; \
apt-mark hold kubeadm
# 檢查下載下來的 kubeadm 版本
$ kubeadm version&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;kubeadm upgrade&lt;span class="hx:absolute hx:-mt-20" id="kubeadm-upgrade"&gt;&lt;/span&gt;
&lt;a href="#kubeadm-upgrade" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Drain control-plane node
$ kubectl drain &amp;lt;control-plane-node&amp;gt; --delete-emptydir-data --ignore-daemonsets --force
# Verify the upgrade plan
$ kubeadm upgrade plan
# 將 kubeadm 升級至指定版本 : 1.24.2
$ sudo kubeadm upgrade apply v1.24.2 --etcd-upgrade=false&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;成功後，會看到的螢幕輸出&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[upgrade/successful] SUCCESS! Your cluster was upgraded to &amp;#34;v1.24.2&amp;#34;. Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven&amp;#39;t already done so.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Upgrade kubelet and kubectl&lt;span class="hx:absolute hx:-mt-20" id="upgrade-kubelet-and-kubectl"&gt;&lt;/span&gt;
&lt;a href="#upgrade-kubelet-and-kubectl" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ apt-mark unhold kubelet kubectl &amp;amp;&amp;amp; \
apt-get update &amp;amp;&amp;amp; apt-get install -y kubelet=1.24.1-00 kubectl=1.24.1-00 &amp;amp;&amp;amp; \
apt-mark hold kubelet kubectl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Restart the kubelet&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Reload systemd manager configuration
$ systemctl daemon-reload
# 將 kubelet 重啟
$ systemctl restart kubelet
# 檢查 kubelet 狀態
$ systemctl status kubelet&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Uncordon the node&lt;span class="hx:absolute hx:-mt-20" id="uncordon-the-node"&gt;&lt;/span&gt;
&lt;a href="#uncordon-the-node" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Bring the node back online by marking it schedulable
$ kubectl uncordon &amp;lt;control-plane-node&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查 node 狀態&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ kubectl get nodes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;What is Canary Deployment&lt;/h1&gt;&lt;h2&gt;概述&lt;span class="hx:absolute hx:-mt-20" id="概述"&gt;&lt;/span&gt;
&lt;a href="#%e6%a6%82%e8%bf%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;將修改後的 Application 推廣到一小部分使用者，驗證沒有問題後，再推廣到全部使用者，以降低生產環境引入新功能帶來的風險。&lt;/p&gt;
&lt;p&gt;通常是 90% 的使用者維持使用老版本，10% 的使用者嚐鮮新版本。&lt;/p&gt;</description></item><item><title>安裝 Windows 注意事項</title><link>https://blog.kubeantony.com/archive/misc/%E5%AE%89%E8%A3%9D-windows-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</link><pubDate>Fri, 10 Mar 2023 05:14:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E5%AE%89%E8%A3%9D-windows-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85/</guid><description>
&lt;h2&gt;1. Windows 透過 RDP 通訊協定同時登入時，最大連線數&lt;span class="hx:absolute hx:-mt-20" id="1-windows-透過-rdp-通訊協定同時登入時最大連線數"&gt;&lt;/span&gt;
&lt;a href="#1-windows-%e9%80%8f%e9%81%8e-rdp-%e9%80%9a%e8%a8%8a%e5%8d%94%e5%ae%9a%e5%90%8c%e6%99%82%e7%99%bb%e5%85%a5%e6%99%82%e6%9c%80%e5%a4%a7%e9%80%a3%e7%b7%9a%e6%95%b8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;沒付錢是允許 2 個同時連線(師傅徒弟)，有付錢可以到 5 個或更多&lt;/li&gt;
&lt;li&gt;OpenSSH 的連線就無限制&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 灌 Windows 作業系統時，須注意硬碟容量大小，灌在哪顆硬碟&lt;span class="hx:absolute hx:-mt-20" id="2-灌-windows-作業系統時須注意硬碟容量大小灌在哪顆硬碟"&gt;&lt;/span&gt;
&lt;a href="#2-%e7%81%8c-windows-%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1%e6%99%82%e9%a0%88%e6%b3%a8%e6%84%8f%e7%a1%ac%e7%a2%9f%e5%ae%b9%e9%87%8f%e5%a4%a7%e5%b0%8f%e7%81%8c%e5%9c%a8%e5%93%aa%e9%a1%86%e7%a1%ac%e7%a2%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;3. Windows 網路資料夾，同時最大可允許連線&lt;span class="hx:absolute hx:-mt-20" id="3-windows-網路資料夾同時最大可允許連線"&gt;&lt;/span&gt;
&lt;a href="#3-windows-%e7%b6%b2%e8%b7%af%e8%b3%87%e6%96%99%e5%a4%be%e5%90%8c%e6%99%82%e6%9c%80%e5%a4%a7%e5%8f%af%e5%85%81%e8%a8%b1%e9%80%a3%e7%b7%9a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;20&lt;/p&gt;
&lt;p&gt;dhcp 應根據 mac address 來設定 IP&lt;/p&gt;</description></item><item><title>面試 - 口說</title><link>https://blog.kubeantony.com/archive/misc/%E9%9D%A2%E8%A9%A6-%E5%8F%A3%E8%AA%AA/</link><pubDate>Sun, 26 Feb 2023 16:07:48 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E9%9D%A2%E8%A9%A6-%E5%8F%A3%E8%AA%AA/</guid><description>
&lt;h2&gt;Deployment&lt;span class="hx:absolute hx:-mt-20" id="deployment"&gt;&lt;/span&gt;
&lt;a href="#deployment" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deployment 由 Replicaset 和 pod 組成&lt;/li&gt;
&lt;li&gt;Deployment 管理 ReplicaSet ， ReplicaSet 管理 Pods&lt;/li&gt;
&lt;li&gt;Deployment 為 Replicaset 和 pod 提供一種宣告式的設定和更新方式，可以在 Deployment object yaml 檔裡面的 replicas 或是 透過命令式 &lt;code&gt;kubectl scale deploy deployment的名字 --replicas=&lt;/code&gt; 多少來設定 pod 的數量。&lt;/li&gt;
&lt;li&gt;在硬體資源允許下，Replicaset 會幫我們建立出使用者期望的 pod 數量，並且一直維持這個數量，也就是說當有一台 pod 毀損時，Replicaset 會自動再產生同樣的 pod 出來，而多個 pod 是本尊與分身的概念，都提供同樣的服務，這麼做的目的是為了讓服務可以達到平衡負載。&lt;/li&gt;
&lt;li&gt;透過 &lt;code&gt;kubectl set image deployment.v1.apps/deployment的名字 Container名字=image完整資訊 --record&lt;/code&gt; 可以在更新 Deployment 的 image 版本的同時，將 image 的資訊記錄下來，而它的更新方式會先建立出新的 pod 再把舊的版本移除&lt;/li&gt;
&lt;li&gt;也可以透過 &lt;code&gt;kubectl rollout undo deployment.v1.apps/deployment的名字 --to-revision=&lt;/code&gt; 回到指定的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;sts,&lt;span class="hx:absolute hx:-mt-20" id="sts"&gt;&lt;/span&gt;
&lt;a href="#sts" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;service (3),&lt;span class="hx:absolute hx:-mt-20" id="service-3"&gt;&lt;/span&gt;
&lt;a href="#service-3" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;deamonset,&lt;span class="hx:absolute hx:-mt-20" id="deamonset"&gt;&lt;/span&gt;
&lt;a href="#deamonset" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;static pod,&lt;span class="hx:absolute hx:-mt-20" id="static-pod"&gt;&lt;/span&gt;
&lt;a href="#static-pod" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;nginx.ingress,&lt;span class="hx:absolute hx:-mt-20" id="nginxingress"&gt;&lt;/span&gt;
&lt;a href="#nginxingress" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;k8s叢集變複雜後我們一定會記不住有那些 pod，有哪些 ip，透過 ingress，輸入記得住的域名，再透過輸入不同的 path 會到不同的 service，不同的 service 就代表不同的 pod，不同的服務。&lt;/p&gt;
&lt;h2&gt;RBAC,&lt;span class="hx:absolute hx:-mt-20" id="rbac"&gt;&lt;/span&gt;
&lt;a href="#rbac" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;metalLB,&lt;span class="hx:absolute hx:-mt-20" id="metallb"&gt;&lt;/span&gt;
&lt;a href="#metallb" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;volume,&lt;span class="hx:absolute hx:-mt-20" id="volume"&gt;&lt;/span&gt;
&lt;a href="#volume" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;metrics server&lt;span class="hx:absolute hx:-mt-20" id="metrics-server"&gt;&lt;/span&gt;
&lt;a href="#metrics-server" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;CKA&lt;span class="hx:absolute hx:-mt-20" id="cka"&gt;&lt;/span&gt;
&lt;a href="#cka" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;Docker, Podman&lt;span class="hx:absolute hx:-mt-20" id="docker-podman"&gt;&lt;/span&gt;
&lt;a href="#docker-podman" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;multiple stage&lt;span class="hx:absolute hx:-mt-20" id="multiple-stage"&gt;&lt;/span&gt;
&lt;a href="#multiple-stage" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;</description></item><item><title>炬識 - 面試實作</title><link>https://blog.kubeantony.com/archive/misc/%E7%82%AC%E8%AD%98-%E9%9D%A2%E8%A9%A6%E5%AF%A6%E4%BD%9C/</link><pubDate>Wed, 22 Feb 2023 14:36:22 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E7%82%AC%E8%AD%98-%E9%9D%A2%E8%A9%A6%E5%AF%A6%E4%BD%9C/</guid><description>
&lt;h2&gt;題目1.&lt;span class="hx:absolute hx:-mt-20" id="題目1"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%8c%e7%9b%ae1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如何建構私有雲環境，達成自動化部署的成果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用者透過Web表單申請虛擬機器用於測試環境：Web表單內容提供虛擬機器範本可供選擇，
其中的範本包括軟體和硬體規格，如WindowsServer版本、SQL Server版本、Windows電腦名稱、
CPU、Memory等。&lt;/li&gt;
&lt;li&gt;為了避免資源浪費，必須考慮每位使用者可使用資源的配額限制，包括CPU核心數、記憶體大小、磁碟空間等。&lt;/li&gt;
&lt;li&gt;使用者申請的虛擬機器會自動加入Active Directory網域。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由於上述項目實作需要硬體資源與時間，因此僅需要提出解決方案的所使用的技術或平台即可。&lt;/p&gt;
&lt;h2&gt;解答1.&lt;span class="hx:absolute hx:-mt-20" id="解答1"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%941" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假設現在私有雲的環境是建立在 VMWare Player 之上，
我會先在一台主控機上，建立 12 台 Windows Server 的模板機，分別是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server 2012 (無 SQL Server)&lt;/li&gt;
&lt;li&gt;Windows Server 2012 (SQL Server 2017)&lt;/li&gt;
&lt;li&gt;Windows Server 2012 (SQL Server 2019)&lt;/li&gt;
&lt;li&gt;Windows Server 2012 (SQL Server 2022)&lt;/li&gt;
&lt;li&gt;Windows Server 2012 (無 SQL Server)&lt;/li&gt;
&lt;li&gt;Windows Server 2016 (SQL Server 2017)&lt;/li&gt;
&lt;li&gt;Windows Server 2016 (SQL Server 2019)&lt;/li&gt;
&lt;li&gt;Windows Server 2016 (SQL Server 2022)&lt;/li&gt;
&lt;li&gt;Windows Server 2019 (無 SQL Server)&lt;/li&gt;
&lt;li&gt;Windows Server 2019 (SQL Server 2017)&lt;/li&gt;
&lt;li&gt;Windows Server 2019 (SQL Server 2019)&lt;/li&gt;
&lt;li&gt;Windows Server 2019 (SQL Server 2022)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;並且會在每一台模板機中 C 磁碟機下，埋一支修改 Windows 電腦名稱，並且在修改電腦名稱後 和自動加入 AD 的程式 ，名字叫 automatic.bat&lt;/p&gt;
&lt;p&gt;再來，我會在主控機上，先用 go 語言建立一個簡單的網站，主要功能是可以填表單，這個表單的內容會分為 5 個部分 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一部分
&lt;ul&gt;
&lt;li&gt;用下拉式選單，讓使用者選擇 Windows Server 的版本 (2012, 2016, 2019)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二部分
&lt;ul&gt;
&lt;li&gt;建立 4 個選項按鈕，選擇 SQL Server 的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三部分
&lt;ul&gt;
&lt;li&gt;建立一個文字輸入欄位，填入 Windows 電腦名稱&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第四部份
&lt;ul&gt;
&lt;li&gt;建立一個文字輸入欄位，填入 CPU 要使用幾 Core&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第五部分
&lt;ul&gt;
&lt;li&gt;建立一個文字輸入欄位，填入記憶體要使用幾 G&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當使用者提交表單後，會結合 CGI 程式，這支 CGI 程式會將&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表單的內容，用 csv 的格式匯入一個檔案，並將檔案送到主控機上&lt;/li&gt;
&lt;li&gt;根據檔案內容，在主控機上自動部屬使用者透過 Web 表單申請虛擬機器&lt;/li&gt;
&lt;li&gt;cpu , 記憶體的部分，可藉由 修改 *.vmx 的檔案進行調整&lt;/li&gt;
&lt;li&gt;Windows 電腦名稱，藉由 vmtools 的工具，先得到 VM 的 IP 位置，在藉由 ssh 遠端執行 預先埋好在 C 磁碟機下的 automatic.bat 這支程式，在修改電腦名稱後會自動加入 AD&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;題目2.&lt;span class="hx:absolute hx:-mt-20" id="題目2"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%8c%e7%9b%ae2" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;請說明如何使用 K8s 生態系的工具與解決方案，解決以下的情境&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;搭建一個給開發團隊使用的「測試環境」之申請平台。&lt;/li&gt;
&lt;li&gt;開發團隊只需要簡單的提供自己所需的「測試環境規格」、該環境需要預安裝哪些「服務」、該服務的使用期限，即可送出申請。&lt;/li&gt;
&lt;li&gt;該平台接收到申請後，就會自動佈建該環境，並且將環境的各種必要的連線資訊，通知申請人。&lt;/li&gt;
&lt;li&gt;當環境超過使用期限，便會自動刪除。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意事項：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;該平台會依據資源使用量，自動分配要將「測試環境」架設在 K8s 的那些 Cluster 或 Node。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;請描述你會如何規劃這個平台，選用哪些 K8s 生態系的工具或解決方案，可以的話請說明這其中涉及了哪些人為及自動化的流程，
而你所選用的 K8s 生態系的工具或解決方案，分別在其中擔任哪些角色、解決了哪些需求。&lt;/p&gt;
&lt;h2&gt;解答2.&lt;span class="hx:absolute hx:-mt-20" id="解答2"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e7%ad%942" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先，假設 測試環境是在自建的原生 K8s 之上，系統架構是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 台 Master Node 、 6 台 Worker Node 和 3 台獨立存放 Etcd 的 Node&lt;/li&gt;
&lt;li&gt;CRI 用的是 CRI-O 並且結合 Podman ( CRI-O 並沒有 還原 image、 備份 image 、build、 export 和 import 的命令，只有下載 image 的能力，所以需要 podman 來支援 image 的管理 )&lt;/li&gt;
&lt;li&gt;CSI 用的是 NFS&lt;/li&gt;
&lt;li&gt;CNI 用的是 Flannel 網路套件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上高可用的 K8s 系統架構，可以解決 開發團隊在開發時，遇到單一台 Node 毀損時，K8s 系統可以持續提供服務環境。另外選擇 CRI-O 專案的原因是因為，這個專案，特別為 K8s 量身訂做，直接翻譯 kubelet 的話，K8s 會直接透過 CRI-O 來跟 runc 或是 crun 溝通產生 Container ，所以開發效率最優。&lt;/p&gt;
&lt;p&gt;在這之上，自建 Project QUAY ，企業自己的 Image 光片中心，當 開發團隊將 Application 包成 Container 後，可以在不用上網的情況下，將 image 傳到光片中心，以此解決資安上的問題。&lt;/p&gt;
&lt;p&gt;再建立 Jenkins ，並透過它的 CD 功能，可以將 github 上要測試的服務環境自動部屬出來&lt;/p&gt;
&lt;p&gt;假設現在提供服務的是 Web Server ，在 K8s 的環境中，它應該會有對應的 Service ，可以事先在 Jenkins 裡面的 pipeline ，將服務的對外 IP 顯示出來&lt;/p&gt;
&lt;p&gt;會先寫好一支程式，當使用者要進到 K8s 中，必須使用預先設定好的憑證登入到 K8s ，再設定檔中還會先規範好 Default 的 Namespace ，並對這個 Namespace 做硬體資源上的限制&lt;/p&gt;</description></item><item><title>2023/02/13</title><link>https://blog.kubeantony.com/archive/misc/2023-02-13/</link><pubDate>Mon, 13 Feb 2023 01:31:04 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/2023-02-13/</guid><description>
&lt;ul&gt;
&lt;li&gt;手工做母機，一定要先安裝 OpenSSH Server，以及設定憑證&lt;/li&gt;
&lt;li&gt;虛擬化技術中，一個資料夾代表一台電腦&lt;/li&gt;
&lt;li&gt;當自己安裝好 Linux 系統時，可以先冷凍 root 帳號(將密碼設成過期)，這樣做的好處，可以防止 root 的密碼被猜到&lt;/li&gt;
&lt;li&gt;Human Error 會造成大量成本&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>batch FOR</title><link>https://blog.kubeantony.com/archive/misc/batch-for/</link><pubDate>Mon, 16 Jan 2023 05:25:44 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/batch-for/</guid><description>
&lt;p&gt;對一組檔案中的每個檔案執行指定的命令。&lt;/p&gt;
&lt;p&gt;FOR %variable IN (set) DO 命令 [command-parameters]&lt;/p&gt;
&lt;p&gt;%variable 指定一個可以取代的參數。
(set) 指定由一或多個檔案組成的檔案組。您可使用通配字元。
command 指定命令來執行每一個檔案。
command-parameters
為所指定的命令指定變數或參數。&lt;/p&gt;
&lt;p&gt;如果要在批次程式中使用 FOR 命令，請指定 %%variable，而不要指定
%variable。變數名稱有大小寫的區分，所以 %i 不同於 %I。&lt;/p&gt;
&lt;p&gt;如果您啟用擴充命令，則額外支援下列的 FOR 命令格式:&lt;/p&gt;
&lt;p&gt;FOR /D %variable IN (set) DO command [command-parameters]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;如果 set 中包含萬用字元，則指定與目錄名稱相符，
而不是與檔案名稱相符。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在樹狀目錄中切換 [drive:] 路徑，並於樹狀目錄的每
一個目錄下執行 FOR 陳述式。如果未在 /R 之後指定
目錄規格，則採用目前的目錄。如果 set 只是單一句
點 (.) 字元，則它只會列舉樹狀目錄。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FOR /L %variable IN (start,step,end) DO command [command-parameters]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set 是從開頭到結尾一次跳一步的連續數字。所以
(1,1,5) 會產生連續值 (1 2 3 4 5) 而 (5,-1,1)
會產生連續值 (5 4 3 2 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (file-set) DO command [command-parameters]
FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (&amp;ldquo;string&amp;rdquo;) DO command [command-parameters]
FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (&amp;lsquo;command&amp;rsquo;) DO command [command-parameters]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;或，如果使用 usebackq 選項:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (file-set) DO command [command-parameters]
FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (&amp;lsquo;string&amp;rsquo;) DO command [command-parameters]
FOR /F [&amp;ldquo;options&amp;rdquo;] %variable IN (&lt;code&gt;command&lt;/code&gt;) DO command [command-parameters]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file-set 可以是一或多個檔案名稱。繼續進行 file-set 中的下個
檔案之前，都已開啟、讀取及處理過每個檔案。處理程序包括讀取
檔案、將它分割成獨立的文字行，然後將每一行剖析成零或多個語
法。使用已設成找到之語法字串的變數值，呼叫 For 迴圈的內容。
依照預設，/F 會從每個檔案的每一行傳送第一個以空格分隔的權
杖。空白行會被略過。您可以指定選擇性的 &amp;quot;options&amp;quot; 參數來覆寫
預設的剖析行為。這是有引號的字串，包含一或多個指定不同剖析
選項的關鍵字。關鍵字是:
eol=c - 指定一個行尾註解字元 (只有一個)
skip=n - 指定在檔案開頭要略過的行數。
delims=xxx - 指定分隔符號集。這會取代預設的空格
與定位字元的分隔符號集。
tokens=x,y,m-n - 指定每一行的哪些語法應該被傳到 for
的內部以進行每一個重複操作。這會造
成配置額外的變數名稱。m-n 格式代表
一個範圍，指定了第 m 個到第 n 個權
杖。如果 tokens= 字串的最後一個字
元是星號，則會配置一個額外的變數並
在最後一個語法被剖析後接收該行中的
其他文字。
usebackq - 指定新語義開始作用。其中反括號的字
串會被當作命令來執行，而單引號字串
是純文字字串命令，並且允許使用雙引
號來引用 file-set 中的檔名。
以下是一個範例:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FOR /F &amp;ldquo;eol=; tokens=2,3* delims=, &amp;quot; %i in (myfile.txt) do @echo %i %j %k&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;這會剖析 myfile.txt 檔案中的每一行，它不會去管以分號開頭的行數
，直接將第 2 個及第 3 個語法從每一行傳到 for 主體，而其語法是
用逗號和/或空格分開的。請注意，for 主體陳述式參照 %i 以取得第
二個語法，參照 %j 以取得第三個語法，使用 %k 取得第三個語法之
後的剩餘字串。因為檔案名稱含有空格，您必須用雙引號來括住檔案名
稱。要這樣使用雙引號，您必須使用 usebackq 參數。否則雙引號會被
解譯成用來定義一般文字。
使用 %i 明白地在 for 陳述式中宣告，並透過 tokens= option 使用
%j 作暗示性的宣告。您可以藉由 tokens= line 來指定最多 26 個語
法，前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住，FOR 變
數是單一字元的，同時在任一時間內，您不能同時使用超過 52 個 FOR
變數。
您也可以使用 FOR /F 命令在立即字串中剖析邏輯，方法是將括弧之間的
file-set 變成一個引號字串。它會被視為從檔案輸入的單行，並加
以剖析。
最後，您可以使用 FOR /F 命令來剖析一個命令的輸出。方法是將括弧
內的 file-set 變成單引號字串。它將被視為一個命令列，這個命令
行將會傳到子 CMD.EXE，而輸出將會被擷取到記憶體中，當成檔案來分
析。所以下列的範例:
FOR /F &amp;quot;delims==&amp;quot; %i IN ('set') DO @echo %i
將列舉目前環境中的環境變數名稱。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此外，已經加強了 FOR 變數參考的取代功能。
您現在可以選用下列選擇性的語法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%~I - 展開 %I 且移除包圍的引號 (&amp;quot;)
%~fI - 展開 %I 為一個完整合格路徑名稱
%~dI - 只展開 %I 為磁碟機代號
%~pI - 只展開 %I 為路徑
%~nI - 只展開 %I 為檔名
%~xI - 只展開 %I 為副檔名
%~sI - 展開的路徑只包含短檔名
%~aI - 展開 %I 為檔案的檔案屬性
%~tI - 展開 %I 為檔案的日期/時間
%~zI - 展開 %I 檔案的長度
%~$PATH:I - 搜尋所有列在 PATH 環境變數內的目錄且展開 %I
為第一個找到的完全符合檔名。如果沒有定義環境
變數名稱或是搜尋找不到檔案，則這個修飾元會展
開為空字串。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修飾元可以合併使用以獲得綜合的結果:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%~dpI - 只展開 %I 為磁碟機代號與路徑
%~nxI - 只展開 %I 為檔名與副檔名
%~fsI - 只展開 %I 為含短檔名的完全路徑
%~dp$PATH:I - 為 %I 搜尋所有列在 PATH 環境變數內的目錄
且展開第一個找到的項目為磁碟機代號及路徑。
%~ftzaI - 展開 %I 為像 DIR 一樣的輸出行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的範例中 %I 和 PATH 能用其他的合法值取代。%~ 語法是由合法的
FOR 變數名稱來終止。如果選用像 %I 的大寫名稱可以增加可讀性而且避免
和修飾元的混淆，因為這些並不區分大小寫。&lt;/p&gt;</description></item><item><title>Untitled</title><link>https://blog.kubeantony.com/archive/misc/untitled-11/</link><pubDate>Sun, 08 Jan 2023 03:02:10 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/untitled-11/</guid><description>
&lt;p&gt;main.go&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;net/http&amp;#34;
&amp;#34;net/http/cgi&amp;#34;
)
func cgiMyDB(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;/opt/www/cgi/mydb.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func cgiMyData(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;/opt/www/cgi/mydata.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func cgiSetup(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;/opt/www/cgi/mysetup.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func main() {
static := http.FileServer(http.Dir(&amp;#34;/opt/www&amp;#34;))
http.Handle(&amp;#34;/&amp;#34;,static)
http.HandleFunc(&amp;#34;/db&amp;#34;, cgiMyDB)
http.HandleFunc(&amp;#34;/data&amp;#34;, cgiMyData)
http.HandleFunc(&amp;#34;/setup&amp;#34;, cgiSetup)
fmt.Println(&amp;#34;:8080&amp;#34;)
http.ListenAndServe(&amp;#34;:8080&amp;#34;, nil)
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mydb.sh&lt;/code&gt; 連線到 mysql Cluster&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mydata.sh&lt;/code&gt; 連線到 大數據&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mysetup.sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>嘿嘿</title><link>https://blog.kubeantony.com/archive/misc/%E5%98%BF%E5%98%BF/</link><pubDate>Sat, 10 Dec 2022 13:41:42 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E5%98%BF%E5%98%BF/</guid><description>
&lt;p&gt;&lt;a
href="https://hackmd.io/Zxixtj9zQkyW8h_ihz_-6Q"target="_blank" rel="noopener"&gt;https://hackmd.io/Zxixtj9zQkyW8h_ihz_-6Q&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
href="https://hackmd.io/M6RbBPtXQaqPojW9VVAK6w"target="_blank" rel="noopener"&gt;https://hackmd.io/M6RbBPtXQaqPojW9VVAK6w&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
href="https://github.com/Bookman-W/kdm/blob/b51aa918c719a89d29e4f0f603b9e7a8671c6510/kdm"target="_blank" rel="noopener"&gt;https://github.com/Bookman-W/kdm/blob/b51aa918c719a89d29e4f0f603b9e7a8671c6510/kdm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
href="https://hackmd.io/rHpGBqQHSg-I4f-G2DKrRw?both"target="_blank" rel="noopener"&gt;https://hackmd.io/rHpGBqQHSg-I4f-G2DKrRw?both&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Untitled</title><link>https://blog.kubeantony.com/archive/misc/untitled-2/</link><pubDate>Sun, 09 Oct 2022 14:26:32 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/untitled-2/</guid><description>
&lt;p&gt;&lt;img src="https://i.imgur.com/enNnZfW.png" alt="" loading="lazy" /&gt;&lt;/p&gt;</description></item><item><title>莊明城老師</title><link>https://blog.kubeantony.com/archive/misc/%E8%8E%8A%E6%98%8E%E5%9F%8E%E8%80%81%E5%B8%AB/</link><pubDate>Sun, 18 Sep 2022 03:06:00 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E8%8E%8A%E6%98%8E%E5%9F%8E%E8%80%81%E5%B8%AB/</guid><description>
&lt;h2&gt;Linux KVM&lt;span class="hx:absolute hx:-mt-20" id="linux-kvm"&gt;&lt;/span&gt;
&lt;a href="#linux-kvm" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/virtualization/linux-kvm/"&gt;Linux KVM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Kubernetes&lt;span class="hx:absolute hx:-mt-20" id="kubernetes"&gt;&lt;/span&gt;
&lt;a href="#kubernetes" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/security/multi-tenancy-security-aaa/"&gt;Multi Tenancy Security AAA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/container/project-quay-%e7%b7%b4%e7%bf%92/"&gt;Project Quay 練習&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/kubernetes/kubernetes-deployment/"&gt;Kubernetes Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/kubernetes/kubernetes-statefulset/"&gt;Kubernetes StatefulSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/kubernetes/kubernetes-resource-storage-by-%e6%98%8e%e5%9f%8e%e8%80%81%e5%b8%ab/"&gt;Kubernetes Resource Storage by 明城老師&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>楊承羲老師</title><link>https://blog.kubeantony.com/archive/misc/%E6%A5%8A%E6%89%BF%E7%BE%B2%E8%80%81%E5%B8%AB/</link><pubDate>Thu, 08 Sep 2022 06:56:12 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E6%A5%8A%E6%89%BF%E7%BE%B2%E8%80%81%E5%B8%AB/</guid><description>
&lt;h2&gt;Linux&lt;span class="hx:absolute hx:-mt-20" id="linux"&gt;&lt;/span&gt;
&lt;a href="#linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/misc/linux-startup-process-%e9%96%8b%e6%a9%9f%e6%b5%81%e7%a8%8b/"&gt;Linux startup Process 開機流程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CI/CD Overview&lt;span class="hx:absolute hx:-mt-20" id="cicd-overview"&gt;&lt;/span&gt;
&lt;a href="#cicd-overview" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/ci-cd-overview/"&gt;CI/CD Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/rest-api/"&gt;REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/jenkins/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/jenkins-part-2/"&gt;Jenkins - Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/canary-deployment/"&gt;Canary Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Git&lt;span class="hx:absolute hx:-mt-20" id="git"&gt;&lt;/span&gt;
&lt;a href="#git" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/git/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://blog.kubeantony.com/ops-automation/git-part-2/"&gt;Git - Part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>專題</title><link>https://blog.kubeantony.com/archive/misc/%E5%B0%88%E9%A1%8C/</link><pubDate>Thu, 01 Sep 2022 06:32:02 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E5%B0%88%E9%A1%8C/</guid><description>
&lt;h2&gt;架構圖&lt;span class="hx:absolute hx:-mt-20" id="架構圖"&gt;&lt;/span&gt;
&lt;a href="#%e6%9e%b6%e6%a7%8b%e5%9c%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/Lzc22Ho.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;戰略規劃&lt;span class="hx:absolute hx:-mt-20" id="戰略規劃"&gt;&lt;/span&gt;
&lt;a href="#%e6%88%b0%e7%95%a5%e8%a6%8f%e5%8a%83" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;mydb pod
&lt;ul&gt;
&lt;li&gt;須要將自己的 3306 port 對應到 w2 主機的 3306 port (hostPort in yaml)&lt;/li&gt;
&lt;li&gt;我們需要在 windows 打開 workbench 可以連到這個 mysql 的資料庫&lt;/li&gt;
&lt;li&gt;要啟用 hostPath PV ，在 w2 規劃一個目錄區，讓 mydb pod 的資料可以永存&lt;/li&gt;
&lt;li&gt;使用這個 pod 的人，在外面的職缺是 DBA ( DataBase Admin)&lt;/li&gt;
&lt;li&gt;啟動 binlog 與 CDC 來達到容錯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pod-fbs
&lt;ul&gt;
&lt;li&gt;在 w1 的 &lt;code&gt;/opt/www&lt;/code&gt; 用 hostPath PV 的方法掛載到 /srv&lt;/li&gt;
&lt;li&gt;用 hostPort 開一個 8080 port&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;goweb pod
&lt;ul&gt;
&lt;li&gt;pod 裡的 &lt;code&gt;/www&lt;/code&gt; 用 hostPath PV 的方法掛載到 /srv&lt;/li&gt;
&lt;li&gt;與 fbs 共用同一個資料夾&lt;/li&gt;
&lt;li&gt;透過 cgi 程式與 mydb pod 的資料庫對接&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;gosrv
&lt;ul&gt;
&lt;li&gt;K8S Service&lt;/li&gt;
&lt;li&gt;與 goweb pod 綁定&lt;/li&gt;
&lt;li&gt;讓我們能夠從外部連線到 goweb pod 的網站&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;以上物件皆須建在 bobo namespace&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux Process Part1</title><link>https://blog.kubeantony.com/archive/misc/linux-process-part1/</link><pubDate>Sat, 20 Aug 2022 02:51:42 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/linux-process-part1/</guid><description>
&lt;hr&gt;
&lt;h1&gt;陳老師 課程整體架構&lt;/h1&gt;&lt;p&gt;Docker 碼頭工人&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既是公司名也是軟體名&lt;/li&gt;
&lt;li&gt;核心技術 :
&lt;ul&gt;
&lt;li&gt;Application Container 軟體貨櫃 ( 一台電腦 )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kubernetes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由 Google 公司攥寫，穩定度不容小覷&lt;/li&gt;
&lt;li&gt;維運一堆 Application Container&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目前對 Docker 的討論已轉向 kubernetes，
可以說整個資訊界系統革命由 Docker 和 Kubernetes 創造的&lt;/p&gt;
&lt;p&gt;Hadoop&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;資料科技平台的核心&lt;/li&gt;
&lt;li&gt;又稱 : 資訊中台&amp;hellip;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spark&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由 Hadoop 堆上去的應用&lt;/li&gt;
&lt;li&gt;可以做 machine learning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hive&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以做商業智慧 ( BI )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要網站&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cncf.io (系統工程的 Open Source)&lt;/li&gt;
&lt;li&gt;apache.org (資料科技的 Open Source )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;企業為什麼買電腦？&lt;span class="hx:absolute hx:-mt-20" id="企業為什麼買電腦"&gt;&lt;/span&gt;
&lt;a href="#%e4%bc%81%e6%a5%ad%e7%82%ba%e4%bb%80%e9%ba%bc%e8%b2%b7%e9%9b%bb%e8%85%a6" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;20 幾年前公司為了買電腦是因為電子化，不需要再使用紙本，但是電腦在很多公司還是被當成電子打字機，&lt;/li&gt;
&lt;li&gt;但時間往後走，資料庫出來了，打破原本電腦的使用方式，很多的企業會去買工作站（Server），讓企業建置出很多應用系統：會計系統、物料系統&amp;hellip;等，&lt;/li&gt;
&lt;li&gt;時間往後再走，老闆要求可不可以快速給分析報表，買更強的Server，做出更強的應用系統，讓企業做出決策的能力。&lt;/li&gt;
&lt;li&gt;現在台灣流行的是做出預測的能力，譬如銀行會做呆帳的預測，呆帳比例越低獲利越高，一路走來企業為的就是：&lt;font color=red&gt;&lt;strong&gt;要建置出各自需要的應用系統與軟體，來達到應用的需求。&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;應用軟體、應用系統，要經過開發、寫程式才會出來，才能執行應用。&lt;/li&gt;
&lt;li&gt;&lt;font color=red&gt;一個正在跑的應用系統由 &amp;ldquo;&lt;strong&gt;多個應用程序&lt;/strong&gt;&amp;rdquo; + &amp;ldquo;&lt;strong&gt;系統背景服務程序&lt;/strong&gt;&amp;rdquo; 組成&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;寫程式要選擇電腦的語言，來開發企業所需要的應用系統，但為了寫程式同時硬體也要到位。&lt;/li&gt;
&lt;li&gt;接下來要教的 &lt;font color=red&gt;&lt;strong&gt;Container 和 Kubernetes 就是讓以上的應用系統能跑得安安穩穩長長久久&lt;/strong&gt;。&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;建置 Docker 虛擬主機&lt;span class="hx:absolute hx:-mt-20" id="建置-docker-虛擬主機"&gt;&lt;/span&gt;
&lt;a href="#%e5%bb%ba%e7%bd%ae-docker-%e8%99%9b%e6%93%ac%e4%b8%bb%e6%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 Windows 系統, 啟動 Browser, 下載 CNT.2022.v4.2.zip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下載後, 請解壓縮至 使用者家目錄, 例如 /user/rbean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Windows 系統的 cmd 終端機,執行以下命令&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 切換工作目錄&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\r&lt;/span&gt;bean&amp;gt;cd CNT.2022.v4.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 檢視 docker 命令可用那些參數&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\r&lt;/span&gt;bean&lt;span class="se"&gt;\C&lt;/span&gt;NT.2022.v4.2&amp;gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;docker [create|start|stop|delete]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 建立 alp.docker VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\r&lt;/span&gt;bean&lt;span class="se"&gt;\C&lt;/span&gt;NT.2022.v4.2&amp;gt; docker create
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;DK\alp.docker\ created&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 啟動 alp.docker VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\y&lt;/span&gt;bean&lt;span class="se"&gt;\C&lt;/span&gt;NT.2022.v4.2&amp;gt; docker start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ssh 遠端連線到 alp.docker 這台 VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 回答 yes ，表示要接收這台 VM 的 OpenSSH Server 的公鑰&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\y&lt;/span&gt;bean&lt;span class="se"&gt;\C&lt;/span&gt;NT.2022.v4.2&amp;gt;ssh bigred@192.168.61.144
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The authenticity of host &lt;span class="s1"&gt;&amp;#39;120.96.143.25 (120.96.143.25)&amp;#39;&lt;/span&gt; cant be established.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ECDSA key fingerprint is SHA256:haOU24boysVt3pRy0TLgE7rIYx6p4rkLfjOXrBewEU0.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Are you sure you want to &lt;span class="k"&gt;continue&lt;/span&gt; connecting &lt;span class="o"&gt;(&lt;/span&gt;yes/no/&lt;span class="o"&gt;[&lt;/span&gt;fingerprint&lt;span class="o"&gt;])&lt;/span&gt;? yes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/dboQLRI.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;Alpine Linux 的組成&lt;span class="hx:absolute hx:-mt-20" id="alpine-linux-的組成"&gt;&lt;/span&gt;
&lt;a href="#alpine-linux-%e7%9a%84%e7%b5%84%e6%88%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;musl libc&lt;span class="hx:absolute hx:-mt-20" id="musl-libc"&gt;&lt;/span&gt;
&lt;a href="#musl-libc" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ /lib/libc.musl-x86_64.so.1
musl libc (x86_64)
Version 1.2.2
Dynamic Program Loader
Usage: /lib/libc.musl-x86_64.so.1 [options] [--] pathname [args]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;C 語言的程式庫，裡面有一堆系統的底層運作程式。我們寫的程式會呼叫 System Call 來跟 linux 的 kernel 做溝通&lt;/li&gt;
&lt;li&gt;musl libc = Linux 系統的 API = System call
&lt;blockquote&gt;
&lt;p&gt;API 可以想成 bash Script 的 Function&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;系統底層的 API 可以讓程式用簡單的指令對 Linux 系統進行操作，而不用實際了解其底層運作及架構 例如: 在檔案系統上做產生目錄區、記憶體配置、指定網卡等動作
&lt;blockquote&gt;
&lt;p&gt;so = system object&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;用 C 語言要創造一個目錄區，需不需要透過 System API ( musl libc )？
yes，因為 Linux 的目錄區和檔案，會經過 file system (檔案系統)來做的，linux 的檔案系統叫做 ext4，這個檔案系統他怎麼處理目錄，怎麼處理檔案，檔案名稱怎麼儲存，檔案的內容要放哪裡?一個檔案系統在存資料要不要有所謂的 Meta Data ?要不要有資料儲存的 location ?這個檔案系統怎麼樣在運作，內部是很複雜的，而 linux 裡面有人寫好了一些程式，讓我們可以很方便的使用這個 API (Appication Programming Interface) ，只要跟它說我要產生的資料夾名稱和資料夾的權限，它就幫我去產生了。&lt;/li&gt;
&lt;li&gt;我們的 Alpine Linux 為甚麼需要 &lt;code&gt;musl libc (x86_64)&lt;/code&gt; ?
因為有了它，我們寫的 C 語言的一些高階程式，可以很方便的在檔案系統來產生目錄，可以很方便的在電腦的記憶體裡面挖一塊出來用，可以很方便的指定哪一片網卡幫我送資料，底層的真正的操作運作可以不需要了解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程式執行一定會呼叫系統 API 和應用 API，這兩個 API 都是用電腦語言寫的&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;不使用 System API 就必須熟悉系統的所有功能，並且用程式語言完全實現，這樣耗費時間、效率低落
&lt;blockquote&gt;
&lt;p&gt;以應用開發工程師來說，不使用 API 就必須熟悉系統的所有功能，並且用程式語言完全實現，這樣開發應用相對耗費時間、效率低落，但如果是系統開發工程師，不可避免需要去理解抵成並用程式實現功能、包裝成 API&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;高階程式設計師可透過現有函數很方便的操作系統 ( CPU、網路、記憶體 )，不需知道系統底層運作原理即可操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;busybox&lt;span class="hx:absolute hx:-mt-20" id="busybox"&gt;&lt;/span&gt;
&lt;a href="#busybox" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ which busybox
/bin/busybox
bigred@alp:~$ ls -lh /bin/busybox
-rwxr-xr-x 1 root root 806K Apr 4 18:19 /bin/busybox&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;busybox&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文 : 瑞士刀&lt;/li&gt;
&lt;li&gt;檔案大小 : 806 kb ，是用 C 語言寫的，可以模擬很多 Linux 常用指令（cat、cp&amp;hellip;）&lt;/li&gt;
&lt;li&gt;屬於高階應用的命令，也會呼叫 System API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;apk&lt;span class="hx:absolute hx:-mt-20" id="apk"&gt;&lt;/span&gt;
&lt;a href="#apk" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk update ; sudo apk upgrade&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;apk ，全名 : &lt;code&gt;alpine package&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;apk 套件管理系統，讓我們可以在 Alpine linux 裡面，加裝一些套件，譬如: openssh server 、 jdk-8 &amp;hellip;等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update&lt;/code&gt; + &lt;code&gt;upgrade&lt;/code&gt; 等同於 microsoft 的系統更新，可以修正作業系統的漏洞&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;小總結&lt;span class="hx:absolute hx:-mt-20" id="小總結"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8f%e7%b8%bd%e7%b5%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;企業買電腦就是為了做出他們需要的應用系統，而應用系統是用程式寫出來的，而我們寫的程式大多都屬於高階的，會去呼叫和使用底層的系統 API，以 bash Script 來說就是 Function，人家寫好的 system function，讓我們不需要接觸最底層的程式設計，在應用這層不需要耗費這些時間。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;應用系統最常見的就是會計系統、銀行的呆帳系統&amp;hellip;等&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;下載 Alpine Linux&lt;span class="hx:absolute hx:-mt-20" id="下載-alpine-linux"&gt;&lt;/span&gt;
&lt;a href="#%e4%b8%8b%e8%bc%89-alpine-linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a
href="https://alpinelinux.org/downloads/"target="_blank" rel="noopener"&gt;下載 Alpine Linux 連結&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STANDARD ，根據 CPU 的規格來區分，主要裝在實體電腦， Intel 的 CPU 主要是下載 &lt;code&gt;x86_64&lt;/code&gt; 這個項目，下載下來的檔案是一個光碟檔 (&lt;code&gt;*.iso&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;EXTENDED ，下載下來的 Alpine 會在記憶體裡面跑，檔案會寫入 USB&lt;/li&gt;
&lt;li&gt;NETBOOT ，透過網路就可以把 Alpine 裝起來&lt;/li&gt;
&lt;li&gt;MINI ROOT FILESYSTEM ，可以裝在 Container 上&lt;/li&gt;
&lt;li&gt;RASPBERRY PI ，裝在樹梅派上&lt;/li&gt;
&lt;li&gt;VIRTUAL ，裝在 VMware 的 VM 上&lt;/li&gt;
&lt;li&gt;XEN ，裝在 Xen Hypervisor 啟動的 VM 上&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Alpine Linux 系統更新&lt;span class="hx:absolute hx:-mt-20" id="alpine-linux-系統更新"&gt;&lt;/span&gt;
&lt;a href="#alpine-linux-%e7%b3%bb%e7%b5%b1%e6%9b%b4%e6%96%b0" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Alpine Linux 系統更新
$ sudo apk update; sudo apk upgrade&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;;&lt;/code&gt; ，表示不管前面的命令有無執行成功，只要結束，就會跑後面的命令。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;80 年代大型主機實體架構&lt;span class="hx:absolute hx:-mt-20" id="80-年代大型主機實體架構"&gt;&lt;/span&gt;
&lt;a href="#80-%e5%b9%b4%e4%bb%a3%e5%a4%a7%e5%9e%8b%e4%b8%bb%e6%a9%9f%e5%af%a6%e9%ab%94%e6%9e%b6%e6%a7%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/RnSTxTz.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RS-232&lt;/code&gt; ，一條連接線，讓終端機與 Linux 主機連接&lt;/li&gt;
&lt;li&gt;終端機的組成 : 螢幕 + 鍵盤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在終端機上面一定會跑一支貝殼程式&lt;/strong&gt; ( 例如， sh, ash, zsh, bash &amp;hellip;等 )&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;貝殼程式主要負責接收我們下達的命令&lt;/strong&gt;，命令會藉由 RS-232 這條線傳給 Linux 主機，命令的結果會再藉由 RS-232 這條線傳給終端機上面的貝殼程式，貝殼程式收到後會幫我們把命令結果顯示在終端機的螢幕上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux 系統支援協同作業 (多人同時共用一台主機)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;建立 Alpine Linux 使用者帳號&lt;span class="hx:absolute hx:-mt-20" id="建立-alpine-linux-使用者帳號"&gt;&lt;/span&gt;
&lt;a href="#%e5%bb%ba%e7%ab%8b-alpine-linux-%e4%bd%bf%e7%94%a8%e8%80%85%e5%b8%b3%e8%99%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ echo -e &amp;#34;rbean\nrbean&amp;#34; | sudo adduser -s /bin/bash rbean
Changing password for rbean
New password:
Bad password: too short
Retype password:
passwd: password for rbean changed by root&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;adduser&lt;/code&gt; ，Alpine Linux 新增使用者帳號的命令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; ，設定貝殼程式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo -e&lt;/code&gt; ，讓反斜線可以轉義&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\n&lt;/code&gt; ，換行符號&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 檢視 Linux 系統放帳號資訊的檔案
$ tail -n 2 /etc/passwd
utmp:x:102:406:utmp:/home/utmp:/bin/false
rbean:x:1002:1002:Linux User,,,:/home/rbean:/bin/bash
# 檢查家目錄，有無建立成功
$ ls -al /home
total 20
drwxr-xr-x 5 root root 4096 Jun 8 19:54 .
drwxr-xr-x 23 root root 4096 May 26 00:42 ..
drwxr-sr-x 5 bigred bigred 4096 Feb 17 10:09 bigred
drwxr-sr-x 2 qemu kvm 4096 Sep 5 2020 qemu
drwxr-sr-x 2 rbean rbean 4096 Jun 8 19:54 rbean&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;每個 Linux 的使用者一定會有一個家目錄 ( &lt;code&gt;/home/$USER&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;rbean 登入 Alpine Linux 虛擬主機&lt;span class="hx:absolute hx:-mt-20" id="rbean-登入-alpine-linux-虛擬主機"&gt;&lt;/span&gt;
&lt;a href="#rbean-%e7%99%bb%e5%85%a5-alpine-linux-%e8%99%9b%e6%93%ac%e4%b8%bb%e6%a9%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 在 Windows 系統的 cmd 視窗, 執行以下命令
$ ssh rbean@&amp;lt;alp.docker IP&amp;gt;
Welcome to Alpine Linux : 3.16.0
IP : 192.168.61.146
# 虛擬終端機
$ tty
/dev/pts/1
# 檢查現在有動態產生幾個虛擬終端機
$ ls -al /dev/pts
total 0
drwxr-xr-x 2 root root 0 Aug 8 10:13 .
drwxr-xr-x 13 root root 2780 Aug 8 10:14 ..
crw--w---- 1 bigred tty 136, 0 Aug 8 11:26 0
crw--w---- 1 rbean tty 136, 1 Aug 8 11:27 1
c--------- 1 root root 5, 2 Aug 8 10:13 ptmx
# 顯示當前使用者用的貝殼程式
$ echo $SHELL
/bin/bash
# 顯示當前使用者家目錄的路徑
$ echo $HOME
/home/rbean
$ exit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/dev/pts/1&lt;/code&gt; ，&lt;code&gt;dev&lt;/code&gt; ，裝置的意思，&lt;code&gt;pts&lt;/code&gt; ，ssh 遠端連接進來的虛擬終端機，&lt;code&gt;/1&lt;/code&gt;，1 號虛擬終端機&lt;/li&gt;
&lt;li&gt;每個 Linux 使用者透過 ssh 遠端連線，一定會有一個虛擬終端機可以使用，在這台虛擬終端機上還會跑一支貝殼程式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/tty&lt;/code&gt; ，本機終端設備的統稱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/pts&lt;/code&gt; ，遠端虛擬終端
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pts&lt;/code&gt; ，pseudo terminal slave&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The difference between TTY and PTS is the type of connection to the computer. TTY ports are direct connections to the computer such as a keyboard/mouse or a serial connection to the device. PTS connections are SSH connections or telnet connections. All of these connections can connect to a shell which will allow you to issue commands to the computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 在 bigred 使用者建立 gbean 使用者帳號
$ echo -e &amp;#34;gbean\ngbean&amp;#34; | sudo adduser -s /bin/bash gbean
Changing password for gbean
New password:
Bad password: too short
Retype password:
passwd: password for gbean changed by root
# 檢視 gbean 帳號資訊
$ tail -n 2 /etc/passwd
rbean:x:1002:1002:Linux User,,,:/home/rbean:/bin/bash
gbean:x:1003:1003:Linux User,,,:/home/gbean:/bin/bash
# 檢查 gbean 帳號家目錄
$ ls -l /home
total 16
drwxr-sr-x 5 bigred bigred 4096 Jun 27 21:12 bigred
drwxr-sr-x 2 gbean gbean 4096 Aug 8 11:29 gbean
drwxr-sr-x 2 qemu kvm 4096 Sep 5 2020 qemu
drwxr-sr-x 2 rbean rbean 4096 Aug 8 11:22 rbean
# gbean 登入 Alpine Linux 虛擬主機
$ ssh bigred@120.96.143.25
# 檢查自己用幾號虛擬終端機
$ tty
/dev/pts/2
# 看目前總共有幾台虛擬終端機
$ ls -al /dev/pts/
total 0
drwxr-xr-x 2 root root 0 Aug 8 10:13 .
drwxr-xr-x 13 root root 2780 Aug 8 10:14 ..
crw--w---- 1 bigred tty 136, 0 Aug 8 11:30 0
crw--w---- 1 rbean tty 136, 1 Aug 8 11:27 1
crw--w---- 1 gbean tty 136, 2 Aug 8 11:31 2
c--------- 1 root root 5, 2 Aug 8 10:13 ptmx
# 看自己用哪個貝殼程式
gbean@alp:~$ echo $SHELL
/bin/bash
# 顯示自己的家目錄路徑
gbean@alp:~$ echo $HOME
/home/gbean&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;在本機看終端機&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ tty
/dev/tty1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/dev/tty1&lt;/code&gt; ，1 號本機終端機&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;電腦程式語言的運作模式&lt;/h1&gt;&lt;h2&gt;&lt;strong&gt;Interpreter&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="interpreter"&gt;&lt;/span&gt;
&lt;a href="#interpreter" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/a6gfLLc.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source Code 的意思，以 sheel 程式舉例，就是我們在寫的 bash Script&lt;/li&gt;
&lt;li&gt;系統會一行一行的執行我們所寫的程式，當執行完第一行時，會有解析器，把我們寫的程式變成電腦看得懂的 2 進位的機械碼(machine code)，然後再由電腦來做執行&lt;/li&gt;
&lt;li&gt;提問: Java Script 是不是直譯式 ?
Java Script 事實上是在瀏覽器上作執行，它的執行方法就是 Interpreter 這種運作方式，所以前端連覽器開了很多分頁，會把硬體資源吃光光，因為每一個分頁裡面都在跑 Java Script。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直譯式語言，耗費的電腦資源比較多&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;目前的瀏覽器都在比，誰設計的 Interpreter 引擎越精簡，代表瀏覽器的表現越穩定、速度越快。&lt;/li&gt;
&lt;li&gt;Python 語言就是 Interpreter&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Compiler&lt;span class="hx:absolute hx:-mt-20" id="compiler"&gt;&lt;/span&gt;
&lt;a href="#compiler" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/sOySud4.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將人看得懂的程式，經過編譯器，直接變成電腦看得懂的執行碼&lt;/li&gt;
&lt;li&gt;執行效能最快&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;撰寫 程式碼 (Coding)&lt;span class="hx:absolute hx:-mt-20" id="撰寫-程式碼-coding"&gt;&lt;/span&gt;
&lt;a href="#%e6%92%b0%e5%af%ab-%e7%a8%8b%e5%bc%8f%e7%a2%bc-coding" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Coding ，意思就是寫程式&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cd; mkdir mygo; cd mygo
# 開發 golang 網站
# golang 語言是 Compiler
# 寫人看得懂的 go 程式
$ echo &amp;#39;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;log&amp;#34;
&amp;#34;net/http&amp;#34;
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, &amp;#34;Hello, 世界&amp;#34;)
}
func main() {
http.HandleFunc(&amp;#34;/&amp;#34;, handler)
log.Fatal(http.ListenAndServe(&amp;#34;:8888&amp;#34;, nil))
}&amp;#39; &amp;gt; main.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import ( )&lt;/code&gt; ，引用人家寫好的 API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fmt&lt;/code&gt; ，顯示資料格式的 lib，可以顯示各式各樣的資料&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log&lt;/code&gt; ，log 的 API，資料量多大 ? 總共可以寫多少個 log ? 超過這個數量，最前面的檔案是否要刪掉 ?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;net/http&lt;/code&gt; ，網路的 API，IP 位址、MAC address、ARP&amp;hellip;等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http.HandleFunc(&amp;quot;/&amp;quot;, handler)&lt;/code&gt; ，&amp;quot;&lt;code&gt;/&lt;/code&gt;&amp;quot;，宣告網站的根目錄，只要其他人連到我的網址最後的&lt;code&gt;/&lt;/code&gt;後面加 &lt;code&gt;handler&lt;/code&gt;，就會顯示 &lt;code&gt;Hello, 世界&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log.Fatal(http.ListenAndServe(&amp;quot;:8888&amp;quot;, nil))&lt;/code&gt; ，告訴系統，我們的 web Server 等下要鎖在 8888 port&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 將上面的程式經過編譯變成電腦看得懂的語言
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a main.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CGO_ENABLED&lt;/code&gt; 這個參數，主要是讓 Go 執行檔能夠直接連結到系統上的函式庫 (libraries)，而不必另外打包進執行檔。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CGO_ENABLED=0&lt;/code&gt; ，代表剛剛上面宣告的 3 個 API 的 machine code 也加進最後的機械碼執行檔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOOS=linux GOARCH=amd64&lt;/code&gt; ，產生 Linux 64位元作業系統的執行檔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go build&lt;/code&gt; ，編譯我們寫好的 golang 語言的程式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt; ，force rebuilding of packages that are already up-to-date&lt;/li&gt;
&lt;li&gt;產生的機械碼檔，老師稱之為自走砲，意思就是說將翻譯好的那個機械碼檔拷貝到任意的 Linux 系統就可以跑，不需要在靠別的套件，因為它本身帶著程式庫走。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 檢查
$ dir
total 5.9M
drwxr-sr-x 2 bigred bigred 4.0K May 17 15:29 .
drwxr-sr-x 7 bigred bigred 4.0K May 17 15:29 ..
-rwxr-xr-x 1 bigred bigred 5.8M May 17 15:29 main
-rw-r--r-- 1 bigred bigred 228 May 17 15:29 main.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;看編譯過後的機械碼檔&lt;span class="hx:absolute hx:-mt-20" id="看編譯過後的機械碼檔"&gt;&lt;/span&gt;
&lt;a href="#%e7%9c%8b%e7%b7%a8%e8%ad%af%e9%81%8e%e5%be%8c%e7%9a%84%e6%a9%9f%e6%a2%b0%e7%a2%bc%e6%aa%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安裝 binary vi 的編輯器 ( 2 進位檔的編輯器 )&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk add bvi
(1/1) Installing bvi (1.4.1-r0)
Executing busybox-1.34.1-r5.trigger
OK: 1249 MiB in 258 packages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用編輯器&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ bvi main&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;output :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;00000000 7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 02 00 3E 00 01 00 00 00 .ELF..............&amp;gt;.....
00000018 A0 31 46 00 00 00 00 00 40 00 00 00 00 00 00 00 C8 01 00 00 00 00 00 00 .1F.....@...............
00000030 00 00 00 00 40 00 38 00 07 00 40 00 17 00 03 00 06 00 00 00 04 00 00 00 ....@.8...@.............
00000048 40 00 00 00 00 00 00 00 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 @.......@.@.....@.@.....
00000060 88 01 00 00 00 00 00 00 88 01 00 00 00 00 00 00 00 10 00 00 00 00 00 00 ........................
00000078 04 00 00 00 04 00 00 00 9C 0F 00 00 00 00 00 00 9C 0F 40 00 00 00 00 00 ..................@.....
00000090 9C 0F 40 00 00 00 00 00 64 00 00 00 00 00 00 00 64 00 00 00 00 00 00 00 ..@.....d.......d.......
000000A8 04 00 00 00 00 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 ........................
000000C0 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 2A 7C 1E 00 00 00 00 00 ..@.......@.....*|......
000000D8 2A 7C 1E 00 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 04 00 00 00 *|......................
000000F0 00 80 1E 00 00 00 00 00 00 80 5E 00 00 00 00 00 00 80 5E 00 00 00 00 00 ..........^.......^.....
00000108 40 A2 1D 00 00 00 00 00 40 A2 1D 00 00 00 00 00 00 10 00 00 00 00 00 00 @.......@...............
00000120 01 00 00 00 06 00 00 00 00 30 3C 00 00 00 00 00 00 30 7C 00 00 00 00 00 .........0&amp;lt;......0|.....
00000138 00 30 7C 00 00 00 00 00 20 20 05 00 00 00 00 00 80 AE 08 00 00 00 00 00 .0|..... ..............
00000150 00 10 00 00 00 00 00 00 51 E5 74 64 06 00 00 00 00 00 00 00 00 00 00 00 ........Q.td............
00000168 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........................
00000180 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 80 15 04 65 00 2A 00 00 ...................e.*..
00000198 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........................
000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 ........................
000001C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........................
000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........................
000001F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 ........................
00000210 06 00 00 00 00 00 00 00 00 10 40 00 00 00 00 00 00 10 00 00 00 00 00 00 ..........@.............
00000228 2A 6C 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 *l.............. .......
00000240 00 00 00 00 00 00 00 00 6A 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 ........j...............
00000258 00 80 5E 00 00 00 00 00 00 80 1E 00 00 00 00 00 49 8A 0B 00 00 00 00 00 ..^.............I.......
00000270 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ...............
&amp;#34;main&amp;#34; 6071722 bytes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;只要是 Linux 可以執行的程式碼，前面 4 個 byte，一定是 &lt;code&gt;7F 45 4C 46&lt;/code&gt; ( 16 進位 )，以文字來表示的話就是 &lt;code&gt;.ELF&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果要做駭客，看懂機械碼是基本功&lt;/li&gt;
&lt;li&gt;游標可以上下移動，是因為可以直接修改機械碼&lt;/li&gt;
&lt;li&gt;機械碼要看懂還有一個條件，要會寫組合語言&lt;/li&gt;
&lt;li&gt;如果要突破軟體搭配硬體才可以跑，但軟體很貴，可以找到 &lt;code&gt;jump&lt;/code&gt; 的機械碼，把它加進去，讓檢查的步驟跳過，就可以避開硬體的檢查&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://ithelp.ithome.com.tw/articles/10222650"target="_blank" rel="noopener"&gt;執行檔格式 - ELF 介紹連結&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
href="http://bvi.sourceforge.net/quick.html"target="_blank" rel="noopener"&gt;Bvi Quick Tutorial 連結&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;離開bvi編輯器&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;:q&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;練習&lt;span class="hx:absolute hx:-mt-20" id="練習"&gt;&lt;/span&gt;
&lt;a href="#%e7%b7%b4%e7%bf%92" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;那些使用者可以執行 &lt;code&gt;./main&lt;/code&gt; 程式 ? (請實作証明)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ dir
total 40K
drwxr-sr-x 7 bigred bigred 4.0K May 17 15:29 .
drwxr-xr-x 4 root root 4.0K Jul 10 2021 ..
-rw------- 1 bigred bigred 1.8K May 17 14:17 .bash_history
drwxr-sr-x 3 bigred bigred 4.0K May 17 15:29 .cache
-rw------- 1 bigred bigred 7 Feb 17 10:09 .python_history
drwx--S--- 2 bigred bigred 4.0K Jan 9 18:00 .ssh
drwxr-sr-x 2 bigred bigred 4.0K Oct 6 2021 bin
drwxr-sr-x 3 bigred bigred 4.0K May 17 15:29 go
drwxr-sr-x 2 bigred bigred 4.0K May 17 15:29 mygo
-rwxr-xr-x 1 bigred bigred 63 May 17 15:21 mysleep.sh
bigred@alp:~/mygo$ dir
total 5.9M
drwxr-sr-x 2 bigred bigred 4.0K May 17 15:29 .
drwxr-sr-x 7 bigred bigred 4.0K May 17 15:29 ..
-rwxr-xr-x 1 bigred bigred 5.8M May 17 15:29 main
-rw-r--r-- 1 bigred bigred 228 May 17 15:29 main.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;所有人&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;設定 main 只允許 擁有者 可執行&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ sudo chmod 700 /home/bigred/mygo/main
bigred@alp:~$ dir mygo
total 5.9M
drwxr-sr-x 2 bigred bigred 4.0K May 17 15:29 .
drwxr-sr-x 7 bigred bigred 4.0K May 17 15:29 ..
-rwxr--r-- 1 bigred bigred 5.8M May 17 15:29 main
-rw-r--r-- 1 bigred bigred 228 May 17 15:29 main.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;Write Once Run Anywhere - Java Program&lt;span class="hx:absolute hx:-mt-20" id="write-once-run-anywhere---java-program"&gt;&lt;/span&gt;
&lt;a href="#write-once-run-anywhere---java-program" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Write Once Run Anywhere
程式在 Linux 寫，在 Windows 也可以執行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/KNch44Z.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;當我們寫一隻 Java 的程式（&lt;code&gt;*.Java&lt;/code&gt;），系統要執行它之前，會先將我們寫好的程式透過一個編譯器將程式碼轉換成 bytecode(&lt;code&gt;*.class&lt;/code&gt;)，而 JVM(Java vitual machine) 會將 bytecode 再轉換成 machine code，就可以達到在不同作業系統都可以執行 Java 程式&lt;/li&gt;
&lt;li&gt;JVM 由 C 語言寫的，它的特性是會咬住它所在的作業系統，而這個 JVM 就是課程之前練習裝過的 &lt;code&gt;jdk-8&lt;/code&gt;，只要作業系統可以安裝 JVM，就可以讓我們在不同的作業系統執行 Java 程式。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 建立工作目錄
$ cd ~; mkdir myjava; cd myjava
# coding java program
$ echo $&amp;#39;public class ReverNum {
&amp;gt; public static void main(String[] args) {
&amp;gt;
&amp;gt; int num = 1234, reversed = 0;
&amp;gt; while(num != 0) {
&amp;gt; int digit = num % 10;
&amp;gt; reversed = reversed * 10 &amp;#43; digit;
&amp;gt; num /= 10;
&amp;gt; }
&amp;gt;
&amp;gt; System.out.println(&amp;#34;Reversed Number: &amp;#34; &amp;#43; reversed);
&amp;gt; }
&amp;gt; }&amp;#39;&amp;gt; ReverNum.java
# 將我們寫好的程式碼編譯成 byte code
$ javac ReverNum.java
$ dir
total 16K
drwxr-sr-x 2 bigred bigred 4.0K May 18 10:14 .
drwxr-sr-x 8 bigred bigred 4.0K May 18 10:13 ..
-rw-r--r-- 1 bigred bigred 714 May 18 10:14 ReverNum.class
-rw-r--r-- 1 bigred bigred 278 May 18 10:14 ReverNum.java
# 這邊的Java就是JVM，注意檔名不能加.class
$ java ReverNum
Reversed Number: 4321&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;討論&lt;span class="hx:absolute hx:-mt-20" id="討論"&gt;&lt;/span&gt;
&lt;a href="#%e8%a8%8e%e8%ab%96" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Is Python interpreted or compiled ?
&lt;ul&gt;
&lt;li&gt;&lt;a
href="https://stackoverflow.com/questions/6889747/is-python-interpreted-or-compiled-or-both"target="_blank" rel="noopener"&gt;答案網站連結&lt;/a&gt; ，與 Java 語言的運作模式類似&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Python 它兩種都可以
&lt;ul&gt;
&lt;li&gt;使用 CPython 標準開發時為 interpeterd&lt;/li&gt;
&lt;li&gt;使用 PVM 標準開發時，與 Java 相同為 Compilerd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;事實上應該要問 Python 有幾種運作模式
Stack Overflow 這個網站非常具有權威&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h1&gt;Process 程序&lt;/h1&gt;&lt;p&gt;Process 就是運作中的程式，分為兩種&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前景執行的應用程序&lt;/li&gt;
&lt;li&gt;背景執行的程序&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/QIjTSNw.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;當我們在系統裡面執行程式，電腦會把程式載入記憶體，而這時候記憶體裡面會有程式的 PID 和執行者的權限屬性（UID或GID），還有程序的程式碼（machine code）和相關資料&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;檔案的特殊權限 (SUID, SGID, Sticky)&lt;span class="hx:absolute hx:-mt-20" id="檔案的特殊權限-suid-sgid-sticky"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%94%e6%a1%88%e7%9a%84%e7%89%b9%e6%ae%8a%e6%ac%8a%e9%99%90-suid-sgid-sticky" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;SUID(4): 執行檔案時，Process 的 UID 為檔案擁有者，而非檔案執行者&lt;/li&gt;
&lt;li&gt;SGID(2): 執行檔案時，Process 的 GID 為檔案的群組，而非依檔案執行者的群組&lt;/li&gt;
&lt;li&gt;Sticky(1): 設定目錄，每個使用者可以創建/刪除自己的檔案，但無法刪除別人創建的檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;setuid 功能對 bash script 無效，也就是說對於 interpeter 是無效的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;setuid with bash script can become effective ?&lt;span class="hx:absolute hx:-mt-20" id="setuid-with-bash-script-can-become-effective-"&gt;&lt;/span&gt;
&lt;a href="#setuid-with-bash-script-can-become-effective-" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 編輯一支程式
$ nano md.sh
#!/bin/bash
mkdir /test
# 程序被賦予的權限，是根據執行者的權限參數（UID GID）來決定，
# 所以當執行者沒有對應的執行權限，程式就會無法進行對應的指令操作
$ ./md.sh
mkdir: cannot create directory ‘/test’: Permission denied
# 命令前面加 sudo，代表現在是由 root 的權限在執行程式
$ sudo /home/bigred/md.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;==&lt;strong&gt;程式在跑時一定會用執行者的權限參數（UID GID）去執行&lt;/strong&gt;==&lt;/p&gt;
&lt;p&gt;更改 &lt;code&gt;md.sh&lt;/code&gt; 的擁有者為 : root&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ls -l md.sh
-rwxr-xr-x 1 bigred bigred 24 May 18 11:25 md.sh
$ sudo chown root:bigred md.sh
$ ls -l md.sh
-rwxr-xr-x 1 root bigred 24 May 18 11:25 md.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;請問 bigred 可以執行 &lt;code&gt;md.sh&lt;/code&gt; 嗎？&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./md.sh
mkdir: cannot create directory ‘/test’: Permission denied&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;答：可以，但不會成功，因為執行者是 bigred，他的權限參數不足&lt;/p&gt;
&lt;p&gt;再度更改權限&lt;/p&gt;
&lt;p&gt;&lt;code&gt;4&lt;/code&gt; 代表 set uid，通常設在執行檔，一概用程式的 owner 去執行，但 bash script 裡面無法用 set uid&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo chmod 4755 md.sh
$ ls -al md.sh
-rwsr-xr-x 1 root bigred 24 May 18 11:25 md.sh
$ stat md.sh
File: md.sh
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 8,3 Inode: 25953103 Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 1000/ bigred)
Access: 2022-05-18 13:06:13.239195839 &amp;#43;0800
Modify: 2022-05-18 11:25:33.183472747 &amp;#43;0800
Change: 2022-05-18 13:15:08.666097079 &amp;#43;0800
Birth: -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;提問：為何 rbean 這位一般使用者可以執行 &lt;code&gt;ls -al /etc/shadow&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="提問為何-rbean-這位一般使用者可以執行-ls--al-etcshadow"&gt;&lt;/span&gt;
&lt;a href="#%e6%8f%90%e5%95%8f%e7%82%ba%e4%bd%95-rbean-%e9%80%99%e4%bd%8d%e4%b8%80%e8%88%ac%e4%bd%bf%e7%94%a8%e8%80%85%e5%8f%af%e4%bb%a5%e5%9f%b7%e8%a1%8c-ls--al-etcshadow" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 透過 ls 顯示 /etc/shadow 的檔案資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean@alp:~$ ls -al /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r----- &lt;span class="m"&gt;1&lt;/span&gt; root shadow &lt;span class="m"&gt;906&lt;/span&gt; May &lt;span class="m"&gt;18&lt;/span&gt; 09:30 /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 透過 stat 顯示 /etc/shadow 的檔案資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean@alp:~$ stat /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File: /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Size: &lt;span class="m"&gt;906&lt;/span&gt; Blocks: &lt;span class="m"&gt;8&lt;/span&gt; IO Block: &lt;span class="m"&gt;4096&lt;/span&gt; regular file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: 8,3 Inode: &lt;span class="m"&gt;19267677&lt;/span&gt; Links: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: &lt;span class="o"&gt;(&lt;/span&gt;0640/-rw-r-----&lt;span class="o"&gt;)&lt;/span&gt; Uid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt; Gid: &lt;span class="o"&gt;(&lt;/span&gt; 42/ shadow&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: 2022-05-18 09:30:41.193045223 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modify: 2022-05-18 09:30:03.713243333 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Change: 2022-05-18 09:30:03.713243333 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Birth: -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stat&lt;/code&gt;，gives information about the file and filesystem.&lt;/li&gt;
&lt;li&gt;Usage : &lt;code&gt;stat --options filenames&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答：因為 &lt;code&gt;/etc&lt;/code&gt; 的目錄在權限屬性上的其他人是 &lt;code&gt;r-x&lt;/code&gt;，代表可以看到目錄裡的內容&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bigred@alp:~$ ls -al / &lt;span class="p"&gt;|&lt;/span&gt; grep etc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;42&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; May &lt;span class="m"&gt;18&lt;/span&gt; 13:30 etc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;rbean 不能看到檔案內容&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean@alp:~$ cat /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat: /etc/shadow: Permission denied&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改 rbean 使用者的密碼&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean@alp:~$ passwd rbean
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Changing password &lt;span class="k"&gt;for&lt;/span&gt; rbean
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Old password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;New password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Retype password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd: password &lt;span class="k"&gt;for&lt;/span&gt; rbean changed by rbean&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;提問：為何 rbean 看不到密碼檔（/etc/shadow），但卻可以更改自己的密碼？
答：我們的 &lt;code&gt;passwd&lt;/code&gt; 這個 program 的執行檔（&lt;code&gt;/bin/bbsuid&lt;/code&gt;）有設定 &lt;code&gt;s&lt;/code&gt; 的權限，代表 &lt;code&gt;setuid&lt;/code&gt;，數字為 4，當我們執行這個程式，系統在記憶體裡執行這個 process 時，執行者的 uid 是這個 program 的 owner，但注意，此功能不適用 bash script。&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ which passwd
/usr/bin/passwd
$ ls -l /usr/bin/passwd
lrwxrwxrwx 1 root root 11 May 17 15:49 /usr/bin/passwd -&amp;gt; /bin/bbsuid
$ ls -l /bin/bbsuid
---s--x--x 1 root root 14200 Apr 4 18:19 /bin/bbsuid&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;改造無敵貓&lt;span class="hx:absolute hx:-mt-20" id="改造無敵貓"&gt;&lt;/span&gt;
&lt;a href="#%e6%94%b9%e9%80%a0%e7%84%a1%e6%95%b5%e8%b2%93" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;檢查 &lt;code&gt;cat&lt;/code&gt; 的執行檔在哪，他的 owner 是誰&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;43416&lt;/span&gt; Sep &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ stat /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File: /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Size: &lt;span class="m"&gt;43416&lt;/span&gt; Blocks: &lt;span class="m"&gt;88&lt;/span&gt; IO Block: &lt;span class="m"&gt;4096&lt;/span&gt; regular file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: 801h/2049d Inode: &lt;span class="m"&gt;1583&lt;/span&gt; Links: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: &lt;span class="o"&gt;(&lt;/span&gt;0755/-rwxr-xr-x&lt;span class="o"&gt;)&lt;/span&gt; Uid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt; Gid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: 2022-05-18 06:21:53.210823732 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modify: 2019-09-05 10:38:40.000000000 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Change: 2022-04-19 19:34:46.435775857 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Birth: -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;將 &lt;code&gt;cat&lt;/code&gt; 設定 setuid 的功能&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo chmod &lt;span class="m"&gt;4755&lt;/span&gt; /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 檢查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ stat /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File: /usr/bin/cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Size: &lt;span class="m"&gt;43416&lt;/span&gt; Blocks: &lt;span class="m"&gt;88&lt;/span&gt; IO Block: &lt;span class="m"&gt;4096&lt;/span&gt; regular file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: 801h/2049d Inode: &lt;span class="m"&gt;1583&lt;/span&gt; Links: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: &lt;span class="o"&gt;(&lt;/span&gt;4755/-rwsr-xr-x&lt;span class="o"&gt;)&lt;/span&gt; Uid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt; Gid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: 2022-05-18 06:21:53.210823732 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modify: 2019-09-05 10:38:40.000000000 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Change: 2022-05-18 06:50:08.981085444 +0000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Birth: -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;改造無敵貓成功&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;ping 指令&lt;span class="hx:absolute hx:-mt-20" id="ping-指令"&gt;&lt;/span&gt;
&lt;a href="#ping-%e6%8c%87%e4%bb%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bin/ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l /bin/ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwsr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;64120&lt;/span&gt; Jul &lt;span class="m"&gt;24&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; /bin/ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ stat /bin/ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File: /bin/ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Size: &lt;span class="m"&gt;64120&lt;/span&gt; Blocks: &lt;span class="m"&gt;128&lt;/span&gt; IO Block: &lt;span class="m"&gt;4096&lt;/span&gt; regular file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: 8,3 Inode: &lt;span class="m"&gt;23330906&lt;/span&gt; Links: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: &lt;span class="o"&gt;(&lt;/span&gt;4755/-rwsr-xr-x&lt;span class="o"&gt;)&lt;/span&gt; Uid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt; Gid: &lt;span class="o"&gt;(&lt;/span&gt; 0/ root&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Access: 2022-05-16 17:47:14.463395952 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modify: 2021-07-24 03:58:27.000000000 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Change: 2021-11-27 20:36:50.420444522 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Birth: -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;ping 指令會用到 icmp 封包相關功能，這件事只有 root 能做，因為有設定 setuid 所以任何使用者都可以直接使用 ping 指令&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Linux 程序管理&lt;span class="hx:absolute hx:-mt-20" id="linux-程序管理"&gt;&lt;/span&gt;
&lt;a href="#linux-%e7%a8%8b%e5%ba%8f%e7%ae%a1%e7%90%86" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;strong&gt;顯示程序資訊&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="顯示程序資訊"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%af%e7%a4%ba%e7%a8%8b%e5%ba%8f%e8%b3%87%e8%a8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;條列式顯示所有程序&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ps -eaf &lt;span class="p"&gt;|&lt;/span&gt; head -n 1&lt;span class="p"&gt;;&lt;/span&gt; ps -eaf &lt;span class="p"&gt;|&lt;/span&gt; tail -n &lt;span class="m"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UID PID PPID C STIME TTY TIME CMD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;4033&lt;/span&gt; &lt;span class="m"&gt;3779&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 10:15 ? 00:00:00 sshd: bigred &lt;span class="o"&gt;[&lt;/span&gt;priv&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bigred &lt;span class="m"&gt;4046&lt;/span&gt; &lt;span class="m"&gt;4033&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 10:16 ? 00:00:00 sshd: bigred@pts/0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bigred &lt;span class="m"&gt;4047&lt;/span&gt; &lt;span class="m"&gt;4046&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 10:16 pts/0 00:00:00 -bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;6428&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 10:54 ? 00:00:42 &lt;span class="o"&gt;[&lt;/span&gt;kworker/1:0-events&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;8604&lt;/span&gt; &lt;span class="m"&gt;3779&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:23 ? 00:00:00 sshd: rbean &lt;span class="o"&gt;[&lt;/span&gt;priv&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean &lt;span class="m"&gt;8608&lt;/span&gt; &lt;span class="m"&gt;8604&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:23 ? 00:00:00 sshd: rbean@pts/1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbean &lt;span class="m"&gt;8609&lt;/span&gt; &lt;span class="m"&gt;8608&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:23 pts/1 00:00:00 -bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;9097&lt;/span&gt; &lt;span class="m"&gt;3779&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:30 ? 00:00:00 sshd: gbean &lt;span class="o"&gt;[&lt;/span&gt;priv&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gbean &lt;span class="m"&gt;9101&lt;/span&gt; &lt;span class="m"&gt;9097&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:30 ? 00:00:00 sshd: gbean@pts/2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gbean &lt;span class="m"&gt;9102&lt;/span&gt; &lt;span class="m"&gt;9101&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 11:30 pts/2 00:00:00 -bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;21898&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 14:46 ? 00:00:00 &lt;span class="o"&gt;[&lt;/span&gt;kworker/u256:1-events_unbound&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;22292&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 14:53 ? 00:00:00 &lt;span class="o"&gt;[&lt;/span&gt;kworker/u256:2-events_unbound&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;22621&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 14:58 ? 00:00:00 &lt;span class="o"&gt;[&lt;/span&gt;kworker/u256:0-events_unbound&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bigred &lt;span class="m"&gt;22660&lt;/span&gt; &lt;span class="m"&gt;4047&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 14:59 pts/0 00:00:00 ps -eaf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bigred &lt;span class="m"&gt;22661&lt;/span&gt; &lt;span class="m"&gt;4047&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 14:59 pts/0 00:00:00 tail -n &lt;span class="m"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt; ，processes status&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-eaf&lt;/code&gt; ， list all current processes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;顯示背景程序資訊&lt;span class="hx:absolute hx:-mt-20" id="顯示背景程序資訊"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%af%e7%a4%ba%e8%83%8c%e6%99%af%e7%a8%8b%e5%ba%8f%e8%b3%87%e8%a8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;依照 CPU 使用量，從大到小排序程序&lt;span class="hx:absolute hx:-mt-20" id="依照-cpu-使用量從大到小排序程序"&gt;&lt;/span&gt;
&lt;a href="#%e4%be%9d%e7%85%a7-cpu-%e4%bd%bf%e7%94%a8%e9%87%8f%e5%be%9e%e5%a4%a7%e5%88%b0%e5%b0%8f%e6%8e%92%e5%ba%8f%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ timeout 20s yes &amp;gt;/dev/null &amp;amp; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;timeout&lt;/code&gt; ，Start COMMAND, and kill it if still running after DURATION&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeout 20s&lt;/code&gt; ，20 秒後結束 &lt;code&gt;yes&lt;/code&gt; 的程式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yes&lt;/code&gt; 命令的特性，能用多少 CPU 就用多少&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt; ，把標準輸出 ( STDOUT ) 重導到黑洞裝置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;，把程序推到背景執行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ps -eo user,pid,cmd,%mem,%cpu --sort=-%cpu | head -n 3
USER PID CMD %MEM %CPU
bigred 95970 yes 0.0 103
root 512 [kworker/1:2-events] 0.0 0.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt; ，processes status&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e&lt;/code&gt; ，輸出所有程序的資訊&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o&lt;/code&gt; ，指定輸出欄位，後面接所有想要輸出的欄位名稱，這裡我們讓 ps 輸出以下幾個欄位：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PID&lt;/code&gt;：程序 ID（process ID）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMD&lt;/code&gt;：程式名稱。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%MEM&lt;/code&gt;：記憶體使用量（百分比）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%CPU&lt;/code&gt;：CPU 使用量（百分比）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--sort&lt;/code&gt; ，預設由小到大，在欄位名稱前加上減號(-)，表示由大到小&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt;，上一個命令的輸出作為輸入傳遞給下一個命令。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;| head -n 3&lt;/code&gt; ，透過 pipe 將左邊命令輸出作為輸入傳遞給 head 命令，來篩選 CPU 用最兇猛的前兩個 process 。&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://askubuntu.com/questions/172982/what-is-the-difference-between-redirection-and-pipe"target="_blank" rel="noopener"&gt;What is the difference between &amp;ldquo;Redirection&amp;rdquo; and &amp;ldquo;Pipe&amp;rdquo;? 連結&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;依照 Memory 使用量，從大到小排序程序&lt;span class="hx:absolute hx:-mt-20" id="依照-memory-使用量從大到小排序程序"&gt;&lt;/span&gt;
&lt;a href="#%e4%be%9d%e7%85%a7-memory-%e4%bd%bf%e7%94%a8%e9%87%8f%e5%be%9e%e5%a4%a7%e5%88%b0%e5%b0%8f%e6%8e%92%e5%ba%8f%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat /dev/zero&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;上面這個指令，會一直在螢幕上輸出 &lt;code&gt;ASCll code 0&lt;/code&gt; 的數字，它代表的是 &lt;code&gt;null&lt;/code&gt;，空值，所以螢幕上看不到，直到按 Ctrl + c 終止&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Null（或Nul）也是一個零值 ASCII 字符，通常用於終止文件中的行尾&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Null String 是計算機編程中長度為零的字符串變量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NULL 指針在計算機編程中用於表示尚未初始化或只是空的值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在電腦中儲存時也要使用二進位數來表示，而具體用哪些二進位數字表示哪個符號，這就是編碼。如果不同的電腦要想互相通信而不造成混亂，那麼每台電腦就必須使用相同的編碼規則，就出現了 ASCII 編碼。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/05rXuOD.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a
href="https://www.alpharithms.com/ascii-table-512119/"target="_blank" rel="noopener"&gt;資料來源連結&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ (cat /dev/zero | head -c 500m | tail) &amp;amp;
[1] 96961
$ ps -eo user,pid,cmd,%mem,%cpu --sort=-%mem | head -n 3
USER PID CMD %MEM %CPU
bigred 96964 tail 29.2 51.1
root 74943 sshd: rbean [priv] 0.1 0.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;head -c&lt;/code&gt; ，print the first NUM bytes of each file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tail&lt;/code&gt; ，會霸佔記憶體 500 mb 的資料量&lt;/li&gt;
&lt;li&gt;輸出 &lt;code&gt;ASCll code 0&lt;/code&gt; 的數字總共 500 mb，然後輸出的結果會丟給 &lt;code&gt;tail&lt;/code&gt;，&lt;code&gt;tail&lt;/code&gt; 會再幫我們把結果丟到記憶體中，最後把以上的程序都推到背景去執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;以樹狀顯示程序資訊&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="以樹狀顯示程序資訊"&gt;&lt;/span&gt;
&lt;a href="#%e4%bb%a5%e6%a8%b9%e7%8b%80%e9%a1%af%e7%a4%ba%e7%a8%8b%e5%ba%8f%e8%b3%87%e8%a8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pstree -ph
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pstree: unrecognized option: h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BusyBox v1.34.1 &lt;span class="o"&gt;(&lt;/span&gt;2022-04-04 10:19:27 UTC&lt;span class="o"&gt;)&lt;/span&gt; multi-call binary.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage: pstree &lt;span class="o"&gt;[&lt;/span&gt;-p&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;PID&lt;span class="p"&gt;|&lt;/span&gt;USER&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Display process tree, optionally start from USER or PID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p Show pids&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;因一開始的 &lt;code&gt;pstree&lt;/code&gt; 是由 busybox 執行，在功能上來說是簡易型的，如果要安裝全功能的，要自行安裝該套件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk add pstree&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;安裝好後，下 &lt;code&gt;pstree -h&lt;/code&gt;，&lt;code&gt;-h&lt;/code&gt; 為安裝手冊的意思，可以看到功能比較完整&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pstree -g 3&lt;/code&gt;，輸出時用 &lt;code&gt;utf-8&lt;/code&gt; 的圖形 ( 樹狀的線 )&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ pstree -g 3
# 天字第一號老祖宗 /sbin/init
─┬= 00001 root /sbin/init
├──= 03186 root /sbin/getty 38400 tty6
├──= 03185 root /sbin/getty 38400 tty5
├──= 03184 root /sbin/getty 38400 tty4
├──= 03182 root /sbin/getty 38400 tty3
├──= 03180 root /sbin/getty 38400 tty2
# 03178 是 pid，root 為 uid，/bin/login 為程序名，
# -f 是登入時不進行身份認證，代表自動登入，使用 tty1 本機終端機
├─┬= 03178 root /bin/login -f bigred
# bigred 帳號執行重裝貝殼程式
│ └─┬= 03187 bigred -bash
# 利用 dialog 顯示硬體和網路規格
# --title，標題
# --textbox，後面接檔案 高度 寬度
│ └─── 03242 bigred dialog --title Cloud Native Trainer --textbox /tmp/sinfo 24 85
# 啟動 OpenSSH Server
├─┬─ 03091 root sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
# 記錄 bigred 使用者連接時跑的 process
│ ├─┬= 88863 root sshd: bigred [priv]
│ │ └─┬─ 88867 bigred sshd: bigred@pts/0
│ │ └─┬= 88868 bigred -bash
│ │ └──= 31291 bigred pstree -g 3
# 記錄 rbean 使用者連接時跑的 process
│ └─┬= 31250 root sshd: rbean [priv]
# pts 代表，系統幫我們準備遠端終端機
│ └─┬─ 31266 rbean sshd: rbean@pts/1
# 啟動貝殼程式
│ └──= 31267 rbean -bash
# crond 排程器，定期執行命令或指定程式的服務的一種服務或軟體。
├──= 03053 root /usr/sbin/crond -c /etc/crontabs
# 啟動 chrony 時間校正器
├─── 03025 chrony /usr/sbin/chronyd -f /etc/chrony/chrony.conf
# 備用電源程式 ups，如果突然斷電，系統會判定是否要正常關機，acpid 會提供前面的功能
├──= 02918 root /sbin/acpid
# 啟動 log 記錄功能
├──= 02867 root /sbin/syslogd -t
# dhcp client ，這個 process 會跟 網路上的 DHCP Server 要一個 IP 。
├──= 02831 root /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:alp
└──= 02714 root /sbin/udevd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dialog&lt;/code&gt; ，可以在 Terminal 上快速建立圖形交互介面的工具
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--title &amp;lt;title&amp;gt;&lt;/code&gt; ，設定標題&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--textbox&lt;/code&gt; ，設定要顯示文字內容的檔案，以及高度和寬度&lt;/li&gt;
&lt;li&gt;&lt;a
href="https://codychen.me/2020/29/linux-shell-%E7%9A%84%E5%9C%96%E5%BD%A2%E4%BA%92%E5%8B%95%E5%BC%8F%E4%BB%8B%E9%9D%A2-dialog/"target="_blank" rel="noopener"&gt;dialog 使用教學連結&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ps aux | grep sshd
# /usr/sbin/sshd 這支程序代表 OpenSSH Server有啟動
root 3091 0.0 0.1 4468 2104 ? S May17 0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root 31250 0.0 0.1 4488 3696 ? Ss 09:29 0:00 sshd: rbean [priv]
rbean 31266 0.0 0.1 4424 2632 ? S 09:29 0:00 sshd: rbean@pts/1
bigred 31308 0.0 0.0 1584 804 pts/0 S&amp;#43; 09:29 0:00 grep sshd
root 88863 0.0 0.1 4488 3688 ? Ss May18 0:00 sshd: bigred [priv]
bigred 88867 0.1 0.1 4688 2864 ? S May18 2:20 sshd: bigred@pts/0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;子程序與父程序&lt;span class="hx:absolute hx:-mt-20" id="子程序與父程序"&gt;&lt;/span&gt;
&lt;a href="#%e5%ad%90%e7%a8%8b%e5%ba%8f%e8%88%87%e7%88%b6%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano parent.sh
#!/bin/sh
echo &amp;#34;parent.sh running&amp;#34;
./child.sh
$ nano child.sh
#!/bin/sh
## -o，指定輸出欄位。comm，command欄位。-p，查詢pid。PPID，父項程序的PID
parent=&amp;#34;$(ps -o comm= -p $PPID)&amp;#34;
if [ &amp;#34;$parent&amp;#34; != parent.sh ]; then
echo this script should be directly executed by parent.sh, not by $parent
exit 1
fi
echo &amp;#34;child.sh proceeding&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;PPID，父程序的pid
bigred@alp:~/mygo$ echo $PPID
88867
$$ ，程序本身的pid
bigred@alp:~/mygo$ echo $$
88868
bigred@alp:~/mygo$ pstree
| | \-&amp;#43;- 88867 bigred sshd: bigred@pts/0
| | \-&amp;#43;= 88868 bigred -bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ nano other.sh
#!/bin/sh
echo other.sh running
./child.sh
bigred@alp:~$ chmod &amp;#43;x other.sh
bigred@alp:~$ ./other.sh
other.sh running
this script should be directly executed by parent.sh, not by other.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;研究 GCP 上 Ubuntu Linux 的父子程序&lt;span class="hx:absolute hx:-mt-20" id="研究-gcp-上-ubuntu-linux-的父子程序"&gt;&lt;/span&gt;
&lt;a href="#%e7%a0%94%e7%a9%b6-gcp-%e4%b8%8a-ubuntu-linux-%e7%9a%84%e7%88%b6%e5%ad%90%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu Linux 啟動的 daemon 一定比 Alpine linux 還多，因為啟動的功能比較多所以功能比較強大
&lt;blockquote&gt;
&lt;p&gt;daemon 背景執行程序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Ubuntu linux 第一支程式是systemd&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看 pstree 的結構&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sreantony@datacenter:~$ pstree -A -sp
systemd(1)-&amp;#43;-accounts-daemon(488)-&amp;#43;-{accounts-daemon}(490)
| `-{accounts-daemon}(509)
...
|-sshd(730)---sshd(868)---sshd(967)---bash(968)---pstree(1308)
|-systemd(871)---(sd-pam)(872)
|-systemd-journal(171)
|-systemd-logind(824)
|-systemd-network(450)
|-systemd-resolve(454)
|-systemd-udevd(201)
`-unattended-upgr(712)---{unattended-upgr}(718)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pstree&lt;/code&gt; 參數說明&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; ，Show PIDs. PIDs are shown as decimal numbers in parentheses after each process name. -p implicitly disables comes after each process name. -p implicitly disables compaction.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; ，Show parent processes of the specified process.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;程序與環境變數&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="程序與環境變數"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%ba%8f%e8%88%87%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano doecho.sh
#!/bin/sh
PLACE=Hollywood
echo &amp;#34;doecho says Hello &amp;#34; $PLACE
$ chmod &amp;#43;x doecho.sh
$ ./doecho.sh
doecho says Hello Hollywood
$ nano echoplace.sh
#!/bin/sh
echo &amp;#34;echoplace says Hello &amp;#34; $PLACE
$ chmod &amp;#43;x echoplace.sh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;無法顯示 &lt;code&gt;$PLACE&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./echoplace.sh
echoplace says Hello &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再度修改，讓 &lt;code&gt;echoplace.sh&lt;/code&gt; 變 &lt;code&gt;doecho.sh&lt;/code&gt; 的子程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano doecho.sh
#!/bin/sh
PLACE=Hollywood
echo &amp;#34;doecho says Hello &amp;#34; $PLACE
./echoplace.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;還是沒有顯示&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./doecho.sh
doecho says Hello Hollywood
echoplace says Hello &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;export&lt;/code&gt; 變數&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano doecho.sh
#!/bin/sh
export PLACE=Hollywood
echo &amp;#34;doecho says Hello &amp;#34; $PLACE
./echoplace.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;成功在子程式顯示父程式的變數&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./doecho.sh
doecho says Hello Hollywood
echoplace says Hello Hollywood&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;程序的中斷信號&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="程序的中斷信號"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%ba%8f%e7%9a%84%e4%b8%ad%e6%96%b7%e4%bf%a1%e8%99%9f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano sleep30.sh
#!/bin/bash
trap &amp;#34;echo signal received!&amp;#34; SIGINT
echo &amp;#34;The script pid is $$&amp;#34;
sleep 30&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SIGINT&lt;/code&gt; 是 Linux 系統裡面的 &lt;code&gt;Ctrl +C&lt;/code&gt; 的代號&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trap&lt;/code&gt; 是一個 shell 內建命令，它用來在腳本中指定信號如何處理。比如，按 &lt;code&gt;Ctrl+C&lt;/code&gt; 會使腳本終止執行，實際上系統發送了 &lt;code&gt;SIGINT&lt;/code&gt; 信號給腳本進程，&lt;code&gt;SIGINT&lt;/code&gt; 信號的默認處理方式就是退出程式。如果要在 &lt;code&gt;Ctrl+C&lt;/code&gt; 不退出程式，那麼就得使用 &lt;code&gt;trap&lt;/code&gt; 命令來指定一下 &lt;code&gt;SIGINT&lt;/code&gt; 的處理方式了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;執行&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./sleep30.sh
The script pid is 39967
^Csignal received!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;撰寫永不停止程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano nostop.sh
#!/bin/bash
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
echo -e &amp;#34;\n** Trapped CTRL-C&amp;#34;
# 下式顯示游標
tput cnorm
exit 0
}
clear
# 下式隱藏游標
tput civis
while [ 1 ]
do
echo -ne &amp;#34;\033[10;10f Hi nobody : &amp;#34;
date
done&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;INT&lt;/code&gt; 就是 &lt;code&gt;SIGINT&lt;/code&gt; 的簡寫&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;執行 &lt;code&gt;nostop.sh&lt;/code&gt; 程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ chmod &amp;#43;x nostop.sh
$ ./nostop.sh
./nostop.sh: line 14: tput: command not found
Hi nobody : ^Ce Jul 20 16:26:48 CST 2021
** Trapped CTRL-C
[註] 直接中斷程式, 按 ctrl&amp;#43;c 複合鍵, 中斷程式執行&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;安裝 &lt;code&gt;tput&lt;/code&gt; 命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk add ncurses&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./nostop.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;output :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;
Hi nobody : Thu May 19 12:59:00 CST 2022&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;程序的暫停與中斷&lt;/strong&gt;&lt;span class="hx:absolute hx:-mt-20" id="程序的暫停與中斷"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%9a%ab%e5%81%9c%e8%88%87%e4%b8%ad%e6%96%b7" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;執行 &lt;code&gt;nostop.sh&lt;/code&gt; 程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ ./nostop.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;按 &lt;code&gt;Ctrl +Z&lt;/code&gt; 暫停，並推到背景休息&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;[1]&amp;#43; Stopped ./nostop.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;打&lt;code&gt;bg&lt;/code&gt;，background 的意思&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ bg
[1]&amp;#43; ./nostop.sh &amp;amp;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;會出事，不要打bg&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打&lt;code&gt;fg&lt;/code&gt;會讓程式繼續在情景執行，按 &lt;code&gt;Ctrl +C&lt;/code&gt; 中斷&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ fg
./nostop.sh
Thu Jul 22 18:06:45 CST 2021
Hi nobody : ^Cu Jul 22 18:06:57 CST 2021&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;前景與背景程序&lt;span class="hx:absolute hx:-mt-20" id="前景與背景程序"&gt;&lt;/span&gt;
&lt;a href="#%e5%89%8d%e6%99%af%e8%88%87%e8%83%8c%e6%99%af%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前景&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A process that connects to the terminal is called a foreground job. A job is said to be in the foreground because it can communicate with the user via the screen and the keyboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;背景&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On the other hand, a process that disconnects from the terminal and cannot communicate with the user is called a background job.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;背景執行程序&lt;span class="hx:absolute hx:-mt-20" id="背景執行程序"&gt;&lt;/span&gt;
&lt;a href="#%e8%83%8c%e6%99%af%e5%9f%b7%e8%a1%8c%e7%a8%8b%e5%ba%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;撰寫永不停止程式 ( 輸出數字到 &lt;code&gt;/tmp/counter&lt;/code&gt; 檔 )&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano nostop01.sh
c=0; echo &amp;#34;&amp;#34; &amp;gt; /tmp/counter
while [ true ]
do
echo &amp;#34;$c&amp;#34; &amp;gt;&amp;gt; /tmp/counter
let &amp;#34;c=$c&amp;#43;1&amp;#34;
done
$ chmod &amp;#43;x nostop01.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;c=0; echo &amp;quot;&amp;quot; &amp;gt; /tmp/counter&lt;/code&gt; ，宣告變數 c = 0，然後將一個換行符號重導到 &lt;code&gt;/tmp/cunter&lt;/code&gt; 這個檔案中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;while [ true ]&lt;/code&gt; ，條件式永遠成立，所以迴圈會一直被執行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo &amp;quot;$c&amp;quot; &amp;gt;&amp;gt; /tmp/counter&lt;/code&gt; ，將變數 &lt;code&gt;c&lt;/code&gt; append 到 &lt;code&gt;/tmp/cunter&lt;/code&gt; 這個檔案中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;let &amp;quot;c=$c+1&amp;quot;&lt;/code&gt; ，宣告變數 &lt;code&gt;c&lt;/code&gt; 會等於變數 &lt;code&gt;c&lt;/code&gt; + 1，所以迴圈跑一次，變數 c 就會 + 1&lt;/li&gt;
&lt;li&gt;程式第一行沒宣告 &lt;code&gt;#!/bin/bash&lt;/code&gt; 的話，推背景執行程式時，打&lt;code&gt;ps -eaf | head -n 1; ps -eaf | tail -n 15&lt;/code&gt; 去看會發現 pid 對應的 command 只會顯示 &lt;code&gt;-bash&lt;/code&gt; ，所以這行一定要打&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直接背景執行命令&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ ./nostop01.sh &amp;amp;
[1] 85764 ## PID&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查程式有沒有執行&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ tail -n 2 /tmp/counter
1374701
1374702
bigred@alp:~$ tail -n 2 /tmp/counter
2411603
2411604&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;移除背景程序&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 強迫停止程序
bigred@alp:~$ kill -9 85764
# 送出正常關機信號(15) 給 pid 2552
$ kill -15 25515
bigred@alp:~$ tail -n 2 /tmp/counter
6320287
6320288
[1]&amp;#43; Killed ./nostop01.sh
bigred@alp:~$ tail -n 2 /tmp/counter
6320287
6320288&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如果使用前景執行，按 Ctrl +Z 暫停&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ ./nostop01.sh
^Z
[1]&amp;#43; Stopped ./nostop01.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;檢查真的沒在跑了&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ tail -n 2 /tmp/counter
311454
311455
bigred@alp:~$ tail -n 1 /tmp/counter
311455&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;按&lt;code&gt;bg&lt;/code&gt;，讓他在背景繼續執行&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ bg
[1]&amp;#43; ./nostop01.sh &amp;amp;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再次檢查&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ tail -n 3 /tmp/counter
4977563
4977564
4977565&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;真的有在跑！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果再打&lt;code&gt;fg&lt;/code&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@alp:~$ fg
./nostop01.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;前端的游標會被佔用，如果想暫停就按 Ctrl +Z，如果不想跑了就按 Ctrl +C。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;背景執行程序範例二&lt;span class="hx:absolute hx:-mt-20" id="背景執行程序範例二"&gt;&lt;/span&gt;
&lt;a href="#%e8%83%8c%e6%99%af%e5%9f%b7%e8%a1%8c%e7%a8%8b%e5%ba%8f%e7%af%84%e4%be%8b%e4%ba%8c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mkdir -p /opt/www&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;h1&amp;gt;go out&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /opt/www/index.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ httpd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021/04/20 22:57:16 Serving /opt/www/ on HTTP port: &lt;span class="m"&gt;8888&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;^C
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ httpd &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="m"&gt;14527&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;httpd&lt;/code&gt; ，is the Apache HyperText Transfer Protocol (HTTP) server program.&lt;/li&gt;
&lt;li&gt;Usage of httpd:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; string
the directory of static file to host (default &amp;ldquo;/opt/www/&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; string
port to serve on (default &amp;ldquo;8888&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;透過 &lt;code&gt;netstat&lt;/code&gt; 看網站開的 port : 8888&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ netstat -anp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;netstat&lt;/code&gt; ，network statistics&lt;/li&gt;
&lt;li&gt;用於故障排除和配置的網絡工具，也可以作為網絡連接的監控工具。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt; ，To list all listening ports, using both TCP and UDP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt; ，Don&amp;rsquo;t resolve names&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; ，Displaying service name with their PID number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;output :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netstat: showing only processes with your user ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Active Internet connections &lt;span class="o"&gt;(&lt;/span&gt;servers and established&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 0.0.0.0:22 0.0.0.0:* LISTEN -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 192.168.61.131:22 192.168.61.1:50895 ESTABLISHED -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 192.168.61.131:22 192.168.61.1:50900 ESTABLISHED -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 192.168.61.131:22 192.168.61.1:50868 ESTABLISHED -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; :::8888 :::* LISTEN 28980/httpd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcp &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; :::22 :::* LISTEN -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Active UNIX domain sockets &lt;span class="o"&gt;(&lt;/span&gt;servers and established&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Proto RefCnt Flags Type State I-Node PID/Program name Path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ACC &lt;span class="o"&gt;]&lt;/span&gt; SEQPACKET LISTENING &lt;span class="m"&gt;20611&lt;/span&gt; - /run/udev/control
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM &lt;span class="m"&gt;20734&lt;/span&gt; - /var/run/chrony/chronyd.sock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM CONNECTED &lt;span class="m"&gt;19786&lt;/span&gt; - /dev/log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;30218&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;29713&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;30219&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;30214&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;29714&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM CONNECTED &lt;span class="m"&gt;19871&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM CONNECTED &lt;span class="m"&gt;20615&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;20147&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;29708&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM CONNECTED &lt;span class="m"&gt;20616&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;20133&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; DGRAM CONNECTED &lt;span class="m"&gt;20730&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unix &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; STREAM CONNECTED &lt;span class="m"&gt;20148&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;用 &lt;code&gt;curl&lt;/code&gt; 來連連看網站&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ curl http://localhost:8888
&amp;lt;h1&amp;gt;go out&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;，Client URL 的縮寫&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl [options/URLs]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;支持通過各種網絡協議進行數據傳輸。 它通過指定相關的 URL 和需要發送或接收的數據與 Web 或應用程序服務器進行通信。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;程序與環境變數&lt;span class="hx:absolute hx:-mt-20" id="程序與環境變數-1"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%ba%8f%e8%88%87%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 顯示系統中的環境變數
$ env
SHELL=/bin/bash
CHARSET=UTF-8
PWD=/home/bigred
LOGNAME=bigred
GWIF=eth0
HOME=/home/bigred
LANG=C.UTF-8
GW=192.168.61.2
SSH_CONNECTION=192.168.61.1 51910 192.168.61.131 22
NETID=192.168.61
IP=192.168.61.131
TERM=xterm-256color
USER=bigred
SHLVL=1
PAGER=less
PS1=\u@\h:\w$
SSH_CLIENT=192.168.61.1 51910 22
LC_COLLATE=C
PATH=/home/bigred/bin:/home/bigred/vmalpdt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/bigred
SSH_TTY=/dev/pts/0
_=/usr/bin/env&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/profile&lt;/code&gt; ，只要在 Linux 系統登入成功，第一個被執行的程式，不管是用 SSH 命令登入，還是其他登入方法，只要登入成功，就會執行 &lt;code&gt;/etc/profile&lt;/code&gt; 這支程式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export&lt;/code&gt; ，宣告全域變數&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;解析老師的 /etc/profile&lt;span class="hx:absolute hx:-mt-20" id="解析老師的-etcprofile"&gt;&lt;/span&gt;
&lt;a href="#%e8%a7%a3%e6%9e%90%e8%80%81%e5%b8%ab%e7%9a%84-etcprofile" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Alpine 的啟動系統是 openrc, 登入前會執行 /etc/local.d/rc.local.start, 登入後會執行 /etc/profile
gw=$(route -n | grep -e &amp;#34;^0.0.0.0 &amp;#34;)
export GWIF=${gw##* }
ips=$(ifconfig $GWIF | grep &amp;#39;inet &amp;#39;)
export IP=$(echo $ips | cut -d&amp;#39; &amp;#39; -f2 | cut -d&amp;#39;:&amp;#39; -f2)
export NETID=${IP%.*}
export GW=$(route -n | grep -e &amp;#39;^0.0.0.0&amp;#39; | tr -s \ - | cut -d &amp;#39; &amp;#39; -f2)
export PATH=&amp;#34;/home/bigred/bin:/home/bigred/vmalpdt/bin:$PATH&amp;#34;
# source /home/bigred/bin/myk3s
clear &amp;amp;&amp;amp; sleep 2
echo &amp;#34;Welcome to Alpine Linux : `cat /etc/alpine-release`&amp;#34;
[ &amp;#34;$IP&amp;#34; != &amp;#34;&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;IP : $IP&amp;#34;
echo &amp;#34;&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gw=$(route -n | grep -e &amp;quot;^0.0.0.0 &amp;quot;)&lt;/code&gt; ，從不解析名字的路由表，找 Default Gateway
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;route -n&lt;/code&gt; ，顯示不解析名字的路由表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|&lt;/code&gt;，上一個命令的輸出作為輸入傳遞給下一個命令。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -e&lt;/code&gt; ，指定字串作為查找檔內容的範本樣式
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e&lt;/code&gt; 的目的實際上只是為了消除正則表達式以破折號開頭的轉義。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -e &amp;quot;^0.0.0.0 &amp;quot;&lt;/code&gt;，指定要 &lt;code&gt;0.0.0.0&lt;/code&gt; 開頭的那一行
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0.0.0.0&lt;/code&gt; ，表示所有 IPV4 的網際網路&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gw=$()&lt;/code&gt;，宣告變數 &lt;code&gt;gw&lt;/code&gt; 等於括號裡的命令執行結果&lt;/li&gt;
&lt;li&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ route -n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel IP routing table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Destination Gateway Genmask Flags Metric Ref Use Iface
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.0.0.0 192.168.61.2 0.0.0.0 UG &lt;span class="m"&gt;202&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;192.168.61.0 0.0.0.0 255.255.255.0 U &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; eth0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;以上面路由規則來說，只要目的地 ( Destination ) 是 &lt;code&gt;0.0.0.0&lt;/code&gt; 的封包，就會經由 &lt;code&gt;eth0&lt;/code&gt; 這張網卡，將封包往 &lt;code&gt;192.168.61.2&lt;/code&gt; 這個 Gateway 送&lt;/li&gt;
&lt;li&gt;第二行 Gateway 的 &lt;code&gt;0.0.0.0&lt;/code&gt; ，代表沒有特別指定 Gateway ，會由 &lt;code&gt;eth0&lt;/code&gt; 這張網卡，將封包往目的地 ( Destination )為 &lt;code&gt;192.168.61.0&lt;/code&gt; 這個 Network ID 裡面的機器送&lt;/li&gt;
&lt;li&gt;output : &lt;code&gt;0.0.0.0 192.168.61.2 0.0.0.0 UG 202 0 0 eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export GWIF=${gw##* }&lt;/code&gt;，宣告會將封包往 Default Gateway 送的網卡設為環境變數
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;${變數##* }&lt;/code&gt; : 從頭開始刪除到最後一個空格(含)為止&lt;/li&gt;
&lt;li&gt;output : &lt;code&gt;eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano su
#!/bin/bash
if [ &amp;#34;$USER&amp;#34; != &amp;#34;&amp;#34; ]; then
echo &amp;#34;Hi $USER&amp;#34;
else
echo &amp;#34;Nobody&amp;#34;
fi
$ chmod &amp;#43;x su
$ ./su
Hi bigred
$ echo $PATH
/home/bigred/bin:/home/bigred/vmalpdt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ which su
/bin/su
$ sudo mv su /usr/bin
$ which su
/usr/bin/su
$ su
Hi bigred
$ sudo mv /usr/bin/su ~/
$ which su
/bin/su&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如何修改 PATH 系統環境變數 ?&lt;/p&gt;
&lt;h2&gt;小總結&lt;span class="hx:absolute hx:-mt-20" id="小總結-1"&gt;&lt;/span&gt;
&lt;a href="#%e5%b0%8f%e7%b8%bd%e7%b5%90-1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Process&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定義
&lt;ul&gt;
&lt;li&gt;運作中的 Program&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;運作流程
&lt;ul&gt;
&lt;li&gt;運作時會把程式的 PID、執行者的權限參數（UID和GID）和程序的程式碼（machine code）以及相關資料從硬碟載入記憶體去執行。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setuid&lt;/code&gt; 執行檔案時，Process 的 UID 為檔案擁有者，而非檔案執行者&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;程序管理
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt; 使用條列式清單查看執行中程序&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pstree&lt;/code&gt; 樹狀顯示程序資訊&lt;/li&gt;
&lt;li&gt;Ubuntu Linux 第一支程式為 &lt;code&gt;systemd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Alpine Linux 第一支程式為 &lt;code&gt;/sbin/init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;子程序中用到父程序的變數須在父程序宣告變數前加 &lt;code&gt;export&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;運作介面
&lt;ul&gt;
&lt;li&gt;前景執行&lt;/li&gt;
&lt;li&gt;背景執行，指令後面加 &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;動作
&lt;ul&gt;
&lt;li&gt;可按 &lt;code&gt;Ctrl +C&lt;/code&gt; 停止程序&lt;/li&gt;
&lt;li&gt;可按 &lt;code&gt;Ctrl +Z&lt;/code&gt; 暫停程序
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fg&lt;/code&gt; 讓暫停的程式在前景恢復執行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bg&lt;/code&gt; 讓暫停的程式在背景恢復執行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;環境變數
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$$&lt;/code&gt;，目前程序的 PID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$0&lt;/code&gt;，目前程序的名稱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$PPID&lt;/code&gt;，目前程序的父程序的 PID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h6&gt;tags: &lt;code&gt;系統工程&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-系統工程"&gt;&lt;/span&gt;
&lt;a href="#tags-%e7%b3%bb%e7%b5%b1%e5%b7%a5%e7%a8%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>Untitled</title><link>https://blog.kubeantony.com/archive/misc/untitled-6/</link><pubDate>Tue, 09 Aug 2022 06:53:08 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/untitled-6/</guid><description>
&lt;h2&gt;&lt;span class="hx:absolute hx:-mt-20" id=""&gt;&lt;/span&gt;
&lt;a href="#" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span class="hx:absolute hx:-mt-20" id=""&gt;&lt;/span&gt;
&lt;a href="#" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span class="hx:absolute hx:-mt-20" id=""&gt;&lt;/span&gt;
&lt;a href="#" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;</description></item><item><title>Raspberry Pi(樹梅派)</title><link>https://blog.kubeantony.com/archive/misc/raspberry-pi%E6%A8%B9%E6%A2%85%E6%B4%BE/</link><pubDate>Mon, 08 Aug 2022 02:45:40 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/raspberry-pi%E6%A8%B9%E6%A2%85%E6%B4%BE/</guid><description>
&lt;ul&gt;
&lt;li&gt;跟手掌一樣大的電腦。
&lt;img src="https://i.imgur.com/PREnRTB.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;用的是ARM的CPU(紅色箭頭指的地方)。
&lt;img src="https://i.imgur.com/YOXgz49.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以接鍵盤、滑鼠、行動電源、音源和螢幕。
&lt;img src="https://i.imgur.com/zLvPEq4.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;結論:
&lt;strong&gt;windows 也有推出 ARM 版，微軟也在走這條路，電腦正在微型化，這個趨勢是正在走的，未來到物聯網相關的公司去，很高機率會接觸到。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;這是老師 2021 年的聖誕樹&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/qvyFuDC.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/nSk6RER.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/6iLPBiV.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K8S 能夠管理的設備，不是只有機房的伺服器，也可以是老師管理的聖誕樹(也就是一坨樹梅派)，落第雲值接連的就是樹梅派，一人連一台，它的空間就是一般辦公桌的一半大小，老師前幾年就是這樣上課，助教只要看哪台機器有沒有紅燈就可以了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;tags: &lt;code&gt;樹莓派&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-樹莓派"&gt;&lt;/span&gt;
&lt;a href="#tags-%e6%a8%b9%e8%8e%93%e6%b4%be" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>User serach</title><link>https://blog.kubeantony.com/archive/misc/user-serach/</link><pubDate>Mon, 08 Aug 2022 01:16:06 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/user-serach/</guid><description>
&lt;p&gt;#查詢帳號(search.sh)&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash`
`read -p &amp;#34;please enter UserID: &amp;#34; uid`
`cat /etc/passwd | cut -d&amp;#34;:&amp;#34; -f1 |grep $uid &amp;amp;&amp;gt;/dev/null`
`[ $? = 0 ] &amp;amp;&amp;amp; echo &amp;#34;user exist&amp;#34; || echo &amp;#34;user not found&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;新增單一/多個帳號(useradd.sh)&lt;span class="hx:absolute hx:-mt-20" id="新增單一多個帳號useraddsh"&gt;&lt;/span&gt;
&lt;a href="#%e6%96%b0%e5%a2%9e%e5%96%ae%e4%b8%80%e5%a4%9a%e5%80%8b%e5%b8%b3%e8%99%9fuseraddsh" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
echo &amp;#39; please choose you want add one User or more then two User
1.add one User
2.add two or more User
&amp;#39;
read -p &amp;#34;you want 1/2?&amp;#34; cho
case $cho in
1)
read -p &amp;#34;enter UserID &amp;#34; uid
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $uid &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; = &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;UserID exist&amp;#34; &amp;amp;&amp;amp; exit
sudo useradd -m -s /bin/bash $uid
echo $uid:$uid | sudo chpasswd
echo &amp;#34;UserID add ok&amp;#34;
;;
2)
read -p &amp;#34;enter UserID title: &amp;#34; tuid
read -p &amp;#34;enter number of User start: &amp;#34; st
read -p &amp;#34;enter number of User stop: &amp;#34; so
a=$st
b=$so
for((no=$a;no&amp;lt;=$b;no=no&amp;#43;1))
do
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $tuid$no &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; != &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; sudo useradd -m -s /bin/bash $tuid$no &amp;amp;&amp;amp; echo $tuid$no:$$tuid$no | sudo chpasswd &amp;amp;&amp;amp; echo &amp;#34;$tuid$no add ok&amp;#34; || echo &amp;#34;$tuid$no exist&amp;#34;
done
;;
*)
echo &amp;#34;please enter what you want to do &amp;#34;
return
;;
esac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;刪除單一/多個帳號(userdel.sh)&lt;span class="hx:absolute hx:-mt-20" id="刪除單一多個帳號userdelsh"&gt;&lt;/span&gt;
&lt;a href="#%e5%88%aa%e9%99%a4%e5%96%ae%e4%b8%80%e5%a4%9a%e5%80%8b%e5%b8%b3%e8%99%9fuserdelsh" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
echo &amp;#39; please choose you want delete one User or more then two User
1.delete one User
2.delete two or more User
&amp;#39;
read -p &amp;#34;you want 1/2?&amp;#34; cho
case $cho in
1)
read -p &amp;#34;enter delete UserID &amp;#34; uid
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $uid &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; != &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;UserID not found&amp;#34; &amp;amp;&amp;amp; exit 1
sudo userdel -r $uid &amp;amp;&amp;gt;/dev/null
echo &amp;#34;UserID del ok&amp;#34;
;;
2)
read -p &amp;#34;enter delete UserID title: &amp;#34; tuid
read -p &amp;#34;enter number of User start: &amp;#34; st
read -p &amp;#34;enter number of User stop: &amp;#34; so
a=$st
b=$so
for((no=$a;no&amp;lt;=$b;no=no&amp;#43;1))
do
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $tuid$no &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; = &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; sudo userdel -r $tuid$no &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;#34;$tuid$no del ok&amp;#34; || echo &amp;#34;$tuid$no not found&amp;#34;
done
;;
*)
echo &amp;#34;please enter what you want to do &amp;#34;
;;
esac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;修改單一/多個帳號的密碼(chpasswd.sh)&lt;span class="hx:absolute hx:-mt-20" id="修改單一多個帳號的密碼chpasswdsh"&gt;&lt;/span&gt;
&lt;a href="#%e4%bf%ae%e6%94%b9%e5%96%ae%e4%b8%80%e5%a4%9a%e5%80%8b%e5%b8%b3%e8%99%9f%e7%9a%84%e5%af%86%e7%a2%bcchpasswdsh" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
echo &amp;#39; please choose you want change one User passwd or more then two User passwd
1.change one User passwd
2.change two or more User passwd
&amp;#39;
read -p &amp;#34;you want 1/2?&amp;#34; cho
case $cho in
1)
read -p &amp;#34;enter UserID &amp;#34; uid
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $uid &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; != &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;User not found&amp;#34; &amp;amp;&amp;amp; exit 1
sudo passwd $uid
echo &amp;#34;User passwd change ok&amp;#34;
;;
2)
read -p &amp;#34;enter UserID title: &amp;#34; tuid
read -p &amp;#34;enter number of User start: &amp;#34; st
read -p &amp;#34;enter number of User stop: &amp;#34; so
a=$st
b=$so
for((no=$a;no&amp;lt;=$b;no=no&amp;#43;1))
do
cat /etc/passwd | cut -d &amp;#34;:&amp;#34; -f 1 |grep $tuid$no &amp;amp;&amp;gt;/dev/null
[ &amp;#34;$?&amp;#34; != &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;User not found&amp;#34; &amp;amp;&amp;amp; exit 1
echo $tuid$no:$tuid$no | sudo chpasswd &amp;amp;&amp;amp; echo &amp;#34;User passwd change ok&amp;#34;
done
;;
*)
echo &amp;#34;please enter what you want to do &amp;#34;
;;
esac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h6&gt;&lt;code&gt;Shell Script&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="shell-script"&gt;&lt;/span&gt;
&lt;a href="#shell-script" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>Process</title><link>https://blog.kubeantony.com/archive/misc/process/</link><pubDate>Sun, 07 Aug 2022 14:59:26 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/process/</guid><description>
&lt;p&gt;&lt;img src="https://i.imgur.com/4VVe0I3.png" alt="" loading="lazy" /&gt;
&lt;strong&gt;Docker&lt;/strong&gt;，這家公司的技術是2021年的電腦基礎概論(全球)，它推出了一個技術叫做&amp;quot;Container(貨櫃)&amp;quot;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Container&amp;rdquo; 是一台電腦，這個技術主要威脅到VM(virtual machine)虛擬技術，Container也是虛擬技術做出來的電腦，但它比VM輕量許多，且速度又快。&lt;/li&gt;
&lt;li&gt;實體電腦一台可以做出很多很多的Container，管裡維運這堆Container的技術就是&amp;quot;Kubernetes&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/F90gxD4.png" alt="" loading="lazy" /&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt;，這套系統是用來管理維運Docker，2021年的電腦基礎概論(全球)，由goolge公司設計。&lt;/p&gt;
&lt;p&gt;提問:為何Kubernetes要管理那麼多台container，目的是甚麼?
因為可以用Kubernetes做出Hadoop，這是企業會實質會用到的系統。
&lt;img src="https://i.imgur.com/BTsMFQh.png" alt="" loading="lazy" /&gt;
&lt;strong&gt;Hadoop&lt;/strong&gt;，大數據平台，做資料分析平的。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/JUlLO7B.png" alt="" loading="lazy" /&gt;
&lt;strong&gt;Spark&lt;/strong&gt;，幫公司做出決策，做深度分析的，也就是 &amp;ldquo;machine learning&amp;rdquo; 機器學習，用的語言是python。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;落第雲系統架構&lt;span class="hx:absolute hx:-mt-20" id="落第雲系統架構"&gt;&lt;/span&gt;
&lt;a href="#%e8%90%bd%e7%ac%ac%e9%9b%b2%e7%b3%bb%e7%b5%b1%e6%9e%b6%e6%a7%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/yW2Bsaf.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Alpine Linux 作業系統&lt;span class="hx:absolute hx:-mt-20" id="alpine-linux-作業系統"&gt;&lt;/span&gt;
&lt;a href="#alpine-linux-%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;因為系統很小，所以&lt;strong&gt;執行效能一定高&lt;/strong&gt;，&lt;strong&gt;資安等級相當的高&lt;/strong&gt;，小到沒法破壞。&lt;/p&gt;
&lt;p&gt;Linux 是由幾百萬行的程式碼組成的，主要的精神是可以 “客製化” 作業系統&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lib=library=程式庫(儲存別人寫好的程式、套件)&lt;/li&gt;
&lt;li&gt;busybox 容量只有800多K，卻可以模擬出很多 Linux 的指令， e.g. ping,rm,mv,ifconfig,ls
&lt;ul&gt;
&lt;li&gt;busybox ls -alh ,其中 -h 為 human-readable ，把容量的部分轉成人類易讀的 (KB,MB等)&lt;/li&gt;
&lt;li&gt;一般來說，alpine 的指令都會指向 /bin/busybox (除非有改過)，例如 /bin/cat 則會到 -&amp;gt; /bin/busybox&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/PgdGTh9.png" alt="" loading="lazy" /&gt;
老師有自己換裝過，所以像是&lt;code&gt;cat&lt;/code&gt;這個命令，在老師的環境裡，會指向&lt;code&gt;/bin/coreutils&lt;/code&gt;，換裝個原因是因為busybox屬於簡易版的，因為要模擬出很多個命令，所以沒辦法做到非常專業，所以老師才會換裝到標準套件。
busybox可以模擬出很多linux的命令，可以打&lt;code&gt;ls -al /bin | grep cat&lt;/code&gt;，就會看到那個命令後面有一個箭頭指向&lt;code&gt;/bin/busybox&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo apk update&lt;/code&gt; (apk = alpine package)更新最新的套件清單，&lt;code&gt;sudo apk upgrade&lt;/code&gt; 將以安裝的套件去對照清單，然後更新，&lt;code&gt;sudo apk add tree&lt;/code&gt;，可以強化alpine 的作業系統功能，少了那些功能就可以用add把它加進去&lt;/li&gt;
&lt;li&gt;如果需要圖形介面可以使用 XWindow 其他 Linux 發行版也是用這個* sudo apk update 更新最新的套件清單，sudo apk upgrade 將以安裝的套件去對照清單，然後更新&lt;/li&gt;
&lt;li&gt;alpine 這種輕量化的 OS 已經是未來趨勢，因為它的資安等級很高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alpine Linux 是一套由社群開發，以安全為導向的 Linux 作業系統，目前最新的版本 v3.13.4 在 2021-03-31 發布。
跟一般的 Linux 發行版不一樣的地方是 Alpine 是使用 musl libc 和 busybox 來減少系統需求容量(5 MB )和執行消耗資源。
比起其他輕量化 Image (如：Busybox，Image 大小為1.113MB)， Alpine 的優勢在於多了像是 apt 之於 Ubuntu 這樣的套件管理工具 apk ，官方提供了大量的套件供開發者使用，可以透過網站或者直接下 apk 指令進行查詢或者安裝。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alpine 的 busybox 是 HardLink, 而不是 Softlink. Docker busybox image 沒有提供 套件安裝平台&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;補充:
musl libc
musl，一種C標準函式庫，主要使用於以Linux核心為主的作業系統上，目標為嵌入式系統與行動裝置，採用MIT授權條款釋出。作者為瑞奇·費爾克（Rich Felker）。開發此庫的目的是寫一份乾淨、高效、符合標準的C標準庫。
Musl是從零開始設計的。一是希望讓靜態連結更高效；二是現有的C標準庫在一些極端條件下表現很糟糕，競態條件、資源不足時常常會出問題，而Musl試圖避免它們來達到較高的即時魯棒性。&lt;/p&gt;
&lt;p&gt;Busybox
BusyBox是一個遵循 GPL協定、以自由軟體形式發行的應用程式。Busybox在單一的可執行檔中提供了精簡的Unix工具集，可執行於多款 POSIX 環境的作業系統，例如 Linux（包括Android）、Hurd、FreeBSD 等等。由於BusyBox執行檔的檔案比較小，使得它非常適合使用於嵌入式系統。作者將BusyBox稱為「嵌入式Linux的瑞士軍刀」。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;終端機的功能是甚麼?
終端機內執行的程式只為shell(貝殼程式)，提供input、output給主機，本身有螢幕(顯示結果)及鍵盤(輸入指令)，並無硬碟。&lt;/p&gt;
&lt;p&gt;Linux 一開始就提供了多工的介面，達到協同作業，連接很多終端機
bash script 也是一種程式語言，熟bash script 月薪五萬以上!!&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;computer program&lt;span class="hx:absolute hx:-mt-20" id="computer-program"&gt;&lt;/span&gt;
&lt;a href="#computer-program" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;program 是一個檔案，要有執行權限才能執行，而程式的執行有兩種方式 :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;interpreter(直譯式) ，把命令一行一行的執行下去
&lt;strong&gt;&lt;img src="https://lh6.googleusercontent.com/my1K9mYQqdYDYengQ4N67gQfmR1501tJNIOm6qnYpnXVuBn3sCVeXQ_S9J0H4lUkfHvHCJVFtwG_7Pm_Y-RmezS46YccnLGEy_wZGL7lCKRlrEYbfwFy1g86Cq1EiKp5RwxvXXE" alt="影像" loading="lazy" /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;compiler(編譯式)， 是把人類看得懂的程式轉成電腦看得的(011010 bin 檔) machine code 再執行
&lt;img src="https://i.imgur.com/CrCGcWm.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;compiler和interpreter都會轉換成machine code，只是interpreter是一行一行的轉&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;shell script 的 interpreter 是由開頭的 #! 來指定(與python類似) ，如果是 &lt;code&gt;bash script&lt;/code&gt; 就會指定 &lt;code&gt;#!/bin/bash&lt;/code&gt; 來翻譯&lt;/p&gt;
&lt;h3&gt;什麼是computer program？&lt;span class="hx:absolute hx:-mt-20" id="什麼是computer-program"&gt;&lt;/span&gt;
&lt;a href="#%e4%bb%80%e9%ba%bc%e6%98%afcomputer-program" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;指令的集合aka程式，通常由程式設計師以某種程式設計語言編寫，指示電腦或其他具有訊息處理能力裝置每一步動作的指令，在系統中以 program=檔案的形式存在，其中包含數個指令，可以由電腦去依照指令執行特定動作，語言轉換方式分為compiler及interpreter。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;開發 Golang 網站&lt;span class="hx:absolute hx:-mt-20" id="開發-golang-網站"&gt;&lt;/span&gt;
&lt;a href="#%e9%96%8b%e7%99%bc-golang-%e7%b6%b2%e7%ab%99" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Golang語言，有&lt;strong&gt;Ｃ語言的速度&lt;/strong&gt;、&lt;strong&gt;python的簡潔&lt;/strong&gt;和&lt;strong&gt;Ｊava的物件&lt;/strong&gt;
Ｄocker和&lt;strong&gt;Kubernetes&lt;/strong&gt;都是用Golang這個語言寫出來的
內建支援多國語言&lt;/p&gt;
&lt;h3&gt;範例：&lt;span class="hx:absolute hx:-mt-20" id="範例"&gt;&lt;/span&gt;
&lt;a href="#%e7%af%84%e4%be%8b" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cd; mkdir mygo; cd mygo
$ echo &amp;#39;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;log&amp;#34;
&amp;#34;net/http&amp;#34;
)
func handler(w http.ResponseWriter, r *http.Request) { ##開頭的func是function的意思
fmt.Fprintln(w, &amp;#34;Hello, 世界&amp;#34;)
}
func main() {
http.HandleFunc(&amp;#34;/&amp;#34;, handler)
log.Fatal(http.ListenAndServe(&amp;#34;:8888&amp;#34;, nil))
}&amp;#39; &amp;gt; main.go
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a main.go
## go build是compiler，他會把我們寫的看得懂的program（main.go）編譯成下行（main）我們看不懂的執行程式，也是個porgram
$ ./main&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;證明main.go是剛剛寫的program ⬇️ ，這個程式的功能主要是，啟動之後是個網站，到他的首頁後會出現&amp;quot;Hello, 世界&amp;quot;，還有做一個設定是port:8888&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~/mygo$ cat main.go
package main
import (
&amp;#34;fmt&amp;#34; ## 這是一個library
&amp;#34;log&amp;#34; ## 這是一個library
&amp;#34;net/http&amp;#34; ## 這是一個library
) ## import這個命令就是等下我的程式（下面的program）要使用&amp;#34;fmt&amp;#34;、&amp;#34;log&amp;#34;和&amp;#34;net/http&amp;#34;這三個library
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, &amp;#34;Hello, 世界&amp;#34;)
}
func main() { ## main()是開始的程式，一開始成形的地方
http.HandleFunc(&amp;#34;/&amp;#34;, handler) ## 在go語言要啟動一個web server，就打一個&amp;#34;http.&amp;#34;說網站的根（&amp;#34;/&amp;#34;）裡面要交給一個小程式handler
log.Fatal(http.ListenAndServe(&amp;#34;:8888&amp;#34;, nil)) ## 連接網路到一個ＩＰ位置去，除了ＩＰ位置以外，還要標示port number :8888&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;來看編譯後的執行檔，也是個program ⬇️&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~/mygo$ head -c 10 main ## 看main這個檔案前10個byte的資料
ELFbigred@m1:~/mygo$ ## bigred前面的ELF就是所謂的機械碼，因為很多碼在螢幕上是出現不了的，所以才顯示這樣&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;執行完&amp;quot;./main&amp;quot;後，再開一個CMD，連進m1，下指令
&lt;code&gt;curl http://localhost:8888&lt;/code&gt;
&lt;img src="https://i.imgur.com/LWVJWyZ.png" alt="" loading="lazy" /&gt;
也可以直接在windows系統裡面直接curl
&lt;code&gt;curl http://192.168.61.4:8888&lt;/code&gt;
&lt;img src="https://i.imgur.com/ox3gwFY.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3&gt;練習&lt;span class="hx:absolute hx:-mt-20" id="練習"&gt;&lt;/span&gt;
&lt;a href="#%e7%b7%b4%e7%bf%92" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把&amp;quot;hello，世界&amp;quot;改成&amp;quot;imok&amp;quot;&lt;/p&gt;
&lt;p&gt;第一步
&lt;code&gt;nano main.go&lt;/code&gt;
把裡面的&amp;quot;hello，世界&amp;quot;改成&amp;quot;imok&amp;quot;
&lt;img src="https://i.imgur.com/yl4aa4E.png" alt="" loading="lazy" /&gt;
Ｃtrl O 儲存，Ctrl X 離開&lt;/p&gt;
&lt;p&gt;第二步
再執行一次go buid這個compiler
&lt;code&gt;bigred@m1:~/mygo$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a main.go&lt;/code&gt;
執行完compiler後，
再執行&lt;code&gt;./main&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最後
到新的CMD裡下&lt;code&gt;curl http://192.168.61.4:8888&lt;/code&gt;
&lt;img src="https://i.imgur.com/ZPd2N9F.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;成功！以上就是compiler的程式設計．&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Java Program&lt;span class="hx:absolute hx:-mt-20" id="java-program"&gt;&lt;/span&gt;
&lt;a href="#java-program" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;JAva語言製作跟執行的過成：&lt;span class="hx:absolute hx:-mt-20" id="java語言製作跟執行的過成"&gt;&lt;/span&gt;
&lt;a href="#java%e8%aa%9e%e8%a8%80%e8%a3%bd%e4%bd%9c%e8%b7%9f%e5%9f%b7%e8%a1%8c%e7%9a%84%e9%81%8e%e6%88%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="https://lh4.googleusercontent.com/zcvKPIfMWo3NeQRZbfoPhxoRVneExU-Y3XzhPGQFL9yG-cYXGnbtj_ibji64K_M87zkP4C_l8n_J2I_aN0vWcxXb7yE-ghkjy9XYEuTxLqOgh5FyKidsctS0Clh46u_7u85uZSo" alt="影像" loading="lazy" /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;寫一個Java的program，這個原始程式是我們看得懂的，經過一個編譯器compiler，翻譯出來的叫做&amp;quot;byte code(位元碼)&amp;quot;，這個產生出來的byte code是人沒辦法直接閱讀的，是要丟給另一個程式Java virtual machine(JVM)讀的，JVM也是一個program，這個program會把剛剛產生的byte code讀進來，他來幫你翻譯成真正電腦看得懂的machine code，然後再去執行他&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;註： 在windows作業系統裡面，要事先安裝JVM這個程式；在Linux作業系統裡面，也要安裝專屬於Linux的JVM程式;Mac OS作業系統裡面，也可以安裝專屬於Linux的JVM程式，由上圖可知，&lt;strong&gt;不同的作業系統，通通都有對應的JVM程式&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;提問：為何會有這種架構？
答： 我們寫Java程式，翻譯成byte code(它的副檔名是.class)，我們只要把這個動作做完，這個編譯過後的程式碼，就可以分別到Windows、Linux和Mac OS裡面跑，這就是Java厲害的地方，&lt;strong&gt;程式寫完，編譯一次，就可以在所有的作業系統裡面來做執行&lt;/strong&gt;，Java它跨平台&lt;/p&gt;
&lt;p&gt;Java是&lt;strong&gt;interpreter and compiler 的混合語言&lt;/strong&gt;
前面編譯的過程是compiler，後面透過JVM的過程是interpreter(第一代的JVM呆呆地，把byte code一行一行慢慢讀，再轉換成machine code，這個過程就是interpreter，可是之後的JVM會把一批的byte code直接換成機械碼，內部自己做一個compiler的動作，就不是一行一行的)&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;撰寫與執行 Java 程式&lt;span class="hx:absolute hx:-mt-20" id="撰寫與執行-java-程式"&gt;&lt;/span&gt;
&lt;a href="#%e6%92%b0%e5%af%ab%e8%88%87%e5%9f%b7%e8%a1%8c-java-%e7%a8%8b%e5%bc%8f" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;第一步
先撰寫一個Java程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ echo $&amp;#39;public class ReverNum {
&amp;gt; public static void main(String[] args) {
&amp;gt;
&amp;gt; int num = 1234, reversed = 0;
&amp;gt; while(num != 0) {
&amp;gt; int digit = num % 10;
&amp;gt; reversed = reversed * 10 &amp;#43; digit;
&amp;gt; num /= 10;
&amp;gt; }
&amp;gt;
&amp;gt; System.out.println(&amp;#34;Reversed Number: &amp;#34; &amp;#43; reversed);
&amp;gt; }
&amp;gt; }&amp;#39;&amp;gt; ReverNum.java&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二步
用Javac去編譯剛剛的程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ javac ReverNum.java
-bash: javac: command not found&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;發現錯誤提示：command not found後，用ls -al查看&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ ls -al /usr/lib/jvm/java-1.8-openjdk/bin/javac
-rwxr-xr-x 1 root root 14384 Oct 14 23:21 /usr/lib/jvm/java-1.8-openjdk/bin/javac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;原因是因為javac這個命令不再環境變數裡面，看環境變數&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ echo $PATH
/home/bigred/bin:/home/bigred/dt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;發現原本的環境變數裡面沒有&lt;code&gt;/usr/lib/jvm/java-1.8-openjdk/bin/javac&lt;/code&gt;，用export加入環境變數&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ export PATH=/usr/lib/jvm/java-1.8-openjdk/bin/:$PATH
bigred@m1:~$ echo $PATH
/usr/lib/jvm/java-1.8-openjdk/bin/:/home/bigred/bin:/home/bigred/dt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再試一次用javac編譯一次&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ javac ReverNum.java
bigred@m1:~$ dir ReverNum.*
-rw-r--r-- 1 bigred bigred 714 Feb 22 17:15 ReverNum.class
-rw-r--r-- 1 bigred bigred 278 Feb 22 16:06 ReverNum.java&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;可以看到ReverNum.class，副檔名是.class代表成功編譯，可以下&lt;code&gt;head&lt;/code&gt;再檢查&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ head -c 10 ReverNum.class
4,bigred@m1:~$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;結果顯示&amp;quot;4,&amp;quot;，意思不是只有這樣，而是因為螢幕顯示不出來，編譯完的叫做byte code，它是給JVM讀的，注意&lt;strong&gt;JVM跟VM是完全不一樣的東西&lt;/strong&gt;，JVM雖然是virtual machine，但跟VMWare做的VM的內部結構完全不同&lt;/p&gt;
&lt;p&gt;最後用java（JVM）來執行這個程式，可以把 java 這個指令就當作是 JVM (讀取.class 檔案的 bytecode 並執行)&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ chmod &amp;#43;x ReverNum.class
bigred@m1:~$ java ReverNum
Reversed Number: 4321&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;這邊老師已經有先幫我們在Alpine上面下sudo apk add openjdk8這個命令，也就是說先下載了openjdk8這個壓縮檔，只要解壓縮後，就可以看到java(JVM)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Python&lt;span class="hx:absolute hx:-mt-20" id="python"&gt;&lt;/span&gt;
&lt;a href="#python" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Is Python interpreted or compiled ?&lt;/p&gt;
&lt;h2&gt;認識Process&lt;span class="hx:absolute hx:-mt-20" id="認識process"&gt;&lt;/span&gt;
&lt;a href="#%e8%aa%8d%e8%ad%98process" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;program 程式
&lt;ul&gt;
&lt;li&gt;run 程式的必要條件:
&lt;ol&gt;
&lt;li&gt;使用者有權限&lt;/li&gt;
&lt;li&gt;程式具有可執行的權限&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;process 程序&lt;/li&gt;
&lt;li&gt;thread 執行序&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Process (程序) 運作架構圖
&lt;img src="https://i.imgur.com/bKvQMY9.png" alt="" loading="lazy" /&gt;
我們的的電腦裡面會放很多的process，這些process是由我們寫的program來的，process在記憶體裡面跑，一定有3個東西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;程式碼，電腦能夠讀的machine code&lt;/li&gt;
&lt;li&gt;執行它的使用者基本資訊，而基本資訊裡有user id （使用者的代號，UID）&amp;hellip;等&lt;/li&gt;
&lt;li&gt;程序在跑，一定會有一個執行的代號，也就是PID&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;顯示程序（Process）資訊&lt;span class="hx:absolute hx:-mt-20" id="顯示程序process資訊"&gt;&lt;/span&gt;
&lt;a href="#%e9%a1%af%e7%a4%ba%e7%a8%8b%e5%ba%8fprocess%e8%b3%87%e8%a8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;條列式顯示所有程序&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ ps -eo user,pid,cmd,%mem,%cpu | head -n 5
USER PID CMD %MEM %CPU
root 1 /sbin/init 0.0 0.0
root 2 [kthreadd] 0.0 0.0
root 3 [rcu_gp] 0.0 0.0
root 4 [rcu_par_gp] 0.0 0.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;這裡的 -e 參數是代表輸出所有程序的資訊，而 -o 參數則是用來指定輸出欄位用的，後面接著所有想要輸出的欄位名稱，這裡我們讓 ps 輸出以下幾個欄位：
pid：程序 ID（process ID）。
cmd：程式名稱。
%mem：記憶體使用量（百分比）。
%cpu：CPU 使用量（百分比）。
[註] 在 Alpine Linux 系統中 , 內定 ps 命令是由 busybox 執行, 如要執行全功能 ps 命令, 請執行 sudo apk add procps&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;依照 CPU 使用量，從大到小排序程序&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ timeout 60s yes &amp;gt;/dev/null &amp;amp; ## 讓yes這個程式60秒，再把一堆Ｙ丟到黑洞，並且&amp;amp;的意思是
把程式推到背景去執行，因為如果不推到背景去執行，終端機會沒辦法作業
[1] 67706
bigred@m1:~$ ps -eo user,pid,cmd,%mem,%cpu --sort=-%cpu | head -n 3
USER PID CMD %MEM %CPU
bigred 67707 yes 0.0 98.3
root 4135 kube-apiserver --advertise- 3.5 4.3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;可以看到執行YES這個program的使用者是bigred，這時候會變成process，而它的的PID（執行代號）是67707，記憶體使用量是0％，CPU的使用量是98.3%&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;YES這個命令的應用是給cisco工程師使用的，他們在設定網路設備的時候會需要一直按YES，這時候就會需要這個指令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如何證明YES是一個檔案？&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ which yes
/usr/bin/yes
bigred@m1:~$ ls -al /usr/bin/yes
lrwxrwxrwx 1 root root 9 Nov 27 20:47 /usr/bin/yes -&amp;gt; coreutils&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3&gt;安裝完整功能的&lt;code&gt;pstree&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="安裝完整功能的pstree"&gt;&lt;/span&gt;
&lt;a href="#%e5%ae%89%e8%a3%9d%e5%ae%8c%e6%95%b4%e5%8a%9f%e8%83%bd%e7%9a%84pstree" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ sudo apk add pstree
fetch http://dl-cdn.alpinelinux.org/alpine/latest-stable/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/latest-stable/community/x86_64/APKINDEX.tar.gz
(1/1) Installing pstree (2.39-r1)
Executing busybox-1.34.1-r4.trigger
OK: 1692 MiB in 294 packages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;以樹狀顯示Alpine Linux 程序資訊&lt;span class="hx:absolute hx:-mt-20" id="以樹狀顯示alpine-linux-程序資訊"&gt;&lt;/span&gt;
&lt;a href="#%e4%bb%a5%e6%a8%b9%e7%8b%80%e9%a1%af%e7%a4%baalpine-linux-%e7%a8%8b%e5%ba%8f%e8%b3%87%e8%a8%8a" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ pstree -g 3
─┬= 00001 root /sbin/init
├──= 03856 root /sbin/getty 38400 tty6
├──= 03852 root /sbin/getty 38400 tty5
├──= 03847 root /sbin/getty 38400 tty4
├──= 03843 root /sbin/getty 38400 tty3
├──= 03839 root /sbin/getty 38400 tty2
├─┬= 03837 root /bin/login -f bigred
│ └─┬= 03848 bigred -bash
│ └─── 03913 bigred dialog --title Cloud Native Trainer --textbox /tmp/sinfo 24 85
...以下省略&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;/sbin/init 是第一個啟動的程式，他的pid就是00001，由root做執行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提問： 誰啟動/sbin/init這個程式？
Linux 的 kernel會幫我們啟動整個Linux系統裡面的第一個process&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tty1（第一個終端機）在執行login(&lt;code&gt;03837 root /bin/login -f bigred&lt;/code&gt;)，也就是登入的工作，接著&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;03848 bigred -bash&lt;/code&gt;貝殼程式啟動，接著&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;3913 bigred dialog --title Cloud Native Trainer --textbox /tmp/sinfo 24 85&lt;/code&gt;啟動
&lt;img src="https://i.imgur.com/WZxrOZI.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在老師的機器裡面，老師有設定login的檔案，讓它可以自動登入bigred&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意！在帳號密碼打完，shell程式啟動以後，第一個跑的程式其實是&lt;code&gt;/etc/profile&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;bigred@m1:~$ tail -n 10 /etc/profile
alias kd=&amp;#39;kubectl delete&amp;#39;
alias kc=&amp;#39;kubectl create&amp;#39;
alias ks=&amp;#39;kubectl get pods -n kube-system&amp;#39;
[ -f /home/bigred/dt/alpine.bash ] &amp;amp;&amp;amp; source /home/bigred/dt/alpine.bash
# /etc/local.d/rc.local.start (相當於 rc.local) create /tmp/sinfo
if [ -z &amp;#34;$SSH_TTY&amp;#34; ]; then
[ -f /tmp/sinfo ] &amp;amp;&amp;amp; dialog --title &amp;#34; Cloud Native Trainer &amp;#34; --textbox /tmp/sinfo 24 85; clear
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;可以看到倒數第二行的&amp;quot; Cloud Native Trainer &amp;ldquo;，由此可知dialog是由/etc/profile這個program執行的，所以在alpine linux系統裡面，有很多使用者他們需要的變數或功能，老師都會把它寫在這個程式裡面。
/etc/profile就是bash script，只要帳號密碼一打成功，他就是第一個被執行的bash script程式，完了以後，它才會在跑道使用者的家目錄裡面，去執行.bashrc這個程式，一樣也是bash script程式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt; bigred@m1:~$ pstree -g 3
...以上省略
├─┬─ 04039 root sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
│ └─┬= 04256 root sshd: bigred [priv]
│ └─┬─ 04262 bigred sshd: bigred@pts/0
│ └─┬= 04264 bigred -bash
│ └──= 88243 bigred pstree -g 3
...以下省略&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;我們在windows的CMD上面打，&lt;code&gt;ssh bigred@192.168.61.4&lt;/code&gt;就是跟
&lt;code&gt;04039 root sshd: ...省略&lt;/code&gt;這個openssh server做連接，&lt;/p&gt;
&lt;p&gt;連接到以後，&lt;code&gt;04256 root sshd: bigred [priv]&lt;/code&gt;會偵測到是bigred要登入進來&lt;/p&gt;
&lt;p&gt;之後，&lt;code&gt;04262 bigred sshd: bigred@pts/0&lt;/code&gt;會給一個遠端的虛擬終端機（pts）給bigred這個帳號使用，&lt;/p&gt;
&lt;p&gt;進去終端機後，一樣會跑&lt;code&gt;04264 bigred -bash&lt;/code&gt;這個貝殼程式&lt;/p&gt;
&lt;p&gt;只要是linux系統的終端機，進去以後一定跑貝殼程式&lt;/p&gt;
&lt;p&gt;只要我們的帳號有&lt;strong&gt;登入成功&lt;/strong&gt;，在Alpine Linux的系統裡面，不管是在本機的終端機（tty）還是遠端虛擬的專端機（pts），&lt;strong&gt;進去以後一定都會去執行/etc/profile&lt;/strong&gt;，某些公司裡特殊的shell例外&lt;/p&gt;
&lt;p&gt;注意：&lt;strong&gt;要切換使用者還是重開一個CMD登入好，su切換使用者，環境變數跟資料會有缺失&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2021/09/24 下午2:39繼續&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h6&gt;tags: &lt;code&gt;Linux&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-linux"&gt;&lt;/span&gt;
&lt;a href="#tags-linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>Windows Batch 程式設計</title><link>https://blog.kubeantony.com/archive/misc/windows-batch-%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/</link><pubDate>Sun, 07 Aug 2022 14:55:06 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/windows-batch-%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/</guid><description>
&lt;p&gt;在 Windows 命令提示字元 視窗, 編輯 vmstart.bat 及 vmstop.bat
（notepad 就是記事本，用它來編輯批次檔 &amp;raquo;&amp;gt; *.bat）
編輯開機的批次檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;C:\Users\bigred&amp;gt;notepad vmstart.bat
@echo off
&amp;#34;C:\Program Files (x86)\VMware\VMware Player\vmrun&amp;#34; start &amp;#34;c:\alp.takoyaki\alp.takoyaki.vmx&amp;#34; 1&amp;gt;nul&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;1&amp;gt;null ，1代表一號裝置 螢幕，把螢幕上資訊導入黑洞
&lt;code&gt;Batch&lt;/code&gt; 預設會顯示 &lt;code&gt;.bat&lt;/code&gt; 內含的指令內容，指令內容的顯示與指令執行的結果訊息兩者不同
@echo off ，要關閉內容顯示要使用 &lt;code&gt;@echo off&lt;/code&gt; 放置於前方
vmrun路徑 &amp;ldquo;C:\Program Files (x86)\VMware\VMware Player\vmrun&amp;rdquo;
動作 start/stop/reset
虛擬機路徑 &amp;ldquo;c:\alp.takoyaki\alp.takoyaki.vmx&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;編輯關機虛擬機器的批次檔&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;C:\Users\bigred&amp;gt;notepad vmstop.bat
@echo off
&amp;#34;C:\\Program Files (x86)\\VMware\\VMware Player\\vmrun&amp;#34; stop &amp;#34;c:\\alp.takoyaki\\alp.takoyaki.vmx&amp;#34; 1&amp;gt;nul&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;set &lt;/code&gt;可以看到Ｗindows的環境變數
只要是電腦，一定會有環境變數，所有的作業系統通通都有PATH環境變數&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;C:\Users\ybean&amp;gt;set
...
Path=C:\Program Files (x86)\VMware\VMware Player\bin\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Users\ybean\AppData\Local\Microsoft\WindowsApps;
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;當我們在windows裡面執行一個指令，系統會到PATH環境變數裡面的目錄，找指令所在的目錄，&lt;/p&gt;
&lt;p&gt;以下的vmrun會失敗&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;C:\Users\ybean&amp;gt;vmrun
&amp;#39;vmrun&amp;#39; is not recognized as an internal or external command,
operable program or batch file.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;失敗原因是因為vmrun這個指令他所在的目錄路徑位置，沒有在PATH環境變數中&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;golang 網站程式設計&lt;span class="hx:absolute hx:-mt-20" id="golang-網站程式設計"&gt;&lt;/span&gt;
&lt;a href="#golang-%e7%b6%b2%e7%ab%99%e7%a8%8b%e5%bc%8f%e8%a8%ad%e8%a8%88" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;go 語言有 C 語言的速度、java 的物件導向能力、python 語言的簡潔
docker 用go 語言寫的
kubernetes 用go語言寫的
cncf.io &amp;raquo;&amp;gt; project 裡面的專案都用go語言寫的&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;net/http&amp;#34;
&amp;#34;net/http/cgi&amp;#34;
)
func cgiHandler(w http.ResponseWriter, r *http.Request) {
handler := cgi.Handler{Path: &amp;#34;cgihello.sh&amp;#34;}
handler.ServeHTTP(w, r)
}
func main() { # main() ，代表整個程式從這邊開始執行
http.HandleFunc(&amp;#34;/&amp;#34;, cgiHandler) # cgi後面的功能Handler的第一個字母，最好要大寫
http.ListenAndServe(&amp;#34;:8080&amp;#34;, nil) # :8080 的冒號，代表的意思是哪台機器執行這支程式，它的IP位址就會是go語言網站的網址，後面再加8080
} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;程式一直行，網站就會打開，然後會去執行cgihello.sh這支程式&lt;/p&gt;
&lt;p&gt;編輯cgihello.sh&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano cgihello.sh （程式輸出的對象是瀏覽器）
#!/bin/bash
echo &amp;#34;Content-type: text/html&amp;#34; （網頁標籤）
echo &amp;#34;&amp;#34; （換行）
echo &amp;#39;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;#39;
echo &amp;#39;Hello From Bash&amp;lt;br/&amp;gt;Environment:&amp;#39;
echo &amp;#39;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#39;
exit 0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;用go lang語言可以將bash script的執行結果輸出到瀏覽器上&lt;/p&gt;
&lt;p&gt;Golang執行cgihello.sh將程式指令結果送到前端呈現&lt;/p&gt;
&lt;h6&gt;tags: &lt;code&gt;windows批次檔指令&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-windows批次檔指令"&gt;&lt;/span&gt;
&lt;a href="#tags-windows%e6%89%b9%e6%ac%a1%e6%aa%94%e6%8c%87%e4%bb%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>/etc/profile</title><link>https://blog.kubeantony.com/archive/misc/etc-profile/</link><pubDate>Sun, 07 Aug 2022 14:48:24 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/etc-profile/</guid><description>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat /etc/profile
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PAGER=less
export PS1=&amp;#39;\h:\w\$ &amp;#39;
umask 022
for script in /etc/profile.d/*.sh ; do
if [ -r $script ] ; then
. $script
fi
done
# Alpine 的啟動系統是 openrc, 登入前會執行 /etc/local.d/rc.local.start, 登入後會執行 /etc/profile
gw=$(route -n | grep -e &amp;#34;^0.0.0.0 &amp;#34;)
export GWIF=${gw##* }
ips=$(ifconfig $GWIF | grep &amp;#39;inet &amp;#39;)
export IP=$(echo $ips | cut -d&amp;#39; &amp;#39; -f2 | cut -d&amp;#39;:&amp;#39; -f2)
export NETID=${IP%.*}
export GW=$(route -n | grep -e &amp;#39;^0.0.0.0&amp;#39; | tr -s \ - | cut -d &amp;#39; &amp;#39; -f2)
export PATH=&amp;#34;/home/bigred/bin:/home/bigred/vmalpdt/bin:$PATH&amp;#34;
# source /home/bigred/bin/myk3s
clear &amp;amp;&amp;amp; sleep 2
echo &amp;#34;Welcome to Alpine Linux : `cat /etc/alpine-release`&amp;#34;
[ &amp;#34;$IP&amp;#34; != &amp;#34;&amp;#34; ] &amp;amp;&amp;amp; echo &amp;#34;IP : $IP&amp;#34;
echo &amp;#34;&amp;#34;
if [ &amp;#34;$USER&amp;#34; == &amp;#34;bigred&amp;#34; ]; then
# change hostname &amp;amp; set IP
sudo /home/bigred/bin/chnameip
# create join k3s command
#which kubectl &amp;amp;&amp;gt;/dev/null
#if [ &amp;#34;$?&amp;#34; == &amp;#34;0&amp;#34; ]; then
# if [ -z &amp;#34;$SSH_TTY&amp;#34; ]; then
# echo &amp;#34;K3S Starting, pls wait 30 sec&amp;#34; &amp;amp;&amp;amp; sleep 30
# kubectl get nodes 2&amp;gt;/dev/null | grep master | grep `hostname` &amp;amp;&amp;gt;/dev/null
# if [ &amp;#34;$?&amp;#34; == &amp;#34;0&amp;#34; ]; then
# echo &amp;#34;sudo curl -sfL https://get.k3s.io | K3S_URL=https://$IP:6443 K3S_TOKEN=`sudo cat /var/lib/rancher/k3s/server/node-token` K3S_KUBECONFIG_MODE=&amp;#39;644&amp;#39; sh - &amp;amp;&amp;amp; sudo reboot&amp;#34; &amp;gt; /home/bigred/bin/joink3s
# chmod &amp;#43;x /home/bigred/bin/joink3s
# fi
# fi
#fi
fi
export PS1=&amp;#34;\u@\h:\w\$ &amp;#34;
alias ping=&amp;#39;ping -c 4 &amp;#39;
alias pingdup=&amp;#39;sudo arping -D -I eth0 -c 2 &amp;#39;
alias dir=&amp;#39;ls -alh &amp;#39;
alias poweroff=&amp;#39;sudo poweroff; sleep 5&amp;#39;
alias reboot=&amp;#39;sudo reboot; sleep 5&amp;#39;
alias kg=&amp;#39;kubectl get&amp;#39;
alias ka=&amp;#39;kubectl apply&amp;#39;
alias kd=&amp;#39;kubectl delete&amp;#39;
alias kc=&amp;#39;kubectl create&amp;#39;
alias ks=&amp;#39;kubectl get pods -n kube-system&amp;#39;
[ -f /home/bigred/dt/alpine.bash ] &amp;amp;&amp;amp; source /home/bigred/dt/alpine.bash
# /etc/local.d/rc.local.start (相當於 rc.local) create /tmp/sinfo
if [ -z &amp;#34;$SSH_TTY&amp;#34; ]; then
[ -f /tmp/sinfo ] &amp;amp;&amp;amp; dialog --title &amp;#34; Cloud Native Trainer &amp;#34; --textbox /tmp/sinfo 24 85; clear
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h6&gt;tags: &lt;code&gt;Linux&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-linux"&gt;&lt;/span&gt;
&lt;a href="#tags-linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>Install Ubuntu Server 22.04 LTS</title><link>https://blog.kubeantony.com/archive/misc/install-ubuntu-server-22.04-lts/</link><pubDate>Sun, 07 Aug 2022 14:34:40 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/install-ubuntu-server-22.04-lts/</guid><description>
&lt;p&gt;LTS : 長期支援（ 英語：Long-term support )
偶數年的 4 月都是長期支援版，不是 LTS 的，通常只能支援 1 年多。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;點選 &amp;ldquo;US2204&amp;rdquo; 這台 VM，再按 &amp;ldquo;Play virtual machine&amp;rdquo;
&lt;img src="https://i.imgur.com/QHrzzN4.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;直接按 &amp;ldquo;Enter&amp;rdquo;
&lt;img src="https://i.imgur.com/vneg9SV.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;語言設定，在 &amp;ldquo;English&amp;rdquo; 上面按 &amp;ldquo;Enter&amp;rdquo;
&lt;img src="https://i.imgur.com/lIdCTYE.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在&amp;quot;Continue without updating&amp;quot;上，按 &amp;ldquo;Enter&amp;rdquo;，( 沒有就不用理會，因為我們要安裝的是 22.04 ，不是 22.06，所以他自己也知道不要鬧了，預設停在 Continue without updating )
&lt;img src="https://i.imgur.com/aVxW82Y.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;鍵盤設定，走預設，因為我們台灣的鍵盤都是美規，所以直接按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/tGiWY01.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;直接按 &amp;ldquo;Enter&amp;rdquo; 選擇預設的系統，不要 &lt;del&gt;minimzed&lt;/del&gt;
&lt;img src="https://i.imgur.com/UvEUdPp.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;網路設定，直接按&amp;quot;Enter&amp;quot;走 DHCP 自動配發 IP 位址給我們
&lt;img src="https://i.imgur.com/ekywgHk.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;直接按&amp;quot;Enter&amp;quot;，proxy Server 代理伺服器，幫我們把封包從內網送到外網，它的特性是可以看到我們上網時去了哪個網站，會有隱私權的問題，他其實是一種機制，可以控管資料有無外洩，但是我們不需要。
&lt;img src="https://i.imgur.com/vMZUdSu.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;如果不分流，可使用預設，直接按&amp;quot;Enter&amp;quot;，Mirror address 套件下載的網址 ，預設會找離台灣最近的，它怎麼知道離台灣最近的，因為網路通了，如果這邊出現的網址不是台灣的 &lt;code&gt;http://tw.archive.ubuntu.com/ubuntu&lt;/code&gt; ，可能要 back 回去看有沒有錯。
&lt;img src="https://i.imgur.com/6o3CnUE.png" alt="" loading="lazy" /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a
href="https://launchpad.net/ubuntu/&amp;#43;archivemirrors"target="_blank" rel="noopener"&gt;ubuntu repository mirror list 連結&lt;/a&gt;
&lt;img src="https://i.imgur.com/XpjuGHE.png" alt="" loading="lazy" /&gt;
前三個是倉庫鏡像站，也是光碟鏡像站&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;硬碟設定，走預設就好，按鍵盤往下鍵，一直到&amp;quot;Done&amp;quot;那裡，再按&amp;quot;Enter&amp;quot;。
預設是整顆硬碟都要用，LVM ( Logical Volume Manager )，專門管理硬碟的系統，啟動 LVM 的好處是萬一硬碟空間不夠，可以立刻加空間進去，不須重新格式化，它會直接 append 上去，讓不足的空間再延伸，這種功能一開始是 HP 發明的，後來 Linux 拿來用 。&lt;/li&gt;
&lt;li&gt;可以看到 available 那邊的 free space 還有 297.996G ，代表還有空間未配置完，我們要把這些可以用的空間全部配置到根目錄。
&lt;img src="https://i.imgur.com/TqREWxE.png" alt="" loading="lazy" /&gt;
ubuntu 的檔案系統為 ext4 檔案系統
windows 的檔案系統為 ntfs 或是 fat32 檔案系統
red hat 的 Linux 的檔案系統為 xfs 檔案系統
按鍵盤的往下鍵，移到 Type 那裡的 &amp;ldquo;mounted at /&amp;rdquo; 那行，按一下 &amp;ldquo;Enter&amp;rdquo; ，再按鍵盤的往下鍵，選到&amp;quot;edit&amp;quot;
&lt;img src="https://i.imgur.com/XIR9r3r.png" alt="" loading="lazy" /&gt;
看左邊 max 的數字多少就打多少，這裡是 397.996G，打完後，按鍵盤的往下鍵，移到 Save 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/N1caP9q.png" alt="" loading="lazy" /&gt;
available 那邊都變灰色，就可以按鍵盤的往下鍵，移到 Done 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/m8ztLCw.png" alt="" loading="lazy" /&gt;
在 &amp;ldquo;Continue&amp;rdquo; 按 &amp;ldquo;Enter&amp;rdquo;，要注意，這邊選完後，硬碟會格式化，就不能反悔了。
&lt;img src="https://i.imgur.com/8zMKWrp.png" alt="" loading="lazy" /&gt;
在雲端架設 Server 不會開啟 swap 置換空間，就是電腦記憶體不足時，它會把記憶體騰出來，而這個騰出來的地方，就叫 swap 置換空間。
我們現在是要做一個真實的 Server ，Ubuntu Server 會自動產生一個 swap file ，這樣我們灌好以後，可以自行決定，要當雲端的 Server 呢? 還是當作一般的 Server ? 如果當一般的 Server ，那就一定要 swap ，剛好用它建好的，如果要當雲端的，那我們就把 swap file 刪掉就好。
&lt;img src="https://i.imgur.com/rv8lobS.png" alt="" loading="lazy" /&gt;
&lt;img src="https://i.imgur.com/QuiXxxE.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;建帳號，( 人名和帳號名稱盡量相同 )
Your name: &lt;strong&gt;bigboss&lt;/strong&gt;
Your Server&amp;rsquo;s name: &lt;strong&gt;CVN80&lt;/strong&gt;
Pick a username: &lt;strong&gt;bigboss&lt;/strong&gt;
Choose a password:
Confirm your password:
最後按鍵盤的往下鍵，移到 Done 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/tknVNY6.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在 &amp;ldquo;Install OpenSSH server&amp;rdquo; 那邊按一下&amp;quot;空白鍵&amp;quot;，選擇要安裝 OpenSSH server，按鍵盤的往下鍵，移到 Done 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/2fRD7GA.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;以下的功能都不用安裝，按鍵盤的往下鍵，移到 Done 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/dExj2XO.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;等待系統安裝好後，按鍵盤的往下鍵，移到 Reboot Now 後按&amp;quot;Enter&amp;quot;
&lt;img src="https://i.imgur.com/63pAZq9.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;在右上角按右鍵，選擇 &amp;ldquo;Settings&amp;hellip;&amp;rdquo;
&lt;img src="https://i.imgur.com/R7oHl2y.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;選到&amp;quot;CD/DVD (SATA)&amp;quot;，按 &amp;ldquo;Remove&amp;rdquo;，再按&amp;quot;ok&amp;quot;
退光碟片的原因是因為 我們已經將作業系統安裝到虛擬硬碟檔上了，不需要光碟片，所以刪掉。
&lt;img src="https://i.imgur.com/oQaAj19.png" alt="" loading="lazy" /&gt;&lt;/li&gt;
&lt;li&gt;將 VM 重開機後，安裝完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;tags: &lt;code&gt;Linux&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-linux"&gt;&lt;/span&gt;
&lt;a href="#tags-linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>Ubuntu Server 設定帳號自動登入</title><link>https://blog.kubeantony.com/archive/misc/ubuntu-server-%E8%A8%AD%E5%AE%9A%E5%B8%B3%E8%99%9F%E8%87%AA%E5%8B%95%E7%99%BB%E5%85%A5/</link><pubDate>Sun, 07 Aug 2022 14:26:32 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/ubuntu-server-%E8%A8%AD%E5%AE%9A%E5%B8%B3%E8%99%9F%E8%87%AA%E5%8B%95%E7%99%BB%E5%85%A5/</guid><description>
&lt;h2&gt;Set auto-login&lt;span class="hx:absolute hx:-mt-20" id="set-auto-login"&gt;&lt;/span&gt;
&lt;a href="#set-auto-login" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# 設定 bigboss 帳號自動登入 ( 在第 40 行 )
$ sudo nano -l /lib/systemd/system/getty@.service
ExecStart=-/sbin/agetty --autologin bigboss --keep-baud 115200,38400,9600 %I $TERM&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Description :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;當 getty@.service 的服務啟動時，執行 /sbin/agetty 這支程式，讓 bigboss 這位使用者自動登入，不用輸入帳號密碼。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;名詞解釋 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;- what is getty ?
getty 是“get tty”的縮寫，是在管理物理或虛擬終端 (TTY) 的主機上運行的 Unix 程序。
當它檢測到連接時，它會提示輸入用戶名並運行“登錄”程序來驗證用戶身份。
- getty@.service
負責虛擬終端(VT) 登錄提示，即顯示在/dev/tty1和類似設備中的 VGA 屏幕上的提示。
- ExecStart
服務啟動時執行的命令和參數。
- baud rate
傳輸和接收數據的速度。9600 是標準速率，但在某些設備中其他速度是典型的。請記住，通信鏈中的所有環節都必須以相同的速度“說話”，否則數據會在一端或另一端被誤解。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;/sbin/agetty Introduction&lt;span class="hx:absolute hx:-mt-20" id="sbinagetty-introduction"&gt;&lt;/span&gt;
&lt;a href="#sbinagetty-introduction" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;agetty | alternative Linux getty ( 替代 Linux getty )
描述 :
agetty 打開一個 tty 端口，提示輸入登錄名並調用 /bin/login 命令。 它通常由 init(8) 調用。
參數 :
-/sbin/agetty
The dash means that systemd will not treat non-zero exit codes as a failure.
破折號表示 systemd 不會把 exit 0 之外的代碼，判定是錯誤代碼
--autologin username
Automatically log in the specified user without asking for a username or password.
自動登錄指定用戶，無需輸入用戶名或密碼。
-s, --keep-baud
Try to keep the existing baud rate.
盡量保持現有的 baud rate。
%i
Instance name，For instantiated units: this is the string between the &amp;#34;@&amp;#34; character and the suffix of the unit name.
%I
Unescaped instance name，Same as &amp;#34;%i&amp;#34;, but with escaping undone
What does &amp;#34;escaping&amp;#34; mean?
轉義意味著更改特殊字符。 %i 將特殊字符 / 替換為破折號 - 和 \x20。
$TERM
conventions for naming terminal types&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h6&gt;tags: &lt;code&gt;Linux&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-linux"&gt;&lt;/span&gt;
&lt;a href="#tags-linux" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>楊世宏老師 : IOT Intro</title><link>https://blog.kubeantony.com/archive/misc/%E6%A5%8A%E4%B8%96%E5%AE%8F%E8%80%81%E5%B8%AB-iot-intro/</link><pubDate>Thu, 28 Jul 2022 17:15:38 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E6%A5%8A%E4%B8%96%E5%AE%8F%E8%80%81%E5%B8%AB-iot-intro/</guid><description>
&lt;hr&gt;
&lt;h2&gt;IOT 講義連結&lt;span class="hx:absolute hx:-mt-20" id="iot-講義連結"&gt;&lt;/span&gt;
&lt;a href="#iot-%e8%ac%9b%e7%be%a9%e9%80%a3%e7%b5%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a
href="https://drive.google.com/drive/folders/19P5pijLjiZPojj9m29feK_0qL5VQ3sii?usp=sharing"target="_blank" rel="noopener"&gt;講義連結&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;IoT Solution Architecture&lt;span class="hx:absolute hx:-mt-20" id="iot-solution-architecture"&gt;&lt;/span&gt;
&lt;a href="#iot-solution-architecture" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/NedQ3n8.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;機房監控系統&lt;span class="hx:absolute hx:-mt-20" id="機房監控系統"&gt;&lt;/span&gt;
&lt;a href="#%e6%a9%9f%e6%88%bf%e7%9b%a3%e6%8e%a7%e7%b3%bb%e7%b5%b1" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/9XVl94K.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;電流感測器
&lt;ul&gt;
&lt;li&gt;型號：PZEM-004T&lt;/li&gt;
&lt;li&gt;安裝位置：一條電源延長線中間剪一段連上去，另外抽一條 USB 線，這條 USB 線就是用來傳送 Sensor 收集到的數據。&lt;/li&gt;
&lt;li&gt;接法：將延長線的電源接到牆壁插座，延長線的插座接要偵測的電器，只要&lt;font color=red&gt;將想偵測的電器接到延長線的插座就可以收集到數據&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;USB 線：傳送 Sensor 收集到的數據到 Windows or Linux 機器（都可以），這台機器收到以後，會將資料傳到雲端，這台機器就是扮演 IOT Gateway 的角色。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/H3s7POR.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/JaDZGKZ.jpg" alt="" loading="lazy" /&gt;
&lt;img src="https://i.imgur.com/nQPpnmJ.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;h2&gt;IOT Gateway&lt;span class="hx:absolute hx:-mt-20" id="iot-gateway"&gt;&lt;/span&gt;
&lt;a href="#iot-gateway" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;定義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能夠處理和蒐集 IoT Device 的資料&lt;/li&gt;
&lt;li&gt;具備網際網路傳輸能力的機器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IOT Device&lt;span class="hx:absolute hx:-mt-20" id="iot-device"&gt;&lt;/span&gt;
&lt;a href="#iot-device" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;又稱為 Sensor&lt;/li&gt;
&lt;li&gt;通常不具有網際網路的傳輸能力。&lt;/li&gt;
&lt;li&gt;有些人會直接在 Sensor 上面加工，讓它具有網際網路傳輸的能力，缺點是該 Sensor 就只能傳它自己的資料，不能同時接多個 Sensor 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;傳輸方法&lt;span class="hx:absolute hx:-mt-20" id="傳輸方法"&gt;&lt;/span&gt;
&lt;a href="#%e5%82%b3%e8%bc%b8%e6%96%b9%e6%b3%95" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/PUdjzRg.png" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;從 IOT Gateway 傳到 MQTT broker ，是透過 MQTT 通訊協定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;主要是用來傳輸資料，傳輸資料消耗的流量低。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Client 端會與 Server 端建立通道，一旦通道建立成功，除非 Clinet 端主動結束通道，不然通道不會結束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Server 端可以主動傳資料到 Client 端，不需得到 Client 端同意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;font color=red&gt;&lt;strong&gt;Server 無須知道 Client 端的 IP 位址也能進行即時的雙向溝通&lt;/strong&gt;。&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/LMrQeX0.png" alt="示意圖" loading="lazy" /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MQTT Broker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它是 MQTT 的中心，允許 Clinet 端收集和傳送資料。&lt;/li&gt;
&lt;li&gt;做資料的中轉，所有設備會將資料傳到 broker 上面， broker 會根據 Subscriber 的需求，將資料轉送給 Subscriber (資料科學家)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MQTT Client&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Publisher ，代表 IOT Gaeway ，發布者
&lt;ul&gt;
&lt;li&gt;可自定義 Topic&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Subscriber ，資料科學家，訂閱者
&lt;ul&gt;
&lt;li&gt;Topic 設為 &lt;code&gt;#&lt;/code&gt; ，代表一次訂閱 Broker 的所有內容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Topic&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;資料的分類&lt;/li&gt;
&lt;li&gt;例如：&lt;code&gt;iotdata/powermeter/{MQTT_Broker_hostname}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Payload&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Topic 的內容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重點整理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clinet（ 資料科學家 ） 與 client ( IOT Gayeway ) 溝通會需要透過 MQTT 的 Broker。&lt;/li&gt;
&lt;li&gt;Topic 由發布者定義。&lt;/li&gt;
&lt;li&gt;broker 本身不會儲存資料，他是中間的轉寄站。&lt;/li&gt;
&lt;li&gt;Subscriber 一定要先訂閱 Topic 才會接收到 Publisher 發布的 Topic 資料。&lt;/li&gt;
&lt;li&gt;MQTT Broker 收到 Publisher 發布的資料後，發現沒有 Subscriber 訂閱，則將資料丟掉。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;MQTT Client 端命令&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;Mosquitto
&lt;ul&gt;
&lt;li&gt;由 Eclipse 公司設計的 program&lt;/li&gt;
&lt;li&gt;讓我們可以扮演 MQTT client 的角色&lt;/li&gt;
&lt;li&gt;Ubuntu Linux 安裝方法：&lt;code&gt;sudo apt install mosquitto-clients&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Alpine Linux 安裝方法：&lt;code&gt;sudo apk add mosquitto-clients&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;MQTT Subscribe 命令&lt;span class="hx:absolute hx:-mt-20" id="mqtt-subscribe-命令"&gt;&lt;/span&gt;
&lt;a href="#mqtt-subscribe-%e5%91%bd%e4%bb%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;mosquitto_sub -v -t &amp;#39;iotdata/powermeter/J509-12&amp;#39; \
-h &amp;#39;pu230.oc99.org&amp;#39; \
-p 1883 \
-u &amp;#39;bigred&amp;#39; \
-P &amp;#39;bigred&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;-v&lt;/code&gt; 詳細資訊，收到的資訊會看到資料是哪個 Topic
&lt;code&gt;-t&lt;/code&gt; Puberlisher 端的 Topic
&lt;code&gt;-h&lt;/code&gt; MQTT broker 網址
&lt;code&gt;-p&lt;/code&gt; port 號&lt;/p&gt;
&lt;p&gt;以下為連接到 broker 使用的帳號密碼：
&lt;code&gt;-u&lt;/code&gt; 帳號
&lt;code&gt;-P&lt;/code&gt; 密碼&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;執行完命令後，看到卡住是正常的，因為他正在等待 Puberlisher 傳資料給他。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;MQTT Publish 命令&lt;span class="hx:absolute hx:-mt-20" id="mqtt-publish-命令"&gt;&lt;/span&gt;
&lt;a href="#mqtt-publish-%e5%91%bd%e4%bb%a4" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;mosquitto_pub -t &amp;#39;iotdata/powermeter/J509-12&amp;#39; \
-h &amp;#39;pu230.oc99.org&amp;#39; \
-p 1883 \
-u &amp;#34;bigred&amp;#34;\
-P &amp;#39;bigred&amp;#39; \
-m &amp;#39;Hello&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;-m&lt;/code&gt; Topic 內容&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;Install MQTT Broker on alpine&lt;/h1&gt;&lt;p&gt;&lt;a
href="https://github.com/Oscar-Young/Mosquitto-alpine-podman/blob/main/README.md"target="_blank" rel="noopener"&gt;文件連結&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;prepare&lt;span class="hx:absolute hx:-mt-20" id="prepare"&gt;&lt;/span&gt;
&lt;a href="#prepare" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo apk update &amp;amp;&amp;amp; sudo apk add podman
$ sudo rc-update add cgroups
$ sudo rc-service cgroups start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Create work directory&lt;span class="hx:absolute hx:-mt-20" id="create-work-directory"&gt;&lt;/span&gt;
&lt;a href="#create-work-directory" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ mkdir iot &amp;amp;&amp;amp; cd iot &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Setting mosquitto config file and password_file&lt;span class="hx:absolute hx:-mt-20" id="setting-mosquitto-config-file-and-password_file"&gt;&lt;/span&gt;
&lt;a href="#setting-mosquitto-config-file-and-password_file" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create Config file&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ nano mosquitto.conf
listener 1883
allow_anonymous false
password_file /mosquitto/data/password_file&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Create password_file&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ touch password_file&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Create mosquitto container&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ sudo podman run -itd \
--restart=always \
--name mosquitto \
-p 1883:1883 \
-v ./mosquitto.conf:/mosquitto/config/mosquitto.conf \
-v ./password_file:/mosquitto/data/password_file \
eclipse-mosquitto&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Create mosquttio user&lt;span class="hx:absolute hx:-mt-20" id="create-mosquttio-user"&gt;&lt;/span&gt;
&lt;a href="#create-mosquttio-user" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Use mosquitto_passwd command to create user, please replace {USERNAME} and {PASSWORD} to you wanted.&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;# Add user
$ sudo podman exec -it mosquitto mosquitto_passwd -b /mosquitto/data/password_file {USERNAME} {PASSWORD}
# Reload password_file
$ sudo podman exec -it mosquitto kill -SIGHUP 1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h1&gt;Publisher Program&lt;/h1&gt;&lt;p&gt;&lt;a
href="https://github.com/Oscar-Young/SmartHost"target="_blank" rel="noopener"&gt;SmartHost - 世宏老師的 Github 連結&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;tags: &lt;code&gt;IOT&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-iot"&gt;&lt;/span&gt;
&lt;a href="#tags-iot" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item><item><title>不要小數點</title><link>https://blog.kubeantony.com/archive/misc/%E4%B8%8D%E8%A6%81%E5%B0%8F%E6%95%B8%E9%BB%9E/</link><pubDate>Fri, 15 Jul 2022 12:16:26 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/%E4%B8%8D%E8%A6%81%E5%B0%8F%E6%95%B8%E9%BB%9E/</guid><description>
&lt;h2&gt;檢視原始資料檔&lt;span class="hx:absolute hx:-mt-20" id="檢視原始資料檔"&gt;&lt;/span&gt;
&lt;a href="#%e6%aa%a2%e8%a6%96%e5%8e%9f%e5%a7%8b%e8%b3%87%e6%96%99%e6%aa%94" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat carGPS.csv
54964354,2021-04-05 15:52:16.0000000,25.1399694,121.8019056,28429,0
54964354,2021-04-05 15:52:19.0000000,25.1399694,121.8019056,28429,0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;程式解析&lt;span class="hx:absolute hx:-mt-20" id="程式解析"&gt;&lt;/span&gt;
&lt;a href="#%e7%a8%8b%e5%bc%8f%e8%a7%a3%e6%9e%90" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash
while read line
do
a=$(echo $line | cut -d &amp;#34;,&amp;#34; -f 2 | cut -d &amp;#34; &amp;#34; -f 2 | cut -d &amp;#34;.&amp;#34; -f 1)
b=$(echo $line | cut -d &amp;#34;,&amp;#34; -f 2 | cut -d &amp;#34; &amp;#34; -f 2)
sed -i &amp;#34;s/${b}/${a}/g&amp;#34; carGPS.csv
done &amp;lt; carGPS.csv&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt; 宣告這支程式由 bash ( 重裝貝殼執行 )&lt;/li&gt;
&lt;li&gt;程式一開始會先去 done 後面，讀取檔案後再逐行跑迴圈處理&lt;/li&gt;
&lt;li&gt;while 結合read 的語法，先讀檔（每次會只讀一行）後，再跑迴圈。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed -i &amp;lt;file_name&amp;gt;&lt;/code&gt; 編輯檔案
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;s/${b}/${a}/&lt;/code&gt; | 變數 a 取代 變數 b&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g&lt;/code&gt; | g 後面不加數字，代表全部取代&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;執行結果&lt;span class="hx:absolute hx:-mt-20" id="執行結果"&gt;&lt;/span&gt;
&lt;a href="#%e5%9f%b7%e8%a1%8c%e7%b5%90%e6%9e%9c" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ cat carGPS.csv
54964354,2021-04-05 15:52:16,25.1399694,121.8019056,28429,0
54964354,2021-04-05 15:52:19,25.1399694,121.8019056,28429,0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>IOT program</title><link>https://blog.kubeantony.com/archive/misc/iot-program/</link><pubDate>Mon, 11 Jul 2022 09:52:44 +0800</pubDate><guid>https://blog.kubeantony.com/archive/misc/iot-program/</guid><description>
&lt;h2&gt;Publisher&lt;span class="hx:absolute hx:-mt-20" id="publisher"&gt;&lt;/span&gt;
&lt;a href="#publisher" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;os&amp;#34;
&amp;#34;time&amp;#34;
&amp;#34;github.com/be-ys/pzem-004t-v3/pzem&amp;#34;
mqtt &amp;#34;github.com/eclipse/paho.mqtt.golang&amp;#34;
&amp;#34;github.com/shirou/gopsutil/cpu&amp;#34;
&amp;#34;github.com/shirou/gopsutil/disk&amp;#34;
&amp;#34;github.com/shirou/gopsutil/mem&amp;#34;
&amp;#34;github.com/shirou/gopsutil/net&amp;#34;
)
// float32 --&amp;gt; 有小數點的數字
type PowerMeterData struct {
Voltage float32
Current float32
Power float32
Frequency float32
Energy float32
PowerFactor float32
}
// float64 --&amp;gt; 有小數點的數字，範圍比 float32 大
// uint64 --&amp;gt; 無符號整數
type HostInfo struct {
TotalCpu []float64
PercentCpu []float64
MemAvailable uint64
MemUsed uint64
}
func main() {
brokerHost := &amp;#34;&amp;#34;
brokerPassword := &amp;#34;&amp;#34;
brokerUsername := &amp;#34;&amp;#34;
tty := os.Args[1]
hostname := os.Args[2]
// Coonnect Serial
p, err := pzem.Setup(
pzem.Config{
Port: tty,
Speed: 9600,
})
if err != nil {
panic(err)
}
err = p.ResetEnergy()
if err != nil {
panic(err)
}
//Connect MQTT
var broker = brokerHost
var port = 1883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf(&amp;#34;tcp://%s:%d&amp;#34;, broker, port))
opts.SetClientID(hostname)
opts.SetUsername(brokerUsername)
opts.SetPassword(brokerPassword)
//opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler
opts.AutoReconnect = true
opts.ConnectRetryInterval = 60 * time.Second
client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() &amp;amp;&amp;amp; token.Error() != nil {
panic(token.Error())
}
t := time.NewTicker(10 * time.Second)
for {
&amp;lt;-t.C
// Get PowerNeterData
powerMeterData := getPzem004Info(p)
//powerMeterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
voltage := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Voltage)
current := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Current)
power := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Power)
powerFactor := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.PowerFactor)
energy := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Energy)
frequency := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Frequency)
ms := time.Now().UTC().Format(time.RFC3339)
powerMeterDataCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; voltage &amp;#43; &amp;#34;,&amp;#34; &amp;#43; current &amp;#43; &amp;#34;,&amp;#34; &amp;#43; power &amp;#43; &amp;#34;,&amp;#34; &amp;#43; powerFactor &amp;#43; &amp;#34;,&amp;#34; &amp;#43; energy &amp;#43; &amp;#34;,&amp;#34; &amp;#43; frequency
//meterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; string(powerMeterDataCsv))
//client.Publish(&amp;#34;v1/devices/me/telemetry&amp;#34;, 0, false, meterDataJson).Wait()
client.Publish(&amp;#34;iotdata/powermeter/&amp;#34;&amp;#43;hostname, 0, false, powerMeterDataCsv).Wait()
// Get CPU Info &amp;amp; Mem Info
virtualMemoryStat := getMemInfo()
hostInfo := HostInfo{
TotalCpu: getTotalCpuInfo(),
PercentCpu: getPercentCpuInfo(),
MemUsed: virtualMemoryStat.Used,
MemAvailable: virtualMemoryStat.Available,
}
//hostInfoJson, _ := json.Marshal(&amp;amp;hostInfo)
totalCpu := fmt.Sprintf(&amp;#34;%f&amp;#34;, hostInfo.TotalCpu[0])
memUsed := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemUsed)
memAvailable := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemAvailable)
ms = time.Now().UTC().Format(time.RFC3339)
hostInfoCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; totalCpu &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memUsed &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memAvailable
fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; hostInfoCsv)
client.Publish(&amp;#34;iotdata/host/&amp;#34;&amp;#43;hostname, 0, false, hostInfoCsv).Wait()
}
}
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connected&amp;#34;)
}
var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connect lost&amp;#34;)
}
func getPzem004Info(p pzem.Probe) PowerMeterData {
voltage, err := p.Voltage()
if err != nil {
panic(err)
}
intensity, err := p.Intensity()
if err != nil {
panic(err)
}
power, err := p.Power()
if err != nil {
panic(err)
}
frequency, err := p.Frequency()
if err != nil {
panic(err)
}
energy, err := p.Energy()
if err != nil {
panic(err)
}
powerFactor, err := p.PowerFactor()
if err != nil {
panic(err)
}
powerMeterData := PowerMeterData{
Voltage: voltage,
Current: intensity,
Power: power,
Frequency: frequency,
Energy: energy,
PowerFactor: powerFactor,
}
return powerMeterData
}
func getMemInfo() *mem.VirtualMemoryStat {
v, _ := mem.VirtualMemory()
return v
}
func getTotalCpuInfo() []float64 {
totalPercent, _ := cpu.Percent(3*time.Second, false)
return totalPercent
}
func getPercentCpuInfo() []float64 {
perPercents, _ := cpu.Percent(3*time.Second, true)
return perPercents
}
func getNetInfo() []net.IOCountersStat {
info, _ := net.IOCounters(true)
return info
}
func getDiskInfo() *disk.UsageStat {
info, _ := disk.Usage(&amp;#34;C:/&amp;#34;)
return info
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改內容 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;35 brokerHost := &amp;#34;140.128.36.231&amp;#34;
76 更改單位 Millisecond
t := time.NewTicker(500 * time.Millisecond)
將以下內容註解 :
101 ~ 119 行註解
// Get CPU Info &amp;amp; Mem Info
// virtualMemoryStat := getMemInfo()
// hostInfo := HostInfo{
// TotalCpu: getTotalCpuInfo(),
// PercentCpu: getPercentCpuInfo(),
// MemUsed: virtualMemoryStat.Used,
// MemAvailable: virtualMemoryStat.Available,
// }
// //hostInfoJson, _ := json.Marshal(&amp;amp;hostInfo)
// totalCpu := fmt.Sprintf(&amp;#34;%f&amp;#34;, hostInfo.TotalCpu[0])
// memUsed := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemUsed)
// memAvailable := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemAvailable)
// ms = time.Now().UTC().Format(time.RFC3339)
// hostInfoCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; totalCpu &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memUsed &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memAvailable
// fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; hostInfoCsv)
// client.Publish(&amp;#34;iotdata/host/&amp;#34;&amp;#43;hostname, 0, false, hostInfoCsv).Wait()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;log&amp;#34;
&amp;#34;os&amp;#34;
&amp;#34;time&amp;#34;
&amp;#34;github.com/be-ys/pzem-004t-v3/pzem&amp;#34;
mqtt &amp;#34;github.com/eclipse/paho.mqtt.golang&amp;#34;
&amp;#34;github.com/shirou/gopsutil/cpu&amp;#34;
&amp;#34;github.com/shirou/gopsutil/disk&amp;#34;
&amp;#34;github.com/shirou/gopsutil/mem&amp;#34;
&amp;#34;github.com/shirou/gopsutil/net&amp;#34;
)
type PowerMeterData struct {
Voltage float32
Current float32
Power float32
Frequency float32
Energy float32
PowerFactor float32
}
type HostInfo struct {
TotalCpu []float64
PercentCpu []float64
MemAvailable uint64
MemUsed uint64
}
func main() {
brokerHost := &amp;#34;140.128.36.231&amp;#34;
brokerPassword := &amp;#34;bigred&amp;#34;
brokerUsername := &amp;#34;bigred&amp;#34;
log.Println(&amp;#34;brave&amp;#34;)
tty := os.Args[1]
hostname := os.Args[2]
// Coonnect Serial
p, err := pzem.Setup(
pzem.Config{
Port: tty,
Speed: 9600,
})
if err != nil {
panic(err)
}
err = p.ResetEnergy()
if err != nil {
panic(err)
}
//Connect MQTT
var broker = brokerHost
var port = 1883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf(&amp;#34;tcp://%s:%d&amp;#34;, broker, port))
opts.SetClientID(hostname)
opts.SetUsername(brokerUsername)
opts.SetPassword(brokerPassword)
//opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler
opts.AutoReconnect = true
opts.ConnectRetryInterval = 60 * time.Second
client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() &amp;amp;&amp;amp; token.Error() != nil {
panic(token.Error())
}
t := time.NewTicker(500 * time.Millisecond)
for {
&amp;lt;-t.C
// Get PowerNeterData
powerMeterData := getPzem004Info(p)
//powerMeterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
voltage := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Voltage)
current := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Current)
power := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Power)
powerFactor := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.PowerFactor)
energy := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Energy)
frequency := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Frequency)
ms := time.Now().UTC().Format(time.RFC3339)
powerMeterDataCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; voltage &amp;#43; &amp;#34;,&amp;#34; &amp;#43; current &amp;#43; &amp;#34;,&amp;#34; &amp;#43; power &amp;#43; &amp;#34;,&amp;#34; &amp;#43; powerFactor &amp;#43; &amp;#34;,&amp;#34; &amp;#43; energy &amp;#43; &amp;#34;,&amp;#34; &amp;#43; frequency
//meterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; string(powerMeterDataCsv))
//client.Publish(&amp;#34;v1/devices/me/telemetry&amp;#34;, 0, false, meterDataJson).Wait()
client.Publish(&amp;#34;iotdata/powermeter/&amp;#34;&amp;#43;hostname, 0, false, powerMeterDataCsv).Wait()
// Get CPU Info &amp;amp; Mem Info
// virtualMemoryStat := getMemInfo()
// hostInfo := HostInfo{
// TotalCpu: getTotalCpuInfo(),
// PercentCpu: getPercentCpuInfo(),
// MemUsed: virtualMemoryStat.Used,
// MemAvailable: virtualMemoryStat.Available,
// }
// //hostInfoJson, _ := json.Marshal(&amp;amp;hostInfo)
// totalCpu := fmt.Sprintf(&amp;#34;%f&amp;#34;, hostInfo.TotalCpu[0])
// memUsed := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemUsed)
// memAvailable := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemAvailable)
// ms = time.Now().UTC().Format(time.RFC3339)
// hostInfoCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; totalCpu &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memUsed &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memAvailable
// fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; hostInfoCsv)
// client.Publish(&amp;#34;iotdata/host/&amp;#34;&amp;#43;hostname, 0, false, hostInfoCsv).Wait()
}
}
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connected&amp;#34;)
}
var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connect lost&amp;#34;)
}
func getPzem004Info(p pzem.Probe) PowerMeterData {
voltage, err := p.Voltage()
if err != nil {
panic(err)
}
intensity, err := p.Intensity()
if err != nil {
panic(err)
}
power, err := p.Power()
if err != nil {
panic(err)
}
frequency, err := p.Frequency()
if err != nil {
panic(err)
}
energy, err := p.Energy()
if err != nil {
panic(err)
}
powerFactor, err := p.PowerFactor()
if err != nil {
panic(err)
}
powerMeterData := PowerMeterData{
Voltage: voltage,
Current: intensity,
Power: power,
Frequency: frequency,
Energy: energy,
PowerFactor: powerFactor,
}
return powerMeterData
}
func getMemInfo() *mem.VirtualMemoryStat {
v, _ := mem.VirtualMemory()
return v
}
func getTotalCpuInfo() []float64 {
totalPercent, _ := cpu.Percent(3*time.Second, false)
return totalPercent
}
func getPercentCpuInfo() []float64 {
perPercents, _ := cpu.Percent(3*time.Second, true)
return perPercents
}
func getNetInfo() []net.IOCountersStat {
info, _ := net.IOCounters(true)
return info
}
func getDiskInfo() *disk.UsageStat {
info, _ := disk.Usage(&amp;#34;C:/&amp;#34;)
return info
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改內容 :&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;35 brokerHost := &amp;#34;140.128.36.231&amp;#34;
42 hostname := os.Args[1]
41 ~ 56 行註解 ( 42 行不要 )
// // Coonnect Serial
// p, err := pzem.Setup(
// pzem.Config{
// Port: tty,
// Speed: 9600,
// })
// if err != nil {
// panic(err)
// }
// err = p.ResetEnergy()
// if err != nil {
// panic(err)
// }
81 ~ 101 行註解 ( 91 行不要)
// Get PowerNeterData
// powerMeterData := getPzem004Info(p)
//powerMeterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
// voltage := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Voltage)
// current := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Current)
// power := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Power)
// powerFactor := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.PowerFactor)
// energy := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Energy)
// frequency := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Frequency)
ms := time.Now().UTC().Format(time.RFC3339)
// powerMeterDataCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; voltage &amp;#43; &amp;#34;,&amp;#34; &amp;#43; current &amp;#43; &amp;#34;,&amp;#34; &amp;#43; power &amp;#43; &amp;#34;,&amp;#34; &amp;#43; powerFactor &amp;#43; &amp;#34;,&amp;#34; &amp;#43; energy &amp;#43; &amp;#34;,&amp;#34; &amp;#43; frequency
// //meterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
// fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; string(powerMeterDataCsv))
// //client.Publish(&amp;#34;v1/devices/me/telemetry&amp;#34;, 0, false, meterDataJson).Wait()
// client.Publish(&amp;#34;iotdata/powermeter/&amp;#34;&amp;#43;hostname, 0, false, powerMeterDataCsv).Wait()
// Get CPU Info &amp;amp; Mem Info&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;package main
import (
&amp;#34;fmt&amp;#34;
&amp;#34;log&amp;#34;
&amp;#34;os&amp;#34;
&amp;#34;time&amp;#34;
&amp;#34;github.com/be-ys/pzem-004t-v3/pzem&amp;#34;
mqtt &amp;#34;github.com/eclipse/paho.mqtt.golang&amp;#34;
&amp;#34;github.com/shirou/gopsutil/cpu&amp;#34;
&amp;#34;github.com/shirou/gopsutil/disk&amp;#34;
&amp;#34;github.com/shirou/gopsutil/mem&amp;#34;
&amp;#34;github.com/shirou/gopsutil/net&amp;#34;
)
type PowerMeterData struct {
Voltage float32
Current float32
Power float32
Frequency float32
Energy float32
PowerFactor float32
}
type HostInfo struct {
TotalCpu []float64
PercentCpu []float64
MemAvailable uint64
MemUsed uint64
}
func main() {
brokerHost := &amp;#34;140.128.36.231&amp;#34;
brokerPassword := &amp;#34;bigred&amp;#34;
brokerUsername := &amp;#34;bigred&amp;#34;
log.Println(&amp;#34;brave&amp;#34;)
// tty := os.Args[1]
hostname := os.Args[1]
// // Coonnect Serial
// p, err := pzem.Setup(
// pzem.Config{
// Port: tty,
// Speed: 9600,
// })
// if err != nil {
// panic(err)
// }
// err = p.ResetEnergy()
// if err != nil {
// panic(err)
// }
//Connect MQTT
var broker = brokerHost
var port = 1883
opts := mqtt.NewClientOptions()
opts.AddBroker(fmt.Sprintf(&amp;#34;tcp://%s:%d&amp;#34;, broker, port))
opts.SetClientID(hostname)
opts.SetUsername(brokerUsername)
opts.SetPassword(brokerPassword)
//opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler
opts.AutoReconnect = true
opts.ConnectRetryInterval = 60 * time.Second
client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() &amp;amp;&amp;amp; token.Error() != nil {
panic(token.Error())
}
t := time.NewTicker(500 * time.Millisecond)
for {
&amp;lt;-t.C
// Get PowerNeterData
// powerMeterData := getPzem004Info(p)
//powerMeterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
// voltage := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Voltage)
// current := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Current)
// power := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Power)
// powerFactor := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.PowerFactor)
// energy := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Energy)
// frequency := fmt.Sprintf(&amp;#34;%f&amp;#34;, powerMeterData.Frequency)
ms := time.Now().UTC().Format(time.RFC3339)
// powerMeterDataCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; voltage &amp;#43; &amp;#34;,&amp;#34; &amp;#43; current &amp;#43; &amp;#34;,&amp;#34; &amp;#43; power &amp;#43; &amp;#34;,&amp;#34; &amp;#43; powerFactor &amp;#43; &amp;#34;,&amp;#34; &amp;#43; energy &amp;#43; &amp;#34;,&amp;#34; &amp;#43; frequency
// //meterDataJson, _ := json.Marshal(&amp;amp;powerMeterData)
// fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; string(powerMeterDataCsv))
// //client.Publish(&amp;#34;v1/devices/me/telemetry&amp;#34;, 0, false, meterDataJson).Wait()
// client.Publish(&amp;#34;iotdata/powermeter/&amp;#34;&amp;#43;hostname, 0, false, powerMeterDataCsv).Wait()
// Get CPU Info &amp;amp; Mem Info
virtualMemoryStat := getMemInfo()
hostInfo := HostInfo{
TotalCpu: getTotalCpuInfo(),
PercentCpu: getPercentCpuInfo(),
MemUsed: virtualMemoryStat.Used,
MemAvailable: virtualMemoryStat.Available,
}
//hostInfoJson, _ := json.Marshal(&amp;amp;hostInfo)
totalCpu := fmt.Sprintf(&amp;#34;%f&amp;#34;, hostInfo.TotalCpu[0])
memUsed := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemUsed)
memAvailable := fmt.Sprintf(&amp;#34;%d&amp;#34;, hostInfo.MemAvailable)
ms = time.Now().UTC().Format(time.RFC3339)
hostInfoCsv := ms &amp;#43; &amp;#34;,&amp;#34; &amp;#43; totalCpu &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memUsed &amp;#43; &amp;#34;,&amp;#34; &amp;#43; memAvailable
fmt.Println(time.Now().UTC().Format(time.RFC3339) &amp;#43; &amp;#34; &amp;#34; &amp;#43; hostInfoCsv)
client.Publish(&amp;#34;iotdata/host/&amp;#34;&amp;#43;hostname, 0, false, hostInfoCsv).Wait()
}
}
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connected&amp;#34;)
}
var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
t := time.Now().UTC()
fmt.Println(t.Format(time.RFC3339) &amp;#43; &amp;#34; Connect lost&amp;#34;)
}
func getPzem004Info(p pzem.Probe) PowerMeterData {
voltage, err := p.Voltage()
if err != nil {
panic(err)
}
intensity, err := p.Intensity()
if err != nil {
panic(err)
}
power, err := p.Power()
if err != nil {
panic(err)
}
frequency, err := p.Frequency()
if err != nil {
panic(err)
}
energy, err := p.Energy()
if err != nil {
panic(err)
}
powerFactor, err := p.PowerFactor()
if err != nil {
panic(err)
}
powerMeterData := PowerMeterData{
Voltage: voltage,
Current: intensity,
Power: power,
Frequency: frequency,
Energy: energy,
PowerFactor: powerFactor,
}
return powerMeterData
}
func getMemInfo() *mem.VirtualMemoryStat {
v, _ := mem.VirtualMemory()
return v
}
func getTotalCpuInfo() []float64 {
totalPercent, _ := cpu.Percent(3*time.Second, false)
return totalPercent
}
func getPercentCpuInfo() []float64 {
perPercents, _ := cpu.Percent(3*time.Second, true)
return perPercents
}
func getNetInfo() []net.IOCountersStat {
info, _ := net.IOCounters(true)
return info
}
func getDiskInfo() *disk.UsageStat {
info, _ := disk.Usage(&amp;#34;C:/&amp;#34;)
return info
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ Start-Process C:\Users\bigred\cmbravehost.exe &amp;lt;hostname&amp;gt; -WindowStyle Hidden&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;找 pid&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;tasklist&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;停止程式&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$ taskkill /PID&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="複製程式碼"
aria-label="複製程式碼"
data-copied-label="已複製！"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h6&gt;tags: &lt;code&gt;IOT&lt;/code&gt;&lt;span class="hx:absolute hx:-mt-20" id="tags-iot"&gt;&lt;/span&gt;
&lt;a href="#tags-iot" class="subheading-anchor" aria-label="此章節的永久連結"&gt;&lt;/a&gt;&lt;/h6&gt;</description></item></channel></rss>