本文写于22年8月,部分内容可能已经过时
前言
相较于一个安装教程/指南,本文更多的是记录一个安装过程,因为我本人实际并无较多的Linux使用经历,所以本文仅供参考(您应当更多依赖于官方文档),可能会存在错误之处,望指教。
本文较长,且内含大量与我个人使用习惯相关的内容,其中部分内容因人而异,建议不要直接复制使用,先看好是否需要根据个人情况进行修改。
另外,本文的安装记录是在已有Windows11的情况下安装Arch Linux双系统,不讨论Windows安装相关。
0. 背景介绍
0.1 个人背景
作为一名疫情时代闲(ju)得(jue)发(nei)慌(juan)的宅男,在饱受了Windows的各种神奇小问题后,终于决定投向Linux的怀抱。之前就因为个人项目接触过Ubuntu,也曾闲得没事在虚拟机里装过一次Arch, 以及在实体机上成功安装了Win11 Manjaro双系统并使用了一小段时间,最近拿到了一块256g的ssd, 加之一直想要体验一下Arch的优雅和自由,于是决定再来折腾折腾。
0.2 硬件配置
电脑差不多用了四五年了,基本配置如下:
- 主板: 华硕Z370F
- CPU: i7 8700K
- 显卡: RTX 2080ti (ROG)
- 内存: DDR4 8g✖2 + 16g✖2 (共48G, 3000Mhz, 海盗船)
- 显示器: 华硕XG32VQ 2K@144hz (这显示器有个很影响使用的设计缺陷,有空开帖细说)
- 键鼠: 海盗船M65 + K68
- 主系统: Windows11 (22/01更新,目前是win10 21h1 ltsc)
(典型I+N, 高显低U, 最初是用来打游戏的)
0.3 为什么选择Win-Arch双系统
0.3.1 为何选择保留Windows使用双系统
- Windows下存有较多零散的重要文件,想要全部迁移过于耗时耗力
- 工作流尚未能够完全脱离Windows,存在部分软件无法被完美平替,如Adobe全家桶,网课工作流等。在一些场景中,花两分钟切换系统使用这些软件所带来的效率提升可能比坚持使用一个不够完美的平替品要高
- 存在一定的游戏需求,在WIndows下往往可以取得最佳体验
- 家人偶尔会临时使用我的电脑,Windows系统更适合大多数人
- 以防万一,两个系统同时炸的可能性较小
0.3.2 为何选择Arch Linux
- Arch的自由度较高,我能够更好地掌控自己的设备
- Arch拥有极其庞大的社区和优秀的官方文档,这对于我这种新手来说很友好
- Arch的滚动更新机制往往可以让你的系统和软件保持最新的状态,很好地跟上了软件更新的脚步,其Pacman与AUR的便用性也狠狠吸引到了我。
- 单纯的想折腾着玩玩,毕竟绝大多数发行版安装难度都很低(指较为完善的图形化引导界面),而且Arch在很多方面确实有自己的特点
1. 安装前准备
1.1 下载Arch镜像
你可以前往 Arch Linux官网 找到最新发行版,有很多国内镜像源可以下载。
1.2 创建USB启动盘
先准备一个空间充足,可用于制作启动盘的U盘。
由于我是在Windows下制作启动盘,故使用了 Rufus 这个软件,选择下载的镜像路径,默认配置直接刻录到U盘上即可。
Linux下可使用dd指令,这里不再赘述。
1.3 调整Windows时区设置
该操作主要是为了解决Windows与Linux对于硬件时间和时区偏移的处理方式不同造成的两系统相差8小时问题。具体原理在此不做过多描述。
在Windows下,以管理员权限运行以下CMD指令
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
1.4 在BIOS中关闭安全启动
由于不同厂商主板BIOS具体样式不一样,这里放出我的华硕Z370F的配置页面。
因为时间久远图片找不到了,不管了不重要(
2. 开始安装Arch
2.1 进入BIOS,从U盘启动
与 1.4 类似,此处仅放出个人的设置。为了安装方便,暂时将启动顺序调整为优先从U盘启动。
如果一切顺利,启动后您应看到如图界面。选择第一个选项并进入,稍等片刻等待初始化完成。
因为时间久远图片找不到了,不管了不重要(
2.2 一些准备性工作
2.2.1 禁用reflector服务
systemctl stop reflector.service
再次检查是否关闭
systemctl status reflector.service
2.2.2 连接网络(有线)
通常情况下,连接网线后会自动连接上互联网。
可使用ping指令来检测网络连接状况。
此处不介绍无线网络的连接。
2.2.3 开启网络时间同步
timedatectl set-ntp true
2.2.4 添加Pacman国内镜像源
vim /etc/pacman.d/mirrorlist
在其中已有列表最上方添加镜像源,如
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch # 中国科学技术大学开源镜像站
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch # 清华大学开源软件镜像站
Server = https://repo.huaweicloud.com/archlinux/$repo/os/$arch # 华为开源镜像站
Server = http://mirror.lzu.edu.cn/archlinux/$repo/os/$arch # 兰州大学开源镜像站
2.3 分区,格式化与挂载
2.3.1 磁盘分区
先执行 fdisk -l 找到要安装的硬盘
再执行 cfdisk <disk> 开始分区硬盘
考虑到Windows默认EFI分区仅有100M空间,共用该分区可能空间不足,因此又分配了512M的EFI分区
本机的运行内存为48G,综合考虑后分出了32G用于swap
剩余的空间全部分配默认的filesystem
2.3.2 格式化 Swap 分区
先执行 fdisk -l 找到swap分区的devicemkswap <device> 来格式化swap分区
2.3.3 格式化 Btrfs 分区
使用 mkfs.btrfs -L myArch <device> 来格式化一个btrfs分区
挂载brtfs分区到/mntmount -t btrfs -o compress=zstd /dev/nvmexn1pn /mnt
2.3.4 创建 Btrfs 子卷
btrfs subvolume create /mnt/@ # 创建 / 目录子卷
btrfs subvolume create /mnt/@home # 创建 /home 目录子卷
使用 btrfs subvolume list -p /mnt 检查子卷状态
确认无误后取消挂载 umount /mnt
2.3.5 格式化 /boot 分区
mkfs.vfat -F32 <device>
2.3.6 挂载分区
mount -t btrfs -o subvol=/@,compress=zstd <device> /mnt # 挂载 / 目录
mkdir /mnt/home # 创建 /home 目录
mount -t btrfs -o subvol=/@home,compress=zstd /dev/sdxn /mnt/home # 挂载 /home 目录
mkdir -p /mnt/boot/efi # 创建 /boot/efi 目录
mount /dev/sdxn /mnt/boot/efi # 挂载 /boot/efi 目录
swapon /dev/sdxn # 挂载交换分区
使用 df -h 检查分区挂载情况
使用 free -h 检查swap分区挂载情况
2.4 安装并进入系统
2.4.1 安装基础包与必要软件包
pacstrap /mnt base base-devel linux linux-firmware
pacstrap /mnt dhcpcd iwd vim sudo zsh ntfs-3g dhcpcd zsh-completions
2.4.2 生成 fstab 文件
使用 genfstab -U /mnt > /mnt/etc/fstab 来自动生成fstab文件
使用 cat /mnt/etc/fstab 来检查fstab文件是否正确
2.4.5 进入系统
使用 arch-chroot /mnt 切换至新安装的系统
如果无误,可以看到命令行提示符发生了改变
2.5 系统基本设置
2.5.1 设置主机名
使用 vim /etc/hostname 打开并添加需要更改的主机名
使用 vim /etc/hosts 打开hosts文件,并添加如下内容
127.0.0.1 localhost
::1 localhost
127.0.1.1 myarch.localdomain myarch
2.5.2 设置时区,时间与区域
设置时区为上海(UTC+8)ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
将系统时间同步到硬件时间hwclock --systohc
设置Localevim /etc/locale.gen
取消注释 en_US.UTF-8 UTF-8 和 zh_CN.UTF-8 UTF-8
执行 locale-gen 来生成locale
写入confecho 'LANG=en_US.UTF-8' > /etc/locale.conf
2.5.3 设置root帐户密码
使用 passwd root 来设置root密码
2.5.4 安装微码
安装对应厂商的微码
pacman -S intel-ucode # Intel
pacman -S amd-ucode # AMD
2.5.5 安装引导程序
首先安装对应的软件包pacman -S grub efibootmgr os-prober
安装grub到efi分区grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Arch
编辑grub文件vim /etc/default/grub
将 GRUB_DISABLE_OS_PROBER=false 取消注释
修改 GRUB_CMDLINE_LINUX_DEFAULT 这一行为 GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog" 易于排除错误与提高开机速度
保存并使用 grub-mkconfig -o /boot/grub/grub.cfg 来生成配置文件
2.6 完成安装
exit # 退回安装环境
umount -R /mnt # 卸载新分区
reboot # 重启
重启时拔掉启动U盘避免再次进入安装程序
现在,应当可以选择arch系统并进入了
执行 systemctl enable --now dhcpcd 来为dhcp服务设置开机自启,并立刻启动来连接网络。
至此,完成了一个最简易的,无桌面环境的Arch Linux系统的安装。
踩坑记录
1. 生成grub引导文件出错
使用 grub-mkconfig 指令时,返回报错 /usr/share/grub/grub-mkconfig_lib: 第237行: printf : "$": 无效格式字符
解决方案: 更改语言 LANG=C 后再次执行即可(注意权限)执行完后可再修改回中文。
2. Arch Linux CN 密钥错误问题
执行
sudo pacman -S archlinuxcn-keyring
sudo pacman -Syu haveged
systemctl start haveged
systemctl enable haveged
sudo rm -rf /etc/pacman.d/gnupg
sudo pacman-key --init
sudo pacman-key --populate archlinux
sudo pacman-key --populate archlinuxcn
sudo pacman -S archlinuxcn-keyring
3. 蓝牙设备无法连接
配对后点击连接提示br-connection-profile-unavailable
尝试执行
pacmd load-module module-bluetooth-policy
pacmd load-module module-bluetooth-discover
4. 双系统蓝牙设备需重新配对问题
先在Linux下配对一次设备(用于生成设备的配置文件),然后切换至Windows下,再次配对一次设备。
以管理员权限打开注册表编辑器,切换至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\<本机蓝牙 MAC> 中,找到蓝牙设备的MAC地址,将与其对应的key的数值数据记录下来。(如果出现无法读取Keys下的内容,可尝试在注册表编辑器得权限中为当前用户添加读取权限)
来到Linux下,使用root权限,切换至 /var/lib/bluetooth/<本机蓝牙 MAC>/<蓝牙设备 MAC> 修改其中的 info 文件,将 [LinkKey] 中的 Key 改为Windows下记录的Key值,注意格式相同。
如果还连接不上可以尝试重启一下。
5. 开机进入KDE桌面后无法打开任何程序
具体表现为开机后能正常进入桌面并进行交互,但是点击任何程序,或尝试使用快捷键均无法唤起任何应用的窗口。
Ctrl + Alt + F2 进入tty后发现主机名变为了 manjaro (推测可能与我使用过manjaro live系统进行一些配置时的误操作有关)修改回原主机名后解决。
6. 关闭tty等场景中无内容回格时烦人的蜂鸣器
尝试执行 rmmod pcspkr 并在 /etc/modprobe.d/nobeep.conf 中添加 blacklist pcspkr 。注意需要root权限。
总结
自己动手多尝试,遇到问题先在网上查一查是否有相关解决方案。善用Timeshift等工具,避免出现不可逆的错误(建议更新较多/重要软件包之前都做个备份以防万一)。