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脚本的写法, 不用校验参数应该挺简单的.
Member discussion