🔼 Arch Linux - 安裝 & 配置

這篇文章是前陣子,因為一直被 Window 搞,一下要我升級 Window 11、一下把我系統的 Ubuntu GRUB 蓋掉,後來實在受不了,乾脆安裝 Arch Linux 一勞永逸(欸?),所作的筆記。

1 開機過程

  • 主機板上有一個關鍵硬體:SPI Flash Memory(取代 EEROM),裡面存著 UEFI(Unified Extensible Firmware Interface)韌體界面(取代 BIOS) 跟 NVRAM(Non-volatile random-access memory)。
  • 如果是首次開機,UEFI 韌體會去翻 NVRAM 會找不到資料,然後就會掃描所有硬碟 GPT(GUID Partition Table, i.e. LBA 0-33),找找看有沒有分區是 GUID 為 C12A7328-F81F-11D2-BA4B-00A0C93EC93B 固定值的,這代表該分區是 EFI 分區(i.e. ESP),格式通常為 FAT16/32(微軟遺產之一),然後 UEFI 韌體會掛載這個分區,接下來去找固定位置 /EFI/BOOT/BOOTX64.efi 檔案(PE 格式的可執行檔,微軟遺產之二)。
  • .efi 檔案負責接手後面的事情:也就是把作業系統喚醒。
  • 當然,若 NVRAM 已經有紀錄的話,就可以直接找到具體 .efi 檔案的位置:
1
2
efibootmgr -v
# Boot0001* arch HD(1,GPT,65c...d27,0x800,0x100000)/File(\EFI\arch\grubx64.efi)
  • 如果硬碟很多、很大,然後 CR2032 電池(即水銀電池)又失效的話,有可能 UEFI 就每次開機都找不到啟動目錄(因為 NVRAM 找不到的關係)。水銀電池負責給 NVRAM 供電的。

2 系統安裝

以 USB 開機後,依序處理下面事項:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 檢查開機模式是 UEFI: 看看有沒有檔案
ls /sys/firmware/efi/efivars

# 配置連線界面
iwctl

# 系統時間調整
timedatectl set-ntp true

# 檢查硬碟列表,找到類似 /dev/nvme0n1 或 sata 的東西
lsblk

# 硬碟分割(注意細節)
cfdisk /dev/nvme0n1

現代硬碟分割大致上只要兩個區域:

接下來,操作格式化:

1
2
3
4
5
6
7
# 格式化
mkfs.ext4 /dev/nvme0n1p2 # Root Partition
mkfs.fat -F 32 /dev/nvme0n1p1 # EFI Partition

# 掛載
mount /dev/nvme0n1p2 /mnt # Root Partition
mount --mkdir /dev/nvme0n1p1 /mnt/boot # EFI Partition

把東西塞進去(安裝):

1
2
3
4
5
6
7
8
pacstrap -K /mnt base linux linux-firmware base-devel vim git networkmanager
# base 基本工具 (ls, cp, pacman 等等)
# linux Linux 核心
# linux-firmware Linux 韌體包
# base-devel 開發工具(gcc, make 等等)
# vim 編輯器(可以換成 vi, nano 等等)
# git 版本控制器
# networkmanager 開機自動處理網路的軟體

設定開機掛載硬碟(配置 UUID, Universally unique identifier):

1
2
genfstab -U /mnt >> /mnt/etc/fstab # 配置
cat /mnt/etc/fstab # 檢查

至於 /mnt/etc/fstab 裡面應該長這樣:

1
2
3
4
# /dev/nvme0n1p2
UUID=a1b2c3d4... / ext4 rw,relatime 0 1
# /dev/nvme0n1p1
UUID=E1F2-G3H4 /boot vfat rw,relatime... 0 2

目前狀態:開機能找到硬碟,但「無法啟動系統」(未處理 GRUB 的 EFI 檔案)

用指令進入 Arch 中:

1
arch-chroot /mnt

現在開始,我們就已經是在用 Arch 系統了。

然後進行一系列基本處理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 設定 Root 密碼
passwd

# 設定電腦名稱
echo XXXX > /etc/hostname

# 設定時區(by symnolic link)
ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime

# 把軟體時鐘寫入硬體時鐘
hwclock --systohc

