2018年1月29日月曜日

Raspberry Pi に Raspbian をヘッドレスで最初から固定 IP でインストール

Raspberry Pi 3 にモニターを接続しない状態 (ヘッドレス) で Raspbian Stretch をインストールします。

モニターが無いため最初から SSH でログインする必要があり、デフォルト状態では最初に DHCP で割りあてられた IP アドレスを探り出す必要があり大変です。

そこで、母艦 Ubuntu で microSD メモリカードに Raspbian をインストールする時に Raspbian の IP アドレスも固定で設定します。

環境

  • Raspberry Pi 3 Model B
  • Raspbian Stretch Lite
  • 母艦: Ubuntu 14.04

microSD カードに Raspbian イメージを書き込み (母艦の Ubuntu で作業)

Raspbian をインストールする microSD カードは手元にあった 32G のものを使います。 大事なファイルが残っていないことを確認し、念のため全てのパーティションを fdisk コマンドで削除しておきました。

https://www.raspberrypi.org/ から Raspbian Stretch Lite (デスクトップ環境無し) のイメージファイルをダウンロード。ダウンロード時の最新イメージファイルは 2017-11-29-raspbian-stretch-lite.zip でした。

念のため、チェックサムがサイトに掲載されているものと一致することを確認

$ sha256sum 2017-11-29-raspbian-stretch-lite.zip
e942b70072f2e83c446b9de6f202eb8f9692c06e7d92c343361340cc016e0c9f  2017-11-29-raspbian-stretch-lite.zip

ダウンロードした zip ファイルを解凍

$ unzip 2017-11-29-raspbian-stretch-lite.zip
$ ls -l
合計 2170716
-rw-r--r-- 1 worker worker 1858076672 11月 29 11:37 2017-11-29-raspbian-stretch-lite.img
-rw-rw-r-- 1 worker worker  364724005  1月 27 21:51 2017-11-29-raspbian-stretch-lite.zip
  • 解凍されて .img ファイルができました。

microSD カードがマウントされていないことを確認

$ mount | grep /dev/XXXXXXX
  • /dev/XXXXXXX は実際は microSD カードのデバイスファイルです。 (環境によって異なります)

イメージを microSD カードに書き込み

Warning

/dev/XXXXXXX を間違えると、意図せず HDD など他のデバイスの情報を消去してしまうので注意が必要です。

$ sudo dd bs=4M if=2017-11-29-raspbian-stretch-lite.img of=/dev/XXXXXXX conv=fsync

書き込んだ後の microSD の中身

$ sudo fdisk -l /dev/XXXXXXX

... snip ...

/dev/XXXXXXXp1            8192       93236       42522+   c  W95 FAT32 (LBA)
/dev/XXXXXXXp2           94208     3629055     1767424   83  Linux

正しく書き込めたこと確認 (母艦の Ubuntu で作業)

microSD カードからイメージを吸い出し

Warning

microSD カードのサイズが 32G の場合、以下を実行すると Ubuntu の HDD も 32G 消費されるので、HDD が容量不足にならないように注意が必要です。

$ sudo dd bs=4M if=/dev/XXXXXXX of=from-sd-card.img
$ ls -l
合計 33053532
-rw-r--r-- 1 worker worker  1858076672 11月 29 11:37 2017-11-29-raspbian-stretch-lite.img
-rw-rw-r-- 1 worker worker   364724005  1月 27 21:51 2017-11-29-raspbian-stretch-lite.zip
-rw-r--r-- 1 root   root   31624003584  1月 28 00:59 from-sd-card.img

from-sd-card.img のサイズは microSD カードと同じ 32G なので、比較のため切り詰め

$ sudo truncate --reference 2017-11-29-raspbian-stretch-lite.img from-sd-card.img
$ ls -l
合計 3985244
-rw-r--r-- 1 worker worker 1858076672 11月 29 11:37 2017-11-29-raspbian-stretch-lite.img
-rw-rw-r-- 1 worker worker  364724005  1月 27 21:51 2017-11-29-raspbian-stretch-lite.zip
-rw-r--r-- 1 root   root   1858076672  1月 28 01:04 from-sd-card.img
  • from-sd-card.img のサイズが 2017-11-29-raspbian-stretch-lite.img と同じになりました。

比較

$ diff -s from-sd-card.img 2017-11-29-raspbian-stretch-lite.img
ファイル from-sd-card.img と 2017-11-29-raspbian-stretch-lite.img は同一です
$ md5sum from-sd-card.img 2017-11-29-raspbian-stretch-lite.img
85c7c13b75e45e5394120e52415234a6  from-sd-card.img
85c7c13b75e45e5394120e52415234a6  2017-11-29-raspbian-stretch-lite.img

sync 実施

$ sudo sync

固定 IP アドレスの設定 (母艦の Ubuntu で作業)

