0%

给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下