给 ws215i 编译内核所碰到的各种坑

关键词:闻上云 ws215i 内核编译
ATOM+2G+4G 的诡异配置电子垃圾

硬件部分:

主板图

  • Intel ATOM CE5315 SOC(图中橙色框)
  • 四块三星 512M 内存颗粒(图中绿色框)
  • 4G 的闪迪 SD1N7DP2-40 EMMC(图中红色框)
  • 板载一个用途未知的 pcie 接口(图中粉色框,可能是设计之初用于 WiFi 模块但是因不明原因没有安装。)
  • IO:
  • USB3.0*2
  • HDMI
  • RJ45 千兆网口

首先简单介绍一下 ws215i 的硬件,年代久远的 atom soc,只有 4G 而且还是 emmc 的存储颗粒已经给开发造成了不小的困难;不过所幸官方有提供内核源代码,然而这里就是一个坑了。

系统部分

OpenMediaVault (下文简称 OMV) 无需过多介绍,开源 NAS 系统,基于 debian,界面扁平化,简单易用还稳定 (我自己都不信)
然而刚开始就碰到了第一个坑,虽然这个坑比较好解决
在运行 apt update 或 omv-update 以及安装任何 deb 包后,都会有这样一段报错

1
2
3
4
Exception ignored in:.remove at 0x76125420>Traceback (most recent call last):  File "/usr/lib/python3.5/weakref.py", line 117, in removeTypeError: 'NoneType' object is not callableException ignored in:.remove at 0x76125420>
Traceback (most recent call last):
  File "/usr/lib/python3.5/weakref.py", line 117, in remove
TypeError: 'NoneType' object is not callable

解决办法也很简单

vim /usr/lib/python3.5/weakref.py

1
def remove(wr, selfref=ref(self)):

修改为

1
def remove(wr, selfref=ref(self),_atomic_removal=_remove_dead_weakref):

1
_remove_dead_weakref(d, wr.key)

修改为

1
_atomic_removal(d, wr.key)

即可解决
然而这才刚过第一关,更新完软件包,配置完 raid,加载增强插件 OMV-EXTRAS, 配置完 webdav 后,到了 docker 部分,这里是第二个坑。

内核部分

寻找源代码

docker 安装完报错无法启动,经过查看 log 显示缺少 aufs 支持和 nf_nat 模块,询问刷机包作者答复官方并没有给出内核源代码,本应有源代码的仓库中只有一个 readme。
官方 GitHub 仓库 https://github.com/wisnuc 中确实并没有内核源代码,然而提交者 @matianfu-wisnuc 所 commit 的另一个仓库指向了一条线索,该账号于 https://github.com/matianfu/ws215i 中提交了一份内核的 deb 文件,而这个仓库确实如作者所说只有一个 readme,并没有源代码,然而 readme 中的内容又引出一条新的线索

1
2
3
4
sudo apt-get install build-essential linux-source kernel-package libncurses5-dev fakeroot
cd barcelona-4.3.3
make -j16
make-kpkg --rootcmd=fakeroot --initrd --jobs=8 --append-to-version=.001 --revision=001 kernel_image kernel_headers

其中 barcelona-4.3.3 文件夹所指的 应该是同账号下另一个仓库 https://github.com/matianfu/barcelona-4.3.3 而根据该仓库的 commits 记录,其确实为加入 CE53XX 系列 soc 驱动的定制版 4.3.3 内核 (足以可见该公司 GitHub 使用是多么的不规范)

编译

笔者为节约时间选择使用 Windows Subsystem for Linux 进行编译
其中有两个坑

  • gcc6 + 的一个已知问题 内核编译不支持使用 PIC 模式:

    在 gcc 6 + 版本中默认启用 PIE,而这是 gcc 的一个已知问题,目前为止官方并没有进行修复,因此只能修改 makefile 文件:在 KBUILD_CFLAGS 后加上 -fno-pie

  • Function not implemented This may be due to a lack of SYSV IPC support.

    WSL 下 fakeroot 存在问题,可以通过 sudo update-alternatives --set fakeroot /usr/bin/fakeroot-tcp 进行解决

完成

运行 make menuconfig 并勾选 nf_nat、iptable 及其下全部支持、overlayfs 文件系统支持
运行

1
make -j16 && make-kpkg --rootcmd=fakeroot --initrd --jobs=8 kernel_image kernel_headers

即可编译完成并打包 deb 文件在上一层目录,将其上传至 nas 中并 dpkg -i 安装并重启即刻顺利使用 docker

总结

这台设备确实是挺非传统的,没有传统的 BIOS,存储设备也是非传统的 emmc,甚至连 soc 也是主线内核没有兼容的,but it work

题外话

由于这台设备的 emmc 只有 4gb 所以 docker 的文件不建议放在 emmc 内,可以使用 ln -s 软链接链接至 raid 下