ラズベリーパイ4にNode.jsをインストールするまで

自宅簡易サーバを作ろうと思い、ラズベリーパイ4を購入しました。とりあえず、Node.jsをインストールするところまでの備忘録です。
# OSのインストール
OSを何にするか迷いましたが、結局ラズベリーパイ標準OSのRaspbianを入れることにしました。OSイメージは[こちら](https://www.raspberrypi.org/downloads/)からダウンロード。
RaspbianはDebianベースのOSなのでUbuntuとかに慣れ親しんだ人であればほとんど苦労することは無いと思います。パッケージ管理はaptです。
基本的には手元のMacからSSH接続にて使おうと思ったので、CUI(Raspberry Pi Lite)を選択しました。
まずは、SDカードにOSを入れるところから始めます。SDカードにOSを書き込む方法も色々あるようですが、私は[Rufus](https://rufus.ie/)というフリーソフトを使いました。詳しい使い方は[こちら](https://hashitaka.jp/raspberrypi4/centos7-install/)を参考にしました。
Rufusを使ってOSイメージをSDカードに書き込んだら完了です。

# 初期設定
OSイメージを書き込んだSDカード、キーボード、モニタをラズベリーパイに接続します。このとき、4Kディスプレイとかに接続してしまうと文字が小さすぎて辛いので、解像度があまり高くないモニターに接続したほうがよさそうです。。。
電源を入れて暫く待つとOSが起動し、ログインが求められます。
デフォルトユーザとして**pi**、パスワード**raspberry**が用意されています。
ログインができたら以下コマンドで初期設定を開始します。

```
// 以後sudo打つのが面倒なのでsuper userになります。
$ sudo su -
$ raspi-config
```
コマンドを実行するとキャラクタベースのUIが起動します。
まず、raspi-config自体の更新を行います。 8 Updateを選択します。
その次にキーボードの設定を行います。[こちら](https://www.clara.jp/media/?p=5542)に絵付きでわかりやすく解説されてますので、参照してください。
上記に記載されていない内容として時刻設定もしておいたほうがよさそうです。

* 4 Localisation Optionsを選択。
* I2 Change Timezoneを選択。
* Asiaを選択。
* Tokyoを選択。
* Finishを選択。

dateコマンドでJSTになったことを確認

```
$ date
Mon  1 Jun 19:01:31 JST 2020
```

# Wi-Fi設定
情報が錯綜しており、Wi-Fi設定は結構ハマりました。
## WiFiネットワークをラズベリーパイに追加する
WiFiに接続できるまで辛いですがとりあえずviを使います。ネットワークの設定はwpa_supplicant.confを編集します。ご自宅のWiFiのSSIDとパスワードを用意して下さい。
直接SSIDとパスワードを入れてもいいのですが、セキュリティが不安なので、暗号化されたパスワードを登録します。
以下コマンドを実行します。

```
$ sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

これで暗号化されたパスワードがwpa_supplicant.confに登録されますが、生パスワードが残っているので削除します。

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

network={
        ssid="SSID"
        #psk="PASSPHRASE" #削除
        psk=xxxxxxxxxxx....xxx
}
```

これでラズベリーパイを再起動すれば一応WiFiに接続できるはずなのですが、私の場合以下エラーで接続できませんでした。

```
$ reboot
```

```
wifi is currently blocked by rfkill
```
ここで結構ハマりました。ifconfigで確認してもwlan0が一向に現れませんでした。
以下コマンドでOSのWiFi機能の状態を確認すると確かにOS側で機能がブロックされていました。

```
$ sudo rfkill list all
0: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: hci0: Bluetooth
        Soft blocked: yes
        Hard blocked: no
```

以下コマンドを実行することでwlan0が表示されるようになります。

```
$ rfkill unblock all
$ dhclient wlan0
```

## IP固定化
今のままだと再起動の度にIPアドレスが変わってしまうのでIPの固定化を行います。
以下コマンドで設定ファイルを開きます。(WiFiが繋がるようになったので、予めvimをインストールします。付録参照)

```
$ vim /etc/dhcpd.conf
```
ファイルを開いたら、一番下までスクロールし、下記項目を追加します。

```
interface wlan0
static ip_address=192.168.3.x/24 // 固定IPアドレスxはお好みで。 "24"はサブネットマスク長
static routers=192.168.3.1 // デフォルトゲートウェイのIPアドレス
static domain_name_servers=192.168.3.1 // DNSサーバのIPアドレス
```
それぞれの確認に困ったら[こちら](https://qiita.com/ponsuke0531/items/3a559ffc08aed8b19281)を参考に。
設定後、再起動しifconfigでIPアドレスを確認し設定が反映されていればOK。

# SSH接続

```
$ vim /etc/ssh/sshd_config 
PasswordAuthentication no
// ファイルを保存後、sshd を再起動して設定を有効化します
$ systemctl restart sshd
// 正常に稼働しているかどうかは、次のようにコマンドを実行し、sshd が「Active: active (running)」なのを確認します
$ systemctl status sshd
// Active: active (running) が出てればOK
```
あとはキーペアを作成し、ラズベリーパイに公開鍵を登録すればSSH接続ができるはずです。
キーペア作成及び公開鍵の登録については以前自分の書いた[こちら](https://qiita.com/gdate/items/2f097ffb9dd3ae0f5829#%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E8%A8%AD%E5%AE%9A)を参考にできるかと思います。
ここまで完了すればあとはHDMI、キーボードを外しご自身の開発環境からSSH接続して操作すると快適かと思います。

# Node.jsのインストール
nodeに関してはやりたいことに応じて入れるバージョンなども変わってくると思いますので、パッケージ管理ツール**N**を使ってインストールします。個人的な都合でv8.17.0を入れていますが、お好みで変えて下さい。

```
$ sudo apt install npm
$ sudo apt install nodejs
$ sudo npm install n -g
$ sudo n stable
$ sudo apt purge -y nodejs npm
$ sudo n 8.17.0
$ node -v
```


# 付録
## vimのインストール

```
$ apt-get install vim
```

## gitのインストール

```
$ apt install git
$ git config --global user.email "hoge@gmail.com"
$ git config --global user.name "hoge"
```

## aptのインストールでうまく行かないとき

```
$ apt-get update
$ apt full-upgrade -y
```

# 参考
* [Raspberry pi 4 へOSをインストールしてみたよ！（とりあえずSSH接続できるまで）](https://www.clara.jp/media/?p=5542)
* [Raspbian Buster Liteの最速最小インストール](https://vasco-blog.com/blog/2019/09/28/install-raspbian-buster-lite/)
* [Raspbian初期設定(RaspberryPi4)](https://qiita.com/legitwhiz/items/bc897259b27f3c0e7aa0#19-ssh%E8%A8%AD%E5%AE%9A)
* [Raspberry Pi 3 (Raspbian Jessie)の無線LANに固定IPアドレスを設定する](https://qiita.com/momotaro98/items/fa94c0ed6e9e727fe15e)
* [[Raspberry Pi 3B+]wlan0がifconfigで見えない時の対処法](https://qiita.com/hiden_no_tare/items/7c48adf05833d230cdc6)
* [ラズベリーパイで固定IPアドレスを設定する](https://mugeek.hatenablog.com/entry/2019/05/27/230256)
* [【Raspbian】apt-get upgradeがエラーになるときの対処法](https://creepfablic.site/2019/09/19/raspbian-apt-get-upgrade-error/)
* [Ubuntu18.04で任意のバージョンのNode.jsをインストールする方法](https://www.trifields.jp/how-to-install-node-js-on-ubuntu1804-3544)
* [Raspberry PiのTimezoneをAsia/Tokyoに変更する](https://inaba.hatenablog.com/entry/2016/12/25/040243)