Try   HackMD

撰寫開始時間: 2023/07

建置之硬體環境:

  • CPU: i3-12100
  • RAM: 16GB
  • Disk: 512GB SSD/4TB HDD
  • MB: ASUS PRIME B660M-K D4-CSM
  • Network: Ethernet

播種與施肥

從 USB 開機到初次重新開機。

請準備好 Arch linux 安裝印象檔並燒至 USB,插入電腦後開機,當然虛擬機也行,這部分比較基礎就不囉嗦了。

另外,如果在這個階段不小心搞錯任何操作或命令,除了被格式化的硬碟外都可以挽回,也可以嘗試重新開機並繼續用 USB 操作多次,並不是初次重開機前搞砸後就沒救了。

(Optional) 無線網路連線

當安裝之目標電腦沒有有線網路時,需先設定 Wifi 連線,因為後續需要安裝很多東西,包含 Network Manager 等。

[iwd]# device list

確認自己網路設備的名字 (以 wlan0 為例) 後,啟用 scan 功能。

[iwd]# station wlan0 scan

查看可連線的無線網路。

[iwd]# station wlan0 get-networks

連線上網,假設想要連上 Eroiko 這個 wifi。

[iwd]# station wlan0 connect Eroiko
Passphrass: ******** # 叫我們輸入密碼

離開 iwctl 然後嘗試 ip a 以及 ping 一下看是否成功連上網。

格式化硬碟

注意,被格式化的硬碟將無法挽回,這裡務必慎重。

基本概念

眼下的檔案系統是 USB 的,目前還沒有掛載任何目標電腦的硬碟,所有對目標電腦檔案的修改都要等到掛載後才能使用。

現在使用 ls / 會看到的是 USB 中的根目錄資訊,當中會看到有個資料夾叫 /mnt,是掛載硬體的常用根目錄,在切換至正式的檔案系統 (arch-chroot) 之前,「正式的根目錄」就是 /mnt,比如正式的家目錄就是 /mnt/home,依此類推。而我們會把根目錄對應的 partition 掛載至 /mnt 下,家目錄對應的 partition 掛載至 /mnt/home

切換至目標電腦後,檔案系統的結構就是我們熟悉的 Linux 慣用的檔案系統結構了。

佈局與檔案系統

以下將建立一個典型簡單的 Partition 佈局:root + home (Ext4)。

事實上各位可以選擇自己喜好的佈局方式以及 File System,比如:

  • 一個 root 走天下風 (with Ext4)
  • 經典款 root + home (with Ext4)
  • VFS 對物理硬碟抽象
  • Btrfs Raid
  • ZFS Storage Pool

要不要分 swap 也是個人的自由,就算沒 swap,Linux 也會在記憶體不足時生出 tmpfs,所以也不是特別必要。

分割硬碟

cfdisk 點陣圖型介面互動式的快樂分割:)

fdisk 也行,但 cfdisk 更簡單好用。
可以善用 lsblk 來得知可用的硬碟。

cfdisk <DISK_PATH>

根目錄的格式化與掛載

格式化為指定的 file system。

在此設為 ext4,也可以 btrfs 等等的,e.g. 用 mkfs.btrf,不過指令就沒那麼簡單了,請參考Btrfs 官網

mkfs.ext4 /dev/...

將根目錄掛載到格式化好的資料夾。

mount /dev/... /mnt

EFI 磁區的掛載

(Optional) 若 EFI 磁區不存在,也就是裝在全新的硬碟上時,格式化 EFI 磁區

mkfs.vfat -F 32 /dev/...

創建 EFI 資料夾

mkdir /mnt/boot

將 EFI 磁區掛載到格式化好的資料夾

mount /dev/... /mnt/boot

家目錄的格式化與掛載 (optional)

home 資料夾也類似,不過要先創建資料夾

mkdir /mnt/home
mkfs.ext4 /dev/...

將家目錄掛載到格式化好的資料夾

mount /dev/... /mnt/home

