跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

2024: 从头安装 Arch Linux 记录

新的一年新的开始… 顺便把之前的 Ubuntu 给“扬”了。

本文很多内容都是基于官方维基的安装说明

※ 本文需要一些 bash 脚本语法相关的基础。如果你不习惯在终端进行操作,更推荐你选择一个易于上手的基于 Arch Linux 的发行版,或换用基于 Debian 的 Linux 发行版(Ubuntu 等)。

简短 bash 小课程
value=1 # 这是一个变量
echo "value=${value}" # 显示变量的内容
# 显示「value=1」

arr=() # 定义一个空的数组变量
arr+=(1 2 3) # 将 1、2、3 加入这个数组
arr+=(4 5) # 将 4、5 加入数组的末尾
echo "arr=${arr[@]}" # 输出数组内的所有内容
# 显示「arr=1 2 3 4 5」

# 使用某个文件属性写出文件
install -m0755 <(
    cat <<EOF
Hello! I'm ${USER}.
EOF
) /tmp/hello.txt

# 查看刚刚写出的文件
cat /tmp/hello.txt
# 显示「Hello! I'm jixun.」

# 删除刚刚写出的临时文件
rm /tmp/hello.txt

1. 设备环境 #

  • AMD Ryzen 台式机 + UEFI 启动
  • AMD 显卡
  • 独立的一块硬盘,分区表见下方
  • 英式键盘布局

分区信息,位于 /dev/sda

