VirtualBoxで特定のゲストに指定のIPアドレスを割り当てる

## はじめに

VirtualBoxの内臓DHCPサーバーを使って、VM名またはMACアドレスを指定して払い出すIPアドレスを指定することができる。

- アダプタの種類は「ホストオンリーアダプター」
- Vagrantを使わず自動化する時に役立つかもしれない。GuestAdditionsも不要。
- MACアドレスとVM名(UUID)がセットで記録されるため、汎用性があるかは謎。

### 環境

- VirtualBox 7.1.4
- ホストOSはWindowsとおそらくLinuxのみ、macOSは不可
- ゲストOSはDHCPが有効であればなんでもOK

## 設定方法

`dhcpserver`サブコマンドに`fixed-address`を指定する。

```powershell
# 指定のIPアドレスを割り当てる
VBoxManage dhcpserver modify --network "(アダプタ名)" --vm=(VM名) --fixed-address=(設定したいIPアドレス)
```

> **--fixed-address=address**
> Fixed address assignment for a --vm or --mac-address configuration scope. Any empty address turns it back to dynamic address assignment.
[VBoxManage dhcpserver](https://www.virtualbox.org/manual/topics/vboxmanage.html#vboxmanage-dhcpserver)

![Pasted image 20241228175950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/1300e92e-ee3c-d8e5-fc70-17d1f1e91c58.png)

次のファイルに設定が反映される。
```
(UserHome)/.VirtualBox/VirtualBox.xml
(UserHome)/.VirtualBox/(アダプタ名).config
```

解除したい場合は`fixed-address`を空にして実行する。

### トラブルシューティング

#### 仮想マシンが起動しなくなった

```
Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND).
```

ホストオンリーアダプタのプロパティを開いて「VirtualBox NDIS6 Bridged Networking Driver」を**オフにしてアダプタを無効**->**オンにしてアダプタを有効**にしたら直った。
![Pasted image 20241228184118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/7a870220-811a-9fe9-7bdf-80d89dd03c71.png)

参考)
[VirtualBox で Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' が出た時の対処 #VirtualBox - Qiita](https://qiita.com/0xC0FFEE/items/ae80a7d767144c2e1992)

#### 指定したIPが割り当てられない

fixed-addressを設定する前に、既に一度IPが割り当てられているのかもしれない。
`(UserHome)/.VirtualBox/(アダプタ名)-Dhcpd.leases`を確認してIPが割り当てられていたら、該当箇所（Lease mac=~)を削除してdhcpサーバーを再起動する。

```PowerShell
# DHCPサーバーを再起動する
VBoxManager dhcpserver restart --network "(アダプタ名)"
```

（参考:アダプタ名を調べる方法）
```PowerSHell
VBoxManager list dhcpservers
```

# やりたかった本当のこと

## 事の始まり

「Apple SiliconなMacで手軽にVirtualBoxの仮想マシンを作っては壊しをしたい。」
-> とりあえず、Vagrantを使いたい。

2024年9月にVirtualBoxがAppleSiliconに対応したVirtualBox7.1をリリース、2024年11月にVagrantがVirtualBox7.1に対応したが[^1]、まだboxが全然無い。VirtualBoxがVMイメージをエクスポートできない影響なのかもしれない。[^2][^3]
[^1]: [vagrant/CHANGELOG.md at v2.4.3 · hashicorp/vagrant](https://github.com/hashicorp/vagrant/blob/v2.4.3/CHANGELOG.md)  > provider/virtualbox: Add support for VirtualBox 7.1 [GH-13513]
[^2]: [Box CentOS9 for VirtualBox with ARM architecture · Issue #1582 · chef/bento](https://github.com/chef/bento/issues/1582)
[^3]: ちなみにエクスポートしようとすると、メモリリークするらしくクラッシュする（した。）

せめてIPだけでもホスト側から操作して、SSHで接続さえできれば・・・
->**どうやらVirtualBoxのDHCPを操作して指定のIPを配布できるらしい。**

## 結論

（おそらく）「ホストオンリーアダプタ」でしか使用できない機能らしい[^4]。最近のmacOSは「ホストオンリーアダプタ」をサポートしていないため実現できなかった。「ホストオンリーアダプタ」は互換性のためだけに残っているだけで利用できないとのこと。
[^4]: 逆にWindowsは「ホストオンリーネットワーク」が無い。

> Hosts running recent macOS versions do not support host-only adapters. 

>On macOS hosts, choose the **Host-Only Network** option when configuring a network adapter. The **Host-Only Adapter** option is provided for legacy support.

[Virtual Networking](https://www.virtualbox.org/manual/topics/networkingdetails.html#networkingdetails)

## 「ホストオンリーアダプタ」と「ホストオンリーネットワーク」

「ホスト<->ゲスト」や「ゲスト間」の通信可否は同じなので、使う分には違いを意識することはないのかもしれない。

|            | ホストオンリーアダプタ              | ホストオンリーネットワーク |
| ---------- | ------------------------ | ------------- |
| ホスト<->ゲスト  | 可能                       | 可能            |
| ゲスト<->ゲスト  | 可能                       | 可能            |
| DHCPサーバー   | オフにできる                   | オフにできない       |
| DHCPサーバーIP | ホストと別                    | ホストと同じ        |
| 設定コマンド     | dhcpserver<br>hostonlyif | hostonlynet   |

「ホストオンリーネットワーク」のDHCPサーバーに指定のIPを配布する設定が調べた限り無さそう。
[VBoxManage hostonlynet](https://www.virtualbox.org/manual/topics/vboxmanage.html#vboxmanage-hostonlynet)

GUI側もWindows版と異なり、DHCPサーバーという項目自体がない。
![Pasted image 20241228195629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/d9012629-c8bd-87bf-754f-fe6282bfbad2.png)

macOSのCLIからDHCPサーバー一覧を見ることはでき、Windows版と同じ設定がされてはいることが確認できる。(特にどこかに反映されるわけではない模様。)
![Pasted image 20241228194917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/a9b0652d-ab35-b3bf-3aaf-f26339a4983a.png)

## おわりに

VMwareが無償になったので、Vagrant + VMwareを使うのが一番簡単なのかもしれない。