Ubiquiti Networks社のEdgeRouter Liteには、デフォルトでLinuxベースのEdgeOSが搭載されていますが、FreeBSDでの動作実績(ここここ)もあります。そこで、本記事では、ソースコードの取得から、リリースイメージのUSBメモリの書き込みまでの手順を記録していきます。

なお、以下のビルドのためには、すでに動作しているFreeBSD環境が必要です。

こちらでビルド済みのUSBメモリイメージが配布されていますので、てっとりばやく試したい場合には便利です。

  1. ソースコードの取得

    ビルドしたいバージョンのソースコードを取得します。本記事では、11-RELEASE系の最新バージョンであるreleng/11.1ブランチ(記事執筆時点で11.1-RELEASE-p6)のソースコードを取得します。ソースコードの格納先とするディレクトリは任意ですが、ここでは/usr/srcとします。

    svnlite checkout https://svn.freebsd.org/base/releng/11.1 /usr/src
  2. パッチ

    EdgeRouter Lite用のカーネルコンフィグレーションは11-RELEASE系に用意されていますが、デフォルトではカーネルモジュールをビルドしないようになっています。しかし、ファイアウォールとしてPFを使用したい(IPFWはうまく動作しないようです)ので、以下のパッチをあて、ビルドが失敗するモジュールのみを除き、カーネルモジュールのビルドを有効にします。

    カーネルコンフィグレーションは/usr/src/sys/mips/conf以下にあります。

    --- ERL.orig    2018-01-30 21:20:23.550243000 +0900
    +++ ERL 2018-01-30 21:20:50.505064000 +0900
    @@ -25,7 +25,8 @@
     makeoptions    LDSCRIPT_NAME=ldscript.mips.octeon1
        
     # Don't build any modules yet.
    -makeoptions    MODULES_OVERRIDE=""
    +#makeoptions   MODULES_OVERRIDE=""
    +makeoptions    WITHOUT_MODULES="cxgbe mwlfw netfpga10g otusfw ralfw rtwnfw urtwnfw usb"
     makeoptions    KERNLOADADDR=0xffffffff80100000
        
     # We don't need to build a trampolined version of the kernel.
    
  3. ビルド

    ソースををビルドします。

    cd /usr/src
    make -DDB_FROM_SRC -DNO_FSCHG TARGET=mips TARGET_ARCH=mips64 buildworld
    make -DDB_FROM_SRC -DNO_FSCHG TARGET=mips TARGET_ARCH=mips64 KERNCONF=ERL buildkernel
    make -DDB_FROM_SRC -DNO_FSCHG TARGET=mips TARGET_ARCH=mips64 DESTDIR=/mnt/edgerouter installkernel
    make -DDB_FROM_SRC -DNO_FSCHG TARGET=mips TARGET_ARCH=mips64 DESTDIR=/mnt/edgerouter installworld
    make -DDB_FROM_SRC -DNO_FSCHG TARGET=mips TARGET_ARCH=mips64 DESTDIR=/mnt/edgerouter distribution

    以上で/mnt/edgerouter以下にバイナリ一式が作成されました。

  4. 設定ファイルの用意

    次に、手動で作成する必要のあるファイル(/etc/fstabおよび/etc/rc.conf)を追加します。

    cat << EOF > /mnt/edgerouter/etc/fstab
    # Device        Mountpoint         FStype  Options         Dump    Pass#
    /dev/ufs/rootfs /                  ufs     rw              1       1
    /dev/msdosfs/MSDOSBOOT /boot/msdos msdosfs rw,noatime      0       0
    tmpfs           /tmp               tmpfs   rw,mode=1777,size=64m 0 0
    EOF
    cat << EOF > /mnt/edgerouter/etc/rc.conf
    hostname="erl"
    ifconfig_octe0="inet DHCP"
    ifconfig_octe0_ipv6="inet6 accept_rtadv"
    sshd_enable="YES"
    growfs_enable="YES"
    EOF

    最後に、初回起動であることを示す番兵ファイルを設置します(初回起動時に、パーティションサイズをUSBメモリサイズいっぱいまで拡張するgrowfs処理を行なわせるため)。また、ブートパーティションをマウントするためのプレースホルダーを作っておきます。

    touch /mnt/edgerouter/firstboot
    mkdir /mnt/edgerouter/boot/msdos

以上で、USBメモリイメージを作成する準備ができました。

参考文献

  1. EdgeRouter Lite, https://www.ubnt.com/edgemax/edgerouter-lite/
  2. FreeBSD 11.x on Ubiquiti EdgeRouter Lite, http://rtfm.net/FreeBSD/ERL/
  3. FreeBSD on EdgeRouter Lite - no serial port required, http://www.daemonology.net/blog/2016-01-10-FreeBSD-EdgeRouter-Lite.html