最後可以用 lsblk 來確認是否根目錄、家目錄和 EFI 磁區都掛載到正確的位置。

建立 file system table (fstab)

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

透過查看 /mnt/etc/fstab 確認是否成功建立檔案系統表

cat /mnt/etc/fstab

應該要看到我們剛創建並掛載好的 / (/mnt)、/home (/mnt/home) 目錄,以及 /boot (/mnt/boot) 目錄與對應的相關訊息。

上網安裝基本模組

(Optional but recommended) 在進行安裝與下載操作之前,可以先去開啟 Arch Linux 的 package manager: pacman 的平行下載功能。

/etc/pacman.conf 尋找 ParallelDownloads 關鍵字,把下面這行反註解掉:

#ParallelDownloads = 5

上述修改將作用在 USB 上,之後切換 (arch-chroot) 到安裝中的 Arch Linux 上也推薦這樣做。

接著正是下載並安裝好基本模組,然後就可以準備切換到剛裝好基本套件的 Arch Linux 下繼續安裝了。

pacstrap -i /mnt base
arch-chroot /mnt

如果遇到奇怪的 key 問題,可以用以下指令來解決 (通常是因為 ISO 太舊)

sudo pacman -S archlinux-keyring
sudo pacman -Syu

https://www.linuxquestions.org/questions/arch-29/neglected-upgrading-for-a-few-weeks%3B-is-this-a-problem-4175715274/

系統基本設定

Arch Linux 套件管理器 Pacman 基本介紹

pacman/Tips and tricks

Pacman 為 Arch Linux 的官方套件管理器,與 Debian 系中的 apt,最常用的指令不外乎:

sudo pacman -S <PACKAGE_NAME>

跟 Debian 系的 apt 有點像,他們有著以下的關係。

# 搜尋 local repository list 並嘗試安裝軟體
apt install <PACKAGE_NAME>
pacman -S <PACKAGE_NAME>

# 更新 local repository list
apt update
pacman -Sy

# 升級所有軟體至最新版本
apt upgrade
pacman -Su

# 更新 local repository list 並升級所有軟體
apt update && apt upgrade
pacman -Syu

懶人包: 一段時間沒用 Arch Linux 的話,第一個安裝指令都是

sudo pacman -Syu

而後續為了節省時間,會使用最快速的

sudo pacman -S

安裝基本模組

這些東西八成都會用到的,裝下去就對ㄌ >w0

pacman -S linux linux-headers linux-firmware base-devel openssh networkmanager network-manager-applet wpa_supplicant wireless_tools netctl efibootmgr dialog mtools dosfstools

另外至少裝一個用的順手的文字編輯器,以下是常見的兩個都裝。

pacman -S vim nano

啟用系統服務

允許啟用剛剛裝的 Network Manager 和 ssh。

系統服務 systemctl 的常用指令如下 (當然,正常使用者都需要 sudo)

單次啟用 SERVICE_NAME

立即啟用服務。

systemctl start <SERVICE_NAME>

允許啟用 SERVICE_NAME

在下次開機時生效。

systemctl enable <SERVICE_NAME> 

允許並立即啟用 SERVICE_NAME

systemctl enable --now <SERVICE_NAME> 

停止啟用 SERVICE_NAME

在下次開機時生效。

systemctl disable <SERVICE_NAME>

查看 SERVICE_NAME 的狀況

systemctl status <SERVICE_NAME>

刷新 systemctl

systemctl daemon-reload

啟用 network manager

systemctl enable NetworkManager

啟用 ssh 服務

systemctl enable sshd

設定 initrd (initial ram disk)

mkinitcpio -p linux

mkinitcpio is a Bash script used to create an initial ramdisk environment.

設定密碼與使用者

設定 root 密碼

passwd

wheel 使用者群組設立 sudo 權限

後續將假定 wheel 群組擁有 sudo 權限

visudo

然後至 # %wheel ALL=(ALL) ALL 這行將其反註解。

新增新使用者

