如何為 tty 提供 640 以外的模式並使其在重新啟動後持續存在
我在載板上有一個嵌入式設備(執行 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]: 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
, entryTTYPERM
。一般調試建議:在腳本開始時,您應該使用它來擷取命令的錯誤輸出,同時驗證設備條目是否已經存在。
exec >> /home/ubuntu/bin/tty.log 2>&1