-->
記事
Arch Linux 下普通用户无串口设备访问权限的解决方案
开发
这几天重回老本行玩一下 ESP32 开发板,环境搭建一路畅通。但到最后烧录程序时出现了问题,控制台提示访问 /dev/ttyACM0
时 Permission denied。
思考,应该是串口设备的访问权限问题。去搜索了一下 StackOverflow,大多数回答都是让我将自己的用户添加到 dialout
组,但试了一下并不能解决问题,提示 user is not in the dialout group
。输入 cat /etc/group | grep dialout
确认了一下,没有这个组。原来这个组在 Debian 系统中串口设备访问权限是 dialout
管理,但在 Arch Linux 中,串口设备的权限管理并不是通过 dialout
组来实现的。这时候就需要用到相同的思路去解决这个问题。于是下意识地去查看了一下 /dev/ttyACM0
的权限:
$ ls -l /dev/ttyACM0
crw-rw---- 1 root uucp 166, 0 Jun 7 20:50 /dev/ttyACM0
可以看到,设备的权限是 crw-rw----
,这意味着只有 root 用户和 uucp 组的用户可以访问该设备。uucp 组是一个专门用于管理串口设备访问权限的组,而普通用户并不在这个组中。因此,普通用户无法访问 /dev/ttyACM0
,导致了 Permission denied 的错误。
因此,解决这个问题的方法有两种:
修改设备的权限: 通过修改设备文件的权限,使普通用户可以访问:
$ sudo chmod 666 /dev/ttyACM0
这个操作将允许所有用户拥有读写该设备的权限,但因为设备文件会在重启或者重新插拔设备后恢复默认权限,所以每次都需要执行这个命令。是否有些麻烦呢?当然有更好的方法。既然设备的权限是由 uucp 组控制的,我们可以将普通用户添加到这个组中,这样就可以永久地解决这个问题了。
将用户添加到 uucp 组: 可以通过以下命令将当前用户添加到 uucp 组:
$ sudo usermod -aG uucp $USER
添加后,注销并重新登录,普通用户就可以访问 /dev/ttyACM0
了。
这两种方法都可以解决普通用户无法访问串口设备的问题。第一种方法简单直接,但需要每次重启或重新插拔设备后都执行一次。第二种方法更为优雅,添加到 uucp 组后,用户可以永久访问串口设备。但是需要注意的是,添加用户到 uucp 组后,可能会有一些安全隐患,因为该组的用户可以访问所有串口设备。如果你在后期不再需要访问串口设备,可以将用户从 uucp 组中移除:
$ sudo gpasswd -d $USER uucp
COMMENT