[My ImageFile作成]Raspberry PI を headless インストール

# はじめに
この記事は「[[結果は却下] Raspberry PI の headless インストールで提案してみた](https://qiita.com/higuchi-toshio-intec/items/4e9bf33379ead591ff22)」の続きです

raspbian をHeadlessインストールする際、固定IPアドレス設定できたらいいなと思ったので、
チョット修正して自分用のイメージファイルを作成したときの手順です
（この記事は、自分用のメモです）

あと、イメージファイルは一度作ってしまえば、
新しいリリースが出るまで使いまわせるので
何度もraspbianをインストールする人には便利と思います

## 簡単な説明
この記事に書かれている内容説明です

- 配布されている raspbian のイメージファイルに対し「＋α」します
  - https://www.raspberrypi.org/downloads/raspbian/
- 違いは、起動時に「使いたい dpcpcd.conf を指定することができる」こと
- 以下の検索結果先が参考になると思います
  - https://www.google.com/search?q=raspbian+ssh+wpa_supplicant
- 複数台の RaspberryPI を固定IPアドレスでheadlessセットアップしたいときに便利だと思います
  - headlessインストール後に「　(1)起動したRaspberryPIのIPアドレス調べて、(2)ssh接続して、(3)固定IPアドレス設定する」手順が省けるだけです
  - ただ、私にとってはコレだけでもありがたい
- 手順概要は、以下の通りです
  1. 作成したイメージファイルを使ってSDカードを作成
  1. カードにdpcpcd.confをコピー
  1. IP アドレスを書き込む
  1. 必要な台数分だけ、上記処理を繰り返す

興味があれば、この先も読んでください

# 準備
- 必要に応じてコマンドをインストールする

    ```text:console
    % sudo apt install -y curl zip unzip
    ```

# イメージファイル作成手順
以降の説明では ${HOME}/raspbian を作業ディレクトリとしています

1. 作業ディレクトリを作成し移動

    ```text:console
% mkdir -p ${HOME}/raspbian
% cd ${HOME}/raspbian
    ```
1. 最新の raspbian イメージファイルをダウンロード

    ```text:console
% URL_IMG="https://downloads.raspberrypi.org/raspbian_lite_latest"
% FILE_IMG="raspbian.img"
% curl -L -o ${FILE_IMG}.zip ${URL_IMG}
% unzip -p ${FILE_IMG}.zip > ${FILE_IMG}
    ```
1. raspbian イメージファイルの Linux パーティションの位置(offset)を計算

    ```text:console
% OFS_START=`fdisk -l ${FILE_IMG} | grep -i Linux | awk '{print $2}'`
% OFS=`expr ${OFS_START} "*" 512`
    ```

1. raspbian イメージファイル(Linuxパーティション)をmount

    ```text:console
% mkdir mnt
% sudo mount -v -o loop,offset=${OFS} -t ext4 ${PWD}/${FILE_IMG} ${PWD}/mnt
    ```
1. サービスファイルを作成

    ```text:console
% sudo vi mnt/lib/systemd/system/raspberrypi-net-mods-dhcpcd.service
    ```
   - 作成するファイルの内容は、以下の通り

    ```text:raspberrypi-net-mods-dhcpcd.service
    [Unit]
    Description=Override /etc/dhcpcd.conf if /boot/dhcpcd.conf is present
    ConditionPathExists=/boot/dhcpcd.conf
    Wants=network.target
    Before=dhcpcd.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/bin/mv /boot/dhcpcd.conf /etc/dhcpcd.conf
    ExecStartPost=/bin/chmod 644 /etc/dhcpcd.conf
    
    [Install]
    WantedBy=multi-user.target
    ```
1. サービスファイルを有効化

    ```text:console
    % FILE_SERVICE=raspberrypi-net-mods-dhcpcd.service
    % sudo ln -s /lib/systemd/system/${FILE_SERVICE} ${PWD}/mnt/etc/systemd/system/multi-user.target.wants/${FILE_SERVICE}
    ```
1. raspbian イメージファイルをumount

    ```text:console
    % sudo umount ${PWD}/mnt
    ```
1. 【オプション】自分しか使わないのであれば、これら↓の設定も有用かと思います
    1. raspbian イメージファイルのFAT32パーティションの位置(offset)を計算

        ```text:console
        % OFS_START=`fdisk -l ${FILE_IMG} | grep -i FAT32 | awk '{print $2}'`
        % OFS=`expr ${OFS_START} "*" 512`
        ```
    1. raspbianイメージファイル(FAT32パーティション)をmount

        ```text:console
        % sudo mount -v -o loop,offset=${OFS} -t vfat ${PWD}/${FILE_IMG} ${PWD}/mnt
        ```
    1. ssh を有効化

        ```text:console
        % sudo touch ${PWD}/mnt/ssh
        ```
    1. wpa_supplicant.conf を有効化（ファイルの編集内容に関しては、本記事の対象外）

        ```text:console
        % sudo vi ${PWD}/mnt/wpa_supplicant.conf
        ```
    1. dpcpcd.conf を有効化（ファイルの編集内容に関しては、本記事の対象外）

        ```text:console
        % sudo vi ${PWD}/mnt/dpcpcd.conf
        ```
    1. raspbian イメージファイルをumount

        ```text:console
        % sudo umount ${PWD}/mnt
        ```
1. 【オプション】 raspbian イメージファイルをzip圧縮

   ```text:console
% zip ${FILE_IMG}-MOD-dhcpcd.zip ${FILE_IMG}
   ```

# さいごに
不要とは思うけど、使い方を簡単に

- 基本的に、配布されているraspbianイメージファイルと同様
- SD カードに書き込む
- boot パーティションにファイルを配置
  - このような↓感じですね

  ```text:console
  % sudo dd of=/dev/sdb bs=4M conv=fsync if=raspbian.img
  % sudo mount /dev/sdb1 /mnt
  % sudo touch /mnt/ssh
  % sudo vi /mnt/wpa_supplicant.conf
  % sudo vi /mnt/dhcpcd.conf
  % sudo umount /mnt
  ```
  - dhcpcd.conf の例

   ```text:dhcpcd.conf
hostname
clientid
persistent
option rapid_commit
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
option interface_mtu
require dhcp_server_identifier
slaac private

# set your static IP address
interface eth0
static ip_address=192.168.1.123/24
static routers=192.168.1.254
static domain_name_servers=192.168.1.1
#
   ```
- SD カードをRaspberryPIに挿して起動（しばらく待つ）
- IPアドレスを指定して ssh 接続
  - デフォルトユーザ(pi)とパスワード(raspberry)で認証される

  ```text:console
% ssh pi@192.168.1.123
Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Sep 26 01:31:41 2019

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $
  ```
- ネット経由で設定できるので、RaspberryPI にキーボードやディスプレイは不要になった
  - WiFi 接続なら、ネットケーブルさえも不要

<!-- eof -->