Raspberry PiにFedora25をインストールしたよ

こんにちは。Livesense Advent Calendar 2016の3日目を担当しますエンジニアのkurobaraです。
リブセンスでは、会社の口コミサイトである転職会議のメディアチームに所属しています。

転職会議メディアを開発することもありますが、関連プロダクトをやっていることもあります。

最近、寒いですよね。皆様、ご自愛下さいmm

### ご存知でしたか？
---
今更、Raspberry Piのインストール記事？と言われると心苦しいものがありますが・・・

一昔前には[Pidora](http://pidora.ca/)がありました。
が、2014年時点で更新が止まっているという。。。
しかしながら、Fedoraのサイトに目を向けると[arm向けのimage](https://arm.fedoraproject.org/)を提供していることに気づきます

つまり、やり方次第では、Raspberry Piで動作させられるということが分かります

<img width="1249" alt="スクリーンショット 2016-12-02 18.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/17495/8ab5b967-23a3-57d4-859d-b115c74e0174.png">


\#　組み込みやらFedora界隈の人たちはご存知でしょうが・・・

### 何故するのか?
---

* RedHat系Linuxに対する**愛**(あるのかな？)
* 人とは違うRaspberry Pi用OSを使ってるので**ドヤれる**(重要)
* 単純に他と違うインストール方法で、技術的に**面白い**(かも...)

Raspberry Piで動かすならArchLinuxでも全然イケてると思います。

### インストールするよ
---

以降の内容は、自己責任でお願いしますmm
試してみて生じたあらゆる損害等についても、理由の如何に関わらず、
一切責任を負えませんのであしからずご了承下さいmm

**Raspberry Piの固有機能**(カメラモジュールとか)みたいなのは一切使えないのでご了承ください。

### 必要なもの
---

* 作業用Linux(今回はCentOS7で実施)
* Raspberry Pi2ModelB(手元のもの)とSDカード、キーボード、電源、モニター
* Fedoraのimage
* Raspberry Piの[firmware](https://github.com/raspberrypi/firmware)

\# 偶々、手元にあったLinuxがCentOS7だっただけです> <

### 必要なことを整理
---
* Raspberry PiのfirmwareとRaspberry Piの機能設定(``config.txt``)入りのbootパーティション作成
* Fedoraのimageを展開し、展開した中にfirmwareと機能実装を追加、その後imageとパーティションを作成
* 起動設定に必要なfstabとか、rootのsshとかの設定

\# あまり良くないが、ゴリ押しするならraspbianが入った領域に適当にfedoraのimage書き込んで、元のfstabやら起動に必要なものとか、firmwareを入れ込めば案外できるのかも・・・

### 必要なもの準備
---

**Fedoraのimage取得**

imageのバージョンは適宜変更してください

```
$ wget https://download.fedoraproject.org/pub/fedora/linux/releases/25/Spins/armhfp/images/Fedora-Minimal-armhfp-25-1.3-sda.raw.xz
```

**Raspberry Piのfirmwareの取得**

結構デカイので、最新のものがあればいいや理論

```
$ git clone https://github.com/raspberrypi/firmware.git  --depth 1
```

### bootパーティションの作成
---
**image領域作成**

領域サイズは好きに決めて良いと思います。
余裕を見て200MBにしました

```
$ truncate -s 200MB boot.img
```

**リムーバブルメディア用にFAT/FAT32にフォーマット**

```
$ mkfs.fat boot.img
mkfs.fat 3.0.20 (12 Jun 2013)
```

**boot.imgに追加**

作成したboot.imgをマウントし、raspberry pi用のbootファイルを追加

``config.txt``は[こちら](https://www.raspberrypi.org/documentation/configuration/config-txt.md)になりますので、適宜作成してください

\# ``raspibian``があるならばそこから持ってくるのが安牌かも

```
$ mkdir work
$ sudo mount -o loop boot.img work
$ sudo cp -Rf firmware/boot/* work/.
$ sudo cp -f config.txt work/.
```

因みに、NOOBSでインストールした``raspbian``のファイルは殆どコメントアウトされており、下記のみ有効でした

```
# Enable audio (loads snd_bcm2835)
dtparam=audio=on

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
start_x=0
```

これでboot用のパーティションと中身のファイル配備設定は終わり

### OS用パーティションの作成
---
**imageの中身を展開したパーティションファイルの作成**

bootやらswapやらは不要なので、今回は抜いてしまい純粋なOSの関連ファイルだけにしてしまいます。
ということなので、それ以外の領域を読み飛ばしたパーティションimageを作成します

```
$ fdisk Fedora-Minimal-armhfp-25-1.3-sda.raw
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): p

Disk Fedora-Minimal-armhfp-25-1.3-sda.raw: 2177 MB, 2177892352 bytes, 4253696 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x0fbf13bf

                         デバイス ブート      始点        終点     ブロック   Id  システム
Fedora-Minimal-armhfp-25-1.3-sda.raw1            2048       61439       29696    c  W95 FAT32 (LBA)
Fedora-Minimal-armhfp-25-1.3-sda.raw2   *       61440     1060863      499712   83  Linux
Fedora-Minimal-armhfp-25-1.3-sda.raw3         1060864     1560575      249856   82  Linux swap / Solaris
Fedora-Minimal-armhfp-25-1.3-sda.raw4         1560576     4059135     1249280   83  Linux
$ dd if=Fedora-Minimal-armhfp-25-1.3-sda.raw bs=512 skip=1560576 of=fedora.img
2693120+0 レコード入力
2693120+0 レコード出力
1378877440 バイト (1.4 GB) コピーされました、 2.29156 秒、 602 MB/秒
```

**パーティションの拡張**

1.4GBしか無いため、拡張を行います
32GBのSDカードを想定しているので、その分を設定します

```
$ resize2fs fedora.img 29500M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on fedora.img to 7552000 (4k) blocks.
The filesystem on fedora.img is now 7552000 blocks long.
$ truncate -s 29500M fedora.img
```

**マウント**

fstab変更やrootパスワード変更、モジュールやfirmwareを追加するためにマウントする

```
$ sudo mount -o loop fedora.img work
```

**モジュール追加**

同梱されているモジュールがあるが、fedoraがarm用で同梱しているものなので気にしない。

```
$ sudo cp -Rf firmware/modules/4.4.35-v7+ work/lib/modules
$ ls -al work/lib/modules
合計 32
drwxr-xr-x.  4 root root  4096 12月  2 15:51 .
dr-xr-xr-x. 59 root root 20480 11月 16 05:13 ..
drwxr-xr-x.  3 root root  4096 12月  2 15:51 4.4.35-v7+
drwxr-xr-x.  5 root root  4096 11月 16 05:13 4.8.6-300.fc25.armv7hl
```

**fstab設定**

当たり前ですが、Fedoraに同梱されている既存のfstabでは起動不可能なので、書き換えます

```
$ blkid -o  export fedora.img
DEVNAME=fedora.img
LABEL=_/
UUID=c19816a7-cbb8-4cbb-8608-7fec6d4994d0
TYPE=ext4
$ sudo vi work/etc/fstab
```

fstabに記載する内容

* UUIDベースで制御されているので、予め取得したUUIDを記載
* ``/boot``の内容が異なるので変更

```
UUID=c19816a7-cbb8-4cbb-8608-7fec6d4994d0  / ext4    defaults,noatime 0 0
/dev/mmcblk0p1   /boot vfat    defaults 0 0
```

**初期セットアップサービスの削除**

少しゴリ押しですが・・・

```
$ sudo rm work/etc/systemd/system/multi-user.target.wants/initial-setup.service
```

**sshログインの設定**

ここは、ユーザ個人設定なので・・・

```
$ sudo mkdir work/root/.ssh
$ sudo touch work/root/.ssh/authorized_keys
$ sudo vi work/root/.ssh/authorized_keys
$ sudo chmod 700 work/root/.ssh
$ sudo chmod 600 work/root/.ssh/authorized_keys
```


**rootパスワード設定**

ここは、ユーザ個人設定なので・・・

```
$ sudo chmod +w work/etc/shadow
$ openssl passwd -1 'your_password'
your_password
$ sudo vi work/etc/shadow
$ sudo chmod -w work/etc/shadow
```

``　etc/shadow``は以下のような形に変更する

```
root:*:17004:0:99999:7:::
→
root:your_password:17004:0:99999:7:::
```

**マウント解除**

必要最低限のことはできたので、マウント解除をする

```
$ sudo umount work
```

### Raspberry Pi書き込み用のimageの作成
---

ここからの作業がぶっちゃけ重要・・・

**書き込み用imageの作成**

``29500M + 200M = 29700M``以上かつ32GBに収まるようにします

```
$ truncate -s 29800M rasp_fedora.img
$ sudo parted rasp_fedora.img  mklabel msdos
警告: いま存在している rasp_fedora.img のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか？
はい(Y)/Yes/いいえ(N)/No? Y
```

**パーティションの作成**

先程作成した``bootパーティション``と``OSパーティション``の両方が書き込める領域を用意します

少しだけパーティション内に無駄が出ますが、安全側に倒して作成します

```
$ sudo parted rasp_fedora.img mkpart primary fat16 1MiB 210MiB
$ sudo parted rasp_fedora.img mkpart primary 210MiB 100%
```

**パーティションへの書き込み**

```
$ dd if=boot.img of=rasp_fedora.img obs=1M seek=1
$ dd if=fedora.img of=rasp_fedora.img obs=1M seek=210
```

これでRaspberry Pi対応版Fedoraの作成完了です

###  書き込みと起動結果
---

こんな感じで、SDカードに書き込みます

```
$ sudo dd if=rasp_fedora.img of=/dev/sda bs=1m
```

SDカードを抜いてRaspberry Piを起動すると下記のようにログインコンソールが現れます
(光が反射して見づらいですが、モニターのせいです> <;)

![DSC_0232.JPG](https://qiita-image-store.s3.amazonaws.com/0/17495/47075819-794f-fa35-3ac9-d77d23ccf475.jpeg)

![DSC_0233.JPG](https://qiita-image-store.s3.amazonaws.com/0/17495/ab463c88-9116-72ca-cb0a-412971366d1c.jpeg)

という感じで無事にインストールと起動することができました

### おまけ
---
ここまで書いておいて、今更ですが忙しい人向けに3行メモ残します

* Debian系のOSを使えば、``xzdec``,``git``,``kpartx``あれば楽にimgをセットアップできる[Installer](https://github.com/sjenning/rpi2-fedora-image-builder)があるので楽にimageが作成できます
* 前述のスクリプト使う場合は、settins.confの``ROOTSIZE``,``BOOTSIZE``を間違えるとで後からパーティション切る羽目になります
* [オフィシャル](https://fedoraproject.org/wiki/Raspberry_Pi)だと``dnf``からセットアップ用のパッケージインストールできるようです(未検証)

\# セットアップの中身を見ましたが、Debian系のコマンドである以外やってることは殆ど同じでしたw


### おまけ(その２)
---
ついでにwifiで外部と疎通できるところまで書いておきます

使用しているwifiドングルは、[GW-USNano2](https://www.planex.co.jp/product/wireless/gw-usnano2/)というものを使っています。
今だと後継機と思われる[GW-USNANO2A](https://www.planex.co.jp/products/gw-usnano2a/)が入手できるもののようです

\# 多分、このシリーズであれば確実にwifi接続できるでしょう。


で、肝心の設定の仕方ですが、DHCPでつなぐと仮定した状態で進めます

**設定の作成**

雑ですが、下記のようにSSIDとパスフレーズを記載

```
$ vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1
network={
    ssid="MYSSID"
    psk="passphrase"
}
```

ついでにsystemdで起動するようにしておきます

```
$ /etc/sysconfig/wpa_supplicant
INTERFACES="-iwlan0"
DRIVERS="-Dwext" #<= deprecatedだがつなぐ目的なので気にしない
OTHER_ARGS="-s"
```

**APにつながるか確認する**

以下を実行して問題なく、設定したSSIDが見えてるか確認しておく

```
$ wpa_supplicant -B -i interface -c /etc/wpa_supplicant/wpa_supplicant.conf
$ wpa_cli
> scan
OK
<3>CTRL-EVENT-SCAN-RESULTS
> scan_results
...
```

**pingで外部と疎通できるか確認**

```
$ dhcpclient wlan0
$ ping www.google.com
```

**dhcpcdをインストール**

```
$ dnf install dhcpcd
```

**systemdを有効化**

起動時に自動接続するように仕掛けておきます

```
$ systemctl enable wpa_supplicant
$ systemctl enable dhcpcd@wlan0
```

### インストール完了後は・・・
---

いつもどおり(?)、ユーザーやらパスワード変更、各種パッケージの更新を実施してください

\# 因みに不用意にアップデートをやりすぎるとカーネルパニックになるのでほどほどで・・・