ラズパイ5をusb-cケーブルでMacBookと繋いでインターネットに接続した話【非wifiヘッドレスの裏ルート】



# はじめに
- [前回](https://qiita.com/kei2y/items/2815002705fcf4c994f0)は正攻法で攻めたので、今回は裏ルートで攻めることとした。
- ラズパイ4の場合は、usb-cケーブルでmacと繋ぐのは割と普通みたいだけど、ラズパイ5（以下、pi5）は、一手間が必要。たどり着いてみたら大したことないみたいだけど、日本語での成功例の情報が皆無だから、英語の掲示板が頼りだった。もしかしたら、pi5だから大変なのではなくて、bookwormのせいだというなら、rpiosの最新版では、pi4でも同じように大変なのかもしれない。
- ちなみに前回と同じく、MacBookAir M3を母艦とした。

# 海外の掲示板で見つけた方法
- ネットで見つけた方法を2つ紹介すると、こんな感じ。
- [この人](https://github.com/verxion/RaspberryPi/blob/main/Pi5-ethernet-and-power-over-usbc.md)のやり方は、自分もやってみたけど、うまくいかなかった。母艦で「RNDIS/Ethernet Gadget」が認識されない。この人の場合は、ipadで繋がった、という話だったので、macbookは駄目なのかな？と諦めた。でも、ふと思いついて、古いmacbook(12インチ)に繋いだら認識されて、もしかしてと思って、母艦(M3air)にusb2.0規格のusb-cケーブルで繋いだら認識した。そんなの、気づくわけないじゃん。でもまあ、この人のやり方は、成功例として紹介されてもいいのではないか。
    - 上の人のやり方に[助言している人](https://forums.raspberrypi.com/viewtopic.php?p=2203146#p2203146)が[おすすめしていたやり方](https://forums.raspberrypi.com/viewtopic.php?t=364247)。これは、そのままやったら駄目だった。少し工夫が必要だったけど、上の人が遠回りなことをしてることが理解できた。よって、これをベースに紹介する。でも、実際に問題を解決して接続を実現したのは上の人のやり方だから、上の人に敬意を払いたい。

# 有線LANアダプタなしで非wifiヘッドレスでのインストールに挑戦したい人向け（非推奨）
- 今回紹介するのは、[前回](https://qiita.com/kei2y/items/2815002705fcf4c994f0)からの続きとなる。つまり、有線LANアダプタが必須と言うことになるけど、[おすすめしていたやり方](https://forums.raspberrypi.com/viewtopic.php?t=364247)を参考にすれば、有線LANアダプタを使わない方法も出来そう。
- 具体的には、焼きたてのsdカードをpi5に指す前に、sdカード内のfirstrun.shを編集すればよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/0fedf99d-a4a7-fecf-e3c8-36e0d6979dd7.png)
- つまり、firstrun.sh内の54行目のrmコマンドの直前で、必要な設定を書き込めば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/a2c65679-93c5-87fe-9bbd-3e7b017238c8.png)
- 例えば、[おすすめしていたやり方](https://forums.raspberrypi.com/viewtopic.php?t=364247)では、usb-c接続時のUSBethernet用のipアドレス設定を下記の通りfirstrun.shに書き込んで、`/etc/network/interfaces.d/g_ether`の内容を書き込んでいた。
```
cat >/etc/network/interfaces.d/g_ether <<'EOF'
auto usb0
allow-hotplug usb0
iface usb0 inet static
        address 169.254.1.1
        netmask 255.255.0.0

auto usb0.1
allow-hotplug usb0.1
iface usb0.1 inet dhcp

EOF
```
- 上記の他、下記で述べるconfig.txtとcmdline.txtへの書込みもfirstrun.shで済ませてしまえば問題ない気がするけど、うまくいかなかったときにsshとかで確認する手段がないから、素直にモニターを使ってpi5本体で作業するか、wifiでssh接続した方がいいと思う。


# pi5にLANケーブルを挿して立ち上げる人向け（前回の続き）
- この時点では、usb-cケーブルで母艦と繋がない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/ade9c261-70a0-4de9-fd9b-b3b863d70662.png)
- [前回のおまけ](https://qiita.com/kei2y/items/2815002705fcf4c994f0#%E3%81%8A%E3%81%BE%E3%81%91)で書いた、母艦の有線LANアダプターのネットワーク設定でtcp/ipを「DHCPサーバを使用」としてインターネット接続した状態を出発点とする。なお、この状態で、pi5とはssh接続し、curlでインターネット接続できる旨、確認している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/0f148186-f5e3-17e8-5aad-2b16d153a058.png)
- この状態で、過去の「pi4とusb-c接続でヘッドレス」を実現する設定を反映させる。つまり、config.txtとcmdline.txtにそれぞれ `dtoverlay=dwc2` と `modules-load=dwc2,g_ether`を書き込むと言うこと。
- 2024年3月アップデートでのbookwormでの設定ファイルのパスは過去と変わっているので注意。
- 具体的には、外国の掲示板の[この人](https://github.com/verxion/RaspberryPi/blob/main/Pi5-ethernet-and-power-over-usbc.md)のやり方をまねて、以下の作業を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/934d3c50-dd33-834d-e46c-8cc3f209b431.png)
- こんな感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/6c330bfa-5562-40ad-45cb-1b5c6024a3e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b1fd7e58-bd1d-33cf-cbae-c96027b22fe3.png)
- 次に、外国の掲示板で[おすすめされてたやり方](https://forums.raspberrypi.com/viewtopic.php?t=364247)を踏まえて、`/etc/network/interfaces.d/g_ether`にUSBethernetの設定を書き込む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/7c841374-10b0-80b7-99af-fe2c19eae404.png)
- この時点では、pi5のifconfigの結果は以下の通りであり、usb-cによるethernet接続は現れていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/39ae8f33-b2d3-e0a2-d4f3-d1e367428dab.png)
- 以上で設定終了

# 動作検証
- 設定が終わったので、pi5をrebootするけど、検証のため、この時点ではpi5と母艦はusb-c接続はしないでおく。rebootが終わって、母艦の有線LANアダプタにipアドレスが表示されても、すぐにpi5にssh接続できるわけではないので注意[^1]。
[^1]:母艦でのnetstat画面が次の通りだけど、この画面は全てが一瞬で出るわけではなく、下方の「Internet6」の項目の表示は、結構ゆっくり。このInternet6の項目表示が遅いことと因果関係があるのかどうか分からないけど、sshでホスト名でなく@192.168.2.2（赤矢印）で指定するときは、かなり早めに接続できるけど、@raspberrypi.local（緑矢印）でssh接続可能になるまで、多少の時間がかかる気がする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/9894d1c9-e03e-f050-7fe4-6f1519e43fa1.png)
ちなみに謎なんだけど、再起動後、pi5にssh接続前にnetstatを打つと、Internet6の項目にraspberrypi.localは出てこないけど、再起動から時間をおいてれば、ホスト名@raspberrypi.localに対してssh接続できて、その後に母艦でnetstatするとraspberrypi.localが表示される。もう、何が何やら...

- pi5をrebootした後に有線LAN経由でssh接続して、pi5上でifconfigすると以下の通り。とりあえず、usb0とusb0.1が追加されていることが確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/1fae3962-08d3-31c0-d3df-8142dba30d57.png)
- routeコマンドでルート情報を見ると以下の通り。これを見ると、インターネットには有線LAN(eth0)経由でしか接続できないように見えるけど、まだ、usb-cで接続をしてないので、現れてないだけかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/53e29402-9992-1490-b28a-ff6e61c22040.png)
- pi5をシャットダウンして、LANケーブルを外して、usb-cのみでpi5と母艦を接続する。なお、pi5をシャットダウンする前の母艦のネットワークは次の通りで、pi5のUSBethernet接続を表すRNDISはその他のサービスにも表示されていない（本当のことを言えば、過去に繋いだことがあるから表示されてたけど、参考のために削除した）。もちろん、インターネット共有の接続先にもなっていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/4bfe9986-0af8-415e-adcd-ecb6da9b6eef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/ca6a8af2-f0ac-a2c8-128a-07418d4d63cb.png)
- usb-cケーブル(USB2.0規格[^2])のみで母艦とpi5を繋ぐと、こんな感じで認識された。ついでに、インターネット共有を設定しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e05e9586-5bd5-d544-c600-3d79f85a9508.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/6376bbf7-cbdc-076e-203f-c68df794b887.png)
[^2]:これは意外と重要。M5Stackのシリーズは、USB2.0のケーブル経由でしかMacBookAirで認識されないことがあったから、今回、USB3.0ケーブルでは認識されないことがあると気づけた。2.0と3.0の間には、超えられない差がある...
ちなみに、1.1→2.0→3.0...という系列と、コネクタA→B→Cという系列も別の次元の話。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/dba43718-3c1e-da51-1f25-92d1af4c6ef6.png)

