ちょっと話題の記事

Raspberry Pi 4とMacをUSB type Cケーブルで接続してMacのインターネット接続を共有する手順 #RaspberryPi

2019.12.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ラズパイ4から電源供給ポートがUSB type Cになり、MacとUSB type Cケーブルで接続すれば、Macのインターネット接続の共有とリモートデスクトップ接続ができたのでその手順を説明します。

OSイメージのmicro SDカードへの書き込み

ラズパイ公式サイトでRaspbianのイメージをダウンロードします。デスクトップも使いたいので、2019年12月時点で最新の Raspbian Buster with desktop(Release date: 2019-09-26) にしました。

OSイメージのmicro SDカードへの書き込みにはEtcherがお手軽でおすすめです。Mac/Windows/Linux向けのバイナリが公開されています。

micro SDカードのマウント

Etcherを使った場合、OSイメージの書き込みが終わった直後はmicro SDカードがマウントされていませんので手動でマウントする必要があります。コマンドラインから行う場合は以下のような手順になります。単純にカードを物理的に一度抜き差しする、でも良いと思います。

$ diskutil list
# --- snip ---
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.4 GB    disk2
   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1
   2:                      Linux                         3.5 GB     disk2s2

$ diskutil mount /dev/disk2s1
Volume boot on /dev/disk2s1 mounted

$ ls /Volumes/boot
COPYING.linux            bcm2710-rpi-3-b.dtb      fixup4x.dat              start.elf
LICENCE.broadcom         bcm2710-rpi-cm3.dtb      fixup_cd.dat             start4.elf
bcm2708-rpi-b-plus.dtb   bcm2711-rpi-4-b.dtb      fixup_db.dat             start4cd.elf
bcm2708-rpi-b.dtb        bootcode.bin             fixup_x.dat              start4db.elf
bcm2708-rpi-cm.dtb       cmdline.txt              issue.txt                start4x.elf
bcm2708-rpi-zero-w.dtb   config.txt               kernel.img               start_cd.elf
bcm2708-rpi-zero.dtb     fixup.dat                kernel7.img              start_db.elf
bcm2709-rpi-2-b.dtb      fixup4.dat               kernel7l.img             start_x.elf
bcm2710-rpi-2-b.dtb      fixup4cd.dat             kernel8.img
bcm2710-rpi-3-b-plus.dtb fixup4db.dat             overlays

OSイメージの編集

micro SDカードにOSイメージを書き込んだ段階ではSSHは無効化されています。以下のようにbootディレクトリ直下にsshという名前の空ファイルを作成することでSSHを有効化できます。

$ touch /Volumes/boot/ssh

boot/config.txtの末尾にdtoverlay=dwc2という1行を追記します。

$ echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt

次にcmdline.txtを編集します。rootwaitのうしろにスペースひとつ空けてmodules-load=dwc2,g_etherと追記します。

$ vim /Volumes/boot/cmdline.txt

以上でOSイメージの編集はおわりです。ファインダーもしくはコマンドライン上でmicro SDカードをアンマウントしてからMacから取り外します。

# コマンドラインでmicro SDカードをアンマウントするコマンドの例
$ diskutil unmount /dev/disk2s1
Volume boot on disk2s1 unmounted

ラズパイの起動

micro SDカードをラズパイに挿入したらMacとラズパイをUSB type Cケーブルで接続します。ラズパイへ電源が供給され、起動シーケンスがはじまります。(ちなみに写真のケースはPimoroniの"Pibow Coupé 4 – Rainbow"にファンを取り付けたものです)

Macのインターネット接続をUSB経由で共有

以下の手順を実行します。

  1. 「システム環境設定」の「共有」をクリック
  2. "共有する接続経路"に "WiFi"を選択
  3. "相手のコンピュータでのポート"は"RNDIS/Ethernet Gadget"を選択
  4. 「インターネット共有」のチェックボックスをオンにする

SSHログイン