# 設定語系(或是 vim /etc/locale.gen 把 en_US.UTF-8 UTF-8 註解取消)
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen

# 產生語系檔案
locale-gen

# 設定主系統語言
echo "LANG=en_US.UTF-8" > /etc/locale.conf

創一個預設 sudo 使用者(通常不用 Root 活動):

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安裝 sudo
pacman -S sudo

# 建立使用者(-m 建家目錄、-G 群組)
useradd -m -G wheel <名稱>
# 傳統 BSD 系統中,SUDO 群組叫 wheel (Big Wheel)
# 現代 Debian 系統,SUDO 群組叫 sudo

# 設定密碼
passwd <名稱>

# 開放 wheel 權限
visudo # 或 EDITOR=vim visudo(用指定編輯器)

接下來處理 GRUB 開機引導程式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安裝開機微碼(CPU 指令的補丁)
pacman -S intel-ucode
# 或 AMD 用 pacman -S amd-ucode

# 安裝工具
pacman -S grub efibootmgr
# grub:開機管理工具
# efibootmgr:負責改主機板上的 NVRAM

# 把 ESP 寫入 NVRAM 中(需要 efibootmgr)
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB

# 產生開機選單
grub-mkconfig -o /boot/grub/grub.cfg

所有配置都已經完成,現在可以重新啟動(記得最後一步要拔掉 USB):

1
2
3
exit           # 離開系統,回到 USB 開機碟
umount -R /mnt # 安全解掛載
reboot # 記得拔掉 USB

3 客製化

接下來就比較客製化的內容了,不太影響系統穩定度,只影響好不好用。

3.1 更新 Pacman 庫

1
pacman -Syyu

3.2 安裝顯卡驅動

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安裝 Nvidia 顯卡
sudo pacman -S nvidia nvidia-utils nvidia-settings lib32-nvidia-utils
# nvidia 核心驅動
# nvidia-utils 核心工具(e.g. nvidia-smi 等等)
# nvidia-settings 圖形化設定工具
# lib32-nvidia-utils 相依性配合工具(如果要玩 Steam 則必要)

# 修改 GRUB 檔案
# 加入 nvidia-drm.modeset=1 到 GRUB_CMDLINE_LINUX_DEFAULT
# 例如:GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet nvidia-drm.modeset=1"
vim /etc/default/grub

# 修改早期模組
# 加入 nvidia 到 MODULES 中
# 例如:MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
vim /etc/mkinitcpio.conf

sudo grub-mkconfig -o /boot/grub/grub.cfg # 更新 GRUB
sudo mkinitcpio -P # 更新 initramfs

可能遭遇的問題,如果找不到 Nvidia 的話:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 直接翻庫表,看看哪些可用
pacman -Sl extra | grep nvidia
# extra hip-runtime-nvidia 7.1.1-1
# extra libnvidia-container 1.18.2-1
# extra libva-nvidia-driver 0.0.15-1
# extra nvidia-cg-toolkit 3.1-8
# extra nvidia-container-toolkit 1.18.2-1
# extra nvidia-open 590.48.01-9
# extra nvidia-open-dkms 590.48.01-2
# extra nvidia-open-lts 1:590.48.01-9
# extra nvidia-prime 1.0-5
# extra nvidia-settings 590.48.01-1
# extra nvidia-utils 590.48.01-2
# extra opencl-nvidia 590.48.01-2

3.3 音效驅動

這個比較簡單:

1
2
3
4
5
6
7
8
9
10
11
# 安裝驅動
sudo pacman -S pipewire pipewire-audio pipewire-alsa pipewire-pulse wireplumber pavucontrol plasma-pa
# pipewire 核心服務
# pipewire-audio 讓 Pipewire 處理所有音訊流程
# pipewire-alsa 相容於舊的 ALSA 介面(底層驅動)
# pipewire-pulse 建立一個偽裝的 PulseAudio 伺服器,讓 Chrome、Discord 等軟體能正常發聲
# wireplumber 負責決定哪個裝置該出聲、調整音量
# plasma-pa KDE 右下角小圖示

# 設定開機自動啟動
systemctl --user enable --now pipewire.service pipewire-pulse.service wireplumber.service

3.4 中文輸入法

中文輸入法在 Arch 裡面,還有字型的問題。

