NetBSD+Raspberry PiでPCルータを作る(カーネルビルド編)


[幅広いアーキテクチャに対応している](https://ja.wikipedia.org/wiki/NetBSD#.E7.89.B9.E5.BE.B4)のが特徴のひとつである[NetBSD](http://www.netbsd.org)、当然(?)のことながらARMアーキテクチャを採用したシングルボードコンピュータの[Raspberry Pi](https://ja.wikipedia.org/wiki/Raspberry_Pi)でも動作します。

[昨年のNetBSD Advent Calendar 2014](http://qiita.com/advent-calendar/2014/netbsd)で、[@ebijun](https://twitter.com/ebijun)さんによるRaspberry Piへの[NetBSDインストール手順](https://github.com/ebijun/NetBSD/blob/master/Guide/RPI.rst)についての記事がありました。

最近はあまり聞かなくなってしまいましたが、NetBSD等のいわゆるPC-UNIX系OSを用いてネットワークルータを構築する、というPCの活用方法もあります。今回はNetBSDが動作するRaspberry PiをPCルータにしてみる手順を解説してみたいと思います。
(そもそもRaspberry PiはPCなの？という疑問はさておき……)

## ご注意

現時点(2015/12/2)でのNetBSD最新版は[NetBSD-7.0](http://www.netbsd.org/releases/formal-7/NetBSD-7.0.html)です。今回解説するNetBSDのバージョンはNetBSD-7.0_RC1での手順となっており、最新版ではうまく行かない可能性もありますのでご注意ください。
(つまりこの記事はNetBSD-7.0_RC1でPCルータを構築した時の記録をもとに執筆しているわけです)

## Raspberry PiへのNetBSDインストール

こちらは先述のとおり、[昨年のNetBSD Advent Calendar 2014](http://qiita.com/advent-calendar/2014/netbsd)の記事をご参照ください。

 * [NetBSDでRaspberryPIを使ってみる](https://github.com/ebijun/NetBSD/blob/master/Guide/RPI.rst)([@ebijun](https://twitter.com/ebijun)さん)

## さっそくPCルータとして活用……の前にカーネルビルド

NetBSDがインストールできたのでさっそくPCルータとして稼働させよう！ ……と言いたいところですが、私の環境で利用するにあたっては何点か要件があり、それを満たすためにカーネルビルドが必要でした。

例えば以下のような要件です。

 * なにはともあれ、PCルータとして利用したい
   * "options GATEWAY"抜きでカーネルが構築されてゐる……
 * パケットフィルタを利用できるようにしたい
 * PPPoEを利用したい
 * [OpenVPN](https://ja.wikipedia.org/wiki/OpenVPN)でVPNを構築できるようにしたい

NetBSD-7.0_RC1の時点では上記の機能はRaspberry Pi向けNetBSDカーネルコンフィグには含まれていなかっため、カーネルを再構築することで対応しました。

### カーネルソースコードの取得

カーネルソースコードを取得し、/usr/src以下に展開します。

```
# curl -O http://ftp.jaist.ac.jp/pub/NetBSD/NetBSD-7.0_RC1/source/sets/syssrc.tgz
# tar zxvf syssrc.tgz -C /
```

sys/arch/evbarm/conf/RPIがRaspberry Pi向けのカーネルコンフィグです。

```
# cd /usr/src/sys/arch/evbarm/conf/
```

### カーネルコンフィグの修正

カーネルコンフィグの修正箇所は以下の通りです。先述した機能を有効にするためのコンフィグを追加・有効化しているだけです。

```diff
$ diff -u RPI CIRLARKO
--- RPI 2015-03-16 07:52:18.000000000 +0900
+++ CIRLARKO    2015-06-26 10:24:06.000000000 +0900
@@ -6,6 +6,8 @@

 include        "arch/evbarm/conf/std.rpi"

+ident  "CIRLARKO"
+
 # estimated number of users

 maxusers       32
@@ -59,7 +61,7 @@

 # Networking options

-#options       GATEWAY         # packet forwarding
+options        GATEWAY         # packet forwarding
 options        INET            # IP + ICMP + TCP + UDP
 options        INET6           # IPV6
 #options       IPSEC           # IP security
@@ -72,6 +74,9 @@
 #options       PPP_FILTER      # Active filter support for PPP (requires bpf)
 #options       TCP_DEBUG       # Record last TCP_NDEBUG packets with SO_DEBUG

+options                IPFILTER_LOG    # ipmon(8) log support
+options                IPFILTER_LOOKUP # ippool(8) support
+
 options        NFS_BOOT_BOOTP
 options        NFS_BOOT_DHCP
 #options               NFS_BOOT_BOOTSTATIC
@@ -296,17 +301,17 @@
 # network pseudo-devices
 pseudo-device  bpfilter                # Berkeley packet filter
 #pseudo-device carp                    # Common Address Redundancy Protocol
-#pseudo-device ipfilter                # IP filter (firewall) and NAT
+pseudo-device  ipfilter                # IP filter (firewall) and NAT
 pseudo-device  loop                    # network loopback
 #pseudo-device kttcp                   # network loopback
-#pseudo-device ppp                     # Point-to-Point Protocol
-#pseudo-device pppoe                   # PPP over Ethernet (RFC 2516)
+pseudo-device  ppp                     # Point-to-Point Protocol
+pseudo-device  pppoe                   # PPP over Ethernet (RFC 2516)
 #options       PPPOE_SERVER            # Enable PPPoE server via link0
 #pseudo-device sl                      # Serial Line IP
 #pseudo-device strip                   # Starmode Radio IP (Metricom)
 #pseudo-device irframetty              # IrDA frame line discipline
-#pseudo-device tap                     # virtual Ethernet
-#pseudo-device tun                     # network tunneling over tty
+pseudo-device  tap                     # virtual Ethernet
+pseudo-device  tun                     # network tunneling over tty
 #pseudo-device gre                     # generic L3 over IP tunnel
 #pseudo-device gif                     # IPv[46] over IPv[46] tunnel (RFC 1933)
 #pseudo-device faith                   # IPv[46] TCP relay translation i/f
```

## カーネルのビルド

あとはいつもの通り、カーネルをビルドするだけです。カーネルビルドの手順は、[NetBSDカーネルをビルドしてみる](http://qiita.com/furandon_pig/items/d9b2782372edc1b93263)で紹介した手順でOKです。

ちなみにビルド時間は3時間ほどで、makeを実行したらあとは完了するまで放置で良いので、ビルド時間が長くて困るというようなことは無いかと思います。

```
# config CIRLARKO
# cd ../compile/CIRLARKO/
# make depend
# make
```

Raspberry Pi向けのカーネルは、netbsd.binという名前で生成されます。これをSDカードの/bootにkernel.imgという名前でコピーします。

```
# cp netbsd.bin /boot/kernel.img
```

そしてRaspberry Piを再起動すればビルドしたカーネルでNetBSDが起動してきます。

## まとめ

Raspberry PiでPCルータを構築するにあたり、必要となったカーネル再構築の手順を紹介しました。明日の記事ではネットワークルータとして動作させるためのユーザランド側の設定について紹介する予定です。