背景

今年年初购得一台 8 + 256 版本的二手一加 6T,当时就是看重他有很多的刷机资源,一方面作为备用机,另一方面作为折腾的玩具。

和其他手机最不同的一点,是这台机器有 Postmarket Linux 和 Windows on ARM 支持。前者是一个使用主线内核的 Linux 发行版,全开源、针对移动端做了优化,可以实现轻度的掌上 Linux 体验。而后者则是一种比较特殊的 Windows 版本。由于长期以来的 “Wintel” 战略,x86 和 Windows 往往是绑定的。但随着 ARM 处理器在移动端产品上攻城略地,微软也逐渐开始发展 ARM 版的 Windows 系统。

除了上述两者之外,这台手机还支持 Mobian(移动端魔改 Debian)和 Ubuntu Touch(Ubuntu 官方推出的移动端系统,现在已经交给社区运作)。这两者我也进行了体验,但是总的评价是:不如 Windows。

本文就简单回忆一下当时刷入 Windows on ARM 的过程。

准备工作

硬件方面,需要一台手机、一台 PC 和一根数据线(废话)、此外还需要 Type-C 拓展坞、USB 键鼠一套、8G 空间以上 U 盘一个。

软件方面,需要:

  • 一加 9008 工具 (以备不时之需)
  • 9008 救砖包 (同上,万一寄了可以恢复)
  • Platform Tool(包括 ADB 和 Fastboot)
  • 最新版 OOS 10 系统(氢或氧似乎都可以,但注意不能升级到 OOS 11)
  • TWRP Recovery
  • UEFI Boot 镜像
  • GNU Parted 工具
  • Windows PE ARM
  • Windows on ARM 镜像
  • Dism++ ARM 版(用于安装驱动)
  • SDM845 驱动包

TWRP 可以使用官网的版本,Parted、UEFI、PE 等可以在 Installation Guide (renegade-project.org) 找到。

Windows on ARM 镜像,可以通过 UUDP 获得,上面链接中也有讲到。

刷入 Windows

1. 刷入 OOS 10

如果是旧版系统的话,直接 OTA 到 OOS 10 最后
一个版本就可以了。

如果已经升级到最新版 OOS 11 了,那么需要通过 9008 回到旧版,然后升级到 OOS 10。

2. 解锁 Bootloader

按照常规步骤解锁 bootloader 即可,不再赘述。

3. Fastboot 临时 boot twrp.img

由于 1+6T 有 TWRP 官方的 Recovery 支持,直接下载官方 Recovery(OnePlus 6T (fajita) (twrp.me))。

按照官方教程,进入手机 Fastboot 模式,连接 PC 并在终端输入:

fastboot boot twrp.img

此时应该进入了 TWRP。

4. Sideload twrp.zip 加固包

上一步只是临时 Boot 了 TWRP,还没有实装。进入 TWRP 中的高级界面,选择 ADB Sideload 功能。

adb sideload twrp.zip

完成后 TWRP 就被装好了。

5. 格式化 data 分区

这一步要清除手机所有数据,请注意备份。
选择 TWRP 中抹除数据的选项,进入高级界面,选择抹除 Data,会提示输入 Yes 来二次确认。

抹除完成后,重启手机,再次进入 TWRP。

6. 利用 Parted 工具分区

这一步就比较 Critical 了。GNU Parted 是一款 Linux 常用的磁盘分区工具。 Android 是基于 Linux 的,所以同样适用。

首先在 TWRP 中打开 MTP,将 Parted 放入内置存储中(内置存储在文件系统中称为 sdcard,也可以通过 adb push 上传文件到手机端)。

PC 上打开终端。输入:

adb shell

进入 ADB Shell 界面。首先修改 Parted 工具的权限为可执行:

chmod +x parted

然后将 parted 拷贝到 /sbin 下,这样后面就可以在环境变量下利用 Parted 工具:

cp /sdcard/parted /sbin/

解挂载 /data 和 /sdcard 分区,方便对该部分重新分区。

umount /sdcard && umount /data

至此就可以进入 Parted 工具进行分区了:

parted /dev/block/sda

首先输入 p 可以显示当前分区表,截图保存如下:

原始分区表
原始分区表

为了给 Windows 腾出空间,自然是挑 userdata 下手。

rm 17 
mkpart userdata ext4 6559MB 100GB 
mkpart esp fat32 100GB 100.5GB
mkpart pe fat32 100.5GB 103GB
mkpart win ntfs 103GB 253GB

set 18 esp on 

上述命令解释如下:

  • rm 17 :删除 17 号分区(即 userdata)
  • mkpart NAME FS_TYPE START END:从 START 位置到 END 位置,建立文件系统类型为 FS_TYPE 的分区,并命名为 NAME。通过相似的四条指令,我们建立了 ESP、PE、WIN、userdata 四个分区。
  • set 18 esp on 最后我们给 18 号分区设置了 ESP 标志。

上述命令执行完毕后再次输入 p 查看分区表应当有如下效果:

调整后的分区表
调整后的分区表

需要注意的是,上述系统分区是建立在 256 GB 规格存储上的,128 GB 版本需要自行调整。另外由于我使用外置 Type-C 拓展坞和 U 盘,故 PE 系统分区很小,需要按照实际需求更改。

退出 Parted 工具:

quit

重启一次手机,使分区生效(似乎不重启也可以)。

7. 建立文件系统

上一步已经分好区了,这一步需要格式化分区并建立相应文件系统。

首先还是仿照 6 中进入 ADB Shell,这时不再需要 Parted 工具,直接执行下列命令格式化分区:

mkfs.fat -F32 -s1 /dev/block/by-name/pe
mkfs.fat -F32 -s1 /dev/block/by-name/esp
mkfs.ntfs -f /dev/block/by-name/win
mke2fs -t ext4 /dev/block/by-name/userdata

命令和所设置的文件系统类型是对应的,比较容易理解。

8. 挂载 PE 分区安装 PE 系统

同样在 ADB Shell 中操作:

mount /dev/block/by-name/pe /mnt

这样就可以通过 /mnt 目录访问到 PE 分区了。

现在转到 U 盘这边,将预先下载的 20h2pe_new.zip 解压到 U 盘下的 20h2pe_new 目录中。

将 U 盘通过拓展坞连接到手机,在 ADB Shell 中输入:

cp -r /usbstorage/20h2pe_new/* /mnt

这样,PE 分区内的文件就安装好了。

当然没有 U 盘的话,也可以通过 MTP 之类的方式将文件传送到 /sdcard 分区,再 cp 到 /mnt。

9. 测试 Android 系统

重启 TWRP 进入 Android 系统。如果能正常启动,说明分区没有大问题。

10. 添加 UEFI 启动

手机进入 Fastboot 模式,输入:

fastboot boot UEFI.img

需要注意的是,UEFI.img 是下载的 UEFI Boot 镜像的文件名,需要根据实际情况修改。

随后启动系统。

如果一切正常此时应该进入了 Windows PE。通过拓展坞连接键盘鼠标,进行下一步。

11. 安装系统和驱动

首先,在手机上的 PE 系统中打开 Windows CMD,输入下列命令:

diskpart
select disk 0
list part
select part 18
assign letter=Y
exit

以上命令打开了 Windows 内置的 diskpart 磁盘管理工具,选择了磁盘上的 18 号分区(即 6 中的 ESP 分区的序号),并给它分配了盘符 Y(当然可以选择其他盘符,但后续命令需要保持一致)。

插入 U盘,打开预先下载解压好的 Dism++。

我是懒狗,下面应该非常好理解,直接照抄官方教程:

Open dism++ and install Windows:

  1. Open File > Apply Image
  2. Select iso where that is located
  3. Select the C:\ root (or D:\ if C:\ is the PE partition), the destination disk where windows will be applied
  4. Check Add Boot
  5. Press OK and wait untill image applied

Install drivers:

  1. Select new Windows installation on top and click Open session
  2. Enter Drivers section under Control Panel
  3. Click Add and select SDM845 Drivers folder
  4. Wait untill drivers installed

12. 打开测试签名、关闭一致性校验

打开手机上的 Windows CMD,输入以下命令:

bcdedit /store Y:\efi\microsoft\boot\bcd /set {Default} testsigning on
bcdedit /store Y:\efi\microsoft\boot\bcd /set {Default} nointegritychecks on

以上命令修改了 ESP 分区中的启动信息,打开了驱动的测试签名并关闭了一致性校验,从而使第三方驱动能够成功使用。

13. 重启手机进入 UEFI

重启手机进入 Fastboot,使用 10 中的方法进入 UEFI。此时正常启动就应该能够进入 Windows 了。

理论上如此。但是,由于我们在 11 中安装了大量的驱动,这些驱动并不总是好用的。所以很大概率这里会卡住、蓝屏或者进入Qualcomm Coredump 模式。

此时就只能重启几次,碰碰运气了。

这一步是最折磨的,因为开机失败的概率还是非常大的,而且没有什么好的解决方案。有一种提高成功概率的方法是,在 11 中选择最小化的驱动包,等进入系统后再行安装后续驱动。这样能够减少第一次启动时的冲突问题。

目前已知问题较大的驱动有:

  • WiFi/蓝牙/移动数据相关(基带)
  • GPU 相关

关于双系统

说了这么多,还只是临时进入一下 Windows。重启一下又会进入 Android 系统了。那么怎么实现比较合理的双系统呢?

如果需要默认启动 Windows,需要将 UEFI Boot 刷入某一 Slot 的 Boot 分区。例如想要 A 槽默认启动 Windows,就使用 Fastboot:

fastboot flash boot_a UEFI.img
fastboot setvar current-slot A

此时如果需要使用 Android 系统,则可以用 fastboot 仿照上述命令设置 B 槽启动。或者直接在 UEFI 启动时按音量键进入高级设置,选择切换启动槽位(无需电脑操作)。

双系统可能遇到的坑

开机进入 Android,可能会发现字体乱码(中文变成方框)或者内置存储不能使用(例如拍照后相册内不显示)。

如果出现上述问题,大概原因是 AB 槽的 Boot 镜像不同,导致 Data 解密出现问题(我大概胡扯的)

解决方法是先进入 TWRP 格式化 Data 分区,然后直接 adb sideload 给 AB 都刷一遍系统,然后进入 B 槽的系统,过完开机引导之后,再给 B 刷 TWRP、给 A 刷 UEFI boot。顺序非常重要!!!

那么,三系统???

细心的读者已经发现了,上述做法只是借用了一个槽的 boot 分区做了 UEFI 启动,借用了一点 Userdata 空间存放 Windows 所需,其实对 system_a 和 system_b 分区的影响很小。也就是说,A、B 两个槽的 system 分区是可以“马照跑、舞照跳”的。上面已经实现了正常使用 B 槽的 Android,那么 A 槽呢?

显然也是可以利用的。

但是太困了,就回忆到这里了。