Allowing installation of udev rules in a core image

I am working with a core image that I create with hardware attached to the device that requires udev rules in order to interact with the device. Right now these udev rules are being copied into the core image from the an unconfined application snap on device boot or snap update. I am trying to find the best way to have these udev rules installed automatically or as part of the image when it is created. This issue is representative of some other configurations and modifications happening automatically on boot. @niemeyer and @ogra This is from our conversation about being able to write these configurations and other /etc files from a gadget snap since that is representative of owning the device. The Specific example was having wireless interfaces that enumerate differently per device while having the desire to always have a specific wireless device used in a determined way.

Some examples of these udev rules are below:

# Primary wifi
ACTION!="remove", SUBSYSTEM=="net", ATTRS{idVendor}=="548a", ATTRS{idProduct}=="1029", NAME="wlanPrimary"
# Secondary wifi
ACTION!="remove", SUBSYSTEM=="net", ATTRS{idVendor}=="548a", ATTRS{idProduct}=="3278", NAME="wlanSecondary"
# Tertiary wifi
ACTION!="remove", SUBSYSTEM=="net", ATTRS{subsystem_vendor}=="0x8086", ATTRS{subsystem_device}=="0x3230", NAME="wlanTertiary"
KERNEL=="uinput", GROUP="input", MODE="0660"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="34fe", ATTRS{idProduct}=="34ff", GROUP="input", MODE="0660"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0005:34fe:34ff.*", GROUP="input", MODE="0660"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="34fe", ATTRS{idProduct}=="342a", GROUP="input", MODE="0660"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0005:34fe:342a.*", GROUP="input", MODE="0660"
ACTION!="remove", KERNEL=="js[0-9]*", SUBSYSTEM=="input", ATTRS{name}=="Controller", SYMLINK+="input/js"`
SUBSYSTEM=="usb", ATTR{idProduct}=="1200", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1201", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1202", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1203", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1204", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1205", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1206", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1207", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1208", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="1209", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTR{idProduct}=="120a", ATTR{idVendor}=="4e32", MODE:="0666", OWNER:="video", GROUP:="sudo"
SUBSYSTEM=="usb", ATTRS{idVendor}=="9465", MODE:="0666", SYMLINK+="usbHamping", TAG+="uaccess", TAG+="udev-acl", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/dev/usbHamping"
SUBSYSTEMS=="usb", KERNEL=="ttyACM[0-9]*", ACTION!="remove", ATTRS{idVendor}=="76e4", ATTRS{idProduct}=="0000", MODE="666", GROUP="dialout", SYMLINK+="ttyBiff", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/dev/ttyBiff"
ACTION!="remove", SUBSYSTEM=="bluetooth", ATTRS{idVendor}=="45eb", ATTRS{idProduct}=="4712", NAME="hci0"

# We don't ever need this, so just disable it.
SUBSYSTEM=="usb", ATTRS{idVendor}=="4858", ATTRS{idProduct}=="1039", ATTR{authorized}="0"
ACTION!="remove", KERNEL=="ttyUSB*", ATTRS{interface}=="TTL232R", SYMLINK+="ttyMicrobox"

4 Likes

@cratliff Thanks for the data, Chris. I’ll try to sit down and have a careful look next week.

1 Like