FreeBSD on UP Board、ちっちゃなPCにFreeBSDインストール

# ちっちゃな Intel PC で遊んでみよう
[UP Board](http://www.up-board.org/up/)が入手できたので、[FreeBSD](https://www.freebsd.org/)をインストールしてみました。
![UP Board](http://i1.wp.com/www.up-board.org/wp-content/uploads/2015/09/UPSlide3Right-EVT-3.png?resize=647%2C548)

[UP Board](http://www.up-board.org/up/)はIntelベースのちっちゃなPCで、大きさはほぼ[RaspberryPi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)とほとんど同じぐらいです。([RaspberryPi 3 と Pine64 と並べてみた。](https://t.co/fBxuu7HYjm))

ただ、*Piシリーズに比べると値段は高めです。
[UP Shop](http://up-shop.org/4-up-boards)で注文可能ですが、一番安いもので $89、高いものだと$149もします。
そのかわりメモリは最大4Gバイトのものが選べます。
*Piだと1Gバイトだったり2GバイトだったりでZFSを使ったりする場合に余裕がありませんが、4Gあるとだいぶ余裕が出てきます。

[UP Board](http://www.up-board.org/up/)はもともとKickstarterでスタートしたもののようですが、次の[UP2](http://www.up-board.org/upsquared/)が現在[Kickstarterで募集中](https://www.kickstarter.com/projects/802007522/up-squared-the-first-maker-board-with-intel-apollo?ref=nav_search)で、こちらは最大8Gバイトのモデルがあります。
興味がある方はこちらもどうぞ、
私は8Gバイトのモデルで一口乗りました。

## 購入時の注意
購入時には電源も一緒に買っておきましょう。
[RaspberryPi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)などのようにUSBケーブルで給電するタイプではなく、ACアダプタを使うタイプです。
本体以外にACアダプタも必要になるため、購入時に一緒に買っておくほうが無難です。

# インストール方法
[UP Board](http://www.up-board.org/up/)は基本的にPCです。
そのためインストール方法もPCの場合と同じです。
ただし、すこし変更が必要なところがあるため、その点について書いていきます。
[UP Board](http://www.up-board.org/up/)へ[FreeBSD](https://www.freebsd.org/)をインストールすることは、[すでに他の人が行っています](https://forums.freebsd.org/threads/56565/#post-329315)。

注意が必要なのは、次の二点。
- EFIしかサポートしていない
- シリアルコンソールを持っていない

## 用意するもの
[UP Board](http://www.up-board.org/up/)にはeMMCが載っていますが、[FreeBSD](https://www.freebsd.org/)ではまだ利用できないようです。
そのため、USB HDD/SSDを用意しておきます。
また、インストール用のUSBメモリも必要になります。

- UP Board本体
- UP Board用ACアダプタ
- インストール用USBメモリ(2G以上)
- USB接続のストレージ

## インストール用USBメモリを作る
普通のPCに[FreeBSD](https://www.freebsd.org/)をインストールする場合と同じように、インストール用USBを作成します。
[UP Board](http://www.up-board.org/up/)はEFIオンリーなため、EFI対応の[FreeBSD-11.0-RELEASE-amd64-memstick.img.xz](http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-amd64-memstick.img.xz)を入手し、USBメモリに書き込みます。

```shell-session:xzcat+dd
fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-amd64-memstick.img.xz
xzcat FreeBSD-11.0-RELEASE-amd64-memstick.img.xz | dd of=/dev/da0 bs=64k
```

### /boot/device.hints を修正する
[UP BoardにFreeBSDをインストールした人の情報](https://forums.freebsd.org/threads/56565/#post-329315)では、loaderが上がった時に

```shell-session
unset hint.uart.1.at
```

を実行するように書いていますが、この値は/boot/device.hintsに書かれているため設定を削除しておくことで同じ効果を得られます。

```text:diff
# diff -u /usr/src/sys/amd64/conf/GENERIC.hints /boot/device.hints
--- /usr/src/sys/amd64/conf/GENERIC.hints       2016-09-29 08:24:54.000000000 +0900
+++ /boot/device.hints  2016-12-11 00:43:23.415251000 +0900
@@ -19,7 +19,6 @@
 hint.uart.0.port="0x3F8"
 hint.uart.0.flags="0x10"
 hint.uart.0.irq="4"
-hint.uart.1.at="isa"
 hint.uart.1.port="0x2F8"
 hint.uart.1.irq="3"
 hint.ppc.0.at="isa"
```

## FreeBSDをインストールする
作成したインストール用USBメモリを使って起動します。
インストール画面が出てからのEFIを使うようにインストールすることを忘れないようにしてください。
それ以外の操作はPCにインストールする場合と同じで特に変わったところはありません。

注意する点は、起動メディアとインストール先のメディアがどちらもUSB接続となるため、インストール先のメディアの選択を間違えないようにしてください。

## インストールの最後で/boot/device.hintsを変更する
インストール最後の方でshellに移行してインストーラーで対応できない変更を行うタイミングがあります。
その時にインストール用USBメモリを作成した時との同じように/boot/device.hintsを変更しておきます。

# dmesg
dmesg はこんな感じ。

```text:dmesg
Copyright (c) 1992-2016 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 11.0-RELEASE-p2 #0: Mon Oct 24 06:55:27 UTC 2016
    root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
FreeBSD clang version 3.8.0 (tags/RELEASE_380/final 262564) (based on LLVM 3.8.0)
VT(efifb): resolution 1920x1080
CPU: Intel(R) Atom(TM) x5-Z8350  CPU @ 1.44GHz (1440.00-MHz K8-class CPU)
  Origin="GenuineIntel"  Id=0x406c4  Family=0x6  Model=0x4c  Stepping=4
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x43d8e3bf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,AESNI,RDRAND>
  AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM>
  AMD Features2=0x101<LAHF,Prefetch>
  Structured Extended Features=0x2282<TSCADJ,SMEP,ERMS,NFPUSG>
  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
  TSC: P-state invariant, performance statistics
real memory  = 4294967296 (4096 MB)
avail memory = 3430985728 (3272 MB)
Event timer "LAPIC" quality 600
ACPI APIC Table: <ALASKA A M I >
WARNING: L1 data cache covers less APIC IDs than a core
0 < 1
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
FreeBSD/SMP: 1 package(s) x 4 core(s)
random: unblocking device.
ioapic0 <Version 2.0> irqs 0-114 on motherboard
random: entropy device external interface
kbd1 at kbdmux0
netmap: loaded module
module_register_init: MOD_LOAD (vesa, 0xffffffff8101c970, 0) error 19
random: registering fast source Intel Secure Key RNG
random: fast provider: "Intel Secure Key RNG"
cryptosoft0: <software crypto> on motherboard
acpi0: <ALASKA A M I > on motherboard
acpi0: Power Button (fixed)
unknown: I/O range not supported
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
cpu2: <ACPI CPU> on acpi0
cpu3: <ACPI CPU> on acpi0
attimer0: <AT timer> port 0x40-0x43,0x50-0x53 irq 0 on acpi0
Timecounter "i8254" frequency 1193182 Hz quality 0
Event timer "i8254" frequency 1193182 Hz quality 100
atrtc0: <AT realtime clock> port 0x70-0x77 on acpi0
atrtc0: Warning: Couldn't map I/O.
Event timer "RTC" frequency 32768 Hz quality 0
hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff irq 8 on acpi0
Timecounter "HPET" frequency 14318180 Hz quality 950
Event timer "HPET" frequency 14318180 Hz quality 450
Event timer "HPET1" frequency 14318180 Hz quality 440
Event timer "HPET2" frequency 14318180 Hz quality 440
Timecounter "ACPI-safe" frequency 3579545 Hz quality 850
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x408-0x40b on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
vgapci0: <VGA-compatible display> port 0xf000-0xf03f mem 0xa0000000-0xa0ffffff,0x80000000-0x9fffffff at device 2.0 on pci0
vgapci0: Boot video device
xhci0: <XHCI (generic) USB 3.0 controller> mem 0xa1700000-0xa170ffff at device 20.0 on pci0
xhci0: 32 bytes context size, 64-bit DMA
usbus0 on xhci0
pci0: <serial bus, USB> at device 22.0 (no driver attached)
pci0: <encrypt/decrypt> at device 26.0 (no driver attached)
pcib1: <ACPI PCI-PCI bridge> at device 28.0 on pci0
pci1: <ACPI PCI bus> on pcib1
re0: <RealTek 8168/8111 B/C/CP/D/DP/E/F/G PCIe Gigabit Ethernet> port 0xe000-0xe0ff mem 0xa1604000-0xa1604fff,0xa1600000-0xa1603fff at device 0.0 on pci1
re0: Using 1 MSI-X message
re0: Chip rev. 0x4c000000
re0: MAC rev. 0x00000000
miibus0: <MII bus> on re0
rgephy0: <RTL8251 1000BASE-T media interface> PHY 1 on miibus0
rgephy0:  none, 10baseT, 10baseT-FDX, 10baseT-FDX-flow, 100baseTX, 100baseTX-FDX, 100baseTX-FDX-flow, 1000baseT-FDX, 1000baseT-FDX-master, 1000baseT-FDX-flow, 1000baseT-FDX-flow-master, auto, auto-flow
re0: Using defaults for TSO: 65518/35/2048
re0: Ethernet address: 00:07:32:3e:17:cb
re0: netmap queues/slots: TX 1/256, RX 1/256
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
acpi_button0: <Power Button> on acpi0
acpi_tz0: <Thermal Zone> on acpi0
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
ppc0: cannot reserve I/O port range
est0: <Enhanced SpeedStep Frequency Control> on cpu0
est1: <Enhanced SpeedStep Frequency Control> on cpu1
est2: <Enhanced SpeedStep Frequency Control> on cpu2
est3: <Enhanced SpeedStep Frequency Control> on cpu3
usbus0: 5.0Gbps Super Speed USB v3.0
ZFS NOTICE: Prefetch is disabled by default if less than 4GB of RAM is present;
            to enable, add "vfs.zfs.prefetch_disable=0" to /boot/loader.conf.
ZFS filesystem version: 5
ZFS storage pool version: features support (5000)
Timecounters tick every 1.000 msec
nvme cam probe device init
SMP: AP CPU #2 Launched!
SMP: AP CPU #1 Launched!
SMP: AP CPU #3 Launched!
Timecounter "TSC" frequency 1440003528 Hz quality 1000
Trying to mount root from zfs:zr2016/ROOT/default []...
Root mount waiting for: usbus0
ugen0.1: <0x8086> at usbus0
uhub0: <0x8086 XHCI root HUB, class 9/0, rev 3.00/1.00, addr 1> on usbus0
uhub0: 13 ports with 13 removable, self powered
Root mount waiting for: usbus0
ugen0.2: <SIGMACHIP> at usbus0
ukbd0: <SIGMACHIP USB Keyboard, class 0/0, rev 1.10/1.10, addr 1> on usbus0
kbd2 at ukbd0
Root mount waiting for: usbus0
ugen0.3: <vendor 0x0424> at usbus0
uhub1: <vendor 0x0424 product 0x4603, class 9/0, rev 2.01/1.82, addr 2> on usbus0
uhub1: MTT enabled
uhub1: 4 ports with 3 removable, self powered
Root mount waiting for: usbus0
Root mount waiting for: usbus0
ugen0.4: <asmedia> at usbus0
umass0: <asmedia ASMT1051, class 0/0, rev 2.10/1.00, addr 3> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:0:0: Attached to scbus0
da0 at umass-sim0 bus 0 scbus0 target 0 lun 0
da0: <ASMT 2115 0> Fixed Direct Access SPC-4 SCSI device
da0: Serial Number 123456796DA9
da0: 40.000MB/s transfers
da0: 228936MB (468862128 512 byte sectors)
da0: quirks=0x2<NO_6_BYTE>
ugen0.5: <vendor 0x0424> at usbus0
re0: link state changed to DOWN
re0: link state changed to UP
uhid0: <SIGMACHIP USB Keyboard, class 0/0, rev 1.10/1.10, addr 1> on usbus0
```


# インストールが終わったら
インストール用のUSBメモリを取り外し、インストールしたHDD/SSDだけをつないだ状態で起動します。

/boot/device.hintsの修正を忘れていた場合は起動中に停止してしまうため、loaderが起動した時に

```shell-session
unset hint.uart.1.at
```

を実行してから起動してください。

起動したら、まずはfreebsd-updateで最新の状態に更新してください。

```shell-session
freebsd-update fetch
freebsd-update install
```


後は通常通り、pkgなどで必要なソフトを入れてください。

VT-x など仮想化機能もサポートしているので、ちっちゃい仮想化環境もつくれるかもしれません。

[RaspberryPi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)と同じぐらいの大きさでよりパワフルな環境が欲しい人は、検討してみてはいかがでしょうか?