记录:第一次装Arch Linux

前言

本文记录了我第一次装Arch Linux的过程,以及遇到的问题和解决方法。

本文仅仅是记录,方便以后自己查阅,根据本文不保证能够成功安装Arch Linux。
如果你想要安装Arch Linux,建议你参考Arch Linux官方安装指南)。

以及国内的教程,如:archlinux 简明指南

我之前一直使用的是Windows,这是我第一次尝试装双系统,也是第一次尝试装Linux,也是第一次装Arch Linux。

为什么选Arch Linux呢?

早就听说Arch Linux高度定制了。对于我这种啥都喜欢DIY的人来说,怎么能不试试呢?

准备

下载镜像

Arch Linux官网下载镜像。

但是官网下载速度慢,从清华大学开源软件镜像站下载。

制作启动盘

准备一个2G以上的U盘,刻录启动盘。

推荐使用Ventoy制作启动盘,可以同时刻录多个镜像,方便选择。

但我使用的是Rufus制作启动盘。

为什么呢?

最初我使用的是Ventoy制作的启动盘,但刚开始我不太熟悉华硕的bios,找不到从U盘启动😭

我以为是Ventoy的问题,就换成了Rufus,但是还是找不到从U盘启动💥

后来我发现是我自己不会设置bios

分硬盘空间

由于我是双系统,所以我需要分出一部分硬盘空间给Arch Linux。

我压缩了差不多120G的空间,但其实后面分区的时候,我只分了80G给Arch。

安装

设置bios

开机时在启动画面反复按某个热键(我的是F2),进入bios设置。

不同品牌的电脑热键不同,可以百度一下。

在bios设置中,找到启动项,将U盘启动项调到第一位。

关闭快速启动
并且关闭安全启动。

我刚开始就没关,也能正常安装,但是安装完后,grub引导没有找到Windows的引导,导致无法启动Windows。

未找到Windows引导

后来关了安全启动,重新grub-mkconfig,就有Windows的选项了。

启动

禁用 reflector 服务

  1. 通过以下命令将该服务禁用:
1
systemctl stop reflector.service
  1. 通过以下命令查看该服务是否被禁用,按下 q 退出结果输出:
1
systemctl status reflector.service

再次确认是否为 UEFI 模式

禁用 reflector 服务后,我们再来确认一下是否为 UEFI 模式:

1
ls /sys/firmware/efi/efivars

若输出了一堆东西(efi 变量),则说明已在 UEFI 模式。否则请确认你的启动方式是否为 UEFI

连接网络

archlinux 的安装必须要求网络环境。

若使用无线连接

使用 iwctl 进行连接:

1
2
3
4
5
6
iwctl # 进入交互式命令行
device list # 列出无线网卡设备名,比如无线网卡看到叫 wlan0
station wlan0 scan # 扫描网络
station wlan0 get-networks # 列出所有 wifi 网络
station wlan0 connect wifi-name # 进行连接,注意这里无法输入中文。回车后输入密码即可
exit # 连接成功后退出

如下命令查看内核是否加载了你的无线网卡驱动。

1
lspci -k | grep Network

以此为例,输出如下:

1
00:14.3 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 20)

如果你的 BIOS 没有开启无线网卡的开关可以参考下列的命令来开启 WIFI

1
2
rfkill list #查看无线连接 是否被禁用(blocked: yes)
ip link set wlan0 up #比如无线网卡看到叫 wlan0

若看到类似Operation not possible due to RF-kill的报错,继续尝试rfkill unblock wifi来解锁无线网卡。

1
rfkill unblock wifi

部分无线网卡不兼容,请考虑使用有线连接安装 archlinux。

若使用有线连接

测试网络连通性

通过 ping 命令测试网络连通性:

1
ping www.bilibili.com

稍等片刻,若能看到数据返回,即说明已经联网。与 Windows 不同的是,需要按下 Ctrl + C 手动退出 ping 命令。

更新系统时钟

使用 timedatectl 确保系统时间是准确的。这一步不是可选的,正确的系统时间对于部分程序来说非常重要:

1
2
timedatectl set-ntp true # 将系统时间与网络时间进行同步
timedatectl status # 检查服务状态

更换国内软件仓库镜像源加快下载速度

使用 vim 编辑器修改 /etc/pacman.d/mirrorlist 文件。将 pacman 软件仓库源更换为国内软件仓库镜像源:

1
vim /etc/pacman.d/mirrorlist

放在最上面的是会使用的软件仓库镜像源,推荐的镜像源如下:

{1}
1
2
3
4
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 # 兰州大学开源镜像站

