聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

在Ubuntu 20.04下搭建edk2的编译运行环境

2022-02-27 11:35 浏览: 3717945 次 我要评论(0 条) 字号:

一,环境
$ cat /etc/issue
Ubuntu 20.04.2 LTS n l

$ uname -a
Linux lenky-HP 5.10.0-1057-oem #61-Ubuntu SMP Thu Jan 13 15:06:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

二,确保软件源OK
$ sudo apt-get update
$ sudo apt-get upgrade — 这步可不做

三,准备源码
1,准备EDK2的源码

https://github.com/tianocore/edk2/releases/tag/vUDK2018

https://github.com/tianocore/edk2/releases/download/vUDK2018/edk2-vUDK2018.tar.gz

2,准备OpenSSL_1_1_0g源码

https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.zip

四,切换到Ubuntu 16.04 LTS
备注:尝试了在Ubuntu 20.04上直接编译vUDK2018,但发现需要gcc-4.8,但在Ubuntu 20.04上安装gcc-4.8比较麻烦,主要是各种依赖包难搞。所以用docker试试。
1,删除Ubuntu 20.04上自带的旧版本docker
$ sudo apt-get remove docker docker.io docker-engine containerd runc

2,安装Docker Engine-Community版本,也就是docker-ce
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
$ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo docker run hello-world

3,安装docker-compose

$ sudo curl -L “https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose version

4,给docker添加国内镜像原

