幅広いアーキテクチャに対応しているのが特徴のひとつであるNetBSD、当然(?)のことながらARMアーキテクチャを採用したシングルボードコンピュータのRaspberry Piでも動作します。
昨年のNetBSD Advent Calendar 2014で、@ebijunさんによるRaspberry PiへのNetBSDインストール手順についての記事がありました。
最近はあまり聞かなくなってしまいましたが、NetBSD等のいわゆるPC-UNIX系OSを用いてネットワークルータを構築する、というPCの活用方法もあります。今回はNetBSDが動作するRaspberry PiをPCルータにしてみる手順を解説してみたいと思います。
(そもそもRaspberry PiはPCなの?という疑問はさておき……)
ご注意
現時点(2015/12/2)でのNetBSD最新版はNetBSD-7.0です。今回解説するNetBSDのバージョンはNetBSD-7.0_RC1での手順となっており、最新版ではうまく行かない可能性もありますのでご注意ください。
(つまりこの記事はNetBSD-7.0_RC1でPCルータを構築した時の記録をもとに執筆しているわけです)
Raspberry PiへのNetBSDインストール
こちらは先述のとおり、昨年のNetBSD Advent Calendar 2014の記事をご参照ください。
さっそくPCルータとして活用……の前にカーネルビルド
NetBSDがインストールできたのでさっそくPCルータとして稼働させよう! ……と言いたいところですが、私の環境で利用するにあたっては何点か要件があり、それを満たすためにカーネルビルドが必要でした。
例えば以下のような要件です。
- なにはともあれ、PCルータとして利用したい
- "options GATEWAY"抜きでカーネルが構築されてゐる……
- パケットフィルタを利用できるようにしたい
- PPPoEを利用したい
- 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 -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カーネルをビルドしてみるで紹介した手順で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ルータを構築するにあたり、必要となったカーネル再構築の手順を紹介しました。明日の記事ではネットワークルータとして動作させるためのユーザランド側の設定について紹介する予定です。