ChrisKim
Do not go gentle into that good night.
颢天

透过 Arch Linux 窥探系统安装的本质

最近突然想把笔记本双系统的 Ubuntu 换成 Arch Linux,结果发现 Arch Linux 居然没有安装器,所有安装必须参照文档一步步手动完成。带着好奇的心态一晚上走完了 Arch 的安装流程后,我发现我对系统安装尤其是 Linux 的安装有了一个更高的全新认识,本篇文章也是分享我领悟到的一些内容吧。本篇文章也不是安装教程,因此如果你要安装 Arch Linux 的话,请参考官方文档:https://wiki.archlinux.org/title/Installation_guide

1 何为系统安装?

由于我们很难脱离操作系统来使用计算机,并且操作系统必须是可引导启动的,这些特点导致操作系统的安装是特殊的。

但是操作系统本质上也是一个软件,实际上我们也可以简单点来理解,系统安装实际上就做了以下事情:

  • 引导临时系统:2.1 节
  • 磁盘分区:2.2 节
  • 写入并配置新系统:2.3~2.5 节
  • 使新系统可引导:2.6 节

对于 Windows 或者一些 Linux 发行版如 Ubuntu,安装系统的过程已经被隐藏到系统安装器背后了,无需手动干预。本篇文章便基于 Arch Linux 的安装来梳理一下系统安装背后发生了什么。

2 系统安装

2.1 引导临时操作系统

我们很难脱离操作系统来使用计算机,因此如果没有操作系统,安装操作系统这件事也会变得无比困难。因此安装系统前首先需要引导进入一个临时的操作系统,通常叫做 Live CD,该临时系统通常封装好了常见驱动和系统安装所需的工具。在启动时系统直接读入内存,因此对该系统本体进行的修改都是不会保存的。

如果你自己尝试过 Windows 系统的安装并且没有使用微软官方的安装器,那一定使用过 Windows PE 系统(比如 WePE),它的作用和上面说的 Live CD 是一致的,都是在计算机没有操作系统时为你提供一个临时的操作系统,方便进行系统安装。

在 Arch Linux 安装中,下载到的安装镜像 archlinux-x86_64.iso 就是 Live CD,将其引导就能直接启动进入到一个现成的 Arch Linux 中,不过这个系统并不是给你日用的。

https://assets.zouht.com/img/blog/3780-02.webp
Live CD 系统

2.2 磁盘分区

由于 Linux 系统需要特定的分区结构,因此安装前首先要将分区结构划分好。因为当磁盘写入内容后再调整分区就不太方便了,这个事情最好在系统安装前来做。

如果你对 Linux 不熟悉,你也可以打开你现在 Windows 系统的磁盘管理,可以看到 Windows 系统也是依赖于特定的分区结构的,一般来说 UEFI 引导的 Windows 是三分区结构:

名称文件系统大小作用
ESPFAT32通常设为 300MB引导系统
MSRMSR通常设为 16MB微软保留分区
系统分区NTFS自定义俗称系统盘、C 盘

那么 Linux 的分区结构是什么呢?对于 UEFI 引导,实际上必要的分区只有 EFI 分区,和上文 ESP 分区相同。因此,对于最简情况,Linux 的分区结构是:

名称文件系统大小作用
EFI (也称 ESP)FAT32通常设为 300MB引导系统
系统分区ext4自定义储存 /

Linux 的分区结构实际上是可以自定义的,就跟 Windows 能够分 C/D/E 盘一样。例如我希望用单独的分区作为 SWAP,分区结构就变成:

名称文件系统大小作用
EFI (也称 ESP)FAT32通常设为 300MB引导系统
SWAPSWAP通常设为 4~8GB交换空间
系统分区ext4自定义储存 /

在 Linux 中,我们用 fdisk 工具进行磁盘分区,以上文独立 SWAP 的结构为例,分区结果如下:

https://assets.zouht.com/img/blog/3780-04.webp

