macos
RaspberryPi
raspbian
Raspberrypi3

【ヘッドレス】Raspberry Pi 3 セットアップ for macOS

散々同様の記事は投稿されていますが,備忘録として書き残します.
今回は,Raspberry Piにヘッドレス(=ディスプレイなし)でセットアップします.(リンクの一部にアフェリを含みます.)

環境など

  • 作業 PC: MacBook Pro (macOS Mojave 10.14.2)
  • 本体: Raspberry Pi 3 MODEL B (Raspberry Pi 3 MODEL B+ でも同様でした)
  • SDカード: TOSHIBA EXCERIA microSDHC16GB Class10 UHS-1対応 最大読込速度48MB/s 防水/耐X線 海外パッケージ品 THN-M301R0160A4
    • 用途的に容量は少なくてよかったので,16GBを選択しました.
    • この商品は日本国内でのサポートは受けれないので注意しましょう.
  • 書き込むOS: Raspbian Stretch Lite (2018-11-13)
    • Raspbian Stretch with desktop and recommended software でも Raspbian Stretch with desktop でも,流れは変わりません
      • Raspbian Stretch Lite: 最小限のイメージ.CUI 環境.
      • Raspbian Stretch with desktop: デスクトップ付きイメージ.
      • Raspbian Stretch with desktop and recommended software: デスクトップ付き,推奨ソフトウェア入り.
    • Stretch のうちはこの手順で大丈夫…多分

やること

  • OSのダウンロード
  • OSをSDカードに書き込む
  • SSHの有効化,Wi-Fiの設定
  • Raspberry Piの起動
  • Raspberry Piの設定

OSのダウンロード

今回は,Raspbian (Raspbian Stretch Lite) をインストールする.1
Download Raspbian for Raspberry PiからRaspbian Stretch LiteをDownload ZIPをクリックして,ダウンロードする.
もちろん,$wget https://downloads.raspberrypi.org/raspbian_lite_latestでダウンロードしても良い.
ダウンロードは結構時間がかかるので,気長に待つ.

image.png

ダウンロードが完了したら,一応ファイル破損がないか確かめる:

$ openssl sha256 2018-11-13-raspbian-stretch-lite.zip
SHA256(2018-11-13-raspbian-stretch-lite.zip)= 47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d

一致しているので,大丈夫ですね👌.

OSをSDカードに書き込む

まずはzipファイルの解凍する:

$ unzip 2018-11-13-raspbian-stretch-lite.zip

その後,純正の変換器(USB-C Digital AV Multiportアダプタ)と,サンワサプライのUSB2.0カードリーダ(ADR-ML158K)を使って,microSDHCを挿入する.
(もちろん別ので良い)

そしたら,SDカードのマウント先を確認する:

$ diskutil list

次にSDカードをFAT32でフォーマットする(今回はSDカードのマウント先が/dev/disk2という想定):

$ diskutil eraseDisk FAT32 RPI /dev/disk2

フォーマット後,ddコマンドでの書き込みのため,SDカードをアンマウントする:

$ diskutil unmountDisk /dev/disk2

最後に,ddコマンドでSDカードにOSイメージを書き込みます:

$ sudo dd bs=1m if=2018-11-13-raspbian-stretch-lite.img of=/dev/rdisk2 conv=sync

SSH,Wi-Fiの設定

まずは,cdコマンドで移動:

$ cd /Volumes/boot

SSHの有効化

起動時にsshを有効にするため,書き込んだSDカードの最上位にsshという名前の空ファイルを作成する:

$ touch ssh

Wi-Fiの設定

書き込んだSDカードの最上位に,wpa_supplicant.confという名前のファイルを作成する.
このファイルは,起動時に自動でRaspbian上の/etc/wpa_supplicant/wpa_supplicant.confを上書きするようになっている.
上書き後,SDカードの最上位に作成したファイルは削除される.

Wi-Fiのパスフレーズは平文でも保存できるが,256bitのハッシュ化されたキーを保存した方が良い.
キーはWPA key calculation: From passphrase to hexのページにアクセスし,Network SSIDとWPA passphraseを入力し、Calculateボタンをクリックすると得ることができる.

WPA key calculation

bac3cdf26d42c3a61fb858ef0295a0166e94f84dbabc1088bfa090cef3cb1dcbのようなキーが得られる.
これを元にファイルを作成する:

$ nano wpa_supplicant.conf
wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="abc"
    psk=bac3cdf26d42c3a61fb858ef0295a0166e94f84dbabc1088bfa090cef3cb1dcb
}

SDカードの取り外し

設定が終わったら,以下を実行したのち,SDカードを取り外す:

$ cd
$ diskutil eject /dev/rdisk2

Raspberry Piの起動

SDカードを取り外したら,Raspberry Piに挿入し,電源を接続する.

電源接続後,sshコマンドでRaspberry Piに接続する:

$ ssh pi@raspberrypi.local

ユーザpiの初期パスワードはraspberry

パスワードの設定,ユーザの追加

ログインできたら,まずはユーザpiのパスワードを変更する:

$ passwd

