Linux中修改mac地址(重启后依然生效)

需求描述:项目中需要用新的板子替换掉旧的板子。旧板已在生产环境中使用,且网络已经配置好。为了使新板的网络配置跟旧板的一样,需要将新板的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.yaml

Netplan 会按顺序读取这些文件:

先读取 10-netplan.yaml

然后读取 20-network-config.yaml,如果文件中有和 10-netplan.yaml 中相同的配置项,后者会覆盖前者。

最后,读取 99-custom-settings.yaml,它会覆盖前两个文件中相同的配置项。

二、获取旧板上的mac地址

实现脚本

bash 复制代码
#!/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地址

实现脚本

bash 复制代码
#!/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
相关推荐
讯捷蓝达2 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.3 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界4 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落4 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨4 小时前
WSL2的安装与使用
linux·wsl
微小的鱼4 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng5 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮6 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹6 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
Linux-lucky17 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu