新浪网

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

发布于:北京

特别声明:以上文章内容仅代表作者本人观点,不代表 新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发布后的30日内与 新浪网联系。
加载中...