Arch Linux 安装步骤记录

本文记录安装 Arch Linux 的过程,便于以后重装时查阅,也希望能够为在安装过程中遇到困难的人提供一些参考。

获取系统安装镜像

下载页面 选择 China 区域的任一下载点,下载系统安装镜像。

下载站点除了安装镜像之外,还提供了 md5sum ,你可以计算下载得到文件的 md5sum 与之对比以验证下载到的镜像的完整性。

$ md5sum archlinux-2022.01.01-x86_64.iso
e398888915881990ac2491efe014c3ac archlinux-2022.01.01-x86_64.iso

准备安装介质

如果是在 Linux 系统上,可以使用 dd 命令很方便地将镜像写入 U 盘,但是请务必反复确认 of 参数指定的是你的 U 盘而不是你电脑上什么别的分区,填错的话可能一个命令下去你电脑上的某个分区就没了。

$ sudo dd bs=4M if=/path/to/archlinux.iso of=/dev/sdX status=progress && sync

或者也可以使用 GUI 工具 Etcher ,这是一个界面很简洁的全平台软件。

启动安装环境

关闭电脑,将制作的安装 U 盘插入电脑,并在开机时不断地按 F2F10 或者 F12 键(取决于你的电脑品牌和主板品牌),在出现启动菜单时,选择你的 U 盘并按下 Enter 键,之后会进入到安装程序的启动菜单,如下图所示。选择第一个 Arch Linux install medium 并按下 Enter 键进入安装环境。

安装程序启动菜单
安装环境

注意:

  1. Arch Linux 安装镜像不支持安全启动(Secure Boot),需要在 BIOS 设置里关闭安全启动,完成安装过程之后可以再配置安全启动。
  2. 有 legacy BIOS 和 UEFI 两种启动方式,本文后续内容都假设使用 UEFI 启动方式。
  3. 本文的截图和磁盘大小等数据来自虚拟机,但整个步骤与在物理机上安装系统并无不同。

可以使用下面的命令检查当前是否在 UEFI 模式,如果该目录存在则是在 UEFI 模式。

# ls /sys/firmware/efi/efivars

磁盘分区

使用下面的命令列出所有的磁盘和分区,找到想要进行分区的磁盘,一般是 /dev/sdX 的形式,比如 /dev/sda ,结果中出现的诸如 romloopairoot 之类的磁盘名字可以忽略。

# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
...
Disk /dev/sdb: 30 GiB, 32212254720 bytes, 62914560 sectors
...
Disk /dev/loop0: 715.43 MiB, 750182400 bytes, 1465200 sectors
...

要以 UEFI 模式安装 Arch Linux ,至少需要两个分区:一个 EFI 分区(用于存放 BootLoader 和其他启动时需要的文件),一个 Linux 根目录分区。在本文的场景中,我们有两块磁盘,其中一块磁盘(/dev/sda)存放 EFI 分区和 Linux 根目录,另一块磁盘(/dev/sdb)我们单独存放 home 目录,相当于把系统和用户数据分别放到两块磁盘上。而 swap 空间我们不单独划分一个分区,而是以 swapfile 的方式实现,这样做的好处是以后可以很方便地调整 swap 的大小。

创建 EFI 分区和 root 分区

使用下面的命令先对 /dev/sda 磁盘进行分区。

# fdisk /dev/sda

可以输入 d 命令并按下回车删除磁盘上已有的所有分区,然后用 g 命令创建 GPT 分区表。

Command (m for help): g
Created a new GPT disklabel (GUID: ....).

首先我们来创建 EFI 分区,输入命令 n ,程序会要求输入分区号,输入 1 (会创建名为 /dev/sda1 的分区),First sector 直接按回车保持默认值 2048 ,Last sector 输入 +512M ,表示我们要创建 512M 大小的 EFI 分区。

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-41943006, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943006, default 41943006): +512M

Created a new partition 1 of type 'Linux filesystem' and of size 512 MiB.

接着我们还要把这个分区的类型改成 EFI System (默认的是 Linux Filesystem),输入命令 t 以修改分区类型,接着输入 L 可以查看所有支持的分区(在分区列表按 jk 上下滚动,按 q 返回),这里我们需要输入 EFI System 对应的编号 1 。

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

用同样的方式在 /dev/sda 上创建第二个分区作为 root 分区,Partition number 保持默认值 2 ,First sector 和 Last sector 也保持默认值,将磁盘上所有剩下的空间都分配给这个分区。

