需求描述:项目中需要用新的板子替换掉旧的板子。旧板已在生产环境中使用,且网络已经配置好。为了使新板的网络配置跟旧板的一样,需要将新板的eth0和eth1这两个网口的mac地址替换成旧板的eth0和eth1两个网口的mac地址,并且重启后依然生效。
为了方便客户操作,计划通过shell脚本+u盘实现上述需求:
(1)在旧板插入u盘后,自动调用u盘中的脚本,获取旧板上的mac地址并生成.yaml文件保存到u盘中
(2)然后在新板插入u盘,将yaml文件拷贝到/etc/netplan路径下
(3)需要另写一个程序:识别u盘的拔插,以及根据ini配置文件自动执行u盘中的对应的脚本
这样在运行程序后,客户只需要拔插u盘就能实现mac地址的更换
本文主要介绍(1)(2)两步的实现过程
板子系统环境:ubuntu20.04
实现思路:需要先获取旧板上的mac地址,然后在新板中通过修改yaml 配置文件来达到更换mac地址的目的
一、netplan网络配置
从 ubuntu 17.10 版本开始引入netplan,作为默认的网络配置管理工具。它通过简单的 yaml 文件 来定义网络设置,并交由不同的后端(如 systemd-networkd 或 networkmanager)来管理实际的网络连接。(在 ubuntu 16.04 及更早版本中,默认使用 /etc/network/interfaces 文件来配置网络)
yaml 配置文件
netplan 使用 yaml 文件 来配置网络接口。这些文件通常位于 /etc/netplan/ 目录下,以 .yaml 作为文件扩展名。

出于安全考虑,在更换mac地址时需要先对原来的mac地址备份,需要了解以下信息:
(1)netplan 没有强制要求配置文件的名称,只要求配置文件位于 /etc/netplan/ 目录下,并且必须是 yaml 格式。
(2)netplan 会在启动时按文件名的字典顺序读取 /etc/netplan/ 目录下的所有 yaml 配置文件,如果有多个 yaml 文件,后读取的文件会覆盖之前文件中的配置。
假设你在 /etc/netplan/ 目录下有以下三个文件:
10-netplan.yaml
20-network-config.yaml
99-custom-settings.yamlnetplan 会按顺序读取这些文件:
先读取 10-netplan.yaml
然后读取 20-network-config.yaml,如果文件中有和 10-netplan.yaml 中相同的配置项,后者会覆盖前者。
最后,读取 99-custom-settings.yaml,它会覆盖前两个文件中相同的配置项。
二、获取旧板上的mac地址
实现脚本
#!/bin/bash
#此脚本用于获取当前设备的mac地址,并生成对应的/etc/netplan/01-network-manager-all.yaml文件.
# u 盘挂载路径(程序里面已建立软链接,也可以根据u盘的挂载点修改)
usb_path="/userdata/workspace/runningspace/upgrade"
config_name="01-network-manager-all.yaml"
# 检查 u 盘路径是否存在
if [ ! -d "$usb_path" ]; then
echo "错误: 未找到 u 盘挂载路径 $usb_path"
exit 1
fi
# 获取 mac 地址
mac_eth0=$(cat /sys/class/net/eth0/address)
mac_eth1=$(cat /sys/class/net/eth1/address)
echo "检测到 eth0 mac: $mac_eth0"
echo "检测到 eth1 mac: $mac_eth1"
# 生成 yaml 内容
cat <<eof > "${usb_path}/${config_name}"
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: true
macaddress: $mac_eth0
optional: true
eth1:
dhcp4: true
macaddress: $mac_eth1
optional: true
eof
echo "配置文件已生成至: ${usb_path}/${config_name}"脚本解析:
1、在ubuntu20.04中,可以通过/sys/class/net路径下的文件获取网卡的mac地址

2、读取后生成相应的yaml文件,保存到u盘中。这里有个地方需要注意:
renderer需要设置为networkd(不是networkmanager),并且optional设置为true。这样即使在没接网线的情况下,netplan配置也能生效。否则后续根据yaml文件更改mac地址时如果没接网线就会更改失败
三、更改新板上的mac地址
实现脚本
#!/bin/bash
#此脚本用于将另一台设备的mac地址替换到当前设备
# u 盘挂载路径(程序里面已建立软链接,也可以根据u盘的挂载点修改)
usb_path="/userdata/workspace/runningspace/upgrade"
# 定义路径
netplan_dir="/etc/netplan"
config_name="01-network-manager-all.yaml"
backup_name="01-network-manager-all.yaml.bak"
# 检查 u 盘中是否有目标文件
if [ ! -f "${usb_path}/${config_name}" ]; then
echo "错误: u 盘中不存在配置文件 ${config_name}"
exit 1
fi
# 1. 备份原文件 (如果尚未备份)
if [ -f "${netplan_dir}/${config_name}" ]; then
echo "正在备份原配置文件..."
sudo cp "${netplan_dir}/${config_name}" "${netplan_dir}/${backup_name}"
fi
# 2. 从 u 盘拷贝新配置
echo "正在从 u 盘应用新配置..."
sudo cp "${usb_path}/${config_name}" "${netplan_dir}/${config_name}"
# 3. 设置权限(netplan 对权限有严格要求,通常为 600 或 644)
sudo chmod 600 "${netplan_dir}/${config_name}"
# 4. 应用 netplan 配置
echo "正在应用网络配置..."
sudo netplan apply
if [ $? -eq 0 ]; then
echo "mac 地址永久修改成功!"
ip link show eth0 | grep link/ether
ip link show eth1 | grep link/ether
else
echo "应用失败,请检查 yaml 语法或硬件状态。"
fi到此这篇关于linux修改mac地址重启后依然生效的方法步骤的文章就介绍到这了,更多相关linux修改mac地址重启有效内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论