I have a STM32-Bluepill board where I flashed an USB Bootloader. If I attach it to my computer, it is mounted at /dev/ttyACM0. lsusb shows it as Bus 001 Device 006: ID 1eaf:0004 Leaflabs Maple serial interface

For Arduino-Projects I do have a diy group on my computer. So for the Bluepill I created the following udev rule:

DRIVERS=="usb", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0004", GROUP="diy", MODE="0660"
DRIVERS=="usb", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", GROUP="diy", MODE="0660"

Both rules do apply, but none sets the group of /dev/ttyACM0 correctly (its alway uucp). I know that those rule are applied, because I currently use a workaround by setting the mode to 0666 instead. That gives me the permission to work with the device, but anyways I want to set the group correctly.

uucp is only set by one of my default-rules: /usr/lib/udev/rules.d/50-udev-default.rules. But my rule lies at /etc/udev/rules.d/100-bluepill.rules so it should be higher prioritized.

  • Rules are processed in lexical order not numerical order I think? See man udev May 6, 2022 at 10:37
  • you are absolutely right. So the default 50 rule was executed after my own rule and did overwrite the group again. Renaming the rule to 99-bluepill.rules did the trick. If you could post your suggestion as an answer, I will mark it as "solved" :) Thanks again
    – Tom Mekken
    May 6, 2022 at 11:29
  • I've added a brief answer below - thanks May 6, 2022 at 13:06

1 Answer 1


Although numeric prefixes are the conventional way to specify udev rule order, the processing is actually lexical. From man udev:

       The udev rules are read from the files located in the system rules
       directories /lib/udev/rules.d and /usr/local/lib/udev/rules.d, the
       volatile runtime directory /run/udev/rules.d and the local
       administration directory /etc/udev/rules.d. All rules files are
       collectively sorted and processed in lexical order, regardless of the
       directories in which they live. However, files with identical filenames
       replace each other. Files in /etc have the highest priority, files in
       /run take precedence over files with the same name under /usr. This can
       be used to override a system-supplied rules file with a local file if
       needed; a symlink in /etc with the same name as a rules file in /lib,
       pointing to /dev/null, disables the rules file entirely. Rule files
       must have the extension .rules; other extensions are ignored.

So 100-bluepill.rules sorts before 50-udev-default.rules (1 < 5). To make your rule apply last, choose something like 99-bluepill.rules.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .