欢迎光临散文网 会员登陆 & 注册

【教程】三星Galaxy a6(exynos7870)开启KVM内核虚拟机

2022-10-07 02:24 作者:持平之粉TWRP  | 我要投稿


【1-1-1】前言

KVM:既Kernel-based Virtual Machine

你可以叫它linux内核虚拟机

这是一个内核功能 你可以在编译内核的时候将它开启 或者作为一个模块载入内核

有了它 你可以让linux内核变成一个hypervisor

配合QEMU运行硬件虚拟化加速支持的虚拟机


安卓内核是基于linux

所以 编译安卓内核开启kvm就可以实现了~吗

这里就要纠正一下了 不可行~(除极少数特殊设备可能具备条件) 就连网上说成功率最高的猎户座也不行


这里以arm64架构进行讨论(x86不在本次讨论范围)

我们市边上大部分手机都是arm64架构的

arm64又是一个精简指令集

果想要让kvm工作的话 光靠编译内核开启虚拟化和kvm是不足够的 

首先排除自身CPU以及CPU的OEM厂商对虚拟化的限制

剩下的就涉及到一个新的概念:arm64异常级别(Exception Level 简称为EL)

这里的异常指的是 在精简指令集(RISC)体系结构中 中断或打断程序正常执行的事件 //不理解没关系


arm64有4个异常级别EL0/1/2/3

arm64异常级别图

这里就简单的说明一下吧

ARM64处理器在EL0时执行进程

在EL1时执行内核

EL2对应的是虚拟机监控器

EL3对应的是安全监控器

其中arm64架构安全扩展又分为正常世界和安全世界 通过安全监视器EL3(三星的SBOOT貌似是运行在此级别上)进行切换

我们需要注意的是 这里面有个异常级别二(EL2)对应的是虚拟机监控器


∥∥而kvm想要正常工作 必须要运行在EL2上  并且kvm是属于内核空间 因此为了方便切换 让内核运行在EL2便是整个安卓kvm成功的关键问题


##############################

这里是后期(2023-3-18日编辑) 现在回过头来看这篇文章 认为让内核直接运行在EL2这个说法在本篇文章不行. armv8 的kvm实现有两种模式 一种是nvhe(内核与hypervisor处于不同异常级别)另一种是vhe(及内核与hypervisor处于同一类异常级别下) 经查阅资料 我认为 galaxy a6 exynos7870 这台设备 采用后门 漏洞方式进入EL2 并不是整个内核全部跑在EL2上 而是通过“后期kvm初始化例程”实现的 而天机1100的红米note 10 pro 则是内核与hypervisor在同一异常级别下并随内核启动 因此 修改内核的.config就可以实现kvm的启用


但目前的arm手机的kvm并不足以启动woa这一类的操作系统 看不同设备情况而异


本人小白 说的不对 还望见谅



可是手机厂商对这个异常级别是不开放的(pixel6系列是个意外)

这个地方往往被手机厂商用来执行一些自定义代码

如果这个级别被开放 那么它的权限将高于整个系统

(举一个例子 我们解锁了设备的bootloader 也仅仅是对EL1完全掌控)


但是啊 有一个例外在github与XDA论坛上发生了


他便是我们今天的主角 三星Galaxy A6


这台手机搭载了猎户座7870 SOC 定位是2018年发布的中端机型 但是命运就和他交上火了


经过xda论坛大佬的努力 这台手机目前已经可以成功开启kvm内核虚拟机的支持


其基本原理(仅个人理解)是"三星Trustzone留有一个后门用于在el2加载与执行自定义代码的接口 这个接口(位于init/vmm.c   vmm_goto_EL2)在三星的内核中被用于加载专有RKP管理程序 xda大佬正是利用这个接口 使用漏洞的方式让其进入后门EL2 以支持KVM工作"


不过现在这个设备上的KVM还是残血状态 还有很多问题没有解决

因为寄存器捕获的问题是无法运行windows系统的

只能够运行打过补丁的部分linux系统



而UP听说以后也毫不犹豫的去干了一台来


接下来以我自己的经验和踩坑为大家分享一下这台设备如何开启kvm支持吧(虽然不能运行windows但是毕竟现在arm开kvm的设备是少的可怜 先把教程做出来吧)


