Skip to content

Commit

Permalink
draft tripleboot
Browse files Browse the repository at this point in the history
  • Loading branch information
chiyuki0325 committed Nov 29, 2024
1 parent 24cb1ca commit d5f12df
Showing 1 changed file with 197 additions and 0 deletions.
197 changes: 197 additions & 0 deletions source/_drafts/mipad5-uefi-tripleboot.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
---
title: 🐮 在小米平板 5 上配置 UEFI 和三系统启动
date: 2024-11-29 10:57:07
tags:
- 小米
- 安卓
- Linux
- AOSC
---

之前在小米平板 5 上装了 Linux 和 Win11 三系统,但每次切换都需要反复刷写 `boot``dtbo` 分区,极为消耗闪存寿命,那么有没有一种方法, 可以像 PC 上的 GRUB 启动菜单那样,开机时选择多系统呢?

答案是有的,本文我就来记录我的折腾过程。

<!--more-->

## 🪟 折腾背景

微软于 2018 年[发起了](https://blogs.windows.com/windowsdeveloper/2018/12/19/%E2%80%AFintroducing-project-mu/) [Project Mu](https://microsoft.github.io/mu/),是一款基于 TianoCore [edk2](https://microsoft.github.io/mu/) 的 UEFI 固件。微软在自家的 Hyper-V 和 Surface 二合一笔记本上都使用了这个 UEFI 固件。

等等 ... Surface?Surface 确实有搭载高通骁龙处理器的产品线 Surface Pro X,但它一直使用的都是高通骁龙 8cx 平台,但 GitHub 上有神人开发者开发出了 [SurfaceDuoPkg](https://github.com/WOA-Project/mu_andromeda_platforms) 项目,它把 Project Mu 移植到了 Surface Duo 折叠手机上,在 Surface Duo 上跑起了 Windows 10X 和 Windows 11。这款手机使用的是骁龙 835 SoC,离我们的折腾目标:搭载骁龙 855 的小米平板 5 已经很接近了。

于是,以 SurfaceDuoPkg 为基础,一群开发者又发起了 [Project Aloha](https://github.com/Project-Aloha/mu_aloha_platforms) (原名为 msmnilePkg) 项目,把 Project Mu 带到了骁龙 845 和 855 平台上,还给很多设备移植了对应的驱动程序。小米平板 5 之所以能流畅地跑起 Win11,就是这个项目的功劳。这就是本文要折腾的项目。

{%ablock color:orange ❓ 问题%}

看到这里,读者可能要提出疑问了:“我记得 MIX 2S 那些骁龙 845 的手机刷 Win11 靠的是那个非常 🐮🍺 的 [Renegade Project](https://renegade-project.tech) 项目啊?它也支持米板 5,那为什么不直接拿来用呢?”

它的确**支持**米板 5,开源社区也折腾出了用它在米板 5 上启动 Linux 的一套[方案](https://www.cnblogs.com/terrasse/p/18461726/linux_on_nabu),但我的米板 5 扩容了 12G 运存和 512G 存储,Renegade 的 UEFI 在我的平板上存在兼容性问题,根本**[找不到 UFS](https://imgsrc.chyk.ink/jekmCHsyXWH3LB2n.webp)**,也就没法启动系统了。

不过本文的折腾方案要用到 [Simple Init](https://github.com/BigfootACA/simple-init/),Renegade 就用了 Simple Init 当作启动菜单,因此折腾好后你可能会有似曾相识的感觉。如果你的动手能力很强,也可以使用 GRUB 或 systemd-boot。

{%endablock%}

{%ablock color:warning ⚠️ 注意 %}

折腾本文需要一台**性能强大的电脑****高速的国际网络连接**,否则等待的过程将会非常痛苦。

本文的折腾存在**很大的变砖风险**,如果你没有做好心理准备,或者没有 9008 救砖的能力,就不要往下阅读。

折腾本文需要打开 Windows 的驱动测试模式。打开驱动测试模式后,验证系统安全性的游戏和反作弊软件将会无法启动,比如腾讯 ACE 反作弊系统。请自行斟酌。

本文的折腾需要 Ubuntu 22.04 系统环境,如果电脑上没有对应环境,可以使用虚拟机或 Distrobox 等容器方案。

{%endablock%}

## 🗄️ 进行分区

按照 [Renegade Project 文档](https://renegade-project.tech/zh/install#h-12-%E4%BF%AE%E6%94%B9ufs%E5%88%86%E5%8C%BA) 的分区部分或[我之前的文章](/2024/06/22/mipad5-archlinux/#💽-对-UFS-进行分区)给平板新建一个 `esp` 分区,大小建议大一点,我分了 1G。

如果你折腾过 Win11,这个分区应该已经存在,应该名为 `esp` 或者 `ESPNABU`

> 注意:「分区名称」和「卷标」是两个不同的概念,以下均给 ESP 分区使用 `esp` 这个分区名称。
## 🔌 编译 UEFI 固件

```bash
# 安装依赖
sudo apt update && sudo apt -y upgrade
sudo apt -y install python3-venv pip git mono-devel build-essential nuget build-essential uuid-dev iasl nasm gcc-aarch64-linux-gnu python3 python3-distutils python3-git python3-pip gettext locales gnupg ca-certificates python3-venv git git-core clang llvm curl jq
sudo apt install -y libc6-arm64-cross libc6-dev-arm64-cross

# 获取源码
git clone https://github.com/map220v/MU-sm8150pkg --branch=nabu-secureboot --recursive
```

克隆这个仓库是一个极其漫长的过程。

在获取好源码后,打开 `Platforms/SurfaceDuo1Pkg/SurfaceDuo1.fdf` 文件,注释掉第 92 行。这行的内容如下:

`INF SurfaceDuoFamilyPkg/Driver/SecureBootProvisioningDxe/SecureBootProvisioningDxe.inf`

如果读者有在 x86 UEFI 平台安装过 Linux,那应该会知道,开着安全启动是没法启动 Linux 的(自己配置过证书的除外)。注释这行,就是为了禁用掉这个 UEFI 固件的安全启动。

```bash
python3 -m venv venv
source venv/bin/activate
python build_uefi.py -d xiaomi-nabu
```

漫长的编译过程后,可在 `Build/SurfaceDuo1Pkg/RELEASE_CLANG38/FV/` 文件夹中找到 `SM8150_EFI.fd`,拿到一旁备用。

## 🔌 编译 Simple Init

本文将使用 Simple Init 作为引导加载程序。

按照[此工作流](https://github.com/rodriguezst/simple-init/blob/master/.github/workflows/master-edk2.yml)所述的编译方法进行编译。

```bash
# 安装依赖
sudo apt update
sudo apt install --yes --no-install-recommends build-essential uuid-dev iasl nasm gcc-aarch64-linux-gnu gcc-arm-none-eabi gcc-i686-linux-gnu gettext
```

```bash
# 获取源码
git clone https://github.com/BigfootACA/simple-init --recursive
cd simple-init
git clone https://github.com/tianocore/edk2 --recursive
pushd edk2
git checkout fff6d81270b57ee786ea18ad74f43149b9f03494
popd
```

在获取源码后可以对源码树进行一些定制。

我在使用 [AOSC OS](https://aosc.io/),Simple Init 的启动菜单没有包含它的图标,所以手动下载并放到其中。

```bash
wget 'https://raw.githubusercontent.com/AOSC-Dev/logo/05268213521f168aedb96dc1f4573b64e1f205a1/aosc-os.svg' -O root/usr/share/pixmaps/simple-init/aosc-os.svg
```

```bash
# 进行编译
bash scripts/build-edk2.sh AARCH64
```

在漫长的编译过程结束后,可在 `build-edk2/Build/SimpleInit/RELEASE_GCC5/AARCH64` 中找到一个 8MB 的 `SimpleInitMain.efi`。把它放到一旁,改名为 `BOOTAA64.EFI` 备用。

## 🐧 放置启动 Linux 所需的文件

首先要把所需的文件放置到 `esp` 分区中。

在编译内核时,我使用的安装命令如下:

```bash
make zinstall modules_install dtbs_install INSTALL_MOD_PATH=../modules_install INSTALL_PATH=../modules_install/boot INSTALL_MOD_STRIP=1 INSTALL_DTBS_PATH=../modules_install/boot/dtbs
```

因此可以在 `../modules_install/boot` 中找到 `vmlinuz` 开头的内核镜像文件,在 `dtbs` 文件夹中找到 `sm8150-xiaomi-nabu.dtb`

把内核镜像文件(我这里为 `vmlinuz-6.12.0-1-sm8150-chiyuki+` 和 dtb 文件(`sm8150-xiaomi-nabu.dtb`)放到 `esp` 分区的根目录中。这步可以使用之前文章提到过的大容量存储模式(nsc),或者直接在 Linux 上操作。

## 🪟 配置 Windows Boot Manager

### ☣️ 启用测试模式

米板 5 的 WoA,如果在没开安全启动的情况下,想要开机,就必须要打开驱动测试模式,否则将会[直接蓝屏](https://imgsrc.chyk.ink/SDwQXuorMDPD5NiQ.webp)(我的翻车经历...)

打开驱动测试模式后,验证系统安全性的游戏和反作弊软件将会无法启动,比如腾讯 ACE 反作弊系统。

按照 [Renegade 的文档](https://renegade-project.tech/zh/install#h-215-%E5%90%AF%E7%94%A8%E6%B5%8B%E8%AF%95%E6%A8%A1%E5%BC%8F)操作即可。

### 🖥️ 使用 Simple Init 替换 Boot Manager

`esp` 分区中原有的的 `Boot/EFI/BootAA64.efi` 重命名(我这里为 `windows.efi`),并把之前编译好的 Simple Init `BOOTAA64.EFI` 放入 `Boot/EFI` 文件夹中,以取代 Windows Boot Manager。

## 🔌 配置 Simple Init

在 Linux 中(或使用大容量存储模式 msc)挂载 `LOGFS` 分区,在其中创建一个 `simpleinit.uefi.cfg`

参考 [Simple Init 文档](https://github.com/BigfootACA/simple-init/blob/master/docs/zh/config/index.md) 配置引导加载程序。这里贴一下我的配置,仅供参考。

`boot.configs.linux.extra.kernel``boot.configs.linux.extra.dtb` 即为之前放置的两个文件,`boot.configs.linux.extra.cmdline` 为之前安装 Linux 时在 `mkbootimg` 那步配置的内核命令行参数。

`boot.configs.win11.extra.efi_file` 即为之前移走的 Windows Boot Manager。

{%folding child:codeblock 我的 Simple Init 配置%}

```ini
language = "zh_CN"
boot.configs.linux.mode = 8
boot.configs.linux.desc = "AOSC OS"
boot.configs.linux.show = true
boot.configs.linux.enabled = true
boot.configs.linux.icon = "aosc-os.svg"
boot.configs.linux.extra.use_uefi = true
boot.configs.linux.extra.kernel = "@part_esp:\\vmlinuz-6.12.0-1-sm8150-chiyuki+"
boot.configs.linux.extra.dtb = "@part_esp:\\sm8150-xiaomi-nabu.dtb"
boot.configs.linux.extra.skip_kernel_fdt_cmdline = true
boot.configs.linux.extra.update_splash = false
boot.configs.linux.extra.cmdline = "pd_ignore_unused clk_ignore_unused console=tty0 console=ttyGS0 root=PARTLABEL=aosc rw rootwait nowatchdog"
boot.configs.win11.mode = 9
boot.configs.win11.desc = "Windows 11"
boot.configs.win11.show = true
boot.configs.win11.enabled = true
boot.configs.win11.icon = "distributor-logo-windows.svg"
boot.configs.win11.extra.efi_file = "@part_esp:\\EFI\\Boot\\windows.efi"
boot.default = "linux"
boot.second = "simple-init"
boot.uefi_probe = false
boot.title = "选择操作系统"
boot.timeout = 5
boot.timeout_text = "倒计时: %d"
sw = 8
locates.part_logfs.by_disk_label = "gpt"
locates.part_logfs.by_gpt_name = "logfs"
locates.part_esp.by_disk_label = "gpt"
locates.part_esp.by_gpt_name = "esp"
gui.show_background = true
gui.background = ""
gui.dark = true
w = 8
```

{%endfolding%}

0 comments on commit d5f12df

Please sign in to comment.