- pi5にssh接続をしてみると...成功！！！
- ifconfigしてみると、こんな感じ。当然だけど、有線LAN(eth0)のipアドレスは消えている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/4b0ce7cc-63d3-edaa-980c-1898c091553a.png)
- そして、インターネットに接続出来るかどうかを確認するため、ルート情報を見ると...。残念ながら、出口情報がありません。当然、curlコマンドを打っても、悲しい返事。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/9b04b40e-0bfe-c1a1-f8ab-9008d971d9e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/cf70f911-0be1-1196-e752-9ba890884575.png)
- 母艦のインターネット共有が反映してないだけかもしれないので、pi5をrebootする。
- pi5のreboot中に母艦のifconfigを確認すると、rndis接続はen8に割り当てられており、bridge100のメンバーにen8が含まれていることが確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/8dd913af-670a-9577-70b9-0a0953171020.png)
- pi5を再起動してもpi5のルート情報に変化はなかった...残念。
- よく考えてみたら、母艦のbridge100のipアドレス192.168.2.1とusb0のipアドレスに差がありすぎる。具体的に言えば、サブネットマスクが違うじゃん！駄目だこりゃ！
- つか、`/etc/network/interfaces.d/g_ether`の内容を母艦に合わせて直さないと駄目なのよね（知ってた。つか、茶番に付き合わせてしまい、すまない）。
```
auto usb0
allow-hotplug usb0
iface usb0 inet static
        address 192.168.2.10
        netmask 255.255.255.0

auto usb0.1
allow-hotplug usb0.1
iface usb0.1 inet dhcp
```
- 気を取り直して再起動！あれ？出口が追加されない...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/eaaa5f1d-2b20-ae8c-2178-8ec875b98ff1.png)
- でも、curlのエラーが少し変わった!(6)⇒(7)だよ！ランクアップだ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/3b85ef11-d328-e06b-fced-4f4f2650e6ff.png)
- そもそも、出口がないなら、出口を作ればいいじゃない（マリーさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/f3bd3ba5-7f77-4b5f-3d2a-27df96d05d9a.png)
- そして、道は開かれた!
...まだ、お天気サイトはダウンしてるみたい。じゃあ、暗号資産の価格表でも表示してみよう。よし、インターネット接続成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b7c4f8ae-c473-7bba-3d96-e100de38cba3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/42513376-29e1-8e1a-de0c-b8d4252201d6.png)
- とりあえず、終了！

