这是在树莓派上。
这是 sudo ls -lL /sys/class/gpio/gpio18 的输出:
-rwxrwx--- 1 root gpio 4096 Mar 8 10:50 active_low
-rwxrwx--- 1 root gpio 4096 Mar 8 10:52 direction
-rwxrwx--- 1 cameron cameron 4096 Mar 8 10:50 edge
drwxrwx--- 2 root gpio 0 Mar 8 10:50 power
drwxrwx--- 2 root gpio 0 Mar 8 10:50 subsystem
-rwxrwx--- 1 root gpio 4096 Mar 8 10:50 uevent
-rwxrwx--- 1 cameron cameron 4096 Mar 8 10:50 value
Run Code Online (Sandbox Code Playgroud)
所以看起来我现在应该可以使用价值了,太好了。然而:
cameron@raspberrypi~ $ echo 1 > /sys/class/gpio/gpio18/value
-bash: /sys/class/gpio/gpio18/value: Permission …
Run Code Online (Sandbox Code Playgroud) 是否可以设置 /sys/class/gpio/ 文件的默认权限和所有权,例如通过配置 udev?关键是为可以访问板上 GPIO 引脚的进程提供真正的 gid。
大多数“解决方案”包括 suid 包装器、带有 chown 的脚本和受信任的中间人二进制文件。网络搜索发现编写 udev 规则的尝试失败。
(相关:Q1)
我有一个守护进程,它使用 GPIO 端口监视各种事物。我已经使用 Python 使用 RPi.GPIO 模块为此编写了代码。
我想确保守护进程始终运行,即在崩溃后重新启动它并在系统启动时启动它(至关重要的是在任何用户登录之前——这个 Pi 无头运行)。有一个闪烁的 LED 告诉我它正在运行,但这并不理想。
我已阅读有关为此目的使用 MONIT 的信息,但我遇到了一些问题。到目前为止,我的尝试主要围绕这个解决方案:
这是我的 bash 包装文件,名为 /home/pi/UPSalarm/UPSalarm.bash
#!/bin/bash
PIDFILE=/var/run/UPSalarm.pid
case $1 in
start)
#source /home
#Launch script
sudo python /home/pi/UPSAlarm/UPSalarm.py 2>/dev/null &
# store PID value
echo $! > ${PIDFILE}
;;
stop)
kill `cat ${PIDFILE}`
# Proccess killed, now remove PID
rm ${PIDFILE}
;;
*)
echo "usage: scraper {start|stop}" ;;
esac
exit 0`
Run Code Online (Sandbox Code Playgroud)
这是我的监控规则
check process UPSalarm with pidfile /var/run/UPSalarm.pid
start = "/home/pi/UPSalarm/UPSalarm start"
stop = "/home/pi/UPSalarm/UPSalarm …
Run Code Online (Sandbox Code Playgroud) 我有一个带有超级电容器硬件的嵌入式 Linux 系统(当前运行 Angstrom),可以提供完成写入的时间,并避免在外部电源断开时损坏文件系统。架构为ARM,SOC为Freescale iMX6Q
有一个 GPIO 输入可监控外部电源的存在。
将此输入连接到现有逻辑以进行电源故障处理的最佳方法是什么?SIGPWR
我应该自己向所有正在运行的进程广播吗?仅将其提高到systemd
?写点东西给/dev/initctl
?做点别的什么让内核本身发送出去SIGPWR
?
是否存在可以在 devicetree 中配置的硬件电源故障输入的现有机制?或者用户模式守护进程(具有高优先级)轮询 sysfs gpio 文件是最好的方法吗?
这个早期的问题指出了电池备份的优点,但以“保持电源足够长的时间”停止,没有深入讨论如何在写入刷新代码中触发电源故障路径的任何细节。(由于即将断电,系统不应在正常进程关闭中浪费任何时间,只执行保护数据完整性的操作。尤其应避免日志关闭的操作,因为它们会增加执行写入(包括更新)时损坏的机会在最坏的情况下获取磨损均衡数据。 讨论。)
我正在围绕 libgpiod 的接口编写一些代码。比如我想设置一条线输出高电平。在底层,libgpiod 打开内核为该行提供的 fd,然后调用ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...)
.
我的问题是:
这个特定的ioctl()
调用(带有GPIO_V2...
参数)理论上(可能)是否会像写入任意文件描述符一样阻塞?
ioctl()
理论上来说,呼叫通常会阻塞吗?例如,首先请求线路还涉及ioctl()
芯片的 on a fd。I2C 怎么样ioctl()
?
fd
如果它是阻塞的,那么行 struct ( ) 中的底层是否是line->fd_handle->fd
我需要在事件循环中等待的底层(例如,epoll()
或像 libuv 这样的抽象事件库)?
我试图通过研究来回答这个问题,但是(a)搜索“ioctl”和“blocking”的任何组合只会给出将fd设置为阻塞或不阻塞的结果,并且(b)它不在手册页或内核中我能找到的文档。
我知道以普通用户身份运行 root 脚本存在风险,但在这种情况下,我别无选择,我正在做的事情与机器有关。我有一台带有 GPIO 端口的小型板式计算机,我需要使用其中一个输出通过切换关闭线来重置设备。该部分工作正常,设备会按原样重置。
我的问题是我编写了一个 python 脚本来重置设备并且它可以工作,但是我必须以 root 或“sudo 程序名称,输入密码”的身份运行它。但是我需要它作为没有root权限的普通用户工作。换句话说,我添加了一个普通用户,无论如何我都无法运行脚本。
我曾尝试将用户添加到 sudoer 文件中,但这不起作用并且被完全忽略了。我已经更改了权限,设置了 SUID 位以及我能想到的所有其他内容,但它仍然要求输入 root 密码。唯一有效的是当我打开用户和组并将用户添加到 Sudo 组时,但随后用户可以访问我希望它没有的程序,因为它就像我的默认管理员用户一样。那不是我想要的。我想以某种方式将用户可以访问的内容限制为单个脚本或程序。
我让其他人建议我需要编写一个驱动程序,但我真的不知道该怎么做,也不知道他们的确切含义,通常他们不想详细说明。虽然我使用过 Linux,但我不认为自己是这方面的专家。任何人有任何想法如何做到这一点?
gpio ×6
linux ×3
permissions ×2
sudo ×2
arm ×1
embedded ×1
hardware ×1
ioctl ×1
linux-kernel ×1
monitoring ×1
python ×1
sysfs ×1
systemd ×1
ubuntu ×1