新增使用者 SOME_NAMEusers 群組且為其指派家資料夾 (-m),並將其加入可選群組 wheel,以便使用 sudo。

useradd -m -g users -G wheel SOME_NAME

為新使用者設定密碼

SOME_NAME 使用者設定密碼。

passwd SOME_NAME

美麗的 rEFInd

安裝 rEFInd 套件。

pacman -S refind

接著將 rEFInd 安裝到 /boot 下,其安裝內容與設定檔會在 /boot/EFI/refind 下:

refind-install

然後去刪除 /boot/refind_linux.conf 裡的前兩行 (與 USB 相關的掛載點)。

這樣便完成基本設定,接下來可以去 rEFInd theme 找好看的主題安裝 :)

安裝在 /boot/EFI/refind/themes 下,並去 /boot/EFI/refind/refind.conf 的最後一行加入:

include themes/<YOUR_THEME_FOLDER>/theme.conf

Ref: rEFInd引导使用教程

到此,已經完成最基本的設定,可以準備拔掉 USB 並初次重新開機。

成長茁壯

初次重新開機後的基本設定。

(Optional) 正式連上 Wifi

3 Ways to Connect to WiFi from the Command Line on Debian

安裝 Nvidia

這裡務必萬分謹慎,否則可能會落到要重裝的地步
安裝時請對照官方文件,確認自己的 Nvidia 顯卡對應之驅動的安裝方式。

最泛用的安裝程序如下:

  • 安裝套件
    ​​​​sudo pacman -S nvidia
    
  • 關閉 kms hook 來避免 initramfs 加載 nouveau
    /etc/mkinitcpio.confHOOKS 這行列表中 kms 去掉。
  • 套用新 initramfs 加載設定
    ​​​​sudo mkinitcpio -P
    
  • 重新開機

    不要拖,直接重開來應用設定

    ​​​​sudo reboot
    

調整時區、主機、網路

這些設定不急,之後調都可以。

列出時區相關資訊

timedatectl

列出所有時區

timedatectl list-timezones

將時區設為台北(以台北為例)

timedatectl set-timezone Asia/Taipei

列出主機名稱相關資訊

hostnamectl

設定主機名稱為 SOME_NAME

以下使用者都以 SOME_NAME 舉例,表示某使用者

hostnamectl hostname SOME_NAME 
echo "SOME_NAME" >> /etc/hostname

反註解自己的語言設定

vim /etc/locale.gen

正式生成語言設定

locale-gen

啟用時間自動同步的系統服務

systemctl enable systemd-timesyncd

安裝 AUR

為 Arch 社群的套件庫,裏面各種五花八門的套件都有。事實上,真正使用應用程式時多數都不是使用 pacman,而是 AUR 的套件管理器: yay,用起來跟 pacman 一樣香。

另外注意到 yay 為了系統安全,不允許在管理者權限下安裝軟體,使用時應該作為一個正常使用者的情況下進行操作,而非 root。

sudo pacman -S git
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

yay 後我們可以先來補足前面缺少的一些小套件。

(Optional) 補齊 cpio

yay -S mkinitcpio-firmware

中文支援

yay -S ibus ibus-chewing libibus libchewing

另外可以先安裝 noto-fonts-cjknoto-fonts-emoji 預備。

日本語支援

如果前面已經裝過 ibus 就不用再裝了

yay -S ibus ibus-mozc

tty 終端機字型調整

安裝適配原生終端機的 bitmap 字型

sudo pacman -S terminus-font

單次設定字型

setfont <font-name.gz>

<font-name.gz> 有哪些選擇可至 cd /usr/share/kbd/consolefonts 查看。

然後設定每次開機的 tty 終端機字型,去 /etc/vconsole.conf 裡面加入 FONT=<font-name.gz>

How to Change Linux Console Fonts using Arch Linux - Change the font to actually see it!! (2021)

優雅強大的終端機設定 oh my zsh

