Cookbook:Example:Adding packages to your OS image

From Yocto Project
Revision as of 22:38, 19 May 2016 by David Kinder (talk | contribs)
Jump to navigationJump to search

[WORK IN PROGRESS]

Adding packages to your OS image is one of the most common things you need to do; you have an OS image and you want to add some functionality. We'll assume you've gone through the Quick Start and have built core-image-sato for qeumux86. In this example, we start by making a quick change to the configuration to instead make a headless build with core-image-minimal. (This is probably a better place to start as we have a much simpler image.)

First edit local.conf and remove the the following line as it prevents debugging the build:

INHERIT += "rm_work"

Then build the image:

$ bitbake core-image-minimal

Now let's start running the resulting headless image (note we're using the nographic option):

$ runqemu qemux86 nographic

When it gets to the login prompt, use user 'root' with no password. Let's try and connect over ssh. First we need to get the IP address with ifconfig.

root@qemux86:~# ifconfig
eth0     Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
         inet addr:192.168.7.2  Bcast:192.168.7.255  Mask:255.255.255.0

Now try and connect to our VM from a different machine on the same sub net

$ ssh root@192.168.7.2
ssh: connect to host 192.168.7.2 port 22: Connection refused

Hmmm, a Connection Refused error. Let's check if we have an ssh server running

root@qemux86:~# ps | grep sshd | grep -v grep
root@qemux86:~#

Nope. So let's add one. First we need to exit the qemu session. Hit CTRL+A then C. You should see the on the console:

QEMU 2.5.0 monitor - type 'help' for more information
(qemu) 

Type quit and you're out.

Now we need to find the Yocto Project recipe that includes sshd. The way to find recipes is to go to the https://layers.openembedded.org web site. Select the krogoth branch and click on the Recipes button at the top:

Cookbook-Layers-openembedded-ssh.png

The entry openssh looks like the right thing (summary needs to be fixed!). So let'd add it to the image by adding this line to conf/local.conf:

CORE_IMAGE_EXTRA_INSTALL += "openssh"

Now rebuild image

$ bitbake core-image-minimal

How do we quickly check that sshd has been installed? First let's find where the openssh package was built. Since it was to run on the target, work files can be found in build/tmp/work/$TARGET_SYS. First we need to find the value of TARGET_SYS. Each time you run bitbake, this value is displayed. Build Configuration:

BB_VERSION        = "1.31.0"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "universal"
TARGET_SYS        = "i586-poky-linux"
MACHINE           = "qemux86"
DISTRO            = "poky"
DISTRO_VERSION    = "2.1+snapshot-20160509"
TUNE_FEATURES     = "m32 i586"
TARGET_FPU        = ""
meta              
meta-poky         
meta-yocto-bsp    = "master:3cb5dead2808482baf3ffae5ed961c72f2ea275f"

See we can see TARGET_SYS = "i586-poky-linux". A more general way of doing this is displaying the bitbake environment and searching for a variable using grep:

$ bitbake -e | grep ^TARGET_SYS
TARGET_SYS="i586-poky-linux"

Now we look into the folder build/tmp/work/i586-poky-linux/openssh. Here we find folders for each package version that is built. Typically there is just one.

$ ls tmp/work/i586-poky-linux/openssh
7.1p2-r0

All the files installed on the target will be tmp/work/i586-poky-linux/openssh/7.1p2-r0/package. Let's look for sshd

$ find tmp/work/i586-poky-linux/openssqemux86-poky-linuxh/7.1p2-r0/package -name sshd
tmp/work/i586-poky-linux/openssh/7.1p2-r0/package/etc/init.d/sshd
tmp/work/i586-poky-linux/openssh/7.1p2-r0/package/usr/sbin/.debug/sshd
tmp/work/i586-poky-linux/openssh/7.1p2-r0/package/usr/sbin/sshd

We found it! And it'll be installed into /usr/sbin/sshd. Let's see if it has appeared in rootfs (found in build/tmp/work/$MACHINE-poky-linux/image-name/1.0-r0/rootfs. For us, the translates to:

$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/
bin  boot  dev  etc  home  lib  media  mnt  proc  run  sbin  sys  tmp  usr  var

Let look for sshd

$ ls tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/sbin/sshd
tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/rootfs/usr/sbin/sshd

Found it! Now we know it'll be in the image, so let's start running the image we just built:

runqemu qemux86 nographic

And we see this in the boot message which looks promising:

Starting OpenBSD Secure Shell server: sshd

Now let's see if its running

root@qemux86:~# ps | grep sshd | grep -v grep
 389 root      5352 S    /usr/sbin/sshd

Yup! Let's try to connect from another machine

$ ssh root@192.168.7.2
The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.
ECDSA key fingerprint is SHA256:RbNcfuY+gHOZ8vdF5+M/CqVNVpELIY6KayT0ilDYsfs.
ECDSA key fingerprint is MD5:42:0d:84:b3:5b:d8:42:38:ea:38:fd:97:f8:a3:4c:c4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.2' (ECDSA) to the list of known hosts.
root@qemux86:~# 

We're in!

In this example, we showed how find a Yocto Project recipe that includes a package we're interested in (openssh), and how to add the openssh package to the image by editing conf/local.conf and doing another bitbake build. We also tested our new image using the qemu emulator to verify that ssh capability was now present.

Back to the Cookbook home page.