SYNOPSYS

I use a raspberry 5 has media player.
My music and movies are on a usb drive, synced via unison.
I want mpd service to be started / stopped when this USB drive is plugged / unplugged.

DOCUMENTATION

name

PROCEDURE

query the drive serial

1
udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/sda1) | grep serial

create a udev rule that starts a systemd service, if you don’t, boot hangs or stalls

1
2
/etc/udev/rules.d/90-usb-mpd.rules
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="575841314141364A53544858", TAG+="systemd", ENV{SYSTEMD_WANTS}="usb-mpd@%k.service"

create the corresponding systemd template service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/etc/systemd/system/usb-mpd@.service
[Unit]
Description=Mount USB and start MPD for device %I
After=local-fs.target
Requires=dev-%i.device

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usb-mpd.sh /dev/%I
RemainAfterExit=true

Create the script to mount + start MPD

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/usr/local/bin/usb-mpd.sh
#! /usr/bin/bash

DEVICE="$1"

logger "USB-MPD: Device detected: $DEVICE"
udisksctl mount -b "$DEVICE"
MOUNT_POINT=$(lsblk -no MOUNTPOINT "$DEVICE")
if [[ "$MOUNT_POINT" == *"/media/"* ]]; then
    logger "USB-MPD: Mounted at $MOUNT_POINT, starting MPD"
    systemctl --user start mpd.service
else
    logger "USB-MPD: Mount failed or not detected"
fi
1
sudo chmod +x /usr/local/bin/usb-mpd.sh