Embedded Linux tips and tricks

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


Introduction[edit | edit source]

This page provides examples and usage notes for common tasks/issues related to typical embedded Linux systems.

How to write .wic image files to SD cards[edit | edit source]

Yocto build system can generate .wic image files. These files are usually written to SD cards to create bootable devices.

The simplest way to write such images to SD cards is to use the Balena Etcher tool, which is available for Linux, macOS, and Windows hosts. Using Etcher is straightforward, nonetheless many tutorials and examples are available on the Internet.

Advanced users can also use the well-known dd utility. This tool should be avoided unless the user knows what they are doing. If the target device is not specified properly, dd can wipe out all the data on a host's disk drive! For more details, see for instance this article.

Setting up a Yocto prebuilt package repository for apt[edit | edit source]

Occasionally, it is convenient to set up the target for installing .deb packages retrieved from a Yocto repository. The following example shows how to do that on an ORCA SOM-based target. The repository used is located at http://yocto.dave.eu/imx-5.4.70-2.3.0/. The prebuilt packages were generated by Yocto Zeus, which was used to create the distro running on the target as well.

Configuring the network subsystem[edit | edit source]

First of all, it is necessary to configure the target's network subsystem in order to access the Internet. In this example, a couple of systemd services are used for this purpose, namely systemd-networkd and systemd-resolved. They were configured by following these steps.

Disable the Connection Manager (ConnMan) sevice to prevent conflict issues:

root@orca:~# systemctl disable connman.service
root@orca:~# systemctl stop connman.service
[ 5809.162942] imx-dwmac 30bf0000.ethernet eth1: Link is Down
root@orca:~# systemctl status connman.service
* connman.service - Connection service
   Loaded: loaded (/lib/systemd/system/connman.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Create the configuration file for the network interface of interest (eth1 in this case). In the example, the file was /etc/systemd/network/20-eth0.network

[Match]
Name=eth1

# Prevent the interface loading if the kernel boots from nfs
KernelCommandLine=!nfsroot

[Network]
Address=192.168.0.163/24
Gateway=192.168.0.254
DNS=192.168.0.1

Start (or restart) systemd-networkd and systemd-resolved:

root@orca:~# systemctl restart systemd-networkd
root@orca:~# [ 5867.637252] imx-dwmac 30bf0000.ethernet eth1: PHY [stmmac-1:07] driver [Microchip KSZ9131 Gigabit PHY]
[ 5867.661532] imx-dwmac 30bf0000.ethernet eth1: No Safety Features support found
[ 5867.668779] imx-dwmac 30bf0000.ethernet eth1: IEEE 1588-2008 Advanced Timestamp supported
[ 5867.677316] imx-dwmac 30bf0000.ethernet eth1: registered PTP clock
[ 5867.683639] imx-dwmac 30bf0000.ethernet eth1: configuring for phy/rgmii-id link mode
[ 5867.692915] 8021q: adding VLAN 0 to HW filter on device eth1
[ 5867.704764] Micrel KSZ8081 or KSZ8091 30be0000.ethernet-1:03: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=30be0000.ethernet-1:03, irq=POLL)
[ 5871.775856] imx-dwmac 30bf0000.ethernet eth1: Link is Up - 1Gbps/Full - flow control rx/tx
[ 5871.784156] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
root@orca:~# systemctl restart systemd-resolved

Both services should be active:

root@orca:~# systemctl status systemd-networkd
* systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-12-15 21:34:32 UTC; 18s ago
     Docs: man:systemd-networkd.service(8)
 Main PID: 534 (systemd-network)
   Status: "Processing requests..."
    Tasks: 1
   Memory: 2.0M
   CGroup: /system.slice/systemd-networkd.service
           `-534 /lib/systemd/systemd-networkd

Dec 15 21:34:32 orca systemd[1]: Starting Network Service...
Dec 15 21:34:32 orca systemd-networkd[534]: Enumeration completed
Dec 15 21:34:32 orca systemd[1]: Started Network Service.
Dec 15 21:34:32 orca systemd-networkd[534]: eth1: IPv6 successfully enabled
Dec 15 21:34:32 orca systemd-networkd[534]: eth0: IPv6 successfully enabled
Dec 15 21:34:36 orca systemd-networkd[534]: eth1: Gained carrier
Dec 15 21:34:38 orca systemd-networkd[534]: eth1: Gained IPv6LL
Dec 15 21:34:50 orca systemd-networkd[534]: eth1: Configured
root@orca:~# systemctl status systemd-resolved
* systemd-resolved.service - Network Name Resolution
   Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-12-15 21:34:32 UTC; 6s ago
     Docs: man:systemd-resolved.service(8)
           https://www.freedesktop.org/wiki/Software/systemd/resolved
           https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
           https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
 Main PID: 542 (systemd-resolve)
   Status: "Processing requests..."
    Tasks: 1
   Memory: 1.4M
   CGroup: /system.slice/systemd-resolved.service
           `-542 /lib/systemd/systemd-resolved

Dec 15 21:34:32 orca systemd[1]: Starting Network Name Resolution...
Dec 15 21:34:32 orca systemd-resolved[542]: Positive Trust Anchors:
Dec 15 21:34:32 orca systemd-resolved[542]: . IN DS 19036 8 2 49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5
Dec 15 21:34:32 orca systemd-resolved[542]: . IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d
Dec 15 21:34:32 orca systemd-resolved[542]: Negative trust anchors: 10.in-addr.arpa 16.172.in-addr.arpa 17.172.in-addr.arpa 18.172.in-addr.arpa 19.172.in-addr.arpa>
Dec 15 21:34:32 orca systemd-resolved[542]: Using system hostname 'orca'.
Dec 15 21:34:32 orca systemd[1]: Started Network Name Resolution.

