我的载板上有一个嵌入式设备(运行 Ubuntu 16.04 的 Nvidia Jetson TX2),需要使用串行端口。载板上的串口映射到ttyS0,默认为root所有,属于tty组:
crw--w---- 1 root tty 4, 64 Aug 1 13:34 ttyS0
我已将用户添加ubuntu
到组tty
(这是我登录的组),但默认情况下该组没有 ttyS0 的读取权限。
sudo chmod g+r /dev/ttyS0
修复了它,但是重新启动后该问题不会持续存在。我尝试创建各种 udev 规则(99-z_setup.rules):
KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP:="tty", MODE:="0660", OWNER:="ubuntu"
或者
KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP:="tty", MODE:="0660"
或者
KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP="tty", MODE="0660"
这些结果是:
lrwxrwxrwx 1 root root 5 Aug 1 13:34 my_tty -> ttyS0
crw--w---- 1 root tty 4, 64 Aug 1 13:34 ttyS0
所以我仍然无法访问它。我也尝试过
KERNEL=="ttyS0", ACTION=="add", PROGRAM="/usr/bin/sudo /home/ubuntu/bin/setup_tty.sh"
与setup_tty.sh
含有
#!/bin/bash
chmod g+r /dev/ttyS0
echo "setup_tty ran" >> /home/ubuntu/bin/tty.log
它回显到文件tty.log
,所以我知道脚本运行,但权限仍然是
crw--w---- 1 root tty 4, 64 Aug 1 13:44 ttyS0
这就像组/所有者/模式设置被忽略或被覆盖。我搜索过,有很多类似的问题,但它们的答案似乎总是将用户添加到组tty
或dialout
.我的用户帐户已经是这两个帐户的成员,但没有骰子,因为默认情况下由于某种原因,该组没有读取权限。
我检查了 /etc/login.defs 并发现了这些行:
# TTYPERM Login tty will be set to this permission.
#
# If you have a "write" program which is "setgid" to a special group
# which owns the terminals, define TTYGROUP to the group number and
# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign
# TTYPERM to either 622 or 600.
#
# In Debian /usr/bin/bsd-write or similar programs are setgid tty
# However, the default and recommended value for TTYPERM is still 0600
# to not allow anyone to write to anyone else console or terminal
# Users can still allow other people to write them by issuing
# the "mesg y" command.
TTYGROUP tty
TTYPERM 0600
我将 TTYPERM 值更改为 0660 并重新启动,但没有任何区别。
有什么想法可以让这个 tty 在重新启动后具有 640 以外的模式吗?
这可能就是答案 - 我运行journalctl | grep tty
并发现了以下输出:
Aug 02 11:05:45 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Start request repeated too quickly.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Failed to start Serial Getty on ttyS0.
所以看起来其他一些服务(不确定 Getty 是什么)正在尝试使用 ttyS0。
答案1
如果您使用的是登录,请查看/etc/login.defs
、 条目TTYPERM
。
一般调试建议:在脚本开始时,您应该使用它来捕获命令的错误输出,并验证设备条目是否已存在。
exec >> /home/ubuntu/bin/tty.log 2>&1
答案2
所以事实证明,就我而言,ttyS0 是 TX2 的串行控制台,因此尝试按照我想要的方式使用它会更加痛苦,而不是值得的。看来 ttyTHS2 也可用并且已经具有所需的权限。这不是一个特别令人满意的答案,但却是前进的最佳方法。