Command (m for help): n
Partition number (2-128, default 2):
First sector (1050624-41943006, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-41943006, default 41943006):

Created a new partition 2 of type 'Linux filesystem' and of size 19.5 GiB.

完成分区后,输入 w 命令使修改生效并退出 fdisk 工具。

创建 home 分区

用同样的方法对 /dev/sdb 进行分区,我们只创建一个分区,用于系统的 home 目录。

# fdisk /dev/sdb

Command (m for help): g
Created a new GPT disklabel (GUID: ....).

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-62914526, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914526, default 62914526):

Created a new partition 1 of type 'Linux filesystem' and of size 30 GiB.

Command (m for help): w

创建文件系统

现在所有磁盘分区都准备好了,接下来我们在各个分区上创建文件系统,再次使用 fdisk -l 命令确认一下我们的分区情况。

# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
...
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 41943006 40892383 19.5G Linux filesystem

Disk /dev/sdb: 30 GiB, 32212254720 bytes, 62914560 sectors
...
Device Start End Sectors Size Type
/dev/sdb1 2048 62914526 62912479 30G Linux filesystem

Disk /dev/loop0: 715.43 MiB, 750182400 bytes, 1465200 sectors
...

使用下面的命令分别为 EFI 分区、Linux 根目录、Linux home 目录创建文件系统。

# mkfs.fat -F 32 /dev/sda1
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sdb1

挂载文件系统并创建 swapfile

接下来我们挂载 /dev/sda2 上的根目录和 /dev/sdb1 上的 home 目录。

# mount /dev/sda2 /mnt
# mkdir /mnt/home
# mount /dev/sdb1 /mnt/home

使用 fallocate 命令在根目录创建一个 swap 文件,文件名字叫什么无所谓。至于 swap 的大小选择,不同的人、不同的发行版都有各自的偏好,根据是否需要休眠(hibernate)功能也会有差异,这里我采用 Ubuntu 发行版当前的偏好,设定 swapfile 跟物理内存一样的大小(我这台虚拟机的屋物理内存为 4GB)。具体可以看 Ubuntu 社区的说明 这篇总结性的文章。swapfile 创建完成后将权限修改为 0600 ,只允许 root 访问,以防止发生重要信息泄露。

# fallocate -l 4G /mnt/swapfile
# chmod 600 /mnt/swapfile

到目前为止我们只是创建了一个普通的文件,接下来我们需要让 Linux 系统知道这个文件要用来作为 swap 空间,并启用这个 swap 空间。

# mkswap /mnt/swapfile
# swapon /mnt/swapfile

完成后可以使用下面的命令验证。

# swapon --show
NAME TYPE SIZE USED PRIO
/mnt/swapfile file 4G 0B -2

检查和配置网络环境

安装过程中需要网络,我们首先使用 ping 命令检查网络是否连通。

# ping -c 3 baidu.com

对于有线网络,一般直接插入网线就可以了,而对于无线网络,需要我们手动去连接,这里我们可以使用 iwctl 工具。首先运行 iwctl 进入工具的交互命令行,然后查找电脑上无线网卡设备的名字,接着使用无线网卡设备扫描无线网络,得到无线网络的名字后连接到网络,工具会提示输入无线网络的密码。(下面命令中的 xxx 和 yyy 分别代表无线网卡设备名字和无线网络名字,请根据实际情况进行替换)

# iwctl
[iwd]# device list
[iwd]# station xxx scan
[iwd]# station xxx get-networks
[iwd]# station xxx connect yyy

选择合适的镜像源

后面的安装过程中会从 Arch 镜像服务器上下载一些包。在 Live System 中,reflector 工具会自动选择 20 个最新同步的 HTTPS 镜像服务器放进镜像列表(/etc/pacman.d/mirrorlist),并以下载率排序,排在前面的镜像优先级更高。但这样选择镜像并没有考虑地理位置因素,这些镜像服务器可能离我们很远,导致下载速度很慢。我们可以手动使用 reflector 工具来选择下载速度最快的镜像。

首先备份一下镜像列表以防出现意外情况,接着使用 reflector 工具自动挑选镜像服务器,并自动把结果保存到镜像列表文件中,命令中的 CN 是国家代码。

# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
# reflector -c "CN" -f 12 -l 10 -n 12 --save /etc/pacman.d/mirrorlist

这个镜像列表文件会在后面被 pacstrap 程序拷贝到新安装的系统中,所以不需要在新的系统中再做一遍这个操作。

安装 Arch Linux

