This is part of a series of posts on the design and technical steps of creating Himblick, a digital signage box based on the Raspberry Pi 4.
A RaspberryPi boots using a little FAT partition which contains kernel, device tree, configuration, and everything else necessary to boot.
It has the conveniente of being able to plug the SD card into pretty much any system, and tweak the knobs that are exposed through it.
While we don't expect that people would want to modify the config.txt that controls the boot process, we would like to give people a convenient way to set up things like host name (which makes the device findable on the net), timezone, screen orientation, and wifi passwords.
We decided to go for a
himblick.conf file in the boot partition to give
simple knobs for the common system customizations:
[general] # Host name name = himblick # Country used for WiFi settings wifi country = de # System keyboard layout keyboard layout = us # System timezone timezone = Europe/Berlin # Screen orientation: can be normal, inverted, left, right. Default: normal. screen orientation = normal # Screen resolution: can be any of the xrandr screen modes. Default: auto. screen mode = 1920x1080 # WiFi networks that the device will be able to connect to [wifi ExampleESSID1] hash = 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef [wifi ExampleESSID2] password = example cleartext password
WiFi can be configured both with cleartext passwords and with hashes generated
This can be scheduled to run with systemd early at boot, most importantly
wpa_supplicant is started:
[Unit] Description=Configure host based on /boot/himblick.conf ConditionPathExists=/boot/himblick.conf Beforefirstname.lastname@example.org Before=network-pre.target Wants=network-pre.target [Service] Type=oneshot ExecStart=/usr/bin/himblick host-setup RemainAfterExit=yes [Install] WantedBy=basic.target
Here is the code of the host setup part.
The screen-related parts will be configured by the media player code, right after X starts up.
Here are some details about the various steps:
One just needs to configure the country and the networks: networkd does not need anything else from wpasupplicant.
If we provision something, we can use
wpa_passphrase to put hashes in the
file, but if someone with less technical skills has to update the WiFi
configuration, there's a possibility of just putting passwords in the file.
I'm not really sure how much more secure is the hash over the password: with the hash one can connect to that network just fine. However, I guess one can't use it to retrieve the password itself to try it out on different networks.
Keyboard in Debian is configured in /etc/default/keyboard, which is read by various packages:
keyboard-configurationmaintains the file
console-setup*read it to configure the keyboard on linux consoles
/lib/udev/rules.d/64-xorg-xkb.rulesudev rule to configure keyboard mappings as they are plugged/unplugged into the system
/etc/default/keyboard, one should apparently invoke
/usr/sbin/dpkg-reconfigure -f noninteractive keyboard-configuration, although
I haven't exactly figured out what it does, and whether this is just cargo
udevadm trigger --subsystem-match=input --action=change in instead needed to
to trigger reloading the keyboard layout in X without needing to restart X.
The timezone name, in Debian, is stored in
/etc/localtime is a symlink to the right timezone under
However, just calling
timedatectl set-timezone Time/Zone, does all that is
needed, including the above.
In Debian the hostname is saved in
To set in the system, there is the
hostname command and possibly other things
hostnamectl set-hostname command is taking care of.
Here too, just calling
hostnamectl set-hostname <hostname> does all that is
needed, including the above.