合わせて,ユーザrootのパスワードを設定する:

$ sudo passwd

また,可能であれば,セキュリティのため,作業用に別のユーザを作ることをオススメする.
ユーザを追加する:

$ sudo useradd --groups adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio -m yk

グループはユーザpiのグループを参考に設定した.
ユーザpiのグループの確かめ方は次の通り:

$ groups pi

追加したユーザにもパスワードを設定する:

$ sudo passwd yk

最後にユーザpiを無効化し,切断する:

$ sudo passwd --lock pi
$ exit

以降の作業は新しく追加したユーザで行う:

$ ssh yk@raspberrypi.local

流石にshでの作業は辛いのでシェルをbashに変更する:

$ sudo chsh -s /bin/bash yk

変更後は一旦切断してから接続し直す:

$ exit
$ ssh yk@raspberrypi.local

Raspberry Piの設定

初期設定

まずは,初期設定を行う:

$ sudo raspi-config
  1. 「8 Update」を選択し,ツール自体を最新にしておく.
  2. 「2 Network Options」の「N1 Hostname」を選択し,ホスト名を設定する.
  3. 「4 Localisation Options」の「I1 Change Locale」を選択し,言語の設定をする. ここでは,あくまで私の設定を紹介する. まぁ,趣味の問題なのでみなさん思い思いに設定してください.
    1. 「en_GB.UTF-8 UTF-8」でスペースキーを押し,選択解除
    2. 「en_US.UTF-8 UTF-8」でスペースキーを押し,選択
    3. 「ja_JP.UTF-8 UTF-8」でスペースキーを押し,選択
    4. Tabキーを押し,「Ok」を選択
    5. 「ja_JP.UTF-8」を選択し,「Ok」を選択
  4. 「4 Localisation Options」の「I2 Change Timezone」を選択し,タイムゾーンの設定をする.
    1. 「Asia」,「Tokyo」を選択
  5. 「4 Localisation Options」の「I3 Change Keyboard Layout」を選択し,キーボードの設定をする.(必要であれば.今回はパス.)
  6. 「Finish」を選択して初期設定は終了

アップデートの実施

とりあえず,さっさとアップデートしてしまう:

$ sudo apt update       # パッケージリストの更新
$ sudo apt upgrade      # パッケージの更新
$ sudo apt dist-upgrade # OSのアップグレード
$ sudo rpi-update       # ファームウェアの更新
$ sudo reboot           # 反映のための再起動

SSHの設定

認証されたキーのみでログインできるように,rootではログインできないように変更する:

sudo nano /etc/ssh/sshd_config
/etc/ssh/sshd_config
- #PermitRootLogin prohibit-password
+ PermitRootLogin no
/etc/ssh/sshd_config
- #PubkeyAuthentication yes
+ PubkeyAuthentication yes
/etc/ssh/sshd_config
- #PasswordAuthentication yes
- #PermitEmptyPasswords no
+ PasswordAuthentication no
+ PermitEmptyPasswords no
/etc/ssh/sshd_config
- UsePAM yes
+ UsePAM no

そしたら,実際に公開鍵を書き込む:

$ mkdir ~/.ssh
$ nano ~/.ssh/authorized_keys
~/.ssh/authorized_keys
+ ssh-ed25519 xxxxxxxxx xxx@xxx.local

念のため,ユーザpiにも設定する:

$ sudo mkdir /home/pi/.ssh
$ sudo nano /home/pi/.ssh/authorized_keys
/home/pi/.ssh/authorized_keys
+ ssh-ed25519 xxxxxxxxx xxx@xxx.local

パーミッションを整える:

$ chmod 0700 ~/.ssh
$ chmod 0600 ~/.ssh/authorized_keys
$ sudo chown pi /home/pi/.ssh/authorized_keys
$ sudo chmod 0600 /home/pi/.ssh/authorized_keys

反映のため,サービスの再起動:

$ sudo systemctl restart ssh

設定にミスがないか確認するため,新しいターミナルでログインテストする.
接続中のを切断すると,設定にミスがあった際に,ログインできず修正できなくなるので注意.

ファイヤウォールの設定

設定しないのは楽でいいですが,やはりセキュリティー的には設定するべきですので,設定します.

iptablesがいちばん有名だとは思いますが,設定がめんどくさい複雑なので,今回はufw (Uncomplicated FireWall)を使用する.

インストール:

$ sudo apt install ufw

ファイヤウォールの状態を確認:

$ sudo ufw status
Status: inactive

インストールした直後は無効になっている.

ファイヤウォールの設定の基本は,
1. 外部からの接続は受け付けない
2. 必要なポートの通信だけ許す
です.
それに従い,今回はローカルのssh接続のみ許可するように設定します:

$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$ sudo ufw allow proto tcp from 10.0.0.0/8 to any port 22 # 我が家はクラスAにしているだけなので環境に合わせて設定してください.
Rules updated
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       10.0.0.0/8

これで共通のセットアップは完了です.
あとは,私はzshでも入れてから,色々遊んでみます.

参考


  1. まぁ,今回の私の用途ではGUIはいらないので…