MISC-AN-001: Creating a root file system using Buildroot

From DAVE Developer's Wiki
Jump to: navigation, search
Info Box

Date Version


buildroot 2022.05
2023/10/31 Add buildroot 2023.08 version

Introduction[edit | edit source]

By default, AXEL ULite comes with a DESK-MX6UL-L Yocto distribution. Nevertheless, other distributions can be used as well. This application note shows how to run one of them, Buildroot.

Buildroot is known to be very simple to configure and build. An exhaustive discussion of Buildroot is beyond the scope of this application note. The interested reader can refer for example to this presentation which compares in detail Yocto and Buildroot.

The test bed used for this application note is composed of the same hardware/software platform delivered along with the DESK-MX6UL-L. About Buildroot, the version buildroot-2022.05 was used.

Virtual Machine requirements[edit | edit source]

The building process may requires higher resources than the original DESK-MX6UL-L MVM settings: this depends on the package selected in the .config file and theirs build resources.

For example: building the qt-webkit package will require a lot of resources so it is better to add more CPUs and more RAM to the VM like the following settings:

MVM with 10 CPU cores and 16GB of RAM

Downloading, configuring and building[edit | edit source]

This process is straightforward. Once the file buildroot-2022.05.tar.gz is downloaded and decompressed on your Linux host machine, get into the Buildroot directory, and run make menuconfig.

Buildroot make menuconfig

Then enter the Target options menu and select:

  • ARM (little endian) for Target Architecture
  • cortex-A7 for Target Architecture Variant

as shown in the following picture.

Buildroot make menuconfig

Another important configuration is the Freescale i.MX Libraries settings for i.MX6UL processor and its imx-tools (imx-codec, imx-kobs, firmware)

i.MX libraries

That's it: after saving your configuration, and exiting menuconfig, you can start the build process by simply issuing the make command.

For your sake of convenience, the created .config file can be downloaded from here (rename it as .config).

Linux kernel[edit | edit source]

The latest Linux kernel version provided in the DAVE' git repositories can be used for building the kernel image too.

The kernel tarball can be copied into the proper Buildroot directory:

Linux kernel tarball

Package list[edit | edit source]

The root file system package composition has been created for a list of packages commonly used for creating a root file system good for all seasons.

Here below a list of most important selected packages:

  • Qt5.15 libraries including: fontconfig, DBus, qt5declarative, qt5multimedia, qt5quickcontrols, qt5quickcontrols2, qt5sensors, qt5serialbus, qt5serialport, qtextserialport, Qt SQlite and the very important qt5webkit (and qt5webchannel, qt5websockets)
    • qt-webkit-kiosk browser can be used for creating a GUI with an embedded browser as a Kiosk application has been included too
  • framebuffer utilities like: fbset, fbv, fbgrab and the fb-test application
  • python3 interpreter including python3-ssl, python-flask, python-httplib2, python-jinja2, python-pip, python-py, python-pymodbus, python-pymysql, python-pyusb, python-serial, python-requests, python-schedule, python-socketio, python-setupotools
  • web server: lighthttpd
  • database: sqlite3
  • network applications: avahi, bluez, iptables, iw, ntp, openssl, openssh, vsftpd, wget
  • Javascript: angularjs, bootstrap
  • package managers: opkg, rpm

Build the targets[edit | edit source]

It is enough tun run the make command and buildroot will start building the toolchain and then cross-compiling the overall selected packages.

Once the build process has been completed, the output/images directory will contain the binary artifact:

dvdk@vagrant:~/buildroot/buildroot-2022.05$ ls -la output/images/
total 769832                                                                                                                                                  
drwxr-xr-x 2 dvdk dvdk      4096 Oct 17 09:17 .
drwxrwxr-x 6 dvdk dvdk      4096 Oct 14 22:54 ..
-rwxr-xr-x 1 dvdk dvdk     32964 Oct 16 11:07 imx6ul-axelulite-cb003a.dtb
-rw-r--r-- 1 dvdk dvdk 293242880 Oct 18 13:19 rootfs.tar
-rw-r--r-- 1 dvdk dvdk  92090639 Oct 18 13:19 rootfs.tar.bz2
-rw-r--r-- 1 dvdk dvdk   7413264 Oct 16 11:07 uImage

If the SDK is required for building the application in the building environment, it is possible to generate the SDK using:

make sdk

and this will produce:

dvdk@vagrant:~/buildroot/buildroot-2022.05$ ls -la output/images/arm-*
-rw-r--r-- 1 dvdk dvdk 395504251 Oct 17 10:26 output/images/arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz

Qt5 webkit build error[edit | edit source]

The Qt5 building has an error on producing the qt-webkit-kiosk artifacts. Following this thread you can find a patch for fixing the issue for the file package/qt5/qt5webkit/qt5webkit.mk:

 	-DPORT=Qt \
+		--prefix $(TARGET_DIR)/usr
 $(eval $(cmake-package))

Adding further packages[edit | edit source]

