Arduino 開発環境の Linux 版インストーラを調べる

ワークショップなどの環境構築として、PCをLinuxで構成し、

cf.,「ワークショップ用PCを USB起動の Ubuntu で構成する」
https://qiita.com/nanbuwks/items/785a28b6baf3a77cae5b

そのうえで Arduino 環境をポータブル化したものを使用しています。

cf.,「AKBONE2020 用の Windows ポータブル開発環境を構築する ( LGT8F328P - Arduino の設定 )」
(注：Windows用の記事です)
https://qiita.com/nanbuwks/items/fc887d1d354c544a4288



なのですが Linux 上で ポータブル化 Arduino 開発環境を使う場合、そのままでは動かないことがあります。

インストーラを実行すればいいのですが、 Linux 版 Arduino インストーラは何をしているのでしょうか？

調べた備忘録です。




# 環境

- Ubuntu Linux 20.04
- Arduino 1.8.13 Linux 64bit 版

# ディレクトリ構成

ポータブル環境はこのようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/523cd369-8cd7-8379-e809-84293507a391.png)

これはほぼ arduino-1.8.13-linux64.tar.xz を解凍した状態です。
上記は解凍した状態に「portable」フォルダのみを追加しています。


この中にそれっぽいものが2つありますね。

- install.sh
- arduino-linux-setup.sh

# install.sh 
何をしているのかな？

xdg 環境の場合、インストールとアンインストールの場合分けとなり、インストールの場合は以下のようにしているようです。

- xdg-icon-resource install などでアイコンの登録や mimetypes の登録
- xdg-desktop-icon などでデスクトップにアイコンを登録
- xdg-mime defaut などで Arduino IDE をデフォルトアプリケーションとして登録
- ln -s コマンドで arduino IDE を解凍した場所を /usr/local/bin/arduino に登録
- ./arduino-linux-setup.sh を呼び出す

非 xdg 環境の場合、インストールとアンインストールの場合分けとなり、インストールの場合は以下のようにしているようです。

- デスクトップアイコンをデスクトップディレクトリに登録
- ln -s コマンドで arduino IDE を解凍した場所を /usr/local/bin/arduino に登録
- ./arduino-linux-setup.sh を呼び出す


# ./arduino-linux-setup.sh


末尾付近に以下のように記述されていて、これがメイン処理となります。

```


    groupsfunc $1

    removemm

    acmrules $1 > /tmp/90-extraacl.rules

    openocdrules > /tmp/98-openocd.rules

    avrisprules > /tmp/avrisp.rules

    dfustm32rules > /tmp/40-dfuse.rules

    dfuarduino101rules > /tmp/99-arduino-101.rules

    sudo mv /tmp/*.rules /etc/udev/rules.d/

    refreshudev

    echo ""
    echo "*********** Please Reboot your system ************"
    echo ""

```


##    groupsfunc $1

dialout や tty, uucp へのアクセス権をインストーラを実行したユーザに追加します。

##    removemm


悪いことをする悪いモデムマネージャを削除します。

##    acmrules $1 > /tmp/90-extraacl.rules

ttyUSB と ttyACM へのアクセス権をインストーラを実行したユーザに追加します。

## 個別機種用の UDEV ルールの追加

-  openocdrules > /tmp/98-openocd.rules
 - Arduino M0/M0 Pro 用の CMSIS-DAP のための UDEV ルールを追加します。
-  avrisprules > /tmp/avrisp.rules
 - AVRisp 用の UDEV ルールを追加します。
-  dfustm32rules > /tmp/40-dfuse.rules
 - STM32 の USB bootloader mode での UDEV ルールを追加します。
- dfuarduino101rules > /tmp/99-arduino-101.rules
 -  Arduino 101 での DFU Mode での UDEV ルールを追加します。



##    sudo mv /tmp/*.rules /etc/udev/rules.d/



作成したUDEV ルールを本番ファイルに反映します。

##    refresrehudev


UDEV ルールをリロードします。


```

    echo ""
    echo "Restarting udev"
    echo ""

    sudo udevadm control --reload-rules
    sudo udevadm trigger

    if [ -d /lib/systemd/ ]
    then
        sudo systemctl restart systemd-udevd
    else
        sudo service udev restart
    fi

```



##    echo "*********** Please Reboot your system ************"


再起動が必要な旨表示して終了します
再起動が必要な理由は何かな？

udev の変更については  refresrehudev の項目を見ると再起動しなくても反映していそうです。

 groupsfunc $1 で  dialout や tty, uucp へのアクセス権をインストーラを実行したユーザに追加する件、これが再起動ないし再ログインが必要な理由です。


# ポータブル環境でのインストーラの考察

install.sh はファイルの関連付けやデスクトップアイコンの登録、デフォルトプログラムの設定となりますが、既存環境を破壊するのでポータブル環境上で実行するのは問題がありそうです。

しかしながら、 arduino-linux-setup.sh は主にUSBデバイスのアクセス権の問題を解決するために行われます。
こちらは実行するのが良さそうですが、反映は再起動が必要で、ポータブル環境がライブ環境出会った場合は再起動すると設定が消えてしまいます。
このような場合、アクセス権だけであれば Arduino IDE を sudo などで動かすことで解決するという方法も考えることができます。

問題は 「 groupsfunc $1 」内部で使っている groupadd の反映に再起動が必要なことです。もしかして grpconv を使うとどうにかなるかな？ 調査中です。