Hyper-VでUbuntu Coreを利用する方法

## 目次

- [目次](#目次)
- [`Ubuntu Core`とは](#ubuntu-coreとは)
- [圧縮された仮想ディスクを展開・変換するためのツールの導入](#圧縮された仮想ディスクを展開変換するためのツールの導入)
  - [`WSL2`環境のセットアップ](#wsl2環境のセットアップ)
  - [`WSL2`の`Ubuntu`をアップデート](#wsl2のubuntuをアップデート)
  - [圧縮された仮想ディスクを展開・変換するためのツールのインストール](#圧縮された仮想ディスクを展開変換するためのツールのインストール)
- [Ubuntu SSOアカウントの作成](#ubuntu-ssoアカウントの作成)
- [`Ubuntu Core`のイメージをダウンロード](#ubuntu-coreのイメージをダウンロード)
- [`Hyper-V`で利用できるイメージに変換](#hyper-vで利用できるイメージに変換)
- [仮想ディスクの拡張](#仮想ディスクの拡張)
- [`SSH`鍵の作成と登録](#ssh鍵の作成と登録)
- [仮想マシンの作成](#仮想マシンの作成)
- [仮想マシンの設定変更](#仮想マシンの設定変更)
- [Ubuntu Coreのセットアップ](#ubuntu-coreのセットアップ)
- [`Ubuntu Core`に、`SSH`で接続](#ubuntu-coreにsshで接続)
- [Ubuntu Coreのセットアップ後の設定](#ubuntu-coreのセットアップ後の設定)

## `Ubuntu Core`とは

`IoT`向けのセキュアで、軽量な`Ubuntu`です。

パッケージ管理システムとして、旧来の`Ubuntu`で採用されている`apt`/`deb`ではなく、コンテナ化されたパッケージの管理システムである`snap`をメインとして利用します。

また、`OS`のイメージ自体も`snap`によりコンテナ化されており、これによってセキュアな環境を実現しています。

また、コンテナ化されているため、通常の環境とは異なる様々な制限も存在します。

## 圧縮された仮想ディスクを展開・変換するためのツールの導入

`Ubuntu Core`は、`KVM(QEMU)`用の`raw`フォーマットの仮想ディスクを`xz`形式で圧縮したものが公開されています。

そのため、`Hyper-V`で利用するためには、`xz`を展開するツールと、`raw`フォーマットのディスクを`Hyper-V`で利用できる`vhdx`あるいは`vhd`フォーマットに変換するためのツールが必要です。

今回は、そのツールを導入するための環境として、`WSL2`の`Ubuntu`を利用します。

`Windows`ネイティブのツールや、別の`Linux`環境でツールを用意できる場合、そのツールで、上記の手順を代わりに行うことができるため、この手順は不要です。

### `WSL2`環境のセットアップ

既に、`WSL2`の`Ubuntu`環境をセットアップ済みの場合、この手順は不要です。

`WSL2`を有効化しつつ、`Ubuntu`をインストールをします。

もし、別のディストリビューションや、バージョンを指定してインストールしたい場合は、下記のコマンドに、`-d ディストリビューション名(wsl.exe -l -oで出てくる名前)`を付け加えてインストールを実行して下さい。

他のディストリビューションを選択した場合、以降のディストリビューションのアップデートやツールのインストールコマンドが異なるため、読み替えて実行して下さい。

```cmd
wsl --install
```

上記コマンド実行後、`WSL2`に必要な機能が有効化されていなかった場合は、`PC`の再起動が要求されるので、再起動を行います。

その後、`WSL2`の`Ubuntu`の環境上でのユーザー名とパスワードの設定が始まるので、設定を行います。

### `WSL2`の`Ubuntu`をアップデート

インストールした`WSL2`の`Ubuntu`をアップデートします。

`Ubuntu`上で、下記のコマンドを実行します。

パスワードは、`Ubuntu`セットアップ時に設定したものになります。

```bash
sudo apt update

sudo apt -y upgrade

sudo apt -y autoremove

sudo apt -y autoclean
```

### 圧縮された仮想ディスクを展開・変換するためのツールのインストール

前述した通り、`xz`圧縮を展開するためのツールと、`raw`形式の仮想ディスクを`vhdx`形式に変換するためのツールを導入する必要があります。

`xz`圧縮を展開するために、`xz-utils`を、仮想ディスクイメージを`vhdx`フォーマットに変換するために`qemu-utils`をインストールします。

```bash
sudo apt install -y xz-utils qemu-utils
```

## Ubuntu SSOアカウントの作成

下記のリンクから、`Ubuntu SSO`アカウントを作成します。

`Ubuntu Core`では、`Ubuntu SSO`アカウントが必要になります。

`Ubuntu SSO`アカウントに、`ssh`公開鍵を登録し、そのアカウントと紐付けることで、`Ubuntu Core`にログイン可能になるためです。

以下のURLから、アカウントを作成します。

ここで登録した`Username`が、`Ubuntu Core`で利用するユーザー名になります。

画面の指示に従って、アカウントをセットアップします。

[https://login.ubuntu.com/+login](https://login.ubuntu.com/+login)

## `Ubuntu Core`のイメージをダウンロード

以下のサイトから、`Ubuntu Core`のイメージをダウンロードします。

今回は、`Ubuntu Core 22`をダウンロードします。

[https://cdimage.ubuntu.com/ubuntu-core/](https://cdimage.ubuntu.com/ubuntu-core/)

上記のリンクから[`22`](https://cdimage.ubuntu.com/ubuntu-core/22/)を選択し、安定版を利用するため、[`stable`](https://cdimage.ubuntu.com/ubuntu-core/22/stable/)を選択します。

この中から、自動テストが行われている最新の[current](https://cdimage.ubuntu.com/ubuntu-core/22/stable/current/)を選択します。

この中から、`AMD64(x64)`版である[ubuntu-core-22-amd64.img.xz](https://cdimage.ubuntu.com/ubuntu-core/22/stable/current/ubuntu-core-22-amd64.img.xz)のイメージをダウンロードします。

コマンドラインから実行する場合は、以下の様にしてダウンロードできます。

`cmd.exe`あるいは、`pwsh`あるいは`WSL2`から実行します。

`powershell.exe`で実行する場合は、`curl`に`.exe`をつけて実行して下さい。

```cmd
curl -fOL https://cdimage.ubuntu.com/ubuntu-core/22/stable/current/ubuntu-core-22-amd64.img.xz
```

## `Hyper-V`で利用できるイメージに変換

前述の通り、`Ubuntu Core`は`KVM(QEMU)`用の`raw`フォーマットの仮想ディスクを`xz`形式で圧縮したものが公開されています。

まずは、ダウンロードしたイメージが存在する場所に、`cd`コマンド等で移動します。

ダウンロードした`xz`アーカイブを`QEMU`の`raw`フォーマットのディスクイメージに展開します。

```bash
unxz ubuntu-core-22-amd64.img.xz
```

`raw`フォーマットから`vhdx`フォーマットの仮想ディスクファイルに変換します。

```bash
qemu-img convert -f raw -O vhdx ubuntu-core-22-amd64.img ubuntu-core-22-amd64.vhdx
```

## 仮想ディスクの拡張

変換後の仮想ディスクの容量は、約4GBです。

用途によっては、このままでも問題ありませんが、今回は`64GB`にディスクを拡張します。

`Hyper-V`マネージャー->右側のディスクの編集->次へ->拡張する`vhdx`ファイルを選択して次へ->拡張を選択して次へ->現在のサイズよりも大きい`64GB`と入力し、次へ完了で完了します。

コマンドラインで、実行する場合は、管理者権限の`PowerShell`を起動し、ディスクイメージが存在する場所に`cd`コマンド等で移動してから、下記のコマンドを実行します。

```powershell
Resize-VHD .\ubuntu-core-22-amd64.vhdx -SizeBytes 64GB
```

## `SSH`鍵の作成と登録

`SSH`鍵を作成します。

ターミナルを開き、下記のコマンドを実行します。

鍵を保存したいディレクトリが、存在しない場合は、予め`mkdir`コマンド等で作成して下さい。

通常は、ホームディレクトリ(`Windows`環境の場合、`USERPROFILE`環境変数)以下の`.ssh`ディレクトリ内に作成して下さい。

`SSH`鍵の作成は、`Windows`環境で行っても`WSL2`上で行っても構いませんが、`WSL2`と`Hyper-V`仮想マシンはデフォルトの状態では通信をすることができないため、追加手順が必要になります。

```bash
ssh-keygen -t ed25519 -P "" -f 鍵を保存するパス
```

`WSL2`環境で作成した場合、以下のようなコマンドで、鍵の権限を変更しておいて下さい。

```bash
chmod 600 *
```

`Windows`環境では、秘密鍵の権限を、`Administrators`と`SYSTEM`を除き、利用するユーザーのフルコントロールのみ(`Users`及び`Authenticated Users`の権限の削除が必要)にする必要があります。

秘密鍵の右クリックメニュー等から、プロパティを選択し、セキュリティタブに移動します。

詳細設定を選択し、継承の無効化を選択します。

`継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します。`を選択します。

`Users`及び`Authenticated Users`等の不要な権限を削除します。

もし、自身のユーザーのアクセス権限がない場合は、追加を選択し、プリンシパルの選択を選択します。

自身のユーザー名を入力し、`ok`を選択します。

フルコントロールにチェックを入れ、`ok`を選択します。

適用を選択し、okを選択すると設定は完了です。

クリップボードに登録する公開鍵をコピーします。

`cmd.exe`で実行する場合は、`cat`コマンドの代わりに`type`コマンドを利用して下さい。

```bash
cat 指定した鍵パス.pub | clip.exe
```

下記の`URL`にアクセスし、テキストボックスに公開鍵をペーストして、`Import SSH Key`を選択します。

[https://login.ubuntu.com/ssh-keys](https://login.ubuntu.com/ssh-keys)

以上で、公開鍵の登録は完了です。

## 仮想マシンの作成

`Hyper-V`マネージャーを開き、右側にある新規を選択、仮想マシンを選択と進みます。

![CreateVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/5d5e0149-1e0a-1b62-b20a-3d044b180465.png)

仮想マシンの名前を設定し、保存場所は各自の保存場所を選択し、次へを選択します。

![VMName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/01976e12-433c-d47d-65d7-45f4277ac216.png)

**第2世代**を選択し次へ、メモリ容量を設定し次へを選択します。

![2thGen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/d65a369a-2daa-ccfd-18f7-01a0393ca6c6.png)

![Mem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/84973314-dd65-1e75-67da-69993eade0cf.png)

ネットワークの構成画面では、インターネットに接続できるネットワークアダプターが必要です。

`Windows 10`あるいは、`Windows 11`の場合、デフォルトで、`Default Switch`が利用できます。

別途利用したいアダプターがない場合は、これをプルダウンメニューから選択し、次へを選択します。

![Network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/9de04e9a-3dcf-49ca-2922-d7b26b93d149.png)

仮想ハードディスクの選択では、既存のディスクを使用するを選択し、仮想ディスクのパスを設定し次へを選択します。

仮想ディスクは、`WSL2`上ではなく、`Windows`側のファイルシステムに移動させておいて下さい。

インストールオプションでは、`既存の仮想ハードディスクを使用する`を選択し、作成した仮想ディスクを選択し、次へを選択します。

![Disk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/f447aed1-a46d-ff38-d1a5-9fcc2af094ad.png)

完了を選択します。

![Confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/bbb5b346-4b1b-9723-63fa-d1471f55dc13.png)

## 仮想マシンの設定変更

完了を選択すると仮想マシンが作成されますが、このままでは起動しないため、設定を変更します。

作成した仮想マシンを選択し、右側の設定を選択するか、仮想マシンを右クリックして設定を選択します。

ファームウェアでブート順位を変更します。

ハードドライブが最上段にない場合は最上段に移動します。

![Boot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/ed756dd2-de09-064d-0442-efa943cc4a48.png)

次に、セキュリティで、セキュアブートの設定を変更します。

セキュアブートのテンプレートを、`Microsoft Windows`から`Microsoft UEFI 証明機関`に変更します。

その他、環境に応じて、必要な設定を変更し、`適用`を選択し、`OK`を選択し、仮想マシンの設定を閉じます。

![UEFI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/2883f421-11ca-20f1-06e2-7822718bd812.png)

## Ubuntu Coreのセットアップ

上記で、`Ubuntu Core`の仮想マシンの起動が可能になります。

起動して、`Ubuntu Core`のセットアップを開始します。

起動すると、初期起動時の設定が始まります。

しばらくすると、下記のような画面になるので、`Enter`を押して、初期設定を行います。

![Setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/5f490eb3-d3d6-163b-1ccf-03b443cfe56c.png)

ネットワークと`Ubuntu SSO`アカウントのセットアップを開始します。

`[OK]`となっているので、`Enter`を押して続行します。

![StartConfigure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/f8278283-e21d-c994-ab37-f069083c458f.png)

ネットワークの設定を行います。

`DHCP`を利用でき、特別な設定を行わない場合は、そのままで問題ないので、`[Done]`にカーソルを合わせた状態で、`Enter`を押します。

`Default Switch`を選択した場合、`DHCP`しか利用できないため、上記と同じ状態になります。

プライベートスイッチや独自の内部スイッチを利用して、`IPアドレス`の固定を行う場合は、ここで設定を行ってから、次の設定に進みます。

![NetworkConfigure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/2468292b-5ac7-0508-6fc8-681d4886195f.png)

作成した、`Ubuntu SSO`アカウントの`E-mail`を入力し、`[Done]`にカーソルを合わせた状態で、`Enter`を押します。

英語キーボードとなっているため、`@`を入力する場合は、`Shift`+`2`で入力します。

![SSOEmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743928/1937f238-5922-567d-ca85-9e9e36e6136e.png)

その後は、コンソールに仮想マシンの`IP`アドレスが表示され、`Ubuntu SSO`アカウントに設定した`SSH`鍵でログインできるようになります。

セットアップ完了後は、コンソールログインはできないため、`SSH`でログインして操作する必要があります。

## `Ubuntu Core`に、`SSH`で接続

作成した`SSH`鍵で、`Ubuntu Core`にログインします。

もし、`WSL2`上で、鍵を利用できる様にした場合は、デフォルト状態では、`WSL2`と`Hyper-V`仮想マシンで、接続できないため、管理者権限の`PowerShell`下記のようなコマンドを実行します。

`Default Switch`以外を選択した場合は、各自で設定したネットワークアダプター名に変更して下さい。

```powershell
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL)' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
```

ホームディレクトリ(`Windows`環境の場合、`USERPROFILE`環境変数)以下の`.ssh`ディレクトリ内に以下のような`config`ファイルを作成します(ディレクトリが存在しない場合は作成して下さい)。

```bash
Host sshコマンド実行時に指定する名前
    HostName コンソールに表示されているIPアドレス(mdns有効後であればホスト名)
    User コンソールに表示されているユーザー名
    IdentityFile 秘密鍵ファイルへのパス
    Port 22
```

`config`ファイルで設定した名前で、`SSH`接続を行います。

```bash
ssh configで設定した名前
```

## Ubuntu Coreのセットアップ後の設定

`Ubuntu Core`のアップデートを行います。

必要があれば、自動的に再起動されます。

```bash
sudo snap refresh
```

ホスト名を変更します。

```bash
sudo hostnamectl set-hostname 設定したいホスト名
```

ホスト名で、名前解決できる様に`mdns`を利用します。

```bash
sudo snap install avahi
```

ファイアウォールとして、`ufw`をインストールします。

```bash
sudo snap install ufw
```

`ufw`で、`ssh`と`mdns`を許可します。

`ssh`ポートを変更する場合は、通常通り`/etc/ssh/sshd_config`を編集して、編集したポートを`ufw`で許可して下さい。

ただし、`Ubuntu Core`では通常の`Ubuntu`で利用される`nano`は利用できません。

`vim`で編集して下さい。

```bash
sudo ufw allow mdns

sudo ufw allow ssh
```

```bash
sudo ufw enable
```

設定が完了したら、仮想マシンを再起動します。

```bash
sudo reboot
```