本文为针对特定设备的 Arch Linux 安装记录, 不具有普适性, 仅供参考

本文内容持续保持更新 (或许?)

硬件配置

型号: 华硕天选 5 pro 锐龙版 (对应国外型号: ASUS TUFGaming A16 2024 FA607PV)

CPU: AMD Ryzen 9 7940HX with Radeon Graphics

内存: SAMSUNG DDR5 5200MHZ 32GB (出厂 16GB, 后加装 16GB)

硬盘: WD PC SN560 SDDPNQE-1T00-1102 1TB, KIOXIA-EXCERIA PLUS G3 SSD 1TB (后加装)

GPU: AMD Radeon™ 610M, NVIDIA GeForce RTX 4060 Laptop GPU

安装步骤

预安装

制作 USB 启动盘并启动 live 环境

下载 Arch Linux ISO, 并进行 SHA256 校验, 然后使用 Rufus 写入到 U 盘 (默认写入选项即可, 以 ISO 模式写入)

进入电脑 UEFI (BIOS) 页面, 关闭安全启动和快速启动, 显示模式设置为动态 (arch iso 不带 nvidia-open 驱动)

电脑启动到 U 盘的 arch live 环境

连接到互联网

这里有线网络会尝试 DHCP 连接网络, 可跳过

若连接到无线网络, 则使用 iwctl 连接, 步骤如下:

查看无线网卡设备并确保已开启

1
iwctl device list

扫描并查看可用网络

1
2
iwctl station <device> scan
iwctl station <device> get-networks

连接网络

1
iwctl station <device> connect <SSID>

检查互联网连接

1
ping ping.archlinux.org

更新系统时钟

确保系统时钟同步

1
timedatectl

磁盘分区

对于不同类型的设备, 设备路径和分区路径有所不同:

  • m.2 接口的 nvme 协议设备: /dev/nvme1n1
    • boot partition: /dev/nvme1n1p1
    • swap partition: /dev/nvme1n1p2
    • root partition: /dev/nvme1n1p3
  • sata 接口或 usb 接口设备: /dev/sda
    • boot partition: /dev/sda1
    • swap partition: /dev/sda2
    • root partition: /dev/sda3

查看要安装系统的磁盘设备

1
fdisk -l | less

抹除磁盘

1
wipefs --all <disk>

交互模式进行硬盘分区

1
cfdisk <disk>

分区类型选 GPT

分区方案:

Mount Point Partition type GUID Size
/boot C12A7328-F81F-11D2-BA4B-00A0C93EC93B: EFI System 1GB
[SWAP] 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F: Linux swap 32GB
/ 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709: Linux root (x86-64) Remainder

parted 命令硬盘分区分区

1
2
3
4
5
6
7
8
9
10
11
parted <disk> --script \
mklabel gpt \
mkpart "\"EFI System\"" fat32 1MiB 1025MiB \
set 1 esp on \
mkpart "\"Linux swap\"" linux-swap 1025MiB 33793MiB \
mkpart "\"Linux root (x86-64)\"" ext4 33793MiB 100% \
type 3 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
# 让内核识别到硬盘分区更改
partprobe <disk>
# 若写在脚本里建议等待一段时间
# sleep 2

查看分区更改

1
fdisk -l <disk>

格式化分区

1
2
3
mkfs.fat -F 32 <boot-partition>
mkswap <swap-partition>
mkfs.ext4 <root-partition>

检查格式化分区

1
lsblk -f <disk>

挂载文件系统

1
2
3
mount <root-partition> /mnt
mount --mkdir <boot-partition> /mnt/boot
swapon <swap-partition>

安装

选择镜像

1
2
3
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
curl -L 'https://archlinux.org/mirrorlist/?country=CN&protocol=https' -o /etc/pacman.d/mirrorlist
sed -i 's/^#Server/Server/' /etc/pacman.d/mirrorlist

安装必要软件包

1
2
3
4
5
6
7
8
pacstrap -K /mnt \
base base-devel \
linux linux-firmware \
amd-ucode \
networkmanager modemmanager usb_modeswitch \
nano vi vim \
man-db man-pages texinfo \
sudo bluez bluez-utils wget git openssh

安装内容详解:

  • base, base-devel, linux, linux-firmware: 基础包, 包含基础内核, 固件, 应用程序. base-devel 是后面安装 nvidia-laptop-power-cfg 中 makepkg 的依赖
  • amd-ucode: AMD CPU 微码
  • networkmanager, modemmanager, usb_modeswitch: 网络管理, 后两者为 PPPoE 上网需要 (可选)
  • nano, vi, vim: 文本编辑器, 其中 vi 是 visudo 的默认编辑器, 若不选择安装则须额外配置全局默认编辑器
  • man-db, man-pages, texinfo: 命令帮助手册
  • sudo: 以非 root 用户身份执行特权命令
  • bluez, bluez-utils: 蓝牙相关
  • wget, git, openssh: 常用软件

