VirtulboxからHpyer-vへの仮想ディスクを移行（Ubuntu）

# VirtulboxからHpyer-vへの仮想ディスク移植

## vdi から vhd に変換する

virtualbox で使用している vdi ファイルを Hyper-v で使用できる vhdファイルに変換する  
VBoxManage.exe コマンドを使う  

```
VBoxManage.exe clonemedium disk vm.vdi vm.vhd -format VHD
```

具体的な実行例）  
```
D:\work¥vdi_vhd>"C:\Program Files\Oracle¥VirtualBox¥VBoxManage. exe" clonehd 'vm.vdi vm.vhd -format VHD
```

しかし以下のエラーが発生  

```
VBoxManage. exe: error: Cannot register the hard disk 'D:\work\vdi_vhd¥vm.vdi' {422a0155-3d3a-4afa-ae07-e43111026000} because a hard disk 'D:\work\vdi_vhd\vm.vdi' with UUID 1422a0155-3d3a-4afa-ae07-e4311f026000] already exists 
VBoxManage.exe: error: Details: code E_INVALIDARG (0x80070057). component VirtualBoxWrap, interface IVirtualBox, callee IUnknown

VBoxManage.exe: error: Context: 'OpenMedium (Bstr (pszFilenameOrUuid). raw (), enmDevType, enmAccessMode. fForceNewUuidOnOpen, pMedium. asOut Param ())' at line 191 of file VBoxManageDisk.cpp
```

問題になっているのは以下のエラー  
UUID 1422a0155-3d3a-4afa-ae07-e4311f026000] already exists  
UUID が既に存在する。重複しているのでエラーが出た。  

## UUIDを付けなおす

```
D:\Ywork\vdi_vhd> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -nologo internal commands sethduuid vm.vdi

UUID changed to: 18d48a42-941e-433e-8339-96ff64ed1b85
```

##  vdi から vhd に変換

```
D:\work¥vdi_vhd>"C:\Program Files\Oracle¥VirtualBox¥VBoxManage.exe" clonemedium disk vm.vdi vm.vhd -format VHD

0% 10% 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100%
Clone medium created in format VHD. UUID: 10721ceb-d542-40d2-b958-22c14034afe8
```

vhd ができた  

## 移行したい PC で Hyper-v の環境を作る

vhd を移行 PC に移動する

適当なフォルダに vhd ファイルを格納 (コピーペースト)する  
例）D:\hpyer-v\vm.vhd  

### Hpyer-v をインストール

Windows メニュー (画面左下のウィンドウアイコン)  > Windows 設定 (ギアアイコン) > アプリ > 画面右の 「プログラム と機能」 > 画面左の 「Windows の機能の有効化または無効化」 > Hyper-v チェック入れる > OK  

Hyper-v のインストールが終わるまでしばらく待つ  

PC を再起動する  

これで hyper-v はインストールできてると思う  

## Hpyer-v に Vhd を適用する  
### Hpery-vを起動

Windows メニュー (画面左下のウィンドウアイコン)> Windows 管理ツール (スクロールしていくと下の方にある) > Hyper-V マネージャで Hpyer-v を起動する  

### 新しい仮想マシンとして vhd を登録

Hyper-ｖの「操作」 > 新規 > 仮想マシン > 開始する前に 「次へ」 > 名前: 適当につける 例）test_vm > 第1世代 > 起動メモ リ: 4096MB > 接続 Default Switch > 仮想ハードディスクの接続 既存の仮想ハードディスクを使用する 場所: D:\hpyer-v\vm.vhd > 完了  
※ vm.bhd は先ほど作成したファイル

## 作成した仮想マシン (vhd) に接続する

### 仮想マシンを起動する

仮想マシンの欄に名前: でつけた仮想マシン名 test_vm が表示されているので選択する > 右クリック> 起動  

自動チェックポイント検出  
前の自動チェックポイント test_vm 2023/11/08-14:44:24 にもどしますか? または、 この仮想マシンの最後の状態 1601/01/01 9:00:00 から続行しますか?  
「戻す」をクリック。  
しかし、戻らないという旨のエラーがでたので。  

### チェックポイントを作成する
仮想マシンの欄に名前: でつけた仮想マシン名が表示されているので選択する > 右クリック> チェックポイント作成 ⇨　OK  

### 起動する
仮想マシンの欄に名前: test_vm を選択する > 右クリック > 起動　⇨　OK  

### 接続する
仮想マシンの欄に名前: test_vm を選択する > 右クリック > 接続  
⇨　ログイン画面が見れると思う。

### ログイン後メッセージが。。

```
VBoxClient: the virtualbox kernel service is not running.
```
VirtualBox で使用していた際に Guest Additions のインストールしたため、そのプログラム VBoxClient が残っているので削除する  
削除するには、Guest Additions を使いたいので Guest Additions の iso を入手する。バージョンがあるので注意。  

Geust Additons のバージョン確認  
7.0.20 と確認できた。  
```
$ ls -ld /opt/VBox*
drwxr-xr-x 8 root root 4096  8月 26 17:39 /opt/VBoxGuestAdditions-7.0.20
```

iso ファイルのダウンロード  
```
wget https://download.virtualbox.org/virtualbox/7.0.2/VBoxGuestAdditions_7.0.2.iso
```

iso ファイルのマウント  
```
$ sudo mount -t iso9660 -o loop ~/VBoxGuestAdditions_7.0.2.iso /mnt

mount: /mnt: WARNING: source write-protected, mounted read-only.
```

マウントできたか確認
```
$ ls /mnt
AUTORUN.INF  VBoxDarwinAdditions.pkg            VBoxWindowsAdditions-amd64.exe  cert
NT3x         VBoxDarwinAdditionsUninstall.tool  VBoxWindowsAdditions-x86.exe    runasroot.sh
OS2          VBoxLinuxAdditions.run             VBoxWindowsAdditions.exe        windows11-bypass.reg
TRANS.TBL    VBoxSolarisAdditions.pkg           autorun.sh

```

アンインストールの実行  
```
$ cd /mnt
$ sudo sh VBoxLinuxAdditions.run uninstall
Verifying archive integrity...  100%   MD5 checksums are OK. All good.
Uncompressing VirtualBox 7.0.2 Guest Additions for Linux  100%  
VirtualBox Guest Additions installer
Removing installed version 7.0.20 of VirtualBox Guest Additions...
```

アンインストールされたか確認  
VBoxGuestAdditions-7.0.20 ディレクトリがなくなってればOK  
```
$ ls /opt
```

完了