0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ずんだもん「Parallelsの仮想マシンを固有情報も変えてクローンするスクリプトなのだ!」~おもち職人の夜明け編~

Last updated at Posted at 2025-07-19

登場人物

ずんだもん

  • Mac Miniがお気に入りの小学生。機械やITの“システムの壁”にはよくぶつかる。困ったときは「パソコン博士」な四国めたんに相談する。

四国めたん

  • 頼れる現場の“おねえさん。みんなの失敗やトラブルにも慌てずに、するっと肝心なアドバイスをくれるクールな参謀。テクノロジーの難しい話も、かみ砕いて伝えてくれる。
Image 1 Image 2

ずんだもん「めたん、たいへん!会社のIntuneに新しいパソコンをたくさん登録しようとしたら、なんだかわからないエラーがいっぱい出ちゃったのだ…。ぼく、Intune登録職人になったはずなのに、ぜんぜん登録できてないのだ…!😭」

四国めたん「ずんだもん、その“登録職人”は、もしかしてParallelsで仮想マシンをそっくり複製(クローン)したせいじゃない?
クローンって楽だけど、そのままだと“見た目そっくり兄弟”状態で、Intuneとかクラウド管理だと“みんな同じPCだ!”って扱われてしまうのよ。」

image.png

ずんだもん「えっ!じゃあ、たくさん増やしたつもりが、ぜんぶ“ぼく”しかいなかったのだ!? クローン一族なのだ…!ずんだ餅なら歓迎だけど、これじゃ仕事にならないのだ…。」

仮想マシンの大量展開作業で「まったく同じVMイメージをクローンして運用」する場面はよくあります。
しかし、そのままIntuneや資産管理システムに登録しようとすると――

  • AutopilotなどのEntra参加時にエラーメッセージが出て進めない

  • 複数台のはずが、1台分しかIntuneで表示されない、などのトラブルが起きがちです

これは、クローン元のPC情報(UUID・シリアル番号・MACアドレスなど)がすべて同じままコピーされてしまい、「別のPCなのに、Intune側からは完全に“同じマシン”に見える」ことが主な原因です。

ずんだもん「ねえ、めたん、UUIDとかMACとか重複しちゃうとIntune登録できないのは困るのだ!みんなのPCを1台に合体させちゃったのはずんだもん君かい?って怒られちゃうのだ!😭」

四国めたん「ふふっ、でもこれってよくある落とし穴だから、困ってるのはずんだもんだけじゃないと思うわ」

四国めたん「大丈夫、bashスクリプトを使えば全部自動で解決よ! しかも今回は解説だけじゃなく、“クローン元もクローン先も識別子の重複ゼロ”をしっかりチェックできる構成にしておいたから安心していいわよ!」

📝 このスクリプトでできること

  • 指定したParallels VMを**好きな台数だけクローン可能
  • 各クローンごとSMBIOSシリアル番号先頭NICのMACアドレスをすべてランダムに新規付与
  • クローン処理後、UUID/Serial/MACのテーブルで一覧・重複チェック表示
  • 実行後にスクリプトも削除される安心設計

ずんだもん「つまり、クローン増殖も、識別子リセットも、人力ずんだ餅量産も全部自動なのだ!ぼくが毎日もちもち悩む必要もないのだね…!」

四国めたん「うんうん。入力が限られているから、コピペで手で行うよりミスも少なくなるわよ」

🚩使い方イメージ

image.png

image.png

ずんだもん「めたん、まずクローンしたいVMを選べばいいのだ?」

四国めたん「そうよ。キーワードで候補リストから1台選んでね。『Win11 Pro』とか『Template』でOKよ。」

ずんだもん「何台複製するかも指定できるのだ?」

四国めたん「もちろん。10台でも100台でもOKよ。ただしMac Miniは泣きを見せてくるかも、負荷的な意味で。」

ずんだもん「クローン名もつけられるのだ? “ずんだもち1”…“ずんだもち100”みたいな。」

四国めたん「好きなベース名に連番で生成できるよ♪ “Zunda-PC01”からでもOK!」

ずんだもん「“ZundaPC-999”で999台…まるでずんだ餅工場なのだ~!胃袋よりストレージが先にパンパンになるのだ!」

🖥️クローン処理後のテーブル出力例

image.png

  • クローン元は「→ クローン元」と表示
  • 各クローンはOK/NGラベル付きで重複を自動チェッカー
  • エラー/重複は色分け(緑OK・赤NG)で一目で分かる

🧑‍🔧 ずんだTips

ずんだもん「めたん、このスクリプト、クローン失敗したらどうなるのだ?」

四国めたん「コマンド失敗には『ずんだもち生産システムは一時停止しました』的に自動で停止してくれるわよ。」

ずんだもん「安心設計なのだ。お餅の工場なみに安全第一なのだな…!」

四国めたん「あと、スクリプトは使い終わったら自分で消えてくれるから、“捨て忘れたずんだ餅の包み紙”みたいなのもないわよ。ずんだもんがいつもやってるやつね。」

