CM311/M401A 盒子的折腾笔记
作者:0x5e
经不起S905盒子50块的诱惑,上周购入,折腾了大半个礼拜,踩了无数的坑,刷机几十次,整个人都不好了。如果你也已经买入,和我有同样的痛苦,欢迎来看看这篇踩坑日记
还没买的同学请先做好心理准备,大概率是会变砖的,哪怕你按着教程一步步做没有做错,也有可能会在刷入 emmc 阶段,或者设置网络阶段,莫名其妙的网卡挂掉,或者引导挂掉,然后就要从头开始刷机了。
救砖篇
晶晨线刷软件和刷机教程可以在网上搜,挺多的,这里好像不方便提供外部链接,具体我就不讲了,我就补充点教程里可能会遗漏的小细节
如何进入刷机模式:
1. 触点。不同板子的触点不同,我的主板和网上的图就不一致,但是我试了一下,图中同样的触点(4R32)是可以进入刷机模式的。先打开刷机软件,一头连上电脑,一只手先用镊子按住两个触点短接,另一只手把数据线的另一头插入盒子。
2. 复位键。有的主板背面有颗复位键,也可以试试,但是刷过机之后可能就失效了,需要用触点了。可以两种都是一下。
3. PDD 买一个晶晨免拆神器,8块钱一个,直接插在 HDMI 接口上就可以。(我没试过)
注意事项
1.刷入 Armbian 之后启动黑屏
网友们反馈:需要安装图形界面(xorg,kodi,xfce都行)或是在开机之后再插入 HDMI 线。据说是 5.15.61 内核的 bug,可以换 5.15.60 内核,或者换 5.10.x 也行。
2.盒子获取了两个 IP 地址
有两种方式:
第一种,执行以下命令关闭 NetworkManager 服务(一次就好),重启机器。
systemctl disable NetworkManager.service
这种方式的好处是比较方便,后续想去 "/etc/network/interfaces" 做任何配置的话,网上资料挺多。
缺点是获取不到公网 IPv6 地址了。
第二种,注释掉 "/etc/network/interfaces" 中关于 eth0 的所有配置,保留 NetworkManager 服务,重启机器。
这种方式的缺点(不,是我的缺点)是,后续配置网络需要用 nmcli 这个命令行工具操作,可能很多同学对他会比较陌生。
3.开机后概率性获取不到 IP 地址
这是一个非常玄乎的问题,当我想要复现它的时候,重启了十几次都没有发生,但是我感觉在做任何网卡设置有关的操作时(比如修改网卡配置,设置 mac 地址,添加网桥,或者 docker 新增 macvlan 网络,等等等等),都有概率当场网卡挂掉,也有可能是重启之后才挂掉。
具体现象是,启动日志在这步会停留很久直到超时:
A start job is running for Raise network interfaces (xxx /1min 43s)
然后执行 ifconfig 会发现 eth0 已经启动,但是没有分配到 IP 地址。尝试手工分配ip和设置路由表也无法正常访问网络。
有人说升级 5.15 内核可解,也有的说问题依旧。可能和 uboot 或者内核有关系,具体原因不清楚了,涉及到了我的知识盲区
经过本人复现和验证,这个问题算是被解决(绕过)了。在启动脚本 "/etc/rc.local" 中加入以下代码:
if ip addr show eth0 | grep "inet " > /dev/null 2>&1 ; then
echo "eth0: Get ip address success."
else
echo "eth0: Get ip address failed, retry..."
ifconfig eth0 down && ifconfig eth0 up
fi
意思是,当启动完成之后,eth0 网卡如果没有分配到 IP 地址,就执行 "ifconfig eth0 down && ifconfig eth0 up" 。大家不要笑,也就这么两句命令嘛,其实这里是有讲究的, "ifdown eth0 && ifup eth0" 是无效的
。两者区别欢迎大佬们来科普。
4.docker 容器关闭导致盒子重启
如果你的盒子是用于旁路由,那么你很有可能会用 docker 以特权模式启一个 OpenWrt 容器。如果你在启动容器的时候:
1. 添加了 "--privileged" 参数
2. 添加了 "--restart=always" 参数
你会发现,当你停止容器之后,系统日志多了一条:"watchdog did not stop!",过了几十秒之后,盒子就自动重启了。。卧槽什么鬼。。
重启了也就算了,问题来了,盒子重启之后,容器仍然是在运行的,因为 restart=always 嘛。。
那我如果就是想停掉容器怎么办,我把容器停止之后再删掉总可以了吧?好的,当我删掉容器之后,盒子同样是自动重启了。
关键来了,重启之后,容器诈尸了,刚才明明删除成功了,现在仍然是在运行中。
???
那怎么办?
docker update [container_name] --restart=no
先用这个命令把 restart 参数改成 no,然后再停止容器。随着盒子自动重启后,容器终于停下来了。
5. macvlan 网络的容器和主机之间无法互访
由于我们是拿盒子运行 OpenWrt 容器作为旁路由的,因此可以设置主路由作为中转。
在主机(盒子)的启动脚本 "/etc/rc.local" 中添加以下代码:
ip route add [container_ip] via [router_ip]
在 OpenWrt 的“网络 => 静态路由 => 静态IPv4路由”中添加以下记录:
6. 容器获取不到公网 IPv6
首先在 "/etc/docker/daemon.json" 新增这两个字段(没有就新建文件):
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
然后重启 docker 服务或者机器。
然后在创建 macvlan 网络的时候,请加上 "--ipv6" 参数,例如:
docker network create -d macvlan
--subnet=172.16.0.0/24 --gateway=172.16.0.1
--ipv6 --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10
-o parent=eth0
bridge-host
关于IPv4和IPv6的子网和网关具体填什么的问题,貌似对于OpenWrt容器来说是没什么用处的,因为在容器其中之后,这些信息就已经被修改掉了。所以我是填了几个不存在的网段和网关IP。
最后执行 "docker network inspect [network_name]" 命令,确认输出的内容里 EnableIPv6 为 true,那么关于主机的 IPv6 设置应该就是成功了。至于 OpenWrt 容器如何配置,请另寻他处,我没有完全解决,就不分享了
。
7. OpenWrt 的一些代理工具失效
因为docker容器是共用宿主机的内核的,所以一些依赖到 "kmod-*" 的软件包可能工作会异常,比如某些海外加速工具(不知当讲不当讲)。失效的朋友们请切换一下代理模式,有些模式还是能用的。如果你很在意这个问题,建议还是直接盒子刷 OpenWrt 或者是在 Armbian 上运行 QEMU + KVM 虚拟机,在虚拟机里装 OpenWrt。
8.个别 OpenWrt 容器启动后,会导致盒子的控制台异常
现成的 OpenWrt 镜像有很多,例如 sulinggg/openwrt:armv8,偏偏我用的那个有点问题(immortalwrt/rootfs:armvirt-64-openwrt-21.02.1),启动之后,盒子的终端被抢占了,导致我重启盒子之后,终端显示错乱,即不能登录 Armbian 也不能登录 OpenWrt。最后对比了一下发现问题出在"/etc/inittab"。具体原因不是很懂,总之如果你遇到了这样问题的镜像,但是又想用的话,可以参考其他镜像改一改这个文件。
9. OpenWrt 容器启动后有概率 ping 不通任何 IP
(这台机子的网卡我真的是服了)
当你启动 OpenWrt 容器之后 ping 不通任何 IP 包括 127.0.0.1 时。。。
/ # ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
ping: sendto: Operation not permitted
和问题3类似,只是判断条件改了。在容器的 "/etc/rc.local" 添加以下内容(不是盒子的哈):
if ping -c 1 127.0.0.1 2>&1 | grep "sendto: Operation not permitted" > /dev/null ; then
logger "eth0: Init failed, retry..."
ifconfig eth0 down && ifconfig eth0 up
else
logger "eth0: Init success."
fi
发布于:北京