基础安装详解
🔭 知其然,知其所以然
这一节对上一节 archlinux 基础安装 中关键的几步做出了更进一步的解释,知其然知其所以然。此节没有特定顺序,可根据需要选择性阅读
需要说明的是,本指南假定你有一定的 Linux 基础知识,基础知识相关的话题不会被讨论
💾 分区和格式化
- 因本指南介绍使用的文件系统是
Btrfs
,很多萌新可能有些不理解。这里有必要说明一下- 若执意要用传统的
ext4
文件系统,本指南也给出了示例- 对于全盘格式化后全新安装的(单 archlinux 系统)同学,这里也给出了需要做的额外步骤的说明
- 对于 Swap 分区还是 Swap 文件 的话题,也会在此讨论
💾 为什么要用 Btrfs 文件系统
纵观 Btrfs 的历史,可以说 Btrfs 未来的发展是道阻且长的。也让我们感受到开源社区也并不是一根绳上的蚂蚱 —— 开源社区之间也有着各种各样的分歧。
但不管怎么说,Btrfs 的未来现在来看是光明的;我们也可以在 archlinux 上享受到 Btrfs 文件系统的特性带来的好处:
- 快照 —— archlinux 作为滚动发行版,若滚挂了可以使用 Btrfs 的快照特性快速回滚
- 若使用传统的
ext4
文件系统,我们可以使用timeshift
的RSYNC
模式进行增量备份。但是,一般来说 RSYNC 方式的快照大小略大于当前实际使用大小,也就是说实际上开启了timeshift
的RSYNC
模式快照相当于磁盘可用空间直接少了一半多。因为虽然 RSYNC 方式的快照是增量的,但历史最久远的快照依然是完整备份,随后才是增量的
- 若使用传统的
- 透明压缩 —— 可以大大减少磁盘的使用空间(压缩率大概在 10% 左右)
ℹ️ 提示
更多 Btrfs 文件系统介绍和操作请参阅 Btrfs 介绍与相关操作。
💾 传统 ext4 文件系统说明
若执意使用传统的 ext4
文件系统,那么分区的建议为:
若 archlinux 安装分区小于
256GB
:/
根目录:全部空间
(用户主目录不单独分区)/boot
EFI 分区:256MB
- Swap 分区:
>= 电脑实际运行内存的 60%
若 archlinux 安装分区大于
256GB
:/
根目录:128GB
/home
用户主目录:剩余的全部空间
/boot
EFI 分区:256MB
- Swap 分区:
>= 电脑实际运行内存的 60%
分区同样使用 cfdisk
工具,具体操作类似上一节 7-1. 分区 所述,这里不再赘述。
- 使用以下命令格式化
ext4
分区:
mkfs.ext4 /dev/sdax
mkfs.ext4 /dev/nvmexn1pn
- 使用以下命令挂载
ext4
分区:
mount /dev/sdxn /mnt
mkdir /mnt/home # 若 /home 目录单独分区
mount /dev/sdxn /mnt/home # 若 /home 目录单独分区
mkdir -p /mnt/boot
mount /dev/sdxn /mnt/boot
mount /dev/nvmexn1pn /mnt
mkdir /mnt/home # 若 /home 目录单独分区
mount /dev/nvmexn1pn /mnt/home # 若 /home 目录单独分区
mkdir -p /mnt/boot
mount /dev/nvmexn1pn /mnt/boot
🆕 全新安装
若为全新安装(单 archlinux 系统),首先要对磁盘建立新的 GPT 分区表;同时,由于没有现存的 EFI 分区,所以我们还需要手动创建它(这一步在 7. 分区和格式化(使用 Btrfs 文件系统) 步骤之前):
1. 建立新的 GPT 分区表
- 同样的,先通过
lsblk
命令,区分要全新安装 archlinux 的磁盘(通过观察磁盘的大小等判断):
lsblk # 显示当前分区情况
- 通过以下命令将磁盘转换为
gpt
类型:
parted /dev/sdx # 执行 parted,进行磁盘类型变更
(parted) mktable # 输入 mktable
New disk label type? gpt # 输入 gpt,将磁盘类型转换为 GPT 类型。如磁盘有数据会警告,输入 Yes 即可
(parted) quit # 退出 parted 命令行交互
parted /dev/nvmexn1 # 执行 parted,进行磁盘类型变更
(parted) mktable # 输入 mktable
New disk label type? gpt # 输入 gpt,将磁盘类型转换为 GPT 类型。如磁盘有数据会警告,输入 Yes 即可
(parted) quit # 退出 parted 命令行交互
☢️ 警告
重建分区表会使磁盘所有数据丢失,请事先确认。
2. 建立 EFI 分区
进入 cfdisk
分区工具之后,类似上一节步骤 7-1. 分区 的分区说明,建立 EFI 分区:
选中
Free space
> 再选中操作[New]
> 然后按下回车Enter
以新建EFI
分区输入
分区大小
(建议 >=256MB
、<=1024MB
;推荐512MB
)> 然后按下回车Enter
选中操作
[Type]
> 然后按下回车Enter
> 通过方向键↑
和↓
选中EFI System
> 最后按下回车Enter
接下来可以按照上一节 7-1. 分区 的步骤创建其它分区
3. 格式化 EFI 分区
mkfs.vfat /dev/sdxn
mkfs.vfat /dev/nvmexn1pn
💾 Swap 分区和 Swap 文件
如果希望使用 Swap 文件替换 Swap 分区,那么在分区和挂载中不必创建和开启 Swap 分区。
ℹ️ 提示
但是,使用 Swap 文件会更加复杂。因为若使用 Swap 文件在 Btrfs
文件系统中设置休眠(hibernate)的时候需要额外的步骤,而且可能有兼容性问题。若没有动态改变 Swap 大小的需求,建议使用 Swap 分区。
通过以下步骤创建和挂载 Swap 文件(这一步在 18. 完成安装 步骤之后):
- 通过以下命令创建 Swap File:
sudo dd if=/dev/zero of=/swapfile bs=1M count=16384 status=progress # 创建 16G 的交换空间(大小 >= 电脑实际运行内存的 60%)
sudo chmod 600 /swapfile # 设置正确的权限
sudo mkswap /swapfile # 格式化 Swap 文件
sudo swapon /swapfile # 挂载 Swap 文件
- 通过以下命令挂载 Swap 文件:
swapon /swapfile
- 使用
free
命令复查 Swap 文件挂载情况:
free -h # -h 选项会使输出以人类可读的单位显示
- 最后,向
/etc/fstab
中追加如下内容:
/swapfile none swap defaults 0 0
💽 安装环境和新系统的关系
理解安装环境和新系统的关系,对于理解 archlinux 安装时所做的步骤具有重大意义。可以说,理解了它们的关系基本上就理解了 archlinux 的安装
为了生动形象的理解安装环境和新系统的关系,我们可以将安装系统的过程想象成搬家 🏠。
1. 🏠 建房子
我们可以将安装环境比喻成一个临时的家。为了住进新家,我们需要先把新家的房子建起来。这个过程就是 7. 分区和格式化。在磁盘上建立新的分区并格式化,就好比在空余的土地上建立起新的房子。
2. 🛣️ 建立通道
新房建好了,我们首先还要建立一条联通旧家和新家之间的通道 —— 不然我们怎么走到新家去呢!更不要提将家具什么的安置到新家去了。这个步骤就是 8. 挂载。通过将新的分区挂载到 /mnt
下,我们才能对新的分区进行操作。
3. 🛋️ 添置家具
光有一个空荡荡的房子是没有用的。为了变成一个能够生活的温馨小窝,我们还需要添置家具。这个步骤就是 9. 安装系统。在执行 pacstrap
脚本的过程中,其实就是将系统运行需要的一些基础的东西安装到新的系统中 —— 类似把家具放到新的家里。
4. 🚚 搬进新家
最后,新家建好了,装修啊、家具啊也弄好了,我们可以搬进新家了!这一步骤就是 11. change root。arch-chroot
脚本是软件包 arch-install-scripts
的一部分,但本质上只是在 chroot
命令的基础上添加了一些功能,简化了“搬家”的流程。其类似(注意,只是类似,arch-chroot
还会做一些其它的工作,安装时请使用 arch-chroot
)以下命令:
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o bind /dev /mnt/dev
chroot /mnt bash
chroot
顾名思义,就是 change root 的意思。chroot
命令把根目录换成指定的目录。通常,切换根目录一般的目的是为了系统维护,例如重装引导程序或者重置遗忘的密码;而在安装时则是为了安装(大雾 🌫️。在安装过程中,新的根目录就是 /mnt
。这个过程就好比从原来的家搬到了新的家一样,是不是这样理解起来就简单一点了呢?
🥙 杂七杂八
其它琐碎的问题不在一一展开叙述,这里通过列表统一说明:
- EFI 分区(又称 esp 分区)不一定要挂载在
/boot
目录下;也可以是/efi
或者其他非常见路径(当然一般推荐挂载在/boot
下,方便引导程序读取同样在这个目录下的内核、微码等启动系统的必要文件) - 若为联想小新 Pro14 / YOGA 14s 2021 机型,发现安装前后键盘都无法正常工作。此时安装时请使用外接键盘。为了解决该问题,在 17. 安装引导程序 步骤中编辑
/etc/default/grub
文件时添加额外的 GRUB 参数 —— 在GRUB_CMDLINE_LINUX_DEFAULT
这一行中添加参数i8042.dumbkbd
修改后复查:
head /etc/default/grub
输出如下:
# GRUB boot loader configuration
GRUB_DEFAULT_SUBMENU=y
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog i8042.dumbkbd"
GRUB_CMDLINE_LINUX=""
- 若为机械革命机型,则建议通过 CPIO archive 修复
本部分来源于:机械革命 蛟龙 15K Linux 内置键盘失灵解决 (ACPI)_linux 笔记本键盘失灵
工具:acpica和cpio
sudo pacman -S acpica cpio
获得原来的 DSDT
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat # 获取dsdt
iasl -d dsdt.dat # 反编译DSDT成AML文件(.dsl)
修改 dsdt.dsl : 找到 Device(PS2K) ,向下找第一个 ActiveLow 改成 ActiveHigh ,样例如下:
Device (PS2K)
{
Name (_HID, "MSFT0001") // _HID: Hardware ID
Name (_CID, EisaId ("PNP0303") /* IBM Enhanced Keyboard (101/102-key, PS/2 Mouse) */) // _CID: Compatible ID
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0060, // Range Minimum
0x0060, // Range Maximum
0x00, // Alignment
0x01, // Length
)
IO (Decode16,
0x0064, // Range Minimum
0x0064, // Range Maximum
0x00, // Alignment
0x01, // Length
)
IRQ (Edge, ActiveLow, Shared, ) // <<=== 目标
{1}
})
//... 省略无关内容
}
最后,给DefinitionBlock 升一个版本 (最后一个十六进制数加一): DefinitionBlock ("", "DSDT", 2, "ALASKA", "A M I ", 0x01072009)
改为 DefinitionBlock ("", "DSDT", 2, "ALASKA", "A M I ", 0x0107200A)
编译新的 AML 文件
iasl dsdt.dsl
加入 initrd
mkdir -p kernel/firmware/acpi
cp dsdt.aml kernel/firmware/acpi
find kernel | cpio -H newc --create > acpi_override
sudo cp acpi_override /boot
echo "GRUB_EARLY_INITRD_LINUX_CUSTOM=\"acpi_override\"" >> /etc/default/grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
ℹ️ 提示
如果使用 systemd-boot , 则只需要在内核加载后再加一条 initrd
命令即可,样例如下:
# Created by: archinstall
# Created on: 2024-07-28_08-06-24
title Arch Linux (linux-zen)
linux /vmlinuz-linux-zen
initrd /acpi_override # 这一行
initrd /initramfs-linux-zen.img
options root=PARTUUID=d1204e8c-13ab-4c8d-a6fd-45d731684912 zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs