From d4bd94cb8aa8d182273fedaac6ead8b3bae27c5c Mon Sep 17 00:00:00 2001 From: mofeng-git Date: Sat, 27 Sep 2025 09:50:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=92=8CMAC=E5=9C=B0=E5=9D=80=E7=94=9F?= =?UTF-8?q?=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 install.sh 中为 onecloud 和 onecloud-pro 平台启用基于 SN 的 MAC 地址生成机制 --- build/build_img.sh | 2 +- build/functions/install.sh | 8 +-- build/scripts/generate-random-mac.sh | 74 +++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/build/build_img.sh b/build/build_img.sh index 09a15a6f..96cac3fd 100755 --- a/build/build_img.sh +++ b/build/build_img.sh @@ -101,7 +101,7 @@ build_target() { onecloud_pro_rootfs local arch="aarch64" local device_type="gpio-onecloud-pro video1" - local network_type="" + local network_type="systemd-networkd" NEED_PREPARE_DNS=true ;; orangepi-zero) diff --git a/build/functions/install.sh b/build/functions/install.sh index 4b10bc2d..bc8a1d68 100755 --- a/build/functions/install.sh +++ b/build/functions/install.sh @@ -121,9 +121,9 @@ configure_network() { if [ "$network_type" = "systemd-networkd" ]; then echo "信息:在 chroot 环境中配置 systemd-networkd..." - # 检查是否为onecloud平台,如果是则使用随机MAC地址生成机制 - if [ "$TARGET_DEVICE_NAME" = "onecloud" ]; then - echo "信息:为onecloud平台配置随机MAC地址生成机制..." + # onecloud 与 onecloud-pro 均启用基于 SN 的 MAC 地址生成 + if [ "$TARGET_DEVICE_NAME" = "onecloud" ] || [ "$TARGET_DEVICE_NAME" = "onecloud-pro" ]; then + echo "信息:为 ${TARGET_DEVICE_NAME} 平台配置基于 SN 的 MAC 地址生成机制..." # 复制MAC地址生成脚本 sudo cp "$SCRIPT_DIR/scripts/generate-random-mac.sh" "$ROOTFS/usr/local/bin/" @@ -140,7 +140,7 @@ configure_network() { systemctl enable systemd-networkd systemd-resolved && \\ systemctl enable kvmd-generate-mac.service " - echo "信息:onecloud随机MAC地址生成机制配置完成" + echo "信息:${TARGET_DEVICE_NAME} 基于 SN 的 MAC 地址生成机制配置完成" fi else echo "信息:使用默认的网络管理器 (NetworkManager)..." diff --git a/build/scripts/generate-random-mac.sh b/build/scripts/generate-random-mac.sh index 447192aa..7cd016bf 100644 --- a/build/scripts/generate-random-mac.sh +++ b/build/scripts/generate-random-mac.sh @@ -1,12 +1,45 @@ #!/bin/bash -# 为onecloud平台生成随机MAC地址的一次性脚本 -# 此脚本在首次开机时执行,为eth0网卡生成并应用随机MAC地址 +# 为玩客云/玩客云Pro 平台生成 MAC 地址的一次性脚本 +# 此脚本在首次开机时执行,为 eth0 网卡生成并应用基于 SN 的 MAC 地址,失败时回退到随机 MAC set -e NETWORK_CONFIG="/etc/systemd/network/99-eth0.network" LOCK_FILE="/var/lib/kvmd/.mac-generated" +PLATFORM_FILE="/usr/share/kvmd/platform" +EFUSE_SYSFS_PATH="" +SN_PREFIX="" +SN_EXPECTED_LENGTH=13 + +# 按平台设置 EFUSE 与 SN 参数;未知平台时按 efuse 路径探测 +detect_platform_params() { + local platform="" + if [ -f "$PLATFORM_FILE" ]; then + platform=$(tr -d '\n' < "$PLATFORM_FILE") + fi + + case "$platform" in + onecloud) + EFUSE_SYSFS_PATH="/sys/bus/nvmem/devices/meson8b-efuse0/nvmem" + SN_PREFIX="OCP" + ;; + onecloud-pro) + EFUSE_SYSFS_PATH="/sys/devices/platform/efuse/efuse0/nvmem" + SN_PREFIX="ODC" + ;; + esac + + if [ -z "$EFUSE_SYSFS_PATH" ] || [ -z "$SN_PREFIX" ]; then + if [ -e "/sys/devices/platform/efuse/efuse0/nvmem" ]; then + EFUSE_SYSFS_PATH="/sys/devices/platform/efuse/efuse0/nvmem" + SN_PREFIX="ODC" + elif [ -e "/sys/bus/nvmem/devices/meson8b-efuse0/nvmem" ]; then + EFUSE_SYSFS_PATH="/sys/bus/nvmem/devices/meson8b-efuse0/nvmem" + SN_PREFIX="OCP" + fi + fi +} # 检查是否已经执行过 if [ -f "$LOCK_FILE" ]; then @@ -14,10 +47,29 @@ if [ -f "$LOCK_FILE" ]; then exit 0 fi -# 生成随机MAC地址 (使用本地管理的MAC地址前缀) +# 生成MAC地址函数 generate_random_mac() { - # 使用本地管理的MAC地址前缀 (第二位设为2、6、A、E中的一个) - # 这样可以避免与真实硬件MAC地址冲突 + detect_platform_params + # 尝试根据 SN 生成唯一 MAC 地址 + if [ -f "$EFUSE_SYSFS_PATH" ]; then + sn_offset=$(grep --binary-files=text -boP "$SN_PREFIX" "$EFUSE_SYSFS_PATH" | head -n1 | cut -d: -f1) + if [ -n "$sn_offset" ]; then + sn=$(dd if="$EFUSE_SYSFS_PATH" bs=1 skip="$sn_offset" count="$SN_EXPECTED_LENGTH" 2>/dev/null) + if [ ${#sn} -eq $SN_EXPECTED_LENGTH ]; then + echo "S/N: $sn" >&2 # 输出到 stderr,避免干扰返回值 + # 使用 SN 的 SHA-256 哈希生成后 5 字节(避免多余管道) + sn_hash=$(printf %s "$sn" | sha256sum | cut -d' ' -f1) + # 直接用 Bash 子串获取哈希末 10 个字符并插入分隔符 + mac_hex=${sn_hash: -10} + mac_suffix=$(printf "%s:%s:%s:%s:%s" "${mac_hex:0:2}" "${mac_hex:2:2}" "${mac_hex:4:2}" "${mac_hex:6:2}" "${mac_hex:8:2}") + printf "02:%s\n" "$mac_suffix" + return 0 + fi + fi + fi + + # 若 SN 获取失败,回退到随机逻辑 + echo "警告: 无法获取 SN,回退到随机 MAC 生成" >&2 printf "02:%02x:%02x:%02x:%02x:%02x\n" \ $((RANDOM % 256)) \ $((RANDOM % 256)) \ @@ -26,12 +78,18 @@ generate_random_mac() { $((RANDOM % 256)) } -echo "正在为onecloud生成随机MAC地址..." +echo "正在生成基于 SN 的 MAC 地址..." # 生成新的MAC地址 NEW_MAC=$(generate_random_mac) echo "生成的MAC地址: $NEW_MAC" +# 验证 MAC 地址格式 +if ! [[ $NEW_MAC =~ ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$ ]]; then + echo "错误: 生成的 MAC 地址格式无效: $NEW_MAC" + exit 1 +fi + # 备份原配置文件 if [ -f "$NETWORK_CONFIG" ]; then cp "$NETWORK_CONFIG" "${NETWORK_CONFIG}.backup" @@ -58,7 +116,7 @@ echo "MAC地址生成时间: $(date)" > "$LOCK_FILE" # 禁用此服务,确保只运行一次 systemctl disable kvmd-generate-mac.service -echo "随机MAC地址生成完成: $NEW_MAC" +echo "MAC地址生成完成: $NEW_MAC" echo "服务已自动禁用,下次开机不会再执行" -exit 0 \ No newline at end of file +exit 0 \ No newline at end of file