LAN内PCのIPアドレス探索ツール「rclshark」について
IPアドレス探索ツールを作成し、そのバージョン1.0.0をリリースすることができたので報告します。
追記:$ arp -a
で探せるらしいです。知らんかった…❗でも、こっちは「確実に」見つけ出します。
経緯など
このツールのコンセプトは至ってシンプル。
「ネットワーク内のリモートデバイスのIPアドレスを見つける」
です。みなさんは、このような経験ありませんか?
ディスプレイに接続されていないPCを操作したり状態を確認したりするときはSSH接続を行ってそのPCにアクセスします。みなさんおなじみの操作ですね。
しかし、初期セットアップ時やネットワーク構成が唐突に変更されたとき、あるいはあなたがホストPCと一緒にラズパイのIPアドレスの記憶喪失に陥った場合どうでしょうか?
そうならないようにするための対策方法はいくつかあります。
- LCDディスプレイなどでIPアドレスを表示
- 固定IPを振って目印をつける
- Wiresharkなどのネットワークアナライザを使う
- 総当りでSSH接続する(?????)
- arpコマンドで探す(見つからない…)
特に初心者のうちは十分な対策を行わないままセットアップを終わらせしまい、本番環境などで「あ゛ぁ💢」ってなることもあるでしょう(筆者の頭の中)
私も、別の研究でラズパイを使うのですが、ネットワーク設定をしばしば変えることがあり、もはや固定IPなんて怠惰を極めた私の前では意味をなしません。バリバリDHCP派です。
しかし、DHCPによるIPアドレス割り当ては何かと不便です。そこで、なんとかして起動時にIPアドレスを配信してLAN内なら簡単にIPアドレスを見つけられるシステムを作ろうと思いました。IPアドレスがホストPC内で見つかればいちいちそんなメモ紙を用意することなくIPアドレスを見つけてさっさと接続できるようになります。
私はその仕様を満たすためにROS2のDDSによるノードの仕様を活用しました。
DDSはPub/Subの性質を持ったマルチキャスト形式のデータ転送を提供するツールで、ネットワークを介した分散システムによく活用されています。ROS2はこのシステムを採用することでノード発見のためにROS1では必要だったマスタサーバが不要となりました。つまり、ネットワーク内のPCが起動時にROS2プログラムを立ち上げればDHCPで振られたIPアドレスでもノード発見が勝手に行われます。
そして、ROSではそのノードに名前を振ることができます。ここまで来たら、勘のいい皆さんはお気づきでしょう。
そうです。ノード名をIPアドレスにしてしまえば簡単にPCのIPアドレスを特定できてしまいます!
この目的を作成する時間についてはそれほど時間がかかりませんでした。なぜなら、以前それに似たツールは作ったことがあるからです。
過去のブログで取り上げています👇
名称は、少し悩んだ末に「rclshark」にしました。言葉の要素はrcl(ROS Client Library)+shark(サメという意味だが、wiresharkというソフトのリスペクト)です。
wiresharkはIPアドレスを探索するツールではない(可能ではある)ですが、私がwiresharkを扱った機会がvelodyneのIP探索だったのでそれに引っ張られました。
さて、rclsharkを実装したわけですが意外とコレ使えるぞ!ということで少し拡張したツールも作りました。それが「rclshark-smi」というシステムモニタです。このツールについては後述します。
本当はこんなドキュメントを書く予定はありませんが、以下のツイート後になぜかスターが次々と付き、ドキュメントを出していないのに12スターつくという意味がわからない状況になってしまいました。
これまで人のライブラリにフリーライドしていただけで1つくらいはオリジナルプログラムを…!とは思っていたので、予想外にスターがついたのは嬉しく、勢いに任せてドキュメントを整えようといろいろと環境を作っていました。このプログラムを作る過程で得たDockerfileの作り方やサービスの作り方などについても書こうと思っています。それらについてはもう少し実装を重ねた上で別途解説したいと思います。
お試し
この記事では、できるだけ簡単にこのプログラムを体験してほしいと思うので、ラズパイなどのリモートデバイスを使わずに試す方法について記述します。ラズパイ10台持っている人なんてそうそういませんからね…
このチュートリアルではUbuntuを前提としています。また、DockerとROS2-Foxyが必要なのであらかじめインストールしておいてください。
まず、ホストマシンのros2の環境を作ります。ワークスペースは~/ros2_ws
とします。
$ source /opt/ros/foxy/setup.bash
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src
$ git clone --recursive https://github.com/Ar-Ray-code/rclshark.git
$ cd ~/ros2_ws
$ colcon build
$ source ~/ros2_ws/install/setup.bash
これでOKです。--recursive
オプションは忘れないように注意してください。
次に、仮想のデバイスをDockerイメージを使って構築します。試しに3台分作りましょう。
Docker Hubからイメージを落としてきます。
$ docker pull ray255ar/rclshark
タブを3つ開いてそれぞれ次のコマンドを入力して実行します。
$ docker run -it --rm ray255ar/rclshark
ROS2をロードした4つ目のターミナルでノードを見てみましょう。
$ ros2 node list
見えました❗
他のノードをフィルタしたいときは | grep _end
か| grep ip_
などキーワードで絞りましょう。
rclshark-smi
rclshark-smiは、「他のコンピュータのステータスも確認できれば面白いよなー」という私の気まぐれが生み出したプログラムです。これまでは遠隔のラズパイのCPU使用率やメモリ使用率を確認するためにはSSHログインしてhtopで確認するのが定番でしたが、複数台はまぁ面倒です。このツールはそんな「面倒」を1つの画面で実現してしまいます。
先ほどのタブでrclshark-smiを実行します。
$ ros2 run rclshark-smi rclshark-smi
3つのDockerコンテナのIPアドレスとCPU温度などの情報が見れます!Dockerコンテナなのでほぼ同じ情報ですが、ラズパイの場合はそれぞれの値をモニタで見ることができます。現在、不具合でノードが1つでも終了するとフリーズしてしまい、5秒後にタイムアウトを起こしてしまいます。その際はrclshark-smiを再度起動してください。
※追記(2021/09/25):v1.0.2では1回のみの表示にしています。
rclshark-web (2021/09/25追記)
rclshark-webは、技育展2021の登壇に向けて作成したWeb画面でのグラフ表示ツールです。
コンセプトは、「より闇のハッカーらしく」(痛い)。
rclshark-smiをCSV出力のために改造したバックエンドツールである「rclshark-bridge」とそのCSVをもとにブラウザ上で表示させるためのウェブサーバ構築ツールである「rclshark-web」を使用して表示させています。
これまでWebデザインやグラフ表示などをしてこなかったので躓いたっところも多々ありましたが、なんとか実現できてよかった!サポート企業様には頭が上がりません🙇🙇🙇
👇Web画面関連のリポジトリはこちらから
コンピュータ内にインストール
もちろんDocker内ではなくコンピュータに入れることもできます。対象のコンピュータやラズパイに対して次のコマンドを入力します。
$ git clone --recursive https://github.com/Ar-Ray-code/rclshark.git
$ sudo bash rclshark/install.bash foxy
# $ systemctl start rclshark.service
GUIログインだとシステムが起動しません。このシステムは元々multi-user-targetのシステムを対象にしているからです。
どうしても起動したい場合は、rclsharkに存在するserviceファイルのレベルをmulti-user-targetからgraphical-user-targetにするか、Ctrl+Alt+F2
を押してCUIログインしてsudo systemclt start rclshark.service
と実行してください。その後にCtrl+Alt+F1
でGUIに戻ってください。
※追記(2021/09/25):v1.0.1よりGUI上でもインストール可能です。
このインストール作業はホストPCにも有効で、このインストールを行うと、rclshark-smi
コマンドが使えるようになります。これは、ROS2の環境をロードせずとも使えます。めちゃ便利❗
アンインストールするときは次のコマンドを使います。先ほどインストールに使ったフォルダに対して次のコマンドを実行します。
$ sudo bash ~/ros2_ws/src/rclshark/install.bash uninstall
アンインストールも簡単!
最後に
まず、私のリポジトリに興味を持ちこの記事を読んでくださったことに感謝申し上げます。そしてぜひこのプログラムを試してほしいです。
分からないところやバグなどの報告があればぜひ以下のリポジトリにissueを送ってください。できる限り対応します。
また、このプログラムはPythonで動いているのでpsutilパッケージが使えれば基本的にどのプラットフォームでも動くと思います。それらの動作確認&サポートもしていきたいと思います❗
👇リポジトリはこちらから
👇紹介ページ(ほーむぺーじ)はこちらから
Discussion