Edit Notes - Rearrange, Appendix, Bugfixes.
@@ -33,42 +33,43 @@ star: true
|
||||
|
||||
## 参考链接
|
||||
|
||||
本文有参考以下两篇安装教程:
|
||||
本文有参考以下的安装教程:
|
||||
|
||||
1. [律回彼境:Arch Linux 折腾指南&记录](https://www.glowmem.com/archives/archlinux-note)(以下简称“律回指南”)
|
||||
2. [Nakano Miku:Arch 简明指南](https://arch.icekylin.online/guide/)(以下简称“Miku 指南”)
|
||||
3. [Arch Wiki:Installation Guide](https://wiki.archlinux.org/title/Installation_guide)
|
||||
|
||||
## I. 前期准备
|
||||
|
||||
- 下载安装镜像:[清华镜像 (25.06.01)](https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-2025.06.01-x86_64.iso)、[官方下载](https://archlinux.org/download/)。
|
||||
- 下载安装镜像:[清华镜像 (最新版本)](https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest)、[官方下载](https://archlinux.org/download/)。
|
||||
|
||||
> 烧录过程不再赘述,推荐用 Ventoy 统一管理安装镜像。[参见 Ventoy 中文主页](https://www.ventoy.net/cn/)
|
||||
|
||||
- 固件^1^:启用 UEFI、禁用安全启动(Secure Boot)。
|
||||
|
||||
> 近十几年的主板大都支持 UEFI,我也懒得花篇幅去讲传统 BIOS 引导。对于 Arch Linux 的 UEFI 引导方式,我[另有一篇笔记](./ArchUEFI.md)讨论,可供安装阶段参考。
|
||||
> 至于 Secure Boot,不用想了,给`.efi`启动文件签名着实是件麻烦事。我爱折腾,但不爱做没意义、意义不大的折腾。
|
||||
> 近十几年的主板大都支持 UEFI,我也懒得花篇幅去讲传统 BIOS 引导。对于 Arch Linux 的 UEFI 引导方式,我[另有一篇笔记](./ArchUEFI.md)讨论,可供部署阶段参考。
|
||||
> 至于 Secure Boot,不用想了,给`.efi`启动文件签名着实是件麻烦事。~~对我而言折腾这个没有意义。~~
|
||||
|
||||
- 网络^2^:如需连接 WiFi,提前把 WiFi 名字(SSID)改成英文。
|
||||
|
||||
> 安装全程在命令行(CLI)环境进行,并且 LiveCD(维护环境,下同)的终端字体**不支持中文**。除非附近没有别的 WiFi 起中文名字,否则还是改你自己的 WiFi 比较妥。
|
||||
> 安装全程在命令行(CLI)环境进行,并且 LiveCD(维护环境,下同)**显示不出中文,也打不出中文**。
|
||||
|
||||
> [!tip]
|
||||
> 如果只是迁移系统,那么进入维护环境之后只需`rsync`做全盘搬运即可(当然前提是目标**盘**要比原**系统**的实际占用空间要大)。可参见 [lin.moe](https://lin.moe/tutorial/2020/04/arch_migrate/)。
|
||||
|
||||
## II. LiveCD 基础配置
|
||||
|
||||
与[律回指南 Ch.1](https://glowmem.com/archives/archlinux-note#%E4%B8%80%E8%BF%9E%E6%8E%A5%E7%BD%91%E7%BB%9C%E5%92%8C%E6%97%B6%E5%8C%BA%E9%85%8D%E7%BD%AE) 相同,但省略了分配固定 IP 的一步(我完全可以进路由器里猹询)。
|
||||
与[律回指南 Ch.1](https://glowmem.com/archives/archlinux-note#%E4%B8%80%E8%BF%9E%E6%8E%A5%E7%BD%91%E7%BB%9C%E5%92%8C%E6%97%B6%E5%8C%BA%E9%85%8D%E7%BD%AE) 相同,但省略了分配固定 IP 的一步(我完全可以`ip addr`猹询)。
|
||||
|
||||
## III. 分区
|
||||
对于固态硬盘,**不提倡建立过多的分区**。那么在 UEFI 启动的系统盘上,至少可以这么分:
|
||||
对于固态硬盘,**不提倡建立过多的分区**。那么在 UEFI 启动、GPT 分区表的系统盘上,至少可以这么分:
|
||||
|
||||
- EFI 启动分区[^esp]:挂载`/efi`或`/boot`[^esp_mountpoint]
|
||||
- 系统分区:挂载根目录`/`
|
||||
|
||||
我个人在此基础上,倾向于*在硬盘(逻辑扇区的)末端*开多一个交换分区。
|
||||
|
||||
[^esp]: 对于 GPT 分区表,有专门的“EFI System”(即 ESP)分区类型,当然新款的主板也会*连带扫描 FAT 分区*;对于 MBR 分区表,则扫描**活动**的 FAT 分区。参见 [UEFI 启动的实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)。
|
||||
[^esp]: GPT 分区表有专门的“EFI System”分区类型(即 ESP),当然新款的主板也会*连带扫描 FAT 分区*;对于 MBR 分区表,则扫描**活动**的 FAT 分区。参见 [(译)UEFI 启动的实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)。
|
||||
|
||||
[^esp_mountpoint]: ESP 装载`/boot`系经典分区法。后来有说法称“直接暴露 Linux 内核并不安全”,所以又有将 ESP 装入`/boot/efi`的分法(Ubuntu Server 24.04.2 即如此)。现在(至少在 Arch 里)则推荐直接挂载到`/efi`。
|
||||
|
||||
@@ -77,13 +78,15 @@ star: true
|
||||
- :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)
|
||||
|
||||
然后是挂载。挂载**务必先挂载`/`**,务必先挂载`/`,务必先挂载`/`!除此之外,别忘了挂载交换分区(如果有的话)。
|
||||
然后是挂载。务必注意**先挂载`/`**!此外,**不要把不同分区、子卷挂到同一个挂载点上**;**有分交换分区的话记得`swapon`**。
|
||||
|
||||
## IV. pacman 配置
|
||||
|
||||
### i. 换源
|
||||
|
||||
Linux 的包管理器默认用的国外的软件源,`pacman`也一样。因此,非常建议先换用国内镜像,加快包下载速度。
|
||||
Linux 的包管理器默认食用国外的软件源,`pacman`也一样。因此,非常建议先换用国内镜像,加快包下载速度。
|
||||
|
||||
然鹅在更换之前可能需要等待片刻:一经联网,`reflector`会自动筛选**最新**的 20 个镜像站,然后才从快到慢排序^3^。如果换源过早,很可能会被`reflector`摘桃子。
|
||||
|
||||
编辑`/etc/pacman.d/mirrorlist`(`vim`还是`nano`请自便):
|
||||
```ini
|
||||
@@ -118,37 +121,70 @@ ParallelDownloads = 5 # 最大并行下载数(根据你的网速自行斟酌
|
||||
> 很遗憾,经实测 pacman 配置并不会复制过去。在安装完系统`arch-chroot`进去进一步配置时,你需要重复做一遍上述操作。
|
||||
|
||||
## V. 正式部署
|
||||
参见 [Miku 指南—基础安装—9. 安装系统](https://arch.icekylin.online/guide/rookie/basic-install.html#_9-%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F)。当然我偏向于律回指南,除此之外还会提前装些工具:
|
||||
|
||||
- CPU 微码:`intel-ucode`或`amd-ucode`;
|
||||
- 基础命令行工具:`vi` `nano` `git` `wget` `tmux` `openssh` `htop`
|
||||
- Windows 文件系统(NTFS)支持:`ntfs-3g`
|
||||
参见 [Miku 指南—基础安装—9. 安装系统](https://arch.icekylin.online/guide/rookie/basic-install.html#_9-%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F)。或者像律回指南那样顺手装一些工具也无何不可:
|
||||
|
||||
不过……不知道以后好不好使就是了。之前律回指南还提前装了`yay`和`neofetch`,但现在不行了。
|
||||
```sh
|
||||
pacstrap -K /mnt base linux linux-firmware base-devel linux-headers \
|
||||
vi vim nano git wget tmux openssh networkmanager htop ntfs-3g \
|
||||
intel-ucode # or `amd-ucode`
|
||||
```
|
||||
|
||||
然后`genfstab -U /mnt > /mnt/etc/fstab`生成挂载表,`arch-chroot /mnt`切换进新系统里,继续配置吧。
|
||||
::: warning “密钥环不可写”报错
|
||||
之前出现过`pacman-init.service`意外暴死,导致找不到密钥环的情况:
|
||||
```log
|
||||
(126/126) checking keys in keyring
|
||||
warning: Public keyring not found; have you run `pacman-key --init`?
|
||||
downloading required keys...
|
||||
error: keyring is not writable
|
||||
...
|
||||
error: failed to commit transaction (unexpected error)
|
||||
```
|
||||
对此,[这篇讨论贴](https://bbs.archlinux.org/viewtopic.php?id=283075)中有人提供了个取巧的方案:
|
||||
```sh
|
||||
pacman-key --init
|
||||
pacman-key --populate
|
||||
```
|
||||
实测可用。至于成因,贴中有人指出是系统时钟未校准导致,但我当时是来不及`timedatectl`就已经暴死了,具体原因不明。
|
||||
:::
|
||||
|
||||
接下来的配置我参考了[律回指南 Ch.4](https://glowmem.com/archives/archlinux-note#%E5%9B%9B%E7%B3%BB%E7%BB%9F%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE),不过在`visudo`处我没有取消“免密`sudo`”的注释。**免密`sudo`还不如直接`su`,干脆也不用创建非 root 用户了**。
|
||||
然后`genfstab -U /mnt > /mnt/etc/fstab`生成挂载表;
|
||||
再`arch-chroot /mnt`切换进新系统里,继续配置吧。
|
||||
|
||||
---
|
||||
|
||||
接下来在`chroot`环境里的配置我参考了[律回指南 Ch.4](https://glowmem.com/archives/archlinux-note#%E5%9B%9B%E7%B3%BB%E7%BB%9F%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE),大体也符合官方文档的流程:调整时区、系统编码、设置主机名、root 密码、新建用户、配置 EFI 引导。
|
||||
|
||||
不过在`visudo`那一步我没有启用“免密`sudo`”(如下),律回本人也意识到免密`sudo`并不安全。
|
||||
```
|
||||
## Same thing without a password
|
||||
#%wheel ALL=(ALL:ALL) NOPASSWD: ALL
|
||||
```
|
||||
|
||||
> [!note]
|
||||
> 除了上述标准流程之外,后续有些步骤也可以提前在`chroot`里完成。但**如果你是初次上手,还是一步一步慢慢来吧**。
|
||||
|
||||
## VI. 新系统的配置
|
||||
跟着律回指南的三、四章装好系统之后,重启登入新系统的终端。
|
||||
首先通过`nmtui`连上 WiFi。
|
||||
|
||||
### i. CN 源和 AUR 助手
|
||||
在**联好网的新系统**里配置`archlinuxcn`源:`sudo nano /etc/pacman.conf`
|
||||
在**联好网的新系统**里配置`archlinuxcn`源:再次打开`/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^。
|
||||
::: warning 密钥环缺少信任
|
||||
若 CN 源的包安装失败,遭遇`signature ... is marginal trust`报错,可本地信任那个人的 Key。之前`farseerfc`掉过一次,以他为例:
|
||||
```sh
|
||||
sudo pacman-key --lsign-key "farseerfc@archlinux.org"
|
||||
```
|
||||
然后重试即可。不过截至 25 年国庆为止,`farseerfc`的信任已经恢复,我安装时并未遭遇类似情况。
|
||||
:::
|
||||
|
||||
### ii. 硬件(一)音频安装
|
||||
@@ -160,7 +196,7 @@ 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
|
||||
::: details pulseaudio
|
||||
除了 pipewire 音频方案之外另有`pulseaudio`可供选择。但务必注意:音频管理套件**只能二选一,不可以混装**。
|
||||
|
||||
另外,由于 pipewire 本身不单只负责音频管理的工作,如需装 pulseaudio 仍需安装`pipewire` `gst-plugin-pipewire`两个包。
|
||||
@@ -175,7 +211,7 @@ sudo pacman -S pipewire gst-plugin-pipewire pipewire-alsa pipewire-jack pipewire
|
||||
> 但 pulseaudio 仍需要这个包。
|
||||
:::
|
||||
|
||||
显卡、蓝牙等其他硬件设施需要在装好桌面环境后再考虑。至少**到本小节为止你的系统里并没有蓝牙服务**,无法启用。
|
||||
显卡驱动等其他硬件设施需要等装好桌面环境再考虑,在只有字符色块滚过的纯终端环境里也没有折腾显卡驱动的必要。
|
||||
|
||||
### iii. KDE 桌面环境
|
||||
|
||||
@@ -190,7 +226,7 @@ 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
|
||||
sudo reboot now
|
||||
```
|
||||
|
||||
::: info KDE 6 vs KDE 5?
|
||||
@@ -216,7 +252,7 @@ KDE 的图形实现默认已经是 Wayland 了。在开机后输入用户密码
|
||||
|
||||
AMD 或 NVIDIA 显卡可参见[律回指南 §6.4](https://glowmem.com/archives/archlinux-note#4%E6%98%BE%E5%8D%A1%E9%A9%B1%E5%8A%A8%E5%AE%89%E8%A3%85)
|
||||
和 [Miku 指南—进阶安装—显卡驱动](https://arch.icekylin.online/guide/rookie/graphic-driver.html)篇。
|
||||
但我是锐炬核显捏,只需要在 Konsole 终端里`sudo pacman -S`安装图形 API:
|
||||
但我是锐炬核显捏,只需要在 Konsole 终端里`sudo pacman -S`安装英特尔的驱动:
|
||||
|
||||
- `mesa` `lib32-mesa`(OpenGL)
|
||||
- `vulkan-intel` `lib32-vulkan-intel`(Vulkan)
|
||||
@@ -226,7 +262,7 @@ AMD 或 NVIDIA 显卡可参见[律回指南 §6.4](https://glowmem.com/archi
|
||||
```bash
|
||||
sudo systemctl enable --now bluetooth
|
||||
```
|
||||
> 之前误以为`bluetooth`是 Arch 本身就有的服务,结果发现是桌面环境依赖了蓝牙组件包。
|
||||
> 之前误以为`bluetooth`是 Arch 本身就有的服务,结果发现是桌面环境依赖了蓝牙组件包`bluez`。
|
||||
|
||||
### v. 额外中文字体和输入法
|
||||
|
||||
@@ -310,14 +346,23 @@ VSCode 的主侧栏“源代码管理”页提交时并不会走终端,也就
|
||||
|
||||
所以我选择编辑`~/.gnupg/gpg-agent.conf`:
|
||||
```properties
|
||||
default-cache-ttl 28800
|
||||
default-cache-ttl 21600
|
||||
pinentry-program /usr/bin/pinentry-qt
|
||||
```
|
||||
保存后重启`gpg-agent`:`gpg-connect-agent reloadagent /bye`。
|
||||
|
||||
::: info 其他端 pinentry
|
||||
理论上`pinentry`自身可以根据 XDG 后端选择适用的版本:
|
||||
```sh
|
||||
ls /usr/bin | grep 'pinentry'
|
||||
echo GETPIN | pinentry
|
||||
```
|
||||
你可以用这两条命令看看都支持什么后端,以及它会自动选择哪个。像 niri 通常会装 gnome 后端,测试结果也的确会出`pinentry-gnome3`的密码框。
|
||||
:::
|
||||
|
||||
除此之外,`pinentry`需要指定 tty,否则找不到 IO 设备也会炸。解法:`export GPG_TTY=$(tty)`。
|
||||
|
||||
经测试,大部分终端均能在 SSH 连接中调出 CUI;VSCode Remote-SSH 打开的终端可能比较特殊,仍然无法签名。个人还是建议单独开个终端作为 workaround。
|
||||
经测试,大部分终端均能在 SSH 连接中调出 CUI。若 VSCode Remote-SSH 打开的终端签不了名,检查一下是不是终端分割得太小了。
|
||||
|
||||
### II. GPG 密钥备份(导出导入)
|
||||
之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时,
|
||||
@@ -24,7 +24,7 @@ tag:
|
||||
|
||||
## UEFI 启动简述:启动项管理
|
||||
|
||||
> UEFI 规范定义了名为“UEFI 启动管理器”的一项功能 …… 是一种固件策略引擎,可通过修改固件架构中定义的全局 NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。……
|
||||
> UEFI 规范定义了名为“UEFI 启动管理器”的一项功能……(它)是一种固件策略引擎,可通过修改固件架构中定义的全局 NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。……
|
||||
> ::: right
|
||||
> ——[(译)UEFI 启动:实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)
|
||||
> :::
|
||||
@@ -36,15 +36,15 @@ tag:
|
||||
|
||||
事实上,Windows Boot Manager 是系统安装完成后,初次加载系统时为其创建的**原生启动项**。它明确指出需要启动**指定设备中**的**指定引导文件**(即`bootmgfw.efi`)。
|
||||
|
||||
即便 WinToGo 也是如此——在初次以 U 盘身份进入 WTG 系统时,Windows 也会为该设备作配置——所谓“正在准备设备”。在此过程中,顺带把原生启动项建立好。然后重启之后再按快捷键进入启动菜单,你**可能**会在**部分主板上**发现有两个启动项,指向同一个设备:
|
||||
即便 WinToGo 也是如此——在以 U 盘身份进入 WTG 系统时,Windows 也会悄悄地把原生启动项建立好。然后重启之后再按快捷键进入启动菜单,你**可能**会在**部分主板上**发现有两个启动项,指向同一个设备:
|
||||
```
|
||||
Windows Boot Manager ( Koi Series Pro ...)
|
||||
USB HDD: Koi Series Pro ...
|
||||
```
|
||||
需要注意的是,原生启动项是**存储在主板里的**(更准确的说,是全局 NVRAM 变量)。这多少可以解释为什么 Grub 引导那么脆弱(
|
||||
需要注意的是,原生启动项是**存储在主板里的**(更准确的说,是全局 NVRAM 变量)。有些主板在检测到原生启动项失效(找不到指定引导文件)后,会自行删除该启动项。比如安装 Grub 后更换过硬盘,后来又把原盘插回去,可能仍然找不到 Grub 启动项。
|
||||
|
||||
### ii. 回退路径启动项
|
||||
对于 WinPE、Windows 安装镜像而言,它们并非用于长线运行,往往没有“准备设备”的步骤,那么 UEFI 如何认出它们捏?
|
||||
对于 WinPE、Windows 安装镜像而言,它们并非用于长线运行,不可能到处添加原生启动项,那么 UEFI 如何认出它们捏?
|
||||
还记得上面提到的同一设备双启动项吗?UEFI 固件是能够找到可启动设备,并且尝试启动的。但它是依据什么去找的捏?
|
||||
|
||||
UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\BOOT\boot{cpu_arch}.efi`。前面的这一固定路径就称为**回退路径**,通过查找回退路径建立的启动项就称作**回退路径启动项**。其中,`cpu_arch`即 CPU 架构,已知的有:
|
||||
@@ -64,16 +64,20 @@ UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\
|
||||
|
||||
也就是说,哪怕原生启动项意外被固件扬了,只要还有回退启动项,便仍可从同一个硬盘启动系统。
|
||||
|
||||
> [!info]
|
||||
> 实际上`bcdboot`工具会在 ESP 分区里同时写入`bootx64.efi`和`bootmgfw.efi`,这两个 EFI 除了文件名以外并无区别。
|
||||
> 前者即回退路径启动项,作为启动 Windows 的后备方案。
|
||||
::: info
|
||||
实际上`bcdboot`工具会在 ESP 分区里同时写入`bootx64.efi`和`bootmgfw.efi`。前者即回退路径启动项。
|
||||
|
||||
有关`bootx64.efi`、`bootmgr(.efi)`和`bootmgfw.efi`的关系可能有些复杂,[微软文档](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/bcd-system-store-settings-for-uefi?view=windows-11)也只隐晦地给出了一部分,谷歌了一圈各种观点都有。本着实事求是的原则,我不会糅合这些观点提出假设,只附上几个问题:
|
||||
- Windows 的`bootx64.efi`分别在本机 Windows、WinToGo 和 WinPE 中起到什么作用?它是否真的等同于(或者等价于)`bootmgfw.efi`(或是`bootmgr`)?
|
||||
- 到底是 fwbootmgr(即`bootmgfw.efi`)调用 bootmgr,还是反过来呢?二者是谁“悄悄地”为 UEFI NVRAM 添加原生启动项?
|
||||
:::
|
||||
|
||||
## 启动加载器(以 Grub 为主)
|
||||
这也是最广泛使用的启动方式 ~~,Windows 也干了~~。在 Linux 当中,最常用的加载器是 Grub。当然,也有使用 rEFInd 的。
|
||||
|
||||
启动加载器(bootloader)本身作为跳板,被 UEFI 固件加载后,需要根据配置找到真正的 Linux 内核,并经由内核引导用户硬盘上的 Arch 系统。而在 Windows 中,`bootmgfw.efi`会根据`BCD`配置文件,执行硬盘其中一个 Windows 副本中的`winload.exe`,并将该副本的其余加载流程交给它完成。
|
||||
启动加载器(bootloader)本身作为跳板,被 UEFI 固件加载后,需要根据配置找到真正的 Linux 内核,并经由内核引导用户硬盘上的 Arch 系统。而在 Windows 中,`boot[a-z]{3,4}.efi`会根据`BCD`配置文件,执行硬盘其中一个 Windows 副本中的`winload.efi`,并将该副本的其余加载流程交给它完成。
|
||||
|
||||
正常使用 Windows 单系统的用户可能对启动过程并无察觉,因为 Windows 为了确保能够启动,会时不时刷新启动项。但一旦与 Linux 混用,你就需要**留意 Linux 的加载器会不会被 Windows 刷下去(甚至被覆盖)**。除此之外,尽管因“机”而异,但 UEFI 固件**有可能会自动清理不再可用的启动项**。比如重新插拔固态,有可能会出现掉引导的情况。因此就个人来说,我不会再考虑 bootloader 了。
|
||||
正常使用 Windows 单系统的用户可能对启动过程并无察觉,但一旦与 Linux 混用,你就需要**留意 Linux 的加载器会不会被 Windows 刷下去(甚至被覆盖)**。除此之外,固件和内核之间隔着加载器这么一块跳板,势必会拖慢引导流程。因此就个人来说,我不会再考虑 Grub 这类方案了。
|
||||
|
||||
### i. 修复 Grub 引导
|
||||
Windows 启不动我们会尝试修复引导,Arch 亦然。修复 Grub 引导实际上就是**重走 Grub 安装流程**:
|
||||
@@ -83,17 +87,21 @@ Windows 启不动我们会尝试修复引导,Arch 亦然。修复 Grub 引导
|
||||
> 个人建议无论如何都重建一遍`fstab`。反正刷完绝对是最新的。
|
||||
- `arch-chroot`切换进硬盘上的系统;
|
||||
- `grub-install`重建 grub 引导。
|
||||
- `grub-mkconfig`重建 grub 配置(可能不需要……?)。
|
||||
|
||||
### ii. 补充回退启动项
|
||||
### ii. 改用回退启动项
|
||||
事实上,需要反复重建 Grub 引导的一大原因就在于,Grub 只会写入它自己的`grubx64.efi`,以及原生启动项:
|
||||
|
||||

|
||||
|
||||
那么办法也很简单:像 Windows 那样也建一个回退路径启动项。具体来说,在 ESP 分区里建立`EFI\BOOT`目录,复制`grubx64.efi`重命名成`bootx64.efi`嘛。~~Windows 不也干了(~~
|
||||
那么办法也很简单:像 Windows 那样也建一个回退路径启动项。最简单的做法当然是复制改名,若求稳妥可以考虑用`grub-install`刷:
|
||||
```sh
|
||||
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --removable
|
||||
```
|
||||
当然如果是像图中那样不止一个 Grub,甚至同盘 Windows 和 Arch 双系统,那我不推荐你这么做。
|
||||
|
||||
> [!warning]
|
||||
> 不要在这边试图软链接节省空间!
|
||||
> 不要在这里试图用软链接节省空间!
|
||||
|
||||
## 固件直接引导(EFIStub)
|
||||
Grub 本身写入 ESP 的内容不多,配置啊、Linux 内核啊都在`/boot`。有人便主张把`/boot`还给`/`,ESP 分区实际挂载`/efi`。
|
||||
@@ -166,12 +174,12 @@ sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 \
|
||||
只要集成了 EFI 执行代码和 Linux 内核,就可以称作统一内核映像了。
|
||||
:::
|
||||
|
||||
接下来以`mkinitcpio`为例,但是不走寻常路。
|
||||
接下来以`mkinitcpio`为例。
|
||||
|
||||
### i. 内核参数
|
||||
Wiki 中介绍了两种方法:
|
||||
- 动`/etc/cmdline.d/`里的`.conf`配置。像`root.conf`决定`/`如何挂载,等等。
|
||||
- 直接把所有参数搓成一行 echo 给`/etc/kernel/cmdline`文件。
|
||||
- 向`/etc/cmdline.d/`里投喂`.conf`配置(文件名随意)。比如`root.conf`决定`/`如何挂载,等等。
|
||||
- 直接把所有参数搓成一行 echo 喂给`/etc/kernel/cmdline`文件。
|
||||
|
||||
于我而言,显然第二种更方便。
|
||||
```bash
|
||||
@@ -183,47 +191,24 @@ echo 'root=UUID=... resume=UUID=... rw loglevel=3 quiet' > /etc/kernel/cmdline
|
||||
> [!warning]
|
||||
> 若启用“安全启动”,且 UKI 封装了内核参数,则 UEFI 固件会无视外部传入的其余参数。
|
||||
|
||||
::: info [GPT 分区自动挂载](https://wiki.archlinuxcn.org/wiki/Systemd#GPT%E5%88%86%E5%8C%BA%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD)
|
||||
跟 [@Vescrity](https://github.com/Vescrity)讨论的时候我俩都觉得分区 UUID 太长了,于是他尝试省略掉`root=`参数。
|
||||
就结果来看还真可行,顺带附上他的折腾记录:[Yukitoha Blogs:从统一内核镜像启动](https://vescrity.github.io/post/UKI/)。
|
||||
:::
|
||||
|
||||
### ii. 预设文件
|
||||
编辑`/etc/mkinitcpio.d/linux.preset`。我们前面说过“不走寻常路”,关键就在这里。
|
||||
|
||||
下面是我自用的`linux.preset`。~~想走寻常路的话还是抄别人的预设吧。~~
|
||||
编辑`/etc/mkinitcpio.d/linux.preset`。
|
||||
```properties
|
||||
# mkinitcpio preset file for the 'linux' package
|
||||
|
||||
ALL_config="/etc/mkinitcpio.conf"
|
||||
ALL_kver="/boot/vmlinuz-linux"
|
||||
|
||||
PRESETS=('default' 'fallback')
|
||||
#PRESETS=('default' 'fallback')
|
||||
PRESETS=('default')
|
||||
|
||||
#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"
|
||||
default_uki="/efi/EFI/BOOT/bootx64.efi"
|
||||
default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
|
||||
```
|
||||
> [!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 反馈(
|
||||
本身 UKI 默认是丢到`esp\EFI\Linux\arch-linux*.efi`里的,相对来说已经比较通用(Grub 可以直接读,据说`systemd-boot`也可以扫描到,也可以直接刷进 NVRAM)。但我尝试 UKI 本就是为了摒弃前面两种方案,殊途同归反倒不值得这么整了。所以我个人选择直接让 UEFI 固件直接加载回退路径启动项。
|
||||
|
||||
### iii. 创建映像
|
||||
按需建立路径,并跑一遍生成:
|
||||
@@ -231,7 +216,7 @@ fallback_options="-S autodetect"
|
||||
mkdir -p /efi/EFI/BOOT/
|
||||
mkinitcpio -p linux
|
||||
```
|
||||
还是那句话,想循规蹈矩的不要学我。
|
||||
如有必要,清理系统中废旧的启动文件(Grub、……),并用`efibootmgr`手动清理遗留的原生启动项。
|
||||
|
||||
---
|
||||
|
||||
@@ -28,7 +28,7 @@ Plex 怎样我不清楚,但 Emby 对文件摆放的要求的确是比 Jellyfin
|
||||
- 音声(实写录播)
|
||||
- 画师的差分图(Fanbox、Patreon,等等)
|
||||
- MMD
|
||||
- 可爱的女装照(不是我的,我的[都发出来惹](../diaries/dress/readme.md))
|
||||
- 可爱的女装照(不是我的,我的[都发出来惹](../../diaries/dress/readme.md))
|
||||
|
||||
虽然上述一些内容的说法已经比较直白,但真的点出来是什么东西就还是有点超过了哈。
|
||||
:::
|
||||
@@ -92,7 +92,7 @@ Books
|
||||
但这么分在我看来十分甚至九分的抽象,因为我手里的大多数小说和漫画都莫得有效的标签,甚至绝大多数是由纯文本导出 PDF 而来。因此,比起官版墨迹的组织方式,不妨就按各人的阅读习惯组织起来,不支持的格式导出成 ~~PDF~~ EPUB,就可以了。
|
||||
|
||||
> [!note]
|
||||
> 旧版 Jellyfin 的 PDF 阅读器在 PC 端有可能加载不出来。而且就阅读体验来说或许还不如下载到手机里用 WPS 阅读。
|
||||
> 旧版 Jellyfin 的 PDF 阅读器在 PC 端有可能加载不出来。而且就阅读体验来说或许还不如下载到手机里用 WPS 阅读。~~所以服务器端真的没有像番茄免费小说那样的电子书架吗(~~
|
||||
|
||||
## 家庭视频与照片
|
||||
|
||||
@@ -142,27 +142,48 @@ Music
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
但刮削工具也并非万能。比如《紫罗兰永恒花园 OST》的很多歌就被“音乐标签”那软件霍霍了个遍:
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
刮削完了需要按上面的官方要求组织这些歌曲,毕竟 Jellyfin 不支持读取音乐标签自动聚合(这点在上面援引的博客中也吐槽了)。我个人用 Mp3tag 做批量重命名。相比起音乐标签,Mp3tag 重命名时允许字符串格式化,比如`$replace`、`$num`,方便一点。
|
||||
刮削完了需要按上面的官方要求组织这些歌曲,毕竟 Jellyfin 不支持读取音乐标签自动聚合(这点在上面援引的博客中也吐槽了)。我个人用 Mp3tag 做批量重命名。相比起音乐标签,Mp3tag 重命名时允许用函数格式化字符串,比如`$replace`、`$num`,方便一点。
|
||||
|
||||
Jellyfin 的音频搜集**仅以专辑为依据**。官方文档自己也说“as long as each album is contained within one folder”,翻译过来就是“只需确保一个文件夹(子树)均为同一张专”。所以文件结构自然也以专辑为准。
|
||||
Jellyfin 的音频搜集**仅以专辑为依据**。官方文档自己也说“as long as each album is contained within one folder”,翻译过来就是“只需确保一张专只在一个文件夹(子树)”。所以文件结构自然也以专辑为准。
|
||||
|
||||
::: details 分碟
|
||||
事实上,根据我对音声的组织实践来看,需要确保的是**一张专一个文件夹子树**。比如下列情形会被拆分:
|
||||
```
|
||||
Author
|
||||
\AlbumA Vol.X
|
||||
\AlbumA Vol.Y
|
||||
\AlbumB Vol.X
|
||||
```
|
||||
这种情形会在媒体库里拆出两个 AlbumA(分别为盘号 X 和盘号 Y),正确的组织方式应为:
|
||||
顺带一提,基于上述准则,以及我自己组织音声的实践来看。有如下几种错误例,Jellyfin 会拆分成多个同名的专辑:
|
||||
1. 同一张专按分碟**分成多个文件夹(树)**,违反单子树要求
|
||||
```
|
||||
Author
|
||||
\AlbumA Vol.X
|
||||
\AlbumA Vol.Y
|
||||
\AlbumB Vol.X
|
||||
```
|
||||
这种情形会在媒体库里拆出两个 AlbumA(分别为盘号 X 和盘号 Y)。
|
||||
|
||||
2. 非数字光盘号(音乐专辑诚然如此,然鹅音声有 Omake)
|
||||
```
|
||||
\Album
|
||||
\Vol.1
|
||||
\Vol.2
|
||||
\Vol.Omake
|
||||
```
|
||||
这种情形 Omake 会被拆出去,也就是两张封面一样的 Album 专辑。
|
||||
|
||||
3. 文件夹不显式标明盘号,指望用`.mp3`文件里的盘号让 Jellyfin 自动刮削
|
||||
```
|
||||
\Album
|
||||
\Asahina Akari POV
|
||||
\Mahiro Yuzuki POV
|
||||
\Mahiro Yuri POV
|
||||
```
|
||||
Jellyfin 会这么看:把 Album 当成 Artist,把三个 POV 当成三张独立专辑。也就是拆成三张同名专辑。
|
||||
|
||||
---
|
||||
|
||||
正确的组织方式应为:
|
||||
```
|
||||
Author
|
||||
\AlbumA
|
||||
@@ -170,7 +191,7 @@ Author
|
||||
\Vol.Y
|
||||
\AlbumB
|
||||
```
|
||||
当然,若是盘号没有显式标明,很有可能仍然会拆。~~所以就不能直接读音乐标签做自动聚合马?~~
|
||||
~~所以说就不能直接读音乐标签做自动聚合马?~~
|
||||
:::
|
||||
|
||||
### 音频音声的刮削与组织
|
||||
@@ -180,7 +201,7 @@ Author
|
||||
如果有些音声实在没有头猪,至少也用“散装”之类的文件夹包起来,**尽量确保所有的“文件”都被文件夹收纳好,避免裸放在媒体库文件夹下,也避免文件夹和音声文件混着存放**[^mixed_album]。
|
||||
|
||||
[^mixed_album]: 避免音声文件和文件夹混在一起,是因为:
|
||||
- 假若该文件并没有任何标签,那么你只能在 Jellyfin 音乐媒体库的(全部)歌曲那一页翻来覆去才找得到;
|
||||
- 假若该文件并没有任何标签,那么只能在 Jellyfin 音乐媒体库的“歌曲”那一页翻来覆去才找得到;
|
||||
- 假如该文件有打标签,那么所有和它混在一起的文件夹,里面的音声分类(哪怕自身有打标)均会被覆盖为该文件的标签。
|
||||
|
||||
::: tip 理想的文件树(简化版本,但仍可能加载较慢)
|
||||
@@ -192,7 +213,7 @@ flowchart LR
|
||||
D1 --> D12(["八月舰长音声"]) --> n22(("\*.mp3"))
|
||||
E --> E1(["mahoulelys"]) --> n3(("\*.mp4.mp3"))
|
||||
```
|
||||
或者说,尽可能保证所有的**文件**均在树形图的末端(末梢、叶子节点)处。
|
||||
或者说,尽可能保证所有的**文件**均在平衡树的叶子节点处。
|
||||
:::
|
||||
|
||||
分类完毕之后,再对这些音声做批量的打标。
|
||||
@@ -23,9 +23,7 @@ tag:
|
||||
:::: details 配置 Zerotier One
|
||||
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
|
||||
|
||||
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
|
||||
Windows 有挂在任务栏里的 GUI 客户端,右键图标直接`Join Network`,粘贴刚刚的`Network ID`回车,进账号里同意加入、给它分配固定 IP 即可;
|
||||
Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方式安装 Zerotier One。
|
||||
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
|
||||
|
||||
::: details 或者,进一步配置虚拟内网
|
||||
主要关注以下项:
|
||||
@@ -43,7 +41,16 @@ Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方
|
||||
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
|
||||
:::
|
||||
|
||||
安装之后记得确认一下 Zerotier 服务是否开启,若是 Docker 容器还请额外注意端口映射。
|
||||
::: tabs#zerotierInstall
|
||||
@tab Windows
|
||||
Windows 安装之后在开始菜单找到 ZeroTier,然后可以看到任务栏里出现了 ZeroTier 的图标。右键图标,在菜单里直接`Join Network`,粘贴刚刚的`Network ID`,回车即可。
|
||||
|
||||
顺带一提,记得在右键菜单里勾上`Start UI at Login`,也就是开机启动。
|
||||
|
||||
@tab Linux systemd
|
||||
可以通过官网提供的[命令行](https://www.zerotier.com/download/#linux)、部分包管理器等方式安装 Zerotier One。
|
||||
|
||||
安装之后记得确认一下 Zerotier 服务是否开启:
|
||||
```bash
|
||||
sudo systemctl status zerotier-one.service
|
||||
```
|
||||
@@ -51,7 +58,33 @@ sudo systemctl status zerotier-one.service
|
||||
```bash
|
||||
sudo systemctl enable --now zerotier-one.service
|
||||
```
|
||||
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接`sudo zerotier-cli join Network_ID`,然后也是在账号上给它放行、分配固定 IP 就可以了。
|
||||
于是就可以使用 Zerotier CLI 了。
|
||||
|
||||
我的场景比较简单,不考虑自建 moon 的情况下直接加入虚拟内网:
|
||||
```sh
|
||||
sudo zerotier-cli join Network_ID
|
||||
sudo zerotier-cli listnetworks
|
||||
```
|
||||
|
||||
@tab Docker
|
||||
[官方文档](https://docs.zerotier.com/docker/)的做法是拉一个 centos 在里面用 systemd 方式安装,属于是脱裤子放屁。
|
||||
|
||||
网上有一些现成的镜像,像`zerotier`和`zerotier-synology`(群晖用的),这里摘录一下用`zerotier/zerotier`的流程:
|
||||
|
||||
> [!warning]
|
||||
> **此方案尚未测试,谨慎复制**!建议在其他**有测试结果的**博客、专栏中获取适合的方案!
|
||||
|
||||
```sh
|
||||
docker pull zerotier/zerotier
|
||||
# 务必注意网络通信方式!
|
||||
docker run -d --name zt --network host zerotier/zerotier
|
||||
docker exec -it zerotier bash
|
||||
zerotier-cli join Network_ID
|
||||
zerotier-cli listnetworks
|
||||
```
|
||||
:::
|
||||
|
||||
在设备加入虚拟内网之后,需要再次登上账号同意设备加入(默认建立的是私有内网,需要号主同意加入),并且给它分配固定 IP。
|
||||
::::
|
||||
|
||||
> [!warning]
|
||||
@@ -174,11 +207,11 @@ geox-url:
|
||||
:::
|
||||
|
||||
::: details 应用层
|
||||
这块不是重点,各种服务有各种服务的参考文档。
|
||||
这块不是重点,各种服务有它自己的参考文档。
|
||||
|
||||
- `webmin`:提供 WebUI 对服务器做些运维。
|
||||
- `webmin`:提供 WebUI 以配置服务器的系统,以及监测服务器的性能占用。
|
||||
- `aria2`与`AriaNg`:提供直链、BT、PT 下载支持。参见[《手把手教你使用 Docker 搭建 aria2+AriaNg,打造自己的离线下载服务器》(博客园)](https://www.cnblogs.com/wqp001/p/14709997.html) [^ariang_baidupan]。
|
||||
- `jellyfin` `emby`:影音服务器。有关 Jellyfin 的媒体聚合和刮削会专门另开一篇讨论。
|
||||
- `jellyfin` `emby`:影音服务器。有关 Jellyfin 的刮削会专门另开一篇讨论。
|
||||
- `vscode-server`:控制端可利用 VSCode 配合 Remote-SSH 插件连上服务器,做些跨平台开发……或者 Linux Native 开发。~~真有人在 Linux 编译 MSVC x86-64 吗?有的话浇我。~~
|
||||
- `ssh`:Xshell 做些命令行活计,Xftp 做些文件交换活计。
|
||||
- `nfs`:和前面 Windows 一样,可以挂共享文件系统。
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
@@ -39,7 +39,7 @@ Bottles 是由 [bottlesdevs](https://github.com/bottlesdevs) 开发的可视化
|
||||
|
||||
[^lazy_loading]: 经实测发现,单文件 exe 才可以在这种情况下直接在 Bottles 里启动。但凡需要读同级文件、子文件夹的,都需要在 Bottle 里添加快捷方式,并在快捷方式的设置里手动指明工作目录。
|
||||
|
||||
首先需要引入`archlinuxcn`源。具体步骤参见[《Arch 安装流程》](../OS/ArchInstall.md#i-cn-源和-aur-助手),这里不再重复。
|
||||
首先需要引入`archlinuxcn`源。具体步骤参见[《Arch 安装流程》](../Maintenance/ArchInstall.md#i-cn-源和-aur-助手),这里不再重复。
|
||||
接着`sudo pacman -Sy bottles`安装。等待进度跑完,就可以从“应用程序菜单栏”运行了。
|
||||
|
||||
初次运行 Bottles 会弹出一个向导跟你 blabla,无脑下一步即可。
|
||||
|
||||
@@ -92,13 +92,14 @@ int example() {
|
||||
又假设`example()`被 main 函数调用,那么栈帧可能会是这种分布:
|
||||
|地址|...|备注|
|
||||
|-|:--:|-|
|
||||
|0x524|...||
|
||||
|0x520|(`main()`的 EBP)|`example()`栈帧从这里开始|
|
||||
|0x51C|int a = 10|
|
||||
|0x518|int b|
|
||||
|0x514|(空余 8B)|`gcc`编译器要求栈帧大小为 16B 的整数倍|
|
||||
|0x510|(空余 8B)|`gcc`要求栈帧大小为 16B 的整数倍|
|
||||
|0x50C|1024|参数 y|
|
||||
|0x508|10|参数 x,即复制 a 的值|
|
||||
|0x504|调用`eg_sub()`时 EIP 指向的下一指令地址|亦即被`call`压栈、`ret`返回的地址<br>`example()`栈帧到此结束|
|
||||
|0x504|调用`eg_sub()`时 EIP 指向的下一指令地址|亦即被`call`压栈、`ret`返回的地址;<br>`example()`栈帧到此结束|
|
||||
|0x500|(`example()`函数的 EBP)|这里是`eg_sub()`的栈帧了|
|
||||
|...|...||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 42 KiB |