Thanks to the following contributors: - @snowykami - @frg2089 - Nya_Twisuki
This commit is contained in:
382
docs/notes/OS/ArchInstall.md
Normal file
382
docs/notes/OS/ArchInstall.md
Normal file
@ -0,0 +1,382 @@
|
||||
---
|
||||
category:
|
||||
- 操作系统
|
||||
- Linux
|
||||
tag:
|
||||
- Arch Linux
|
||||
- KDE
|
||||
- Wayland
|
||||
- X11
|
||||
star: true
|
||||
---
|
||||
|
||||
# Arch Linux 个人安(折)装(腾)流程
|
||||
<!-- https://www.glowmem.com/archives/archlinux-note -->
|
||||
<!-- https://arch.icekylin.online/guide/-->
|
||||
|
||||
::: details 我选择 Arch 的理由
|
||||
1. 比起“服务”,我还是更倾向于把操作系统当作纯正的工具。可能这就是旧信息时代遗老吧。
|
||||
2. “缘,妙不可言”。
|
||||
3. 具体工作具体分析吧。跨平台开发 Arch 也挺舒服的。但 Adobe 全家桶就显然不适合了。
|
||||
:::
|
||||
|
||||
其实这篇笔记说是“流程”,更像是“避坑指南”。因为文中大部分实际操作步骤都是直接贴的参考外链。
|
||||
我只是为了补充些注意事项,免得以后重装起来忘掉而已。
|
||||
|
||||
> [!important]
|
||||
> 由于 Arch 更迭速度比较快,下面的参考链接以及这篇笔记本身的内容可能随时失效。
|
||||
> 在安装、使用过程中遇到的,这里没有提及的问题,还请自行 Google、Bing 或 Baidu。
|
||||
>
|
||||
> 如果你觉得 Arch 滚动更新很累、玩不太明白,不妨还是先上手`Pop!_OS`或者`Ubuntu`。
|
||||
>
|
||||
> 此外,也可以多多留意其他人总结的 Arch 折腾小技巧,说不定会有意外收获。
|
||||
|
||||
## 参考链接
|
||||
|
||||
本文有参考以下两篇安装教程:
|
||||
|
||||
1. [律回彼境:Arch Linux 折腾指南&记录](https://www.glowmem.com/archives/archlinux-note)(以下简称「律回指南」)
|
||||
2. [Nakano Miku:Arch 简明指南](https://arch.icekylin.online/guide/)(以下简称「Miku 指南」)
|
||||
|
||||
我的笔记**以律回 MelodyEcho 的流程为主**,偶尔穿插一下 Miku 指南。
|
||||
|
||||
## 零、前期准备
|
||||
|
||||
这部分无需赘述,主要工作就是**下载 Arch 安装镜像**,并把它**刻录到 U 盘里**。
|
||||
网上对此已有很多成熟的教程,恕不在这里浪费时间了。但有两件事稍微还是要注意一下。
|
||||
|
||||
首先是主板设置^1^。如今的主板应该都允许使用 UEFI 了,故本篇笔记也不会考虑传统 BIOS 引导,你需要**确保主板是 UEFI 启动**;
|
||||
除此之外,**需要关闭“安全启动”**(Secure Boot)。UEFI 的这一安全机制会拒绝执行未签名的启动文件,而不幸的是,Arch 食用的 Linux 内核以及 Grub 等加载器的确没有签名,并且签名的“手续”很麻烦。
|
||||
|
||||
其次是你的 WiFi 名字^2^。在 Arch 的 LiveCD(维护环境,下同)里,大部分安装步骤都需要手敲命令来完成,并且**无法输入、显示中文**。
|
||||
如果你打算用 WiFi 连接,不妨提前更一下名。
|
||||
|
||||
> [!tip]
|
||||
> 如果只是迁移系统,那么进入维护环境之后只需`rsync`做全盘搬运即可(当然前提是目标**盘**要比原**系统**的实际占用空间要大)。可参见 [lin.moe](https://lin.moe/tutorial/2020/04/arch_migrate/)。
|
||||
|
||||
## 一、联网并设置时区
|
||||
|
||||
U 盘启动 PE 相信很多人都操作过,或者看过教程。LiveCD 也是这么启动的。但与 Ubuntu 可选联网不同,Arch 的安装**必须联网**。
|
||||
本章可直接阅读律回指南[第一章「连接网络和时区配置」](https://www.glowmem.com/archives/archlinux-note#toc-head-2)。直至 6 月初此法仍然可用(
|
||||
|
||||
## 二、硬盘分区、格式化和挂载
|
||||
|
||||
由于`ext4`调整分区大小并不是很方便,我改用了`Btrfs`文件系统,备份则采用`RSYNC`异盘同步和`Btrfs`同盘快照。你仍可以参照律回指南[第二章「分区、格式化与挂载」](https://www.glowmem.com/archives/archlinux-note#toc-head-3)去操作。
|
||||
|
||||
::: details 补充一下律回的 fdisk 操作流程
|
||||
> 注:下列内容只考虑全新安装。
|
||||
|
||||
首先需要知道你要操作哪块硬盘:`lsblk`命令可以以树形结构呈现出当前都连着什么硬盘,都分了什么区。
|
||||
|
||||
然后`fdisk /dev/<disk_id>`进入操作控制台,比如`fdisk /dev/nvme0n1`。
|
||||
在控制台里可以敲`m`看帮助。清空重新分区大致的操作如下(是的,都是单字母喔):
|
||||
|
||||
- `g`:新建 GPT 分区表。
|
||||
- `d`:如果你不想动分区表,那么就用 d 一个一个删除分区吧。
|
||||
- `n`:用 n 逐个添加新分区。
|
||||
|
||||
> [!tip]
|
||||
> 其中,`n`之后需要指定这是第几个分区,以及分区多大。
|
||||
> 分区的大小默认用扇区表示,你可以改用`+120G` `+256M` `+512K`这种我们更熟知的`GB` `MB` `KB`单位。
|
||||
> 如果你原先的硬盘不是“未分配”状态(也就是使用过,分过区),那么新建时可能会提示你删除文件系统标识。`y`允许即可。
|
||||
|
||||
- `t`:对于 EFI 引导分区,需要借此更改分区类型为 EFI System(即 ESP)。
|
||||
|
||||
> [!info]
|
||||
> 此举是出于兼容考虑。诚然较新的主板可以搜索任意 FAT 分区中的 EFI 文件,但旧主板未必,Windows 的`bootmgr`未必。
|
||||
> 当然也有些固件可能只认 Windows 的`bootmgfw.efi`,如此不妨试试 [UKI](./ArchUEFI.md#统一内核映像-uki)。
|
||||
|
||||
- `w`:保存并应用分区表更改。DiskGenius 改分区也不是设置完立马生效的嘛。
|
||||
:::
|
||||
|
||||
Miku 指南则由于假定保留 Windows 系统分区,对分区方案的介绍实际上拆成了两部分:
|
||||
|
||||
- :new: [全新安装](https://arch.icekylin.online/guide/rookie/basic-install-detail#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85)
|
||||
- [7. 分区和格式化(使用 Btrfs 文件系统)](https://arch.icekylin.online/guide/rookie/basic-install.html#_7-%E5%88%86%E5%8C%BA%E5%92%8C%E6%A0%BC%E5%BC%8F%E5%8C%96-%E4%BD%BF%E7%94%A8-btrfs-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F)
|
||||
|
||||
> [!tip]
|
||||
> 我个人的分区方案是:
|
||||
> - ESP:挂载`/boot`
|
||||
> - 系统分区:挂载`/`;若是 Btrfs,另开子卷挂载`/home`
|
||||
> - 交换分区
|
||||
>
|
||||
> 这么分可以相对灵活地调整交换分区,因为总体来说调整分区右端比调整左端容易。
|
||||
|
||||
分区用`fdisk`和`cfdisk`都可以。完事了格式化、挂载文件系统即可。两篇指南对此都有叙述。
|
||||
|
||||
## 三、安装系统
|
||||
|
||||
我个人偏向于律回指南。但在正式安装之前,还有一些事要做。
|
||||
|
||||
### 3.1 pacman 镜像源配置
|
||||
|
||||
Linux 的包管理器默认用的国外的软件源,`pacman`也一样。因此,非常建议先换用国内镜像,加快包下载速度。
|
||||
|
||||
编辑`/etc/pacman.d/mirrorlist`(`vim`还是`nano`请自便):
|
||||
```ini
|
||||
# 在文件开头起一空行,复制下列镜像源:
|
||||
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
|
||||
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
|
||||
Server = https://mirrors.aliyun.com/archlinux/$repo/os/$arch
|
||||
```
|
||||
> [!tip]
|
||||
> 变更后的`mirrorlist`会在 Arch 安装过程中被复制过去。这样后续就不需要再做一遍换源了。
|
||||
|
||||
### 3.2 包管理器配置
|
||||
默认`pacman`是逐个下载软件的。但哪怕是 1MB/s 小水管,并行下载四、五个软件包也绰绰有余了。
|
||||
|
||||
编辑`/etc/pacman.conf`:
|
||||
|
||||
1. 找到`# Misc options`,删掉`Color` `ParallelDownloads = 5`前面的注释`#`:
|
||||
```ini
|
||||
# Misc options
|
||||
#UseSyslog
|
||||
Color # 输出彩色日志
|
||||
#NoProgressBar
|
||||
CheckSpace
|
||||
#VerbosePkgLists
|
||||
ParallelDownloads = 5 # 最大并行下载数(根据你的网速自行斟酌,不建议写太大)
|
||||
```
|
||||
|
||||
2. 翻页到文件末尾,删掉`[multilib]`和底下`Include =`这两行的注释`#`。
|
||||
> `multilib`是 32 位软件源。默认下载的包都是`x86_64`的,而有一些程序仍需要 32 位的库。
|
||||
|
||||
> [!note]
|
||||
> 很遗憾,经实测 pacman 配置并不会复制过去。在安装完系统`arch-chroot`进去进一步配置时,你需要重复做一遍上述操作。
|
||||
|
||||
### 3.3 正式部署
|
||||
|
||||
在换源、调整设置之后,`pacman -Sy`更新软件库,然后你就可以安装最新版的 Arch Linux 了。
|
||||
具体的安装步骤参见律回指南的[第三章「安装系统」](https://www.glowmem.com/archives/archlinux-note#toc-head-4)
|
||||
和[第四章「系统基本配置」](https://www.glowmem.com/archives/archlinux-note#toc-head-5)两章。以下仅作补充。
|
||||
|
||||
> [!note]
|
||||
> 确保`pacstrap`只执行一次——我不清楚重复刷入系统会不会误覆盖些啥东西。
|
||||
|
||||
::: warning AUR 助手
|
||||
Miku 指南强调过“不要(在 LiveCD 里)提前配置`archlinuxcn`源”,而`yay` `paru`等 AUR 助手恰好是 CN 源提供的软件包。
|
||||
所以直到重启进入新系统之前,也千万不要试图安装 AUR 助手喔。
|
||||
:::
|
||||
|
||||
## 四、系统基本配置
|
||||
跟着律回指南的三、四章装好系统之后,重启登入新系统的终端。你现在应能通过`nmtui`连上 WiFi 了。
|
||||
|
||||
### 4.1 CN 源和 AUR 助手
|
||||
在**联好网的新系统**里配置`archlinuxcn`源:`sudo nano /etc/pacman.conf`
|
||||
```ini
|
||||
# 末行添加
|
||||
[archlinuxcn]
|
||||
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
|
||||
```
|
||||
并安装 CN 源的签名密钥和 AUR 助手:
|
||||
```bash
|
||||
sudo pacman-key --lsign-key "farseerfc@archlinux.org" # 为密钥环添加本地信任
|
||||
sudo pacman -S archlinuxcn-keyring # 安装密钥环
|
||||
sudo pacman -S yay paru # 安装 AUR 助手
|
||||
```
|
||||
::: info 关于本地信任 Key
|
||||
简单来说就是给 CN 源密钥环签名的`farseerfc`他的 Key 掉信任了,包管理器“不敢”安装这个密钥环^2^。
|
||||
:::
|
||||
|
||||
### 4.2 硬件(一)音频安装
|
||||
|
||||
音频分为固件(或者说驱动)和管理套件两部分:
|
||||
```bash
|
||||
# 音频固件
|
||||
sudo pacman -S sof-firmware alsa-firmware alsa-ucm-conf
|
||||
# pipewire 及其音频管理套件
|
||||
sudo pacman -S pipewire gst-plugin-pipewire pipewire-alsa pipewire-jack pipewire-pulse wireplumber
|
||||
```
|
||||
::: tip pulseaudio
|
||||
除了 pipewire 音频方案之外另有`pulseaudio`可供选择。但务必注意:音频管理套件**只能二选一,不可以混装**。
|
||||
|
||||
另外,由于 pipewire 本身不单只负责音频管理的工作,如需装 pulseaudio 仍需安装`pipewire` `gst-plugin-pipewire`两个包。
|
||||
相应地,其余的包可换用如下平替:
|
||||
|
||||
- `pipewire-alsa` → `pulseaudio-alsa`
|
||||
- `pipewire-jack` → `jack2`
|
||||
- `pipewire-pulse` → `pulseaudio`
|
||||
- `wireplumber` → `pipewire-media-session`(pipewire 弃用)
|
||||
|
||||
> 由于 pipewire 那边有 wireplumber 代替,所以这个包被他们自行标记为“过时”。
|
||||
> 但 pulseaudio 仍需要这个包。
|
||||
:::
|
||||
|
||||
显卡、蓝牙等其他硬件设施需要在装好桌面环境后再考虑。至少**到本小节为止你的系统里并没有蓝牙服务**,无法启用。
|
||||
|
||||
## 五、KDE 桌面环境
|
||||
|
||||
跟完我的第三章,律回指南的三、四章,还有我的第四章之后,你便拥有了一个无 GUI 的终端 Arch 系统。
|
||||
但作为日常使用的话,图形桌面肯定必不可少。
|
||||
|
||||
本文与那两篇参考外链一样**采用 KDE 桌面环境**。当然除了 KDE 之外,你也可以考虑 GNOME 桌面环境 ~~(只是我用腻了)~~;
|
||||
也可以考虑散装方案(比如`hyprland`~~,只是我没装成功~~)。
|
||||
|
||||
::: info KDE 6 vs KDE 5?
|
||||
目前最新版本为 KDE 6。但律回指南发布于 23 年 11 月,介绍的是 KDE 5。
|
||||
|
||||
话虽如此,倒也不必惊慌。`pacman`以及`yay` `paru`之流均**默认安装最新版**,以下**安装 KDE 5 的步骤仍可用于安装 KDE 6**:
|
||||
```bash
|
||||
# 分别安装 xorg 套件、sddm 登录管理器、KDE 桌面环境,以及配套软件
|
||||
sudo pacman -S xorg
|
||||
sudo pacman -S plasma sddm konsole dolphin kate okular spectacle partitionmanager ark filelight gwenview
|
||||
# 启用 sddm 服务,重启进 SDDM 用户登录
|
||||
sudo systemctl enable sddm
|
||||
sudo reboot
|
||||
```
|
||||
:::
|
||||
|
||||
重启后在用户登录界面输入密码回车,恭喜你,距离投入日常使用只剩几步之遥了。之后对 KDE
|
||||
和系统的配置**大部分**仍可参考律回指南的[第六章「桌面环境配置」](https://www.glowmem.com/archives/archlinux-note#toc-head-7)。
|
||||
|
||||
### 5.1 关于 Wayland 和 X
|
||||
KDE 的图形实现默认已经是 Wayland 了。在开机后输入用户密码的界面处,找找屏幕边角,你可以看到默认选用`Plasma (Wayland)`。
|
||||
点击它,你可以选择换用`Plasma (X11)`。
|
||||
尽管 X11 有个「锁屏黑屏」的问题,但目前来说我还是推荐换回 X11。
|
||||
|
||||
::: note X11 锁屏黑屏
|
||||
KDE 的默认 Breeze 主题锁屏时大概率会出现黑屏、惟有鼠标的现象。在 7 月中旬时已经发现该现象已经蔓延到自定义主题了。查了下 Google 以及 Arch、Manjaro、KDE 的一些讨论帖,尚没有有效的解决方案。
|
||||
|
||||
当然有一些主题可能能够解除这个“病征”,像我之前装的 Nordic Dark,以及现在的 Lavanda。这种 work around 可能还是因人而异。
|
||||
:::
|
||||
|
||||
### 5.2 硬件(二)显卡驱动与蓝牙
|
||||
|
||||
> “so NVIDIA, F**K YOU! ”——Linus Torvalds
|
||||
|
||||
AMD 或 NVIDIA 显卡可参见律回指南[6.4 小节「显卡驱动安装」](https://www.glowmem.com/archives/archlinux-note#toc-head-11)
|
||||
和 Miku 版指南的[新手进阶—显卡驱动](https://arch.icekylin.online/guide/rookie/graphic-driver.html)篇。
|
||||
但我是锐炬核显捏,只需要在 Konsole 终端里`sudo pacman -S`安装图形 API:
|
||||
|
||||
- `mesa` `lib32-mesa`(OpenGL)
|
||||
- `vulkan-intel` `lib32-vulkan-intel`(Vulkan)
|
||||
- `intel-media-driver`(VAAPI 解码器,OBS 需要)
|
||||
|
||||
如果有蓝牙的话,在 Konsole 里启用(并立即启动)蓝牙服务:
|
||||
```bash
|
||||
sudo systemctl enable --now bluetooth
|
||||
```
|
||||
> 之前误以为`bluetooth`是 Arch 本身就有的服务,结果发现是桌面环境依赖了蓝牙组件包。
|
||||
|
||||
### 5.3 额外中文字体和输入法
|
||||
|
||||
律回指南安装的字体分别是 Noto 系列(Linux 常用的 Unicode 字体)和思源系列(也算是 Noto 系列的子集)。
|
||||
其中 Noto 系列的汉字部分由于一些神秘的原因,不做额外配置的话,渲染出来只能说……能用。
|
||||
|
||||
::: info 参考资料
|
||||
- [Arch Wiki:关于中文字被异常渲染成日文异体字的说明](https://wiki.archlinux.org/title/Localization/Simplified_Chinese#Chinese_characters_displayed_as_variant_(Japanese)_glyphs)^2^
|
||||
- [Arch 中文论坛:noto-fonts-cjk 打包变化可能导致的回落字体选取问题](https://bbs.archlinuxcn.org/viewtopic.php?pid=60100)^2^
|
||||
:::
|
||||
|
||||
::: note fontconfig
|
||||
`wqy-zenhei`^extra^(文泉驿)和`misans`^aur^会在安装过程中自动帮你配置 fontconfig,因此安装完这两款字体之后系统默认用这些字体显示。
|
||||
如果你希望使用未经适配的字体,那么需要在 KDE 设置里装好字体后,额外做字体配置。
|
||||
|
||||
示例:[思源系列字体配置](../../shared/01-Prefer.conf) By [@Vescrity](https://github.com/Vescrity)
|
||||
注意:用户级字体配置需放在`~/.config/fontconfig/conf.d`目录中。
|
||||
另注:使用`fc-cache -vf`刷新字体缓存。
|
||||
:::
|
||||
|
||||
至于输入法,律回指南推荐安装搜狗拼音`fcitx-sogoupinyin`^aur^,
|
||||
但它在星火 Wine 版网易云里似乎无法调出来,最近也无法安装(会卡在`build()`开头):
|
||||
```bash
|
||||
tar (child): data.tar.gz: Cannot open: No such file or directory
|
||||
```
|
||||
Miku 指南的[输入法介绍](https://arch.icekylin.online/guide/rookie/desktop-env-and-app.html#_10-%E5%AE%89%E8%A3%85%E8%BE%93%E5%85%A5%E6%B3%95)则推荐直接安装`fcitx5`。
|
||||
|
||||
::: warning 可能的版本冲突
|
||||
若先前配置搜狗拼音失败,你需要排查并移除已经安装的 Fcitx 4 组件,它与`fcitx5`冲突:
|
||||
```bash
|
||||
# 查询本地(local)已安装的软件库
|
||||
sudo pacman -Qs fcitx
|
||||
# 逐个移除,以 fcitx 为例
|
||||
sudo pacman -R fcitx
|
||||
```
|
||||
不用递归移除`-Rs`的原因是,递归可能移除掉你不希望干掉的包依赖。
|
||||
:::
|
||||
|
||||
至此,Arch 的安装告一段落,你可以像捣腾 Windows 那样玩转 Arch 了。
|
||||
|
||||
---
|
||||
|
||||
## 附录:系统美化
|
||||
|
||||
> “爱美之心,人皆有之。”
|
||||
|
||||
> [!tip]
|
||||
> - **风格统一**是美观的必要条件。
|
||||
> - 少搞“侵入性”美化。或者说,需要**修改系统文件、注入系统进程、破坏系统稳定的美化尽量少做**。
|
||||
> - **谨遵发布页面附送的安装指引**(KDE、GNOME 主题可以参考项目 GitHub),否则可能安装不全。
|
||||
|
||||
### I. 主题
|
||||
主题这边我也没啥好推荐的,虽然 KDE 6 现在也出现了一些比较好看的主题,但终究是因人而异吧。
|
||||
|
||||
我想说明的是,KDE 商店的多数主题在 **X11 会话、125% 甚至更高缩放率**下会出现“非常粗窗口边框,使我的窗口肥胖”的现象(至少我的笔记本如此)。
|
||||
我个人目前是直接修改主题 Aurorae 配置文件,利用二分法逐步找到四条边的最适 Padding。
|
||||
网上貌似也有“把缩放调回 100%,但是更改字体 DPI”的做法,但个人觉得显示效果应该好不到哪去(
|
||||
|
||||
### II. 仿 Mac 上下双栏布局
|
||||
KDE 原生的桌面 UI 就挺 Windows 的,但胜在自由度足够高。
|
||||
我**个人觉得** Mac OS 那种双栏比较好看、比较方便,所以稍微按照如下配置调整了面板布局。
|
||||
|
||||
仅供参考咯。
|
||||
|
||||
::: details Dock 栏
|
||||
即原本的任务栏。
|
||||
- 位于底部、居中、适宜宽度、取消悬浮、避开窗口
|
||||
- 除“图标任务管理器”外,其余组件全部移除。
|
||||
:::
|
||||
|
||||
::: details Finder 栏
|
||||
即“应用程序菜单栏”(可在 *编辑模式—添加面板* 处找到)
|
||||
- 位于顶部、居中、填满宽度、取消悬浮、常驻显示
|
||||
- 自左到右依次为:
|
||||
- 应用程序启动器(类比开始菜单)
|
||||
- 窗口列表
|
||||
- 全局菜单(默认提供)
|
||||
- “面板间距”留白
|
||||
- 数字时钟
|
||||
- 日期保持在时间旁边,而不是上下两行
|
||||
- 字号略小于菜单栏高度,凭感觉捏
|
||||
- “面板间距”留白
|
||||
- 系统监视传感器
|
||||
- 横向柱状图(平均 CPU 温度、最高 CPU 温度)
|
||||
- 仅文字(网络上行、下行速度;网络上传、下载的总流量)
|
||||
- 系统托盘
|
||||
:::
|
||||
|
||||
除了 Finder 栏外,可以在系统设置里更改屏幕四周的鼠标表现。
|
||||
比如,鼠标移动到左上角可以自动弹出“应用程序启动器”,移到右上角可以切换你的桌面,等等。
|
||||
|
||||
## 附录:GPG 密钥配置
|
||||
主要讨论配置提交签名(Commit Signing)时遇到的问题。
|
||||
|
||||
### I. VSCode 提交签名
|
||||
大体上跟着 [Commit Signing - VSCode Wiki](https://github.com/microsoft/vscode/wiki/Commit-Signing) 就可以了。唯一需要留意的是`pinentry`。
|
||||
|
||||
VSCode 的主侧栏“源代码管理”页提交时并不会走终端,也就莫得 pinentry 的 CUI;莫得 pinentry 输密码验证,提交就签不了名。
|
||||
虽然有人好像搞了个`pinentry-extension`出来,但 6 月初我去看的时候它连说明书都莫得,也没有上架,那用集贸。
|
||||
|
||||
所以我选择编辑`~/.gnupg/gpg-agent.conf`:
|
||||
```properties
|
||||
default-cache-ttl 28800
|
||||
pinentry-program /usr/bin/pinentry-qt
|
||||
```
|
||||
保存后重启`gpg-agent`:`gpg-connect-agent reloadagent /bye`。
|
||||
|
||||
经测试,大部分终端均能在 SSH 连接中调出 CUI;VSCode Remote-SSH 打开的终端可能比较特殊,仍然无法签名。个人还是建议单独开个终端作为 workaround。
|
||||
|
||||
### II. GPG 密钥备份(导出导入)
|
||||
之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时,
|
||||
我发现 GitHub 和腾讯 Coding 会重置提交验证(同一个邮箱只能上传一个公钥),届时就是我痛苦的 rebase 重签了。
|
||||
~~不过好在受影响的多数只是我的个人项目,变基无伤大雅。~~
|
||||
```bash
|
||||
gpg --list-secret-keys --keyid-format LONG
|
||||
# export
|
||||
gpg -a -o public-file.key --export <keyid>
|
||||
gpg -a -o private-file.key --export-secret-keys <keyid>
|
||||
# import
|
||||
gpg --import ~/public-file.key
|
||||
gpg --allow-secret-key-import --import ~/private-file.key
|
||||
```
|
||||
重新导入 Key 之后,可能还需要`gpg --edit-key`更改密码(`passwd`)、重设信任(`trust`)。
|
242
docs/notes/OS/ArchUEFI.md
Normal file
242
docs/notes/OS/ArchUEFI.md
Normal file
@ -0,0 +1,242 @@
|
||||
---
|
||||
category:
|
||||
- 操作系统
|
||||
- Linux
|
||||
tag:
|
||||
- Arch Linux
|
||||
- Grub
|
||||
- UEFI
|
||||
- UKI
|
||||
---
|
||||
|
||||
# Arch Linux UEFI 启动二三事
|
||||
|
||||
由于我对 Linux 乃至整个 UEFI 的启动机制尚且“浅尝辄止”,本文并不会展开很多硬核内容,只是对我个人使用过的启动方案做个总结。
|
||||
|
||||
::: tip 引导和启动
|
||||
在维基百科中二者似乎是同一概念,搜索“启动程序”会跳转到[“引导程序”](https://zh.wikipedia.org/wiki/%E5%95%9F%E5%8B%95%E7%A8%8B%E5%BC%8F)的介绍。
|
||||
|
||||
> 另见英文维基:[Booting](https://en.wikipedia.org/wiki/Booting)
|
||||
|
||||
国内很多折腾 WinPE 的人(包括我)对此也并没有很明确的区分;当然有些博客则对开机装载 Linux 的过程拆分成引导、启动两个阶段。本文为了方便起见,用词不作区分。
|
||||
:::
|
||||
|
||||
在此感谢岛风 [@frg2089](https://github.com/frg2089) 指路。
|
||||
|
||||
## UEFI 启动简述:启动项管理
|
||||
|
||||
> UEFI 规范定义了名为“UEFI 启动管理器”的一项功能 …… 是一种固件策略引擎,可通过修改固件架构中定义的全局 NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。……
|
||||
> ::: right
|
||||
> ——[(译)UEFI 启动:实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)
|
||||
> :::
|
||||
|
||||
本“议题”只讨论 UEFI 原生启动项和回退路径启动项。恕不对 BIOS 兼容的部分作详细展开。
|
||||
|
||||
### i. 原生启动项
|
||||
用 Windows 7 及更高版本系统的朋友肯定知道这个东西:Windows Boot Manager。`bootmgr`它代替了`ntldr`,从此便沿用至今。
|
||||
|
||||
事实上,Windows Boot Manager 是系统安装完成后,初次加载系统时为其创建的**原生启动项**。它明确指出需要启动**指定设备中**的**指定引导文件**(即`bootmgfw.efi`)。
|
||||
|
||||
即便 WinToGo 也是如此——在初次以 U 盘身份进入 WTG 系统时,Windows 也会为该设备作配置——所谓“正在准备设备”。在此过程中,顺带把原生启动项建立好。然后重启之后再按快捷键进入启动菜单,你**可能**会在**部分主板上**发现有两个启动项,指向同一个设备:
|
||||
```
|
||||
Windows Boot Manager ( Koi Series Pro ...)
|
||||
USB HDD: Koi Series Pro ...
|
||||
```
|
||||
需要注意的是,原生启动项是**存储在主板里的**(更准确的说,是全局 NVRAM 变量)。这多少可以解释为什么 Grub 引导那么脆弱(
|
||||
|
||||
### ii. 回退路径启动项
|
||||
对于 WinPE、Windows 安装镜像而言,它们并非用于长线运行,往往没有“准备设备”的步骤,那么 UEFI 如何认出它们捏?
|
||||
还记得上面提到的同一设备双启动项吗?UEFI 固件是能够找到可启动设备,并且尝试启动的。但它是依据什么去找的捏?
|
||||
|
||||
UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\BOOT\boot{cpu_arch}.efi`。前面的这一固定路径就称为**回退路径**,通过查找回退路径建立的启动项就称作**回退路径启动项**。其中,`cpu_arch`即 CPU 架构,已知的有:
|
||||
- `x64`:x86-64
|
||||
- `ia32`:x86-32
|
||||
- `ia64`:Itanium
|
||||
- `arm`:AArch32,即 arm32 ~~(胳膊 32)~~
|
||||
- `aa64`:AArch64,即 arm64 ~~(64 条胳膊)~~
|
||||
|
||||
> [!note]
|
||||
> UEFI 的路径系统与 Windows 类似:以`\`分隔,不区分大小写。
|
||||
|
||||
如果同一硬盘、同一 CPU 架构存在多个匹配的 EFI 文件(比如,可能有两个 ESP 分区,分开装不同系统的 EFI),那么**只会选第一个有效的**去执行。
|
||||
|
||||
对于 WinPE U 盘,通常它们是 MBR 分区表,那么会考虑更泛用的搜索:采用 **FAT** 文件系统的**活动分区**;
|
||||
对于 GPT 分区表,可以直接搜索 ESP 分区。当然如今的主板并不会卡那么死,哪怕只是普通的 FAT 分区,也会尝试搜索、执行。
|
||||
|
||||
也就是说,哪怕原生启动项意外被固件扬了,只要还有回退启动项,便仍可从同一个硬盘启动系统。
|
||||
|
||||
> [!info]
|
||||
> 实际上`bcdboot`工具会在 ESP 分区里同时写入`bootx64.efi`和`bootmgfw.efi`,这两个 EFI 除了文件名以外并无区别。
|
||||
> 前者即回退路径启动项,作为启动 Windows 的后备方案。
|
||||
|
||||
## 启动加载器(以 Grub 为主)
|
||||
这也是最广泛使用的启动方式 ~~,Windows 也干了~~。在 Linux 当中,最常用的加载器是 Grub。当然,也有使用 rEFInd 的。
|
||||
|
||||
启动加载器(bootloader)本身作为跳板,被 UEFI 固件加载后,需要根据配置找到真正的 Linux 内核,并经由内核引导用户硬盘上的 Arch 系统。而在 Windows 中,`bootmgfw.efi`会根据`BCD`配置文件,执行硬盘其中一个 Windows 副本中的`winload.exe`,并将该副本的其余加载流程交给它完成。
|
||||
|
||||
正常使用 Windows 单系统的用户可能对启动过程并无察觉,因为 Windows 为了确保能够启动,会时不时刷新启动项。但一旦与 Linux 混用,你就需要**留意 Linux 的加载器会不会被 Windows 刷下去(甚至被覆盖)**。除此之外,尽管因“机”而异,但 UEFI 固件**有可能会自动清理不再可用的启动项**。比如重新插拔固态,有可能会出现掉引导的情况。因此就个人来说,我不会再考虑 bootloader 了。
|
||||
|
||||
### i. 修复 Grub 引导
|
||||
Windows 启不动我们会尝试修复引导,Arch 亦然。修复 Grub 引导实际上就是**重走 Grub 安装流程**:
|
||||
|
||||
- `mount`挂载相应分区;
|
||||
- `genfstab`重建挂载表(如有必要);
|
||||
> 个人建议无论如何都重建一遍`fstab`。反正刷完绝对是最新的。
|
||||
- `arch-chroot`切换进硬盘上的系统;
|
||||
- `grub-install`重建 grub 引导。
|
||||
|
||||
### ii. 补充回退启动项
|
||||
事实上,需要反复重建 Grub 引导的一大原因就在于,Grub 只会写入它自己的`grubx64.efi`,以及原生启动项:
|
||||
|
||||

|
||||
|
||||
那么办法也很简单:像 Windows 那样也建一个回退路径启动项。具体来说,在 ESP 分区里建立`EFI\BOOT`目录,复制`grubx64.efi`重命名成`bootx64.efi`嘛。~~Windows 不也干了(~~
|
||||
当然如果是像图中那样不止一个 Grub,甚至同盘 Windows 和 Arch 双系统,那我不推荐你这么做。
|
||||
|
||||
> [!warning]
|
||||
> 不要在这边试图软链接节省空间!
|
||||
|
||||
## 固件直接引导(EFIStub)
|
||||
Grub 本身写入 ESP 的内容不多,配置啊、Linux 内核啊都在`/boot`。有人便主张把`/boot`还给`/`,ESP 分区实际挂载`/efi`。
|
||||
而岛风则提出了更激进的主张:让固件直接引导内核。
|
||||
|
||||
> An EFI boot stub (aka EFI stub) is **a kernel that is an EFI executable**,
|
||||
> i.e. that can directly be booted from the UEFI.
|
||||
> ::: right
|
||||
> ——[Arch Wiki: EFIStub](https://wiki.archlinux.org/title/EFISTUB)
|
||||
> :::
|
||||
|
||||
根据 Wiki,**默认情况下** Arch Linux 的内核本身就是可启动 EFI,只是需要附加[**内核参数**](https://wiki.archlinux.org/title/Kernel_parameters#Parameter_list):
|
||||
```
|
||||
# 为便于阅读,这里分了三行。
|
||||
root=UUID=7a6afcd0-a25a-4a6c-bf7b-920b53097eae
|
||||
resume=UUID=b84ae173-edbc-442c-b00b-5c47eef203f1
|
||||
rw loglevel=3 quiet initrd=\intel-ucode.img initrd=\initramfs-linux.img
|
||||
```
|
||||
::: details 内核参数详解
|
||||
Grub 等启动加载器的本职工作就是帮你引导内核,因此它们的配置文件已经包含完整的内核参数了。
|
||||
我上面列的内核参数是参照 Wiki 自行搭配,确认可行的参数。你也可以查 Wiki 自行组合。
|
||||
- `root`:`/`分区。目前只见到 UUID 填法。
|
||||
- `rw rootflags=subvol=@`:对`/`分区挂载的附加属性,比如可读写、指定 Btrfs 子卷。
|
||||
- `resume`:休眠使用的交换分区,同样只见到 UUID 填法。休眠时会在指定 Swap 里创建内存映像。
|
||||
- `loglevel=3 quiet`:内核加载时的附加属性,如日志等级之类。
|
||||
- `initrd=\intel-ucode.img`:加载的初始化内存盘 (Init RAM Disk)。
|
||||
一个`.img`一条`initrd=`,路径用`\`分隔,顺序自左向右(可以参见 grub 的配置文件)
|
||||
|
||||
> [!note]
|
||||
> 个人觉得这里 initrd 称作“初始化映像”更合适,毕竟需要填`.img`嘛。
|
||||
:::
|
||||
|
||||
LiveCD 里的`efibootmgr`工具可以直接操作固件的启动项。当然若是遵照律回指南和 Miku 指南,那么`efibootmgr`业已安装到你的系统中,你可以在运行中的本机 Arch 系统中折腾:
|
||||
```bash
|
||||
# 首先确定你要操作的硬盘和分区,不要搞错。UUID 马上就会用到。
|
||||
lsblk -o name,mountpoint,uuid
|
||||
# 参见 Wiki,以 Btrfs 为例,仅供参考
|
||||
sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 \
|
||||
--label "Arch Linux" --loader /vmlinuz-linux \
|
||||
--unicode 'root=UUID=f6419b76-c55b-4d7b-92f7-99c3b04a2a6f rw rootflags=subvol=@ loglevel=3 quiet initrd=\intel-ucode.img initrd=\initramfs-linux.img'
|
||||
```
|
||||
::: note 创建启动项命令详解
|
||||
- `--part 1`:你的 ESP 分区序号。根据`lsblk`的树状图顺序判别。
|
||||
- `--label "Arch Linux"`:启动项名称。大多数固件并不支持中文。
|
||||
- `--unicode`后面跟内核参数。
|
||||
:::
|
||||
|
||||
归根结底,EFIStub 代替了启动加载器,由我们用户手动建立 UEFI 原生启动项。但这种方式硬要说优点吧……可能也就比 Grub 快那么几秒而已。维护起来并不比 Grub 轻松多少。
|
||||
|
||||
## 统一内核映像(UKI)
|
||||
在应用 EFIStub 的时候我就在想,有没有可能写一个`bootx64.efi`,直接带内核参数启动`vmlinuz-linux`呢。后面偶然找到了“统一内核映像”的介绍,豁然开朗。
|
||||
|
||||
> A unified kernel image (UKI) is a **single executable** which can be **booted directly from UEFI firmware**, or automatically sourced by boot loaders with little or no configuration.
|
||||
> ::: right
|
||||
> ——[Arch Wiki: Unified Kernel Image](https://wiki.archlinux.org/title/Unified_kernel_image)
|
||||
> :::
|
||||
|
||||
根据介绍,UKI 实际上就是将内核引导的资源整合起来,打包而成的 EFI 可执行文件。某种意义上这也算是一种「固件直接引导」,只不过 EFIStub 只创建原生启动项,而它两种启动项都可以做。
|
||||
|
||||
::: info UKI 通常包含……
|
||||
> 摘自 [UAPI Group Specifications](https://uapi-group.org/specifications/specs/unified_kernel_image/)。
|
||||
|
||||
- EFI 执行代码(决定它“可执行 EFI”的本质)
|
||||
- Linux 内核
|
||||
- 【可选】内核参数
|
||||
- 【可选】初始化内存盘
|
||||
- 【可选】CPU 微码
|
||||
- 【可选】描述信息、启动屏幕图、设备树……(不重要)
|
||||
|
||||
只要集成了 EFI 执行代码和 Linux 内核,就可以称作统一内核映像了。
|
||||
:::
|
||||
|
||||
接下来以`mkinitcpio`为例,但是不走寻常路。
|
||||
|
||||
### i. 内核参数
|
||||
Wiki 中介绍了两种方法:
|
||||
- 动`/etc/cmdline.d/`里的`.conf`配置。像`root.conf`决定`/`如何挂载,等等。
|
||||
- 直接把所有参数搓成一行 echo 给`/etc/kernel/cmdline`文件。
|
||||
|
||||
于我而言,显然第二种更方便。
|
||||
```bash
|
||||
# 我在 LiveCD 里 arch-chroot 进去做的。别问我为什么没权限。
|
||||
echo 'root=UUID=... resume=UUID=... rw loglevel=3 quiet' > /etc/kernel/cmdline
|
||||
```
|
||||
与 EFIStub 不同,这里不需要指定`initrd=`——工具会自己打包。
|
||||
|
||||
> [!warning]
|
||||
> 若启用“安全启动”,且 UKI 封装了内核参数,则 UEFI 固件会无视外部传入的其余参数。
|
||||
|
||||
### ii. 预设文件
|
||||
编辑`/etc/mkinitcpio.d/linux.preset`。我们前面说过“不走寻常路”,关键就在这里。
|
||||
|
||||
下面是我自用的`linux.preset`。~~想走寻常路的话还是抄别人的预设吧。~~
|
||||
```properties
|
||||
# mkinitcpio preset file for the 'linux' package
|
||||
|
||||
ALL_config="/etc/mkinitcpio.conf"
|
||||
ALL_kver="/boot/vmlinuz-linux"
|
||||
|
||||
PRESETS=('default' 'fallback')
|
||||
|
||||
#default_config="/etc/mkinitcpio.conf"
|
||||
#default_image="/boot/initramfs-linux.img"
|
||||
|
||||
default_uki="/efi/EFI/BOOT/bootx64.efi"
|
||||
#default_uki="/efi/EFI/Linux/arch-linux.efi"
|
||||
#default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
|
||||
|
||||
#fallback_config="/etc/mkinitcpio.conf"
|
||||
#fallback_image="/boot/initramfs-linux-fallback.img"
|
||||
|
||||
fallback_uki="/boot/arch-linux-fallback.efi"
|
||||
#fallback_uki="/efi/EFI/Linux/arch-linux-fallback.efi"
|
||||
fallback_options="-S autodetect"
|
||||
```
|
||||
> [!warning]
|
||||
> 有的教程会出现`ALL_microcode=(/boot/*-ucode.img)`这一句。
|
||||
> 这种指定微码的方法已经废弃,`/etc/mkinitcpio.conf`已经有针对微码的 Hook 了,无需手动指定。
|
||||
|
||||
正常来说 UKI 均会输出到`/efi/EFI/Linux/arch-linux*.efi`,据称`systemd-boot`可以扫到并引导 UKI。
|
||||
但生成`bootx64.efi`让固件去加载不更直接?所以我选择直接导出到回退路径,如此连`efibootmgr`都不需要了。
|
||||
|
||||
另一方面,`fallback`也会生成 UKI,但`bootx64.efi`只有一个。注意到之前 EFIStub 一节我只给`initramfs-linux`构建了原生启动项,那么`fallback`自然丢回`/boot`里不管它。
|
||||
|
||||
> [!note]
|
||||
> 把`fallback`移回`/boot`还有一重原因:尽量缩减 ESP 分区体积——本来`/efi`设计上也有减小 ESP 分区大小的意图。
|
||||
> 我试跑完发现`fallback.efi`高达 140+MB,而`arch-linux.efi`不过 30MB。
|
||||
>
|
||||
> 当然,保险起见,我并没有尝试`default`生成 UKI、`fallback`仍生成内存盘的做法,也没有试图把`fallback`预设直接干掉。
|
||||
> 如有勇士试验过一切正常,欢迎 Issues 反馈(
|
||||
|
||||
### iii. 创建映像
|
||||
按需建立路径,并跑一遍生成:
|
||||
```bash
|
||||
mkdir -p /efi/EFI/BOOT/
|
||||
mkinitcpio -p linux
|
||||
```
|
||||
还是那句话,想循规蹈矩的不要学我。
|
||||
|
||||
---
|
||||
|
||||
建完之后退出系统,重启按快捷键进入启动菜单,这下该有你硬盘的 UEFI 回退路径启动项了:
|
||||
```
|
||||
HDD: PM8512GPKTCB4BACE-E162
|
||||
```
|
BIN
docs/notes/OS/esp_without_bootARCH.png
Normal file
BIN
docs/notes/OS/esp_without_bootARCH.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 KiB |
Reference in New Issue
Block a user