# まだだ! まだ終わらんよ!
- 再起動しても、pi5のルート設定追加は生きてるのだろうか？それを確認するまでは終わったといえない。
- 順番として、一回、usb-cは外して、有線LANアダプタ経由のインターネット接続が生きているか確認し、その後、usb-cのみで接続して確認する。
- まず、有線LANアダプタのみ。うむ、出口もOK!に見えたけど、curlが死んでる。エラーも(6)になってる。調べて分かったけど、エラー(6)はネームサーバー(dns)への接続不良による名前解決不具合によるエラーなのよね。だから、インターネットに繋がっていると言えば繋がってる。ipアドレス直打ちでしか繋がらないけど...でも、今回の目的は、usb-c接続だから、放置！ふふ、これが、大人というものだよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/5020603b-872a-7356-b460-4e709561b1cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/a585bc9c-fe78-7fdc-6277-6dc4aab8f7c2.png)
- 次は、usb-cにつなぎ直して起動。うむ、道は閉ざされたね！調べたところ、有線LANを刺すと、元のデフォルトゲートウエイは消えて、有線LANをデフォルトゲートウエイに塗り替える仕様らしい。つまり、また、usb-cで道を切り開いた後に電源を落として、次もusb-cで立ち上げれば、デフォルトゲートウエイはそのままと言うこと！よし、実験だ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/41e1ff9d-d2bd-f52d-e218-cfde216329e0.png)
- まずは、道を切り開く！`sudo route add default gw 192.168.2.1`だ！次にcurlでネット接続確認！`curl https://poptart.spinda.net`で、猫ちゃんを確認！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/3ae54810-2e09-329f-a179-6745f8916f27.png)
- そして、shutdownして、しばらくおいてから、起動して、ssh接続して、routeをみると...腐ってやがる...早すぎたんだ...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/f223b7f6-a233-7144-74b5-31a4d2ae8fd9.png)
- とりあえず、現状は、都度、道を切り開く必要があるけど、接続は出来たと言うことで、おわらせてくれ。僕はもう疲れたよ...なんだかとても眠いんだ...
 