# parted /dev/sda print
Model: ATA CT2000MX500SSD1 (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  1075MB  1074MB  fat32                 boot, esp
 2      1075MB  35.4GB  34.4GB  linux-swap(v1)        swap
 4      35.4GB  585GB   549GB   ext4
 3      585GB   2000GB  1416GB  ext4

计划安装:

  • 分区规划
    • /dev/sda1: 引导分区,使用 systemd-boot
    • /dev/sda2: Swap 暂存区域
    • /dev/sda3: 额外数据储存分区,挂载至 /edata
    • /dev/sda4: 操作系统,挂载至 /
  • 软件包 (大方向)
    • Wayland 协议
    • KDE 全家桶 + SDDM
    • yay - 安装第三方 AUR 包
    • 常用开发相关包
    • Fcitx 中文输入支持

2. 下载镜像 #

在官网随便挑一个就好,我使用的是 archlinux-2024.01.01-x86_64.iso

3. 引导镜像 #

因为有一个提前装好了 Ventoy 维护用的 USB 储存设备,直接放入进去后引导即可。

尝试过 Normal 和 Grub 2 引导选项都能正常进入系统。

4. 准备安装 #

因为我是用的是台式机且加入了带有 DHCP 支持的有线连接,无需额外配置网络。

该节的脚本可以在下方的附件下载并根据自己需要来修改:

※ 如果发现上述附件内容和文章内容不匹配,请评论告知。

键盘布局 #

首先是调整键盘布局,防止部分符号映射错误(如 @"):

loadkeys uk

分区配置 #

因为已经知道如何规划分区,直接格式化即可:

# 格式化系统分区和 Swap 区域
mkfs.ext4 /dev/sda4
mkswap /dev/sda2

然后就是挂载并启用 Swap:

mount /dev/sda4 /mnt
mount --mkdir /dev/sda1 /mnt/boot
mount --mkdir /dev/sda3 /mnt/edata
swapon /dev/sda2

初始化系统 #

初始化非常简单,照着官方维基操作即可:

pacstrap -K /mnt base linux-lts linux-firmware
genfstab -U /mnt >> /mnt/etc/fstab

如果你对内核版本的需求更为激进,也可以将 linux-lts 替换为 linux

5. 进入“虚拟环境”继续安装 #

这个环境中只能访问指定目录下的文件,因此需要提前挂载好所需的设备。

arch-chroot /mnt

下述章节的指令,若非特意注明,否则都需要在这个虚拟环境中执行。

安装常用包 #

虽然有一部分包可以等进入系统后再安装,但提前安装也不会有什么问题。

此处使用的是 bash 的数组进行包数据的管理。建议提前根据自己需要来搭建这个安装脚本,然后一次性安装所有包。

建议写出到 install.sh,方便更改和检查;编写完后再使用 bash install.sh 进行安装。

# 当前脚本解释器为 bash

pkgs=()

系统基本运行 #

加几个常用的文件系统和显卡驱动:

pkgs+=(exfatprogs e2fsprogs xfsprogs)                   # 文件系统
pkgs+=(mesa vulkan-radeon libva-mesa-driver mesa-vdpau) # 显卡驱动

开发相关 #

pkgs+=(base-devel binutils cmake ninja git pacman-contrib) # 常用

pkgs+=(boost) # cpp libs
pkgs+=(python-lsp-server bash-language-server)
pkgs+=({yaml,typescript,yaml,eslint}-language-server)
pkgs+=(nodejs npm pnpm yarn)
pkgs+=(go hugo)
pkgs+=(docker docker-compose)
pkgs+=(python python-pip)
pkgs+=(jdk17-openjdk) # JDK + 运行时
pkgs+=(openssh)       # ssh

网络支持 #

本节参考了官方文档列出的各个网络管理器。

其中以 Network Manager 为基础的一系列是支持最全的方案且提供 GUI 操作,把所有需要的包都加进去:

# Network
pkgs+=(networkmanager rp-pppoe modemmanager iwd)
pkgs+=(dnsutils inetutils iproute2)

实用工具 #

这方面的话仁者见仁,根据自己需要搭配吧。

pkgs+=(bash bash-completion)
pkgs+=(vi vim)
pkgs+=(nano nano-syntax-highlighting)
pkgs+=(man-db man-pages texinfo) # docs
pkgs+=(bc gawk pv rsync jq)      # shell scripting
pkgs+=(openssl curl wget tree htop tree tmux sudo)
pkgs+=(neofetch)
pkgs+=(reflector cronie)
pkgs+=(pyside2)                                      # qt
pkgs+=(tar zip unzip gzip xz bzip2 unrar p7zip zstd) # archive

引导相关 #

选择的是 systemd-boot,因为系统的 systemd 包已经自带了。

因为是 AMD CPU,因此微码更新选择 amd-ucode

# CPU patches / Boot Loader
pkgs+=(amd-ucode) # amd-ucode _OR_ intel-ucode
pkgs+=(efibootmgr efivar)
# systemd-boot, no extra packages required
# https://wiki.archlinux.org/title/Systemd-boot

图形界面 #

打算是尽量拥抱 Wayland。

首先是 kde 系列:

# gui stuff
pkgs+=(xorg-xwayland sddm weston)               # wayland and whatnot
pkgs+=(kwin plasma-meta plasma-wayland-session) # kde 桌面环境

# kde 全家桶
# pkgs+=(kde-applications-meta)

# 或者只安装自己需要的组件
pkgs+=(kde-accessibility-meta)
pkgs+=(kde-education-meta)
pkgs+=(kde-games-meta)
pkgs+=(audiocd-kio ffmpegthumbs kmix) # kde-multimedia-meta
pkgs+=(gwenview qt{5,6}-imageformats kimageformats5 svgpart kdesdk-thumbnailers)
pkgs+=(kamera kcolorchooser kolourpaint okular spectacle)
# pkgs+=(kde-pim-meta) # 个人信息管理软件
pkgs+=(kde-system-meta kde-utilities-meta) # 系统工具

然后是媒体播放支持:

# 媒体播放支持
#pkgs+=(gstreamer gst-libav gst-plugins-{base,good,ugly})
pkgs+=(vlc mpv phonon-qt5-vlc ffmpeg)

最后是一些图形界面相关的应用或依赖:

pkgs+=(dolphin-plugins kdegraphics-thumbnailers kdenetwork-filesharing)  # dolphi extras
pkgs+=(pipewire wireplumber pipewire-{audio,alsa,pulse,jack})            # audio
pkgs+=(firefox)                                                          # 浏览器
pkgs+=(print-manager cups system-config-printer)                         # 打印支持
pkgs+=(hplip)                                                            # HP 打印机支持
pkgs+=(tesseract-data-{chi_sim{,_vert},chi_tra{,_vert},eng})             # OCR
pkgs+=(noto-fonts-cjk ttf-sarasa-gothic ttf-cascadia-code-nerd)          # 字体
pkgs+=(fcitx5-{im,rime,chinese-addons,table-extra,breeze,pinyin-zhwiki}) # 输入法

开始安装基础包 #

包准备好后就可以安装了

pacman -Sy # 刷新缓存
pacman -S --needed "${pkgs[@]}"

安装 AUR 支持和常用包 #

照着 yay 的文档安装 aur 助手:

# 安装 yay
(
    pacman -S --needed git base-devel
    git clone https://aur.archlinux.org/yay-bin.git /tmp/yay-bin
    cd /tmp/yay-bin
    makepkg -si
    rm -rf /tmp/yay-bin
)

然后安装需要的包:

aur=()
aur+=(visual-studio-code-bin) # vscode
aur+=(ttf-roboto ttf-paratype ttf-cascadia-{code,mono}-nerd) # 字体

配置软件与服务 #

部分软件安装后还需要启用对应的服务。

建立用户 #

建立日常使用的帐号,并将其加入 adm 以及 wheel 组。

useradd -m -G adm,wheel -s /bin/bash jixun
passwd jixun # 设置密码

然后配置 sudo 使其允许 wheel 组的用户进行提权:

install -m0440 <(
    cat <<EOF
# 允许 wheel 组的用户执行 sudo
%wheel ALL=(ALL:ALL) ALL
EOF
) /etc/sudoers.d/jixun_admin

配置网络 #

为了方便,使用 systemd-resolved 进行域名解析,并启用加密。

## network related
systemctl enable systemd-resolved
install -d -m0755 /etc/systemd/resolved.conf.d/
install -m0644 <(
    cat <<EOF
[Resolve]
DNS=1.0.0.1#cloudflare-dns.com 8.8.4.4#dns.google
FallbackDNS=1.1.1.1#cloudflare-dns.com 9.9.9.9#dns.quad9.net

# 使用加密 DNS
DNSSEC=yes
DNSOverTLS=yes

# mDNS 内网发现
MulticastDNS=yes
EOF
) /etc/systemd/resolved.conf.d/60-jixun.conf

如果安装了 NetworkManager,启用该服务:

command -v nmcli && systemctl enable NetworkManager

如果安装了 iwd 作为无线网络认证的后端,也需要配置:

if pacman -Qs iwd >/dev/null; then
    install -d -m 755 /etc/NetworkManager/conf.d/
    install -m0644 <(
        cat <<EOF
[device]
# 使用 iwd 来提供无线网络加密后端
wifi.backend=iwd
EOF
    ) /etc/NetworkManager/conf.d/wifi_backend.conf
fi

最后指定设备的主机名:

echo 'annie' >/etc/hostname

打印支持 #

启用 cups 服务即可。

# cups 打印支持
if pacman -Qs cups >/dev/null; then
    systemctl enable cups
fi

时区 & NTP 同步 #

需要的包已经有了,直接启用然后配置下设定即可。

## time config
ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime
systemctl enable systemd-timesyncd
hwclock --systohc

系统语系 #

首先编辑 /etc/locale.gen,取消注释 en_GB.UTF-8en_US.UTF-8zh_CN.UTF-8 行。

nano /etc/locale.gen

根据需要编辑好后,初始化并配置默认语系:

locale-gen
echo 'LANG=en_US.UTF-8' >/etc/locale.conf

然后设定默认键盘布局:

echo 'KEYMAP=uk' >/etc/vconsole.conf

配置引导 #

systemd-boot 并不会自动安装到硬盘上并注册,使其能引导。

简单配置一下即可。注意下方的 /dev/sda4 是我系统分区的设备路径。

## Bootloader
bootctl install

# 记住上次引导项目并支持 Windows 加密分区引导
echo "
# Jixun's changes BEGIN
default @saved
reboot-for-bitlocker yes
# Jixun's changes END
" >>/boot/loader/loader.conf

# 配置启动项
cat >/boot/loader/entries/arch.conf <<EOF
title   Arch Linux
linux   /vmlinuz-linux-lts
initrd  /amd-ucode.img
initrd  /initramfs-linux-lts.img
options root=UUID=$(blkid -o value -s UUID /dev/sda4) rw quiet splash
EOF
cat >/boot/loader/entries/arch-fallback.conf <<EOF
title   Arch Linux (fallback)
linux   /vmlinuz-linux-lts
initrd  /amd-ucode.img
initrd  /initramfs-linux-lts-fallback.img
options root=UUID=$(blkid -o value -s UUID /dev/sda4) rw
EOF

然后就是配置自动更新引导:

# auto update bootloader
install -d -m755 /etc/pacman.d/hooks/
cat >/etc/pacman.d/hooks/95-systemd-boot.hook <<'EOF'
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd

[Action]
Description = Gracefully upgrading systemd-boot...
When = PostTransaction
Exec = /usr/bin/systemctl restart systemd-boot-update.service
EOF

配置 SDDM 登入界面 #

简单配置下使用搭配 KDE 风格的 breeze 主题,并启用 Wayland 即可:

systemctl enable sddm
install -d -m755 /etc/sddm.conf.d/
cat >/etc/sddm.conf.d/10-wayland.conf <<'EOF'
[General]
DisplayServer=wayland

# 如果屏幕是 HiDPI,取消注释下一行文字(删除下一行开头的「#」符号)来适应高分屏
#GreeterEnvironment=QT_SCREEN_SCALE_FACTORS=2,QT_FONT_DPI=192

[Theme]
Current=breeze
EOF

※ 使用 Wayland 渲染 SDDM 的话会依赖 weston

启用 Docker #

将自己的用户组加进去,并启用服务即可。

if command -v docker >/dev/null; then
    usermod -aG docker jixun
    systemctl enable docker
fi

VLC 初始化缓存 #

或许需要进入系统后执行才会生效?不清楚了。

# VLC
if [[ -f /usr/lib/vlc/vlc-cache-gen ]]; then
    /usr/lib/vlc/vlc-cache-gen /usr/lib/vlc/plugins
fi

6. 退出并重启 #

一个基本的系统就这样安装好了,现在可以尝试重启进去看看了:

exit # 退出虚拟环境

reboot # 重新启动

7. 进入 KDE 桌面环境 #

重新启动后进入 SDDM 提供的登入界面,选中用户名并键入之前设定的密码即可。

进去后稍微配置下:

  • 系统设定 > 虚拟键盘 > Fcitx 5
  • Fcitx5 配置主题与输入法(Rime)
  • 系统设定 > 默认程序 > 浏览器设定为 Firefox
  • git 用户名/邮箱等设定
  • 如此这般…

※ 除非特别说明,否则请不要使用 root 权限执行该节指令。

首先建立很多配置都需要的 KDE 环境变量目录:

install -d -m700 "$HOME/.config/plasma-workspace/env/"

调整语系 #

打开开始菜单并检索「Region & Language」,对「地区和语言」进行设定。

KDE 更改这项设定后会有奇怪的问题,具体表现为 LANG 变量为 en_GB 而非 en_GB.UTF-8(丢失 .UTF-8 部分)。部分应用会因此报错,并某些应用会拒绝激活 fcitx 输入法。

你可以在终端输入 locale 指令来查看是否有错误:

[jixun@annie ~]$ locale >/dev/null
locale: Cannot set LC_ALL to default locale: No such file or directory

此时可以打开对应的配置文件:

nano ${HOME}/.config/plasma-localerc

针对自己的需求补上 .UTF-8 后缀:

 [Formats]
-LANG=en_GB
+LANG=en_GB.UTF-8
 
 [Translations]
-LANGUAGE=en_GB
+LANGUAGE=en_GB.UTF-8

之后再重新登入 KDE 环境,恢复正常。

补充 X11 语系设定 #

部分旧的依赖 x11 的程序可能需要设定 x11 的键盘映射设定。

sudo localectl set-x11-keymap gb

启用 fcitx5 输入法框架 #

打开开始菜单,检索「Virtual Keyboard」选择虚拟键盘。

在弹出的窗口选择「Fcitx 5 Wayland Launcher」,然后点击右下角的应用即可。

部分尚未迁移至原生 Wayland 的程序仍然无法输入,此时需要添加额外的环境变量来启用。

打开终端执行下述指令即可:

cat >"$HOME/.config/plasma-workspace/env/fcitx.sh" <<'EOF'
# 为 XWayland 环境提供输入支持
export XMODIFIERS=@im=fcitx
EOF

Java 应用渲染黑框 #

某些 Java 应用程序会将提示框或右键菜单错误渲染成黑框。

GoLand 下错误的将弹出框渲染成黑框

根据说明加上 _JAVA_AWT_WM_NONREPARENTING 环境变量即可1

cat >"$HOME/.config/plasma-workspace/env/java_awt_fix.sh" <<'EOF'
# 修复 Java 渲染,参考 https://bugs.openjdk.org/browse/JDK-8058197
export _JAVA_AWT_WM_NONREPARENTING=1
EOF

VSCode #

# VSCode: 原生 Wayland 支持
cat >"$HOME/.config/code-flags.conf" <<EOF
--ozone-platform-hint=auto
--enable-wayland-ime
EOF

如果遇到闪退问题,可以删除上述配置文件的选项:

rm "$HOME/.config/code-flags.conf"

※ 目前发现最大化窗口可能会导致应用闪退2;手动调整窗口大小没有问题。

配置完成? #

配置完成后重新启动一次系统,确保各项设定正常生效。

8. 合影 #

Neofetch 截图

A.1. 小插曲 #

创新科技(Creative)的喇叭在 Linux 下经常出毛病,症状为突然无音频输出,且喇叭上的控制按键无反应,需要断电重启才能恢复。

翻查 dmesg 日志发现报告的错误是带宽不够:

[   37.991424] usb 1-2.3: Not enough bandwidth for new device state.
[   37.991433] usb 1-2.3: Not enough bandwidth for altsetting 1
[   37.991436] usb 1-2.3: 1:1: usb_set_interface failed (-28)

但是我明明接入的是 USB 3.0 的口?!传输喇叭所需的数据应该绰绰有余才是。

一番资料查找后怀疑可能是 USB 2.0 设备在 USB 3.0 口的兼容性问题。于是我尝试在中间接了一根USB 2.0/480Mbps规格的延长线,这个问题就消失了。

凑合着用吧;以后可以试试把连接喇叭(Type-C 口)到主板的线更换为 USB 2.0 规格的线。

A.2. 010editor 无法启动 #

正常通过 yay 安装:

yay -S 010editor

但是问题来了:

  1. 无法启动。具体表现为启动后无窗口弹出,后台可能会残留进程。
  2. 即便改了环境变量能启动,在 HiDPI 200% 缩放的情况下窗口界面、图标等资源未能正常缩放显示。

修正方案:

  1. 替换原始可执行文件为启动脚本
  2. 添加额外的 QT 框架接受的环境变量,使其在 HiDPI 200% 时能正常显示。
git clone https://github.com/jixunmoe/010editor-arch.git /tmp/010editor-arch
sudo /tmp/010editor-arch/install.sh
rm -rf /tmp/010editor-arch

# 如果已经启动,干掉它
pkill -9 010editor

最后来张合影:

010editor 截图

A.3. IntelliJ / JetBrains 产品 #

直接通过 AUR 安装的 JetBrains 产品使用的 Java 运行环境(Java Runtime Environment (JRE)) 不能正常识别 HiDPI 环境。需要替换为 JetBrains 修补后的 JRE。

解决方案步骤3

  • 启动 IDE 本体并打开一个项目(进入到主界面)
  • 菜单栏 → 帮助(Help)查找动作(Find Action)(也可以通过快速按下两次 Shift 键呼出该界面)
  • 键入「Choose Boot Java Runtime for the IDE」,选择第一项「选择 IDE 的启动 Java 运行时(Choose Boot Java Runtime for the IDE)
  • 从「新建」下拉菜单选择「17.0.10b1087」或更高版本4
  • 等待片刻,根据提示重启 IDE 即可。

A.4. 休眠问题 #

离开电脑去吃饭,回来发现电脑进入了休眠模式。

尝试通过键鼠唤醒无效。电源键按下也无效,怀疑某个外部供电设备导致电源键失效,但是拔除接到主板的 USB 设备后依然无法唤醒;只能强行断电来重新启动设备。

重新启动后,尝试手动进入休眠模式,发现会自动唤醒。翻查对应文章,查看对应的可唤醒的设备并检查 USB 设备:

$ cat /proc/acpi/wakeup  | grep -E 'EHC|XHC'
XHC0      S4    *enabled  pci:0000:0d:00.3

发现 USB 3.0 控制器,将其禁用:

echo 'XHC0' | sudo tee /proc/acpi/wakeup

再次休眠系统,不会自动唤醒。但是现在也无法使用键鼠进行唤醒… 但也可以知道是某个 USB 设备的锅了。

一番排查后,将所有 USB 设备(包括集线器(USB Hub)上的线)都挨个拔除、插入后测试,发现问题解决。※ 事后怀疑是因为测试时太久没碰鼠标,鼠标提前进入休眠模式,因此绕过了「休眠时瞬间唤醒」的问题。

怀疑可能是某个地方接触不良或和电线太近有干扰?等有时间把它们隔远点。

最后发现是罗技无线鼠标的「USB 接收器(Logi Bolt USB Receiver)」」在作怪… 安装 solaar 后并让它后台自动启动后,重启设备(或重新插拔 USB 接收器亦可)后修正了。

# 安装
sudo pacman -S solaar

# 设置自动启动
cat >"${HOME}/.config/autostart/Solaar.desktop" <<'EOF'
[Desktop Entry]
Exec=solaar -w hide
Icon=solaar
Name=Solaar
Path=
Terminal=False
Type=Application
EOF

0. 更新记录 #

  • 2024.01.28
    • 添加 KDE 环境变量配置来增强 fcitx5 输入法支援。
    • 添加 JetBrains 产品说明
    • 奇怪的休眠问题排查
  • 2024.02.05
    • 搞定奇怪的休眠瞬间唤醒问题。

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区