yocto-第36篇-编译arm虚拟机qemuarm

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

今天玩一下 qemuarm ,因为之前用的 x86 架构,很多盆友包括我自己有时候都很难区分这里出现的x86字眼是编译机 ubuntu 系统用到的还是目标 target 系统用到的,尤其是目前移动市场 arm 一统天下的情况下,很多小伙伴手上的板子都是 arm 架构的,使用到的交叉编译器也都是以 arm-linux- 开头的。各方面考虑还是需要玩下 qemuarm ~

修改local.conf模板

  • 该步骤可不要。

其实这里修不修改也无所谓,到时候到 local.conf 目录下直接修改也可以。

poky-arm]$ vim meta-poky/conf/local.conf.sample
#改这个
MACHINE ?= "qemuarm64"
  • 1
  • 2
  • 3

暂时选 arm64 吧,说不上为啥,可能比较新的架构内容更附后今后的发展方向。

创建新的build目录

正常第一次下载的 poky 目录下面是没有 build 目录的,是需要 source 环境自动创建。如果在 poky 目录下面已经有了一个 build 目录,
可以在 source 的时候加上新的 build 目录作为参数。本着保留前面 qemux86-64 项目的出发点,创建一个干净的build目录用于 qemuarm 项目。参考如下:

poky]$ source oe-init-build-env build-arm
  • 1

在执行bitbake之前修改下downloads目录,指向之前poky/build/downloads目录,因为这里面arm和x86架构使用open-Embedded构建的文件系统中使用的第三方软件项目都是支持的,因此下载的第三方开源项目软件包都是相同的,没有必要重复下载,这个下载过程需要花费很长的时间。

build-arm]$ vim conf/local.conf
#添加或者修改:
DL_DIR ?= "${HOME}/poky/build/downloads"
  • 1
  • 2
  • 3

重新source一遍:

build-arm]$ cd ..
poky]$ source oe-init-build-env build-arm
  • 1
  • 2

但是这样一来每次都要加上build-arm参数,也是一件很恼火的事情,搞不好就忘了~

其实不同目标都可以放在 build 目录中不做任何修改,也是可以的。

当然也可以只修改下 TMPDIR 变量,指定一个新的临时目录也可以。例如:

poky]$ vim build/conf/local.conf
TMPDIR = "${TOPDIR}/tmp-arm"
  • 1
  • 2

修改下载路径

如果yocto的版本接近的话,而且之前有构建过某个目标,在 /opt/downloads/ 目录中已经存放了很多三方开源项目,为避免新项目重复下载,可以修改下这个路径配置:

poky]$ vim build/conf/local.conf
DL_DIR ?= "/opt/downloads"
  • 1
  • 2

开始编译

这里我们的镜像recipe可以选择core-image-sato,也可以选择core-image-minimal,但是core-image-minimal带有minimal(极小的)关键词,可以知道这个是一个迷你文件系统的镜像,对应我们学习而言应该更加适合一些,起码可以缩短编译时间。因此我们这里选择core-image-minimal镜像:

build]$ bitbake core-image-minimal
  • 1

开始编译,等着吧。。。

编译完成后运行

展示结果:
在这里插入图片描述

看work目录

poky/build/tmp/work目录下有如下一些目录:

build]$ ls tmp/work/
aarch64-poky-linux  all-poky-linux  qemuarm64-poky-linux  x86_64-linux
  • 1
  • 2

每个目录解释

  1. all-poky-linux: 这用于与体系结构无关的包 (举个例子:时区设置相关的。没有执行程序,都是配置文件、脚本和文档什么的,一般放在usr/share目录下的)
  2. aarch64-poky-linux: 这个用于arm arch64体系架构有关的软件包(只能在这个这个架构上运行的程序)
  3. qemuarm64-poky-linux : 这用于特定于机器的软件包;在本例中,是qemuarm64(内核、驱动、u-boot、文件系统等)
  4. x86_64-linux: 这用于构成(编译)主机sysroot的包(比如gcc交叉编译器就在这里)

参看如下:

