MorFans Dev
折腾 - 开发 - 分享

创建支持 安全启动 的 Arch Linux iso 安装镜像

创建支持 安全启动 的 Arch Linux iso 安装镜像

前言

由于最近需要用到 Linux 相关的东西,用微软的WSL2 配上容器总是内存爆满,所以打算安装一个 ArchLinux 到我的电脑中。

但是 ArchLinux iso 大概在 13 年的样子移除了对 安全启动 UEFI Secure Boot 的支持。但我又及其懒惰不愿修改主板配置关闭安全启动。

所以想安装 ArchLinux,还给先对安装媒介下手。

之前我安装的方案是先刻录U盘,然后在U盘中修改EFI分区来添加 Preloader-signed

这样的缺点有很多:

  • 需要一个没开启安全启动的机器或虚拟机
  • 需要新建普通用户,或使用 nobody 来安装 AUR源
  • 可能需要扩容
  • 每次刻录后都需要进行操作

这次趁着要给电脑重装系统的机会,来直接生成一个支持安全启动的 ArchLinux 安装镜像吧。

Archiso

官方有一个用于生成镜像的脚本,可以给我们省下很多时间

本次就使用微软的 WSL2 (archwsl)来制作一个安全启动的 ArchLinux 安装镜像

安装 archiso

安装命令很简单,用 pacmanyay 安装即可:

yay -S archiso

DIY archiso

官方的 Archiso 脚本生成是根据 profile来的,可以基于以下两个来自定义:

  • /usr/share/archiso/configs/releng
  • /usr/share/archiso/configs/baseline

要实现的东西

  • 支持安全启动(preload-signed)
  • 添加 ArchLinuxCN 源(方便装 yaypreload-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-gitpreloader-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

生成安装镜像

修改完生成镜像的脚本和配置,就可以生成我们的镜像了

命令解释:

  • -v verbose 模式
  • -w 指定工作目录,可以指定到 tmpfs,这样可能会快点
  • -o 输出目录,这里随便,不写也行
  • 最后接上 profile 目录,就是之前我们添加软件包修改的那个
[email protected] ~> sudo mkarchiso -v -w /tmp/arch-iso-tmp2 -o /home/paxos/iso /home/paxos/arch_iso

测试安全启动

刻录U盘,启动就行了

赞赏
魔帆博客,版权所有 | 如未注明,均为原创
本站均采用 BY-NC-SA 协议进行授权。
转载请注明来自本站文章:创建支持 安全启动 的 Arch Linux iso 安装镜像(https://www.morfans.cn/archives/3002)

野 小新

文章作者

野小新很野~

发表评论

textsms
account_circle
email

创建支持 安全启动 的 Arch Linux iso 安装镜像
前言 由于最近需要用到 Linux 相关的东西,用微软的WSL2 配上容器总是内存爆满,所以打算安装一个 ArchLinux 到我的电脑中。 但是 ArchLinux iso 大概在 13 年的样子移除了对 安全…
扫描二维码继续阅读
2021-09-06