index

Arch Linux 手動安裝

· 13min

dd

danger


請事先檢查好 disk 是否選擇正確,否則會出大事

sudo dd if=_path/to_/archlinux-_version_-x86_64.iso of=/dev/rdisk_X_ bs=1m
  • if (Input File) 輸入來源
    • 告訴 dd 要從哪裡複製資料,這邊就是指剛下載的 iso 檔案
  • of (Output File) 輸出目的地
    • 告訴 dd 要把複製出來的資料寫到哪裡去,也就是要拿來開機的 USB 裝置
  • bs (Block Size) 區塊大小
    • 決定 dd 每次「讀取」和「寫入」資料的快取大小。你可以想像成搬家時,你要用「小茶杯」一次次舀水,還是用「大水桶」一次搬運。
    • 如果不設定 bsdd 預設會用極小的 512 Bytes 為單位慢慢搬

Power On Self Test(POST)

通常翻譯為開機自檢(logo 畫面), 當硬體自我檢查(POST)過關後,UEFI/BIOS 就會開始尋找「誰要把作業系統叫醒?」。這時候如果沒有介入,預設會去讀取你筆電原本的硬碟,進入舊的系統(如 Windows)。

Virtual Console(tty)

Teletypewriter,Linux 內核在底層用軟體模擬出的數個獨立的「虛擬螢幕與鍵盤組合」。

像是按下 Alt + F2,會發現畫面一閃,切換到了 tty2 需要重新登入;再按下 Alt + F1,又會切回原本的 tty1

那一般 console 則是代表系統開機時內核(Kernel)直接把錯誤訊息 / 開機進度顯示出來的那個螢幕畫面。

Console Fonts

Terminus Font 是 virtual console 下常用的等寬字型之一:

setfont ter-132b

如果覺得 32 太大, 可以試縮小一點的尺寸或從 bold 換成 normal:

setfont ter-116n

字型的路徑在 /usr/share/kbd/consolefonts/,會自動解壓,不需要輸入副檔名。

確認開機模式(Boot Mode)

cat /sys/firmware/efi/fw_platform_size

如果系統以 UEFI 模式開機,Kernel 就會在系統底層建立一個專門存放 UEFI 資訊的虛擬資料夾,路徑是 /sys/firmware/efi/如果這個資料夾存在,代表是 UEFI 開機;如果不存在,代表你傳統 BIOS 開機

UEFI / BIOS / CSM

UEFI(Unified Extensible Firmware Interface,統一可延伸韌體介面)一種 BIOS(Basic Input/Output System,基本輸入輸出系統) 的替代方案。

  • BIOS 作為早期 IBM 時代下的產物,至今看來有不少限制,像是
    • 基於 16 位元處理器架構設計
    • 只能讀取 MBR(Master Boot Record),導致無法引導容量大於 2TB 的硬碟,且一個硬碟最多只能切 4 個主分割區 1
    • 開機時只能呼叫極少的硬體資源,速度也慢
  • 現代 UEFI 為了汰換老舊 BIOS 而生
    • 支援 32 或 64 位元
    • 搭配 GPT (GUID Partition Table)2 ,可以支援高達 9.4 ZB(約 100 億 TB)的硬碟,且分割區數量幾乎沒有限制

其所謂 Extensible,UEFI 的驅動程式是獨立於硬體的(使用 EFI Byte Code)。這表示硬體廠商(如 NVidia)不需要為不同的主機板寫死 BIOS 程式碼,只要寫一份 UEFI 驅動,就能在任何 UEFI 主機板上運作。

CSM(Compatibility Support Module,相容性支援模組)是 UEFI 韌體內部的一個「模擬器」。當開啟時,現代的 UEFI 主機板就會假裝自己是傳統的舊 BIOS,用來相容尚不支援 UEFI 的硬體(如顯示卡),不過 Intel 和 AMD 在 2020 年後的新晶片組上,已經全面停用並移除了 CSM3,現在的現代電腦已經是純 UEFI(Pure UEFI)的天下。

MBR / GPT

