In the first installment of this series, we established a base line image and had a look at the initial boot performance. This time, we will establish a baseline for the image size. In an embedded system, these two factors often go hand in hand, as reading data from FLASH often consumes a considerable amount of time during boot.
It is fairly easy to see how large the resulting root file system and kernel are, but we need more detail. To enable some statistics for the sizes of the various packages built, we first need to enable build history and rebuild our baseline image. Build history is enabled by adding the following lines to the local.conf file.
INHERIT += "buildhistory"
BUILDHISTORY_COMMIT = "1"
This produces a set of files with statistics in buildhistory/images/qemux86/eglibc/core-image-minimal. The files-in-image.txt file, a detailed list of all the files of the system, along with their sizes, is listed. In the installed-package-sizes.txt, we get a list of responsible packages. The list for a baseline image can be seen below.
8641 KiB systemd
4487 KiB udev-hwdb
3042 KiB libc6
1290 KiB libx11-6
1221 KiB e2fsprogs-e2fsck
1153 KiB shadow
798 KiB dbus-1
547 KiB kmod
532 KiB busybox
398 KiB udev
350 KiB libkmod2
299 KiB libdbus-1-3
297 KiB libext2fs2
261 KiB libmount1
249 KiB udev-utils
241 KiB libblkid1
233 KiB systemd-analyze
161 KiB liblzma5
159 KiB libexpat1
133 KiB libxcb1
110 KiB v86d
94 KiB util-linux-fsck
86 KiB libz1
83 KiB libgcc1
36 KiB systemd-binfmt
32 KiB kernel-module-uvesafb
31 KiB util-linux-mount
31 KiB libwrap0
30 KiB libacl1
29 KiB util-linux-agetty
27 KiB libe2p2
23 KiB netbase
20 KiB kernel-3.14.0-yocto-standard
19 KiB libxdmcp6
16 KiB libattr1
15 KiB libcap2
14 KiB libuuid1
11 KiB kernel-module-binfmt-misc
10 KiB libcom-err2
9 KiB libxau6
5 KiB update-rc.d
4 KiB update-alternatives-opkg
4 KiB base-files
3 KiB busybox-udhcpc
2 KiB shadow-securetty
2 KiB run-postinsts
1 KiB systemd-serialgetty
1 KiB busybox-syslog
0 KiB systemd-compat-units
0 KiB packagegroup-core-boot
0 KiB base-passwd
In addition to this, the bz kernel image is 6.2MiB.
My approach to this system will be that of a gadget maker, so when trying to optimize the size of the system, I will try to use as much as possible of what I know of the target hardware to minimize the size. This ought to make it possible to reduce the kernel, the udev-hwdb and more. In addition to this, Lennart says that systemd is tweakable when it comes to size. I’m looking forward to trying this.
That is all for this installment. Next time we will have a look at setting up our own meta layer to start playing with, then we will try to create a truly minimalist and fast booting image.
Hmm, yeah, I also went through this last year. I think we managed to reduce the systemd size significantly by just keeping the really necessary parts of it.
Did you end up anything that you can share?
Great series of articles so far. I think it’s fair to say that we haven’t looked at the size of core-image-minimal for a while, particularly with systemd enabled. One optimisation would be to break the dependency between dbus and libx11; we’ve gone back and forth on that one. (Although you could just remove x11 from DISTRO_FEATURES if you’re never going to want X in your images, then it won’t even be built). With buildhistory enabled you can look at depends*.dot to see how various packages are brought into the image; you can also explore dependencies using the Toaster web UI.
Getting X11 off the image, as well as the hwdb stuff from udev (or all of udev) is on my agenda. Systemd is kind of large as well.
Johan,
yes, I followed these among other things:
* http://freedesktop.org/wiki/Software/systemd/MinimalBuilds/
* http://people.debian.org/~stapelberg/docs/systemd-dependencies.html
But I think I was posting some related issues on the Yocto bugtracker, too, about unnecessary parts enforced by core-image-minimal that significantly increase the image size.
So, no bblayer I can have a peek at? (thanks for the links)