それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

pi zero でUSB-OTG でUSBシリアルを使う。

USB-OTG でUSBシリアルを使う。

USB OTB 経由で、シリアルコンソールが動けば勝ち。今回はUSB-OTGデバイスに、orage pi zero を使う。

USB-OTGとはスマホを接続時にUSBテザリングバイスやフォトストレージのように機能を選べるアレである。

パソコンとPi zeroをUSB-OTGで接続し、シリアル通信を有効にすると、パソコンからはUSBシリアルデバイスに見える。

シリアルコンソール設定する。

https://oshlab.com/enable-g_serial-usb-otg-console-orange-pi-armbian/

echo "g_serial" >> /etc/modules
mkdir -p /etc/systemd/system/serial-getty@ttyGS0.service.d

cat - > /etc/systemd/system/serial-getty@ttyGS0.service.d/10-switch-role.conf
[Service]
ExecStartPre=-/bin/sh -c "echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role"


systemctl --no-reload enable serial-getty@ttyGS0.service
echo "ttyGS0" >> /etc/securetty
reboot

Orange Pi をUSBでRaspiにつなぐ。

Raspiにつないだ。見えるぞ。見えるぞ。

takuya@raspi-ubuntu:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)

raspi から USBのOrange Pi へつなぐ

sudo screen /dev/ttyACM0 115200

f:id:takuya_1st:20211130235717p:plain

これで、よくあるSSHを経由しない pi zero の管理ってやつができる。でも今回の目標はこれじゃない。

Orange Pi につながるのはいいけど、逆に、Raspiをリモートから読みたいよね。

単純に通信する。

agetty を使わずに、単純に通信する。

Orange Piの agetty を止める。

systemctl enable  serial-getty@ttyGS0.service
systemctl stop    serial-getty@ttyGS0.service
systemctl status  serial-getty@ttyGS0.service

シリアルコンソールを許可する。

root@OrangePi:~# chmod 666 /dev/tty*S0

Raspi側に見えているシリアルコンソールを許可する。

takuya@raspi-ubuntu:~$ sudo chmod 666 /dev/ttyA*

単純に通信をする。 Raspi 側

takuya@raspi-ubuntu:~$ sudo screen /dev/ttyACM0 115200

Orange Pi Zero側

root@OrangePi:~# screen /dev/ttyGS0 11520

これで、両方から通信で、単純に文字列が送信できることがわかります。

youtu.be

raspi(USB) からはOTGどう見えているのか。

単純にUSBデバイスで見えているとわかります。

takuya@raspi-ubuntu:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)

ttyACM0ができています。

takuya@raspi-ubuntu:~$ ls /dev/ttyA*
/dev/ttyACM0  /dev/ttyAMA0

シリアルデバイスであることを確認します。

takuya@raspi-ubuntu:~$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 11月 29 23:52 usb-Armbian_Linux_5.3.5+_with_musb-hdrc_Gadget_Serial_v2.4-if00 -> ../../ttyACM0

f:id:takuya_1st:20211201004318p:plain:w300

最初の逆をやろう。

シリアルコンソールを使ってRaspi側へログインしよう

raspi( login - agetty - usb)  ----<OTG/serial>--- ( usb/otg -- screen ) orange pi zero

Orange Pi から、Raspiにログインする。

Raspi側で、agetty で待ち受ける。

getty を起動する。

takuya@raspi-ubuntu:~$ sudo systemctl start getty@ttyACM0.service

状態の確認

