qemu启动openEuler Embedded镜像

目录

1. 获取镜像

2. 镜像内容

3. 运行镜像

3.1 极简运行场景

3.2 使能网络场景(常用)

4. 基于openEuler embedded的用户态应用开发


本文档主要用于介绍如何获取openEuler社区预先构建好的镜像,如何使用qemu运行镜像,以及如何基于镜像完成基本的嵌入式Linux应用开发。

1. 获取镜像

当前发布的已构建好的镜像,只支持arm和aarch64两种架构,且只支持qemu中ARM virt-4.0平台,您可以通过如下链接获得相应的镜像:

  • qemu_arm: 32位arm架构, ARM Cortex A15处理器
  • qemu_aarch64: 64位aarch64架构 ARM Cortex A57处理器

只要相应环境支持qemu仿真器(版本5.0以上,可参照我上一篇文章进行安装),可以将提供的openEuler Embedded镜像部署在物理裸机、云环境、容器或虚拟机上。

2. 镜像内容

所下载的镜像,由以下几部分组成:

  • 内核镜像zImage: 基于openEuler社区Linux 5.10代码构建得到。相应的内核配置可通过如下链接获取:

    • arm(cortex a15)
    • arm(cortex a57), 针对aarch64架构,额外增加了镜像自解压功能,可以参见相应的patch
  • 根文件系统镜像(依据具体需求,以下二选一)

    • initrd_tiny:极简根文件系统镜像,只包含基本功能。包含 busybox 和基本的 glibc 库。该镜像功能简单,但内存消耗很小,适合探索 Linux内核相关功能。
    • initrd:标准根文件系统镜像,在极简根文件系统镜像的基础上,进行了必要安全加固,增加了audit、cracklib、OpenSSH、Linux PAM、shadow、iSula容器等软件包。该镜像适合进行更加丰富的功能探索。

3. 运行镜像

通过运行镜像,一方面可以体验openEuler Embedded的功能,一方面也可以完成基本的嵌入式Linux开发。

注意事项

  • 建议使用QEMU5.0以上版本运行镜像,由于一些额外功能(网络、共享文件系统)需要依赖QEMU的virtio-net, virtio-fs等特性,如未在QEMU中使能,则运行时可能会产生错误,此时可能需要从源码重新编译QEMU。

  • 运行镜像时,建议把内核镜像和根文件系统镜像放在同一目录下,后续说明以标准根文件系统为例(initrd)。

3.1 极简运行场景

该场景下,qemu未使能网络和共享文件系统,适合快速的功能体验。

针对arm(ARM Cortex A15),运行如下命令:

qemu-system-arm -M virt-4.0 -cpu cortex-a15 -nographic -kernel zImage -initrd initrd

针对aarch64(ARM Cortex A57),运行如下命令:

qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd

由于标准根文件系统镜像进行了安全加固,因此第一次启动时,需要为登录用户名root设置密码,且密码强度有相应要求, 需要数字、字母、特殊字符组合最少8位,例如openEuler@2021。当使用极简根文件系统镜像时,系统会自动登录, 无需输入用户名和密码。

qemu运行成功并登录后,将会呈现openEuler Embedded的Shell。

qemu启动openEuler Embedded镜像_第1张图片

 退出的话,同时按ctrl + a 然后再按下x,不是三个键同时按哦

3.2 使能网络场景(常用)

通过qemu的virtio-net和宿主机上的虚拟网卡,可以实现宿主机和openEuler embedded之间的网络通信。

1. 宿主上建立虚拟网卡

在宿主机上需要建立名为tap0的虚拟网卡,可以借助/etc/qemu-ifup脚本实现,其执行需要root权限,具体内容如下:

#!/bin/bash
ifconfig $1 192.168.10.1 up

通过qemu-ifup脚本,宿主机上将创建名为tap0的虚拟网卡,地址为192.168.10.1。

创建此文件的时候,主要要有可执行的权限:

chmod 775 /etc/qemu-ifup

或者

chmod +x /etc/qemu-ifup