开始之前

你应该准备如下东西

1.x64架构的linux电脑一台(推荐ubuntu)

2.x64架构的windows电脑一台(推荐windows10)

3.Samsung Galaxy A6 手机一部(国内貌似很少人用)

4.UP主为你们整理好的文件

(https://cloud.189.cn/t/UBvMvyNjIJbi(访问码:llp9)

你还更应该注意以下事项

1.本教程不讨论任何有关于这样做的意义问题(生命的意义在于折腾)

2.本教程仅适用于安卓9的系统 小人不才 没有能力给安卓10的内核源码进行补丁适配 (怪我没有好好学C语言,目前没有C语言基础) 如果是安卓8的话请升级到安卓9 oneui 1.0 安卓10的话请试着刷一个第三方的安卓9的包 但是这样子没有办法保证系统bug的问题 三星把版本信息写到了bootloader的里面 唉 无奈

2.在进行教程时你的设备有任何不适请立即停止

3.在进行教程时务必做好数据备份

4.在开始之前最好找一份 你当前系统版本的5件套文件

三星手机救砖理念:只要Download模式在 那就还有救

本教程可能涉及到的一些知识点有

刷机解锁淦内核/基本Linux操作/三星刷机工具奥丁的使用/QEMU初步/安卓软件linux deploy 等等等...


那么教程正式开始喽~




【1-2-1】Bootloader的解锁


千里之行,始于解锁

无论你干什么 先把设备的bl解锁了 那才有折腾的权力

这个手机呢  用的不是三星的狼灭溶断式解锁

而是开关式


具体的方法是这样

1.保证设备联网(不然这个开关不会显示出来)

2.连续点版本号 直到提示你已进入开发者模式

3.备份好这个手机上的所有重要数据

4.进入开发者选项/找到oem解锁/将它开启/

此时会提示你恢复出厂设置

按照他的做就可以

恢复完成以后按照正常流程激活手机

重复上述步骤打开开发者选项

此时oem解锁应该显示这个样子

这样子就成功解锁了bl

是不是很简单呢?

连电脑都不用

但是这么简单也是有坑的(这里先提前说明一下)

当你对系统进行改动以后(例如root)之后的操作如果涉及到恢复出厂设置

请一定要每次激活进入系统以后重复上述操作 打开oem解锁开关

否则当你对系统执行任何修改操作

都会触发三星的安全检查 导致设备锁定拒绝启动

都会触发三星的安全检查 导致设备锁定拒绝启动

都会触发三星的安全检查 导致设备锁定拒绝启动

都会触发三星的安全检查 导致设备锁定拒绝启动

此时设备上的任何数据都会丢失

并且只能通过重刷5件套才能恢复


【1-2-2】第三方rec的刷入


由于三星将fastboot更改成了Download模式

所以无法采用自定义fastboot命令将rec刷入

这里就需要用到三星的奥丁刷机工具了


具体的操作是这样的:

1.在up主分享的文件里面找到三星刷机工具并安装驱动以及解压odin3-v3.13.1.zip

2.打开奥丁 并且在分享的文件里找到 /第三方recovery/TWRP/TWRP-3.2.3-TwrpBuilder-a6ltexx-2018-11-26_20-43.tar

3.在奥丁里面勾选"AP"并且点击"AP"按钮选中TWRP-3.2.3-TwrpBuilder-a6ltexx-2018-11-26_20-43.tar

4.点击options并关掉auto reboot选项

打开奥丁
点确定
勾选AP
点击AP
选中TWRP

点击options并关掉auto reboot

5.手机完全关机状态下按住音量加与减 再将数据线连接到电脑并插入手机

6.手机上面按一下音量上键进入Download模式

手机会显示这个画面/这个时候需要按一下音量上键进入Download

此时手机进入Download模式


7.奥丁连接正常后按下start开始刷机 上面的格子中出现绿色的pass说明刷机成功

正在刷机中

刷机成功

8.刷机成功后拔掉数据线并一直按住电源键和音量下键

等待设备重启后 会进入TWRP

但是很可惜 这个TWRP是有问题的

他无法解密这个设备的data分区 从而导致一些不必要的麻烦 (每次都要格式化data才能连接到mtp以及进入系统) 所以接下来我们把它换成橙狐rec

data解密失败造成的麻烦

9.进入TWRP 首先点清除/格式化data分区/输入yes

重启一次recovery

然后 将分享文件中的 橙狐rec安装zip包以及recovery.img文件拷到手机上


先用TWRP刷入橙狐的recovery.img

然后再重启到橙狐rec安装完整的橙狐zip安装包


为什么不直接用TWRP刷入橙狐安装包呢?

因为这个TWRP强行定义了设备型号

直接刷会报错

直接安装橙狐造成的报错



先用TWRP安装橙狐rec的img文件到recovery分区

重启到橙狐rec后再安装完整的橙狐zip安装包即可完成橙狐rec的所有功能安装

最后再次重启一下rec /格式化data/再安装一个面具

就可以重启到系统再走一遍激活流程了


注意每一次恢复出厂设置激活以后请再执行一遍解锁bootloader的操作!

注意每一次恢复出厂设置激活以后请再执行一遍解锁bootloader的操作!

注意每一次恢复出厂设置激活以后请再执行一遍解锁bootloader的操作!


至此 第三方的recovery安装教程结束


【2-1-1】编译带有kvm支持的内核


注意这里的内核 并不是三星官方的内核源码

还是经过xda大佬修改过那个源码

这个源码打了kvm补丁 从而能够实现kvm

并且这个源码是linux3.18.91 这个设备的安卓9系统都用的是同一套内核 所以只要你的设备处在安卓9应该都是通用的



到这里你就需要一台Linux电脑了

但是我家的电脑是真的带不动编译内核

所以我选择华硕zenfone2+chroot+ubuntu18.04这个方案


这样我就获得了一个4核x64的linux系统了

下面开始编译教程


编译安卓内核三要素 莫过于这些

1.稳定且合适的内核源码

2.合适的gcc工具链

3.基本的debug能力

附加条件:最好有最基本的c语言基础

很可惜这个条件我没有 没有这个条件遇到编译错误可能麻烦点 (隐式声明函数之类的)不过三星的内核源码无论是官方还是第三方一直来说都是很稳定的 由内核源码中出来的太明显的错误是没有碰到过的


1.第1步先安装编译内核所需要的依赖软件包

打开终端

这里我用的是ubuntu


所以命令就是 sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \

gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \

x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev \

libxml2-utils xsltproc unzip bc


耐心等待软件安装完成....


接着克隆支持Kvm的内核源码

git clone https://github.com/raspiduino/a6lte-kvm.git

克隆gcc工具链

git clone https://github.com/djb77/aarch64-linux-android-4.9.git


如果克隆有问题的网友 UP分享的文件中也提供了这套源码和gcc工具链 下载下来然后用unzip命令解压就可以了(位于/Kernel/支持kvm的内核源代码文件中 /unzip xxx.zip即可)


2.进入到源码的目录下

我的源码目录位于/home/cpzf/a6lte/a6lte-kvm-main

所以cd到这个目录就可以了

此处为源码目录


3.现在设置环境变量(从这一步开始最好进入root用户)

我的gcc工具链目录位于/home/cpzf/aarch64-android-4.9


所以依次输入

export ARCH=arm64

export CROSS_COMPILE=/home/cpzf/aarch64-linux-android-4.9/bin/aarch64-linux-android-

export ANDROID_MAJOR_VERSION=p



这样做的目的是说明我们需要编译的架构/gcc工具链的位置/以及构建的安卓版本 各位网友在编译的时候可根据自己的情况进行目录修改


4.接下来生成内核配置文件

make exynos7870-a6lte_defconfig

此时会在源码目录下生成一个.config文件

5.使用make menuconfig对内核功能进行裁剪并开启KVM

输入make menuconfig

make menuconfig内核功能裁剪界面

menuconfig操作规则:

上下键可以移动光标

左右键可以移动下面的5个选项

回车键可以进入子目录(当该功能存在子目录时)

空格键可以选中该功能开启 按下M键可以以模块的形式编译进内核(该功能可以为模块时)

按一下"/"可以查找

"?"可以调出帮助信息

.............


下面开启kvm

首先移动光标来到虚拟化"virtualization"按下空格键选中开启该功能。
按回车键进入子菜单并按空格键开启内核虚拟机KVM支持
修改下面一行的最大虚拟机支持CPU个数为8
(左右键移动)然后退出这一目录
接着来到boot options
把这一页能关的通通关掉(任何TIMA和RKP有关的/ kvm便是借助这个来运行的 不关掉会冲突 你的4G网络可能会受到限制)
关掉后应该是这个样子
退出上一级界面然后点save

到此 内核裁剪完成

另外 你还可以在这个内核开启一些其他的功能(如果你想的话)


6. 删去所有CPU热插拔支持的功能


此源码提供者已经在内核中删去了 CPU热插拔功能  因为禁用了TIMA和RKP时 CPU热插拔会出现异常 安卓只能认得到4个核心 还有4个核心是休眠状态 为了性能发挥稳定 只能采用这个方法

不删也得删 因为不删的话最后编译出来会报错的


这里我用一个非常快速的方法 直接在裁剪好的.config文件进行修改 


nano .config




使用ctrl+w 搜索所有有关hotplug的配置选项


大概有三个  这些是必须要禁用的

在前面加上"#"即可注释掉

完成后效果如下

7.编译


最后 可以开始编译了


输入make Image -j8

-j后面的值决定于你的CPU核心数 不得超过CPU核心数的两倍


在编译之前可能会问你这个问题

反正全部回答N 问什么答什么

坚决不可以让热插拔功能开启


请耐心等待内核编译 一般来说你按照我的教程来做 是不会发生任何报错的 如果有报错的 多半是环境配置的不到位


编译成功完成以后是这个结果

可以在arch/arm64/boot目录下找到Image文件

这个就是我们编译好的内核了



PS:如果你不想自己编译的话 UP已经为你提供好了一份内核(位于Kernel/原始内核映像) 把它下载下来直接进行下一步即可



8.打包

首先需要提取你本机的内核文件

设备需要获取root

然后安装一个终端模拟器 (或者在橙狐rec下使用终端命令)

输入 

dd if=/dev/block/mmcblk0p10 of=/sdcard/a6.img

此时你会在/sdcard下得到一个a6.img文件

这个就是你原机的内核了(大概是32MB,如果差的太离谱的话 就刷个面具看一下你的boot分区 然后修改if=后面的内容)


之后下载你的linux对应架构的分享文件中的magiskboot打包工具


首先先在linux创建一个文件夹 就叫boot吧

mkdir boot

然后把对应架构的magiskboot zip解压

复制到boot文件夹

再吧刚刚提取出来的a6.img复制到这个文件夹

然后chmod 777 *

给magiskboot可执行权限

之后执行 ./magiskboot unpack a6.img 进行解包


解包出来的文件有这些

删掉解包出来的Kernel

然后将编译出来的(arch/arm64/Image)Image重命名为Kernel(注意是小写啊 大小写搞错了不开机的)


移动到当前目录中

然后输入 ./magiskboot repack a6.img boot-kvm.img 进行打包

生成的boot-kvm.img就是我们需要刷入的kvm内核了

之后为其打上面具补丁

使用rec刷入即可


祝你好运啦~


如果你能够在/dev目录下发现kvm

恭喜你 成功了

这是很多手机虚拟机玩家梦寐以求的目标

珍惜这份来之不易

感谢大佬们的付出

不要小看这个字符串设备 能不能在系统中使用kvm 就靠它了

成功在/dev目录下发现kvm字符串设备


最后 使用dmesg对内核输出信息进行分析

对比kvm支持与不支持时状态

kvm工作不正常


kvm成功工作



【3-1-1】虚拟机应用

虽然 kvm成功开启了 但是想要用它运行虚拟机 嗯...还是比较复杂的 需要解决的问题还是蛮多的 接下来我们会一个个的去看它


目前kvm还不支持armhf


这里要另外说明一下kvm虚拟机不支持跨架构

也就是说你宿主机是什么架构虚拟机就只能跑什么架构 所以不要和那些x86的系统比了 这里只能发挥出aarch64的优势


【3-1-2】关于kvm运行windows arm64系统

这个目前来说还是没能实现

UP也实测了一下  Windows  boot manager过后不会转圈圈  目前是缺少对一些寄存器的捕获

以下为缺少的寄存器 unimplemented代表还未实现的部分

详情请浏览https://github.com/raspiduino/a6lte-kvm/blob/main/winarm64.md


【3-2-1】Android搭建QEMU环境

1.部署chroot debian linux

这里之所以选择debian是因为ubuntu18.04里面的QEMU实在太老了 部分功能不支持

Qemu是一个多平台的开源虚拟机

他没有为安卓专门出过apk

但是我们仍然可以运行它

这里我推荐使用linuxdeploy里面部署一个chroot debian安装QEMU

linuxdeploy安装linux过程我就不再过多做说明(网上有很多教程可以先去参考一下再回来)

首先你需要把我分享的软件部分的三个apk安装上

然后打开linuxdeploy

等待更新操作环境结束

之后你可以照抄我的配置

源地址为http://mirrors.tuna.tsinghua.edu.cn/debian
使用root用户(普通用户会被杀死)
一定要勾挂载资源/ssh
设定为/sdcard

然后点右上角的三个按钮并点击安装

等待安装结束(会输出一个deploy)

linuxdeploy如果你不会用的话你可以参考我上面的配置 会用的话可以自行发挥

但是请注意以下几点

1.架构必须为armhf

这手机有个特点 它的架构是armv8l  (Android系统是32位的)虽然它是个64位 但是这个和标准的arm64还是有一定区别的 很多软件都不一定识别到它是64位

所以在chroot容器中如果安装的是arm64 可能会出现掉root权限的问题(我自己编译的内核基本上解决了这个问题)

2.用户名必须要为root

这里不知道哪里出了问题

反正一使用普通用户 再切到root执行su/sudo就会出现被杀死的情况 所以为了保证能够使用 将他默认用户调整为root


安装完以后先点停止再点启动

接着打开juicessh

点击快速连接并输入127.0.0.1
昵称可以随便取 用户名输入root 密码填你设定的密码

这里点接受

到这里chroot linux环境部署完成

2.安装QEMU

在终端里面输入

apt update 

//用来用来更新软件源

dpkg --add-architecture arm64 

//用来开启arm64软件支持

apt update

//接着更新arm64软件源

apt install qemu-system-arm:arm64 -y

//安装arm64的QEMU(32位的qemu无法调用kvm:kvm_init_vcpu failed Invalid argument)

结束以后输入

qemu-system-aarch64 --version

//检查qemu版本以及是否安装到位


然后再输入

file /usr/bin/qemu-system-aarch64

(不过在此之前应该要先apt install file)

//检查qemu位数

ELF 64-bit 说明是64位可以运行kvm

QEMU的安装结束


PS 如果你还是嫌麻烦的话 我已经提前帮你们做好了这些 我分享的文件里面有两个rootfs

里面已经包含了基本的工具与QEMU

使用linuxdeploy rootfs安装即可(不会的话可以网上查一下)

默认已经自带ssh 安装完以后勾选ssh 然后直接启动就可以用了 默认用户root/密码是1234567


3.KVM调用测试:

输入以下命令:

qemu-system-aarch64 -M virt -cpu host --enable-kvm -monitor stdio


你的面前应该会出现一个QEMU控制台

此时输入info kvm 来查看

得到这个结果就说明调用成功


【3-2-2】使用kvm虚拟机安装ubuntu20.04 arm64 desktop

kvm运行ubuntu20.04 arm64 desktop



目前来看这个设备运行的KVM是有问题的

所以想要跑一个arm64的虚拟机

需要完成的步骤就比较多


首先有一个问题就是 当虚拟机开启的一瞬间 手机会重启 这个问题我目前没有遇到过(Trustzone旧版本可能不能很好处理这个问题)我希望大家也不要遇到


其次 还有一个普遍存在的问题 三星的引导加载程序应该配置cntfrq_el0的寄存器设置为0 但是这个只能从最高权限级别i.e.Trustzone从中写入 但不可以从任何权限级别读取(不可捕获访问) 而客户操作系统希望保持架构计时器频率为26.0MHZ 但是smc没有设置这个值的调用 这就意味着操作系统需要修补了 计时器处理以某种方式损坏 所以在kvm运行linux操作系统时 需要自定义一个dtb设备树 这个设备树包含了对计时器频率的补丁  如果不对系统进行打补丁 那么会造成内核恐慌 虚拟机无法启动

Kernel表示我很慌

这个设备树补丁(dtb.bin)我分享的文件中也提供了一份

当虚拟机不用ovmf(uefi/edk2)固件启动时

直接在QEMU命令上加上-dtb dtb.bin

即可直接传递给虚拟机

当虚拟机使用ovmf(uefi/edk2)固件启动时

此时的-dtb命令就无效了 因为他无法通过ovmf(uefi/edk2)固件传递给虚拟机 这个时候就需要把这个文件手动放在/boot/grub所在的目录下 修改GRUB启动参数来使用外来设备树文件

最后uefi他也有问题...

ovmf(edk2/uefi)并没有达到中断...

而是在第1次睡眠时挂起(edk2也是需要修补的)

所以 想要跑虚拟机需要重新编译edk2 并为其打上补丁

这里呢已经有人发了现成的

我就懒得跑去编译了

我也发了一份(在分享文件内)

如果你实在要自己编译的话(比如说换个logo之类的)

那请参考这个链接https://github.com/raspiduino/a6lte-kvm/blob/main/edk2.md

所以在运行虚拟机时不要使用其他的ovmf(uefi/edk2)固件

不然你可能会得到下面这个大东西

好了~讲了这么久的问题 我们来正式使用kvm安装一下ubuntu20.04 arm64吧


给安装光盘打补丁:

1.首先你需要下载一个ubuntu20.04 arm64的安装光盘iso镜像(这个在ubuntu官方镜像里有的 注意不要下成amd64的)

2.下载好我分享文件中的dtb.bin

3.使用UItraISO打开你下载的ubuntu系统iso文件

(这里如果你不愿意下载UItraISO的话我提供了一个单文件版的)

4.把dtb.bin拖到casper目录下(其实随便哪里都可以只要你记得住)

差不多这个样子

5.最后保存拷到手机上就行了


启动虚拟机开始系统安装:

1.首先将我分享的vga-bios里面的三个内容全部移动到chroot debian里面的/usr/share/qemu目录下

2.下载EFI_DEBUG.img和EFI_VARS.img

3.确认打过补丁的ubuntu iso在你手机的内置存储里

4.使用qemu-img生成一块64GB空白磁盘


命令如下:

qemu-img create ubuntu.img 64GB



使用以下命令开始ubuntu虚拟机安装

qemu-system-aarch64 -machine virt -m 1024M -cpu host -smp 4,cores=2,threads=1,sockets=2 -enable-kvm -pflash /sdcard/你的目录/EFI_DEBUG.img -pflash /sdcard/你的目录/EFI_VARS.img -device ramfb -serial stdio -usb -device usb-ehci,id='ehci',maxframes='128' -device usb-tablet -device usb-mouse -device usb-kbd -boot d -drive file=/sdcard/你的目录/ubuntu.img,if=none,id=disk -device virtio-blk,drive=disk -drive file=/sdcard/你的目录/ubuntu.iso,if=none,id=drive1,cache=writeback -device virtio-blk,drive=drive1,bootindex=1


ps:将命令中涉及到的路径改为你真实情况文件所存放的路径

我不是什么QEMU大神 所以这真的是最基础最基础的命令了 我也是通过这个才刚学的qemu-system-aarch64 因为好久没研究了 要是有错误还是喷的轻点 各位大神可以根据此基础命令自由发挥 但是自由发挥请遵守以下3点


1.不要随意换uefi固件 这个前面说过了

2.arm下无论如何都不应该在-enable-kvm的情况下使用-device VGA

3.最好不要改变-machine virt参数 因为这个设备树补丁文件是通过-machine virt dump出来的 改了可能会发生一些不必要的错误


这时候打开vnc viewer 过向导以后 点下面的加号 名称可以随便取 地址填写127.0.0:1


不出意外的话你就可以看到虚拟机画面了

由于使用ramfb 系统分辨率会不太好调整

我们对ovmf固件里面的分辨率进行调整 方便后续操作

不断按下ESC

选择Device manager

选择 OVMF platform configuration

将分辨率改为1024x768

之后一路ESC回到主界面

reset

接着会进入GRUB(注意选第1项进入试用模式 后面会用到)

按一下E进入编辑模式

我们要做的是 删除第4行linux后面的quiet

然后来到最后一行前面空8格 写上"devicetree /casper/dtb.bin"

修改完以后效果是这样的

之后按一下F10启动


不出意外的话就可以正常进入live cd了

如果出现卡在virtio-pci 可以尝试多试几次

卡virtio-pci


总有一次是可以进去的

这个问题我排查了许久 其他的iso没有发现这个问题

命令我一个个的试过了 嗯.. 我比较笨...感觉上是概率问题


接下来就是喜闻乐见的安装过程了

整个安装过程大概要亿个小时吧

exynos7870就这个性能

但是我感觉kvm并没有完全发挥出它的性能

在使用qemu3.1.1的时候无论怎么配置多核心 虚拟机里面可用的只有两核

QEMU3.1.1 可以调用两核



在使用qemu7.1.0 的时候只有一个核心可以用 还有一个核心在系统内是启动失败的

QEMU7.1.0 cpu1无法启动

安装完成以后千万不要急着重启

一定要点继续试用

点击继续使用

因为ubuntu只安装单一系统是不会在开机时候显示GRUB的 我们接下来的操作需要用到GRUB 所以就要对他进行一些修改


打开终端设置一个root账户

挂载并chroot文件系统

依次输入

sudo mount /dev/vda2 /mnt

sudo mount --bind /dev /mnt/dev

sudo mount --bind /sys /mnt/sys

sudo mount --bind /proc /mnt/proc

sudo chroot /mnt


接下来sudo nano /etc/default/grub

sudo nano /etc/default/grub

将GRUB_TIMEOUT_STYLE=hidden这一项前面加上"#"把它注释掉

将GRUB_TIMEOUT=0 把"0"改成10


改好之后效果差不多是这样的

ctrl+o保存/ctrl+x退出


接下来更新GRUB

输入update-grub来更新GRUB

之后输入sudo nano /boot/grub/grub.cfg

如果在ubuntu安装期间下载并安装linux5.15内核的请注意了 启动5.15的时候是没有办法启动图形界面的 只有串口命令行在运行 图形界面则卡在这里

图形界面卡在这里

所以我们需要找linux5.8的GRUB内核启动配置项

按照之前在GRUB界面修改的一样

删去linux开头那一行的quiet
空一行添加devicetree /boot/dtb.bin


最后 将dtb.bin从live cd复制到/boot/

以及/boot/grub



之后sudo power off


然后去掉安装光盘

启动命令更改为:qemu-system-aarch64 -machine virt -m 1024M -cpu host -smp 4,cores=2,threads=1,sockets=2 -enable-kvm -pflash /sdcard/你的目录/EFI_DEBUG.img -pflash /sdcard/你的目录/EFI_VARS.img -device ramfb -serial stdio -usb -device usb-ehci,id='ehci',maxframes='128' -device usb-tablet -device usb-mouse -device usb-kbd -drive file=/sdcard/你的目录/ubuntu.img,if=none,id=disk -device virtio-blk,drive=disk



之后进入GRUB界面 选择Advanced options for ubuntu

再选择ubuntu,with linux-5.8.0-generic

就可以成功启动进入图形界面啦~


其他发行版也可以参考我这个教程 操作过程是大同小异的



我的天呐 这篇教程终于要结束了

总的来说

arm手机上的kvm是总会给人带来惊喜的

无论有多少问题 我们总会乐此不疲的去研究


最后 由衷的感谢 对本片专栏提供很大帮助的教程


https://github.com/raspiduino/a6lte-kvm

https://github.com/sleirsgoevy/exynos-kvm-patch

https://ivonblog.com/posts/how-to-compile-custom-android-kernel/

https://blog.icepie.dev/2021/02/22/android-kernel-add-kvm

特别感谢github @raspiduino

没有他的帮助 也就没有这篇教程 这是个热心的老哥~

结束了~

Bye bye.









【教程】三星Galaxy a6(exynos7870)开启KVM内核虚拟机的评论 (共 条)

分享到微博请遵守国家法律