分区和格式化(使用 Btrfs 文件系统)

7-1. 分区
  • / 根目录:>= 128GB(和用户主目录在同一个 Btrfs 文件系统上)
  • /home 用户主目录:>= 128GB(和根目录在同一个 Btrfs 文件系统上)
  • /boot EFI 分区:256MB(由电脑厂商或 Windows 决定,无需再次创建)
  • Swap 分区:>= 电脑实际运行内存的 60%(设置这个大小是为了配置休眠准备)

因为采用 Btrfs 文件系统,所以根目录和用户主目录实际在一个分区上,只是在不同的子卷上而已。这里根目录和用户主目录的大小仅为参考,一般来说日常使用的 linux 分配 128GB 已经够用了。

  1. 通过 lsblk 命令,区分要安装 archlinux 的磁盘(通过观察磁盘的大小、已存在的分区情况等判断)并显示当前磁盘的分区情况:
1
lsblk # 显示当前分区情况

此处要分区和安装 archlinux 的磁盘即为 sda。请根据你的实际情况判断!

  1. 接下来使用 cfdisk 命令对磁盘分区(对于 SATA 协议的硬盘,x 为字母 abc 等等;对于 NVME 协议的硬盘,x 为数字 012 等等,请根据实际情况判断):
1
cfdisk /dev/sdx # 对安装 archlinux 的磁盘分区
1
cfdisk /dev/nvmexn1 # 对安装 archlinux 的磁盘分区

进入 cfdisk 分区工具后,我们需要对磁盘进行分区:

  1. 首先创建 Swap 分区。选中 Free space > 再选中操作 [New] > 然后按下回车 Enter 以新建 swap 分区(类似 Windows 的交换文件)

  2. 按下回车后会提示输入 分区大小,Swap 分区建议为电脑内存大小的 60%,或者和内存大小相等 > 然后按下回车 Enter

单位可以自行输入,如 GBMB 等等。

  1. 默认新建的类型是 Linux filesystem,我们需要将类型更改为 Linux swap。选中操作 [Type] > 然后按下回车 Enter > 通过方向键 选中 Linux swap > 最后按下回车 Enter

  2. 我们再只需要一个分区即可(因为使用 Btrfs 文件系统,所以根目录和用户主目录在一个分区上),所以类似的:选中 Free space > 再选中操作 [New] > 然后按下回车 Enter 以新建分区

  3. 输入 分区大小(默认是剩余的全部空间。请根据实际情况输入)> 然后按下回车 Enter

  4. 分区类型默认即可,无需更改。接下来选中操作 [Write] 并回车 Enter > 输入 yes 并回车 Enter 确认分区操作

  5. 选中操作 [Quit] 并回车 Enter 以退出 cfdisk 分区工具

⚠️ 注意:千万不要误把 Windows 的 分区给删了。如果你不确定,可以先用 fdisk -l 命令查看一下分区情况。

  1. 分区完成后,使用 fdisklsblk 命令复查分区情况:
1
fdisk -l # 复查磁盘情况
1
lsblk # 复查磁盘情况
7-2. 格式化并创建 Btrfs 子卷
格式化 Swap 分区

通过以下命令格式化对应的 Swap 分区,请按照实际情况替换 xn(下同):

1
mkswap /dev/sdxn
1
mkswap /dev/nvmexn1pn
格式化 Btrfs 分区
  1. 首先我们需要将整一个分区格式化为 Btrfs 文件系统。使用如下命令进行格式化:
1
mkfs.btrfs -L myArch /dev/sdxn
1
mkfs.btrfs -L myArch /dev/nvmexn1pn

📑 命令参数说明:

  • -L 选项后指定该分区的 LABLE,这里以 myArch 为例,也可以自定义,但不能使用特殊字符以及空格,且最好有意义
  1. 为了创建子卷,我们需要先将 Btrfs 分区挂载到 /mnt 下:
1
mount -t btrfs -o compress=zstd /dev/sdxn /mnt
1
mount -t btrfs -o compress=zstd /dev/nvmexn1pn /mnt

📑 命令参数说明:

  • -t 选项后指定挂载分区文件系统类型
  • -o 选项后添加挂载参数:
    • compress=zstd —— 开启透明压缩
  1. 使用 df 命令复查挂载情况:
1
df -h # -h 选项会使输出以人类可读的单位显示
创建 Btrfs 子卷
  1. 通过以下命令创建两个 Btrfs 子卷,之后将分别挂载到 / 根目录和 /home 用户主目录:
1
2
btrfs subvolume create /mnt/@ # 创建 / 目录子卷
btrfs subvolume create /mnt/@home # 创建 /home 目录子卷
  1. 通过以下命令复查子卷情况:
1
btrfs subvolume list -p /mnt
  1. 子卷创建好后,我们需要将 /mnt 卸载掉,以挂载子卷:
1
umount /mnt

挂载

  1. 在挂载时,挂载是有顺序的,需要从根目录开始挂载。使用如下命令挂载子卷:
1
2
3
4
5
6
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvmexn1pn /mnt # 挂载 / 目录
mkdir /mnt/home # 创建 /home 目录
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvmexn1pn /mnt/home # 挂载 /home 目录
mkdir -p /mnt/boot # 创建 /boot 目录
mount /dev/nvmexn1pn /mnt/boot # 挂载 /boot 目录
swapon /dev/nvmexn1pn # 挂载交换分区
  1. 使用 df 命令复查挂载情况:
1
df -h
  1. 使用 free 命令复查 Swap 分区挂载情况:
1
free -h # -h 选项会使输出以人类可读的单位显示

安装系统

  1. 通过如下命令使用 pacstrap 脚本安装基础包:
1
2
pacstrap /mnt base base-devel linux linux-firmware btrfs-progs
# 如果使用btrfs文件系统,额外安装一个btrfs-progs包

📑 命令参数说明:

  • base-devel —— base-develAUR 包的安装过程中是必须用到的
  • linux —— 内核软件包,这里建议先不要替换为其它内核

如果提示 GPG 证书错误,可能是因为使用的不是最新的镜像文件,可以通过更新 archlinux-keyring 解决此问题

1
pacman -S archlinux-keyring
  1. 通过如下命令使用 pacstrap 脚本安装其它必要的功能性软件:
1
2
pacstrap /mnt networkmanager vim sudo zsh zsh-completions
# 安装网络管理器、vim、sudo、zsh、zsh补全

经过一系列安装时提示信息的刷屏,这些包就安装好了。

在执行命令前,请仔细检查命令的拼写正确;同时注意不要漏装东西。

生成 fstab 文件

  1. fstab 用来定义磁盘分区。它是 Linux 系统中重要的文件之一。使用 genfstab 自动根据当前挂载情况生成并写入 fstab 文件:
1
genfstab -U /mnt > /mnt/etc/fstab
  1. 复查一下 /mnt/etc/fstab 确保没有错误:
1
cat /mnt/etc/fstab

若为 NVME 协议的硬盘,输出结果应该与此类似:

1
2
3
4
5
6
7
8
9
10
11
# /dev/nvme0n1p6  /  btrfs  rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=256,subvol=/@,subvol=@ 0 0
UUID=d01a3ca5-0798-462e-9a30-97065e7e36e1 / btrfs rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=256,subvol=/@,subvol=@ 0 0

# /dev/nvme0n1p1 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
UUID=522C-80C6 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

# /dev/nvme0n1p6 /home btrfs rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=257,subvol=/@home,subvol=@home 0 0
UUID=d01a3ca5-0798-462e-9a30-97065e7e36e1 /home btrfs rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=257,subvol=/@home,subvol=@home 0 0

# /dev/nvme0n1p5 none swap defaults 0 0
UUID=8e40dbed-590f-4cb8-80de-5cef8343a9fc none swap defaults 0 0

change root

使用以下命令把系统环境切换到新系统下:

1
arch-chroot /mnt

此时,原来安装盘下的 /mnt 目录就变成了新系统的 / 目录。同时,可以发现命令行的提示符颜色和样式也发生了改变。

设置主机名与时区

  1. 首先在 /etc/hostname 设置主机名:
1
vim /etc/hostname

加入你想为主机取的主机名,这里比如叫 myarch。

主机名不要包含特殊字符以及空格。

  1. 接下来在 /etc/hosts 设置与其匹配的条目:
1
vim /etc/hosts

加入如下内容:

1
2
3
127.0.0.1   localhost
::1 localhost
127.0.1.1 myarch.localdomain myarch
  1. 随后设置时区,在 /etc/localtime 下用 /usr 中合适的时区创建符号链接:
1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

不要找北京啦!这里没有北京,只有上海啦!🚀

硬件时间设置

使用如下命令将系统时间同步到硬件时间:

1
hwclock --systohc

设置 Locale