2. 启动qemu

针对arm(ARM Cortex A15),运行如下命令:

qemu-system-arm -M virt-4.0 -cpu cortex-a15 -nographic -kernel zImage -initrd initrd -device virtio-net-device,netdev=tap0 -netdev tap,id=tap0,script=/etc/qemu-ifup

针对aarch64(ARM Cortex A57),运行如下命令:

qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd -device virtio-net-device,netdev=tap0 -netdev tap,id=tap0,script=/etc/qemu-ifup

3. 配置openEuler embedded网卡

openEuler Embedded登陆后,执行如下命令:

ifconfig eth0 192.168.10.2

在openEuler Embedded中,执行如下命令:

ping 192.168.10.1

如能ping通,则宿主机和openEuler Embedded之间的网络是连通的。

qemu启动openEuler Embedded镜像_第2张图片

在宿主机上使用ssh连接qemu

刚起来的qemu默认关闭了ssh的root登录,所以我们需要编辑sshd的配置文件做出修改

vi /etc/ssh/sshd_config

 将 PermitRootLogin 后面的no修改成yes,再保存

qemu启动openEuler Embedded镜像_第3张图片 重启ssh服务

/etc/init.d/sshd restart

 在宿主机上进行ssh连接qemu,如下成功连接

qemu启动openEuler Embedded镜像_第4张图片

4. 基于openEuler embedded的用户态应用开发

当前发布的镜像除了体验openEuler Embedded的基本功能外,还可以进行基本的用户态应用开发,也即在openEuler embedded上运行用户自己的程序。

4.1 环境准备

由于当前镜像采用了linaro arm/aarch64 gcc 7.3.1工具链构建,因此建议应用开发也使用相同的工具链接进行,可以从如下链接中获取相应工具链:

  • linaro arm
  • linrao arm sysroot
  • linaro aarch64
  • linrao aarch64 sysroot

下载并解压到指定的目录中,例如/opt/openEuler_toolchain

mkdir /opt/openEuler_toolchain

wget https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu.tar.xz

wget https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

tar -xf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

tar -xf sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu.tar.xz

4.2 创建并编译用户态程序

以构建一个hello openEuler程序为例,运行在aarch64的标准根文件系统镜像中。

在宿主机中,创建一个hello.c文件,源码如下:

#include 

int main(void)
{
    printf("hello openEuler\r\n");
}

然后在宿主机上使用对应的工具链编译, 相应命令如下,路径要根据你们具体解压的路径来:

export PATH=$PATH:/opt/openEuler_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin
aarch64-linux-gnu-gcc --sysroot=/opt/openEuler_toolchain/sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu hello.c -o hello

将编译好的hello 使用scp命令上传到qemu中 

scp hello [email protected]:/tmp

4.3 运行用户态程序 

在openEuler embedded中运行hello程序。

cd /tmp/
./hello

如运行成功,openEuler Embedded的shell中就会输出hello openEuler。

官方提交的镜像有问题,一开始scp到tmp目录,赋予了权限,却不能执行,创建/opt,把文件移动到此,却又可以执行。我不理解。qemu启动openEuler Embedded镜像_第5张图片

 2022.3.20更新:

放在/tmp目录下执行没权限是印象/tmp目录本身没有执行权限。

解决方案:

1.解压initrd文件

mkdir tmp && cd tmp/ && cp ../initrd .
mv initrd initrd.cpio.gz
gunzip initrd.cpio.gz
cpio -idmv < initrd.cpio
rm -rf initrd.cpio

 解压后的目录

qemu启动openEuler Embedded镜像_第6张图片

编辑文件,把 ,noexec 0 0 删除

vi ./etc/fstab

qemu启动openEuler Embedded镜像_第7张图片 

 重新打包成镜像

find . | cpio -o -c > ../initrd.cpio
gzip ../initrd.cpio

重新部署验证OK

 参考:docs/zh/docs/Embedded/embedded.md · openEuler/docs - Gitee.com

你可能感兴趣的:(openEuler,qemu,openEuler,aarch64)