Raspberry Pi に raspbian をキーボードとディスプレイなしでインストールする無精手順[要シリアルケーブル]

# Raspberry Pi に raspbian をキーボードとディスプレイなしでインストールする無精手順[要シリアルケーブル]

## 目的

- 個人的メモ
- キーボードとディスプレイ接続めんどくさい

## 対象

- UNIXコマンド多少わかる

## 構成

- 作業環境ホストPC: macOS Sierra
- HW: Raspberry Pi Model B+ v1.2
- OS: raspbian
    - 2016-11-25-raspbian-jessie
- Storage: microSD カード
    - 8G ~ 32G くらい
        - 今回は 32G を準備
- USBシリアルケーブル: Raspberry Pi Arduino PL2303HX内蔵USBシリアル変換ケーブル
    - https://www.amazon.co.jp/dp/B00KWTQWL0/
- ケース: Pibow 3 Coupe
    - https://www.amazon.co.jp/dp/B01CECEJB2/

## 手順
### 1. ダウンロード

- 本家: https://www.raspberrypi.org/downloads/
- ミラー: http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
  - 日本国内ミラーからダウンロードしたほうが早いかも

```shell-session
curl -O http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2016-11-29/2016-11-25-raspbian-jessie.zip

curl -O http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2016-11-29/2016-11-25-raspbian-jessie.zip.sha1
```
```shell-session
FILE_NAME='2016-11-25-raspbian-jessie'

openssl sha1 $FILE_NAME.zip | awk '{print $2}' | grep --color -x `cat $FILE_NAME.zip.sha1 | awk '{print $1}'`
```
```shell-session:outpuut
6587483c9b90b11185e2ce99175e27fe75af1f61
```
```shell-session
unzip $FILE_NAME.zip

ls -lh $FILE_NAME.img
```

### 2. SD カードへの書き込み
#### 2-1. デバイス名を確認

システムディスクが /dev/disk0 なので disk1 以降を見つけます

- SD カード接続前

```shell-session
df -h | grep '/dev/disk[1-9]'
```
- SD カード接続後

```shell-session
df -h | grep '/dev/disk[1-9]'
/dev/disk1s1                        56Mi  8.4Mi   47Mi    16%     512          0  100%   /Volumes/NONAME
```

> デバイス名 /dev/disk1 を確認出来ました。

- mac で disk1 でなく raw device の rdisk1 を指定していることについては man hdiutil を確認
  - 要は rdisk を指定したほうが dd が速いです

#### 2-2. 書き込み

**デバイス名を間違わないように注意!!!**

```shell-session
DEV_NAME='/dev/rdisk1'
echo $DEV_NAME
echo $FILE_NAME.img

sudo diskutil unmountDisk $DEV_NAME
sudo dd bs=1m if=./$FILE_NAME.img of=$DEV_NAME conv=sync
```
- http://akkiesoft.hatenablog.jp/?page=1502888162


#### 2-3. アンマウントと取り外し

マウントされている場合はアンマウントして取り外しましょう。

```shell-session
sudo diskutil unmountDisk $DEV_NAME
```

### 3. Raspberry Pi の起動

#### 3-1. コンソールケーブルの接続

GPIOピンアサイン図
- https://www.raspberrypi.org/documentation/usage/gpio/

|ピン|ケーブル色|
|:---:|:---:|
|Ground|黒|
|14|白|
|15|緑|
|Not Connected|赤|

![IMG_1130.JPG](https://qiita-image-store.s3.amazonaws.com/0/67892/4ba2b724-3f4d-c1f0-63e3-2f6ea5cc775c.jpeg)

- ホストPCのUSBポートに接続し /dev/cu.usbserial が見えていたらOK

```shell-session
ls /dev/cu.usbserial
```
```shell-session:output
/dev/cu.usbserial
```

#### 3-2. Raspberry Pi の電源を入れログインする

- screen コマンドでシリアル接続します。

```shell-session
screen /dev/cu.usbserial 9600
```

- 何かキーを押してプロンプトが表示されればここまでは成功です

```shell-session:output
Raspbian GNU/Linux 8 raspberrypi ttyAMA0

raspberrypi login:
```

- 以下のアカウントでログインします。
  - UserName: pi
  - PassWord: raspberry

```shell-session:output
pi@raspberrypi:~$
```

### 4. 初期設定

#### 4-1. ルートパーティションの拡張

dd コマンドで転送した初期イメージ(約4GB)から利用しているSDカードの最大サイズまで拡張します。

```shell-session
sudo raspi-config
```
> 1 Expand Filesystem

再起動して適用します。

```shell-session
sudo reboot
```

#### 4-2. エディターを変更します(vim.tiny)

```shell-session
sudo update-alternatives --config editor
```

#### 4-3. ネットワークの設定をします

##### 4-3-1. 有線LANの場合

- 設定ファイルを編集します。

ref. man 5 interfaces

```shell-session
sudo vi /etc/network/interfaces
```
```shell-session:DHCPでアドレスを取得する場合
#iface eth0 inet manual
iface eth0 inet dhcp
```
```shell-session:手動でアドレスを設定する場合の例
iface eth0 inet static
  address 192.168.0.100
  netmsak 255.255.255.0
  gateway 192.168.0.1
```

##### 4-3-2. 無線LANの場合

```shell-session
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```

```shell-session:例
#country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="SSID名"
        psk="パスワード"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}
```

#### 4-4. ネットワークサービスを再起動します

- 無線LANの場合は、無線LANアダプタを接続するだけで良いです
- 有線LANの場合は、サービスを再起動します

```shell-session
sudo systemctl daemon-reload
```

#### 4-5. ネットワーク設定がされていることを確認します

- IP アドレス

```shell-session:有線LANの場合
ip a s eth0
```
```shell-session:無線LANの場合
ip a s wlan0
```

- ルーティング

```shell-session
ip r s
```

- DNS

```shell-session
cat /etc/resolv.conf
```

#### 4-6. SSH で外部から接続するための設定

```shell-session:status確認
sudo systemctl status ssh.service
```
```shell-session:サービス開始
sudo systemctl start ssh.service
```
```shell-session:サービス有効化
sudo systemctl enable ssh.service
```

### 5. 言語設定、OS アップデート etc

```shell-session
sudo raspi-config
```

> 4 Internationalisation Options > I1 Change Locale

- 任意で言語を追加します

```shell-session
[*] en_US.UTF-8 UTF-8
[*] ja_JP.UTF-8 UTF-8
```

- 設定可能な言語に追加されていることを確認します

```shell-session
locale -a
```
```shell-session:output
C
C.UTF-8
POSIX
en_GB.utf8
en_US.utf8
ja_JP.utf8
```

- 必要に応じて .bashrc に追記します

```shell-session
vi .bashrc
```
```shell-session
export LANG=C
export LC_ALL=C
export LANGUAGE=C
```
```shell-session
. .bashrc
```
```shell-session
locale
```

- OS アップデート

```shell-session
sudo apt-get update -y
sudo apt-get upgrade -y
```

### 6. おまけ

- X (GUI) 関連パッケージ他の削除

ref. https://codegists.com/snippet/shell/raspbian_server_cleaningsh_rgaidot_shell

```shell-session
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep x11 | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep python | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep sound | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep gnome | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep lxde | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep gtk | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep desktop | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep gstreamer | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep avahi | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep dbus | sed s/install//`
sudo apt-get -y remove `sudo dpkg --get-selections | grep -v "deinstall" | grep freetype | sed s/install//`
sudo apt-get -y autoremove
sudo apt-get clean
```