simplest recipe for running yocto qemu images?


Robert P. J. Day
 

i want to do a short writeup on the *simplest* recipe for how to run
the pre-built yocto qemu image you can get here:

http://downloads.yoctoproject.org/releases/yocto/yocto-1.1/machines/qemu/

and what should have been a simple procedure got a bit messy. to be
clear, i want to document the absolute *least* you need to do to run a
yocto-built qemu image without having to build anything since,
technically, you shouldn't have to. i'm aware of the writeup in the
quick start guide, but that seems like overkill based on what i'm
trying to do. so here's what i just went through.

first, starting with a fresh terminal window totally unconfigured
for yocto, download a matching kernel image and rootfs; in my case,
just for fun, i downloaded for arm:

* zImage-qemuarm.bin
* core-image-minimal-qemuarm.ext3

now that i have that, the obvious next step is to use the convenient
"runqemu" wrapper in my yocto directory, so i'll extend my search
path:

$ PATH=~/yocto/git/scripts:$PATH

and i'll turn on shell debugging in that "runqemu" script and test it
out:

$ runqemu qemuarm \
zImage-2.6.37-qemuarm-1.0.bin \
core-image-minimal-qemuarm.ext3
... snip ...
/home/rpjday/yocto/git/scripts/bitbake: line 106: -e: command not found
+ TMPDIR=
+ '[' -z '' ']'
+ echo 'Error: this script needs to be run from your build directory,'
Error: this script needs to be run from your build directory,
+ echo 'or you need to explicitly set TMPDIR in your environment'
or you need to explicitly set TMPDIR in your environment
+ exit 1
$

ok, not sure why simply running a qemu image requires invoking
bitbake, but the error message looks pretty straightforward, so i'll
fix that and try again:

$ TMPDIR=/tmp runqemu qemuarm \
zImage-2.6.37-qemuarm-1.0.bin \
core-image-minimal-qemuarm.ext3
... snip ...

/home/rpjday/yocto/git/scripts/bitbake: line 106: -e: command not found
+ TMPDIR=
+ '[' -z '' ']'
+ echo 'Error: this script needs to be run from your build directory,'
Error: this script needs to be run from your build directory,
+ echo 'or you need to explicitly set TMPDIR in your environment'
or you need to explicitly set TMPDIR in your environment
+ exit 1
$

well, that appeared to solve nothing despite the fact that i did
*exactly* what the earlier diagnostic suggested. oh, wait, there's
this earlier in "runqemu":

# Don't use TMPDIR from the external environment, it may be a distro
# variable pointing to /tmp (e.g. within X on OpenSUSE)
# Instead, use OE_TMPDIR for passing this in externally.
TMPDIR="$OE_TMPDIR"

grrrrrrrr. ok, let's set OE_TMPDIR instead, whereupon we make
considerably more progress until:

... snip ...
++ tap='Error: Unable to find tunctl binary in
'\''/tmp/sysroots/x86_64-linux/usr/bin'\'''
++ '[' 1 -ne 0 ']'
++ sudo /home/rpjday/yocto/git/scripts/runqemu-ifup 1000
/tmp/sysroots/x86_64-linux
Error: Unable to find tunctl binary in
'/tmp/sysroots/x86_64-linux/usr/bin'
++ return
$

which is actually fine since, obviously, i need to have an
appropriate sysroot directory in my PATH to pick up commands liek
"tunctl" and so on. no problem -- i've installed the appropriate
ARM toolchain under /opt/poky so:

$ PATH=/opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin:$PATH
$ type tunctl
tunctl is /opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin/tunctl
$

all right, away we go again:

$ OE_TMPDIR=/tmp runqemu \
qemuarm zImage-2.6.37-qemuarm-1.0.bin \
core-image-minimal-qemuarm.ext3
... snip ...
/home/rpjday/yocto/git/scripts/bitbake: line 106: -e: command not found
Error: this script needs to be run from your build directory,
or you need to explicitly set TMPDIR in your environment
$

wait, i thought i took care of that. oh ...

$ type runqemu
runqemu is hashed (/opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin/runqemu)
$

so now i'm picking up "runqemu" from the toolchain's sysroot
directory, which does *not* have the OE_TMPDIR reference, only the
earlier TMPDIR one. so let's completely remove my yocto install
scripts directory from my search path, and use *only* the sysroots
directory:

$ PATH=/opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin:$PATH
$ TMPDIR=/tmp runqemu qemuarm \
zImage-2.6.37-qemuarm-1.0.bin \
core-image-minimal-qemuarm.ext3
... snip ...
Setting up tap interface under sudo
+++ sudo
/opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin/runqemu-ifup 1000
/tmp/sysroots/x86_64-linux
++ tap='Error: Unable to find tunctl binary in
'\''/tmp/sysroots/x86_64-linux/usr/bin'\'''
++ '[' 1 -ne 0 ']'
++ sudo
/opt/poky/1.1/sysroots/x86_64-pokysdk-linux/usr/bin/runqemu-ifup 1000
/tmp/sysroots/x86_64-linux
Error: Unable to find tunctl binary in '/tmp/sysroots/x86_64-linux/usr/bin'
++ return
$

ok, it *has* to be easier than this. quite simply, if one wants to
do nothing more than *run* one of those qemu images, there should be
no need to do any building or bitbaking, should there? am i missing
something hideously obvious?

rday

--

========================================================================
Robert P. J. Day Ottawa, Ontario, CANADA
http://crashcourse.ca

Twitter: http://twitter.com/rpjday
LinkedIn: http://ca.linkedin.com/in/rpjday
========================================================================

Join yocto@lists.yoctoproject.org to automatically receive all group messages.