本スクリプトはParallels Pro/Business/Enterprise専用となります。

📝 おわりに

Image 1 Image 2

ずんだもん「パソコンのクローンって、同じ絵をたくさんコピーするのと似てるのだ!でも、ただコピーするだけじゃなくて、一台ずつにキラキラのシールを貼ってあげるのが大事なのだ!」

四国めたん「キラキラのシール?まあ、UUIDやシリアル番号のことかしら。確かに、それが無いと誰のパソコンか分からなくなっちゃうわね。」

ずんだもん「うん!だから、ぼくがぜーんぶに違う色のシールを貼ってあげるのだ!赤、青、きいろ…これで完璧なのだ!ぼく、おてつだい上手なのだ!」

四国めたん「ふふっ、そうね、このスクリプトがあれば、もう“コピー&ペーストの呪い”に悩まされることもないわね。クローン元のゴーストに悩まされることもなく、クリーンなVMができるわ。」

ずんだもん「クローンって、ずんだ餅をペッタンペッタンするのと似てるのだ!どんどん増えて、もちもち祭りなのだ〜!」

四国めたん「VMは食べ物じゃないっていつも言ってるでしょ…。でもお餅みたいに伸びる…というか増える…って感じね」

ずんだもん「もちもちパワーでVMもクローンもモリモリ増殖なのだ!みんなの“餅力(もちりょく)”も思わず高まるのだ~!」

四国めたん「餅は世界を救う...ってことかしら?(笑)」

リンク集

利用キャラクター

本記事で使用しているキャラクター画像の著作権は、それぞれの権利者に帰属します。
非商用目的での利用に基づき掲載しています。

✨Parallels VMクローンスクリプト

clone_and_reset_parallels_vm.sh
cat << 'EOF' > clone_and_reset_parallels_vm.sh
#!/bin/bash

# ===========================================================
# Parallels Desktop用 クローン支援ツール
#
# 指定したVMを元に、好きな台数分のクローンVMを作成できます。
# 各クローンごとにSMBIOSのシリアル番号と、先頭NICのMACアドレスが
# 自動的に新しいランダム値で割り当てられます。
#
# クローン処理後には、クローン元およびクローン先VMのUUID・Serial・MACの
# 一覧表を表示し、すべて異なる場合は「OK」を、重複があれば「NG」を示します。
#
# 最後にスクリプトも自動削除されます。
# ===========================================================

echo
echo "==========================================================="
echo "Parallels Desktop用 クローン支援ツール"
echo ""
echo "指定したVMを元に、好きな台数分のクローンVMを作成できます。"
echo "各クローンごとにSMBIOSのシリアル番号と、先頭NICのMACアドレスが"
echo "自動的に新しいランダム値で割り当てられます。"
echo ""
echo "クローン処理後には、クローン元およびクローン先VMのUUID・Serial・MACの"
echo "一覧表を表示し、すべて違えば「OK」、重複があれば「NG」を示します。"
echo ""
echo "最後にスクリプトも自動削除されます。"
echo "==========================================================="
echo

GREEN='\033[32m'
RED='\033[31m'
MAGENTA='\033[1;35m'
CYAN='\033[36m'
RESET='\033[0m'

gen_mac() {
  hexchars="0123456789ABCDEF"
  echo "02$(for i in {1..5}; do echo -n ${hexchars:$((RANDOM%16)):1}${hexchars:$((RANDOM%16)):1}; done)"
}
gen_serial() {
  date +%s%N | sha256sum | cut -c1-12
}
trim_uuid_braces() {
    echo "$1" | sed 's/[{}]//g'
}
get_vm_info() {
  local vname="$1"
  local uuid serial mac
  uuid=$(prlctl list --all --output uuid,name | awk -v v="$vname" '$2==v {print $1}')
  uuid=$(trim_uuid_braces "$uuid")
  serial=$(prlctl list "$vname" --info | grep -i "Serial number" | awk -F': ' '{print $2}' | head -1)
  mac=$(prlctl list "$vname" --info | grep -E '^\s*net[0-9]+' | head -1 | sed -n 's/.*mac=\([0-9A-Fa-f:]*\).*/\1/p')
  echo "$uuid,$serial,$mac"
}

# クローン元VM選択
read -p "$(echo -e "${CYAN}クローン元VMを検索するキーワード(スペース区切り複数可): ${RESET}")" keywords
if [ -z "$keywords" ]; then
    echo -e "${MAGENTA}キーワードが未入力のため終了します。${RESET}"
    rm -- "$0"
    exit 0
fi
vmlist=$(prlctl list --all --output uuid,name,status --no-header)
for word in $keywords; do
    vmlist=$(echo "$vmlist" | grep -i "$word")
done
if [ -z "$vmlist" ]; then
    echo -e "${MAGENTA}該当するVMが見つかりませんでした。${RESET}"
    rm -- "$0"
    exit 0
fi
IFS=$'\n' read -d '' -r -a vms <<< "$vmlist"
echo -e "${MAGENTA}クローン元候補一覧:${RESET}"
for i in "${!vms[@]}"; do
    idx=$((i+1))
    echo -e "${MAGENTA}[$idx] ${vms[$i]}${RESET}"
done

echo ""
read -p "$(echo -e "${CYAN}クローン元VMの番号(1から)を入力してください: ${RESET}")" idx1
idx=$((idx1-1))
if ! [[ "$idx1" =~ ^[0-9]+$ ]] || [ "$idx" -lt 0 ] || [ "$idx" -ge "${#vms[@]}" ]; then
    echo -e "${MAGENTA}番号が不正です。終了します。${RESET}"
    rm -- "$0"
    exit 0
fi
uuid=$(echo "${vms[$idx]}" | awk '{print $1}')
srcname=$(echo "${vms[$idx]}" | cut -d' ' -f2- | awk '{print $1}')

echo ""
read -p "$(echo -e "${CYAN}いくつクローンを作成しますか?: ${RESET}")" num
if ! [[ "$num" =~ ^[0-9]+$ ]] || [ "$num" -le 0 ]; then
    echo -e "${MAGENTA}不正な数値です。中止します。${RESET}"
    rm -- "$0"
    exit 0
fi
echo ""
read -p "$(echo -e "${CYAN}クローンVMのベース名を入力してください(例: Win11Clone): ${RESET}")" clonename
if [ -z "$clonename" ]; then
    clonename="Clone"
fi

declare -a clone_names

for i in $(seq 1 "$num"); do
    newname="${clonename}${i}"
    clone_names+=("$newname")
    echo -e "${CYAN}[$i/$num] クローン作成: $newname${RESET}"
    prlctl clone "$uuid" --name "$newname"
    # 「クローン失敗」なら即終了
    if [ $? -ne 0 ]; then
        echo -e "${RED}  → クローン失敗${RESET}"
        echo -e "${RED}スクリプトを終了します。${RESET}"
        rm -- "$0"
        exit 1
    fi
    serial_new=$(gen_serial)
    echo -e "${CYAN}  → SMBIOSシリアル・MACアドレスを新規割り当て${RESET}"
    prlctl set "$newname" --smbios-serial-number "$serial_new"
    nicline=$(prlctl list "$newname" --info | grep -E '^\s*net[0-9]+' | head -1 | sed 's/^\s*//')
    if [ -z "$nicline" ]; then
        echo -e "${RED}    → NIC検出できずMACスキップ${RESET}"
    else
        nic=$(echo "$nicline" | awk '{print $1}')
        mac_new=$(gen_mac)
        prlctl set "$newname" --device-set "$nic" --mac "$mac_new" >/dev/null 2>&1
        echo -e "${GREEN}    $nic: 新MACアドレス → $mac_new${RESET}"
    fi
done

echo
echo -e "${CYAN}クローン検証(クローン元 vs クローン先) :${RESET}"

printf "%-20s %-36s %-13s %-13s %s\n" "VM名" "UUID" "Serial" "MACアドレス" ""
srcinfo=$(get_vm_info "$srcname")
src_uuid=$(echo "$srcinfo" | cut -d',' -f1)
src_serial=$(echo "$srcinfo" | cut -d',' -f2)
src_mac=$(echo "$srcinfo" | cut -d',' -f3)

printf "%-20s %-36s %-13s %-13s %b→ クローン元%b\n" "$srcname" "$src_uuid" "$src_serial" "$src_mac" "$GREEN" "$RESET"

all_ok=1
for cname in "${clone_names[@]}"; do
    cinfo=$(get_vm_info "$cname")
    cuuid=$(echo "$cinfo" | cut -d',' -f1)
    cserial=$(echo "$cinfo" | cut -d',' -f2)
    cmac=$(echo "$cinfo" | cut -d',' -f3)
    printf "%-20s %-36s %-13s %-13s" "$cname" "$cuuid" "$cserial" "$cmac"
    if [[ "$cuuid" == "$src_uuid" || "$cserial" == "$src_serial" ]]; then
        all_ok=0
        echo -e " ${RED}→ NG${RESET}"
    elif [[ "$cmac" == "$src_mac" ]]; then
        all_ok=0
        echo -e " ${RED}→ NG${RESET}"
    else
        echo -e " ${GREEN}→ OK${RESET}"
    fi
done

if [ $all_ok -eq 1 ]; then
    echo -e "${GREEN}\n==== すべてUUID/Serial/MACが異なります(OK!) ====${RESET}"
else
    echo -e "${RED}\n==== どれか重複があります(NG!) ====${RESET}"
fi

echo
echo -e "${CYAN}スクリプトを削除します。${RESET}"
rm -- "$0"
EOF

chmod +x clone_and_reset_parallels_vm.sh
./clone_and_reset_parallels_vm.sh

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?