硬碟與韌體(Firmware)的關係之所以這麼深,是因為韌體是看不懂檔案的。電腦開機時,韌體只認識硬碟的磁區編號, 也就是說,韌體必須先讀懂硬碟最前端的「分割表」, 知道哪裡是 C 槽、哪裡是 Linux 根目錄,才能進去把系統叫醒。

MBR 與 GPT 都是硬碟用於啟動系統的分割表格式,未初始化的全新硬碟在裝系統之前,必須對系統的分割表格式進行選擇:

  • MBR(Master Boot Record,主開機記錄)
    • IBM 公司在 1983 年提出的分割表格式
    • 只佔用硬碟最開頭的第 0 個磁區,共 512 bytes
      • 446 bytes 要放啟動碼
      • 64 bytes 必須塞下整顆硬碟的分割資訊(partition table)
        • 每個分割區資訊要用 16 bytes 記錄,所以 ‭64÷16=464 \div 16 = 4‬‭‬‭‬,這就是為什麼 MBR 最多只能有 4 個主分割區(Primary Partition) 的物理限制
          • MBR 在記錄磁區數量時,使用的是 32 bits 的長度2。‭ 232×512 Bytes2^{32} \times 512 \text{ Bytes},約 2.1 TB,超過這個容量的硬碟空間,MBR 數不出來,只能浪費掉

以 Windows 來說,會從磁區內使用一段代碼來啟動系統,因此如果 MBR 的啟動資訊損壞,Windows 就無法正常啟動 ,算是一種單點故障(Single Point of Failure)

BIOS → MBR → Windows

主機板 BIOS 啟動 ──> 讀取硬碟第 0 磁區的 MBR ──> 執行裡面的硬體啟動碼 ──> 尋找作用中分割區 ──> 載入 Windows/Linux

  • GPT(GUID Partition Table,全域唯一標識磁碟分割表格磁碟分割表)
    • 每一個你在 GPT 硬碟上切出來的分割區,系統都會隨機配發一個「全球唯一識別碼」(Globally Unique Identifier, GUID),確保即使你把這顆硬碟拔到全世界任何一台電腦上,系統都不會把分割區搞混
      • 其中 Partition Type GUID(分割區類型識別碼)是全世界統一的。只要是「EFI 系統分割區(ESP)」,它的類型 ID 固定就是 C12A7328-F81F-11D2-BA4B-00A0C93EC93B
    • 允許無限數量的分割區

當主機板的 UEFI 韌體開機時,它會去掃 GPT 分割表,只要看到哪一個分割區的類型代碼是 C12A7328...(也就是 ESP) 就知道系統碟在哪。

主機板 UEFI 啟動 ──> 讀取 GPT 分割表 ──> 直接認出「EFI 系統分割區 (ESP)」──> 進去像開資料夾一樣讀取 /EFI/BOOT/bootx64.efi ──> 啟動系統

磁區(Sector)

可以把整顆硬碟想像成一本「超大型的方格筆記本」,磁區就是硬碟上最小的格子,是硬碟讀寫資料的最小物理單位,不管是什麼大小的的操作,都是以一個格子單位讀取或寫入。

至少在 2010 年以前,全世界的硬碟這個「格子」的物理大小一律都是 512 bytes

MBR 的世界裡,因為空間珍貴,它只留了 32 bits(4 bytes) 來記錄這顆硬碟總共有幾個格子(磁區),也就是說大約可以表示有這麼多……

232=4,294,967,296 (大約 43 億個磁區)2^{32} = 4,294,967,296 \text{ (大約 43 億個磁區)}

所以這顆硬碟能擁有的極限容量就是大約 2TB:

4,294,967,296 個磁區×512 Bytes=2,199,023,255,552 Bytes4,294,967,296 \text{ 個磁區} \times 512 \text{ Bytes} = 2,199,023,255,552 \text{ Bytes}

連接網路

查看和管理網路介面

ip link

