Linux

如何為 tty 提供 640 以外的模式並使其在重新啟動後持續存在

  • August 2, 2018

我在載板上有一個嵌入式設備(執行 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

這就像組/所有者/模式設置被忽略或被覆蓋。我已經搜尋並且有很多類似的問題,但他們的答案似乎總是將使用者添加到組ttydialout. 我的使用者帳戶已經是這兩個的成員,但沒有骰子,因為預設情況下由於某種原因,該組沒有讀取權限。

我檢查了 /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]: serial-getty@ttyS0.service: 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]: serial-getty@ttyS0.service: 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]: serial-getty@ttyS0.service: 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]: serial-getty@ttyS0.service: 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]: serial-getty@ttyS0.service: 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]: serial-getty@ttyS0.service: Start request repeated too quickly.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Failed to start Serial Getty on ttyS0.

所以看起來其他一些服務(不確定 Getty 是什麼)正在嘗試使用 ttyS0。

所以事實證明,在我的情況下,ttyS0 是 TX2 的串列控制台,所以嘗試按照我想要的方式使用它會更痛苦,這是值得的。似乎 ttyTHS2 也可用並且已經具有所需的權限。不是一個特別令人滿意的答案,而是最好的前進方式。

如果您使用登錄,請查看/etc/login.defs, entry TTYPERM

一般調試建議:在腳本開始時,您應該使用它來擷取命令的錯誤輸出,同時驗證設備條目是否已經存在。

exec >> /home/ubuntu/bin/tty.log 2>&1

引用自:https://unix.stackexchange.com/questions/459989