私のキャリアボードにシリアルポートを使用する必要がある内蔵デバイス(Ubuntu 16.04を実行しているNvidia Jetson TX2)があります。キャリアボードのシリアルポートは、デフォルトでルートが所有し、tty グループに属する ttyS0 にマッピングされます。
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
。私のユーザーアカウントはすでに2つのグループのメンバーですが、何らかの理由でデフォルトでこのグループにサイコロはありません。読み取り権限。
/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も利用可能で、すでに必要な権限があるようです。これは特に満足のいく答えではありませんが、これから進むための最善の方法です。