Skip to content

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

Linux 開機程序

2023-03-19· misc

Linux 開機程序

重要流程圖

流程解釋

  1. 按開機鍵將電腦啟動後,第一個啟動的是 BIOS 或 UEFI (兩者最大的差別是 UEFI 滑鼠可以動),然後會執行開機自我開機檢測 (Power-on Self Test,POST),BIOS 會來檢測硬體周邊的裝置,包含 CPU, 記憶體, 顯卡, 網卡和硬碟 …等,假如記憶體插錯,開機就有可能會聽到連續逼的聲音,如果裝置都正常就可以聽到逼一聲,代表開機正常
  2. 接下來會去讀取可開機裝置的 MBR,可開機裝置指的是光碟,硬碟和隨身碟…等那些,只要他能開機,在 BIOS 有設定,他就會嘗試去找可開機裝置的第一個磁區(也就是 MBR),在其中有一支儲存開機管理程式,叫作 Boot Loader
  3. Boot Loader 會提供開機選單,載入作業系統後,最重要的是把 Linux 核心 以及 initrd/initramfs 載入到記憶體裡面,並把 initrd/initramfs 的記憶體位址告訴 kernel,kernel 才能找到,之後把控制權給 Linux kernel
  4. Linux Kernel 拿到控制權後,會與 BIOS 一樣,做一件事情,就是檢測電腦週邊的硬體是不是都正常,因為 Kernel 要跟電腦做溝通,所以會再檢測一次,之後假設目前是用 SATA 硬碟開機,它會利用 initrd image 或是 initramfs,來讀取得真正的檔案系統的驅動程式,這樣子才能與硬體做溝通
  5. 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

  1. 打開 CMD 或 Windows + R 快捷打開執行
  2. 輸入 msinfo32
  3. 找到 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 開機選單 畫面 :::
  • Chain loading(控制權轉交給其他 loader)
    1. 將 Linux 核心及 initramfs 載入到記憶體中
    2. 將 initramfs 位址傳給 Kernel
    3. 將控制權交給 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 version

kubeadm 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 kubectl

Restart the kubelet

# Reload systemd manager configuration
$ systemctl daemon-reload

# 將 kubelet 重啟
$ systemctl restart kubelet

# 檢查 kubelet 狀態
$ systemctl status kubelet

Uncordon the node

# Bring the node back online by marking it schedulable
$ kubectl uncordon <control-plane-node>

檢查 node 狀態

$ kubectl get nodes

What is Canary Deployment

概述

將修改後的 Application 推廣到一小部分使用者,驗證沒有問題後,再推廣到全部使用者,以降低生產環境引入新功能帶來的風險。

通常是 90% 的使用者維持使用老版本,10% 的使用者嚐鮮新版本。