Macのターミナル上で、以下のコマンドを実行します。ラズパイのデフォルトのホスト名はraspberrypi.local、ユーザー名はpi、パスワードはraspberryです。

$ ssh pi@raspberrypi.local

無事ログインできたら、Macからラズパイにリモートデスクトップ接続するためにVNCサーバーソフトウェアをインストールします。ログインできなかった場合は、本記事の後ろの方に記載した対処法を試してみてください。

VNCによるリモートデスクトップ接続

※デスクトップを使う必要がなければこのステップはスキップしてかまいません。

TightVNCをインストールします。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install tightvncserver

TightVNCをインストールしたらそのままコマンドラインから起動します。初回起動時にはパスワードの設定を求められます。

$ tightvncserver

apttightvncserverコマンドを実行したときに以下のような警告が出た場合は、

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").

ラズパイの/etc/ssh/ssh_configAcceptEnv LANG LC_*の行をコメントアウトして再起動したら解消しました。こちらの記事を参考にしました。

Macからラズパイにリモートデスクトップ接続を行います。ファインダーのメニューバーの「移動」をクリックして「サーバへ接続」を選択します。

ラズパイ4のIPアドレスのポート5901番に接続します。

tightvncserverを初回起動した時に設定したパスワードを入力します。

VNC接続でラズパイ4のデスクトップが表示されました。

以上で、最低限作業できる状態になりました。あとはraspi-configコマンド等で必要なセットアップは済ませておきましょう。

まとめ

ラズパイ4とMacをUSB type Cケーブル1本でつなぐだけで開発を始められるようにする手順をご紹介しました。リモートデスクトップ接続だと動画を扱う作業などはちょっと厳しそうですが、プログラミングなどは問題なくできると思います。

おまけ: SSHログインが失敗した場合

一度ラズパイのデフォルトホスト名raspberrypi.localでラズパイにSSHログインしたことがある状態で、別のラズパイに対して同じホスト名でSSHログインを試みると以下のように警告されます。こうなった場合、ホスト名raspberrypi.localに対してpingコマンドを発行してIPアドレスを特定してIP直書きでSSHログインするなどして対処します。無事ログインできたらきちんと独自のホスト名を設定しましょう。

$ ssh pi@raspberrypi.local
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ECDSA host key for raspberrypi.local has changed,
and the key for the corresponding IP address xxxx::xxxx:xxxx:xxxx:xxxxxxxx
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Please contact your system administrator.
Add correct host key in /Users/xxxxxxxx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/xxxxxxxx/.ssh/known_hosts:58
ECDSA host key for raspberrypi.local has changed and you have requested strict checking.
Host key verification failed.
$ ping raspberrypi.local
PING raspberrypi.local (xx.xx.xx.xx): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 169.254.153.65: icmp_seq=1 ttl=64 time=0.290 ms

Macでインターネット共有を有効化すると、ラズパイのIPアドレスが変化します。raspberrypi.localpingコマンドを発行して、新しく割り当てられたIPアドレスを確認します。

$ ping raspberrypi.local
PING raspberrypi.local (169.254.226.199): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- raspberrypi.local ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss
$ ping raspberrypi.local
PING raspberrypi.local (169.254.226.199): 56 data bytes
ping: sendto: No route to host
Request timeout for icmp_seq 0
ping: sendto: Host is down
Request timeout for icmp_seq 1
ping: sendto: Host is down
Request timeout for icmp_seq 2
^C
--- raspberrypi.local ping statistics ---
8 packets transmitted, 0 packets received, 100.0% packet loss
$ ping raspberrypi.local
PING raspberrypi.local (192.168.2.3): 56 data bytes
64 bytes from 192.168.2.3: icmp_seq=0 ttl=64 time=0.672 ms
64 bytes from 192.168.2.3: icmp_seq=1 ttl=64 time=0.360 ms
64 bytes from 192.168.2.3: icmp_seq=2 ttl=64 time=0.303 ms

参考