Arch Linux 安裝攻略

22 minute read

mirror from xdavidwu/arch-linux-install

Arch Linux 安裝攻略Permalink

說明Permalink

針對已經對 GNU/Linux 有基本認識者編寫的輔助性質 cheatsheet

先備動作Permalink

WindowsPermalink

有些機子可能會預設啟用 BitLocker ,但那需要 secure boot ,而且待會需要停用 secure boot ,事先把 BitLocker 停用,才不會進不了 Windows 。如果還是想要保留 secure boot ,參考 Secure Boot

Windows 會把 UEFI/BIOS 的時間設做當地時間,但其他系統通常是用 UTC 時間。創一個 registry HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal (DWORD) 然後設為 1,重新啟動後 Windows 就改成用 UTC 時間了

UEFI SettingsPermalink

這些功能可能可以幫你省下狂按按鍵進 UEFI 設定或開機選單的麻煩

  • Windows 的 進階啟動 (reboot 時壓住 shift)

也可以用來選 boot device 暫時充當開機選單

  • GRUB command fwsetup

按 c 進入 command line

常用可以加成一個 entry

  • systemd-boot Reboot to firmware

以 loader.conf auto-firmware 控制,預設是 enabled

注意某些 UEFI/BIOS 會把持續壓住的鍵視為故障而不進設定

安裝Permalink

Arch Linux 與其他大多數主流發行版不同,安裝主要依靠 bootstrap 工具 (pacstrap) 安裝套件後手動設定。開機進 Arch Linux 的 ISO 後,會進入到一個有 zsh 的 kernel console,再進行手動安裝

UEFI 需要停用 secure boot

以下安裝過程皆假設使用 UEFI,legacy BIOS 會不同的地方主要只會有安裝 bootloader 的部份

HiDPIPermalink

如果你的 DPI 高到看不到 Linux kernel console 的字,就 load 一個比較大的 font,目前 ISO 內最大的是 latarcyrheb-sun32

setfont /usr/share/kbd/consolefonts/latarcyrheb-sun32.psfu.gz

驗證開機模式Permalink

UEFI 模式下,路徑 /sys/firmware/efi 會存在,如果想確保目前是在 UEFI 下,可以用他來確認

設定網路連線Permalink

目標是能 ping 到 google.com ,在絕大多數情況下就是成功了

ping www.google.com

如果是有線連線,先確保該 interface 有 up

ip l set <interface> up

如果要列出所有 interfaces

ip l

如果是 wifi ,可以利用 iwd (含內建 DHCP client)

連線方法: iwctl 進入 interactive command line

掃 AP:

station <interface> scan
station <interface> get-networks

連 AP: (802.1x 要寫 config, 見 iwd.network(5))

station <interface> connect <ssid>

確保有透過 DHCP 拿到 ip

ip a show <interface>

如果沒有並且是有線,確保有啟動 dhcpcd

systemctl start dhcpcd.service

如果還是沒有,手動設定 ip 和 routing table

ip a add <ip> dev <interface>
ip r add <subnet> dev <interface>
ip r add default via <gateway> dev <interface>

如果 DHCP 設定 DNS 太爛或是需要手動設定,於 /etc/resolv.conf 增加

nameserver <dns server>

這是暫時的,會被 dhcpcd 覆蓋,如果需要永久設定可以改成加入 /etc/resolv.conf.head

如果有程式沒有在查詢失敗時嘗試下一個 server ,加上 options rotate 有支援它的 applications 就會自動嘗試

分割硬碟分區Permalink

在開始分割硬碟區前先確認硬碟有正確讀到

lsblk -a

上面這個指令可以列出硬碟代號及大小,如果需要更詳細的資料

fdisk -l

在 Linux 中 device nodes 位於 /dev 底下,其中 block devices 位於 /dev 或 /dev/block ,在 Arch 為前者,舉例來說透過運行 lsblk 後,得知固態硬碟名稱為 nvme0n1 ,他的 device node 位置便是 /dev/nvme0n1

其中常見 block devices 的命名規則如下

