给 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 | 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> |
解决办法也很简单
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 | sudo apt-get install build-essential linux-source kernel-package libncurses5-dev fakeroot |
其中 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 下