When connecting an Android device or micro-controller hardware board to a Linux host machine via USB and executing adb devices or fastboot devices, you might encounter the permission failure: no permissions (user in plugdev group; are your udev rules wrong?).

Even if your user account is already listed in the plugdev group, Linux default security permissions restrict unprivileged users from accessing raw USB device nodes in /dev/bus/usb/. In this article, we cover how systemd-udevd manages USB device nodes and how to configure custom udev rules to grant permanent non-root access.

Quick Resolution Commands

Execute the following steps to configure udev rules and grant your user account access to connected USB hardware:

Terminal Commandsbash
# 1. Identify connected USB Vendor ID using lsusb
lsusb
 
# Sample output line:
# Bus 001 Device 004: ID 18d1:4ee7 Google Inc. Nexus/Pixel
 
# 2. Create udev rule file for Android/USB hardware
sudo nano /etc/udev/rules.d/51-android.rules
 
# Add rule content (matching Vendor ID 18d1):
# SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev", TAG+="uaccess"
 
# 3. Apply rule permissions and reload udev daemon
sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
 
# 4. Add user to plugdev group and restart ADB daemon
sudo usermod -aG plugdev $USER
adb kill-server
adb start-server

Step-by-Step Breakdown: Resolving USB Permission Errors

1. Finding USB Vendor IDs with lsusb

Plug in your USB target device and run lsusb to inspect the 4-digit hexadecimal Vendor ID (VID) and Product ID (PID):

Terminal Commandsbash
lsusb | grep -iE "google|samsung|qualcomm|mediatek|ftdi"

Common Vendor IDs include: 18d1 (Google / AOSP), 04e8 (Samsung), 22b8 (Motorola), 0b05 (ASUS), 054c (Sony), and 0403 (FTDI Serial converters).

2. Configuring /etc/udev/rules.d/51-android.rules

Create or update /etc/udev/rules.d/51-android.rules with rule directives matching your hardware Vendor IDs:

/etc/udev/rules.d/51-android.rulesini
# Google / Pixel / AOSP
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev", TAG+="uaccess"
 
# Samsung
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev", TAG+="uaccess"
 
# Qualcomm / Reference Hardware
SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev", TAG+="uaccess"

3. Group Membership and Active Session Refreshing

Ensure your user account belongs to the plugdev Unix group. Running usermod -aG plugdev $USER updates /etc/group, but active shell sessions do not inherit new group privileges until re-logging or invoking newgrp:

Terminal Commandsbash
# Verify current active groups for logged-in user
groups
 
# Force session group update without logging out
newgrp plugdev
 
# Re-check ADB device connectivity
adb devices

Under the Hood: How udev Grant Access Rights

  • Kernel Enclosure: When a USB device is plugged in, the Linux kernel creates a raw character device node at /dev/bus/usb/BBB/DDD owned by root:root with restricted 0600 default permissions.

  • `systemd-udevd` Execution: The udevd daemon matches kernel environment keys (SUBSYSTEM, idVendor) against rule files in /etc/udev/rules.d/.

  • ACL & Access Rights: Specifying MODE="0666" grants read/write access to all users; specifying GROUP="plugdev" restricts access to group members; specifying TAG+="uaccess" delegates Dynamic Access Control Lists (ACLs) to systemd-logind for active desktop sessions.

Troubleshooting Persistent Permission Issues

  • USB Cable in Charging-Only Mode: Ensure your Android phone USB configuration is set to File Transfer (MTP) or PTP instead of "Charge only" in the notification shade.

  • Un-authorized USB Debugging RSA Key: Check your phone screen for the prompt *"Allow USB debugging?"* and tap Always allow from this computer.

  • Docker / Container USB Passthrough: If running ADB inside Docker containers, pass /dev/bus/usb volume mounts and --privileged flags to container run commands.