Configuring apt[edit | edit source]

Edit the file /etc/apt/apt.conf like this:

APT::Architecture "arm64";
APT::Get::AllowUnauthenticated "true";
Acquire::Languages "none";


Edit the file /etc/apt/sources.list.d/debian-10.list like this:

root@desk-mx8mp:~# cat /etc/apt/sources.list.d/debian-10.list
deb [trusted=yes] http://yocto.dave.eu/imx-5.4.70-2.3.0/ all/
deb [trusted=yes] http://yocto.dave.eu/imx-5.4.70-2.3.0/ aarch64/
deb [trusted=yes] http://yocto.dave.eu/imx-5.4.70-2.3.0/ aarch64-mx8mp/


Execute the following commands:

root@desk-mx8mp:~# rm -rf /var/lib/apt/lists/*
root@desk-mx8mp:~# apt-get clean
root@orca:~# apt-get update
0% [Working]
Ign:1 http://yocto.dave.eu/imx-5.4.70-2.3.0 all/ InRelease
Ign:2 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ InRelease
Ign:3 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64-mx8mp/ InRelease
Get:4 http://yocto.dave.eu/imx-5.4.70-2.3.0 all/ Release [1213 B]
Get:5 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ Release [1217 B]
Get:6 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64-mx8mp/ Release [1223 B]
Ign:7 http://yocto.dave.eu/imx-5.4.70-2.3.0 all/ Release.gpg
Ign:8 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ Release.gpg
Ign:9 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64-mx8mp/ Release.gpg
Get:10 http://yocto.dave.eu/imx-5.4.70-2.3.0 all/ Packages [146 kB]
Get:11 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ Packages [2848 kB]
Get:12 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64-mx8mp/ Packages [283 kB]
Fetched 3280 kB in 6s (545 kB/s)
Reading package lists... Done
root@orca:~# sed -i 's/\.\//aarch64\//g' /var/lib/apt/lists/yocto.dave.eu_imx-5.4.70-2.3.0_aarch64_Packages
root@orca:~# sed -i 's/\.\//all\//g' /var/lib/apt/lists/yocto.dave.eu_imx-5.4.70-2.3.0_all_Packages
root@orca:~# sed -i 's/\.\//aarch64-mx8mp\//g' /var/lib/apt/lists/yocto.dave.eu_imx-5.4.70-2.3.0_aarch64-mx8mp_Packages


The target is finally ready to install new packages. The following example shows for instance the installation of vim:

root@orca:~# sudo apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  vim-common vim-help vim-syntax vim-tutor vim-vimrc
The following NEW packages will be installed:
  vim vim-common vim-help vim-syntax vim-tutor vim-vimrc
0 upgraded, 6 newly installed, 0 to remove and 20 not upgraded.
Need to get 6584 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim 8.1.1518-r0 [1051 kB]
Get:2 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim-common 8.1.1518-r0 [2314 kB]
Get:3 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim-help 8.1.1518-r0 [1757 kB]
Get:4 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim-syntax 8.1.1518-r0 [1049 kB]
Get:5 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim-tutor 8.1.1518-r0 [411 kB]
Get:6 http://yocto.dave.eu/imx-5.4.70-2.3.0 aarch64/ vim-vimrc 8.1.1518-r0 [1596 B]
Fetched 6584 kB in 9s (660 kB/s)
Selecting previously unselected package vim.
(Reading database ... 71726 files and directories currently installed.)
Preparing to unpack .../vim_8.1.1518-r0_arm64.deb ...
Unpacking vim (8.1.1518-r0) ...
Selecting previously unselected package vim-common.
Preparing to unpack .../vim-common_8.1.1518-r0_arm64.deb ...
Unpacking vim-common (8.1.1518-r0) ...
Selecting previously unselected package vim-help.
Preparing to unpack .../vim-help_8.1.1518-r0_arm64.deb ...
Unpacking vim-help (8.1.1518-r0) ...
Selecting previously unselected package vim-syntax.
Preparing to unpack .../vim-syntax_8.1.1518-r0_arm64.deb ...
Unpacking vim-syntax (8.1.1518-r0) ...
Selecting previously unselected package vim-tutor.
Preparing to unpack .../vim-tutor_8.1.1518-r0_arm64.deb ...
Unpacking vim-tutor (8.1.1518-r0) ...
Selecting previously unselected package vim-vimrc.
Preparing to unpack .../vim-vimrc_8.1.1518-r0_arm64.deb ...
Unpacking vim-vimrc (8.1.1518-r0) ...
Setting up vim (8.1.1518-r0) ...
update-alternatives: Linking /bin/vi to /usr/bin/vim.vim
update-alternatives: Linking /usr/bin/vim to /usr/bin/vim.vim
update-alternatives: Linking /usr/bin/xxd to /usr/bin/xxd.vim
Setting up vim-common (8.1.1518-r0) ...
Setting up vim-help (8.1.1518-r0) ...
Setting up vim-syntax (8.1.1518-r0) ...
Setting up vim-tutor (8.1.1518-r0) ...
Setting up vim-vimrc (8.1.1518-r0) ...