DHCPはクソ

# 背景
某賃貸に引っ越したところ、全戸でDHCPが一つだった。

つまり、**IPアドレスを固定することができない。**

vmにsshで接続する場合```ip a```や```ipconfig```コマンドを使用し、IPアドレスを確認する必要がある。

この手間を解決するために、Shell Scriptを作成した。

作成にあたって、vmwareコマンド、vmのディレクトリ構造について確認しておく

# vmrunコマンド

VMを操作可能なコマンドを以下の表に示す。

| コマンド例                                   | 説明                           |
| --------------------------------------- | ---------------------------- |
| `vmrun start <path-to-vmx>`             | 仮想マシンを起動                     |
| `vmrun stop <path-to-vmx>`              | 仮想マシンを停止（強制終了は `hard` オプション） |
| `vmrun suspend <path-to-vmx>`           | 仮想マシンを一時停止                   |
| `vmrun reset <path-to-vmx>`             | 仮想マシンをリセット                   |
| `vmrun list`                            | 起動中の仮想マシン一覧を表示               |
| `vmrun getGuestIPAddress <path-to-vmx>` | ゲストOSのIPアドレスを取得              |
| `vmrun -T ws <command>`                 | VMware Workstation用          |
| `vmrun -T fusion <command>`             | VMware Fusion用               |

vmrun を使用することで、VMの基本的な操作を行うことができる。

# VMのディレクトリ構造
vmwareのディレクトリ構造は基本的に以下のようになっている。
```
~/Virtual Machines.localized/
├──Rocky Linux 64 ビット ARM.vmwarevm/
│   ├── Rocky Linux 64 ビット ARM.vmx         ← 仮想マシン設定ファイル（最重要）
│   ├── Rocky Linux 64 ビット ARM.vmsd        ← スナップショット管理ファイル
│   ├── Rocky Linux 64 ビット ARM.vmxf        ← チームや共有設定（使わないことも）
│   ├── Rocky Linux 64 ビット ARM.nvram       ← BIOS設定情報（NVRAM）
│   ├── *.vmdk                                ← 仮想ディスクファイル（複数に分割される）
│   ├── vmware.log                            ← ログファイル（複数世代あることも）
│   ├── *.lck/                                ← ロック情報（起動中に一時的に作成される）
│   └── *.plist                                ← macOSの情報用（Fusionの場合）
│
├── Ubuntu 64 ビット ARM.vmwarevm/
│   ├── Ubuntu 64 ビット ARM.vmx
│   ├── Ubuntu 64 ビット ARM.vmsd
│   ├── Ubuntu 64 ビット ARM.vmxf
│   ├── Ubuntu 64 ビット ARM.nvram
│   ├── Ubuntu ディスク-s001.vmdk ～ s00N.vmdk
│   ├── vmware.log
│   └── その他関連ファイル
│
├── CentOS 7.vmwarevm/
│   ├── CentOS 7.vmx
│   ├── CentOS 7.vmsd
│   ├── CentOS 7.vmxf
│   ├── CentOS 7.nvram
│   ├── CentOS ディスク-s001.vmdk ～ s00N.vmdk
│   ├── vmware.log
│   └── その他関連ファイル
```

```vmrun```コマンドで必要となる.vmxファイルのpathさえ分かれば、IPアドレスを確認することができる。

# ShellScript
作成したShellScriptを以下に示す。

```zsh
#!/bin/zsh

# Set the base directory where VMware virtual machines are stored
VM_BASE_DIR="$HOME/Virtual Machines.localized"

# Find all .vmx files under the base directory and store them in an array
vmx_files=()
while IFS= read -r line; do
  vmx_files+=("$line")
done < <(find "$VM_BASE_DIR" -name '*.vmx')

# Exit if no .vmx files are found
if (( ${#vmx_files[@]} == 0 )); then
  echo "⚠️ No .vmx files found. VM_BASE_DIR: $VM_BASE_DIR"
  exit 1
fi

# If multiple .vmx files are found, prompt user to choose one
if (( ${#vmx_files[@]} > 1 )); then
  echo "Select a VM to connect:"
  select vmx_file in "${vmx_files[@]}"; do
    [[ -n "$vmx_file" ]] && break
  done
else
  vmx_file="${vmx_files[1]}"
fi

echo "Selected VMX file: $vmx_file"

# Use vmrun to get the guest VM's IP address
IP=$(vmrun getGuestIPAddress "$vmx_file" 2>/dev/null)

# Exit if IP address could not be retrieved
if [[ -z "$IP" ]]; then
  echo "⚠️ Could not retrieve IP address. The VM may not be running."
  exit 1
fi

echo "🎯 IP address of VM: $IP"

# Connect to the VM via SSH (replace 'root' if needed)
ssh root@"$IP"
```

```alias sshvm```として.zshrcに追記し使用している。

# まとめ
dockerでも良いのでは？と思われる方もいらっしゃると思うので、containerとVMの違いについて機会があればまとめたい。