build]$ ls tmp/work/aarch64-poky-linux/
acl              diffutils              gnu-config            libnsl2             mdadm                 shared-mime-info
attr             e2fsprogs              grep                  libpcre             modutils-initscripts  socat
autoconf         elfutils               initscripts           libpthread-stubs    mpfr                  sqlite3
automake         eudev                  iproute2              libsm               ncurses               sysvinit
base-passwd      expat                  iptables              libtirpc            netbase               tcp-wrappers
bash             findutils              kmod                  libtool             openssl               unzip
bash-completion  flex                   libcap                libtool-cross       opkg-utils            util-linux
bc               gawk                   libcap-ng             libx11              perl                  util-macros
binutils         gcc                    libcroco              libxau              pkgconfig             which
bison            gcc-runtime            liberror-perl         libxcb              procps                xcb-proto
btrfs-tools      gdbm                   libffi                libxcrypt           ptest-runner          xorgproto
busybox          gettext                libgcc                libxdmcp            python3               xtrans
bzip2            glib-2.0               libgcc-initial        libxml2             qemuwrapper-cross     xz
coreutils        glibc                  libice                linux-libc-headers  readline              zip
db               glibc-locale           libmnl                lzo                 sed                   zlib
dbus             gmp                    libmodule-build-perl  m4                  shadow
dbus-test        gnome-desktop-testing  libmpc                make                shadow-sysroot
build]$ ls tmp/work/all-poky-linux/
autoconf-archive  ca-certificates  packagegroup-core-buildessential  run-postinsts  tzdata  update-rc.d
build]$ ls tmp/work/qemuarm64-poky-linux/
base-files          depmodwrapper-cross  linux-yocto             shadow-securetty
core-image-minimal  init-ifupdown        packagegroup-core-boot  sysvinit-inittab
build]$ ls tmp/work/x86_64-linux/
acl-native               glib-2.0-native               libx11-native      pseudo-native
alsa-lib-native          gmp-native                    libxau-native      python3-iniparse-native
attr-native              gnu-config-native             libxcb-native      python3-native
autoconf-archive-native  gobject-introspection-native  libxdmcp-native    python3-setuptools-native
autoconf-native          gperf-native                  libxext-native     python3-six-native
automake-native          gpgme-native                  libxml2-native     qemu-helper-native
bc-native                gtk-doc-native                libxrandr-native   qemu-native
binutils-cross-aarch64   itstool-native                libxrender-native  qemu-system-native
binutils-native          json-c-native                 libxslt-native     quilt-native
bison-native             kern-tools-native             libyaml-native     re2c-native
bzip2-native             kmod-native                   lzo-native         readline-native
cmake-native             ldconfig-native               lzop-native        rpm-native
createrepo-c-native      libarchive-native             m4-native          rsync-native
cross-localedef-native   libassuan-native              makedevs-native    shadow-native
curl-native              libcap-ng-native              make-native        shared-mime-info-native
cwautomacros-native      libcheck-native               meson-native       sqlite3-native
db-native                libcomps-native               mklibs-native      swig-native
dbus-native              libdnf-native                 mpfr-native        texinfo-dummy-native
debianutils-native       libffi-native                 ncurses-native     tzcode-native
dnf-native               libgpg-error-native           ninja-native       unifdef-native
dtc-native               libmodulemd-v1-native         openssl-native     unzip-native
dwarfsrcfiles-native     libmpc-native                 opkg-native        update-rc.d-native
e2fsprogs-native         libnsl2-native                opkg-utils-native  util-linux-native
elfutils-native          libpcre2-native               patch-native       util-macros-native
expat-native             libpcre-native                pbzip2-native      xcb-proto-native
file-native              libpthread-stubs-native       perl-native        xorgproto-native
flex-native              librepo-native                pigz-native        xtrans-native
gcc-cross-aarch64        libsdl2-native                pixman-native      xz-native
gdbm-native              libsolv-native                pkgconfig-native   zlib-native
gettext-minimal-native   libtirpc-native               popt-native
gettext-native           libtool-native                prelink-native
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

遗憾的地方

这个qemuarm64和之前的qemux86-64虚拟机一样,没有dts(设备树文件),没有u-boot。