SATA 或 USB: sd<x><y> ,其中 x 為英文字母,表示第 x 顆硬碟, y 為數字,表示硬碟上的第 y 個分區

IDE 介面: hd<x><y> ,其中 x 為英文字母,表示第 x 顆硬碟, y 為數字,表示硬碟上的第 y 個分區

NVMe 介面: nvme<x>n<y>p<z> ,其中 x, y, z 為數字, nvme<x>n<y> 表示硬碟, p<z> 表示分區

MMC: mmcblk<x>p<y> ,其中 x, y 為數字, x 表示碟, p<y> 表示分區

以第一顆 SATA 介面硬碟分區名稱 /dev/sda 為例,並假設硬碟是空的,開始設定分區

cfdisk /dev/sda
  • /dev/sda1: /boot

空間通常建議 512MB,類型為 EFI System

(若有其他系統的 EFI 分區可以直接沿用,且不要格式化,格式化你其他系統的 bootloader 就沒了)

我的系統上 Windows 的 bootloader 再加上 Dell 的一些 recovery system 再加上 grub 和 Arch Linux 的 kernel 和 initramfs 用了快 150MB

我會最少也弄個 256MB 省麻煩

  • /dev/sda2: Swap

自訂,類型為 Linux Swap

swap 分區是用來儲存部份原本應該在 RAM 上的資訊。如果你覺得你的 RAM 大小足夠,可能不需要這個分區,也可以事後使用基於檔案的 swap

  • /dev/sda3: /

自訂,可以使用全部剩餘空間,類型為 Linux filesystem

如果需要調整現有分區的大小,切記要先 resize filesystem (ext 系列是 resize2fs) 再去 resize partition。如果怕出錯,可以用 gparted GUI 懶人工具。Arch Linux live 環境通常會塞不下 gparted ,可以改用 gparted 官方自己的 live system。

格式化分區Permalink

mkfs -t vfat /dev/sda1
mkswap /dev/sda2
mkfs -t ext4 /dev/sda3

掛載分區Permalink

mount /dev/sda3 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

安裝Permalink

有些人可能會使用別人寫好的腳本,但這很不 Arch

以下為手動安裝

設定 pacman 的 mirrorlistPermalink

調整 pacman 啟用的鏡像站,提高下載安裝的速度

/etc/pacman.d/mirrorlist ,把 Taiwan 的移到前面,視所在位置排序

安裝 base metapackage 和 base-devel groupPermalink

如果想要更小的系統不做開發可能不需要 base-devel

這裡會自動刷新一次 repo db 然後下載最新的套件

pacstrap /mnt base base-devel

注意 base 已經不再是 group 而是 metapackage,如果想要到非常精簡建議 pacman -Si base 看看他 depends 哪些自己過濾裝

建立 fstabPermalink

生成 fstab ,其中 -U 代表透過 UUID 來定義,就算 device nodes 的標籤改變了也能順利使用,他定義了各個分區如何掛載於系統

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

chroot 至新系統Permalink

chroot 是以其他目錄作為系統根目錄執行指令的概念, arch-chroot 這個 helper 會幫忙 setup 更多東西,讓環境近似於直接開進去的系統

arch-chroot /mnt

HiDPIPermalink

如果之後還會繼續用 kernel console,可以讓他自動載入 font

/etc/vconsole.conf:

FONT=latarcyrheb-sun32

加入之後在進入系統時會被 systemd 載入,如果有需要可以讓他在 initramfs 的階段就載入

/etc/mkinitcpio.conf:

HOOKS 增加 consolefont 後執行 mkinitcpio -p linux

又或者日後可以自己編譯 Linux kernel,把 kernel 內建的 font 改為較大的,最大有到 16x32:

Library routines
 Select compiled-in fonts
  Terminus 16x32 font (not supported by all drivers)

如果喜歡 Terminus,有 terminus-font package 可以提供 console font,命名規則為 ter-

設定時區Permalink

timedatectl set-timezone Asia/Taipei

設定語言環境Permalink

