前回は、手動でSlip over VCPを設定していたのですが、複数台の異なるターゲットを接続する場合も想定すべきではと考えたものの、これを一々設定するのはミスもあるし面倒なので何か良い方法はないかと思案したところ、linux側でudevから接続設定を自動で行うようにすればよいのではと思い、トライしてみました。
まず最初に、全体の構成を記述しておきます。
1. udevにてNucleoのID_SERIAL_SHORTを識別子として利用。 2. udev rule から、systemd を呼び出す。 3. systemdから、さらに、前述のID_SERIAL_SHORT識別子ごとに異なるslip接続を立ち上げるスクリプトを呼び出す。 少しややこしいですね。というのも、実はudevから3のスクリプトを直接よびだしても、5秒ほどでスクリプトがkillされるからです。したがって、対処として、1と3の間に2のsystemdを入れました。こうすることで、udevが呼び出したsystemdスクリプトから呼び出したスクリプトの場合、udevがkillしない/killできないdaemonを実行すること(今回はslattach)ができるからです。説明してもややこしいのは変わりありませんが、設定は比較的簡単です。以下設定です。 1. /etc/udev/rules.d/80-slip-over-vcp.rules の作成
1. udevにてNucleoのID_SERIAL_SHORTを識別子として利用。 2. udev rule から、systemd を呼び出す。 3. systemdから、さらに、前述のID_SERIAL_SHORT識別子ごとに異なるslip接続を立ち上げるスクリプトを呼び出す。 少しややこしいですね。というのも、実はudevから3のスクリプトを直接よびだしても、5秒ほどでスクリプトがkillされるからです。したがって、対処として、1と3の間に2のsystemdを入れました。こうすることで、udevが呼び出したsystemdスクリプトから呼び出したスクリプトの場合、udevがkillしない/killできないdaemonを実行すること(今回はslattach)ができるからです。説明してもややこしいのは変わりありませんが、設定は比較的簡単です。以下設定です。 1. /etc/udev/rules.d/80-slip-over-vcp.rules の作成
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", \ RUN+="/bin/systemctl start slip-over-vcp@$env{ID_SERIAL_SHORT}-%n" ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \ RUN+="/bin/systemctl start slip-over-vcp@$env{ID_SERIAL_SHORT}-%n" ACTION=="remove", SUBSYSTEM=="tty", \ RUN+="/bin/systemctl stop slip-over-vcp@$env{ID_SERIAL_SHORT}-%n"2. udevのリロード
udevadm control --reload3. systemd スクリプトの作成
# ファイル名 /etc/systemd/system/slip-over-vcp@.service にて以下の内容で作成(注:@以下もファイル名の一部です。) [Unit] Description=SLIP over VCP for Nucleo devices [Service] Type=forking Environment="ARGS=%I" ExecStart=/usr/local/sbin/nucleo-slip-over-vcp.sh "$ARGS" [Install]4. systemdスクリプトの登録
systemctl enable slip-over-vcp@.service5. systemdスクリプトが呼び出す識別子別に設定を記述したslip自動接続スクリプト
# ファイル名 /usr/local/sbin/nucleo-slip-over-vcp.sh (chmod +x) #!/bin/bash if [ $# = 0 ]; then exit 0 fi serial=`echo $1 | awk '{print $1}' FS=/` ifno=`echo $1 | awk '{print $2}' FS=/` case "$serial" in "066AFF56WWWWXXXXYYYYZZZZ" ) devname="ttyACM$ifno" ipaddr=10.0.0.1 netmsk=255.255.255.0 ppaddr=10.0.0.2;; "0671FF48WWWWXXXXYYYYZZZZ" ) devname="ttyACM$ifno" ipaddr=10.0.1.1 netmsk=255.255.255.255 ppaddr=10.0.1.2;; "0034002BWWWWXXXXYYYYZZZZ" ) devname="ttyACM$ifno" ipaddr=10.0.2.1 netmsk=255.255.255.255 ppaddr=10.0.2.2;; *) exit 0 esac slattach -d -p slip -s 115200 /dev/$devname 2>&1 > /tmp/sov-$devname.log & sleep 1 && slif=`cat /tmp/sov-$devname.log | grep interface | awk '{print $6}'` ip link set dev $slif up ip addr add dev $slif local $ipaddr/$netmsk remote $ppaddr # ifconfig $slif $ipaddr netmask $netmsk pointtopoint $ppaddr up exit 0なお、ID_SERIAL_SHORTなどは、以下のコマンドで確認できます。
udevadm info /dev/ttyACM06. iptablesにて、Nucleoからのパケットをマスカレード
# Generated by iptables-save v1.8.5 on Tue Dec 15 11:16:25 2020 *filter :INPUT ACCEPT [20829:1598126] :FORWARD ACCEPT [20:1620] :OUTPUT ACCEPT [15478:2023565] COMMIT # Completed on Tue Dec 15 11:16:25 2020 # Generated by iptables-save v1.8.5 on Tue Dec 15 11:16:25 2020 *nat :PREROUTING ACCEPT [4073:523053] :INPUT ACCEPT [82:16109] :POSTROUTING ACCEPT [2:120] :OUTPUT ACCEPT [19:1277] -A POSTROUTING -o enp3s0 -j MASQUERADE -A POSTROUTING -o sl0 -j MASQUERADE -A POSTROUTING -o sl1 -j MASQUERADE -A POSTROUTING -o sl2 -j MASQUERADE -A POSTROUTING -o sl3 -j MASQUERADE COMMIT # Completed on Tue Dec 15 11:16:25 2020該当部分は"-A POSTROUTING -o slx -j MASQUERADE"のところです。 設定は以上です。後はLinux機にNucleoを差し込むだけです。正常に動作していれば、slattachのプロセスが立ち上がり、network interface slxが立ち上がります。
9: sl0:また、取り外すと、systemdがslattachのプロセスを終了させ、networkインターフェースもなくなるようになっています。slipの設定をしていないNucleoを同時に接続しても動作できること、複数台の接続も確認しています。linux再起動時に差し込んだままでも認識しました。今回は以上です。それでは。mtu 296 qdisc pfifo_fast state UNKNOWN group default qlen 10 link/slip inet 10.0.1.1 peer 10.0.1.2/32 scope global sl0 valid_lft forever preferred_lft forever 10: sl1: mtu 296 qdisc pfifo_fast state UNKNOWN group default qlen 10 link/slip inet 10.0.2.1 peer 10.0.2.2/32 scope global sl1 valid_lft forever preferred_lft forever
コメント
コメントを投稿