RaspberryPi 3 model B に CentOS7をインストール

# RaspberryPi 3 model B に CentOS7をインストール
## はじめに
いままでCentOS7にほとんど触れたことがなかったため、せっかく新しく OS をインストールするならと選んでみました。
セットアップ自体は難しくないものの、今後インストールしたいものが yum リポジトリにあるかで面倒さがあるかもしれません。

## 準備する物
 - [アイ・オー・データ機器 UD-RP3BP Raspberry Pi メインボード（Bluetooth、Wi-Fi対応モデル） Raspberry Pi 3 Model B+](https://www.amazon.co.jp/dp/B07SDFCDYQ/)
 - microSDカード 4GB
 - HDMI接続のディスプレイ
 - USB接続のキーボード

## 前提条件
 - OS イメージの取得と microSD カードへの書き込みは MacBookPro 上で行う手順を記載しています。
 - OS イメージのバージョンや yum update の結果は 2017年6月時点のものです。

## 参考情報
 - http://qiita.com/NAZA/items/38303564dde29977d79e
 - http://server-setting.info/centos/network-config-c7.html
 - http://akira-arets.blogspot.jp/2016/11/linux-centos7-setting-wifi-connection.html
 - http://karaage.hatenadiary.jp/entry/2016/04/03/080000

## OS イメージの取得と microSD カードへの書き込み
### CentOS7 OS イメージ取得
MacBookPro 上に適当なディレクトリを作成し、OS イメージを取得します。
取得したxzファイルを展開します。

```
$ mkdir raspberryPi3
$ cd raspberryPi3
$ wget https://buildlogs.centos.org/centos/7/isos/armhfp/CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz
$ xz -d CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz
$ ls .
CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img
```

## microSD カードに OS イメージを書き込む
### SDカードのフォーマット
使用前にSDカードをフォーマットします。
フォーマットツールを[SD Memory Card Formatter](https://www.sdcard.org/downloads/formatter_4/) のサイトからダウンロード、インストールします。
SD Memory Card Formatterを起動すると、SDカードリーダに挿されたSDカードを自動的に認識します。
`Format` をクリックします。

### OS イメージの書き込み
MacBookPro に接続した SD カードリーダー上の microSD カードのデバイスドライブを確認します。
umount したうえで dd コマンドで OS イメージを書き込みます。

`of=/dev/rdisk2` のように、disk2の前に`r`を付けてることでアンバッファードになり書き込み速度が速くなります。

```
$ df -h 
Filesystem                 Size   Used  Avail Capacity iused      ifree %iused  Mounted on
(省略)
/dev/disk2s1              3.7Gi  1.1Mi  3.7Gi     1%       0          0  100%   /Volumes/NO NAME

$ diskutil umount /dev/disk2s1
$ sudo dd if=CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img of=/dev/rdisk2 bs=1m
393216+0 records in
393216+0 records out
3221225472 bytes transferred in 263.451237 secs (12227027 bytes/sec)
```

## microSD を RaspberryPi 3 に挿して起動
OSイメージ書き込みの完了後、microSD カードをRaspberry Pi 3 に挿して電源をON。
CentOS7のrootアカウントは以下のとおりです。
login : root
Password : centos

## CentOS7 セットアップ
### root パーティションサイズの拡張
4GB の microSD カードを使用してるものの、2GB しか認識していないので README にそって対処します。

起動直後の状態を確認します。

```
[root@centos-rpi3 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       2.0G  762M  1.1G  42% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M   12M  451M   3% /run
tmpfs           463M     0  463M   0% /sys/fs/cgroup
/dev/mmcblk0p1  500M   43M  457M   9% /boot
tmpfs            93M     0   93M   0% /run/user/0
```

実際のパーティションサイズを確認すると4GBあるようです。


```
[root@centos-rpi3 ~]# parted /dev/mmcblk0
GNU Parted 3.1
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: SD USD (sd/mmc)
Disk /dev/mmcblk0: 4036MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  525MB   524MB   primary  fat16           lba
 2      525MB   1062MB  537MB   primary  linux-swap(v1)
 3      1062MB  4036MB  2974MB  primary  ext4

(parted) quit
```

README に書かれている手順を参照します。

```
# less /root/README
```

一部抜粋

```
== CentOS 7 userland ==

If you want to automatically resize your / partition, just type the following (as root user):
/usr/local/bin/rootfs-expand
```

上記のとおり実行してみます。

```
 # /usr/local/bin/rootfs-expand
Extending partition 3 to max size ....
CHANGED: partition=3 start=2074624 old: size=4194304 end=6268928 new: size=5808128,end=7882752
Resizing ext4 filesystem ...
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mmcblk0p3 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p3 is now 726016 blocks long.
Done.
```
root のサイズを確認します。
parted コマンドで確認した際のパーティション 3とおよそ同じサイズとなりました。

```
[root@centos-rpi3 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       2.7G  762M  1.8G  30% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M   12M  451M   3% /run
tmpfs           463M     0  463M   0% /sys/fs/cgroup
/dev/mmcblk0p1  500M   43M  457M   9% /boot
tmpfs            93M     0   93M   0% /run/user/0
```

### ネットワークの設定
#### ネットワークの設定(有線LAN）
RaspberryPi 3 model B は無線LANが使えます。
無線LANのセットアップをおこなうためにモジュールのダウンロードが必要になるので、有線LANを先にセットアップします。
nmcli コマンドでネットワーク設定を行います。

設定する値は以下のものとします。

| 項目|値 |
|:--|:--|
|IPアドレス|192.168.1.1|
|ネットマスク|24bit|
|デフォルトゲートウエイ|192.168.1.1|
|DNSリゾルバ|192.168.1.1|

現在のネットワークデバイスを確認します。ここでは、`eth0`。

```
# nmcli d
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
lo      loopback  unmanaged  --
```

```
# nmcli c mod eth0 ipv4.addresses 192.168.1.110/24
# nmcli c mod eth0 ipv4.gateway 192.168.1.1
# nmcli c mod eth0 ipv4.dns 192.168.1.1
```

IPアドレスを固定とします。

```
# nmcli c mod eth0  ipv4.method manual
```

設定を反映します。

```
# nmcli c down eth0　&& nmcli c up eth0
```

設定を確認します。

```
# nmcli con show eth0
(省略)
ipv4.method:                            manual
ipv4.dns:                               192.168.1.1
ipv4.dns-search:
ipv4.dns-options:                       (default)
ipv4.dns-priority:                      100
ipv4.addresses:                         192.168.1.110/24
ipv4.gateway:                           192.168.1.1
(省略)
```


#### ネットワークの設定(無線LAN）

ネットワークデバイスには無線LANのデバイスが認識されていません。

```
# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
lo      loopback  unmanaged     --
```

README に書かれている手順を参照します。

```
# less /root/README
```
一部抜粋

```
For wifi on the rpi3, just proceed with those steps :

curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin > /usr/lib/firmware/brcm/brcmfmac43430-sdio.bin

curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt > /usr/lib/firmware/brcm/brcmfmac43430-sdio.txt

systemctl reboot
```

上記のとおり実行してみます。

```
# curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt > /usr/lib/firmware/brcm/brcmfmac43430-sdio.txt
# curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin > /usr/lib/firmware/brcm/brcmfmac43430-sdio.bin
# systemctl reboot
```
ネットワークデバイスを確認すると、無線LAN デバイスが認識されているのがわかります。

```
# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
wlan0   wifi      disconnected  --
lo      loopback  unmanaged     --
```
アクセスポイント一覧を確認します。

```
# nmcli d wifi
*  SSID             MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
   aterm-xxxxxx-g   Infra  1     54 Mbit/s  100     ****  WPA2
```
接続情報を設定します。

```
# nmcli c add con-name wlan0 ifname wlan0 type wifi ssid aterm-xxxxxx-g
```

設定を確認します。

```
# cat /etc/sysconfig/network-scripts/ifcfg-wlan0
ESSID="aterm-xxxxxx-g"
MODE=Managed
MAC_ADDRESS_RANDOMIZATION=default
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=wlan0
UUID="xxxx-xxxx-xxxx-xxxx-xxxx"
DEVICE=wlan0
ONBOOT=yes
```

次に暗号化方式を設定します。

```
# nmcli con modify wlan0 wifi-sec.key-mgmt wpa-psk
```

`KEY_MGMT=WPA-PSK`が追加されました。

```
# cat /etc/sysconfig/network-scripts/ifcfg-wlan0
ESSID="aterm-3de3ef-g"
MODE=Managed
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=wlan0
UUID=9905ec72-7336-4214-9ee0-a2330269cc5b
DEVICE=wlan0
ONBOOT=yes
KEY_MGMT=WPA-PSK
MAC_ADDRESS_RANDOMIZATION=default
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
```

最後にアクセスポイントの接続パスワードを設定します。

```
# nmcli c modify wlan0  wifi-sec.psk xxxxxxxxxx
```

アクセスポイントに接続します。

```
# nmcli c up wlan0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
```

接続状況を確認します。
接続しているSSIDの行頭に * がついています。複数のアクセスポイントがある環境では、どれに接続しているかを　* の有無で確認できます。

```
# nmcli d wifi
*  SSID             MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
*  aterm-xxxxxx-g   Infra  1     54 Mbit/s  100     ****  WPA2
```

有線LANも含めて、ネットワークデバイス一覧を確認します。

```
# nmcli d
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
wlan0   wifi      connected  wlan0
lo      loopback  unmanaged  --
```
無線LANのネットワーク詳細情報をみてみます。

```
# nmcli d show wlan0
GENERAL.DEVICE:                         wlan0
GENERAL.TYPE:                           wifi
GENERAL.HWADDR:                         xx:xx:xx:xx:xx:xx
GENERAL.MTU:                            0
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     aterm-xxxxxx-g
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]:                         192.168.1.13/24
IP4.GATEWAY:                            192.168.1.1
IP4.DNS[1]:                             192.168.1.1
IP6.ADDRESS[1]:                         fe80::f8a5:39b9:d16:e826/64
IP6.GATEWAY:
```


### yum update
yum update で OS を最新の状態にします。
実行するとエラーが発生しアップデートできないようです。

```
# yum update
Loaded plugins: fastestmirror
base                                                                        | 3.6 kB  00:00:00
http://mirror.centos.org/altarch/7/kernel/armhfp/kernel-%24kvariant/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
To address this issue please refer to the below knowledge base article

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/



 One of the configured repositories failed (CentOS Kernels for armhfp),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=centos-kernel ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable centos-kernel
        or
            subscription-manager repos --disable=centos-kernel

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=centos-kernel.skip_if_unavailable=true

failure: repodata/repomd.xml from centos-kernel: [Errno 256] No more mirrors to try.
http://mirror.centos.org/altarch/7/kernel/armhfp/kernel-$kvariant/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
```

エラーメッセージのヘルプにあるとおり、kernelのアップデートは除外してみます。

```
# yum --disablerepo=centos-kernel update
```
アップデート後、kernel のバージョンを確認します。
インストールされている kernel と yum リポジトリのものが同一になりました。

```
[root@centos-rpi3 ~]# rpm -qa | grep raspberrypi2-kernel
raspberrypi2-kernel-4.4.33-v7.1.el7.armv7hl
raspberrypi2-kernel-firmware-4.9.13-v7.1.el7.armv7hl
raspberrypi2-kernel-4.9.13-v7.1.el7.armv7hl

[root@centos-rpi3 ~]# yum list | grep raspberrypi2-kernel
raspberrypi2-kernel.armv7hl             4.4.33-v7.1.el7         @rpi2-kernel_rbf
raspberrypi2-kernel.armv7hl             4.9.13-v7.1.el7         @kernel
raspberrypi2-kernel-firmware.armv7hl    4.9.13-v7.1.el7         @kernel
raspberrypi2-kernel-devel.armv7hl       4.9.13-v7.1.el7         centos-kernel
```
起動している kernel のバージョンを確認します。

```
# uname -a
Linux centos-rpi3 4.4.33-v7.1.el7 #1 SMP Mon Nov 21 18:48:06 UTC 2016 armv7l armv7l armv7l GNU/Linux
```
さきほどインストールした kernelを反映するため、OS 再起動します。

```
# reboot
```

起動しているkernelを確認します。

```
# uname -a
Linux centos-rpi3 4.9.13-v7.1.el7 #1 SMP Mon Feb 27 10:45:31 UTC 2017 armv7l armv7l armv7l GNU/Linux
```

### NTPdのインストール
時刻同期のため、NTPdをインストールします。

```
# yum install ntp
```
NTPdの設定をおこないます。

```
# vi /etc/ntp.conf
```
変更前

```
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
```
変更後

```
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
pool ntp.nict.jp
```

NTPdを起動し、タイムゾーンを日本に変更します。

```
# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

# systemctl start ntpd
# timedatectl set-timezone Asia/Tokyo
# timedatectl
      Local time: Wed 2017-06-14 00:13:51 JST
  Universal time: Tue 2017-06-13 15:13:51 UTC
        RTC time: n/a
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

OS起動時のNTPdの自動起動を有効にする。
```
$ sudo systemctl enable ntpd.service
```