Raspberry Pi4 と Mac のみで始めるラズパイ初期設定 (USB-OTG)


## 用意するもの
- Raspberry Pi4 x1
 - "[raspios_lite_arm64-2020-08-24/](https://downloads.raspberrypi.org/raspios_lite_arm64/images/)"を使用
- MicroSD x1
- TypeC to TypeC (通信可能なもの)
- TypeC接続できるPC

###USB OTG（USB On-The-Go）とは？
こちら[サンワプライ様の公式HP](https://www.sanwa.co.jp/seihin_joho/otg/index.html)から拝借しました。
https://www.sanwa.co.jp/seihin_joho/otg/index.html
>USB機器同士を接続して使うために制定されたUSBインターフェース規格で、USB IF（Implementers Forum、USBの規格制定団体）が2001年12月にUSB2.0に追加する仕様として定められました。「USB On-The-Go」、「USB OTG」とも表記される。

##Raspberry Pi4 簡易設定
今思っていること
~~「もしかしたらWi-Fi設定いらなくね？」~~
 <font color="Red">↑やっぱり必要ありませんでした。</font>
とりあえずやって行きましょう。
まずやること

- ssh設定
  - boot以下に`ssh`ファイルの作成
- ~~WiFi設定~~ <font color="Red">(今回はTypeC経由でネット接続するので設定は行いません)</font>
  - ~~`boot/wpa_supplicant.conf`へ記述~~
- USB-OTG設定
  - `boot/config.txt` 編集 末尾に`dtoverlay=dwc2`という1行を追記
  - `boot/cmdline.txt` 編集 `rootwait`のうしろにスペースひとつ空け`modules-load=dwc2,g_ether`を追記
  - ここを参考: [Web記事:Raspberry Pi 4とMacをUSB type Cケーブルで接続してMacのインターネット接続を共有する手順](https://dev.classmethod.jp/articles/raspberry-pi-4-develop-with-mac-using-usb-c-cable-2/)
- Macbook to RaspberryPi4 (TypeC to TypeC)接続の確認


### ssh設定
macでマウントしているMircoSDの`/boot`以下へ`ssh`ファイルを作成する

```zsh:macのshellで実行
touch /Volumes/boot/ssh
```
### WiFi設定
<font color="Red">今回はUSB-OTGを使用しbridgeし通信させるのでWi-Fi設定はしません。</font>
本来の趣旨とは変わってしまいますが、Wi-FI設定までしたい方は下記のように`/Volumes/boot/wpa_supplicant.conf`へ書き込みます。

```vim:/Volumes/boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=JP
network={
     ssid="アクセスポイント名"
     psk="パスワード"
}
```
できればコマンド1つで書き込みたいので下記を実行します。

```zsh:Macのshellで実行
echo 'Wi-Fiの設定' && \
{
	echo 'ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev'
	echo 'country=JP'
	echo 'network={'
	echo '    ssid="アクセスポイント名"'
	echo '    psk="パスワード"'
	echo '}'
} > /Volumes/boot/wpa_supplicant.conf && \
cat /Volumes/boot/wpa_supplicant.conf
```

### USB-OTG設定
この記事を参考にしました。 
[Web記事:Raspberry Pi 4とMacをUSB type Cケーブルで接続してMacのインターネット接続を共有する手順](https://dev.classmethod.jp/articles/raspberry-pi-4-develop-with-mac-using-usb-c-cable-2/)
[Web記事:【2019年12月版】ラズパイとMacの接続はUSB-C ケーブルだけでOK？！→ラズパイ七変化@qiita](https://qiita.com/koinori/items/ee81e1815de9e4d7f15d#%E4%BB%96%E3%81%AE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B)
今回面倒を減らすために`sed`コマンドを使用し置換作業をします。
MacにLinuxで採用されてる`GNU版sed`を`brew`を使いインストールしてください。
Macにインストールされている`sed`とLinuxの`sed`は別物です。
この[Web記事:MacでGNU版sedを使う@くにぽんず☆きちめきパラダイス](https://kunipon.com/3306)を参考にしてください。

```zsh:Macのshellで実行
brew install gnu-sed
```
```zsh:Macのshellで実行
echo 'USB-OTGの設定' && \
cp /Volumes/boot/config.txt /Volumes/boot/config.txt.bak && \
cp /Volumes/boot/cmdline.txt /Volumes/boot/cmdline.txt.bak && \
echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt && \
gsed -i "s/rootwait/rootwait modules-load=dwc2,g_ether/g" /Volumes/boot/cmdline.txt
```
やってること-

- 念の為この２つをバックアップ
 - `/Volumes/boot/config.txt`
 - `/Volumes/boot/cmdline.txt`
- `config.txt`の編集
 - `dtoverlay=dwc2`を末尾へ追記
- `cmdline.txt`の内容を`sed`コマンドを使用し編集
 - `rootwait`の文字列を`rootwait modules-load=dwc2,g_ether`へ置換


## ここまでのまとめ

```shell:Mac
brew install gnu-sed
```
```shell:Mac
touch /Volumes/boot/ssh && \
echo 'USB-OTGの設定' && \
cp /Volumes/boot/config.txt /Volumes/boot/config.txt.bak && \
cp /Volumes/boot/cmdline.txt /Volumes/boot/cmdline.txt.bak && \
echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt && \
gsed -i "s/rootwait/rootwait modules-load=dwc2,g_ether/g" /Volumes/boot/cmdline.txt
```

### Macbook to RaspberryPi4 (TypeC to TypeC)接続の確認
さて,RaspberryPi4へMicroSDを挿しMacとTypeCケーブルで繋ぎましょう
電源が入ったのをLED点灯で確認したらMacの環境設定->共有の設定から
`①RNDIS/Ethernet Gadget`
`②インターネット共有`の順でチェックを入れてください。
ウイルス対策ソフトなどによっては画像のように新規ネットワークが検出されますので適宜対応してください。
![スクリーンショット 2021-01-18 14.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/ea342ecc-9666-870c-e624-516f90bd565e.png)

`arp`コマンドでIP-Addressの確認
今回Wi-Fiなどの設定はしてないので少し変わったIPアドレスが設定されているはずです。
`ssh pi@ipアドレス`もしくは
`ssh pi@raspberrypi.local`で接続してください。
もし弾かれた方はpingを送りIPアドレスを確認後`ssh-keygen`コマンドで削除してから再接続してみてください。

```shell:Macとssh接続できない場合
ping raspberrypi.local
ssh-keygen -R IPアドレス
```

```zsh:Macのshellで実行
arp -a
```
![スクリーンショット 2021-01-18 23.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/e64db489-67e4-022d-70d4-44210410c966.png)


### Raspberry Pi4初期設定 CLI (ヘッドレス設定)
最後は簡単に初期設定をしていきましょう。
今回は`raspi-config`をCLIから利用できる`nonint`で設定していきます。
`raspi-config nonint`の詳しい設定はこの[Git-Hubのソースコード](https://github.com/raspberrypi-ui/rc_gui/blob/master/src/rc_gui.c)を参考にしてください。
今回やっていいることは以下のとおりです。

- 日本時間に合わせる
- localeをja_JP.UTF-8に変更する
- Wi-Fi利用国に日本を設定し,Wi-Fiのロックを解除する
- リポジトリを国内のミラーサイトに変更する
- aptアップデート&アップグレード
- NASなどで使うファイルシステム（NTFS, exFat）をインストール
- githubアカウントに登録している公開鍵を raspiに登録
- IP固定化(USB-OTG)
- hostnameの設定

```shell:RaspberryPi
sudo raspi-config nonint do_change_timezone Asia/Tokyo && \
sudo raspi-config nonint do_change_locale ja_JP.UTF-8 && \
sudo raspi-config nonint do_wifi_country JP && \
sudo sed -i "s/deb.debian.org\/debian /ftp.jp.debian.org\/debian /g" /etc/apt/sources.list && \
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && \
sudo apt install -y exfat-fuse exfat-utils ntfs-3g && \
ssh-import-id gh:自分のGit-Hubユーザ名 && \
echo 'IP固定化の設定' && \
{
  echo '#イーサネットLANケーブルで接続する際のIP設定--------------'
  echo 'interface eth0'
  echo 'static ip_address=192.168.0.15/24'
  echo 'static routers=192.168.0.1'
  echo 'staitc domain_name_servers=192.168.0.1 8.8.8.8 8.8.4.4'
  echo '#Wi-Fiで接続する際のIP設定--------------'
  echo 'interface wlan0'
  echo 'static ip_address=192.168.0.15/24'
  echo 'static routers=192.168.0.1'
  echo 'staitc domain_name_servers=192.168.0.1 8.8.8.8 8.8.4.4'
  echo '#USB-OTGで接続する際のIP設定------------'
  echo 'interface usb0'
  echo 'static ip_address=192.168.2.15/24'
  echo 'static routers=192.168.0.1'
  echo 'staitc domain_name_servers=192.168.0.1 8.8.8.8 8.8.4.4'
} >> /etc/dhcpcd.conf && \
echo 'ネットワーク設定を表示します' && \
cat /etc/dhcpcd.conf && \
sudo raspi-config nonint do_hostname raspi4 && \
echo 'USB-OTGのIPアドレスは 192.168.2.15 に設定されています' && \
echo 'Wi-Fiの設定' && \
{
    echo 'ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev'
    echo 'country=JP'
    echo 'network={'
    echo '    ssid="アクセスポイント名"'
    echo '    psk="パスワード"'
    echo '}'
} > /Volumes/boot/wpa_supplicant.conf && \
sudo reboot
```

## 終わりに
大変お疲れさまでした。
後でWi-FI設定をすると予想以上に手間だったのでここで書き込んでしまうことにしました。
あまりUSB-OTGの趣旨とは違ってしまいますが私の備忘録ですのでご了承ください。
これでいろいろな接続機器がいらなくなり手元で簡単にラズパイを使えるようになりました。
この`USB-OTG`という機能はどうやら`RaspberryPi3 B+`などの`USB to USB Type-MicroB`でも動作するようです。OSは他のOS例えば`Ubuntu`とかでもできるんですかね？
モジュールが用意されていればできそうですよね？
また時間があるときに色々試して行きたいと思います。

--追記 2021/01/20
ubuntuはわかりません。
ubuntuでは最初の状態で`g_ethr`モジュールが読み込めてない(と言ううより無い)気がしています。
[ここ](https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1861070)でバグとして報告され修正されているようですがちょっと初期状態での始め方は見つけれませんでした。ここの報告はあくまで起動後にUSB-OTGを試しているような気がしてます。
https://bugs.launchpad.net/ubuntu/+source/linux-raspi2/+bug/1861070