Locale 决定了软件使用的语言、书写习惯和字符集。

  1. 编辑 /etc/locale.gen,去掉 en_US.UTF-8 UTF-8 以及 zh_CN.UTF-8 UTF-8 行前的注释符号(#):
1
vim /etc/locale.gen
  1. 然后使用如下命令生成 locale
1
locale-gen
  1. /etc/locale.conf 输入内容:
1
echo 'LANG=en_US.UTF-8'  > /etc/locale.conf

不推荐在此设置任何中文 locale,会导致 tty 乱码。

为 root 用户设置密码

1
passwd root

安装微码

通过以下命令安装对应芯片制造商的微码:

1
2
pacman -S intel-ucode # Intel
pacman -S amd-ucode # AMD

安装引导程序

如有需要可以参阅 ArchWiki 相关内容>)。

  1. 安装相应的包:
1
pacman -S grub efibootmgr os-prober

📑 命令参数说明:

  • -S 选项后指定要通过 pacman 包管理器安装的包:
    • grub —— 启动引导器
    • efibootmgr —— efibootmgrgrub 脚本用来将启动项写入 NVRAM
    • os-prober —— 为了能够引导 win10,需要安装 os-prober 以检测到它
  1. 安装 GRUB 到 EFI 分区:
1
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH

📑 命令参数说明:

  • --efi-directory=/boot —— 将 grubx64.efi 安装到之前的指定位置(EFI 分区)
  • --bootloader-id=ARCH —— 取名为 ARCH
  1. 接下来使用 vim 编辑 /etc/default/grub 文件:
1
vim /etc/default/grub

进行如下修改:

  • 去掉 GRUB_CMDLINE_LINUX_DEFAULT 一行中最后的 quiet 参数
  • loglevel 的数值从 3 改成 5。这样是为了后续如果出现系统错误,方便排错
  • 加入 nowatchdog 参数,这可以显著提高开关机速度

  • 为了引导 win10,则还需要添加新的一行 GRUB_DISABLE_OS_PROBER=false

1
2
3
4
5
6
7
8
9
# GRUB boot loader configuration

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=false
...
  1. 最后生成 GRUB 所需的配置文件:
1
grub-mkconfig -o /boot/grub/grub.cfg

若引导了 win10,则会在生成配置文件时出现如下提示:

1
Found Windows Boot Manager on /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi

os-prober 在 chroot 环境中可能无法正常运作。如果遇到这种情况,重启并引导进入系统后再次尝试生成配置文件。

完成安装

  1. 输入以下命令:
1
2
3
exit # 退回安装环境
umount -R /mnt # 卸载新分区
reboot # 重启

注意,重启前要先拔掉优盘,否则你重启后还是进安装程序而不是安装好的系统。

若引导了 win10 会有Windows Boot Manager的引导项。

  1. 重启后使用 root 账户登录系统:

  2. 设置开机自启并立即启动 networkmanager 服务,即可连接网络:

1
2
systemctl enable --now NetworkManager # 设置开机自启并立即启动 NetworkManager 服务
ping www.bilibili.com # 测试网络连接
  1. 若为无线连接,则需要在启动 networkmanager 后使用 nmcli 连接网络:
1
2
nmcli dev wifi list # 显示附近的 Wi-Fi 网络
nmcli dev wifi connect "Wi-Fi名(SSID)" password "网络密码" # 连接指定的无线网络
  1. neofetch 可以将系统信息和发行版 logo 一并打印出来。通过 pacman 安装 neofetch
1
pacman -S neofetch
  1. 使用 neofetch 打印系统信息:
1
neofetch

neofetch

这是我安装完EFI分区的样子。

EFI分区1
EFI分区2

🎉 祝贺!🎉

到此为止,一个基础的、无图形界面的 archlinux 已经安装完成了!这时你应该可以感到满满的满足感(即使你还没有见到图形化的界面)。好好享受一下成功安装 archlinux 的喜悦吧!

你可以使用以下命令关机:

1
shutdown -h now

archlinux 在 2021 年 4 月在安装镜像中内置了一个 安装脚本,类似一个一键安装脚本,提供一些选项,即可快速安装(填问卷安系统)。和所有一键安装脚本类似,提供自动化,但不灵活的安装过程。缺陷包括但不限于:

  1. 只提供有限的文件系统格式
  2. 只可限定在一个磁盘
  3. 不能指定软件仓库镜像源
  4. 只提供有限的桌面选择
  5. 自动分区不可手动干预
  6. 输入错误直接崩溃退出
  7. 仅支持 UEFI 等

不建议使用这个安装脚本,除了以上各种原因,初学者也无法在这种安装过程中学到任何东西。如果你因为某些原因需要快速启动一个基础的 archlinux 环境,那么可以尝试此脚本。