$ sudo vi /etc/docker/daemon.json 
$ cat /etc/docker/daemon.json 
{
	"bip": "128.128.0.1/16",
	"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
$ sudo systemctl daemon-reload 
$ sudo systemctl restart docker

registry-mirrors那一行是新加的(注意上一行末尾的逗号)。/etc/docker/daemon.json文件不存在,则新建即可。

五,创建Ubuntu 16.04的docker镜像
1,准备单独目录
$ mkdir docker-ubuntu1604
$ cd docker-ubuntu1604/

2,准备1604的源

$ vim sources.list
$ cat sources.list
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

3,创建run.sh文件

$ vim run.sh
$ cat run.sh
#!/bin/bash
/usr/sbin/sshd -D

4,创建dockerfile文件

$ vim dockerfile
$ cat dockerfile
# 以最新的Ubuntu镜像为模板
FROM ubuntu:16.04

# 将本目录下的sources.list作为容器的一个文件
ADD sources.list /root/sources.list
# 使用阿里Ubuntu源,更新快
RUN mv /etc/apt/sources.list  /etc/apt/sources.list_bak
RUN cp /root/sources.list  /etc/apt/sources.list

RUN apt-get update
# 安装vim
RUN apt-get install -y vim
# 安装ssh
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
# 修改root密码,便于远程登录
RUN echo root:Software2020 | chpasswd
# 配置ssh可以使用root登陆
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD run.sh /run.sh
RUN chmod 755 /run.sh

# 开放22端口
EXPOSE 22
#设置自启动命令
CMD ["/run.sh"]

5,编译Ubuntu16.04的docker镜像

$ ls
dockerfile  run.sh  sources.list
$ sudo docker build -t base_env:16.04 .
$ sudo docker images 
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
base_env      16.04     c3c97c924bbc   52 seconds ago   279MB
hello-world   latest    feb5d9fea6a5   5 months ago     13.3kB
ubuntu        16.04     b6f507652425   5 months ago     135MB

运气不错,一切OK,base_env成功创建。

6,启动Ubuntu 16.04的docker镜像

$ sudo docker run -d -v /home/lenky/vUDK2018-build:/home/vUDK2018-build:rw -p 12306:22 --name=vUDK2018-build base_env:16.04
6fe9be375d644169150cd7460cb87a93bc1695b7c1fd8c9d263c03c3f56781d1
$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND     CREATED          STATUS          PORTS                                     NAMES
6fe9be375d64   base_env:16.04   "/run.sh"   21 seconds ago   Up 21 seconds   0.0.0.0:12306->22/tcp, :::12306->22/tcp   vUDK2018-build

说明:
-d:表示在后台运行
-v:挂载宿主机硬盘,表示将宿主机的/home/lenky/vUDK2018-build挂载到容器的/home/vUDK2018-build目录,主要为了数据持久化。
-p:端口映射,将宿主机的12306端口映射进容器的22端口,这样访问宿主机的12306端口等于访问容器的22端口。
–name=vUDK2018-build:指定容器的名称

7,停止,重启,删除等操作
停止:

$ sudo docker stop vUDK2018-build
vUDK2018-build
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

重启:

$ sudo docker start vUDK2018-build
vUDK2018-build
$ sudo docker restart vUDK2018-build
vUDK2018-build
$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND     CREATED          STATUS         PORTS                                     NAMES
6fe9be375d64   base_env:16.04   "/run.sh"   25 minutes ago   Up 3 seconds   0.0.0.0:12306->22/tcp, :::12306->22/tcp   vUDK2018-build

删除:

$ sudo docker rm vUDK2018-build
vUDK2018-build
$ sudo docker start vUDK2018-build
Error response from daemon: No such container: vUDK2018-build
Error: failed to start containers: vUDK2018-build

删除后,名为vUDK2018-build的container就没有了,再使用需要重新执行如下类似命令:
$ sudo docker run -d -v /home/lenky/vUDK2018-build:/home/vUDK2018-build:rw -p 12306:22 –name=vUDK2018-build base_env:16.04

六,使用docker进行vUDK2018编译
1,在宿主机上用ssh连接容器的sshd

$ ssh root@127.0.0.1 -p 12306
root@127.0.0.1's password: 
Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 5.10.0-1057-oem x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Wed Feb 23 04:01:12 2022 from 128.128.0.1
root@44de964494ed:~# 

2,在宿主机里,把edk2-vUDK2018.tar.gz和openssl-openssl_1_1_0g.zip拷贝到/home/lenky/vUDK2018-build,然后在docker容器的/home/vUDK2018-build目录就能看到这两个源码包了。

# pwd
/home/vUDK2018-build
# ls
edk2-vUDK2018.tar.gz  openssl-openssl_1_1_0g.zip

【备注】以下操作都在docker容器里进行。
3,安装编译工具
# apt-get install build-essential uuid-dev iasl git gcc-4.8 nasm make python2.7 unzip
说明:Gcc需要安装4.8,Python需要安装2.x,高版本会导致后续编译出错。
# update-alternatives –list python
# ls /usr/bin/python*
# update-alternatives –install /usr/bin/python python /usr/bin/python2.7 1
# python –version
Python 2.7.12
说明:确保默认Python为2.x版本。

4,解压&准备源码
# tar xf edk2-vUDK2018.tar.gz
# unzip openssl-openssl_1_1_0g.zip
# ls openssl-OpenSSL_1_1_0g/
# ls edk2-vUDK2018/CryptoPkg/Library/OpensslLib/openssl/
# mv openssl-OpenSSL_1_1_0g/* edk2-vUDK2018/CryptoPkg/Library/OpensslLib/openssl/

5,编译BaseTools
# cd edk2-vUDK2018/BaseTools/
# make clean
# make -C ./

6,编译开放虚拟机固件OVMF(X64架构)
# cd ..
# source edksetup.sh BaseTools
# build -a X64 -t GCC48 -p OvmfPkg/OvmfPkgX64.dsc

7,在宿主机里,使用qemu运行固件
$ pwd
/home/lenky/vUDK2018-build/edk2-vUDK2018
$ qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd -M pc -m 256 -cpu qemu64 -vga cirrus -name UEFI -boot order=dc
等好一会,就会进入到一个Shell界面,输入exit即可进入到uefi配置界面。
可以Ctrl+Alt组合键来退出Qemu界面,但我没试成功,只能按Ctrl+Alt+F2进入控制台文本界面,kill掉qemu进程,再按Ctrl+Alt+F7回到图形界面。

参考:

https://blog.csdn.net/shangyexin/article/details/103910923

https://ay123.net/share/668/

https://blog.csdn.net/qq_28643619/article/details/105097059

https://blog.csdn.net/qq_44929785/article/details/109446225

https://ay123.net/mystudy/uefi/955/

https://www.cnblogs.com/ruiyang-/p/10162581.html



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复