一、问题
目前我还没找到在驱动中创建完成后,设置设备文件的权限的方法,对于用户层的app来说,每次都加 sudo 可能会造成未知的问题。
Failed to open device: Permission denied
二、权限设置
1、正常来说,对于短期使用的app和驱动,手动更改 /dev 目录下对应设备的权限即可:
sudo chmod 0666 /dev/devices
2、如果设备经常需要重启,可以通过自启动脚本 rc.local 实现权限更改:
sudo vi /etc/rc.local
在 exit 0 前添加:
chmod 0666 /dev/devices
3、如果你的发行版没有 rc.local 文件或者不支持,可以自建 systemd 服务:
sudo vi /etc/systemd/system/set-devices-permissions.service
添加内容:
[Unit]
Description=Set permissions for /dev/devices to 0666
After=sysinit.target
Before=basic.target
[Service]
Type=oneshot
ExecStart=/bin/chmod 0666 /dev/devices
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
-
Description
:服务的描述信息。 -
After=sysinit.target
:确保在系统初始化完成后运行。 -
Before=basic.target
:确保在基本服务启动前运行。 -
Type=oneshot
:表示服务只运行一次。 -
ExecStart=/bin/chmod 0666 /dev/devices
:设置/dev/devices
的权限为0666
。 -
RemainAfterExit=yes
:即使命令执行完毕,服务仍标记为“活跃”状态。 -
WantedBy=multi-user.target
:指定服务在多用户模式下启动。
然后赋予服务文件权限:
sudo chmod 644 /etc/systemd/system/set-devices-permissions.service
启用服务:
sudo systemctl enable set-devices-permissions.service
sudo systemctl start set-devices-permissions.service
检查服务状态:
sudo systemctl status set-devices-permissions.service
开启服务后,每次系统启动都会执行这个服务,实现自动设置。
4、新建 udev 规则,我使用的方法。
在 /etc/udev/rules.d 目录下,新建规则文件:
sudo vi 99-user-udev.rules
99代表执行优先级顺序,越小越优先,用户级别建议放低,其余名字随意,添加以下内容:
KERNEL=="device",MODE="0666"
KERNEL表示内核中看到的设备名称,也就是在驱动里面设置的DEV_NAME。MODE表示要设置的权限。