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
これで、よくある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
これで、両方から通信で、単純に文字列が送信できることがわかります。
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
最初の逆をやろう。
シリアルコンソールを使って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
つながった!
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 でも可能です。
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は、発熱がすごいので長時間運用するには向きません。
参考資料
- https://qiita.com/propella/items/dcc1c14f71e5f06f3a88
- https://oshlab.com/enable-g_serial-usb-otg-console-orange-pi-armbian/
- https://qiita.com/k5n/items/5cb7105c2156f53f9e44 ← 冒頭でRaspberry pi A/B/B+/Zero/zero W全般がUSBシリアルコンソールを使えるような記述に疑問を感じる。zero/A/4が対応です。