同时需要注意的是,在 Windows 中我们或许习惯了一步完成分区和格式化,但是分区和格式化是两个不同的步骤:

  • 分区:将磁盘划分为几个固定大小的部分,每个部分是独立不干扰的。
  • 格式化:将磁盘的某一部分格式化为某种文件系统的结构,即使不分区也能格式化。

因此下一步便是为格式化分区,EFI 分区要格式化为 FAT32,SWAP 要格式化为 SWAP,系统分区通常格式化为 ext4. 如下图所示对三个分区分别进行格式化:

https://assets.zouht.com/img/blog/3780-05.webp

2.3 挂载主机磁盘

磁盘分区后,就可以将新系统写入到对应分区内了。但需要注意的是,Linux 不会自动将计算机上的所有磁盘挂载到系统内,因此我们得手动挂载才能在系统访问我们刚才分好区并格式化的磁盘。我们把分好的系统分区挂载到 /mnt,然后把分好的 EFI 分区挂载到 /mnt/boot:

mount /dev/sda3 /mnt
mount --mkdir /dev/sda1 /mnt/boot

为什么要这样挂载?因为对于 Linux 系统,/ 目录挂载的系统分区,/boot 目录挂载的就是 EFI 分区。我们处于临时系统中,把待安装系统的系统分区和 EFI 分区挂载到 /mnt 和 /mnt/boot,就能保证安装时它们的相对结构和成品系统一致。

同时需要注意的是 SWAP 分区也要挂载,虽然我们不向 SWAP 分区内写入内容,但后面会用到:

swapon /dev/sda2

2.4 向磁盘写入新系统

一切准备就绪,接下来就可以将新系统写入主机磁盘了。对于 Windows 和一些 Linux 发行版,这一步实际上就是将 Live CD 里准备好的全新系统复制到主机磁盘内,系统版本取决于你下载的 Live CD 版本。

但 Arch Linux 很特别,它就像安装一个普通软件一样,从在线下载一个最新的系统写入到主机磁盘内。安装系统实际上只用了一行指令,含义是向 /mnt 目录下安装 base linux linux-firmware 三个软件包,也就是新系统。

pacstrap -K /mnt base linux linux-firmware

通过这行指令下载安装后,可以发现 /mnt 目录下已经出现了我们熟悉的 Linux 根目录结构,说明系统已经写入到了目标磁盘:

https://assets.zouht.com/img/blog/3780-06.webp

2.5 配置新系统

写入系统后就能直接用吗?当然不行,因为新安装的系统还要进行一些必要的配置。这一步相当于 Windows 或者 Ubuntu 安装时让我们选语言、选时区、设定主机名的操作,只不过在 Arch Linux 安装中需要我们自己来操作。

首先我们要生成 fstab 文件,这个文件告诉了系统该如何挂载我们的分区。比如我们刚才安装时是手动用 mount 指令挂载了 / 和 EFI 和 SWAP 三个分区,我们肯定不希望每次开机还得手动挂载分区,有了 fstab 系统就会自动帮我们挂载了。

使用 genfstab -U /mnt >> /mnt/etc/fstab 就可以生成并写入 fstab 文件了,检查一下文件内容,可以看到确实已经有这三个分区的挂载配置了:

https://assets.zouht.com/img/blog/3780-07.webp

接下来就是时间、语言、网络和用户的配置了,但如果我们直接执行命令,改的实际上是临时系统的配置。因此我们需要从临时操作系统“切换”到新系统:arch-chroot /mnt,然后再执行的命令作用的就是新系统而不是临时系统了。

# 配置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 配置语言
nano /etc/locale.gen
locale-gen
# 配置主机名
vim /etc/hostname
# 配置网络
pacman -S networkmanager
systemctl enable NetworkManager
# 设置root密码
passwd

2.6 安装引导程序

经过上述操作,我们已经将系统安装好了,但是这个系统是无法启动的,因为现代的操作系统均需要引导程序来启动。Linux 的开机流程大概为:

  • 上电并自检
  • BIOS 查找可引导磁盘,启动引导程序如 grub2
  • grub2 查找磁盘内系统内核的位置,启动系统内核
  • 系统内核进行接下来的操作完成开机

