POSTS

記事

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 的错误。

因此,解决这个问题的方法有两种:

  1. 修改设备的权限: 通过修改设备文件的权限,使普通用户可以访问:

    $ sudo chmod 666 /dev/ttyACM0

    这个操作将允许所有用户拥有读写该设备的权限,但因为设备文件会在重启或者重新插拔设备后恢复默认权限,所以每次都需要执行这个命令。是否有些麻烦呢?当然有更好的方法。既然设备的权限是由 uucp 组控制的,我们可以将普通用户添加到这个组中,这样就可以永久地解决这个问题了。

  2. 将用户添加到 uucp 组: 可以通过以下命令将当前用户添加到 uucp 组:

    $ sudo usermod -aG uucp $USER

    添加后,注销并重新登录,普通用户就可以访问 /dev/ttyACM0 了。 这两种方法都可以解决普通用户无法访问串口设备的问题。第一种方法简单直接,但需要每次重启或重新插拔设备后都执行一次。第二种方法更为优雅,添加到 uucp 组后,用户可以永久访问串口设备。但是需要注意的是,添加用户到 uucp 组后,可能会有一些安全隐患,因为该组的用户可以访问所有串口设备。如果你在后期不再需要访问串口设备,可以将用户从 uucp 组中移除:

    $ sudo gpasswd -d $USER uucp

BACK

COMMENT