Using systemd and udev rules
In our example we will use libvirt VM with Flatcar Container Linux and run systemd unit on disk attach event. First of all we have to create systemd unit file /etc/systemd/system/device-attach.service
:
[Service]
Type=oneshot
ExecStart=/usr/bin/echo 'device has been attached'
This unit file will be triggered by our udev rule.
Then we have to start udevadm monitor --environment
to monitor kernel events.
Once you’ve attached virtio libvirt device (i.e. virsh attach-disk coreos /dev/VG/test vdc
) you’ll see similar udevadm
output:
UDEV [545.954641] add /devices/pci0000:00/0000:00:18.0/virtio4/block/vdb (block)
.ID_FS_TYPE_NEW=
ACTION=add
DEVNAME=/dev/vdb
DEVPATH=/devices/pci0000:00/0000:00:18.0/virtio4/block/vdb
DEVTYPE=disk
ID_FS_TYPE=
MAJOR=254
MINOR=16
SEQNUM=1327
SUBSYSTEM=block
USEC_INITIALIZED=545954447
According to text above udev generates event which contains directives (ACTION=add and SUBSYSTEM=block) we will use in our rule. It should look this way:
ACTION=="add", SUBSYSTEM=="block", TAG+="systemd", ENV{SYSTEMD_WANTS}="device-attach.service"
That rule means that udev will trigger device-attach.service
systemd unit on any block device attachment. Now when we use this command virsh attach-disk coreos /dev/VG/test vdc
on host machine, we should see device has been attached
message in Flatcar Container Linux node’s journal. This example should be similar to USB/SAS/SATA device attach.
Butane Config example
To use the unit and udev rule with a Container Linux Config, modify this example as needed:
variant: flatcar
version: 1.0.0
storage:
files:
- path: /etc/udev/rules.d/01-block.rules
mode: 0644
contents:
inline: |
ACTION=="add", SUBSYSTEM=="block", TAG+="systemd", ENV{SYSTEMD_WANTS}="device-attach.service"
systemd:
units:
- name: device-attach.service
contents: |
[Unit]
Description=Notify about attached device
[Service]
Type=oneshot
ExecStart=/usr/bin/echo 'device has been attached'
More systemd examples
For more systemd examples, check out these documents:
More information
systemd.service Docs systemd.unit Docs systemd.target Docs udev Docs