可以看到引导程序是 BIOS 和系统的桥梁。大家可能疑惑为什么不能直接由 BIOS 引导系统,原因实际上是为了通用性考虑,这个思想便是解耦和分层,在计网内也有类似的思想存在。

如果要由 BIOS 来直接引导系统,那么使用一个万能 BIOS 实现所有操作系统启动流程,要么每次换系统后还要换 BIOS,这都不太现实。但如果分离 BIOS 和引导,BIOS 只要能够保证引导程序能够加载即可,引导程序再来实现具体的系统启动流程。

如果更换了系统,只需要更换配套的引导即可。例如 Windows 是使用微软官方的 Windows Boot Manager 引导启动,Linux 常用 grub2 引导启动。无需更换 BIOS,使用不同引导程序即可实现 Windows 和 Linux 的启动。

引导程序和一般程序一样,使用软件包管理器 pacman 就可以下载了:

pacman -S grub efibootmgr

然后要将引导程序 grub2 安装到 EFI 分区内供 BIOS 启动,刚才已经将 EFI 分区挂载到 /boot,因此直接安装到 /boot 内即可:

grub-install --target=x86_64-efi --efi-directory=/boot/ --bootloader-id=GRUB

但是只安装 grub2 的话每次开机就得手动输入指令来引导系统,为了让系统开机自动完成,需要生成 grub 的配置文件,这样 grub2 就会按照配置文件内的引导流程自动启动系统了:

grub-mkconfig -o /boot/grub/grub.cfg

2.7 重启进入新系统

至此就完成了 Arch Linux 系统的安装,reboot 重启就可以看到 grub2 的界面了:

https://assets.zouht.com/img/blog/3780-08.webp

接下来 grub 就能正常地引导系统,进入 Arch Linux 了:

https://assets.zouht.com/img/blog/3780-09.webp

3 总结

经过上文的梳理,可以发现其实 Linux 系统安装没有那么复杂,整个流程非常简单明了,即使脱离了可视化的安装器来安装似乎也不是什么困难的事情。

以前使用 Ubuntu 的安装器来进行可视化安装的时候,我完全不知道在磁盘分区时背后进行了什么指令的操作,不知道在进行系统配置时具体使用什么工具调整了哪几个配置文件,也不知道 grub 是怎么安装并配置好的。但经过这次手动安装 Arch,我感觉我对 Linux 的安装和 Linux 本身都有了更深入的理解。

我还尝试了让 Arch 和我目前的 Windows 11 共存,我发现掌握了以上知识后这也不是什么难事,因为 Windows 和 Arch Linux 都是 UEFI 启动的,它们是可以共用同一个 EFI 分区,只需要不同的引导程序即可。

总之,不管你是 Linux 新手还是能熟练日用 Linux,我都非常推荐你体验一下 Arch Linux 的安装(或者脱离安装器的安装其他发行版),这个过程真的能加深你对 Linux 的理解。

不过我知道更进一步可以直接从源码来编译 Linux 内核和各种系统组件,来完全从源码安装一个自己的操作系统(Linux From Scratch),或许以后我会尝试学习一下。

本文链接:https://www.zouht.com/3780.html
本文使用:CC BY-NC-SA 4.0 许可
# #
首页      随笔      透过 Arch Linux 窥探系统安装的本质

发表回复

textsms
account_circle
email

  • LiuShen

    真能折腾哈哈哈,我都怕给电脑干坏了

    4 周前 回复

颢天

透过 Arch Linux 窥探系统安装的本质
最近突然想把笔记本双系统的 Ubuntu 换成 Arch Linux,结果发现 Arch Linux 居然没有安装器,所有安装必须参照文档一步步手动完成。带着好奇的心态一晚上走完了 Arch 的安装流程后,我发…
扫描二维码继续阅读
2024-09-10