COREELEC 19.X 已经发布,不存在MAC地址读取/重复问题了,如下文章已经过时,只作为存档。
-
Android版本的固件,可以通过uboot上keyman维护mac/mac_wifi等信息,参考
-
s905_autoscript 可以通过uboot-tools里面的mkimage制作,可以免拆机执行keyman的命令
-
但是CoreELEC不读取keyman里面的任何配置,所以一般都是直接加在s905_autoscript启动参数里面
-
但是由于CoreELEC内核处理的原因,wifi的MAC不从这里面读取,而内置的CYW43455芯片没有nvram,他们的做法是上传一个txt模拟nvram到内核,N1使用的是/usr/lib/firmware/brcm/nvram_ap6255.txt 写死了是00:90:4c:c5:12:38 这个dummy mac,所以改s905_autoscript的mac_wifi没有用
-
同样,蓝牙的MAC也是类似的问题
解决方案
复杂
修改内核个,适配keyman或者动态修改nvram.txt内容,固件间不通用
简单
-
-
传统的服务管理器无法在网络开启之前正确设置mac地址
实现方式
使用systemd+fw_setenv/fw_printenv
启动单元
vim /storage/.config/system.d/[email protected]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# /storage/.config/system.d/[email protected] [Unit] Description=MAC address loader for %I From bootloader env ConditionFileIsExecutable=/usr/sbin/fw_printenv Wants=network-pre.target Before=network-pre.target BindsTo=sys-subsystem-net-devices-%i.device After=sys-subsystem-net-devices-%i.device [Service] Type=oneshot ExecStartPre=/bin/bash -c '[ -z $(/usr/sbin/fw_printenv mac_%i -n 2>/dev/null) ] && { echo "Error: No Mac Address detect for %i from bootloader env";exit 1; } || exit 0' ExecStart=/bin/bash -c 'MAC_%i=$(/usr/sbin/fw_printenv mac_%i -n 2>/dev/null);/sbin/ip link set dev %i address $MAC_%i' #ExecStart=/sbin/ip link set dev %i up [Install] WantedBy=multi-user.target |
1 2 3 4 5 6 7 8 9 |
cat /etc/fw_env.config |grep -v '#' /dev/nand_env 0x000000 0x10000 0x10000 /dev/env 0x000000 0x10000 0x10000 fw_printenv # .... 确保有正确输出,否则说明此固件的fw_printenv无法支持此型号的uboot |
然后我们把需要持久保存的的mac写入uboot的env
1 2 |
fw_setenv mac_eth0 cc:cc:cc:cc:cc:cc fw_setenv mac_wlan0 cc:cc:cc:cc:cc:cb |
然后启用此服务即可
1 2 |
systemctl enable mac-address-loader@eth0.service systemctl enable mac-address-loader@wlan0.service |