1
2
3
4
5
6
7
# 安裝中文輸入法
sudo pacman -S fcitx5 fcitx5-chewing fcitx5-configtool fcitx5-qt fcitx5-gtk
# fcitx5 包含主程式與 GTK/Qt 的支援模組
# fcitx5-chewing 新酷音輸入法(如果你習慣注音)
# fcitx5-configtool 圖形化設定介面
# fcitx5-qt 處理 Qt 邏輯選字框(因為 KDE 桌面是 Qt)
# fcitx5-gtk 處理 GTK 邏輯選字框(因為 GNOME 桌面是 GTK,如果永遠不用 GTK 軟體的話不必要)

3.5 安裝字型

Arch 什麼都不提供,建議至少思源+文泉譯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo pacman -S noto-fonts-cjk adobe-source-han-sans-otc-fonts adobe-source-han-serif-otc-fonts
# noto-fonts-cjk Google 開源的字體,涵蓋簡、繁、日、韓,相容性最強
# adobe-source-han-sans-otc-fonts Adobe 版的開源黑體,思源黑體,字形處理非常細膩,適合系統 UI
# adobe-source-han-serif-otc-fonts 思源宋體,適合閱讀長篇文章,字體帶有襯線,很有書卷感

sudo pacman -S wqy-zenhei wqy-microhei
# wqy-zenhei 文泉驛正黑,最經典的代表作
# wqy-microhei 文泉驛微米黑,基於 Google 的 Droid Sans Fallback 修改而來

sudo pacman -S ttf-jetbrains-mono-nerd ttf-cascadia-code-nerd
# ttf-jetbrains-mono-nerd 寫程式字體,字間距與高度經過特別優化
# ttf-cascadia-code-nerd 微軟開發的字體,帶有連字效果(例如 != 會合體成 $\neq$)

sudo pacman -S ttf-inter noto-fonts-emoji
# ttf-inter 現代 UI 字體,很多國外科技公司的網頁預設
# noto-fonts-emoji 解決 Discord 或網頁上 Emoji 變方塊的問題

sudo pacman -S otf-latin-modern
# otf-latin-modern 數學字體,由 LATEX 衍生,這是 Latin Modern 的 OpenType 版本

3.6 安裝 Chrome 與 Chromium

不推薦 Chromium 的原因是不支援自動同步。

由於 Arch 官方沒收錄官方版 Google Chrome,所以最好自己編譯:

1
2
3
4
# 下載並編譯
git clone https://aur.archlinux.org/google-chrome.git
cd google-chrome
makepkg -si

關閉 KWallet 密碼管理(導致啟動很慢):

1
2
# 設定檔加入一行
echo "--password-store=basic" >> ~/.config/chrome-flags.conf

3.7 螢幕截圖設定

  • 設定 Spectacle 讓行為跟 Window 相同使用( Window+Shift+S 來直接螢幕截圖到 Clipboard)
  • 配置:儲存 + 複製圖片到 Clipboard
  • 然後快捷建:Reassign Meta+Shift+S 到 Capture Rectangular Region 而不是 Launch Spectacle。

image.png

image.png

3.8 WebApp 的 D-Bus 延遲問題

所有的 WebApp 啟動的時候,都會去調用 KWallet (KDE) 來想要保存密碼(這是源自於瀏覽器的習慣。)
但是安裝的時候預設是不啟用 Kwallet 的,直接補裝進去就好,我建議就用 KWallet 來保存,其實 Windows 也是這麼做的(只是方法有些不同。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 啟用 Kwallet
sudo pacman -S kwallet kwalletmanager kwallet-pam
# kwallet 預設核心(儲存密碼用)
# kwalletmanager 它的 GUI 管理界面
# kwallet-pam 讓你登入的時候順便解鎖(類似 Windows)

# 打開 GUI 設定,新建一個 wallet
# 名稱必須是 "kdewallet" (如果希望 no pop-up window 的話,kwallet-pam 固定用的名稱)

# 配置 kwallet-pam 加入下面兩行
sudo vim /etc/pam.d/login
# auth optional pam_kwallet5.so
# session optional pam_kwallet5.so auto_start

# 如果要停用:加入 --password-store=basic 到指定應用程式(這裡以 vscoduim 為例)
vim ~/.config/codium-flags.conf