intel wireless control(iwctl

iwctl

[iwd]# device list
[iwd]# station _name_ scan
[iwd]# station _name_ get-networks
[iwd]# station _name_ connect _SSID_
[iwd]# station _name_ connect-hidden _SSID_

測試一下

ping archlinux.org

更新系統時間

timedatectl

硬碟分割區

查看所有儲存裝置

fdisk -l

TUI 看起來還是比較友善……

cfdisk /dev/nvme0n1

這邊是

DevicePartition typeSuggested size
nvme0n1p1EFI system partition512M
nvme0n1p2Linux filesystem476G

格式化

mkfs.fat -F 32 /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2

檢查一下:

lsblk -f

掛載(Mount)

USB 開機其實是把隨身碟裡的 Arch 系統映像檔完全載入到 RAM 裡運作,USB 處於唯讀狀態,目前的環境本質上只是一個執行在記憶體裡的虛擬臨時沙盒。

因此掛載不會把資料寫回隨身碟,而是透過掛載到 /mnt ,把資料寫進硬碟。

mount /dev/nvme0n1p2 /mnt

安裝基礎套件

說是基礎,基本上沒有安裝會精簡到很多在隨身碟裡的工具都沒有(像是剛才用的 iwctl、文字編輯器……)

這時安裝需要用到 pacstrap( pacman + bootstrap),一個 pacman 的安裝引導工具,主要是為了把下載的作業系統檔案,解壓安裝到指定的外部硬碟(/mnt)。其中 base 是強制必裝的的項目,它是 arch 的核心骨架。

pacstrap -K /mnt base linux linux-firmware base-devel networkmanager iwd vim nano sof-firmware amd-ucode man-db man-pages texinfo
  • amd-ucode CPU 微指令集(Microcode)更新(修正補丁)
  • sof-firmware 主要是內建音效卡的驅動

Fstab

filesystem table,類似像是為了讓以後每一次開機時,指示自動把 UUID 是 X 的分割區掛載到根目錄,把 UUID 是 Y 的分割區掛載到 /boot,而不需要每次手動 mount

有提供 genfstab 工具方便自動化。

genfstab -U /mnt >> /mnt/etc/fstab

檢查一下:

cat /mnt/etc/fstab

改換根目錄(chroot

根目錄改到 /mnt 裡,這樣就可以進入安裝硬碟了

arch-chroot /mnt

時區(Time Zone)

將時區用連結的方式放進去,先去位於 /usr/share/zoneinfo/ 的時區「倉庫」找一下你在哪裡,/etc/localtime 則是 Linux 系統硬性規定要讀取本地時間的檔案路徑,當系統或軟體要知道時間資訊時,會跑來讀取這個檔案。

ln -sf /usr/share/zoneinfo/_Area_/_Location_ /etc/localtime

把系統時間寫入硬體:

hwclock --systohc

在地化(Localization)

編輯 /etc/locale.gen 這個檔案,把需要用到的取消註解:

en_US.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8

接著

locale-gen

同樣在 /etc 下建立 locale.conf,寫入:

LANG=en_US.UTF-8

建立 Hostname / Root 密碼

建立 /etc/hostname 並寫入:

yourhostname
passwd

Boot Loader

這邊選用 grub(GRand Unified Bootloader)

pacman -S grub efibootmgr

別忘記建立 cfg:

grub-mkconfig -o /boot/grub/grub.cfg

System Initialization - UEFI

  1. POST 後,UEFI 會初始化開機所需的硬體(硬碟、鍵盤等)。
  2. firmware 會讀取 NVRAM 中的開機項目,以判斷要啟動哪個 EFI 應用程式以及從哪裡啟動(例如從哪個磁碟和分割區),firmware 會尋找該磁碟上的 EFI 系統分割區,嘗試路徑如 \EFI\BOOT\BOOTx64.EFI1
  3. firmware 啟動 EFI
    • 這可以是 boot-loader(ex. grub),也可能是其他 EFI,或是其他 boot-manager(ex. systemd-boot

離開 arch-chroot

可以 exit 來離開 arch-chroot,可以選擇 umount -R /mnt/mnt 解除掛載,最後 reboot


References


Footnotes

  1. MBR / GPT 2

  2. 磁區(Sector) 2

  3. Intel 宣佈2020年將完全封閉UEFI相容傳統BIOS模式,Windows 7 等舊版32位元系統將無硬體可安裝 | T客邦