画像やリンクが無効になっている可能性もあるのでご了承下さい。
先ず始めに書くと、完全に microSD レスなブートは不可能だったので本記事では起動にこそ microSD カードが必須だが、ルートパーティションと swap を USB 接続の SSD にマウントさせる動作とした構築メモとなる。
これにより microSD カードの寿命を殆ど気にする必要もなくなるし、万が一にも破損した場合でも復帰を容易に出来るメリットがある。
用意した物
今回作った環境に必要な物は次の 6 つ。
- Raspberry Pi 3 Model B
- microSD カード 16GB
- 2.5inch ドライブ用 USB 外付けケース
- SSD
- USB 充電器 (5V/2.5A 出力) + MicroUSB ケーブル
- LAN ケーブル
microSD カードに関しては CentOS 7 が入るだけあれば良いので 4GB 以上で安い物があればそれで良い。
SSD に関しては大昔に買った Intel X25-V 40GB が転がっていたのでそれを使うことにした。40GB もあれば十分過ぎる使い方しかし無いのでこれで良い。
これ以外にも初期設定用にディスプレイとキーボードが必要。
CentOS インストール
CentOS のイメージは次のオフィシャルサイトより CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz を利用した。
ダウンロードしたイメージから 7zip などを利用して CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img を展開しておく。
DD for Windows をダウンロードしてこれも展開し、Windows 7 互換モードで起動した後に CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img を microSD カードに書き込みをする。
この時完成した microSD を Raspberry Pi 3 に挿入して電源を入れると CentOS 7 が起動する。
CentOS の初期 root パスワードは centos になっているのでこれを用いてログインする。ログイン後は passwd コマンドを用いて変更しておくことをオススメする。
CentOS の初期設定
キーボードと言語設定
接続したキーボードは日本語 109 キーの物だったので最初の 2 行を入れてあるが、英語キーボードの場合は不要。
localectl set-keymap jp106
localectl set-keymap jp-OADG109A
localectl set-locale LANG=ja_JP.utf8
localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: jp-OADG109A
X11 Layout: jp
X11 Model: jp106
X11 Options: terminate:ctrl_alt_bksp
ネットワーク設定
nmcli コマンドを用いてパッと設定してしまう。
以下設定内容は筆者環境による物なので、割り当てる IP アドレスや DNS、ゲートウェイは適時置き換えて設定すると良い。
nmcli d
nmcli c modify eth0 ipv4.addresses 192.168.1.7/24
nmcli c modify eth0 ipv4.gateway 192.168.1.1
nmcli c modify eth0 ipv4.dns 192.168.1.8
nmcli c modify eth0 ipv4.method manual
nmcli c modify eth0 connection.autoconnect "yes"
nmcli c down eth0; nmcli c up eth0
nmcli d show eth0
コマンドを直で叩くのが面倒な場合、nmcli d show で現 IP アドレスを調べて Windows など他マシンから SSH 経由としても良い。ただ、当然として上記コマンドが反映された時点で一旦接続が切れる為、設定した IP アドレスで接続し直す必要がある。
yum の設定
デフォルトのままだとエラーを吐いてしまうので /etc/yum.repos.d/CentOS-armhfp-kernel.repo にある baseurl の行を次の様に編集する。
baseurl=http://mirror.centos.org/altarch/7/kernel/$basearch/kernel-rpi2
元の $kbariant がそのまま展開されないのが原因のようで。
SELinux の無効化
必要に応じてとなるが筆者は慣例的にこれを OFF としている。
無効とするには /etc/sysconfig/selinux を編集し、SELINUX=enforcing を SELINUX=disabled として再起動後に反映される。
CPU 動作クロックの修正
デフォルトでは CPU の動作クロック上限が 700MHz になっていたので、これを Raspberry Pi 3 Model B の仕様通りの 1.2GHz を上限にしておく。
編集するファイルは /boot/config.txt で arm_freq=700 となっている箇所を arm_freq=1200 にすれば良い。
これにより低負荷時は 600MHz、高負荷時には 1.2GHz 動作をするようになる。
現在の動作周波数を見たい場合、次のようにする事で表示可能だ。
sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
USB 接続したドライブへのファイルコピー及び設定
ここからが本題に。
microSD カードのみでも動作可能だが、USB 接続した SSD にルートパーティションと swap をマウントさせることで microSD カードの寿命問題をクリアさせる目的。
SSD のパーティション作成
parted コマンドを用いて USB 接続 SSD に swap とルートパーティションを作成する。
SSD に割り当てられたデバイスファイルは /dev/sda となったのでそれを前提に記載する。
parted /dev/sda
(parted) mktable msdos
警告: いま存在している /dev/sda のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか?
はい(Y)/Yes/いいえ(N)/No? Y
(parted) mkpart primary ext4 0% 1024M
(parted) mkpart primary ext4 1024M 100%
(parted) print
(parted) quit
この操作により /dev/sda1 が swap、/dev/sda2 が “/” となる。
続いてファイルシステムの作成。
mkfs.ext4 /dev/sda2
mkswap -c /dev/sda1
ファイルシステムが出来たところで microSD カード上にあるルートパーティションを SSD のルートパーティションにコピーする。
mkdir /mnt/ssd
mount /dev/sda2 /mnt/ssd/
rsync -ax --progress / /mnt/ssd
起動設定
microSD カードから起動後、SSD 側のルートパーティションを見て欲しいので microSD 上の /boot パーティション以下 cmdline.txt を編集し、root=/dev/sda2 とする事で起動後は SSD 側を見るようになる。
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait selinux=1 security=selinux enforcing=0
続いて SSD 上の swap とルートパーティションの UUID を調べておく。
blkid /dev/sda1
/dev/sda1: UUID="533d338c-d471-4b0a-8000-008a5764f10c" TYPE="swap"
blkid /dev/sda2
/dev/sda2: UUID="050c05bf-f407-493e-8e75-c7d4e2d036d4" TYPE="ext4"
マウントしてある SSD 上の /etc/fstab にあたる /mnt/ssd/etc/fstab を調べた UUID に合わせて編集する。
/boot パーティションは microSD の物のまま手を加えない。
#Generated by RootFS Build Factory
LABEL=2FE7585F /boot vfat noatime 0 0
UUID=533d338c-d471-4b0a-8000-008a5764f10c swap swap defaults 0 0
UUID=050c05bf-f407-493e-8e75-c7d4e2d036d4 / ext4 defaults 0 0
ここは別に UUID を用いずとも /dev/sda1 といったデバイスファイルの表記でも良いが、これが変更されない保証は無いので UUID で指定した方が良い。
ここまでの作業で手違いが無ければ再起動後はルートパーティションと swap は SSD を使うようになる。
Raspberry Pi 3 起動後 microSD カード上の /boot を読みに行き、cmdline.txt に従い /dev/sda2 をルートパーティションとする。そしてルートパーティションにある fstab 通りにディスクをマウントして動作をすると言う事だ。
設定後の動作
しっかりと SSD をルートパーティションとして動作しているかは df コマンドでも叩いてみると分かりやすい。
df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 36G 1.6G 32G 5% /
devtmpfs 460M 0 460M 0% /dev
tmpfs 464M 0 464M 0% /dev/shm
tmpfs 464M 12M 452M 3% /run
tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/mmcblk0p1 500M 49M 452M 10% /boot
tmpfs 93M 0 93M 0% /run/user/1000
40GB の SSD を使用し、swap に約 1GB を割り当ててみたので /dev/root は大体この様に 36GB となった。
これにより microSD カード上で動作させるよりも I/O 周りが軽くなったので動作としてもレスポンスが良くなった。
microSD の用に寿命を気にする必要もないので swap を切るだとかログを吐かないようにすると言った手間も不要に。
普通に PC 上で CentOS を動作させているような感触に近いので、これは非常に良いオモチャになった。
あとは好きなように環境を構築してみたり存分に遊んでみようかと思う。
それともしこの環境で microSD カードが壊れたらもう一度 CentOS を microSD カードにインストールし直して /boot/cmdline.txt を編集するだけになるので原状復帰も楽で良いハズ。
コメント