「Coding Tools」 第4话 如何使用Qemu虚拟机运行EDK2编译结果
谭玉刚
2021年07月17日 22:16
收录于文集
共9篇

上一篇我们编译出了一个efi文件,不过不知道该咋运行,所以今天就来学习一下如何使用Qemu虚拟机加载EDK2编译好的程序。使用虚拟机还是比较方便的,后续我们也会学习如何使用真机运行efi程序,不过需要下载一个Shell工具。

首先,我们需要修改~/src/edk2/Conf目录下的target.txt文件,一是修改第20行ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc,二是修改第44行TARGET_ARCH = X64。

然后在~/src/edk2目录下运行build命令,编译的时候还是比较耗资源的,我的电脑风扇在呜呜的转,不过时间不长一会就好了。编译好的文件是~/src/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd。这其实是一个完整的固件文件,不只是一个单纯的EDK2应用程序。

接下来安装Qemu虚拟机软件,非常好用,一条apt命令搞定:

代码块
Shell
自动换行
复制代码
sudo apt-get install qemu
复制成功

然后再执行一条命令把之前提示用不到的软件包删掉:

代码块
Shell
自动换行
复制代码
sudo apt autoremove
复制成功

不知道各位同学注意到没有,上图中有一个sudo: 无法解析主机xxx,每次执行sudo命令都会出现很恼人。这是因为我在安装系统时把名字写成了Asua,后来又修改成了Asus,所以导致主机名发生了变化。那么我们可以通过修改主机名来解决这个问题,在此之前我们要安装一个软件-Vim。

代码块
Shell
自动换行
复制代码
sudo apt install vim
复制成功

安装完成后,再执行一条命令来修改/etc/hosts。可以看到当前的计算名称还是Asua,跟我修改后的不一致,所以改成Asus就可以了。Vim的使用估计得单开一节课,用不习惯的同学暂时不要学,光是退出Vim就可以生成一大串随机字符串。

恼人的麻烦解决了,接下来继续执行运行OVMF.fd操作。首先在用户主目录下创建一个文件夹并切换到它,这个文件夹就是用来运行OVMF.fd文件的。

代码块
Shell
自动换行
复制代码
mkdir run-ovmf
cd run-ovmf
复制成功

然后再把OVMF.fd文件拷贝到这个文件夹里,并修改它的名称:

代码块
Shell
自动换行
复制代码
cp ~/src/edk2/Build/ovmfX64/DEBUG_GCC5/FV/OVMF.fd bios.bin
复制成功

Qemu可以把一个文件夹当作硬盘来用,我们再新建一个文件夹:

代码块
Shell
自动换行
复制代码
mkdir hda-contents
复制成功

然后开始运行Qemu虚拟机,是一条长长的命令:

代码块
Shell
自动换行
复制代码
qemu-system-x86_64 -L . -hda fat:hda-contents
复制成功

不过貌似执行结果不太正确,表示没有这个命令。其实之前安装的时候我就觉得不对头,怎么只下载了15KB呢?Qemu好歹也是几十MB的程序:

那我们就按照提示再次执行安装命令:

再次运行之前的指令,还是提示有问题:

看提示信息说Block node is read-only,也就是只读的,那就加上参数让它变成读写的呗。

代码块
Shell
自动换行
复制代码
qemu-system-x86_64 -L . -hda fat:rw:hda-contents
复制成功

倒是起来了一个窗口,但是一直处于启动中,看起来也不是很正常的样子:

这里要记住一个命令,Ctrl+Alt+Q是退出Qemu的命令,我就被锁定鼠标后不知道该咋弄,还以为是Ubuntu卡死了,要重启呢。

这种方法不行就尝试下一种,是直接指向刚刚编译好的OVMF.fd文件,的确可以跑起来:

代码块
Shell
自动换行
复制代码
qemu-system-x86_64 -L . --bios ~/src/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -net none
复制成功

不过这种方式有弊端,就是没法使用文件夹作为硬盘,所以没法在这个Shell里查看编译好的efi文件,比如上一篇讲到的HelloWorld.efi。所以虽然它可以启动,但是我并不推荐。

接下来试试第三种方法,

代码块
Shell
自动换行
复制代码
qemu-system-x86_64 -pflash bios.bin -hda fat:hda-contents -net none
复制成功

第三种方法看起来也跑不起来,郁闷

那就剩下最后一种了,我们先把上一篇的~/src/edk2/Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi文件复制到~/run-ovmf/hda-contents/目录下,然后再运行Qemu命令:

代码块
Shell
自动换行
复制代码
cp ~/src/edk2/Build/MdeModule/DEBUG_GCC5/IA32/HelloWorld.efi ~/run-ovmf/hda-contents/
qemu-system-x86_64 -pflash bios.bin -hda fat:rw:hda-contents -net none
复制成功

可以跑起来了,然后在Shell里输入fs0:命令,就相当于进入了文件系统,对应的就是hda-contents文件夹,执行ls命令就可以看到HelloWorld.efi文件了,我们输入HelloWorld.efi,然后点击Enter,貌似什么都没有输出,不过也可以证明咱们的Qemu虚拟机环境算是跑起来了。

总结一下下,搭建环境可能还比较简单,但是想要真正跑得欢快仍需努力。Up对于EDK2这一套开发也还不太熟悉,假以时日共同进步,肯定是可以搞懂的。今天就到这里,再见!