microSD カードのパーティションを認識させる

$ sudo partx -v -a /dev/XXXXXXX
partition: none, disk: /dev/XXXXXXX, lower: 0, upper: 0
/dev/XXXXXXX: partition table type 'dos' detected
/dev/XXXXXXX: partition #1 added
/dev/XXXXXXX: partition #2 added

デバイスファイルができたことを確認

$ ls /dev/XXXXXXX*
/dev/XXXXXXX  /dev/XXXXXXXp1  /dev/XXXXXXXp2

Raspbian では以下のようにマウントされるようです。

デバイスファイル マウントポイント
/dev/XXXXXXXp1 /boot/
/dev/XXXXXXXp2 /

microSD カードがマウントされていないことを確認

$ mount | grep /dev/XXXXXXX

マウントポイント作成

$ mkdir mount_point_p1
$ mkdir mount_point_p2

マウント

$ sudo mount /dev/XXXXXXXp1 mount_point_p1/
$ sudo mount /dev/XXXXXXXp2 mount_point_p2/

Rasbian Stretch のカーネルは eth0 ではなく enxXXXXXXX (環境によって異なる) となります。このままだと実際のインターフェース名は Raspbian を起動して ssh しないとわからないので eth0 を使うようにします。

cmdline.txt をバックアップ

$ sudo cp -p mount_point_p1/cmdline.txt mount_point_p1/cmdline.txt.org

eth0 を使うように cmdline.txt の最後に以下のように追加

$ echo "
net.ifnames=0" | sudo tee -a mount_point_p1/cmdline.txt
$ diff -u mount_point_p1/cmdline.txt.org mount_point_p1/cmdline.txt
--- mount_point_p1/cmdline.txt.org      2017-11-29 02:37:02.000000000 +0900
+++ mount_point_p1/cmdline.txt  2018-01-28 16:35:22.000000000 +0900
@@ -1 +1,3 @@
 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=37665771-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
+
+net.ifnames=0

dhcpcd.conf をバックアップ

$ sudo cp -p mount_point_p2/etc/dhcpcd.conf mount_point_p2/etc/dhcpcd.conf.org

実際の環境にあわせて dhcpcd.conf の最後に IP アドレス情報を追加

$ echo "
interface eth0
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8" | sudo tee -a mount_point_p2/etc/dhcpcd.conf
$ diff -u mount_point_p2/etc/dhcpcd.conf.org mount_point_p2/etc/dhcpcd.conf
--- mount_point_p2/etc/dhcpcd.conf.org  2017-11-22 23:46:27.000000000 +0900
+++ mount_point_p2/etc/dhcpcd.conf      2018-01-28 16:41:48.855806158 +0900
@@ -55,3 +55,8 @@
 #interface eth0
 #fallback static_eth0

+
+interface eth0
+static ip_address=192.168.0.10/24
+static routers=192.168.0.1
+static domain_name_servers=192.168.0.1 8.8.8.8

Raspbian 起動時に ssh サーバーも起動するようにするため、ssh ファイル作成

$ sudo touch mount_point_p1/ssh

microSD カードをアンマウント

$ sudo umount mount_point_p1
$ sudo umount mount_point_p2

Ubuntu 機から microSD カードを抜く

インストール後の設定 (Raspberry Pi で作業)

microSD カードを Raspberry Pi に挿して起動

Raspberry Pi に ssh でログイン

  • user: pi
  • password: raspberry

ログインパスワード変更

$ passwd

raspi-config 起動

$ sudo raspi-config

raspi-config で以下を設定しました。

  • 無線 LAN
  • Locale
  • Timezone
  • Wifi Country

SSH 鍵の更新

$ sudo rm -v /etc/ssh/ssh_host*
$ sudo dpkg-reconfigure openssh-server

パスワード無しでの sudo 禁止

現状はこのような感じになっていました。

$ sudo cat /etc/sudoers.d/010_pi-nopasswd
pi ALL=(ALL) NOPASSWD: ALL

このファイルを削除

$ sudo rm /etc/sudoers.d/010_pi-nopasswd

その他

/boot/ssh は自動で削除されましたが、Raspberry Pi 再起動後も ssh でログインできています。

microSD は 32G を使いましたが、/ は最大容量まで拡張されたようです。

$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 29.5 GiB, 31624003584 bytes, 61765632 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd711aa51

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       8192    93236    85045 41.5M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      94208 61765631 61671424 29.4G 83 Linux
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.1G   27G   4% /
devtmpfs        460M     0  460M   0% /dev
tmpfs           464M   76K  464M   1% /dev/shm
tmpfs           464M   12M  452M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   41M   21M   21M  51% /boot
tmpfs            93M     0   93M   0% /run/user/1000

0 件のコメント:

コメントを投稿