2 min read

ProxmoxVE 自动修改MAC地址

背景

在openwrt上放了个 /etc/ethers 文件, 实现了openwrt上的DHCP固定ip分配.

然而, 不管是ProxmoxVE, 还是ESXi的虚拟机, MAC地址都是随机的, pve还好些, 可以指定MAC的厂商, 也就是前三段, 然而后三段还是随机的, 没法儿让openwrt自动为新创建的机器自动分配.

之前都得在VM创建/克隆好后, 手动去修改net0的MAC地址, 最近测k8s需要批量创建VM, 实在是懒得改了, 于是打算脚本解决.

一键改MAC脚本

思路

  • 执行 MACdealer.sh <vmid> 能够自动把对应VM的配置文件中的net0的MAC地址修改掉;
  • MAC地址总共6段, 前四段正好拿来对应PVE的IP地址, 比如我用的 10:10:10:10, 后两段用来对应vmid, 比如vmid是 101 对应01:01, vmid是2345对应 23:45, 它们对应的ip地址就是 10.10.01.01, 10.10.23.45, 是不是非常简洁明了.
  • 脚本最好带一些安全检测, 比如未传参数, 或者参数传递错误, 或者对应配置文件不存在等.

脚本

#!/bin/bash

pve_conf_path="/etc/pve/qemu-server/"
mac_address_prefix="10:10:10:10:"

die() {
  echo >&2 "$@"
  exit 1
}

validateArgument() {
  [ "$#" -eq 1 ] || die "!!! 1 argument required, $# provided"
  echo $1 | grep -E -q '^[0-9]{3,4}$' || die "!!! 3/4 digits numeric argument required, $1 provided"
  vmid=$1
  vm_conf_path="${pve_conf_path}${vmid}.conf"
  [ -f "$vm_conf_path" ] || die "!!! $vmid's config file $vm_conf_path not exist"
}

generateMacAddress() {
  mac_address="$mac_address_prefix$(sed -E 's/([0-9]{2})([0-9]{2})$/\1:\2/' <<<"0$vmid")"
}

modifyConfAddress() {
  sed_cmd_str="/net0:/s/[:0-9A-Fa-f]{17}/$mac_address/"
  # echo $sed_cmd_str
  sed -E -i "$sed_cmd_str" $vm_conf_path
}

checkCurrentMacAddress() {
  [ "$#" -eq 1 ] && echo -e "\n$1"
  grep -E 'net0:' $vm_conf_path
}

debugOutput() {
  echo "==> target conf path: $vm_conf_path"
  echo "==> target MAC address: $mac_address"
}

echo
validateArgument $*
generateMacAddress
debugOutput
checkCurrentMacAddress "### MAC address before modifing:"
modifyConfAddress
checkCurrentMacAddress "### current MAC address: "
echo

创建VM后自动执行

那就需要一个hook操作, 在VM创建/克隆后自动执行.

查了下资料, 只有个 hookscripts 是类似效果, 但这个也是要手动执行才会对新创建的VM生效.

又查了一番, 找到个帖子, 根据官方的说法, 可以给模板添加这个, 然后所有clone出来的VM, 就会自动执行.

hookscripts

# 先用一键脚本, 有空再研究pl脚本的写法, 不用校验参数应该挺简单的.