Raspbian Stretch Lite on Raspberry Pi 3 初期設定メモ

# 概要
Raspberry Pi 3をヘッドレスで運用する際の設定メモ．

# 準備

## OSイメージのダウンロード

[Raspbianの公式ページ](https://www.raspberrypi.org/downloads/raspbian/)から最新バージョンのRaspbian **Lite**のイメージをダウンロード・展開する．
(2018/01/02時点の最新バージョンは2017/11/29リリースのもの)

## OSイメージの書き込み
Windows環境では[DD for Windows](http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows)を用いるのがよさそう．

1. SDカードをPCに接続し，ドライブレターを確認しておく(**間違いがないように**)．
2. DD for Windowsをダウンロード・展開し，`DDWin.exe`を**管理者権限**で実行する．
3. **ディスク選択**から，接続したSDカードのドライブレターを選択する．
4. **ファイル選択**から，ダウンロードしたOSイメージ(今回は`2017-11-29-raspbian-stretch-lite.img`)を選択する．
5. **書込**をクリックし，OSイメージが書き込まれるまで待つ．
6. 書き込み処理が終わったら，sshを有効化するためにSDカードのルートディレクトリに`ssh`という名前で空のファイルを作成する．
![boot.png](https://qiita-image-store.s3.amazonaws.com/0/157866/67ec56c3-e2de-3692-e088-3add7aaef43a.png)
7. SDカードを取り出す．

# 初期設定

## 起動

1. Raspberry Pi 3にSDカードを挿入し，LANケーブルを接続した状態で電源を接続する．
2. DHCPでIPアドレスが割り振られるはずなので，ルータのログ等を確認してRaspberry PiのIPアドレスを確認する．
![log.png](https://qiita-image-store.s3.amazonaws.com/0/157866/0473744c-625c-9ea6-914a-5e60921a7a04.png)
3. 適当なSSHクライアントでRaspberry Piに接続する．(ID:`pi`，パスワード: `raspberry`)

```
$ ssh pi@192.168.0.14
pi@192.168.0.14's password:
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l

pi@raspberrypi:~ $
```

## アカウント関連の設定

- `root`のユーザを設定する

```
pi@raspberrypi:~ $ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
pi@raspberrypi:~ $
```

- 新しいユーザ `username` を追加する．

```
pi@raspberrypi:~ $ sudo adduser username
Adding user `username' ...
Adding new group `username' (1001) ...
Adding new user `username' (1001) with group `username' ...
Creating home directory `/home/username' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for username
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
pi@raspberrypi:~ $
```

- `username` をグループに追加する．

```
# piの所属するグループを確認する
pi@raspberrypi:~ $ id pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),999(spi),998(i2c),997(gpio)
# usernameを同じグループに追加する
pi@raspberrypi:~ $ sudo usermod -aG adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio username
# 確認
pi@raspberrypi:~ $ id username
uid=1001(username) gid=1001(username) groups=1001(username),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),999(spi),998(i2c),997(gpio)
pi@raspberrypi:~ $
```

- 一度ログアウトする．

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

- 新しく作成したユーザでログインする．

```
$ ssh username@192.168.0.14
username@192.168.0.14's password:
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l

username@raspberrypi:~ $
```

- ユーザ `pi` を削除する

```
username@raspberrypi:~ $ sudo userdel -r pi

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for username:
userdel: pi mail spool (/var/mail/pi) not found
username@raspberrypi:~ $
```
- ログアウトする．

```
username@raspberrypi:~ $ exit
```

## Raspberry Pi 固有の初期設定

### raspi-config

```
username@raspberrypi:~ $ raspi-config
```

- `2 Network Options` の設定
    - `N1 Hostname` でホスト名を設定 (`username-pi`)
- `3 Boot Options` の設定
    - `B1 Desktop / CLI` で `B1 Console` を選択
- `4 Localisation Options` の設定
    -  `I1 Change Locale` の設定
        - `en_GB.UTF-8 UTF-8`のチェックを外し(Spaceキー)，`ja_JP.EUC-JP EUC-JP` と `ja_JP.UTF-8 UTF-8` にチェック
        - Default localeを`ja_JP.UTF-8`に設定
    - `I2 Change Timezone` で `Asia/Tokyo` に設定
    - `I4 Change Wi-fi Country` で `JP` に設定
- `7 Advanced Options` の設定
    - `A1 Expand Filesystem` を実行して，SDカードの全容量を使用できるように設定
    - `A3 Memory Split` で，GPUに割り当てるメモリを最小の**16MB**に設定
- `8 Update` で，`raspi-config` を更新

- 再起動する．

```
username@raspberrypi:~ $ sudo reboot
```

- 新しいホスト名でSSHログインできることを確認する．

```
$ ssh username@username-pi.local
username@username-pi.local's password:
Linux username-pi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l

username@username-pi:~ $
```

- SDカードの全容量が認識されていることを確認する．

```
username@username-pi:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         15G 1023M   14G    8% /
devtmpfs         484M     0  484M    0% /dev
tmpfs            489M     0  489M    0% /dev/shm
tmpfs            489M   13M  476M    3% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            489M     0  489M    0% /sys/fs/cgroup
/dev/mmcblk0p1    41M   21M   21M   51% /boot
tmpfs             98M     0   98M    0% /run/user/1001
```
- 表示言語を英語にしたい場合は，`~/.bashrc` に `LANG="en_US.UTF-8"` と記述する．

### SDカードの延命対策

参考: https://azriton.github.io/2017/03/16/Raspbian-Jessie-Lite%E3%81%AESD%E3%82%AB%E3%83%BC%E3%83%89%E5%BB%B6%E5%91%BD%E5%8C%96/

- SDカードでSwapを用いると寿命が短くなるので，Swap領域を0にする．

```
username@username-pi:~ $ sudo swapoff --all
username@username-pi:~ $ sudo apt-get purge -y --auto-remove dphys-swapfile
username@username-pi:~ $ sudo rm -rf /var/swap
username@username-pi:~ $ free -mh
              total        used        free      shared  buff/cache   available
Mem:           976M         29M        779M         12M        167M        884M
Swap:            0B          0B          0B
```

- ログ出力を抑制する．
    - `/etc/rsyslog.conf` の `#### RULES ####` 以下で，必要のないものをコメントアウトする．
    - (`cron` 以外は抑制するようにしている．)

## パッケージの削除

- 必要ないパッケージを削除する．
    - 以下のスクリプトを実行する．

```bash:create_minumum_raspbian.sh
#! /bin/bash

# Update repos
sudo apt update

# Packages to remove
DOCS="man manpages libraspberrypi-doc debian-reference-en debian-reference-common"
GCC="gcc-4.5-base:armhf gcc-4.6-base:armhf gcc-4.7-base:armhf"
DEV=`sudo dpkg --get-selections | grep "\-dev" | grep -v "deinstall" | sed s/install//`
SOUND="omxplayer "`sudo dpkg --get-selections | grep -v "deinstall" | grep sound | sed s/install//`
PYTHON=`sudo dpkg --get-selections | grep -v "deinstall" | grep python | sed s/install//`
JAVA="java-common oracle-java7-jdk oracle-java8-jdk"
LEARNING="scratch squeak-vm squeak-plugins-scratch supercollider sonic-pi wolfram-engine"

# Purge packages
sudo apt purge -y $DOCS $GCC $DEV $SOUND $PYTHON $JAVA $LEARNING
sudo rm -rf /usr/local/games/
sudo rm -rf /usr/games/

# Autoremove
sudo apt autoremove -y
# Upgrade packages and distribution
sudo apt upgrade -y
sudo apt dist-upgrade -y
# Clean archive files
sudo apt clean -y

# Update firmwares
sudo apt install -y rpi-update
sudo rpi-update

# Clear logs
cd /var/log/
sudo rm `find . -type f`
history -c

# Reboot
sudo reboot
```

- 再起動されるので，しばらくしてからSSHで再ログインする．

## 不要デーモンの無効化

- `chkconfig` をインストールする．

```
username@username-pi:~ $ sudo apt install -y chkconfig
```

- `triggerhappy`，`alsa-utils`，`plymouth` を停止する．

```
username@username-pi:~ $ sudo chkconfig triggerhappy off
username@username-pi:~ $ sudo chkconfig alsa-utils off
username@username-pi:~ $ sudo chkconfig plymouth off
```

## NTPによる時刻設定

- `ntp`をインストールする．

```
username@username-pi:~ $ sudo apt install ntp
```

- `/etc/ntp.conf`の`pool ***.debian.*** iburst` をコメントアウトし，NICT等のNTPサーバを追加する．

```
username@username-pi:~ $ sudo vim /etc/ntp.conf

# pool 0.debian.pool.ntp.org iburst
# pool 1.debian.pool.ntp.org iburst
# pool 2.debian.pool.ntp.org iburst
# pool 3.debian.pool.ntp.org iburst
pool ntp.jst.mfeed.ad.jp
pool ntp.nict.jp iburst

username@username-pi:~ $ sudo service ntp restart
```

- 動作確認する．

```
username@username-pi:~ $ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp.jst.mfeed.a .POOL.          16 p    -   64    0    0.000    0.000   0.001
 ntp.nict.jp     .POOL.          16 p    -   64    0    0.000    0.000   0.001
 ntp3.jst.mfeed. 133.243.236.17   2 u    4   64    3    8.211    0.739   1.132
 ntp1.jst.mfeed. 133.243.236.17   2 u    1   64    3    7.267   -0.481   0.898
+ntp-a3.nict.go. .NICT.           1 u   55   64    1    7.969   -0.003   0.985
 ntp2.jst.mfeed. 133.243.236.17   2 u   64   64    1    8.284    0.083   0.001
+ntp-a2.nict.go. .NICT.           1 u   55   64    1    8.065   -0.056   1.122
+ntp-a3.nict.go. .NICT.           1 u   54   64    1    8.453    0.132   1.156
+ntp-b2.nict.go. .NICT.           1 u   56   64    1    8.597   -0.114   1.278
+ntp-b3.nict.go. .NICT.           1 u   52   64    1    9.856    0.801   1.665
*ntp-a2.nict.go. .NICT.           1 u   50   64    1    8.144    0.127   0.910
```

## 定期再起動の設定

- rootに移行する．

```
username@username-pi:~ $ sudo -s
root@username-pi:/home/username#
```

- crontabを設定する．(**コマンド `crontab -e` を間違えないように注意**)

```
# エディタが起動するので，設定を記入する
# 2日おき，AM4:00に再起動を行う場合
root@username-pi:/home/username# crontab -e
# Reboot
0 4 */2 * * /sbin/shutdown -r now

# 設定を確認する
root@username-pi:/home/username# crontab -l
# Reboot
0 4 */2 * * /sbin/shutdown -r now
```