In real world applications, additional packages are usually added by selecting them under the Target packages item of the configuration menu. Just look at the packages directory to see which ones are available out of the box. To add further packages, please refer to this link.

Buildroot file system on the target[edit | edit source]

The created root file system can be extracted in a Virtual Machine local directory that can be used for starting the rfs via nfs:

dvdk@vagrant:~/buildroot$ mkdir rfs && cd rfs
dvdk@vagrant:~/buildroot/rfs$ sudo tar jxpf ../buildroot-2022.05/output/images/rootfs.tar.bz2

Starting the root file system in the target will welcome you with the classic prompt:

[    3.412976] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    3.421286] devtmpfs: mounted
[    3.426837] Freeing unused kernel image (initmem) memory: 1024K
[    3.433614] Run /sbin/init as init process
[    3.976207] systemd[1]: Detected architecture arm.

Welcome to Buildroot 2022.05!

[    4.023816] systemd[1]: Hostname set to <buildroot>.
[    5.136734] systemd[1]: Queued start job for default target Multi-User System.
[    5.150596] systemd[1]: Created slice Slice /system/modprobe.
[  OK  ] Created slice Slice /system/modprobe.
[    5.193797] systemd[1]: Created slice Slice /system/serial-getty.
[  OK  ] Created slice Slice /system/serial-getty.
[  OK  ] Started Serial Getty on ttymxc0.
[  OK  ] Reached target Login Prompts.
         Starting OpenSSH server daemon...
[  OK  ] Started Tiny HTTP Daemon.
[  OK  ] Started vsftpd FTP server.
[   18.251565] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
[   18.259328] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  OK  ] Started OpenSSH server daemon.
[  OK  ] Started Network Time Service.
[  OK  ] Started Lighttpd Daemon.
[  OK  ] Started Avahi mDNS/DNS-SD Stack.
[  OK  ] Reached target Multi-User System.

Welcome to Buildroot
buildroot login:

Then, the main applications will show theirs version:

root@buildroot:/root# python3 --version
Python 3.10.4
root@buildroot:/root# pip --version
pip 21.2.4 from /usr/lib/python3.10/site-packages/pip (python 3.10)
root@buildroot:/root# sqlite3 --version
3.38.5 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe
root@buildroot:/root# lighttpd -v
lighttpd/1.4.64 (ssl) - a light and fast webserver
root@buildroot:/root# gst-launch-1.0 --version
gst-launch-1.0 version 1.20.1
GStreamer 1.20.1
Unknown package origin

Finally, the qt-webkit-kiosk:

root@buildroot:/home# qt-webkit-kiosk --version -platform linuxfb
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
Build with: Qt = 5.15.8 ; WebKit = 5.212.0
Runing with: Qt = 5.15.8 ; WebKit = "602.1"
>> Version option in command prompt...



and then, if launched with the proper parameters, will display the Google web site:

root@buildroot:/home# qt-webkit-kiosk -u https://www.google.it -platform linuxfb
qt-webkit-kiosk (Google) on AXEL ULite EVK

buildroot 2023.08[edit | edit source]

In the same way, the latest buildroot version can be built: with this version, the Qt6 library is available and some packages are the latest version too.

root@buildroot:/root# ls -la /usr/lib/libQt6*
lrwxrwxrwx    1 root     root            15 Oct 29  2023 /usr/lib/libQt6Core.so -> libQt6Core.so.6
lrwxrwxrwx    1 root     root            19 Oct 29  2023 /usr/lib/libQt6Core.so.6 -> libQt6Core.so.6.4.3
-rwxr-xr-x    1 root     root       5656884 Oct 31  2023 /usr/lib/libQt6Core.so.6.4.3
lrwxrwxrwx    1 root     root            15 Oct 29  2023 /usr/lib/libQt6DBus.so -> libQt6DBus.so.6
lrwxrwxrwx    1 root     root            19 Oct 29  2023 /usr/lib/libQt6DBus.so.6 -> libQt6DBus.so.6.4.3
-rwxr-xr-x    1 root     root        750084 Oct 31  2023 /usr/lib/libQt6DBus.so.6.4.3
lrwxrwxrwx    1 root     root            14 Oct 29  2023 /usr/lib/libQt6Gui.so -> libQt6Gui.so.6
lrwxrwxrwx    1 root     root            18 Oct 29  2023 /usr/lib/libQt6Gui.so.6 -> libQt6Gui.so.6.4.3
-rwxr-xr-x    1 root     root       6442292 Oct 31  2023 /usr/lib/libQt6Gui.so.6.4.3
lrwxrwxrwx    1 root     root            18 Oct 29  2023 /usr/lib/libQt6Network.so -> libQt6Network.so.6
lrwxrwxrwx    1 root     root            22 Oct 29  2023 /usr/lib/libQt6Network.so.6 -> libQt6Network.so.6.4.3
-rwxr-xr-x    1 root     root       1608904 Oct 31  2023 /usr/lib/libQt6Network.so.6.4.3
lrwxrwxrwx    1 root     root            20 Oct 29  2023 /usr/lib/libQt6SerialBus.so -> libQt6SerialBus.so.6
lrwxrwxrwx    1 root     root            24 Oct 29  2023 /usr/lib/libQt6SerialBus.so.6 -> libQt6SerialBus.so.6.4.3
-rwxr-xr-x    1 root     root        289148 Oct 31  2023 /usr/lib/libQt6SerialBus.so.6.4.3
lrwxrwxrwx    1 root     root            21 Oct 29  2023 /usr/lib/libQt6SerialPort.so -> libQt6SerialPort.so.6
lrwxrwxrwx    1 root     root            25 Oct 29  2023 /usr/lib/libQt6SerialPort.so.6 -> libQt6SerialPort.so.6.4.3
-rwxr-xr-x    1 root     root        108220 Oct 31  2023 /usr/lib/libQt6SerialPort.so.6.4.3
lrwxrwxrwx    1 root     root            14 Oct 29  2023 /usr/lib/libQt6Sql.so -> libQt6Sql.so.6
lrwxrwxrwx    1 root     root            18 Oct 29  2023 /usr/lib/libQt6Sql.so.6 -> libQt6Sql.so.6.4.3
-rwxr-xr-x    1 root     root        296632 Oct 31  2023 /usr/lib/libQt6Sql.so.6.4.3
lrwxrwxrwx    1 root     root            14 Oct 29  2023 /usr/lib/libQt6Svg.so -> libQt6Svg.so.6
lrwxrwxrwx    1 root     root            18 Oct 29  2023 /usr/lib/libQt6Svg.so.6 -> libQt6Svg.so.6.4.3
-rwxr-xr-x    1 root     root        337404 Oct 31  2023 /usr/lib/libQt6Svg.so.6.4.3
lrwxrwxrwx    1 root     root            21 Oct 29  2023 /usr/lib/libQt6SvgWidgets.so -> libQt6SvgWidgets.so.6
lrwxrwxrwx    1 root     root            25 Oct 29  2023 /usr/lib/libQt6SvgWidgets.so.6 -> libQt6SvgWidgets.so.6.4.3
-rwxr-xr-x    1 root     root         34172 Oct 31  2023 /usr/lib/libQt6SvgWidgets.so.6.4.3
lrwxrwxrwx    1 root     root            18 Oct 29  2023 /usr/lib/libQt6Widgets.so -> libQt6Widgets.so.6
lrwxrwxrwx    1 root     root            22 Oct 29  2023 /usr/lib/libQt6Widgets.so.6 -> libQt6Widgets.so.6.4.3
-rwxr-xr-x    1 root     root       6604008 Oct 31  2023 /usr/lib/libQt6Widgets.so.6.4.3

Packages application version[edit | edit source]

root@buildroot:/root# python3 --version
Python 3.11.5
root@buildroot:/root# node --version
root@buildroot:/root# sqlite3 --version
3.42.0 2023-05-16 12:36:15 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0
root@buildroot:/root# gst-launch-1.0 --version
gst-launch-1.0 version 1.22.2
GStreamer 1.22.2

Use cases[edit | edit source]

node[edit | edit source]

Using the nodejs Javascript runtime it is possible to easily create an embedded webserver with few lines of code:

root@buildroot:/root# cat server.js
const http = require('http');

const hostname = '';
const port = 3000;

const server = http.createServer((req, res) => {
          res.statusCode = 200;
          res.setHeader('Content-Type', 'text/plain');
          res.end('Hello World\n');

server.listen(port, hostname, () => {
          console.log(`Server running at http://${hostname}:${port}/`);
root@buildroot:/root# node server.js
Server running at

and the web server can be contacted from the network at its IP address:

nodeJS web server

gstreamer[edit | edit source]

  • file: BigBuckBunny_640x360.mp4
  • video: MPEG-4 video 4:2:0 @ 640x360 resolution
  • gstreamer pipeline
gst-launch-1.0 playbin uri=file:///root/BigBuckBunny_640x360.mp4
root@buildroot:/root# gst-launch-1.0 playbin uri=file:///root/BigBuckBunny_640x360.mp4
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
Redistribute latency...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstSystemClock
0:04:28.2 / 0:09:56.5 (45.0 %)

Using the imxpxpvideosink plugin, i.e. using the PXP cell for helping the video rendering, the CPU load is around 50%:

gst-launch-1.0 filesrc location=/root/BigBuckBunny_640x360.mp4 ! decodebin ! videoconvert ! imxpxpvideosink
gstreamer CPU load using imxpxpvideosink

Big Buck Bunny 640x360 MPEG-4: 53% CPU load

Binary artifacts[edit | edit source]

buildroot binary artifacts (root file system, kernel+dtb and SDK) can be downloaded - for both versions - from DAVE Embedded Systems cloud server

N.B. config file should be renamed as .config in the buildroot directory before starting the build process