隠居日録

隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

FreeBSD 12.1をNaoPi NEO2上でセルフビルドするのは大変

FreeBSD 12.1がリリースされたので、早速ソースコードsvn経由で取得して、ビルドしようとしたのだが、メモリー不足でビルドにてまどった。12.0の時は特に何も考えずに、

# make -j2 buildworld
# make -j2 kernel

でユーザーランドも、カーネルもビルドできたのだが、12.1では-j2をつけると、メモリ不足でビルドできなかった。それと、FreeBSDのTest Suiteをビルドすると、それも大量のメモリを要求するようで、ビルドできなかった。なので、/etc/src.confに

KERNCONF=NANOPINEO2
WITHOUT_TESTS=yes
WITHOUT_LLVM_TARGET_MIPS=yes
WITHOUT_LLVM_TARGET_POWERPC=yes
WITHOUT_LLVM_TARGET_SPARC=yes
WITHOUT_LLVM_TARGET_X86=yes

以上の設定を書かなければならなかった。以前からmipsとかpowerpc向けにllvmコンパイルされていて、無駄だと感じていたので、ついでに追加した。

しかし、これでもカーネルのリンクでもメモリ不足で失敗した。それで、カーネルの設定であるGENERICの内容からNanoPi NEO2には関係なさそうなものを削除したNanoPi NEO2を作ってそれを使うようにした(src.confのKERNCONFに指定)。

2019/11/18更新 option passを削除して、smartctlが使えなくなっていたのを修正。更に必要のなさそうなものを削除。

include		GENERIC
ident		NANOPINEO2

nooptions 	GEOM_RAID		# Soft RAID functionality.
nooptions 	SOC_CAVM_THUNDERX
nooptions 	SOC_HISI_HI6220
nooptions 	SOC_BRCM_BCM2837
nooptions 	SOC_BRCM_BCM2838
nooptions 	SOC_MARVELL_8K
nooptions 	SOC_ROCKCHIP_RK3328
nooptions 	SOC_ROCKCHIP_RK3399
nooptions 	SOC_XILINX_ZYNQ

nodevice		qcom_gcc		# Global Clock Controller
nodevice		iflib
nodevice		em		# Intel PRO/1000 Gigabit Ethernet Family
nodevice		ix		# Intel 10Gb Ethernet Family
nodevice		axgbe		# AMD Opteron A1100 integrated NIC
nodevice		msk		# Marvell/SysKonnect Yukon II Gigabit Ethernet
nodevice		neta		# Marvell Armada 370/38x/XP/3700 NIC
nodevice		smc		# SMSC LAN91C111
nodevice		vnic		# Cavium ThunderX NIC
nodevice		al_eth		# Annapurna Alpine Ethernet NIC
nodevice		dwc_rk		# Rockchip Designware
nodevice		nvme		# base NVMe driver

nooptions 	NVME_USE_NVD	# = 0 prefer the cam(4) based nda(4) driver

nodevice		nvd		# expose NVMe namespaces as disks, depends on nvme
nodevice		sdhci_xenon		# Marvell Xenon SD/MMC controller
nodevice		rk_emmcphy
nodevice		uart_msm	# Qualcomm MSM UART driver
nodevice		uart_mu		# RPI3 aux port
nodevice		uart_mvebu	# Armada 3700 UART driver
nodevice		uart_ns8250	# ns8250-type UART driver
nodevice		rk_usb2phy		# Rockchip USB2PHY
nodevice		rk_typec_phy		# Rockchip TypeC PHY
nodevice		ehci_mv			# Marvell EHCI USB interface
nodevice		xhci			# XHCI PCI->USB interface (USB 3.0)
nodevice		rk_dwc3			# Rockchip DWC3 controller
nodevice		ukbd			# Keyboard
nodevice		muge
nodevice		smcphy
nodevice		smsc
nodevice		a37x0_gpio	# Marvell Armada 37x0 GPIO controller
nodevice		mv_gpio		# Marvell GPIO controller
nodevice		mvebu_pinctrl	# Marvell Pinmux Controller
nodevice		rk_gpio		# RockChip GPIO Controller
nodevice		rk_pinctrl	# RockChip Pinmux Controller
nodevice		bcm2835_bsc	# Broadcom BCM283x I2C bus
nodevice		syr827		# Silergy SYR827 PMIC
nodevice		rk_i2c		# RockChip I2C controller
nodevice		mv_cp110_icu	# Marvell CP110 ICU
nodevice		mv_ap806_gicp	# Marvell AP806 GICP
nodevice		mv_rtc		# Marvell Real-time Clock
nodevice		axp81x		# X-Powers AXP81x PMIC
nodevice		rk805		# RockChip RK805 PMIC
nodevice		mv_thermal	# Marvell Thermal Sensor Controller
nodevice		bcm2835_spi	# Broadcom BCM283x SPI bus
nodevice		rk_spi		# RockChip SPI controller
nodevice		rk_pwm
nodevice		evdev			# input event device support

nooptions		EVDEV_SUPPORT		# evdev support in legacy drivers

nodevice		uinput			# install /dev/uinput cdev
nodevice		rk_iodomain

nooptions 	THUNDERX_PASS_1_1_ERRATA

nodevice	al_ccu			# Alpine Cache Coherency Unit
nodevice	al_nb_service		# Alpine North Bridge Service
nodevice	al_iofic		# I/O Fabric Interrupt Controller
nodevice	al_serdes		# Serializer/Deserializer
nodevice	al_udma			# Universal DMA
nodevice	al_pci		# Annapurna Alpine PCI-E
nodevice	al_eth		# Annapurna Alpine Ethernet NIC

これでようやくビルドできて、インストールできた。ユーザーランドのビルドには2日以上かかる。やはり"make -j2"の効果はかなりあったのだろう。-j2をつけると1日かからないでビルドできていたのだから。

再起動すると立ち上がってきたので、とりあえずは動作は問題なさそうだ。

2019/11/18追記
12.0から12.1に更新するには/usr/srcの下にある新しllvm(8.0.1)を使わなければならないが、一旦12.1に更新したならば、既にインストール済みのllvmが使えるので、/etc/src.confに

WITHOUT_CROSS_COMPILER=yes

を追加し、

setenv CROSS_BINUTILS_PREFIX /usr/bin

を設定することで、ビルド時間が1.5日程度に短縮できた。