antony@notes:~/misc$ cat "Linux-開機程序.md"
Linux 開機程序
Linux 開機程序
重要流程圖

流程解釋
- 按開機鍵將電腦啟動後,第一個啟動的是 BIOS 或 UEFI (兩者最大的差別是 UEFI 滑鼠可以動),然後會執行開機自我開機檢測 (Power-on Self Test,POST),BIOS 會來檢測硬體周邊的裝置,包含 CPU, 記憶體, 顯卡, 網卡和硬碟 …等,假如記憶體插錯,開機就有可能會聽到連續逼的聲音,如果裝置都正常就可以聽到逼一聲,代表開機正常
- 接下來會去讀取可開機裝置的 MBR,可開機裝置指的是光碟,硬碟和隨身碟…等那些,只要他能開機,在 BIOS 有設定,他就會嘗試去找可開機裝置的第一個磁區(也就是 MBR),在其中有一支儲存開機管理程式,叫作 Boot Loader
- Boot Loader 會提供開機選單,載入作業系統後,最重要的是把 Linux 核心 以及 initrd/initramfs 載入到記憶體裡面,並把 initrd/initramfs 的記憶體位址告訴 kernel,kernel 才能找到,之後把控制權給 Linux kernel
- Linux Kernel 拿到控制權後,會與 BIOS 一樣,做一件事情,就是檢測電腦週邊的硬體是不是都正常,因為 Kernel 要跟電腦做溝通,所以會再檢測一次,之後假設目前是用 SATA 硬碟開機,它會利用 initrd image 或是 initramfs,來讀取得真正的檔案系統的驅動程式,這樣子才能與硬體做溝通
- Kernal 確定驅動程式和檔案系統掛載都 ok 後,他就會啟動第一支程序,通常叫做 init 的 process,在大部分的 Linux 中用的是 “systemd”,而 Alpine 用的是 OpenRC
1. BIOS (Basic Input/Output System)
BIOS 簡單介紹
- BIOS 是韌體,主要儲存在主機板上的 BIOS ROM 晶片
- ROM 晶片的特色是 電腦關機後晶片存儲的內容也不會消失,它對應的是 RAM 晶片(記憶體),電腦關機後資料會被清除
- :::spoiler BIOS ROM 晶片示意圖
:::
- BIOS 的設定儲存在 CMOS 晶片
- 設定項目包含 : 日期時間、開機順序 …等
- CMOS 晶片在現在的主機板大部分的時候,會與其他晶片整合在一起
- CMOS 晶片使用的電池稱為 CMOS 電池
- 當 CMOS 晶片被拔下來,導致 CMOS 晶片沒電,BIOS 的基本設定就會被清除
- :::spoiler CMOS 電池 晶片示意圖
::: - 筆電的 CMOS 電池通常會再接一條線,因為筆電沒有插槽
EFI & UEFI 簡單介紹
BIOS 通常在比較舊的電腦才會出現,新的電腦通常是 UEFI 的介面
- UEFI : 統一可延伸韌體介面(Unified Extensible Firmware Interface)
:::spoiler UEFI 介面示意圖
::: - 最大特色 : 它的滑鼠可以動,顏色豐富,有的介面還有可能是紅色或綠色,可以設定的選項也比較多
- EFI 由 CPU 的大廠 Intel 先提出來的介面,為了不讓 Intel 獨佔這門技術,所以各大廠成立一個聯盟,做出了統一的規範,為了與 EFI 區別,就在名稱前面多了 Unified 。
快速檢查 Linux 用 BIOS or UEFI
程式概述 : 通常有使用 UEFI 的 Linux 作業系統,在 /sys/firmware/efi 這個目錄下都會有檔案,所以用這個目錄的存在來判斷是否是 UEFI
編輯一支程式
$ nano biosmode.sh內容 :
#!/bin/bash
[ -d /sys/firmware/efi ] && echo 'UEFI' || echo 'BIOS'賦予執行權限
$ chmod +x biosmode.sh執行程式
$ ./biosmode.sh 螢幕輸出 :
BIOS快速檢查 Windows 10 用 BIOS or UEFI
- 打開 CMD 或 Windows + R 快捷打開執行
- 輸入
msinfo32 - 找到 BIOS 模式
:::spoiler 示意圖
:::
2. MBR
MBR 介紹
主開機紀錄(Master Boot Record)
- 位於可開機裝置的第一個磁區
- 大小 512 Bytes ,其中 :
- 446 Bytes 儲存開機管理程式(Boot Loader)
- 4 個 16 Bytes 儲存磁區分割表 ( C 或 D 槽要切幾個,就是儲存在這)
- 2 Bytes 儲存檢查標誌
- 446 + (4*16) + 2 = 512
磁碟分割表介紹
MBR
- 最大的 Partition 大小,只能 2 TB
- Partition 最多只能切 4 個,需要進階的做法才能切更多
- 只支援 BIOS
- 作業系統支援 : Windows 7 或是更舊的,像是 Windows 95/98,Windows XP 32-bit, Windows 2000, Windows 2003 32-bit
GPT ( GUID Partition Table )
- 最大的 Partition 大小,只能 9.4 ZB
- Partition 最多可以切 128 個磁區
- 支援 UEFI 或是 MBR
- 作業系統支援 : Windows 11, Windows 10 64-bit, Windows 8/8.1 64-bit
:::spoiler 表格
:::
檢查 SUSE Linux MBR or GPT
$ sudo gdisk /dev/sda -l螢幕輸出
GPT fdisk (gdisk) version 1.0.8 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. 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
3. Boot Loader
- 提供開機選單
- 可以讓使用者決定開哪個作業系統
:::spoiler SUSE 開機選單 畫面
:::
:::spoiler Ubuntu 開機選單 畫面
:::
- 可以讓使用者決定開哪個作業系統
:::spoiler SUSE 開機選單 畫面
- Chain loading(控制權轉交給其他 loader)
- 將 Linux 核心及 initramfs 載入到記憶體中
- 將 initramfs 位址傳給 Kernel
- 將控制權交給 Kernel
- SUSE Linux 和 Ubuntu Linux 用的 Boot Loader 是 GRUB 2 (目前最受歡迎)
- Alpine Linux 用的 Boot Loader 是 syslinux
- tinycore 用的 Boot Loader 是 isolinux
GRUB 2 啟動流程
BIOS 在 MBR 中啟動名稱為 boot.img 的 loader
- 階段 1
- boot.img 負責載入階段 1.5 的 loader,名稱為 core.img
- 階段 1.5
- core.img 包含檔案系統的驅動程式
- 負責載入位於 /boot 目錄中的階段 2 檔案
- 階段 2
- 將 Kernel 解壓縮到主記憶體中
- 將 initrd/initramfs 載入記憶體,並將其位址傳給 Kernel
- 將控制權交給 Kernel
4. Kernel
initrd & initramfs
- initrd (init ramdisk),臨時用的檔案系統,與一般開機之後根目錄結構一模一樣的檔案系統,會由 Boot Loader 載入記憶體中,再給 Kernal 使用
- initrd 和 initramfs 是兩種不同的方法,但都是為了掛載真正的根目錄之前做準備
5. Init
確認 init 的 process,以 SUSE Linux 為例
方法一 :
執行以下命令
$ ls -al /sbin/init螢幕輸出
lrwxrwxrwx 1 root root 26 May 12 2022 /sbin/init -> ../usr/lib/systemd/systemd
由以上可以看到 /sbin/init 這支程式指向 systemd
方法二 :
執行以下命令
$ ps --pid 1螢幕輸出
PID TTY TIME CMD
1 ? 00:00:00 systemd檢視 /boot [ SUSE Linux ]
執行以下命令
$ ls -al /boot/螢幕輸出
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 drwxr-xr-x 1 root root 140 Feb 27 08:08 grub2 lrwxrwxrwx 1 root root 32 Feb 27 08:06 initrd -> initrd-5.14.21-150400.22-default -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 lrwxrwxrwx 1 root root 33 Feb 27 08:06 vmlinuz -> vmlinuz-5.14.21-150400.22-default -rw-r--r-- 1 root root 11058176 May 12 2022 vmlinuz-5.14.21-150400.22-default
- Boot Loader 、 initrd 和 vmlinuz 都放在
/boot這個目錄- vmlinuz 指的是 Linux 的 Kernal
Kubernetes 升級
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
You are also expected to upgrade kubelet and kubectl on the master node.
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.
對 Linux 套件 kubeadm 進行升級
# ssh 連進 control plane node
$ ssh <control plane node>
# 提權
$ sudo -i
# 更新套件清單
$ apt update
# 看當前主機可以升級 kubeadm 的那些版本
$ apt-cache madison kubeadm
# 將 kubeadm 升級至 1.22.1 版
## hold ,讓系統 update 或 upgrade 的時候,忽略 hold 的套件
## unhold ,取消忽略
$ apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=1.24.2-00 && \
apt-mark hold kubeadm
# 檢查下載下來的 kubeadm 版本
$ kubeadm versionkubeadm upgrade
# Drain control-plane node
$ kubectl drain <control-plane-node> --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成功後,會看到的螢幕輸出
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.24.2". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.Upgrade kubelet and kubectl
$ apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.24.1-00 kubectl=1.24.1-00 && \
apt-mark hold kubelet kubectlRestart the kubelet
# Reload systemd manager configuration
$ systemctl daemon-reload
# 將 kubelet 重啟
$ systemctl restart kubelet
# 檢查 kubelet 狀態
$ systemctl status kubeletUncordon the node
# Bring the node back online by marking it schedulable
$ kubectl uncordon <control-plane-node>檢查 node 狀態
$ kubectl get nodesWhat is Canary Deployment
概述
將修改後的 Application 推廣到一小部分使用者,驗證沒有問題後,再推廣到全部使用者,以降低生產環境引入新功能帶來的風險。
通常是 90% 的使用者維持使用老版本,10% 的使用者嚐鮮新版本。