生成 zh_TW.UTF-8 語系

echo "zh_TW.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen

設定預設為 zh_TW.UTF-8

localectl set-locale zh_TW.UTF-8

在 kernel console 底下無法直接顯示中文,使用 zh_TW.UTF-8 會出現一堆方塊,如果常直接在 kernel console 下做事可以在當下 export LC_ALL="C" 暫時修改,也可以只在 xinitrc 之類的地方設定為 zh_TW.UTF-8

如果不是用 xinit (例如 Wayland),可以善用 shell 的 alias,寫進 shell 的 config,例如:

alias sway="env LC_ALL=zh_TW.UTF-8 sway"

設定電腦名稱Permalink

hostnamectl set-hostname <your-pc-name>

設定 root 密碼Permalink

在後面加入一般 user 之後可以透過 passwd -l root 防止使用 root 登入,但那會造成無法進入 emergency shell ,如果沒有其他救援備案 (例如從其他 Linux chroot 進來,或者 kernel cmdline 用 init=/bin/sh 繞過) 鎖定與否自行斟酌,不鎖就設一下密碼

passwd

安裝 bootloaderPermalink

這裡介紹 systemd-boot 和 GRUB

GRUB:

  • 顏值高,可 theme,功能多,支援執行多種 OS kernel
  • 相較之下偏大 (x86_64-efi) EFI binary + modules 約 3.3M
  • Arch 套件不小 (約 32M when installed)
  • 實測在 4k 螢幕上輸出微慢

systemd-boot:

  • Arch 上就在 systemd package 裡,裝了 systemd 就順便送你
  • 功能少,只能 load EFI binary

Linux kernel 需要開 CONFIG_EFI_STUB 支援以 EFI binary 載入 (Arch linux 套件有開)

entries 要自己寫或生成 unified kernel image

  • 本文採用自己寫 entries,就不用每次更新 kernel 重新生成 unified image
  • 輸出直接交給 EFI,不能 font 或用背景圖

HiDPI 上字小或字醜二選一

但通常跟 UEFI 自己的 boot menu 很搭

  • 很小,EFI binary 92K
  • 預設就會自己抓 Windows, OS X 的 bootloader 長出 entries
  • 預設自己會長出 Reboot to firmware

如果之後開機載入了其他系統的 bootloader ,先檢查 /boot/EFI/Boot/Bootx64.efi 是否與 /boot/EFI/systemd/systemd-bootx64.efi/boot/EFI/grub/grubx64.efi 相同,注意在 FAT 系列格式下大小寫不拘。不會太舊的 UEFI 實做大多可以手動設定 EFI/Boot/Bootx64.efi 以外的路徑可以試試。 EFI/Boot/Boot<architecture>.efi 是 UEFI 規範的 fallback 路徑

  • systemd-boot
bootctl install

注意 /boot/EFI/Boot/Bootx64.efi 會被覆寫

設定:

main config /boot/loader/loader.conf 常見 options:

timeout <timeout-seconds>
default <default entry name>
console-mode <0,1,2...,auto,max,keep (UEFI console resolution, 0: 80x25, 1:80x50, 2...: non-standard)>

entry definition /boot/loader/entries/<name>.conf:

title <title>
linux <EFI stub kernel path>
initrd <initramfs path>
options <kernel cmdline>

範例:

main config /boot/loader/loader.conf:

timeout 3
default arch
console-mode 2

entry definition /boot/loader/entries/arch.conf:

title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=<root UUID>

entry definition /boot/loader/entries/arch-fallback.conf:

title Arch Linux, fallback initramfs
linux /vmlinuz-linux
initrd /initramfs-linux-fallback.img
options root=UUID=<root UUID>
  • GRUB
pacman -S grub os-prober efibootmgr

os-prober 可以用以偵測其他系統 (如 Windows),並加入 grub 選單中,在 grub-mkconfig 內會自動執行,如果只有裝 Arch 就不用安裝

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub
grub-mkconfig -o /boot/grub/grub.cfg