配置系统

Fstab

在启动时安装所需的文件系统

1
genfstab -U /mnt | tee -a /mnt/etc/fstab

Chroot

将 root 转换到新系统中

1
arch-chroot /mnt

时间

1
2
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

地区

1
2
3
4
5
cp /etc/locale.gen /etc/locale.gen.bak
sed -i '/en_US.UTF-8/s/^#//' /etc/locale.gen
sed -i '/zh_CN.UTF-8/s/^#//' /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" | tee -a /etc/locale.conf

网络配置

1
echo "asus" | tee -a /etc/hostname

Root 密码

1
passwd

Boot loader

Asus Linux 推荐使用 systemd-boot

1
2
3
4
5
6
7
8
9
10
11
12
bootctl install
bootctl --variables=no --graceful update

echo "title Arch Linux" | tee -a /boot/loader/entries/arch.conf
echo "linux /vmlinuz-linux" | tee -a /boot/loader/entries/arch.conf
echo "initrd /amd-ucode.img" | tee -a /boot/loader/entries/arch.conf
echo "initrd /initramfs-linux.img" | tee -a /boot/loader/entries/arch.conf
echo "options root=PARTUUID=$(blkid -s PARTUUID -o value <root-partition>) rw nvidia_drm.fbdev=1" | tee -a /boot/loader/entries/arch.conf

echo "default arch.conf" | tee -a /boot/loader/loader.conf
echo "timeout 3" | tee -a /boot/loader/loader.conf
bootctl update

用户管理

1
2
3
4
5
echo "%wheel ALL=(ALL:ALL) ALL" | tee /etc/sudoers.d/user-access
chmod 0440 /etc/sudoers.d/user-access
visudo -c
useradd -m -G wheel user
passwd user

将必要服务设置为开机自启动

1
2
3
4
5
systemctl enable NetworkManager.service
systemctl enable ModemManager.service
systemctl enable systemd-resolved.service
systemctl enable bluetooth.service
systemctl enable sshd.service

重启系统

1
2
3
4
exit
cp /etc/pacman.d/mirrorlist.bak /mnt/etc/pacman.d/
umount -R /mnt
poweroff

关机后移除 U 盘, 并将 Arch Linux 启动项设置为首位 (可选)

安装后

以非 root 用户登录系统

添加 asus linux 源

1
2
3
4
5
6
7
8
9
10
11
12
13
wget "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x8b15a6b0e9a3fa35" -O g14.sec
sudo pacman-key -a g14.sec
sudo pacman-key --finger 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
sudo pacman-key --lsign-key 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
sudo pacman-key --finger 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
rm g14.sec
sudo cp /etc/pacman.conf /etc/pacman.conf.bak
echo "" | sudo tee -a /etc/pacman.conf
echo "[g14]" | sudo tee -a /etc/pacman.conf
echo "# Server = https://arch.asus-linux.org" | sudo tee -a /etc/pacman.conf
echo "Server = https://naru.jhyub.dev/\$repo" | sudo tee -a /etc/pacman.conf
sudo sed -i '/\[multilib\]/,/Include = \/etc\/pacman.d\/mirrorlist/ s/^#//' /etc/pacman.conf
sudo pacman -Syu

安装 asusctl

1
2
3
4
# python-gobject 解决 powerprofilesctl 报错
sudo pacman -S asusctl power-profiles-daemon python-gobject
sudo systemctl enable --now power-profiles-daemon.service
reboot

安装显卡驱动

1
2
3
4
5
sudo pacman -S --needed \
nvidia-open nvidia-utils lib32-nvidia-utils \
mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon \
vulkan-icd-loader lib32-vulkan-icd-loader
reboot

安装 nvidia-laptop-power-cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git clone https://gitlab.com/asus-linux/nvidia-laptop-power-cfg.git /home/user/nvidia-laptop-power-cfg
cd /home/user/nvidia-laptop-power-cfg
makepkg -sfi
sudo systemctl enable nvidia-suspend.service nvidia-hibernate.service nvidia-resume.service
sudo systemctl enable --now nvidia-powerd
cd /home/user
rm -rf /home/user/nvidia-laptop-power-cfg
# 检查命令
# cat /proc/driver/nvidia/gpus/<bus_address>/power
# 检查结果应该如下所示
# S0ix Power Management:
# Platform Support: Supported
# Status: Enabled
reboot

