6

The man page for udev mentions in several places that certain rules options can be used to invoke 'builtin' commands, which are apparently built in to the udev program itself. However, I haven't been able to find any reference documentation that clearly explains what udev builtins are available; what they do and how they are used.

I have searched the web without much success. Does anyone know if there is a reference anywhere that provides details about these builtin commands?

5

Unfortunately, this information is missing on manpages and even knowing how to read them(see below) you will find trouble on trying to find that info.

However, the beauty of the opensource relies on having the power to read the sources. If you take a look at the udev-builtin.c source file inside systemd/udev repository and have basic C language knowledge, you will find the following snippet of code: A structure that maps all existing builtin types.

static const struct udev_builtin *builtins[_UDEV_BUILTIN_MAX] = {
#if HAVE_BLKID
        [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
#endif
        [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
        [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
        [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
        [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
#if HAVE_KMOD
        [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod,
#endif
        [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id,
        [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link,
        [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id,
        [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id,
#if HAVE_ACL
        [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess,
#endif
};

This struct holds all built-in types, and they map source files depending on what type it is. Example:

Related:

  • Thanks for your answer, although it seems a bit bizarre that this information is not in the man pages, but can only be found by reading the sources. – Time4Tea Jan 10 at 18:25
  • Maybe it's not relevant to systemd team document this, as all those actions are pretty much "automatic" (probe keyboard, handle usb, handle network link...) but yeah, i agree with you that even a simple explanation what those are would be great to avoid the loss of time of crawling through sources online... – user34720 Jan 10 at 18:42
4

If you just run udevadm test-builtin without arguments it'll list the builtin commands along with a short description for each of them:

udevadm test-builtin
calling: test-builtin
command missing
udevadm test-builtin [OPTIONS] COMMAND DEVPATH

Test a built-in command.

  -h --help     Print this message
  -V --version  Print version of the program

Commands:
  blkid           Filesystem and partition probing
  btrfs           btrfs volume management
  hwdb            Hardware database
  input_id        Input device properties
  keyboard        Keyboard scan code to key mapping
  kmod            Kernel module loader
  net_id          Network device properties
  net_setup_link  Configure network link
  path_id         Compose persistent device path
  usb_id          USB device properties
  uaccess         Manage device node user ACL

Unfortunately, as you've noticed, builtins usage is only explained briefly in the manual.
A practical example can be found in the file 50-udev-default.rules available on your system (under /lib/udev/rules.d/) which contains stuff like:

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
  • Thanks. I didn't know this and it is helpful. However, I am trying to diagnose a hardware initialization issue during boot, and I think it would really help if I could understand more details of what these functions are actually doing. – Time4Tea Jan 10 at 19:43
1

Not sure, if you don't find anything better, maybe try to explore which builtins are available directly in the source: look for files starting by "udev-builtin"

https://github.com/systemd/systemd/tree/master/src/udev

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.