提升開發效率 X, 心情愉快 O
oh my zsh 算效能比較低的,不過簡單好設定 OwO

建置目標

主體

Target Feature
Shell zsh 比起 bash 有更多開箱即用的功能,能輕鬆客製化
Framework oh my zsh 能裝很多主題、外掛的 zsh 框架
Theme powerlevel10k 極其美妙的終端機主題,內建可調整許多美觀與呈現資訊設定

外掛

  • zsh completion: 根據當前的輸入自動補全命令。
  • auto suggestion: 根據過往的命令與當前的輸入自動建議輸入。輸入時在背後會浮現淺色的提示。
  • syntax highlighting: 對命令加上顏色標註。合法的命令顯示綠色、不合法的為紅色、字串為黃色

下載並安裝必要套件

先安裝等等要用到的套件

sudo pacman -S git curl vim neofetch zsh

然後安裝 oh my zsh,接著下載 zsh 相關外掛於 oh my zsh 內。

使用 ZSH 變數將外掛放入 oh my zsh 內管理的命令自動化。

# install oh my zsh and zsh plugins
yes | sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# zsh-completion
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions
# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# powerlevel10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# after this, go into zsh
zsh

(以下為讓 powerlevel10k 能大展身手的等寬字型的安裝,非必要。)

powerlevel10k 官方建議,使用 Meslo Nerd Font 連體字型最合適,該網站列敘該如何安裝此字型,並在終端機中使用。

調整 zsh 客製化設定

接著進入 zsh 設定檔 ~/.zshrc

