Raspberry Pi 3 に繋いだ USB 接続の SSD に CentOS 7 を入れてみる

スポンサーリンク

 先ず始めに書くと、完全に microSD レスなブートは不可能だったので本記事では起動にこそ microSD カードが必須だが、ルートパーティションと swap を USB 接続の SSD にマウントさせる動作とした構築メモとなる。
 これにより microSD カードの寿命を殆ど気にする必要もなくなるし、万が一にも破損した場合でも復帰を容易に出来るメリットがある。

用意した物

 今回作った環境に必要な物は次の 6 つ。

  1. Raspberry Pi 3 Model B
  2. microSD カード 16GB
  3. 2.5inch ドライブ用 USB 外付けケース
  4. SSD
  5. USB 充電器 (5V/2.5A 出力) + MicroUSB ケーブル
  6. LAN ケーブル

 microSD カードに関しては CentOS 7 が入るだけあれば良いので 4GB 以上で安い物があればそれで良い。
 SSD に関しては大昔に買った Intel X25-V 40GB が転がっていたのでそれを使うことにした。40GB もあれば十分過ぎる使い方しかし無いのでこれで良い。

 これ以外にも初期設定用にディスプレイとキーボードが必要。

CentOS インストール

 CentOS のイメージは次のオフィシャルサイトより CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz を利用した。

Index of /centos/7/isos/armhfp

 ダウンロードしたイメージから 7zip などを利用して CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img を展開しておく。

http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows

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/sda1 とする事で起動後は 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 を編集するだけになるので原状復帰も楽で良いハズ。

スポンサーリンク