在树莓派上安装并运行FreeBSD

FreeBSD针对树莓派有一个专门的项目在维护,叫做RaspBSD,地址位于这里:

http://www.raspbsd.org/

这个项目是FreeBSD的commiter,Brad Davis大大在维护。基本上使用这个网站上的img,就可以直接把树莓派给跑起来了。需要注意的是,在我写这篇文章的时候,FreeBSD 12还没有release,因此在Pi3上运行版本12的时候,要注意网站文档里的说明来设置pkg库:

把img给写到tf卡里的过程在本文不详细展开了,建议大家使用Linux机器的dd命令,直接把RaspBSD提供的img文件写入,这样保证boot分区的格式和内容都没有问题,可以一次点亮树莓派。

关于FreeBSD的基础使用,可以参考它的官方文档:

https://www.freebsd.org/docs.html

FreeBSD的官方文档质量一直很高,建议大家详细阅读。特别是看一下用户管理,以及包管理相关的内容,这些都是基础。

因为RaspBSD的初始分区只使用数G的存储空间,所以默认的分区比较小,基本是不够使的,所以启动了FreeBSD以后,第一件要做的事情是把你的TF卡的所有存储空间都交给根分区,这样就有足够容量安装额外软件了。

使用growfs命令来做这件事情即可:

就像上面这样,完成分区容量的扩展工作。因为这个是一次性的,所以以后不需要再执行。下面是用到的命令:

service growfs onestart

分区完成后,可以看到我的存储卡的容量都被使用起来了:

接下来讲讲下载FreeBSD的内核源码和编译驱动模块的相关。

树莓派的FreeBSD源代码

树莓派是ARM架构,我使用的树莓派型号是3B,使用的源代码在这里:

http://ftp.freebsd.org/pub/FreeBSD/snapshots/arm64/aarch64/12.0-CURRENT/

把这个下载到BSD本地的/usr/src目录:

然后把这个src.txz解压,它会解压出一个src目录,要把src里面的东西放到本级/usr/src目录下。

下面是解压后的目录:

有了这个源码目录,我们就可以编译FreeBSD的驱动模块了。关于编译FreeBSD内核和进行驱动开发,强烈建议大家阅读FreeBSD的这两个开发文档:

FreeBSD Developers’ Handbook https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/
FreeBSD Architecture Handbook https://www.freebsd.org/doc/en/books/arch-handbook/index.html

这两篇文档里面包含很全面的,把FreeBSD当作开发平台的知识,也介绍了编译内核和Device Driver的详细方法。我们照着文档里给出的样例写个驱动:

https://www.freebsd.org/doc/en/books/arch-handbook/driverbasics.html

样例代码如下:

/*
 * KLD Skeleton
 * Inspired by Andrew Reiter's Daemonnews article
 */

#include <sys/types.h>
#include <sys/module.h>
#include <sys/systm.h>  /* uprintf */
#include <sys/errno.h>
#include <sys/param.h>  /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */

/*
 * Load handler that deals with the loading and unloading of a KLD.
 */

static int
skel_loader(struct module *m, int what, void *arg)
{
  int err = 0;

  switch (what) {
  case MOD_LOAD:                /* kldload */
    uprintf("Skeleton KLD loaded.\n");
    break;
  case MOD_UNLOAD:
    uprintf("Skeleton KLD unloaded.\n");
    break;
  default:
    err = EOPNOTSUPP;
    break;
  }
  return(err);
}

/* Declare this module to the rest of the kernel */

static moduledata_t skel_mod = {
  "skel",
  skel_loader,
  NULL
};

DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);

上面这个driver代码命名为skeleton.c。这个驱动代码什么也不做,就是在load和unload的时候打印一下内核日志。下面是相关的Makefile文件:

SRCS=skeleton.c
KMOD=skeleton

.include <bsd.kmod.mk>

上面的KMOD和相关的include文件,都是FreeBSD的自己的源代码提供的,我们使用就好。此时可以make来编译了:

这样,我们就编译完了这个模块。目前的问题是这个模块似乎无法正确加载:

root@bsd:/home/weli/work # kldload ./skeleton.ko
kldload: can't load ./skeleton.ko: module already loaded or in kernel

目前还不确定是我使用的问题还是树莓派平台的问题。后续如果有新发现再更新这篇文章。

以上是对FreeBSD在树莓派运行情况的一个记录,希望对大家有帮助。