前言
由于最近需要用到 Linux 相关的东西,用微软的 WSL2 配上容器总是内存爆满,所以打算安装一个 ArchLinux 到我的电脑中。
但是 ArchLinux iso 大概在 13 年的样子移除了对 安全启动 UEFI Secure Boot
的支持。但我又及其懒惰不愿修改主板配置关闭安全启动。
所以想安装 ArchLinux,还给先对安装媒介下手。
之前我安装的方案是先刻录U盘,然后在U盘中修改EFI分区来添加 Preloader-signed
。
这样的缺点有很多:
- 需要一个没开启安全启动的机器或虚拟机
- 需要新建普通用户,或使用 nobody 来安装 AUR源
- 可能需要扩容
- 每次刻录后都需要进行操作
这次趁着要给电脑重装系统的机会,来直接生成一个支持安全启动的 ArchLinux 安装镜像吧。
Archiso
官方有一个用于生成镜像的脚本,可以给我们省下很多时间
本次就使用微软的 WSL2 (archwsl)来制作一个安全启动的 ArchLinux 安装镜像
安装 archiso
安装命令很简单,用 pacman
或 yay
安装即可:
yay -S archiso
DIY archiso
官方的 Archiso 脚本生成是根据 profile来的,可以基于以下两个来自定义:
/usr/share/archiso/configs/releng
/usr/share/archiso/configs/baseline
要实现的东西
- 支持安全启动(
preload-signed
) - 添加 ArchLinuxCN 源(方便装
yay
和preload-signed
)
自定义 Profile
releng
就是 Arch Linux 每月生成镜像用的,自己DIY就直接基于这个来魔改就好了。
baseline
是极简化的配置,极简就意味着工作量会大,我还没发烧就不用这个【
直接复制 releng
来修改:
[email protected] ~> cp -r /usr/share/archiso/configs/releng/ arch_iso
首先先修改 pacman.conf
,加上 archlinuxcn 的地址就行了
[archlinuxcn]
Server = https://mirrors.163.com/archlinux-cn/$arch
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
然后添加软件包:
在首行添加 archlinuxcn-keyring
用于导入 archlinuxcn 密钥链。
然后安装位于 aur 的 yay-git
和 preloader-signed
[email protected] ~/arch_iso [1]> diff -u /usr/share/archiso/configs/releng/packages.x86_64 packages.x86_64
--- /usr/share/archiso/configs/releng/packages.x86_64 2021-08-25 21:00:25.000000000 +0800
+++ packages.x86_64 2021-09-06 15:48:43.651396539 +0800
@@ -1,3 +1,4 @@
+archlinuxcn-keyring
alsa-utils
amd-ucode
arch-install-scripts
@@ -116,3 +117,5 @@
xfsprogs
xl2tpd
zsh
+yay-git
+preloader-signed
\ No newline at end of file
修改 archiso 脚本
我原以为官方的脚本里支持更换 bootloader 或支持在某编译环境时运行DIY脚本,结果都没有。只能通过修改 archiso脚本来修改 bootloader 了
为了脚本的通用,修改脚本的思路如下,非常简单:
- 先从 packages 里看看有没有 preloader
- 没有就正常处理 bootloader,有就加入
先找到脚本位置:
[email protected] ~/arch_iso> whereis mkarchiso | awk 'END {print $2}'
/usr/bin/mkarchiso
[email protected] ~/arch_iso> whereis mkarchiso | cut -d ' ' -f2
/usr/bin/mkarchiso
然后修改的部分如下:
为了方便查看修改的地方,只放了修改的部分的代码
PS:如何获得修改后的脚本
复制下面代码,保存为
文件1
,然后在终端下执行sudo patch /usr/bin/mkarchiso 文件1
即可修改 archiso脚本。不需要手动一行行修改。
523a524,529
> # Preloader-signed
> preload_signed_files=()
> if $preload_signed; then
> preload_signed_files+=("${pacstrap_dir}/usr/share/preloader-signed/HashTool.efi")
> preload_signed_files+=("${pacstrap_dir}/usr/share/preloader-signed/PreLoader.efi")
> fi
531a538
> "${preload_signed_files[@]}" \
536,539c543,557
< # Copy systemd-boot EFI binary to the default/fallback boot path
< mcopy -i "${work_dir}/efiboot.img" \
< "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/BOOTx64.EFI
<
---
> # Copy Preloader binary to the boot path
> if $preload_signed;then
> _msg_info "Setting up Preloader for UEFI booting..."
> mcopy -i "${work_dir}/efiboot.img" \
> "${pacstrap_dir}/usr/share/preloader-signed/PreLoader.efi" ::/EFI/BOOT/BOOTx64.EFI
> mcopy -i "${work_dir}/efiboot.img" \
> "${pacstrap_dir}/usr/share/preloader-signed/HashTool.efi" ::/EFI/BOOT/HashTool.efi
> mcopy -i "${work_dir}/efiboot.img" \
> "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/loader.efi
> else
> _msg_info "No Preloader for UEFI booting..."
> # Copy systemd-boot EFI binary to the default/fallback boot path
> mcopy -i "${work_dir}/efiboot.img" \
> "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/BOOTx64.EFI
> fi
575,577c593,605
< # Copy systemd-boot EFI binary to the default/fallback boot path
< install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
< "${isofs_dir}/EFI/BOOT/BOOTx64.EFI"
---
> if $preload_signed;then
> _msg_info "Setting up Preloader for the ISO 9660 file system..."
> install -m 0644 -- "${pacstrap_dir}/usr/share/preloader-signed/PreLoader.efi" \
> "${isofs_dir}/EFI/BOOT/BOOTx64.EFI"
> install -m 0644 -- "${pacstrap_dir}/usr/share/preloader-signed/HashTool.efi" \
> "${isofs_dir}/EFI/BOOT/HashTool.efi"
> install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
> "${isofs_dir}/EFI/BOOT/loader.efi"
> else
> # Copy systemd-boot EFI binary to the default/fallback boot path
> install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
> "${isofs_dir}/EFI/BOOT/BOOTx64.EFI"
> fi
1041a1070,1072
>
> _msg_info "check preloader-signed Package..."
> [[ `grep -c 'preloader-signed' $packages` != '0' ]] && preload_signed=true || preload_signed=false
生成 Arch Linux 安装镜像
修改完生成镜像的脚本和配置,就可以生成我们的镜像了
命令解释:
-v
verbose 模式-w
指定工作目录,可以指定到 tmpfs,这样可能会快点-o
输出目录,这里随便,不写也行- 最后接上 profile 目录,就是之前我们添加软件包修改的那个
[email protected] ~> sudo mkarchiso -v -w /tmp/arch-iso-tmp2 -o /home/paxos/iso /home/paxos/arch_iso

测试Arch Linux 安全启动 (Secure Boot
)
刻录U盘,启动就行了

向筱枫进行回复 取消回复