Raspbian(NOOBS)を(Android)スマホのみでヘッドレス・PCレスインストールする

#概要
Raspberry PiへのRaspbian(NOOBS)の(再)インストールをPC・ディスプレイ・キーボード・マウス・LAN(Wifi)なしの環境でスマホのみを使って行います。

このような状況は全く想定していないのか主に(非Rootの)Androidの制限を避けるための余分な作業が強いられるので特に理由がなければ上記の環境をさっさと用意したほうが圧倒的に楽です。

個人的にはあえて意義を見出すなら環境が乏しい中の緊急事態時にRaspbianを(再)インストールするための選択肢の一つとして備えておいても損はないのかなぁ、くらいです。

基本的にはすでにあるヘッドレスインストール・運用手法の応用ですが、NOOBS用とRaspbian用がばらばらでまとまってなかったり、情報が古かったりしたので記事にしてみました。

なお、iPhone(iOS)の場合はさらに制限が多く単体では不可能ですが、技術的には多分できるんじゃないかなぁとは思います、ただし持っていないので確認できません。iPhoneを用いる場合に考えられる事項は都度書いていくつもりですが、正確かどうかは確認できないのでわかりません。

※本当にスマホ単体で完結する場合、(ほとんどはRaspbian本体のダウンロードのために)1ギガ以上のキャリア通信が伴いますので料金や制限には十分に気を付けましょう。


#条件
スマホ単体でRapsberry PiにRaspbianをインストールするには下記の条件を満たすAndroidスマホが必要です

1. (Wifi)テザリングに対応していること
2. MicroSDカードスロットが搭載されていること

まぁタブレットならともかく今時キャリア経由やMVNO経由で購入するAndroidスマホで上記に対応していないのは相当にレアで特殊なんじゃないかと思うのでまず問題はないかと思いますが確認はしておきましょう。またどうやって確認してるのか謎ですがテザリングがオプションとして別途有料となっているキャリアが存在しますので気を付けましょう。

スマホ単体とは言い難いし非常時のために常に持ち歩くようなものでもないとは思いますが、確認・検証・練習する際はOTGに対応しているスマホであればOTGケーブル・ハブとカードリーダー、もしくはスマホ対応のカードリーダーが使えるのでそちらでMircoSDを読み書きするとだいぶ楽になります。今時OTG非対応なんてなかなかアレなんじゃないかとは思いますが一応合わせて確認はしておきましょう。

iPhoneの場合はMicroSDカードスロットなんてものは存在しないのでカードリーダーが必須です。

#アプリ
用意するアプリは該当の機能があれば何でもいいのですが、一応無料でアプリ数が最小となるように選定しました、アプリ数は3です。多分これが最小だと思います~~(フラグ)~~。

##[ESファイルエクスプローラー](https://play.google.com/store/apps/details?id=com.estrongs.android.pop)
Androidではいわずと知れた超有名アプリですが、これ一つで必要となるファイラー(ファイルのコピー・作成)・アーカイバー(ZIPファイルの解凍)・テキストエディタ(設定ファイルの編集)が揃うのでAndroidの場合はこれを入れておけば間違いないでしょう。iPhoneにも単一アプリでなくとも該当のアプリはさすがに揃うんじゃないでしょうか？

##[Termux](https://play.google.com/store/apps/details?id=com.termux)
Android上で動くコマンドラインアプリですが、opensshをインストールするコマンドを実行すればsshクライアントにもなります。sshクライアントは必須ですし、コマンドライン上で確認することで楽になる作業があるので個人的にはこちらがおすすめです。Appleが認めるとは思えない(偏見)のですがiPhoneにはあるんですかねこういうの？さすがにsshクライアントはあるとは思いますが。

##[VNC Viewer(RealVNC製)](https://play.google.com/store/apps/details?id=com.realvnc.viewer.android&hl=ja)
VNCクライアントは正直なんでもいいんですが、2019年現在Raspbian内蔵のVNCサーバーはRealVNCだそうなので特にこだわりがなければRealVNCのVNC Viewerでいいんじゃないでしょうか。おすすめはしませんが今後NAT越えして別のネットワークからRaspberry PiをVNCでリモート操作(VNC Connect)したい場合はこのアプリが必要です。iPhone版もあるみたいです。


