Raspberry Pi3にFedora28を入れる

# 概要
RaspberryPi3B+にFedora28をインストールします。
RaspberryPi3のCPUは64bitサポートしているが、Raspbianは32bitOSしかないので、ラズパイを公式サポートしているFedora28をインストールしてみました。一通りの環境構築までのメモです。
→[Fedora公式WiKi](https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi)

# 前提
- Raspberry Pi3B+　(たぶんRPi3Bでも同じ)
- Fedora Server28 (aarch64 supported images for Raspberry Pi 3)

# 注意点
- GPIOやカメラは未サポート (次期バージョンまでに対応という話)
- SDカードのACT LEDも動作しない
- Wi-Fiはサポートされているが、ドライバの追加インストールが必要(今回は未実施。公式Q&A参照)

結局、ラズパイとして使うにはあまりお勧めできません。

# OSのインストール
最初だけはLCDとキーボード接続して作業します。初期設定以降はSSHで作業しています。
### SDカードの準備
[OSのイメージをダウンロード](https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi#Downloading_the_Fedora_ARM_image)し、SDカードに書き込みます。
aarch64 supported images for Raspberry Pi 3のFedora Server28を使用しました。ダウンロードし、7zなどで解凍し、rawファイルをイメージライティングソフトで書きこみます。ソフトは何でもいいですが、[Etcher](https://etcher.io/)がシンプルで気に入っています。

### インストール
SDカードを挿入し、電源を入れると最初文字が出た後、画面が消えて1分くらい何も表示されないが動いているので待ちます。SDカードのACT LEDも点滅しないので全く反応がない感じになります(^^;

しばらくすると、メニューが出ます。
(※起動しない場合の対処について、末尾に記載)

- 言語設定 (39：Japanese　→ "c"ではなく"1"を入力)
- ロケーション設定 (2：Asia、72：Tokyo)
- IPアドレス設定 (1:IPアドレス、2:マスク、3：ゲートウエイ、6:DNS、8:設定反映)
- rootパスワード設定
- ユーザー追加

rootパスワードだけは必ず設定してください。デフォルトでrootログイン無効、ユーザーなしなのでrootパスワード設定しないとログインできず、詰みます。(何度か・・・:weary:)
ユーザー追加もできるが、ログインしてからでいいと思います。(フリーズ怖いし…)
たまに、フリーズするので、その時はSDカードフォーマットしてやり直すしかないと思います。
設定したら"c"で抜けると、ログイン画面が表示されます。
DHCPのままの場合は、ここで設定したrootでログインし、ifconfigでIPアドレス確認します。

以降、SSH接続可能。

### 初期設定
とりあえずrootでログインします。

ユーザーの追加(piとしました)

```:fedora
# useradd pi
# passwd pi
```
sudo設定
パスワード不要にする場合、以下のようにします。

```
# visudo
  %wheel        ALL=(ALL)       ALL  の行をコメントアウト
　%wheel  ALL=(ALL)       NOPASSWD: ALL　の行を有効化
```
sudoが使えるようにwheelグループにユーザーを追加する

```
# groupadd wheel
# usermod -aG wheel pi
```
キーボード設定
いったん、jp106を設定し、さらに109に再設定します。

```
# localectl set-keymap jp106
# localectl set-keymap jp-OADG109A
# localectl set-locale LANG=ja_JP.utf8
# localectl  (確認)
```
ネットワーク設定の追加(DNS設定しておかないとインターネットに接続できない)

```
# nmcli device  (IFの確認)
# nmcli connection mod eth0 ipv4.dns 8.8.8.8
# nmcli device show eth0  (設定の確認)
```

DHCPから固定IPに変える場合、以下の項目を変える(DNSは例)

```
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    BOOTPROTO=static
    IPADDR=192.168.10.37
    PREFIX=24
    GATEWAY=192.168.10.1
    DNS1=8.8.8.8
    DNS2=4.4.4.4
```

いったん再起動する(# reboot)
以降、ユーザーで作業します。

設定の確認(任意)

```
$ uname -a
Linux localhost.localdomain 4.16.3-301.fc28.aarch64 #1 SMP Mon Apr 23 21:45:59 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux
$ uname -r　または　
$ cat /proc/version
4.16.3-301.fc28.aarch64
$ cat /etc/fedora-release
Fedora release 28 (Twenty Eight)
```
インターネット接続の確認。(DNSレコードが取得できればよい)

```
$ dig google.co.jp
```

### SDカードサイズについて
配布されたイメージからインストールした場合、SDカードの全容量は認識されていないため、拡張するのであれば早めにしておいた方が(失敗したときの被害が少なく)よいと思います。
[拡張方法は、こちらに記載しました。](https://qiita.com/hawk777/items/ab49922445f7226476e5)

###アップデート
最初にfastestmirrorを指定する。

```dnf.conf
$ sudo vi /etc/dnf/dnf.conf
  fastestmirror=true  を追記
```
アップデートする。初回は2時間くらいはかかります。
fedoraはyumではなくdnfを使用します。yumも使用できるようですが、python3に対応していないとのこと。
dnfはyumのエイリアスで内部的にはyumが動いているような形(正確な表現ではない)。
リポジトリ設定は/etc/yum.repos.dが使用されている。
正確な情報は公式等を確認してください！

```
$ sudo dnf -y update
```
## 時刻同期(crony)

```
$ sudo dnf install -y chrony
$ sudo systemctl start chronyd
$ sudo timedatectl status
```
## 開発環境等
### vim

```
$ sudo dnf install -y vim
$ vim .bashrc
    alias vi='vim'
    alias sudo='sudo -E'  (sudo時もユーザーの設定を引き継ぐ)
$ source .bashrc
```
設定は~/.vimrcにします。詳細は割愛します。

### gccなどまとめて入れる

```
$ sudo dnf groupinstall -y "Development Tools"
$ sudo dnf groupinstall -y "C Development Tools and Libraries"
```
トータルで30分くらいかかります。

### python
最初から入っている。

```
$ python --version
$ python3 --version
```

### git

```
$ sudo dnf install -y git
```

### docker
最初から入っているものは古いので、いったん削除し、入れなおす。
[手順は公式に従います。](https://docs.docker.com/install/linux/docker-ce/fedora/#prerequisites)

```
$ sudo dnf remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

インストールは1行で完了
$ curl -sSL https://get.docker.com | sh

ユーザー権限で起動できるようにする
$ sudo groupadd docker  (念のため)
$ sudo usermod -aG docker pi

サービス開始
$ sudo systemctl start docker
$ sudo systemctl enable docker
```
グループ設定反映のためターミナルを一度抜けて、再ログインする。

### docker-compose
公式にはARM64用のイメージがないので、以下の手順でインストールします。
[参考にしたサイト](https://blog.alexellis.io/get-started-with-docker-on-64-bit-arm/)

```
$ sudo dnf install -y python-pip
$ sudo pip install pip --upgrade
$ sudo pip install docker-compose
$ vi .bash_profile
    export PATH=$PATH:/usr/bin
$ source .bash_profile

$ docker-compose version  (確認)
```
dockerやcompose使用時は、イメージがaarch64用じゃないと動かないので注意。
aarch64のtagを探すとよいです。


### Node.js
[公式手順に従います。](https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora)

```
$ sudo dnf install -y nodejs
$ sudo npm install -g yarn
```

### mongodb

```
$ sudo dnf install -y mongodb mongodb-server
$ sudo systemctl start mongod
$ sudo systemctl enable mongod
$ sudo systemctl status mongod

$ mongo  (確認)
>exit
```

# 起動しない場合
私がはまったことのメモ。参考になればという程度です。
・最初のブートログが以下で止まる場合、電源の容量が足りない可能性があります。

```
fb: switching to vc4drmfb from EFI VGA
```
右上に稲妻のマークが点滅していると、電圧低下のマークだそうです。~~わかるか！~~
電源を変えるか、HUBの場合はUSBケーブルを変えると改善する可能性があります。
私も接続機器によって電流可変する高性能HUBに安物のケーブルつけていて嵌りました。
※このログで調べると、[Fedora26からスルーされているバグ](https://bugzilla.redhat.com/show_bug.cgi?id=1514686)のようですが、本当にバグが原因の場合はあきらめるしかないかも。

・LANがつながらない場合
`ifconfig`でeth0は認識しているが、`inet 192.168.xxx.xxx`が出てこない場合、やはり電源を変えると動く可能性があります。初回ブート時にうまく認識できないと、その後何してもダメかもしれない。
ドライバ入れるとか頑張るより、電源変えて、SDフォーマットしてセットアップしなおすほうが早いかもしれません。


# 参考
- [Fedora 公式Q&A](https://fedoraproject.org/wiki/Architectures/ARM/Raspberry_Pi#Frequently_Asked_Questions)
- [Server World](https://www.server-world.info/query?os=Fedora_28)
- [RaspberryPi(Fedora28)のSDカードを拡張する](https://qiita.com/hawk777/items/ab49922445f7226476e5)