# おまけ（追記）
- 最初、[非推奨](https://qiita.com/kei2y/items/33b2d99b4c84c564237e#%E6%9C%89%E7%B7%9Alan%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%81%AA%E3%81%97%E3%81%A7%E9%9D%9Ewifi%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AB%E6%8C%91%E6%88%A6%E3%81%97%E3%81%9F%E3%81%84%E4%BA%BA%E5%90%91%E3%81%91%E9%9D%9E%E6%8E%A8%E5%A5%A8)とか言ってたけど、これが一番楽かも。
- よく見たら、今回作業したfileは、焼いた直後のsdカードでお隣さん同士で、macos上で全ていじれてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/3d07ad1f-e3e2-a5b7-b862-6257f80409d1.png)
- 有線LANアダプタのことなんか忘れて、usb-c接続のみに特化して考えれば、この時点で作業完了じゃん！後は、pi5に刺して、起動するだけですわ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/cf8a65fe-e511-89e6-7d34-35d9886abcf2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/8b45098a-4bd7-8588-dccc-72a96df8f026.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/63805c5c-7a73-14b0-aebd-0d7f9ae5ff98.png)
↑(追記)firstrun.shで、netmaskが間違えてた。本来は、255.255.255.0とすべき。これを誤ると、usb-c接続自体は出来ても、インターネット共有が上手く働かない。
- pi5にusb-cケーブル(usb2.0規格)で母艦と繋いでしばらくしたら...この画面に！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/42f7d780-1128-9981-5497-51cc321d3d45.png)
- え?sshできちゃうの?　あ、また、最初の呪文`ssh-keygen -R ホスト名[例:raspberrypi.local]`を忘れてた...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e77161bd-754f-63e9-7619-a5a61e06f14c.png)
- あっさりうまく行き過ぎて、拍子抜けなんだが...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/1b6d498b-6196-c087-1e4d-02aa196dfbd8.png)
- ここで、いつもの開けゴマの呪文`sudo route add default gw 192.168.2.1`を唱えてから、猫ちゃんを召喚！（なに！、無詠唱だと！？あいつ何者だ？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/8f143f62-b2dd-4487-5163-abd9fb4ecf9f.png)
- なんつうか、pi4なみに簡単だったね。pi4は持ってないから、噂で聞いただけだけど。
- 明日からは、pi5の環境構築をまとめたいと思う。特に[vncまでの手順](https://qiita.com/kei2y/items/e1baaae3a86727ff26e6)は解説したい。それに、開けゴマの呪文を毎回唱えるのも面倒なので、windowsのスタートアップ時の自動実行みたいなフォルダかファイルを探して、そこに開けゴマの呪文を書き込むとするよ。
- （さらに追記）とりあえず、このファイル（rc.local）が最もメジャーな起動時の実行内容を書く場所みたいだね。実行タイミングは、起動終了の直前で、root権限で実行するから、sudoが不要、と。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/c82ce2ee-8b9c-61b2-759c-07b84963cd30.png)
- 再起動直後のrouteコマンドでデフォルトゲートウエイが設定されていることを確認しました。本当にありがとうございました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b68ad85f-de6c-8494-8fea-e52317112d50.png)

# おまけのおまけ（追記）【zero2wの場合のusb接続】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/71c1f3e8-1f92-0b4d-dfc0-0175172cc6e0.png)
- rpi zero2wにrpios（LEGACY_64bit）を入れて、usb接続によるヘッダレスをしたときは、焼いた直後のsdカードのconfig.txtとcmdline.txtにそれぞれ `dtoverlay=dwc2` と `modules-load=dwc2,g_ether`を書き込むだけで良かった。firstrun.shはいじってない。
※ usbケーブルは、zero2wの2つの受け口のうち、mini-hdmi寄りの方に刺す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/2626b325-d797-9dd2-64b8-6739790e9a63.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/c8c1567d-f36f-5360-c8f1-7daa96e6ddc6.png)
- sshで初回に接続するときは、`ssh-keygen -R ホスト名[例:raspberrypi.local]`を忘れずに。まあ、忘れても、エラーが出た後に打ち込めばいいし、自分自身、いつもエラーが出てから打ち込んでるし。
- ゲートウエイは通っているから、ネットでお天気も調べられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/543a033a-08fd-df7a-e260-104ad5e4389e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/72776e6a-bb28-55bc-6c43-b235bd918330.png)
- ちなみに、zero2wはアルミケースを付けたから、ケースよりもピンが上に出るように、autumn moonでピンソケットを買って付けてある。同じものを近くの1000stonesで買うと[300円](https://www.adafruit.com/product/4079)もするんだよね。取り外しがしやすいような特殊加工とかしてるんだろうか？
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/ac95d1a8-c863-d88a-3527-559273c587a3.png)