[Pi Card Imager](https://www.raspberrypi.org/forums/viewtopic.php?t=170856)というMicroSDカードにRaspberry PiのOSを書き込んでくれるアプリがありますが、非Root環境ではイメージをMicroSDに直接焼くことができないためNOOBS経由のインストーラーしか書き込みできません。ならこの記事の条件ではファイラーからのコピーで十分なので不採用となりました。ヘッドレスインストールしないまたはRoot化済みの機器があるならオススメです。

#手順
スクリーンショットはヒマができれば追い追いやりたいとは思っています…

ちなみに自分は以下の環境で下記の作業を行いました
au Xperia XZ2 Permium SOV38(Android Pieにアップデート済)
Raspberry Pi 3 Model B+

##0.フォーマット
再インストールの場合はMicroSDカードをフォーマットする必要があります。Raspbianインストール済みのMicroSDは複数のパーティションに分割された状態になっているのですが、(非Rootの)Androidは基本的にそういうのには対応していないっぽく先頭のパーティションだけ認識されるようです(たまに次のパーティションも一緒に認識されることもあります、不安定です)、またESファイルエクスプローラーに複数パーティションに分割されたMicroSDを入れても非対応なのかまともに認識しないようです。

Androidの設定にあるフォーマットでフォーマットする(機種やAndroidのバージョンによって行き方が違うので確認しておきましょう)とパーティション丸ごと初期化されてMicroSD全容量が割り当たってる単一のパーティション構成になるようです(これは何回やっても同じ挙動でした)。機種によって挙動違う可能性があるので一応手持ちの中華AndroidタブiRulu X7(MarshMallow)とアマゾンのFire7(2017年版、確かLolipopベース)でも試してみましたが同様でした。こういう情報はさっぱりないので何とも言えないのですが多分どれも一緒なんじゃないでしょうか？
なお、フォーマットアプリ的なものはストアにありますが、怪しかったりRoot必須だったりするので使うのはやめたほうがいいと思います(結局非Rootスマホでは標準機能以上の事はできないでしょうし)。

iPhoneもAppleがそういう方向で気を利かすなんてことはまずない(偏見)でしょうからカードリーダーや対応アプリによるんでしょうがなんとなくフォーマット自体非対応の可能性が高いような気がします、その場合(Androidでパーティション丸ごとフォーマットできなかった場合も)再インストールは不可能になります。コンビニで新しいMicroSDカードを買って新規インストールし、Raspberry Pi上で本来のMicroSDをフォーマット・OSインストールするのが追加費用や手間が最も少ないのではないでしょうか。

##1.NOOBSのダウンロード・コピー

ダウンロード：[NOOBS](https://www.raspberrypi.org/downloads/noobs/) 
日本のミラーサイト：[NOOBS](http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/)　[NOOBS Lite](http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS_lite/images/)

RaspianのインストールにはNOOBSの他にMicroSDに直接Raspbianのイメージを書き込む(焼く)方法が存在しますが、(非Rootの)Androidではそのような書き込みは不可能なのでNOOBS経由でRaspbianのヘッドレスインストールをする必要があります。なおRaspian入りのNOOBSでも入っていないNOOBS LiteでもどちらでもOKです。ストレージの容量を犠牲にしてあらかじめWifi経由でNOOBSをダウンロードしておけばキャリア通信を節約できますので状況に応じて選べばいいと思います。
手順としてはPCを使う場合と変わらずダウンロードしてZIPファイルを開いて(解凍して)SDにコピーするだけです。ESファイルエクスプローラだと今時のPC同様ZIPファイルを開くとフォルダの一つのように見えてコピー等の操作ができるので楽です。

##2.Wifi設定ファイルの作成、NOOBSの設定
Raspbianのヘッドレス操作の場合はどうやらUSBテザリングが使えるそう([参照](https://dbpro.xyz/3967))でその場合設定が不要なんですが、残念ながらNOOBSでは試してみた感じドライバが入っていないのか認識せず使えなかったのでWifiテザリングになります(Raspbianが直接焼ければもしくはNOOBSがUSBテザリングできればだいぶ楽になるのに…)
ヘッドレスなので直接操作できず、sshやVNCで操作するにはWifiにつながないといけないのであらかじめ自動でWifi接続してもらうための元になる設定ファイルwpa_supplicant.confを作成しておく必要があります。
といってもググればテンプレートは沢山あるのでコピペして必要なところを書き換えるだけです、ちなみに自分は下のような感じにしました。
SSIDとパスワードはWifiテザリングの設定(機種やAndroidのバージョンによって行きかたが違うので要確認)で設定できるので設定しておき、その設定に合わせてファイルを書き換えます。

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="SSID"
    psk="パスワード"
}
```

このファイルをNOOBSをコピーしたMicroSDのルートディレクトリに入れるとNOOBSがこの設定を読み込んで接続してくれるようです。

かつてこの設定はNOOBSだけ有効でRaspbianには引き継がれなかったためヘッドレス環境ではRaspbianインストール後に詰んでしまうので、改めてRaspbianでも引き継がれるようにインストール用のシェルスクリプトを改変する必要があった(のでNOOBS Liteは不可だった)らしい([参照](https://qiita.com/rshibasa/items/c63ff7450842e3b0ab9b#ssh%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B))ですが、現在のNOOBS(Ver3.0.0からかな？)はこの設定ファイルが存在すればインストール後にコピーしてRaspbianに引き継がれるようになっている(詳しくはNOOBSのos/Raspbian_Full/partition_setup.sh参照)のでそういった細工は不要です。

詳しくは後述しますが、Raspbianのインストール後にヘッドレス操作するために必要なssh(という名前の空ファイル)ですが、これも現在のNOOBSでは存在すればコピーしてRaspbianで有効になるようになっているのでこの段階でwpa_supplicant.confと同じルートディレクトリに作成しておきます。**これを忘れるとインストール後に詰んでほぼ最初からやり直しになりかなりのロスになりますので忘れないように。**

NOOBSのVNC経由インストールはデフォルトでは無効になっているので有効になるようにファイルを編集する必要があります。
ルートディレクトリにrecovery.cmdlineというファイルがありますので、そこにvncinstallを追加するとVNC経由でインストール操作ができるようになります。
quietをvncinstallに書き換える人と後ろに追記する人がいるようですが、違いはあるんでしょうか？よくわかりません。ちなみに自分はquietを書き換えました。

```
runinstaller vncinstall ramdisk_size=32768 root=/dev/ram0 init=/init vt.cur_default=1 elevator=deadline
```

##3.NOOBSでRaspbianのインストール
すべてのコピーとファイルの作成編集が終わったらスマホからMicroSDカードを取り外してRaspberry Piに入れます。
**スマホのWifiテザリングをオンにしてから**Raspberry Piを起動します、後になっても大丈夫みたいですが後々VNCで接続するとネットに接続できなかった旨のエラーダイアログが出ていると思います。

ただ、このままではインストール操作のためVNC接続しようにも接続してきたRaspberry PiのIPアドレスが不明で接続しようがないのでIPアドレスを調べる必要があります。
調べる方法はいろいろありますが、termuxからarpコマンドを使って調べるのが一番手っ取り早いと思います。termuxから

```
$ arp -a
```

を実行するとRaspberry Piが接続に成功している場合はRaspberry PiのIPアドレスが表示されているはずです(他の機器もテザリングでつなげている場合はそのIPアドレスも表示されます)
表示されていない場合は設定ファイルが間違っているかコピーできていないかテザリングがONになっていない等で接続できなかったということなのでやり直しです。

コマンドラインを使わない場合や(多分)使えないiphoneの場合はpingを打つアプリや接続機器を走査するアプリを使って確認することになると思います(未確認)

IPアドレスがわかったらVNCで接続します。IDもパスワードもありません(!)VNC Viewerの場合無認証なのでセキュリティ的に危ないよー的な英文メッセージが出てきたりしますが、どうしようもないので無視して継続して接続します。

(arpコマンドで接続は確認できてるのに)VNC接続できない場合はおそらくrecovery.cmdline設定ファイルが書き変わっていないと思われるのでやり直しです。検証・練習等でモニターがある場合は接続してみてください、普通にインストール画面が表示されていたらVNCインストールが有効になっていないということになります(現状NOOBSではVNCと通常のモニタ画面の併用はできないみたいです)

インストール自体はVNC経由であること以外は何も変わらないので割愛します。おそらくここでRaspbian以外のOSをインストールすると詰む可能性が極めて高いと思われるのでやめましょう。

自分だけかもしれませんが、スマホでフォーマットし、NOOBS Liteと前述のファイルをコピーしたSDでRaspbianをインストールしようとすると書き込みエラーでインストールしないことがありました、その場合は一度電源をOFFにして再度ブートしてインストール操作をするとインストールできました。どうしてこうなるんでしょう？わかりません。

##4.Raspbianにssh接続
現在のRaspbianはセキュリティの観点からsshもVNCも最初は無効になっています(昔はsshは有効になっていたらしいですが)、ただそれだとヘッドレス運用ではどうしようもなくなってしまうので、/bootディレクトリ(他からみるとbootパーティションのルートディレクトリ)にsshという空ファイル(ssh.txtでもOKらしい?)が存在している場合は自動でsshを有効にするという仕組みになっているようです。

NOOBSからRaspbianをインストールする場合このファイルを作る機会がありません、Androidスマホの場合後からこのファイルを作成しようにも第2パーティションのアクセスには対応していないようなので書き込めません(機種や運によってはできるかも？)。なのでNOOBSの段階でどうにかする必要があったのですが、現在は前述のとおりあらかじめsshファイルを作っておくとインストール後にコピーしてくれるようになったのでこの点で悩む必要はありません。

sshクライアントを起動してRaspberry Piに接続します、通常はNOOBSにVNC接続した時のIPから変わっていないことがほとんどだと思いますが、前回確認した方法で確認しておきましょう。

IDはpi、パスワードはraspberryになります。

termuxの場合はデフォルトでsshは使えないので、opensshをインストールしてsshを使えるようにしてから接続します。

```
$ pkg install openssh
$ ssh pi@[ipアドレス]
```

termuxの場合、以前に検証・練習などで同じIPアドレスで再インストール前のRaspbianに接続していた場合、おそらく鍵が異なる旨の長い英文のエラーが出て接続できないので、その場合はおそらく対応する鍵を保管してると思われるファイルを削除する必要があります。

```
$ rm /data/data/com.termux/files/home/.ssh/known_hosts
```

sshに接続できなかった場合はどうしようもありませんのでMicroSDのフォーマットからやり直しになります。検証・練習等で確認できる環境がある場合はどうして接続できなかったのか確認しておきましょう。

接続出来たらssh経由でRaspbianの設定コマンドを起動します。

```
$ sudo raspi-config
```

5 Interfacing OptionからP3 VNCを選んでONにします。

これでVNC接続ができるようになっていますので接続します。

IDはsshと同様にpiパスワードはraspberryです。

sshが有効だけどパスワードが初期状態だから危険ですよといった趣旨の警告ダイアログとその後ろにRaspbianの初期設定ダイアログが見えるはずです。

そうなっていれば成功です。警告ダイアログを消し、通常通り初期設定しておいてください。

パスワードを変えただけではVNC接続は切れないようです。次に接続するときは初期設定で設定したパスワードで接続します。

##5.感想
仕方ないんだろうけどAndroid制限多過ぎ・・・
Raspberry Pi自体がPCなので(Windows/Linux)PCレスインストールや運用はやりやすいようにもっと考慮してくれてもいいんじゃないかなぁとは思います。