Tue, Dec 27, 2022 at 12:04:00PM +0200, Marko Mäkelä wrote:
I might configure some more, such as:
- Write some udev rule so that when the USB storage is unplugged and
replugged, the file system will be auto-mounted and VDR service will be started.
- Restore /etc/systemd/logind.conf to HandlePowerKey=poweroff so that
the system can be easily shut down by pressing the Power button again.
I finally figured it out mostly. What is missing is a nice way of overriding the power button. When VDR is running, the button should be handled by VDR; otherwise, pressing the power button should trigger system shutdown, like it does by default.
First, I removed the custom /etc/fstab entry. Everything will be controlled by systemd as follows:
sudo mkdir -m 000 /video sudo tee /etc/systemd/system/video.mount << "EOF" [Unit] BindsTo=dev-disk-by\x2dlabel-VDR.device After=dev-disk-by\x2dlabel-VDR.device Requires=systemd-fsck@dev-disk-by\x2dlabel-VDR.service After=systemd-fsck@dev-disk-by\x2dlabel-VDR.service [Mount] Where=/video What=/dev/disk/by-label/VDR Type=ext4 Options=defaults,noatime,nofail [Install] WantedBy=dev-disk-by\x2dlabel-VDR.device EOF sudo tee /etc/systemd/system/vdr.service << "EOF" [Unit] Description=Runs VDR when storage is plugged in After=systemd-user-sessions.service plymouth-quit-wait.service After=rc-local.service After=getty@tty1.service BindsTo=dev-disk-by\x2dlabel-VDR.device After=dev-disk-by\x2dlabel-VDR.device After=video.mount Conflicts=getty@tty1.service ConditionPathExists=/video/video [Service] User=pi ExecStart=/usr/local/bin/vdr --no-kbd --lirc=/dev/lirc0 -Prpihddevice -v /video/video -s /var/lib/vdr/vdr-shutdown.sh TimeoutStartSec=infinity Type=idle Restart=on-failure RestartSec=1s TTYVTDisallocate=yes [Install] WantedBy=dev-disk-by\x2dlabel-VDR.device EOF sudo systemctl enable video.mount sudo systemctl enable vdr sudo udevadm control --reload cat > /var/lib/vdr/vdr-shutdown.sh << "EOF" #!/bin/sh set -eu if [ "$5" = 1 ] then sudo udisksctl unmount -b /dev/disk/by-label/VDR sudo udisksctl power-off -b /dev/disk/by-label/VDR PK=/etc/systemd/logind.conf.d/00-powerkey.conf sudo mv -f "$PK".disabled "$PK" || : sudo systemctl restart systemd-logind sudo mv -f "$PK" "$PK".disabled sudo systemctl stop vdr fi EOF chmod +x /var/lib/vdr/vdr-shutdown.sh sudo mkdir /etc/systemd/logind.conf.d sudo tee /etc/systemd/login.conf.d/00-powerkey.conf.disabled << "EOF" [Login] HandlePowerKey=poweroff EOF sudo systemctl restart systemd-logind
In addition to these, /etc/systemd/login.conf needs to be edited so that its [Login] section says HandlePowerKey=ignore.
I also had a udev rule that would execute "systemctl restart systemd-logind" when the storage is plugged in. Without that, if I plugged in the storage (and got VDR auto-started), then pressed the power button, and then repeated the same (unplug, replug, press the power button again), the system would shut down abruptly.
If there is a better way to make systemd-logind ignore the power button as long as VDR is running, please let me know. I tried adding Conflicts=exit.target to the vdr.service, but that did not prevent the shutdown. A rule Conflicts=shutdown.target means that the service shall be terminated on shutdown, according to "man 7 systemd.special".
Marko