← 所有文章

计算机技术

在虚拟机中安装 Android-x86 虚拟机

记录在 Oracle VirtualBox 中安装 Android-x86 虚拟机以及在 KVM/Qemu 中安装 Bliss OS 虚拟机。

约 5 分钟更新于 2026年9月4日

想要安装 Android 虚拟机的目的很简单,就是想试验一些不敢直接在手机上安装的 APK 。

在 Oracle VirtualBox 中创建虚拟机

最开始使用 Oracle VirtualBox 安装 Android-x86 。当时就发现 Android-x86 的 public ISO 已经很久不更新了,但是还是没有选择更换系统。

SourceForge android-x86 Files 中 Release 9.0 已经是 2022 年的了。

创建虚拟机的步骤和创建普通虚拟机一样:

  1. 访问 Android-x86 官方网站,下载 ISO 文件。
  2. 新建虚拟机,各种配置常规即可。
  3. 启动安装:这里就有些坑了。

Reference:

Auto Installation

Android-x86 官方提供了 Auto Installation 选项辅助安装。

If you want to use Android-x86 as the only OS in your device, you may choose “Auto Installation” under the “Advanced options”.

经笔者测试, Advanced options 下的 Auto Installation 可以方便、快速、正确地完成系统安装,无须手动操作。

Manual Installation

大致流程如下:

  1. Installation - Install Android-x86 to harddisk
  2. Create/Modify partitions
  3. Do you want to use GPT? No
  4. NEW -> Primary -> Enter -> Enter (新建分区 -> 主分区 -> 默认 ->默认)
  5. 选择 Bootable ,选择 Write ,然后 Quit
  6. 选择磁盘 -> ext4
  7. Do you want to install boot loader GRUB? yes
  8. Do you want to install /system directory as read-write? yes (不知道有什么用,但是反正不占太多空间)
  9. 移除 ISO 后 Reboot ,如果你忘记移除 ISO 了,重启之后会再次进入最开始的系统安装界面,移除重启即可。

解决 “无 GUI” / “detecting android-x86 found at /dev/sda1 卡死” 问题

安装系统倒是简单,但是对于 x86 机器,很有可能重启后出现没有 GUI 或者卡死在 detecting android-x86 found at /dev/sda1 的问题。这个很有可能是图形栈不兼容导致的,大致解决步骤如下:

  • 重启选择 Debug 启动
  • mount -o remount,rw /mnt :因为后面要编辑这里的文件,可能是只读的(那样 vi 会提示你文件 read only )
  • vi /mnt/grub/ment.lst (没有 nano … )
    • 文件里面有 4 个部分:
      Android-x86 9.0-r2
      Android-x86 9.0-r2 (Debug mode)
      Android-x86 9.0-r2 (Debug nomodeset)
      Android-x86 9.0-r2 (Debug video=LVDS-1:d)
    • 可以看到这就是启动界面的 4 个启动选项。编辑第一个正常启动选项,将语句 kernel /android-9.0-r2/kernel quiet root=/dev/ram0 SRC=/android-9.0-r2 中的 quiet 改成 nomodeset 即可。
  • Reboot

最后成功启动后 VirtualBox 会给 Android 虚拟机虚拟出一个 VirtWifi ,好像虚拟机里会显示这个 WIFI “已连接但网络不可用”,实际上网络应该是可用的,不用管这个报错。

在 KVM 中安装 Bliss OS

时隔 1 年,笔者又来进行重复的操作了。只是这次换了虚拟机软件以及系统,以及有远为强大的 ChatGPT 辅助。

安装 Bliss OS 的流程大差不差,但是这里有一点比较坑,需要自己划出一个引导盘,否则就会像我一样一直卡在 Booting from Hard Disk... 。具体来说,就是要在分区时创造两个分区:

/dev/sda1
512 MB
FAT32
EFI System Partition
/dev/sda2
ext4
BlissOS

当然这样的话 KVM 可以设置 UEFI Boot 。重启之后,我们可能会遇到 UEFI 找不到可执行的 EFI bootloader 的问题,进入 UEFI Interactive Shell ,即下图:

BlissOS EFI Boot GUI 不启动

这里需要手动找到 EFI 引导文件,并执行。我这里是 FS0:\EFI\BlissOS\BOOTX64.EFI ,可以将它放到标准 fallback 路径 FS0:\EFI\BOOT\BOOTX64.EFI 中。

接着又遇到了与 Android-x86 类似的问题,卡死没有输出。编辑启动参数去掉 quiet 后发现系统循环报错:

Bliss OS 启动报错

ChatGPT 判断,这更像是图形栈启动失败,导致 surfaceflinger/system UI 一直起不来。BlissOS 官方文档对“启动动画始终不出现”的情况,明确建议先加 nomodeset 强制走软件渲染/兼容模式;BlissOS 14.10 还支持 HWACCEL=0 和 ANGLE/SwiftShader 作为虚拟机里的软件渲染方案1

使用和 Android-x86 一样的解决方案,在启动参数中添加 nomodeset ,问题解决。ChatGPT 判断,原因是 BlissOS 本身就是 Android-x86 这一技术路线的延伸。在 PC 上,它不是像手机 Android 那样面对固定的 GPU/HAL,而是要处理 Linux DRM/KMS、Mesa、Gralloc、Hardware Composer 等图形栈。到了 QEMU/KVM,又多了一层虚拟 GPU。某些组合下内核能启动、Android userspace 也能起来,但图形栈初始化失败,于是就会出现我们刚才看到的 surfaceflinger 等组件反复异常。nomodeset 本质上就是告诉内核:不要正常启用 GPU 的 Kernel Mode Setting,走更保守的显示/软件渲染路径。代价主要是图形性能会差一些,可以研究别的不那么保守的解决方案。

使用问题

虽然成功安装了 Android 虚拟机,但是在真正开始尝试试验 APK 时,还是会面临一些问题。

一个直接的问题是,并不方便实现共享剪切板、共享文件夹。当然对于已经把 APK 拿到手的情况,直接使用 adb 安装即可。

更致命的问题是,如果 APK 只提供 arm 平台的库,那在 x86 平台将无法运行。当然,Bliss OS 提供 ARM Translation 功能,但是这对于笔者这种普通用户,无疑是进一步的认知负担。

可能更为简洁直接的方案是:准备一台便宜的 Android ARM64 手机作为专门测试设备,不登录个人账户、不插个人 SIM、不放私人数据、与重要局域网隔离。APK 的兼容性最好,也不用处理 x86→ARM translation。

Footnotes

  1. https://docs.blissos.org/knowledgebase/troubleshooting/debug-booting/