請使用 vim, nano, emacs, gedit 之類的文字編輯器,依照前面的命令的話,應該已經裝好 vim 了。

  1. powerlevel10k 主題加入設定
    找到 ZSH_THEME 參數,修改設定。
    ​​​​# Set name of the theme to load --- if set to "random", it will
    ​​​​# load a random theme each time oh-my-zsh is loaded, in which case,
    ​​​​# to know which specific one was loaded, run: echo $RANDOM_THEME
    ​​​​# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    ​​​​ZSH_THEME="powerlevel10k/powerlevel10k"
    
  2. 將前面 clone 進來的外掛程式庫加入設定
    注意 zsh complition 不應該直接加入 plugins 列表中。詳見 issue 603
    ​​​​# auto suggestion, syntax highlighting
    ​​​​plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
    ​​​​# zsh completion
    ​​​​fpath+=${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions/src
    
    另外,以上設定必須在 source $ZSH/oh-my-zsh.sh 這行以前,因為該行即是啟動 oh my zsh 與其管理之所有外掛。
  3. 啟用 powerlevel10k 主題
    儲存對 ~./zshrc 的修改,並用以下命令使其生效。
    ​​​​source ~/.zshrc
    
    此時 powerlevel10k 會根據當前終端機的字型提示我們跟如何完成此主題的快速調整。若對調整的結果不滿意,可使用 powerlevel10k 內建命令 p10k configure 來啟動快速設定程式。
  4. (Optional) 使用 neofetch
    neofetch 加入 .zshrc 的第一行,即可在每次開啟終端機時印出系統基本訊息。

開花結果

邁入圖形介面 Gnome

以 Gnome 為例,安裝只要一句就好,就是要稍等一下。

sudo pacman -S gnome

接著會問很多問題,無腦 Enter 是一個選擇,只是 Gnome 就會裝一堆你可能不想要的套件,最好可以查查那些套件都在做啥。

下面列出比較重要的幾個套件:

  • baobab: 硬碟空間分析
  • gdm: Gnome display manager
  • gnome-backgrounds
  • gnome-characters
  • gnome-color-manager
  • gnome-connections: 遠端連線
  • gnome-console: 陽春終端機 (拿來裝 gnome-terminal 後就可以忽視了)
  • gnome-control-center: 設定
  • gnome-disk-utility: 基礎易用的硬碟管理
  • gnome-font-viewer
  • gnome-keyring: 密碼管理器 (鑰匙圈)
  • gnome-logs
  • gnome-menus: 如其名,menu,也就是檢視所有軟體的軟體
  • gnome-remote-desktop
  • gnome-session
  • gnome-setting-daemon
  • gnome-shell
  • gnome-shell-extensions
  • gnome-software 就是軟體商店但真的沒多好用 0.0
  • gnome-system-monitor
  • gnome-user-docs ?!
  • gnome-user-share
  • grilo-plugins
  • gvfs
    • gvfs-* 都是輔助軟體
  • malcontent
  • mautilus: gnome 的檔案總管
  • Orca

然後啟用系統服務。

sudo systemctl enable gdm # enable gdm, will start service when next boot
sudo systemctl start gdm  # start gdm, switch to gnome immediately

Gnome 的基本設定與外掛

安裝 Gnome tweaks、gnome extension (根據不同版本的 Gnome 方法有異,就不記錄了)。

Gnome extensions 中建議安裝:

  • dash to dock: 讓工作列變得像 macOS
  • blur my shell: 讓頂端變的透明,像是 macOS
  • clipboard indicator: 顯示歷史複製文字列表
  • freon: 安裝第二個,有圖示的那個
  • net speed simplified: 顯示網速
  • alphabetical app grid
  • just perfection
  • AppIndicator and KStatusNotifierItem Support: 顯示 CPU 等的性能數據

GUI 下好用軟體安裝紀錄

  • Vscode

    以上官方推薦的三個都行,我是選 Microsoft 官方版。
    不要裝 Gnome software store 或者野雞版的,保證會讓你失望,功能東缺一塊西缺一塊。

    ​​​​yay -S visual-studio-code-bin
    
  • Discord + better discord
    ​​​​yay -S discord
    
    在 Linux 上裝 better discord 可見官網
    注意 better discord 的 themes 和 plugins 路徑為 ~/.config/BetterDiscord/{themes,plugins}

遠端作業

作為伺服器的 Arch Linux,需要確保能順暢遠端操作。

Wake On LAN 網路喚醒

WOL (Wake On LAN) 介紹

原理是特殊的網卡在電腦關機時,仍能接收 Magic Packet (魔法封包),接收到時透過 PCI 通知主機板開機。默認接收 Magic Packet 的 Port 為 97

魔法封包

魔法封包的內容為 6 bytes 的 F 和 96 bytes 的目標網卡 MAC 地址 (48 bits) 重複 16 遍。故封包大小為

6+488bit×16=102 (bytes)

魔法封包的細節原文,引自維基百科

The magic packet is a frame that is most often sent as a broadcast and that contains anywhere within its payload 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal), followed by sixteen repetitions of the target computer's 48-bit MAC address, for a total of 102 bytes.

設定 WOL

