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:
# 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-serverStep-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):
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:
# 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:
# Verify current active groups for logged-in user
groups
# Force session group update without logging out
newgrp plugdev
# Re-check ADB device connectivity
adb devicesUnder 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/DDDowned byroot:rootwith restricted0600default permissions.`systemd-udevd` Execution: The
udevddaemon 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; specifyingGROUP="plugdev"restricts access to group members; specifyingTAG+="uaccess"delegates Dynamic Access Control Lists (ACLs) tosystemd-logindfor 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/usbvolume mounts and--privilegedflags to container run commands.
Comments and corrections