takuya@raspi-ubuntu:~$ sudo systemctl start getty@ttyACM0.service
[sudo] password for takuya:
takuya@raspi-ubuntu:~$ sudo systemctl status getty@ttyACM0.service
● getty@ttyACM0.service - Getty on ttyACM0
     Loaded: loaded (/lib/systemd/system/getty@.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-11-30 12:00:00 JST; 3s ago
       Docs: man:agetty(8)
             man:systemd-getty-generator(8)
             http://0pointer.de/blog/projects/serial-console.html
   Main PID: 6546 (login)
      Tasks: 1 (limit: 9257)
     CGroup: /system.slice/system-getty.slice/getty@ttyACM0.service
             └─6546 /bin/login -p --

11月 30 12:00:00 raspi-ubuntu systemd[1]: Started Getty on ttyACM0.
11月 30 12:00:01 raspi-ubuntu login[6546]: pam_unix(login:auth): check pass; user unknown
11月 30 12:00:01 raspi-ubuntu login[6546]: pam_unix(login:auth): authentication failure; logname=LOGIN uid=0 euid=0 tty>
11月 30 12:00:03 raspi-ubuntu login[6546]: FAILED LOGIN (1) on '/dev/ttyACM0' FOR 'UNKNOWN', Authentication failure
lines 1-15/15 (END)

orange pi zero 側の設定。

agetty が USBで起動したら、Orange Piの gettyを止める。

systemctl disable serial-getty@ttyGS0.service
systemctl stop    serial-getty@ttyGS0.service
systemctl status  serial-getty@ttyGS0.service

停止した。

root@OrangePi:~# systemctl status serial-getty@ttyGS0.service
● serial-getty@ttyGS0.service - Serial Getty on ttyGS0
   Loaded: loaded (/lib/systemd/system/serial-getty@.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/serial-getty@ttyGS0.service.d
           └─10-switch-role.conf
   Active: inactive (dead) since 火 2021-11-30 03:10:14 UTC; 1s ago
     Docs: man:agetty(8)
           man:systemd-getty-generator(8)
           http://0pointer.de/blog/projects/serial-console.html
 Main PID: 11293 (code=killed, signal=TERM)

11月 30 03:05:10 OrangePi systemd[1]: Started Serial Getty on ttyGS0.
11月 30 03:05:10 OrangePi sh[11290]: /bin/sh: 1: cannot create /sys/bus/platform/devices/sunxi_usb_udc/otg_role: Directory nonexistent
11月 30 03:10:14 OrangePi systemd[1]: Stopping Serial Getty on ttyGS0...
11月 30 03:10:14 OrangePi systemd[1]: Stopped Serial Getty on ttyGS0.

Orange PiZero から Raspiのagetty へ USB経由で接続する。

screen /dev/ttyGS0 115200

つながった!

f:id:takuya_1st:20211130235739p:plain

USB-OTG でシリアルコンソール。

USBシリアルコンソールなので、OTGを使うと、USB接続側のどちらかで待ち受ける事ができる。agetty を起動させた側がログインされる側。になる。

Pi zero があると

Pizeroで、シリアルコンソールがついてない機器にUSBでシリアルコンソールを追加できる。

Pi Zero にSSHログインすることにより、リモート・シリアルコンソールを作ることができる。それもUSB1本の接続で電源・シリアルコンソールの両方ができる。USB接続だけで完結するので強い。

USBが接続されたタイミングで起動する。

どうやるのか。

sudo systemctl enable getty@ttyACM0.service

とりあえず,enable しておけば大丈夫だと思う。

厳密にやるには、usb デバイスをudev でみて、systemdで units に wantedby を書けばいいのだろうが・・・・

[Unit]
Description=Getty on ttyACM0
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

Conflicts=rescue.service
Before=rescue.service

ConditionPathExists=/dev/tty0

[Service]
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear ttyACM0 $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=ttyACM0
TTYPath=/dev/ttyACM0
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION

[Install]
WantedBy=sys-devices-platform-scb-fd500000.pcie-pci0000:00-0000:00:00.0-0000:01:00.0-usb1-1\x2d1-1\x2d1.4-1\x2d1.4:2.0-tty-ttyACM0.device

wanted by で使うデバイスは、systemctl list-units -t device | grep -i serial でなんとかできる。

systemdでは「デバイスが存在する」状態をunit として管理してて、それを一覧するのが次のコマンド。

systemctl list-units -t device

実際の例。

takuya@raspi-ubuntu:~$ systemctl list-units -t device | grep -i serial
  sys-devices-platform-scb-fd500000.pcie-pci0000:00-0000:00:00.0-0000:01:00.0-usb1-1\x2d1-1\x2d1.4-1\x2d1.4:2.0-tty-ttyACM0.device              loaded active plugged Linux-USB Serial Gadget (CDC ACM mode)
  sys-devices-platform-soc-fe201000.serial-tty-ttyAMA0.device                                                                                   loaded active plugged /sys/devices/platform/soc/fe201000.serial/tty/ttyAMA0
  sys-devices-platform-soc-fe215040.serial-tty-ttyS0.device                                                                                     loaded active plugged /sys/devices/platform/soc/fe215040.serial/tty/ttyS0

いろいろ試したけど、ここまでする必要はないと思う。

まとめ

USB-OTGで、手軽にリモートアクセスできるシリアル通信を追加することができる。

今回、実験に使ったのはOrange Pi Zero ですが、USB-OTGでシリアルコンソールが可能です。Raspi Zero でも可能です。

f:id:takuya_1st:20211201004339p:plain:w300

Pi Zeroへログインする記事が多いですが、リッスンさせる agetty を起動する側次第で、Pi zero経由でログインもできるようになる事がわかりました。USBケーブル一本で、任意のPCにリモートコンソールが追加できてとても便利です。intel vPro のようにBIOSアクセスはできませんが、市販マザーボードではGRUB/initramfsへアクセスできるだけでも有益です。ネットワーク実験でいちいち設置場所に行かなくてもいいですしね。

RaspberryPi zero は SSH接続しなくても、USB接続でログインすることができます。

rPiで検索するとSSHばかりですが、pi zero に限りOTGが使えるので、USBではシリアル通信ができます。

世の中の記事は、pi zero へ ログインする話ばかりですが、'pi zero から'ログインする事もできます。「なんの意味があるのそれ」と思うかもしれませんが、リモートからSSH経由でpi zero にログインし、その先に接続したPCへログインし、テレワークのリモート管理に役立てることができるのです。

今回使った機器 / Orange Pi Zero

raspi -- raspi zero だと記事がわかりづらくなるので、あえて Orange Pi Zero を使っています。

Orange Pi Zero は日本のAmazonでも変えますがAliexpressなど中華サイトの通販のほうがいいかもしれませんね。

ちなみに、なんちゃらPiのなかでも特にOrange Piは、発熱がすごいので長時間運用するには向きません。

参考資料