RaspberryPi zero W ヘッドレスセットアップ~バックアップ・復元まで(Macのみでddコマンドを使わない方法)


#■はじめに

いつの間にか
raspberry pi zero W  x3
raspberry pi zero  x1
と複数台所持していたので、今後のセットアップに困らないように備忘録。

初期設定を済ませた最低限の状態でバックアップイメージを保存するのが目的。
そうすれば、いざという時になるべくクリーンな状態に復元できるし、または複数台運用をしたいときに同じイメージを使えば初期設定をスキップできる。

また、Mac上ではバックアップや復元がddコマンドを使うのが主流となっているようで、タイプミスでMacが死んでしまう可能性がありちょっとリスキー。
そこでddコマンドを使わず、なるべくGUIのあるソフトを使うこととした。

 **※なおバックアップを目的にしているため、通常のセットアップ手順から変更・省略している部分(パスワード変更など)がある。その辺注意。(省略した部分は復元後に行う為)** 

##■環境
* MacBook Pro (Retina, 13-inch, Early 2015)
* raspberry pi zero w v1.1
* raspbian STRETCH (2017-09-07-raspbian-stretch.img)[raspbian公式HP](https://www.raspberrypi.org/downloads/raspbian/)
* ディスクユーティリティ(Mac標準ソフト)
* [SD Card Formatter](https://www.sdcard.org/jp/downloads/formatter_4/index.html)
* [Etcher](https://etcher.io/)


----
#■OSのインストール


###●SDカードへOS書き込み

[Raspberry Pi zero W のヘッドレスインストール（キーボードやマウスなしでRaspbianをインストールする方法)](https://raspida.com/headless-install2pi0w)
を参考にさせていただいた。

まずは以下の手順にて、SDカードへOS(raspbian)をインストールする。(全てMacで作業)
1. [raspbian公式HP](https://www.raspberrypi.org/downloads/raspbian/)からイメージをダウンロード。
2. ダウンロードしたZipを解凍
3. インストールしたいmicroSDカードを差し込み、[SD Card Formatter](https://www.sdcard.org/jp/downloads/formatter_4/index.html)にてフォーマット。
<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/7d702810-2bbe-3eb6-8d6f-e7e92c4b9e86.png" width="400">
4. [Etcher](https://etcher.io/)を使って、解凍したイメージファイルをSDカードに書き込み

<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/786e3f91-75d3-01b2-78c5-2673fab054e6.png" width="600">


上でも書いたが、SDカードへの書き込みは、ターミナルを使ったBBコマンドというのがあるが、名前を間違えるとMacが死ぬらしい。今回はGUIがあって操作も非常に簡単な[Etcher](https://etcher.io/)をダウンロードして使用した。(Windows,Mac,Linux対応)
ファイルを選択してFlash!するだけでよい非常に直感的なUI。素晴らしい。
また、下の復元のときにも使えるため、Etcherをダウンロードすることをおすすめしておく。

###●SDカードへSSH接続とwifi設定ファイルの書き込み
OSを書き込んだ後、通常のセットアップ(画面とキーボード、マウスを接続する方法)ではそのままラズパイを起動させれば良いが、ヘッドレスで運用させるためには、画面とキーボード、マウスの機能をMacで肩代わりさせるわけなので、ラズパイが起動した直後からMacと通信できるようにしなければならない。
通信のために同じネットワークのwifiを使い、SSHをいう手段で無線接続する。そのためSSHとwifi設定を、あらかじめ設定する。

SSH接続を有効にするために、`SSH`ファイルを、wifiに接続するために`wpa_supplicant.conf`ファイルを、それぞれ作成しSDカード直下に保存する。

SSHファイルは、中身なしのSSHというファイル名なだけなのですぐに作れるが、wpa_supplicant.confファイルは、自分のwifiの設定を書き込まなければならない。
更に、暗号化したパスフレーズを入力しなければならないらしいのだが、Mac標準ではその変換機能がないらしい。
以下の記事でその暗号化も含めたファイルの一発生成をしてくれるアプリケーションを作成している方がいたので、ありがたく使わせていただいた。(更にSSHファイルも作れるようになっている親切設計)
[Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った](https://qiita.com/mascii/items/a43d71572e1919e56398)

![スクリーンショット 2017-12-01 15.35.18.png](https://qiita-image-store.s3.amazonaws.com/0/199149/e5dae662-a185-58a7-e775-ff79d37dc220.png "スクリーンショット 2017-12-01 15.35.18.png")
設定したいSSIDとそのパスワードを入力して"追加"を押すと登録される。
その状態で"wpa_supplicant.conf作成"ボタンを押すとダウンロードされる。
このwpa_supplicant.confファイルとSSHをMac上でSDカード直下にコピーペースト。

これでラズパイを画面もマウス・キーボードも繋げず、Macから使える準備が整った、はず。


###●SSH接続(Macのコンソールにて作業)

OSイメージファイル、SSHファイル、wpa_supplicant.confファイルが書き込まれたSDカードをMacから抜き、ラズパイに差し込む。
そしてラズパイを電源に繋いで起動する。
1分程度経過してLEDが点滅から点灯になっていれば、ラズパイは通常起動した状態になっているはず。(画面を接続していないので、設定がうまく行ったのか確認できない)

ここで、MacからwifiによるSSH接続を行う。

参考サイトでは、Macのコンソールにて、`ssh pi@raspberrypi.local`を用いて接続している。ラズパイインストールが初めての人はこちらをおすすめする。
ログインのための初期パスワードは`raspberry`。


>ーーーー以下殆どの人は不要ーーーー
自分の場合は既にラズパイを一台使っているため、raspberrypi.localでアクセスすると、今使っている方につながってしまう。
そのため、ssh接続にはローカルアドレスを使用した `ssh pi@192.168.xxx.xxx`を使う。
ローカルアドレスの検索方法だが、`arp -an`コマンドを使った。
wifiに接続されているいくつかのアドレスが検出されるはずだが、その中で
`b8:27:eb`ではじまるMACアドレスがラズベリーパイとのこと。
自分の場合は既に常時起動させているものが既にあるから2つ見えるが、普通の人は1つだけのはず。
既に起動している方のアドレスは把握しているため、消去法で今回起動したものは192.168.0.10だとわかった。


>`ssh pi@192.168.0.10`にて接続。

>不幸にも、以前試しに使っていた192.168.0.10と被ってしまい、以下の警告にて弾かれた。

>```shell-session:mac
MacBook-Pro:~ Clses$ ssh pi@192.168.0.10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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:xxxxxxxxxxxxxxxxxxxxxxxx.
Please contact your system administrator.
Add correct host key in /Users/Clses/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/Clses/.ssh/known_hosts:14
ECDSA host key for 192.168.0.10 has changed and you have requested strict checking.
Host key verification failed.
```


>同じアドレスなのに知らない機器に接続しようとしてるから認証情報確認しろ、って事らしい。
>以下のサイトを参考に、Macに保存されている前のラズパイの認証情報を消すことで、新しい機器として登録させる。

>[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)

>MAC側の~/.ssh/known_hostsファイルから、192.168.0.10で始まる行を削除して解決。

>改めて`ssh pi@192.168.0.10`を打つと、通常の初回ログインとなった。




Macのコンソールに以下が表示されればSSHにてラズパイに接続できたことになる。

```
pi@raspberrypi:~ $
```

ひと仕事終えた気分になる...が、ようやくプレーンのraspbianが起動しただけなので、目的のバックアップ前の設定はこれから。

----

#■ラズパイの設定(Mac上のコンソールでSSH接続にて作業)

###●パッケージ更新(必須)
各行をそれぞれ実施。&&で繋げて一行にすると連続で実行してくれるみたいで楽。

```
sudo apt-get update
sudo apt-get -y dist-upgrade
sudo apt-get -y autoremove
sudo apt-get autoclean
```



###●地域設定(推奨)

`sudo raspi-config`で以下設定画面に入る。
<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/4cdbbbc5-8d18-704d-e41c-8b6cd1bc5a01.png" width="600">

```
4 Localisation Options
  I1 Change Lacale :ja_JP.UTF-8 UTF-8を選択。初期設定もja_JP.UTF-8 UTF-8を選択。
  I2 Cange Timezone :Tokyoを選択。
  I4 Change wi-fi Country :JP Japanを選択
```  

###●インターフェースの拡張(任意)

```
5 Interfacing Options
  P2 SSH  :MACやWindowsから起動させたい場合は必須。
  P3 VNC  :リモートでデスクトップ画面も操作したい人
  P4 SPI  :センサなど通信規格。
  P5 I2C  :センサなど通信規格。
  P6 Serial :センサなど通信規格。
```

この辺はお好みで。自分はセンサ使うのでSPIとI2Cを有効化。シリアルは最初から有効だった様子。

###●パスワード変更(本来必須だが省略)
本来はパスワードを変更するべきだが、初期設定した後バックアップ・クローン用にイメージファイルとするため、ここはあえて初期パスワードのままとしている。行う場合は、上記のraspi-configで1番のChange User Passwordを選択する。

---
raspi-configの設定を確定(Finish)させると、再起動を促されるので、再起動する。


###●IP固定(推奨)

[Raspberry Pi に固定IPアドレスを割り当てる方法](https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d)を参考とした。


>nanoの場合、 **Control+Oで保存。Control+Xで終了** よく忘れるので備忘。

`sudo nano /etc/dhcpcd.conf`にて以下のように記載。

```/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.30/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```

static ip_addressに使用したいIPアドレス/ポート。今回は192.168.0.30に設定。
static routersとstaticとdomain_name_serversはルーターのアドレス入れとけば良いはず。
ルーターによるとおもうけど192.168.0.1か192.168.1.1が普通なのかな。

>昔の記事だと`/etc/network/interfaces`を編集となっていたりするけど、
開いてみると以下のようになっている。

>```none:/etc/network/interfaces
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
```

>`/etc/network/interfaces`はもう使われていないので`/etc/dhcpcd.conf`を開けってことらしい。

 **以降、再起動すると上記で設定したIPアドレスに変更となっているので、SSH接続時に忘れずに変更後のアドレスでアクセスすること。(raspberrypi.localの人は気にしなくて良いはず)**


###●VNC(リモートデスクトップ)の設定(任意)

ラズパイをデスクトップ環境でも操作できるようにリモートデスクトップを入れる。
[MacからRaspberry PiにVNCでリモートデスクトップ接続する方法](http://darmus.net/raspberry-pi-mac-vnc/)

`sudo apt-get install tightvncserver`
にてVNCサーバーをラズパイにインストール。
`tightvncserver`にて起動すると、作成時にパスワード作成を要求される。
今回はバックアップ用の初期設定のつもりで変更前提なので当たり障りのないものにしておく。
Mac標準のリモートデスクトップ接続を行い、画面が表示されるのを確認。

###●python3.6のインストール(多分不要)
一応pythonの最新版を入れておくことにする。
[Raspberry piにPython3.6を入れてみた](https://qiita.com/K_M95/items/6980f27e7424c890c89e)
上記サイトを参考にさせていただいた。

変更したのは、pythonのバージョンが3.6.0のところを、最新版の3.6.3にしただけ。

```
sudo apt-get update
sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
tar xf Python-3.6.3.tar.xz
cd Python-3.6.3
./configure
make
sudo make altinstall
```

正直やってることはよくわからんけど、従っておく。
だいぶ時間がかかった(30分位)ので、放置する場合はMacのスリープ設定を一時切った方が良いかも。
インストール終了後はこんな感じにpythonが3種類になった。(わざわざPython3.6って打つの面倒だからよほどがないと使わないかも)

```
pi@raspberrypi:~ $ python -V
Python 2.7.13
pi@raspberrypi:~ $ python3 -V
Python 3.5.3
pi@raspberrypi:~ $ python3.6 -V
Python 3.6.3
```


###●インストールパッケージ一覧の出力(多分不要)
何が入っているか把握できるようにパッケージのリストを出力しておく。

`dpkg -l`にてインストールされているパッケージが一覧表示できる。`コマンド > ファイル名`で出力結果をファイルに保存できるので、パッケージ一覧を保存しておく。
`dpkg -l > packagelist.txt`

システムのバージョンも書き出しておく
`vcgencmd version > osversion.txt`

---
#■ラズパイのSDカードのバックアップ・復元

###●Macのディスクユーティリティでバックアップ
とりあえず初期設定は済んだと思うので下記サイトを参考に、MacでSDカードのバックアップ
[Raspberry Pi の SD カードを Mac でバックアップ](https://lowreal.net/2014/01/15/1)

[[Raspberry Pi] microSD カードをバックアップ・リストアする](http://blog.withachristianwife.com/2017/03/04/backup-and-restore-sdcards/)

なおディスクユーティリティはアプリケーション→ユーティリティ内にある。

参考サイトの掲載時からはインターフェースがだいぶ変わっているようで、画面上部に"新規イメージ"等のボタンが無くなっているが問題ない。
SDカードのbootを選択・アンマウントして、 **画面上部のメニューバー** から、
 **ファイル→新規イメージ→"名称未設定"からイメージ作成** ("名称未設定"の名前は違うかも)
  <img src="https://qiita-image-store.s3.amazonaws.com/0/199149/c2c45f47-5f9b-955a-b7fe-7901fdef256b.png" width="600">


名前は適当に自分でわかりやすく。フォーマットは"圧縮"にしてみた。

 <img src="https://qiita-image-store.s3.amazonaws.com/0/199149/d1b8a3be-46fc-7457-62e0-e7ac0fd4b499.png" width="600">
 
16GBのmicroSDだったが、2,589,170,994 バイト（ディスク上の2.59 GB）の.dmgファイルが作成された。
(試しに非圧縮で出力したら16GBだったので、なるべく圧縮したほうが良いだろう)

###●Etcherで復元
出来たdmgファイルを、ディスクユーティリティで新しいSDカードに復元しようとすると、エラーが出てしまい復元できなかった。上記サイトでも、後の記事で失敗すると出ており、検索してもディスクユーティリティでの復元方法は見つからなかった。
 <img src="https://qiita-image-store.s3.amazonaws.com/0/199149/d5cdbb86-6455-341c-bedc-14a5a974766a.png" width="600">


試しに、クリーンインストールでOSを書き込んだEtcherで読み込ませてみたら、dmgファイルも認識したのでこちらで復元した。 **圧縮されたdmgでも問題なく復元できた**

<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/786e3f91-75d3-01b2-78c5-2673fab054e6.png" width="600">


書き込みが無事に完了したら、ラズパイに挿してみて、SSH接続を試す。
認証情報も同じなので確認画面も出ず、バックアップ前のSDカードと全く同じ感じで起動した。
>1台運用のためのバックアップならこれでOKだが、複数台運用のためのクローンとして使うのであれば、認証情報などがバッティングするとマズイので更新する必要があるだろう。

ネットで調べてみると、ディスクユーティリティでの復元が失敗することで、最終的にddコマンドを使わざるを得ない感じの記事が多かったが、Macでのリスクの少ないGUIバックアップ・復元ができることがわかった。

#■まとめ
ちょっとリスキーなddコマンドを使用せずに、ラズパイの初期設定からバックアップ・復元までをMacのみで行うことが出来た。
ポイントは、 ***Macのディスクユーティリティでバックアップを作成してEtcherで復元***すること。

これで復元するにしてもクローンを作るにしても、面倒な初期設定を終わらせた状態から始められるので良い。
ここから先で設定変更した後でも、適宜バックアップをとっていけば、リカバリーポイントとして使えるようになるのでこまめにバックアップしておきたい。
なお、wifiのパスワードはヘッドレスセットアップの都合上どうしても入ってしまうので、バックアップファイルは公開しないように注意。