Arch Linux 手動安裝
dd
請事先檢查好 disk 是否選擇正確,否則會出大事
sudo dd if=_path/to_/archlinux-_version_-x86_64.iso of=/dev/rdisk_X_ bs=1mif(Input File) 輸入來源- 告訴 dd 要從哪裡複製資料,這邊就是指剛下載的 iso 檔案
of(Output File) 輸出目的地- 告訴 dd 要把複製出來的資料寫到哪裡去,也就是要拿來開機的 USB 裝置
bs(Block Size) 區塊大小- 決定 dd 每次「讀取」和「寫入」資料的快取大小。你可以想像成搬家時,你要用「小茶杯」一次次舀水,還是用「大水桶」一次搬運。
- 如果不設定
bs,dd預設會用極小的 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 個磁區,共
512bytes446bytes 要放啟動碼64bytes 必須塞下整顆硬碟的分割資訊(partition table)- 每個分割區資訊要用
16bytes 記錄,所以 ,這就是為什麼 MBR 最多只能有 4 個主分割區(Primary Partition) 的物理限制- MBR 在記錄磁區數量時,使用的是 32 bits 的長度2。 ,約 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
- 其中 Partition Type GUID(分割區類型識別碼)是全世界統一的。只要是「EFI 系統分割區(ESP)」,它的類型 ID 固定就是
- 允許無限數量的分割區
- 每一個你在 GPT 硬碟上切出來的分割區,系統都會隨機配發一個「全球唯一識別碼」(Globally Unique Identifier, GUID),確保即使你把這顆硬碟拔到全世界任何一台電腦上,系統都不會把分割區搞混
當主機板的 UEFI 韌體開機時,它會去掃 GPT 分割表,只要看到哪一個分割區的類型代碼是 C12A7328...(也就是 ESP) 就知道系統碟在哪。
主機板 UEFI 啟動 ──> 讀取 GPT 分割表 ──> 直接認出「EFI 系統分割區 (ESP)」──> 進去像開資料夾一樣讀取 /EFI/BOOT/bootx64.efi ──> 啟動系統磁區(Sector)
可以把整顆硬碟想像成一本「超大型的方格筆記本」,磁區就是硬碟上最小的格子,是硬碟讀寫資料的最小物理單位,不管是什麼大小的的操作,都是以一個格子單位讀取或寫入。
至少在 2010 年以前,全世界的硬碟這個「格子」的物理大小一律都是 512 bytes。
MBR 的世界裡,因為空間珍貴,它只留了 32 bits(4 bytes) 來記錄這顆硬碟總共有幾個格子(磁區),也就是說大約可以表示有這麼多……
所以這顆硬碟能擁有的極限容量就是大約 2TB:
連接網路
查看和管理網路介面
ip linkintel 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 -lTUI 看起來還是比較友善……
cfdisk /dev/nvme0n1這邊是
| Device | Partition type | Suggested size |
|---|---|---|
nvme0n1p1 | EFI system partition | 512M |
nvme0n1p2 | Linux filesystem | 476G |
格式化
mkfs.fat -F 32 /dev/nvme0n1p1mkfs.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 texinfoamd-ucodeCPU 微指令集(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 並寫入:
yourhostnamepasswdBoot Loader
這邊選用 grub(GRand Unified Bootloader)
pacman -S grub efibootmgr別忘記建立 cfg:
grub-mkconfig -o /boot/grub/grub.cfgSystem Initialization - UEFI
- POST 後,UEFI 會初始化開機所需的硬體(硬碟、鍵盤等)。
- firmware 會讀取 NVRAM 中的開機項目,以判斷要啟動哪個 EFI 應用程式以及從哪裡啟動(例如從哪個磁碟和分割區),firmware 會尋找該磁碟上的 EFI 系統分割區,嘗試路徑如
\EFI\BOOT\BOOTx64.EFI1 - firmware 啟動 EFI
- 這可以是 boot-loader(ex.
grub),也可能是其他 EFI,或是其他 boot-manager(ex.systemd-boot)
- 這可以是 boot-loader(ex.
離開 arch-chroot
可以 exit 來離開 arch-chroot,可以選擇 umount -R /mnt 把 /mnt 解除掛載,最後 reboot
References
- USB flash installation medium - ArchWiki
- Power-on self-test - Wikipedia
- Computer terminal - Wikipedia
- 統一可延伸韌體介面 - 維基百科,自由的百科全書
- 【問題】UEFI? BIOS? Legacy? 淺談主機板UEFI觀念與迷思 @電腦應用綜合討論 哈啦板 - 巴哈姆特
- 磁碟分割MBR、GPT是什麼? 凌威科技
- What’s at 1st sector/MBR of hard disk(MBR Forensics)
- Arch boot process - ArchWiki
- GRUB - ArchWiki