注意不管是哪種, Arch 官方的 package 在更新時都不會幫你順便更新 /boot 。如果想要達到自動更新可以採用 pacman hook , AUR 上有現成的 systemd-boot-pacman-hookgrub-hook

安裝 Wi-Fi 連線工具 (iwd)Permalink

大量利用 kernel crypto API 的輕量 wireless daemon,自行編譯 kernel 者注意相關 configuration (如果有缺在 log 會有提示)

內建 DHCP client 功能

pacman -S iwd

有 daemon 要先起來,systemd unit iwd.service

預設會自己處理 interface,創成 wlan0 這種 naming,可以在 daemon 加參數避免,enable 的話注意他起來時 interface 有沒有先出現

其餘網路工具Permalink

如果你不會用 iproute2 的 ip 指令, net-tools 提供了 ifconfig route 等舊指令

如果之後沒辦法連上網路,設定方面參考上面。如果也是使用 dhcpcd ,記得 enable 他的 service

有線可以考慮不裝 dhcpcd ,使用 systemd-networkd 去連,但是會需要寫 config 於 /etc/systemd/network/*.network

範例:

[Match]
Name=<interface name>

[Link]
RequiredForOnline=no

[Network]
DHCP=yes

RequiredForOnline 定義這個 network 在 systemd 判斷有沒有 online 會不會需要他,筆電可以設成 no ,不然開機過程大多會等 online

安裝 CPU MicrocodePermalink

安裝 intel-ucode 或 amd-ucode 套件

有些人可能會想跳過省下 Intel 的一堆漏洞的 mitigations 造成的 performance penalty

對於 mitigations 當前的狀況,可以看 /sys/devices/system/cpu/vulnerabilities/

如果要再進一步關 mitigations,在 kernel cmdline 增加 mitigations=off

cmdline 調整:

  • systemd-boot

修改 entries 的 options

  • GRUB

修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT 然後 grub-mkconfig -o /boot/grub/grub.cfg

套用 microcode:

  • systemd-boot

在 entries 多加一項 initrd 為 /boot/intel-ucode.img/boot/amd-ucode.img

  • GRUB

grub-mkconfig 時會自動加上載入 microcode 的參數,安裝完 microcode 後,手動執行一次 grub-mkconfig -o /boot/grub/grub.cfg

建立新使用者Permalink

建立新使用者,並加入 wheel 群組

useradd -m -G wheel <your-user-name>
passwd <your-user-name>

安裝 sudo (包含在 base-devel group 裡面)

pacman -S sudo

設定 sudo 群組

visudo

找到這行,並刪除 # 取消註解,讓 wheel 群組能用 sudo

# %wheel ALL=(ALL) ALL

如果你沒有打算裝整個 base-devel ,你可能會對 opendoas 有興趣

OpenBSD 的 doas 以相對簡短許多的 code 提供了 sudo 的大多數功能, OpenDoas 把他移植到其他平台

pacman -S opendoas
echo 'permit persist setenv { LC_ALL } :wheel' > /etc/doas.conf

doas 預設不傳有關語言的環境變數,這裡設定多個 LC_ALL 來傳

之後看到 sudo 就用 doas 代替

如果有要使用 makepkg (例如使用 AUR), makepkg 假設 sudo 存在,如果不在就改用 su 幫你 call pacman 。可以自己加個 sudo 的 link 到 doas 讓他吃

重新啟動進入新系統Permalink

exit
umount -R /mnt
reboot

初次進入系統Permalink

以下大多可以在 chroot 時就進行,但直接進系統比較會省麻煩,才不會有比如說哪個 kernel module 裝下去跟正在跑的 kernel 不符用不了

安裝顯示卡驅動Permalink

如果你有顯示卡的話,安裝針對顯示晶片的驅動,效能通常更好

在同時有獨顯和內顯的筆電上,如果有獨顯輔助內顯的功能 (例如 NVIDIA Optimus) ,預設螢幕會顯示內顯輸出,可能可以在 BIOS/UEFI 設定主要使用的顯示卡

如果不在意效能,也可以調一下 Xorg config 直接只用內顯

如果要達成混合顯示,參考 PRIME

  • NVIDIA

使用 NVIDIA 提供的 nvidia ,如果偏好開源可以跳過,原本預設會使用開源的 nouveau

注意 nvidia 沒有實做 GBM 只有實做自家出品的 EGLStreams ,基於 wlroots 的 Wayland compositors 不支援

安裝套件 nvidia 或者是 nvidia-lts

含有 kernel module , nvidia-modprobe 或重新啟動以載入

監控檢查狀況用 nvidia-smi 指令 (套件 nvidia-utils)

需要時可以安裝 nvidia-settings 圖形界面程式來調整設定

  • AMD

參閱 AMDGPU

安裝 GUIPermalink

安裝你需要的桌面環境 / wm / Wayland compositor 。選擇依賴於個人喜好故跳過。如果你不知道我在說什麼就不該裝 Arch Linux

安裝 AUR helperPermalink

AUR 是由社群推動的使用者軟體庫,包含了 PKGBUILD 等打包時需要的腳本,可以用 makepkg 打包軟體包,並透過 pacman 安裝。透過 AUR 可以在社群間分享、建構新軟體包,熱門的軟體有機會被收錄進 community 軟體庫

AUR 沒有在管內容有沒有開源,很多都是 binary blobs ,風險自負,建議養成 review PKGBUILD 的習慣

如果想要使用 AUR 上的資源,需要確認有安裝 base metapackage, base-devel group 及 git 。然後使用 AUR helper 來打包 AUR 上的內容,或是手動用 makepkg 一一打包

如果要手動打包,大致上的流程是遞迴找出目標套件和所有他在 AUR 上的 dependencies ,從沒有 depend 到 AUR 套件的開始以 makepkg -si 打包回去,-s 會用 pacman 安裝缺少的 dependencies ,-i 是在打包完後自動安裝

自行參閱 Arch User Repository 以及 AUR helpers 頁面

如果有興趣 contribute to PKGBUILDs ,推薦可以自己包個含 base-devel 並且有設自己的 AUR 套件 repo 的 container image,並且使用 container 去確保 dependency 沒有顯著問題

安裝中文輸入法 (fcitx)Permalink

安裝 fcitx

sudo pacman -S fcitx-im fcitx-chewing fcitx-configtool

在 /etc/environment 添加以下三行

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS="@im=fcitx"

想辦法讓你的 GUI 自動執行 fcitx-autostart

開啟 Fcitx Configuration 圖形界面 (fcitx-configtool) 新增 input method

找到 Chewing (新酷音) 並新增

Wayland 的部份輸入法 protocol 已經有 unstable 版本,但還沒有已知的完全實做。目前可以透過 Xwayland 用 toolkit im module (GTK_IM_MODULE, QT_IM_MODULE) 的方式使用 fcitx ,缺點是依賴於 Xwayland ,需要是使用 GTK 或 QT 才能使用,且因為 Wayland 沒有取得畫面全域座標的方法 (這是 by-design,而且在某些特殊模型下全域座標可能沒意義或不存在) ,選字 popup 的位置大多會不正確

GNOME Wayland 因為 gnome-shell 有對 IBus 做選字 popup,IBus 會正常運作。但是是個別整合而不是通用的 protocol

安裝字型Permalink

sudo pacman -S noto-fonts noto-fonts-cjk

noto-fonts 是 Google 提供的開放 (OFL) 字型,支援大多數 Unicode 的字元

noto-fonts-cjk 為相同系列的中日韓字型 (Chinese, Japanese, Korean),建議至少安裝這個

NTFS 檔案系統讀寫支援Permalink

如果需要對 NTFS 有更好的支援,ntfs-3g 提供了以 FUSE 實做的驅動,以及對 NTFS 進行各種操作的指令

實際上如果只需要存取 NTFS 可以嘗試使用位於 Linux kernel 內的驅動

參見 NTFS-3G 以及 Linux kernel source

sudo pacman -S ntfs-3g

Enjoy your new systemPermalink

Done!