PVE 安装 Android x86 & 安装 Magisk

4 mins to read

下载镜像

首先选择镜像,我一开始尝试的是成 CM 的 7.0 镜像但由于是全虚拟的系统,这个版本的系统开启 ADB 后,虽然可以开启网络端口监听,但无法首次就用网络连接(无法 auth)。PrimeOS 也是遇到同样的问题甚至无法直接开启网络 ADB。后来换用 Android x86 9.0 版本,自带 root 权限,默认开启 ADB 且支持首次网络连接。

镜像下载:https://mirrors.tuna.tsinghua.edu.cn/osdn/android-x86/

折腾完发现有打好 Magisk 的镜像,https://androidx86magisk.osdn.io/,如果早点看到本文完结。

提取 boot.img

  1. 从 ISO 镜像中复制出 kernelramdisk.img 这两个文件
mkdir -p /mnt/temp
mount -t iso9660 -o loop android.iso /mnt/temp
cp /mnt/temp/kernel .
cp /mnt/temp/ramdisk.img .
umount /mnt/temp
  1. 安装工具软件 mkbootimgabootimg(在 Linux 开发系统,如以下命令以 Debian 系为例)
apt install android-tools-mkbootimg abootimg
  1. kernelramdisk.img 打包成 boot.img
mkbootimg --kernel kernel --ramdisk ramdisk.img -o boot.img

mkbootimg 是 Android 系统中一个用于创建内核镜像文件的工具,常见用法和参数说明如下:

mkbootimg \
--kernel <kernel-image> \
[--ramdisk <ramdisk-image>] \
[--second <second-image>] \
[--dtb <dtb-image>] \
[--cmdline <kernel-command-line>] \
[--base <address>] \
[--pagesize <size-in-bytes>] \
[--ramdisk_offset <address>] \
[--tags_offset <address>] \
[--ivt_offset <address>] \
[--os_version <version>] \
[--os_patch_level <yyyy-mm-dd>] \
[--header_version <version>] \
-o <image-output-file>

参数说明:

  • --kernel: 指定内核镜像文件路径。
  • --ramdisk: 可选参数,指定 RAM disk 镜像文件路径。如果在 cmdline 中指定将使用另外一个 ramdisk-image。
  • --second: 可选参数,指定第二阶段启动器镜像文件路径。
  • --dtb: 可选参数,指定设备树二进制文件路径。
  • --cmdline: 内核命令行,指定内核启动参数。
  • --base: 可选参数,指定内存基址,为一个 16 进制数。
  • --pagesize: 页面大小,指定内存页面大小,默认为 2048。
  • --ramdisk_offset: RAM disk 镜像文件在内存中的 offset。
  • --tags_offset: Tag 信息在内存中的 offset。
  • --ivt_offset: IVT 信息在内存中的 offset。
  • --os_version: 操作系统版本号。
  • --os_patch_level: 操作系统补丁等级,格式为 yyyy-mm-dd
  • --header_version: Boot image header 版本号,默认值为 1。
  • -o: 输出镜像的文件路径。

除了上述参数外,还有其他较少用到的参数,如 --hash 等。根据实际情况需要设置不同的参数。

开启 ADB

  1. 系统 - 关于 中多次点击版本号,直到开启开发者模式
  2. 开发者选项 中开启ADB
  3. 关于 - 状态 中查看当前 IP
  4. 通过 ADB 连接 adb connect 192.168.100.1

boot.img 补丁

  1. 在 PVE 中创建虚拟机(如下图参数,不添加额外 EFI 盘),用上面步骤下载的 ISO 安装系统(如果有现有的 Android 系统,安装 Magisk 即可用来打补丁)

  1. 引导菜单进入 ISO 启动菜单,选择 Advence Options,然后选择自动安装(此次安装系统只是为了打补丁,并不用于实际运行)。进入系统后,安装 Magisk APK。

  2. 用 ABD 将 boot.img 传输到 Android 系统中

adb push ./boot.img /storage/self/primary/Download/
  1. 在 Magisk 中点击安装,选择并修补一个文件(选择 boot.img

  1. Magisk 补丁后将会在相同目录生成一个 img 文件 magisk_patched-xxx.img,使用 ADB pull 将文件下载到本地。

打包新系统镜像

abootimg -x patched_boot.img

先解压 patched_boot,然后将 zImage 重命名为 kernelinitrd.img 重命名为 ramdisk.img

# 新建临时处理文件夹
mkdir -p /tmp/original_iso
mkdir -p /tmp/new_iso
# 挂载原始镜像 android.iso
mount -t iso9660 -o loop ./android.iso /tmp/original_iso
# 复制 ISO 中所有文件到新的镜像临时目录
cd  /tmp/original_iso && tar cf - . | (cd /tmp/new_iso; tar xfp -)
# 放入新的 patched 文件
cp ./kernel /tmp/new_iso
cp ./ramdisk.img /tmp/new_iso
# 重新打包为 EFI 可引导 ISO
xorriso -as mkisofs -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -o ./androidx86-patched.iso  /tmp/new_iso

处理完毕后解除挂载 umount /tmp/original_iso

Windows 系统使用 UltraISO 打开原始 Android x86 镜像,将补丁后的 kernelramdisk.img 拖进去,导出新镜像。

安装

用上述提到的 PVE 参数新建虚拟机(或者复用上述现有虚拟机),ISO 镜像选择导出的新镜像。启动虚拟机,选择普通安装模式。

进入 gdisk 分区界面

  • 选择 New 创建 EFI 分区(起始位置默认,大小 250Mb,分区类型 ef00
  • 再次选择 New 创建系统分区(起始位置默认,大小默认全部,分区类型默认 8300
  • 选择 Write 写入

将系统分区格式化为 ext4,第一个分区(EFI)将会默认格式化为 vfat

/system 设置为可读写(下图选择 yes

启动 & 使用

安装系统后,启动 Android,并安装 Magisk 可以看到已经是安装好的状态。

问题

由于 x86 官方镜像里已带有 su,打开 Magisk 检测到多个 su 则会提示:不属于Magisk的su文件异常状态怎么办

开发机内# adb root
开发机内# adb shell
android 内# su root
android 内# rm /system/xin/su

另外此种方式安装的 Magisk 每次启动都会如下图提示,但功能不受影响。

安装 Lsposed

首先安装 riru,从 Github 下载 riru-xxx-release.zip,使用 adb push 上传到 Andorid 中,然后在 Magisk 模块中选择 从本地安装

然后下载 LSPosed-xxx-riru-release.zip,使用 adb push 上传到 Andorid 中,然后在 Magisk 模块中选择 从本地安装。重启系统即可。

相关项目和参考