有三方面的設定要完成。

  1. 硬體
    首先確認主機板網卡是否支援 WOL (當今網卡基本上都支援)。
    接著進 BIOS,依照各個主機板不同的方式開啟 WOL 功能。

    比如本主機板華碩官網說要啟動 Power On By PCI-E 選項。

  2. OS 端
    以下簡單說明作法。
    1. 確認 ethtool 是否已安裝
      ​​​​​​​​sudo pacman -S ethtool
      
    2. 確認乙太網設備名稱
      ​​​​​​​​ip a # 列出所有網路設備與相應的連線資訊
      
      找到狀態為 UP 的乙太網卡,其名稱通常以 e 開頭,比如 ethX, enpXsY (X, Y 為某數字)。找到後,以下暫稱該乙太網卡為 ethX
    3. 確認乙太網設備狀態
      ​​​​​​​​sudo ethtool ethX
      
      會列出 ethX 的一系列狀態,其中 g 表有啟用 WOL;d 表未啟用。若只想單次設置 WOL,用以下命令即可。
      ​​​​​​​​sudo ethtool -s ethX wol g # 設定 ethX 的 wol 項目為 g (enable)
      
    4. 為網路介面設定自動啟用 WOL
      • 以 yay 安裝 wol-systemd
        ​​​​​​​​​​​​yay -S wol-systemd
        
      • 啟動系統服務

        @ 後面為監視 WOL 的網路介面

        ​​​​​​​​​​​​sudo systemctl enable wol@enp4s0
        
    以上方法即可一勞永逸。
    另外無線網卡的情況較複雜,而且 NAS 比較建議是走乙太網才較穩定且高速,故不特別介紹,有興趣者可參見本網站
  3. 啟動
    此時 server 已經準備好被喚醒。我們需將 Magic Packet 送至網卡所在之主機的 Port 9 (or 7)。
    可以使用手機、電腦等喚醒。比如 Andriod 手機的 WolOn、Linux/macOS 的 wakeonlan 套件 (macOS 可使用 brew 下載使用)。
    不過我也寫了個簡單的 Python 腳本可完成區域網路、網際網路 (IP/Domain name),請參考 wakeonlan 腳本
    • 區域網路喚醒
      wakeonlan 套件為例。預設會將 MAC_ADDRESS 發送至 255.255.255.255:9 (也就是 braodcast)。套件使用細節可用 wakeonlan 命令查詢。
      ​​​​​​​​wakeonlan MAC_ADDRESS
      
    • 網際網路喚醒
      除了要知道 MAC 地址,還需要知道 IP 位置。

      只要扯上網際網路,一切就麻煩起來了 :p

      為此要解決兩個問題:
      • 家用環境下,可能會遇到浮動 IP 的議題,此時可使用 DDNS 服務,或者將 IP 轉為固定 IP。
      • 要調整 Port Forwarding,將封包傳遞至正確的 LAN IP + Port。(常見是 External Port 9 傳遞至Host_LAN_IP:9)

SSH 設定

ssh 方便我們在遠端控制電腦,可依此使用 SSHFS, VSCode remote service 等方便功能。

  • 安裝

    其實前面已經做過這件事了。

    ​​​​sudo pacman -S openssh
    
  • 啟用
    ​​​​sudo systemctl enable sshd # enable ssh server
    
  • 確認伺服器端狀態是否正常
    ​​​​sudo systemctl status sshd # you should see 
    
    應該看到類似以下結果。確認 ssh.servicevendor presetenable,前者表當前是否啟用服務,後者表啟動時是否自動啟用本服務 (ssh)。
    ​​​​● sshd.service - OpenBSD Secure Shell server
    ​​​​ Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    ​​​​ Active: active (running) since ...
    
  • (Optional) 將本地 ssh 公鑰加入伺服器
    ​​​​ssh-copy-id IP_OF_SERVER
    

Anydesk 遠端工作

yay -S anydesk-bin

目前 anydesk 只支援 x-window GUI,wayland 這種比較新的不行,可用以下指令確認:

echo $XDG_SESSION_TYPE

如果出現 x11 表 ok,wayland 的話目前不行,可以 sign out 後在輸入密碼處右下角選擇 gnome-xorg 便可。

然後設定無人值守功能,這樣就不用每次連線時都需要在 host 點確認。

另外 Anydesk 實際上整合了 WOL 功能,>w0 很好用ㄉ

Hyprland

為基於 Wayland 的 GUI,以高效絢麗著稱。

首先安裝 Hyprland

sudo pacman -S hyprland

然後安裝 Hyprland 小工具

yay -S kitty waybar-hyprland otf-font-awesome network-manager-applet brightnessctl pw-volume hyprshot power-profiles-daemon wofi hyprpaper swayidle swaylock wlogout dunst cliphist pipewire pipewire-pulse wireplumber pavucontrol xorg xorg-xwayland xdg-desktop-portal-hyprland xdg-desktop-portal-gtk polkit-kde-agent qt5-wayland qt6-wayland qt5ct nwg-look udiskie greetd greetd-tuigreet chezmoi fcitx5-im fcitx5-chewing fcitx5-qt fcitx5-gtk fcitx5-chinese-addons