安装音视频组件

1
2
3
4
5
6
7
8
9
sudo pacman -S --needed \
libva-nvidia-driver libvdpau-va-gl libva-utils \
vdpauinfo vulkan-tools
sudo pacman -S --needed \
sof-firmware alsa-firmware alsa-utils \
pipewire lib32-pipewire wireplumber \
pipewire-audio pipewire-alsa pipewire-pulse pipewire-jack lib32-pipewire-jack
systemctl --user enable --now pipewire pipewire-pulse wireplumber
reboot

安装 KDE 和常用软件

1
2
3
4
5
6
7
8
9
10
11
sudo pacman -S --needed noto-fonts noto-fonts-cjk noto-fonts-emoji
sudo pacman -S --needed plasma-meta konsole dolphin qt6-multimedia-ffmpeg kwalletmanager
sudo pacman -S --needed rog-control-center
sudo pacman -S --needed fcitx5-im fcitx5-chinese-addons fcitx5-pinyin-zhwiki
sudo pacman -S --needed firefox
sudo pacman -S --needed btop
# 测试
# sudo systemctl start plasmalogin
# 启用桌面
sudo systemctl enable plasmalogin
reboot

一些错误修复

1
2
3
4
5
6
7
8
9
sudo pacman -S fuse2
sudo pacman -S unzip 7zip tmux tree firewalld ttf-cascadia-code-nerd krdc libayatana-appindicator
sudo systemctl enable firewalld
sudo ln -sf /usr/lib/qt6/bin/qtpaths /usr/bin/qtpaths
sudo cp /etc/asusd/asusd.ron /etc/asusd/asusd.ron.bak
sudo sed -i 's/platform_profile_on_ac: Performance/platform_profile_on_ac: Quiet/' /etc/asusd/asusd.ron
asusctl aura effect static -c ffffff
# 执行 sudo systemctl restart asusd 会卡住, 原因未知
reboot

修改 KDE 设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
kwriteconfig6 --file powerdevilrc --group AC --group Display --key DimDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group AC --group Display --key DimDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group AC --group Display --key TurnOffDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group AC --group Display --key TurnOffDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group AC --group SuspendAndShutdown --key AutoSuspendAction 0
kwriteconfig6 --file powerdevilrc --group AC --group SuspendAndShutdown --key LidAction 0
kwriteconfig6 --file powerdevilrc --group AC --group SuspendAndShutdown --key PowerButtonAction 0
kwriteconfig6 --file powerdevilrc --group Battery --group Display --key DimDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group Battery --group Display --key DimDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group Battery --group Display --key TurnOffDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group Battery --group Display --key TurnOffDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group Battery --group SuspendAndShutdown --key AutoSuspendAction 0
kwriteconfig6 --file powerdevilrc --group Battery --group SuspendAndShutdown --key LidAction 0
kwriteconfig6 --file powerdevilrc --group Battery --group SuspendAndShutdown --key PowerButtonAction 0
kwriteconfig6 --file powerdevilrc --group BatteryManagement --key BatteryCriticalAction 0
kwriteconfig6 --file powerdevilrc --group LowBattery --group Display --key DimDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group LowBattery --group Display --key DimDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group LowBattery --group Display --key TurnOffDisplayIdleTimeoutSec -- -1
kwriteconfig6 --file powerdevilrc --group LowBattery --group Display --key TurnOffDisplayWhenIdle false
kwriteconfig6 --file powerdevilrc --group LowBattery --group Display --key UseProfileSpecificDisplayBrightness false
kwriteconfig6 --file powerdevilrc --group LowBattery --group SuspendAndShutdown --key AutoSuspendAction 0
kwriteconfig6 --file powerdevilrc --group LowBattery --group SuspendAndShutdown --key LidAction 0
kwriteconfig6 --file powerdevilrc --group LowBattery --group SuspendAndShutdown --key PowerButtonAction 0
kwriteconfig6 --file kscreenlockerrc --group Daemon --key Autolock false
kwriteconfig6 --file kscreenlockerrc --group Daemon --key LockGrace 0
kwriteconfig6 --file kscreenlockerrc --group Daemon --key Timeout 0
kwriteconfig6 --file systemsettingsrc --group systemsettings_sidebar_mode --key HighlightNonDefaultSettings true
plasma-apply-lookandfeel --apply org.kde.breezedark.desktop

TODO