完成了前面的准备工作,现在终于可以开始安装 Arch Linux 了。使用 pacstrap 脚本来安装 base 包、Linux 内核和通用硬件的固件,此外我还安装了 vim 工具以便后面修改文件用。

# pacstrap /mnt base linux linux-firmware vim

需要注意:

  • 如果是在容器中安装系统,则不需要安装 Linux 内核。
  • 如果是在虚拟机或者容器中安装系统,不需要安装 firmware 。

如果安装因为网络问题中断了,没有关系,等网络恢复时再运行一遍命令即可。

配置新系统

前面我们对磁盘做了分区,创建了文件系统和 swapfile ,现在我们用下面的命令生成 fstab 文件,这个文件里说明了我们的磁盘分区、swapfile 应该如何挂载。

# genfstab -U /mnt >> /mnt/etc/fstab

到这里,我们的 Arch 系统已经安装完成了,但是还没有结束,我们需要使用 arch-chroot 命令进入到新的系统去做一些必要的配置。

# arch-chroot /mnt

首先我们使用 timedatectl 命令设置时区为 Asia/Shanghai 。

# timedatectl set-timezone Asia/Shanghai

接着设置 locale ,它会影响系统上的语言、日期、数字以及货币的显示格式。locale.gen 文件中包含了所有支持的 locale,使用 vim 打开并修改文件。

# vim /etc/locale.gen

找到 en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8 并取消注释,保存退出。然后生成 locale 文件,并创建 locale.conf 配置文件。不要直接在这里设置 LANG=zh_CN.UTF-8 ,否则会使终端乱码。可以之后在桌面环境中设置语言。

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

然后设置主机名为 myarch ,你可以随便设置成什么其他的。

# echo myarch > /etc/hostname

接着修改 hosts 文件,填入下面的内容,注意替换主机名。

# vim /etc/hosts

127.0.0.1 localhost
::1 localhost
127.0.1.1 myarch

日常使用中登录 root 用户是极其不安全的,我们创建一个普通用户,并赋予 sudo 权限。首先我们用下面的命令创建一个名为 nuke 的用户并为其设置密码,其中 -m 参数指明为新用户创建 home 目录。之后将新用户添加到 wheel 用户组。

# useradd -m nuke
# passwd nuke
# usermod -aG wheel nuke

接着我们安装 sudo 工具,并使用 visudo 命令修改 /etc/sudoers 配置文件,找到 wheel 那行,取消注释并保存。

# pacman -S sudo
# visudo

%wheel ALL=(ALL) ALL

安装 Grub BootLoader

最后一步是安装 BootLoader ,需要注意这一步骤的描述仅适用于 UEFI 启动模式,不适用于 legacy BIOS 。

# pacman -S grub efibootmgr

创建 /boot/efi 挂载点并将之前创建的 EFI 分区挂载到这里。

mkdir /boot/efi
mount /dev/sda1 /boot/efi

安装 Grub 并生成配置文件。

# grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/boot/efi
# grub-mkconfig -o /boot/grub/grub.cfg

恭喜你完成啦!不过不要高兴太早,要作为桌面系统使用我们最起码还得装个桌面环境。

提示:

  • 如果完成并重启后启动菜单里没有出现新安装系统的选项,可以进到 BIOS 设置里手动添加一个。
  • 如果安装 Grub 时遇到 No space left on device grub-install ,首先尝试用 efibootmgr -v 列出所有的启动选项,然后用 efibootmgr -b # -B 命令删除不需要的选项。如果没有解决的话再尝试 rm /sys/firmware/efi/efivars/dump-* 命令清理 EFI 的 dump 文件,完成这两步应该已经能解决这个问题了。

安装桌面环境

首先安装显示服务程序 Xorg ,接着安装 KDE 桌面和 KDE 生态的应用程序(有些不需要的可以卸载,比如 kde-games 和 kde-education ),显示管理器 SDDM 会由 KDE 附带安装。

# pacman -S xorg
# pacman -S plasma kde-applications

最后我们启动 SDDM 和 NetworkManager 服务,就可以重启进入新的系统了。

# systemctl enable sddm.service
# systemctl enable NetworkManager.service

相关参考链接

https://wiki.archlinux.org/title/Installation_guide

https://itsfoss.com/install-arch-linux

https://itsfoss.com/create-swap-file-linux/

https://askubuntu.com/questions/1072618/could-not-prepare-boot-variable-no-space-left-on-device-grub-install-error-ef

作者

ChinaNuke

发布于

2022-02-06

许可协议

评论