A tiny embedded Linux system running on the qemu arm emulator, with a DirectFB interface, everything in 2.1 MB (including the kernel)!
Overview
This demo embedded Linux system has the following features:
- Very easy to run demo, just 1 file to download and 1 command line to type!
- Runs on qemu (easy to get for most GNU/Linux distributions), emulating an ARM Versatile PB board.
- Available through a single file (kernel and root filesystem), sizing only 2.1 MB!
- DirectFB graphical user interface.
- Demonstrates the capabilities of qemu, the Linux kernel, BusyBox, DirectFB, and
shows the benefits of system size and boot time reduction techniques as advertised and supported by the CE Linux Forum. - License: GNU GPL for root filesystem scripts. Each software component has its own license.
How to run the demo
- Make sure the qemu emulator is installed on your GNU/Linux distribution. The demo works with qemu 0.8.2 and beyond, but it may also work with earlier versions.
- Download the vmlinuz-qemu-arm-2.6.20
binary. - Run the below command:
qemu-system-arm -M versatilepb -m 16 -kernel vmlinuz-qemu-arm-2.6.20 -append "clocksource=pit quiet rw"
- When you reach the console prompt, you can try regular Unix commands but also the graphical demo:
run_demo
FAQ / Troubleshooting
- Q: I get
Could not initialize SDL - exiting
when I try to run qemu.
That’s a qemu issue (qemu used the SDL library). Check that you can start graphical applications from your terminal (tryxeyes
orxterm
for example). You may also need to check that you have name servers listed in/etc/resolv.conf
. Anyway, you will find solutions for this issue on the Internet.
Screenshots
How to rebuild this demo
All the files needed to rebuild this demo are available here:
- You can rebuild or upgrade the (Vanilla) kernel by using the given kernel configuration file.
- The configuration file expects to find an initramfs source directory in
../rootfs
, which
you can create by extracting the contents of the rootfs.tar.7z archive. - Of course, you can make changes to this root filesystem!
Tools and optimization techniques used in this demo
Software and development tools
- The demo was built using Scratchbox, a fantastic development tool that makes cross-compiling transparent!
- The demo includes BusyBox 1.4.1, an toolbox implementing most UNIX commands in a few hundreds of KB. In our case, BusyBox includes the most common commands (like a vi implementation), and only sizes 192 KB!
- The root filesystem is shipped within the Linux kernel image, using the initramfs technique, which makes the kernel simpler and saves a dramatic amount of RAM (compared to an init ramdisk).
- The demo is interfaced by DirectFB example programs (version 0.9.25, with DirectFB 1.0.0-rc4), which demonstrate the amazing capabilities of this library, created to meet the needs of embedded systems.
Size optimization techniques
The below optimization techniques were used to reduce the filesystem size from 74 MB to 3.3 MB (before compression in the Linux kernel image):
- Removing development files: C headers and manual pages copied when installing tools and libraries,
.a
library files,gdbserver
,strace
,/usr/lib/libfakeroot
,/usr/local/lib/pkgconfig
… - Files not used by the demo programs:
libstdc++
, and any library or resource file. - Stripping and even super stripping (see sstrip) executables and libraries.
- Reducing the kernel size using
CONFIG_EMBEDDED
switches, mainly from the
Linux Tiny project.
Techniques to reduce boot time
We used the below techniques to reduce boot time:
- Disabled console output (
quiet
boot option,printk
support was disabled anyway), which saves time scrolling the framebuffer console. - Use the Preset Loops per Jiffy technique to disable delay loop calculation, by feeding the kernel with a value measured in an earlier boot (
lpj
setting, which you may update according to the speed of your own workstation).
All these optimization techniques and other ones we haven’t tried yet are described either on the elinux.org Wiki or in our embedded Linux optimizations presentation.
Future work
We plan to implement a generic tool which would apply some of these techniques in an automatic way, to shrink an existing GNU/Linux or embedded Linux root filesystem without any loss in functionality. More in the next weeks or months!
I am getting the following error message while attempting to run the following command, on Ubuntu 16.04LTS. Any idea?
$ qemu-system-arm -M versatilepb -m 16 -kernel vmlinuz-qemu-arm-2.6.20 -append “clocksource=pit quiet rw”
Invalid MIT-MAGIC-COOKIE-1 keyxcb_connection_has_error() returned true
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
Invalid MIT-MAGIC-COOKIE-1 keyCould not initialize SDL(No available video device) – exiting
Hi,
I’ve just tested on Ubuntu 17.04 and everything was fine.
You may be missing some sdl packages. Here are the ones I have:
libsdl1.2debian
libsdl2-2.0-0
libsdl-image1.2
Hoping this helps…
Michael.