需要手动修改的选项 (暂时未找到较好的命令修改方法):

  • 系统设置
    • 鼠标和触摸板
      • 触摸板
        • 反向滚动
    • 键盘
      • 虚拟键盘
        • 选择 Fcitx 5 Wayland 启动器
    • 登录屏幕
      • 点击 应用 Plasma 设置 (在修改完其他设置之后点击)
    • KDE 密码库
      • 启用 KDE 密码库子系统
    • 区域和语言
      • 语言 修改
        • 添加 简体中文 并置顶
    • 日期和时间
      • 自动设置日期和时间
    • 输入法
      • 添加输入法 拼音
      • 拼音
        • 启用云拼音
      • 配置附加组件
        • 经典用户界面
          • 主题 KDE Plasma (实验性)
          • 深色主题 KDE Plasma (实验性)
          • 跟随系统浅色 / 深色设置
  • 显示面板 (类似 Windows 的任务栏) 设置
    • 面板设置
      • 显示 / 隐藏 避开窗口
    • 副屏设置为主屏面板的副本
  • ROG Control Center
    • App Settings
      • Run in background after closing close
  • Dolphin 文件管理器
    • 显示隐藏文件
    • 显示菜单栏
    • 配置 Dolphin
      • 启动时显示 /home/user

需要添加的脚本

  • 修改 SSH 默认端口
  • 防火墙允许特定端口号
  • 自动解压并写入应用程序启动器 (类似 Windows 的开始菜单) 的一些 portable app (目前包括 localsend, v2rayn, vscode)

可能出现的问题

笔记本切换到独显直连模式后 kde 桌面出现幽灵显示器

arch linux 官方内核默认启用 simpledrm 驱动显示开机 log (同时该虚拟显示输出设备被命名为 Unknown-1), 若 simpledrm 与独立显卡驱动之间移交存在问题, 就会出现额外的幽灵显示器

通过规范 NVIDIA 帧缓冲参数, 即添加内核启动参数 nvidia_drm.fbdev=1 解决

根据 arch wiki, nvidia_drm.modeset=1nvidia_drm.fbdev=1 由 nvidia-utils 自动添加, 但后者未生效, 原因暂时不明

plasmalogin 的显示器设置与 kde 不同步

需要点击系统设置-登录屏幕-应用 Plasma 设置进行手动同步

kde wallet 密码与用户密码不一致

可能是在安装配置完毕后手动修改了用户密码, kde wallet 密码不遵循更改, 仍然是第一次设置的密码

可通过 kwalletmanager 修改密码

修复 appimage 运行报错 error loading libfuse.so.2

安装 fuse2 sudo pacman -S fuse2

提示 /usr/bin/xdg-mime: 行 885: qtpaths: 未找到命令

qtpaths 实际位置: /usr/lib/qt6/bin/qtpaths, /usr/lib/qt6/bin/qtpaths6

创建软链接: sudo ln -sf /usr/lib/qt6/bin/qtpaths /usr/bin/qtpaths

某些应用无法开启系统托盘图标

安装 libayatana-appindicator sudo pacman -S libayatana-appindicator

配置 tensorflow 环境

注意: 此内容质量低下, 且不应属于该部分内容, 须移至其他部分

为了使系统干净整洁, 建议通过 docker 配置环境

首先安装 docker 和 nvidia-container-toolkit, 使用 docker 时通过手动启用 docker 服务 sudo systemctl start docker.socket (对于个人用户启用 docker.socket 而不是 docker.server 更快, 并且为了减少系统待机占用选择不自启动 docker 服务)

由于 tensorflow 的官方镜像无法调用 gpu, 选择镜像 nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04, 注意这里的 cuda tooklit 版本选择, 宿主机通过 nvidia-smi 查看的 cuda 版本不一定是tensorflow所使用的, 需要通过执行 python 脚本 python3 -c "import tensorflow as tf; print(tf.sysconfig.get_build_info())" 来查看 tensorflow 使用的 cuda toolkit 版本, 或者在官网查看 https://www.tensorflow.org/install/source

然后创建容器, 在容器内部安装 python, 并通过 pip 安装 tensorflow pip3 install tensorflow[and-cuda], 这里遵循官方教程即可, 由于容器已经安装好 cuda 和 cudnn, 无需再次安装

最后通过 python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))" 检查 gpu 是否可用

命令总结如下:

1
2
3
4
5
6
7
8
9
10
sudo pacman -S docker nvidia-container-toolkit
sudo systemctl start docker.socket
sudo docker pull nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04
sudo docker run --rm -it --gpus all nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04 bash
apt update && apt install python3 python3-pip python3-venv
mkdir tensorflow-playground && cd tensorflow-playground
python3 -m venv .venv && source .venv/bin/activate
pip3 install --upgrade pip
pip3 install tensorflow[and-cuda]
python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

参考链接