|
| 1 | +--- |
| 2 | +title: pve 安装 Bliss OS - Android-x86 并配置显卡直通 |
| 3 | +date: 2023-12-15 |
| 4 | +description: "pve 安装 Bliss OS - Android-x86 并配置显卡直通" |
| 5 | +layout: post |
| 6 | + |
| 7 | +tags: |
| 8 | + - pve |
| 9 | + - Android |
| 10 | + - 虚拟机 |
| 11 | +categories: |
| 12 | + - pve |
| 13 | + - Android |
| 14 | + - 虚拟机 |
| 15 | +lightgallery: true |
| 16 | + |
| 17 | +toc: |
| 18 | + auto: true |
| 19 | +--- |
| 20 | + |
| 21 | +## 1. 前言 |
| 22 | + |
| 23 | +我的 [这篇文章](../android-x86-pve/) 中介绍了在 pve 环境中安装 `Android-x86` 实现 `x86` 架构的云手机,可惜 `Android-x86` 的版本停留在了 `Android 9.0` ,这个版本的 `Android` 无法实现音频的串流,`scrcpy` 的音频串流最低支持到 `Android 10` ,无法听到音频的云手机是不完美的,今天我们就来试下另一个 `Android-x86` 的项目 - [BlissOS](https://blissos.org/) ,看它是否可解决以上问题,成为真正可用的云手机。 |
| 24 | + |
| 25 | +## 2. 安装 |
| 26 | + |
| 27 | +### 2.1 ROM 选择 |
| 28 | + |
| 29 | +简单介绍一下 `BlissOS` ,它是基于 `AOSP` 优化定制,集成了很多专为 `PC` 优化的功能,比 如 `Dock`,`Desktop` 模式,兼容 `arm` 应用,也就是说他的 ROM 定制得更像一个平板系统,而不是原生 `AOSP` 那样,`AOSP` 如果作为远程使用,没有触摸屏的情况下还是有很多操作上的不便,但是它定制的版本则很好的解决了鼠标操作的问题,因为它目标就是专为Chromebook、桌面PC、平板等设备优化。 |
| 30 | + |
| 31 | +目前官方提供了两个稳定的分支,`BlissOS 14` 基于 `安卓 11` ,另一个 `BlissOS 15` 基于 `Android 12L` ,我这里选择了 `BlissOS 14`。 |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +BlissOS 14 提供了几个 ROM,我们下载带谷歌框架的这个版本: |
| 36 | + |
| 37 | + |
| 38 | + |
| 39 | +### 2.2 显卡加速 |
| 40 | + |
| 41 | +Bliss OS 由开源技术构建,内核基于 `Linux` 所以支持大部分显卡加速,然而由于 `Nvidia` 专用驱动对很多开源软件的支持问题,BlissOS 仅支持极少的 Nvidia 显卡,我的上篇文章中使用了 `VirtualGL` 为 `Android-x86` 提供显卡加速,那个方案是可行的,而且性能也足够,但缺点时没有物理输出,今天我们换个方案,参照 [这篇文章](../pve-igd-passthrough/) 中提取出的核显 `vbios` ,就能实现核显直通并具有物理输出,我们不仅可以用来当作云手机,甚至可以外接显示器作为 `HDPC` 使用。 |
| 42 | + |
| 43 | +### 2.3 安装 BlissOS |
| 44 | + |
| 45 | +> 以下安装需要你确定你的显卡 `vbios` 正常工作,比如通过这个 `vbios` 能正常的安装 `Windows` 并点亮屏幕,显卡的兼容性可参考 `BlissOS` 的官网,正常来说所有 `Intel` 和 `AMD` 的核显均支持,以下安装使用的是 i5-10400 的核显 - `UHD630` 。 |
| 46 | +
|
| 47 | +- **创建虚拟机** |
| 48 | + |
| 49 | +```bash |
| 50 | +# 以下参数看情况修改 |
| 51 | +qm create 115 \ |
| 52 | +--cores 6 \ |
| 53 | +--cpu host \ |
| 54 | +--bios ovmf \ |
| 55 | +--machine pc \ |
| 56 | +--memory $((8 * 1024)) \ |
| 57 | +--net0 virtio,bridge=vmbr0,firewall=1 \ |
| 58 | +--name BlissOS-14 \ |
| 59 | +--scsihw virtio-scsi-single \ |
| 60 | +--efidisk0 file=local-vzb:0,format=qcow2 \ |
| 61 | +--scsi0 file=local-vzb:32,format=qcow2 \ |
| 62 | +--ide2 file=ugreen:iso/Bliss-v14.10-x86_64-OFFICIAL-opengapps-20230704.iso,media=cdrom \ |
| 63 | +--boot order="scsi0;ide2" \ |
| 64 | +--hostpci0 0000:00:02,legacy-igd=1,romfile=igd.rom \ |
| 65 | +--hostpci1 0000:00:1f.3 \ |
| 66 | +--args '-set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on' \ |
| 67 | +--vga none |
| 68 | +``` |
| 69 | + |
| 70 | +记得添加 usb 键盘和鼠标设备,核显连接显示器之后开机安装。 |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | +安装界面 `grub` 菜单,有很多 Live 的选项,可以先选择 Live 选项看下是否正常启动,测试一下显卡兼容性,安装就选择高级选项 - 自动安装即可。 |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | +如果 OS boot 的时候一直卡在这个界面就是显卡不兼容,无法运行 `BlissOS` 。 |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | +如果没有其他问题正常安装即可,下面看下 ROM 的配置。 |
| 83 | + |
| 84 | +## 3. 配置 |
| 85 | + |
| 86 | +ROM 已经打开了 `5555` 端口的 `adb` 调试,我们可以直接 `scrcpy` 连接: |
| 87 | + |
| 88 | +```bash |
| 89 | +# adb 连接 |
| 90 | +adb connect 192.168.5.134 |
| 91 | + |
| 92 | +# scrcpy 连接 |
| 93 | +scrcpy -e |
| 94 | +``` |
| 95 | + |
| 96 | +由于我们直通了主板声卡,所以该版本可以进行 `scrcpy` 音频串流了,连接信息中也没有了音频警告信息。 |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | +### 3.1 桌面模式 |
| 101 | + |
| 102 | +打开 `Desktop Mode` 进入桌面模式,该模式下和 `PC` 的操作逻辑很像,应用以浮窗模式运行,也可以进行全屏,窗口缩放等操作。 |
| 103 | + |
| 104 | + |
| 105 | + |
| 106 | +### 3.2 Smart Dock |
| 107 | + |
| 108 | +上面那种模式虽然和 `PC` 操作逻辑很像,但是会有一些问题,比如应用切换其实并不方便,而且有的应用没做小窗适配,导致小窗布局出现问题,我喜欢设置 `Smart Dock` 然后全屏打开应用。 |
| 109 | + |
| 110 | +打开 `Smart Dock` 进行应有的赋权,会在下方出现一个 `Dock` 栏,可以显示菜单、通知、音量设置、时间、正在运行的应用等信息,操作便利。 |
| 111 | + |
| 112 | + |
| 113 | + |
| 114 | +### 3.3 传统安卓桌面 |
| 115 | + |
| 116 | +当让你也可以什么都不配置,直接使用朴素的安卓桌面,这个安卓的平板操作是一致的。 |
| 117 | + |
| 118 | +### 3.4 Root |
| 119 | + |
| 120 | +ROM 内置了 [KerneISU](https://kernelsu.org/zh_CN/guide/installation.html),可以方便的获取 Root 权限。 |
| 121 | + |
| 122 | + |
| 123 | + |
| 124 | +## 4. 性能和应用兼容情况 |
| 125 | + |
| 126 | +虚拟机配置方面给到了 `6 核 8G` 的配置,宿主机 `CPU` 为 `i5-10400` ,在今天来看也很普通的配置了,在运行效率上比 Windows 上运行模拟器好不少。 |
| 127 | + |
| 128 | +### 4.1 Geekbench 6 跑分情况 |
| 129 | + |
| 130 | + |
| 131 | + |
| 132 | +`Geekbench 6` CPU 跑分情况,单核 `1293` , 多核 `4480`,可能是虚拟机的原因,内核调度有点问题,跑分的时候 CPU 跑不满,要是跑满了分数还会高点,当然日常使用肯定是没什么问题了,单核跑分和 `8Gen1` 接近,多核在 `8Gen1` 和 `8Gen2` 之间。 |
| 133 | + |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | +GPU 跑分结果为 `4405` 分,图形接口为 `Vulkan` ,性能的话接近 `小米11T pro` 的 `骁龙 888` 。 |
| 139 | + |
| 140 | + |
| 141 | + |
| 142 | + |
| 143 | + |
| 144 | +> 以上跑分也就图一乐,实际上 `x86` 平台和 `arm` 平台的比较是不严谨的,双方运行的环境差异太大,这里的跑分只是大致参考一下性能,总之这样的性能流畅运行大部分日常应用是没问题的,下文的 `GIF` 是一些应用运行的效果,可以看出还是很流畅的。 |
| 145 | +
|
| 146 | +### 4.2 兼容性 |
| 147 | + |
| 148 | +兼容性方面由于我测试的不全面,不能完全说全面兼容,但是不管是一些 `32bit` 的应用,还是最新的 64 位应用都能运行,所以上文说的将它当作 `HDPC` 是可行的。 |
| 149 | + |
| 150 | +在目前的测试中只有 bilibili 普通版打开 Crash,报错日志: |
| 151 | + |
| 152 | +```log |
| 153 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: kotlin.UninitializedPropertyAccessException: lateinit property crash has not been initialized |
| 154 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.gripper.container.crashreport.BLCrashInitTask.c(BL:1) |
| 155 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.gripper.container.crashreport.a.f(BL:8) |
| 156 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.gripper.container.crashreport.a.a(BL:1) |
| 157 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.lib.gripper.api.TaskCompat.c(BL:9) |
| 158 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.lib.gripper.api.TaskCompat.b(Unknown Source:0) |
| 159 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.gripper.container.crashreport.a.b(BL:1) |
| 160 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.gripper.container.crashreport.BLCrashInitTask$$CompatProducer$$execute$$Lambda.invokeProducer(BL:2) |
| 161 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at com.bilibili.lib.gripper.api.internal.ProducerLambda.invokeSuspend(BL:11) |
| 162 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BL:4) |
| 163 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlinx.coroutines.w0.run(BL:22) |
| 164 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler.m(BL:1) |
| 165 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$c.d(BL:4) |
| 166 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$c.n(BL:4) |
| 167 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: at kotlinx.coroutines.scheduling.CoroutineScheduler$c.run(BL:1) |
| 168 | +12-15 14:50:47.629 13749 29123 E AndroidRuntime: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [p2{Cancelling}@d87693a, java.util.concurrent.Executors$DelegatedScheduledExecutorService@193a9eb] |
| 169 | +12-15 14:50:47.631 992 2975 W ActivityTaskManager: Force finishing activity com.bilibili.app.in/tv.danmaku.bili.MainActivityV2 |
| 170 | +``` |
| 171 | + |
| 172 | +### 4.3 运行情况 |
| 173 | + |
| 174 | +下面看一段 GIF 看下运行情况: |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | +## 5. 总结 |
| 179 | + |
| 180 | +以上看到了最后运行了一个游戏,最终的运行效果没有放出来,是的,这个游戏能进界面,但是会在进行对战的时候闪退,试了一下游戏兼容性,腾讯的MOBA如LOLM也是在对战时闪退,一些游戏能正常运行,如“凡人修仙传手游”可以流畅运行,所以用来游戏挂机要看游戏是否兼容。 |
| 181 | + |
| 182 | +除此之外完全可以当作能 `7 * 24` 小时待机的云手机使用,体验和实机也差不多,适合喜欢折腾的小伙伴,或者进行 app 开发测试等场景,当然如果你有什么有趣的玩法,也欢迎留言一起讨论! |
0 commit comments