WindowsのHyper-VにUbuntu乗せてVSCodeだけでなんとかしたい

# Hyper-VとUbuntuとVSCode

## Hyper-Vの有効化

- 左下のWindowsマーク
- 設定
- システム
- オプション機能
- Windowsのその他の機能
- Hyper-V に ☑
- OK

## Ubuntuのインストールイメージをダウンロード

公式からダウンロード

[https://jp.ubuntu.com/download](https://jp.ubuntu.com/download)

今回は 24.04.01 LTS
(開発に使うなら長期安定板のLTSのほうがいいと思う)

## VMの作成

### VMそのものの作成

- 左下のWindowsマーク
- 検索窓っぽいところに Hyper-V マネージャー と入力
- Hyper-V マネージャーを起動
- 画面右ペインの上のほうにある「操作」
- 新規
- 仮想マシン
  - 開始する前に
    - 次へ
  - 名前と場所の指定
    - なんか適当に名前を付ける
    - 次へ
  - 世代の指定
    - 第2世代
    - 次へ
  - メモリの割り当て
    - デフォルトでOK
      - あんまり派手に使わないなら2048MBとかでも大丈夫
      - 最低1024MB [https://ubuntu.com/server/docs/system-requirements](https://ubuntu.com/server/docs/system-requirements)
    - 次へ
  - ネットワークの構成
    - 接続 : 接続しない
      - 後で構成するのでここではつながない
    - 次へ
  - 仮想ハードディスクの接続
    - マシンの空き容量と相談して決める
      - 最低5GB/できれば25GB [https://ubuntu.com/server/docs/system-requirements](https://ubuntu.com/server/docs/system-requirements)
    - 次へ
  - インストールオプション
    - 後でオペレーティングシステムをインストールする
    - 次へ
  - 構成の確認
    - 完了

### NATの構築

開発用のマシンだからVMから外へはアクセスしたいんだけど外からVMに自由に入られたら困るんだよなー、という感じなのでNATを構成
手順が複雑なので公式を参照

[https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network](https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network)

仮想スイッチ「puipui」を作る
```
New-VMSwitch -SwitchName "puipui" -SwitchType Internal
```

puipuiを探す
```
Get-NetAdapter
```

puipui(のデフォルトゲートウェイ)に固定IPを割り当てる
```
New-NetIPAddress -IPAddress 192.168.32.1 -PrefixLength 24 -InterfaceIndex (puipuiのifIndex)
```

NATを構成する
```
New-NetNat -Name puipuiNAT -InternalIPInterfaceAddressPrefix 192.168.32.0/24
```

設定したアドレスレンジ(192.168.32.0/24)はOSインストール時に使うのでどっかに記録しておく

※ NATはあくまでネットワークを区切ってるだけでセキュリティ機構では無いので母機に侵入されるとVMにも入られる
(が、母機が開発機なのでここに入られたらどっちにせよ終わりという思想で進める)

### VMの設定変更

- Hyper-Vマネージャーに戻る
- 作成したVMを選択
- 右ペインの下のほうにある「設定」
  - セキュリティ
    - セキュアブート
      - Microsoft UEFI 証明書
    - 適用
  - SCSIコントローラー
    - DVDドライブ
      - 追加
    - イメージファイル
      - ダウンロードしたUbuntuのISOイメージ
    - 適用
  - ネットワークアダプター
    - さっき作ったNATアダプタ
  - 適用
  - 一回上のほうにある ファームウェア に戻る
    - ブート順
      - DVDドライブを一番上に
  - 適用

### Ubuntuのインストール

Hyper-Vマネージャーで作成したVMに「接続」して「起動」する

- Try or Install Ubuntu Server
- Language
  - English
- Keyboard
  - Layout
    - Japanese
  - Variant
    - Japanese
- Type of Install
  - Ubuntu Server
- Network
  - eth0 eth -
    - Edit IPv4
      - IPv4 Method : Manual
        - Subnet
          - 192.168.32.0/24
        - Address
          - 192.168.32.32
        - Gateway
          - 192.168.32.1
        - Name Server
          - (ISP指定のDNSとか会社指定のDNSとか)
        - Save
- Proxy
  - (繋いでるネットワークで指定がある場合とかは設定する、そうでない場合は空欄で)
- Ubuntu Archive mirror
  - (裏でなんかやってるので終わるまでちょっと待ってあげる)
- Install update available
  - (新しいのあるよ！って言ってくるけど後でアップデートかけるからここではパス)
  - Continue without upgrading
- Storage configration
  - (必要がなければ特に変更なしで)
  - (次の画面も確認だけなので変更なしで)
- Profile configration
  - Your name
    - (名前、らしい。何に使うのかはよくわからないが)
  - Your server name
    - サーバーのホスト名
  - username
    - ユーザーID
  - password
    - パスワード
  - confirm
    - もう一回パスワード
- Ubuntu Pro
  - 有償サポートライセンスの有無だと思う
  - 持ってなければSkip nowで
- SSH
  - [X] Install OpenSSH server
- Feature
  - もし入れたいのがあればここで入れといてもOK
    - 後で入れれるから焦らなくて大丈夫
- reboot now
- [FAILED]  Failed unmounting cdrom.mount - /cdrom.
  - 赤文字で出てくるけど慌てずにエンターキーを押す
- login:
  - 初回起動時にSSH関連の表示がかぶってることがあるけどその場合は一回エンターキーを押す
- Password
- シャットダウンする
```
sudo poweroff
```

### VMからDVDドライブを外す

- Hyper-Vマネージャーに戻る
- VMの設定を開く
- SCSIコントローラーの下にあるDVDドライブを選択
  - 削除
  - 適用

### VMを起動する

- Hyper-VマネージャーからVMを起動
  - ここからは「接続」を使わなくてOK

## Ubuntuの設定

### VSCodeの準備

- VSCodeをまだインストールしてない人はここでインストール
  - [https://code.visualstudio.com/download](https://code.visualstudio.com/download)
- VSCodeを開いて左ペインのブロックが4つ組み合わさったみたいなアイコンを選択
- 検索窓に remote development と入力
  - 提供元がMicrosoftになっているものをインストール

### VSCodeでVMに接続

- 左下の青い >< みたいなアイコンをクリック
- ホストに接続する... Remote-SSH
  - +新規SSHホストを追加する
    - (ユーザーID)@(VMのIPアドレス)
  - 構成するSSHファイルを選択する
    - いくつか出てくるけど好きなのを選ぶ
  - 設定が保存されて元の画面に戻る
- ホストに接続する... Remote-SSH
  - VMのIPアドレスが出てくるはずなのでそれを選ぶ
  - 新しいVSCodeが立ち上がってくる
  - Select Platform
    - Linux
  - フィンガープリント
    - 続行
  - パスワード
    - パスワードを入力
- 接続に成功したら >< が >< SSH:192.168.32.32 のような感じに変わる

### VSCode側の準備

- VSCodeでVMに接続した状態でVSCodeの左側のファイルのアイコンを選択
  - フォルダーを開く
    - /home/(ユーザーID)
    - OSの種類
      - Linux
    - パスワード
      - パスワードを入力
    - このフォルダー内のファイルの作成者を信頼しますか？
      - はい
- ターミナルを開く
  - VSCodeのメニュー
    - 表示
      - ターミナル

### Ubuntuのアップデート

VSCodeの画面下側にターミナルが開いているはずなのでそこで入力する

```
sudo apt update
sudo apt upgrade
```

ほっとくとそのうちアップデートが終わるので気長に待つ

### SSH Keyの作成

ssh-keygenでSSH Keyペアを作成します

```
ssh-keygen -t ed25519
```

色々聞かれるけどデフォルトのままでいいです

```
Enter file in which to save the key (/home/(user_id)/.ssh/id_ed25519): <- そのままエンター 
Enter passphrase (empty for no passphrase): <- ここもそのままエンター
Enter same passphrase again: <- ふたたびエンター
```

### SSH秘密鍵のダウンロード

- 左のファイルエクスプローラーから.sshを開く
- id_ed25519を右クリック
  - ダウンロード
    - たぶんデフォルトではWindowsにログインしているユーザーのユーザーディレクトリが開いているはず
    - 違ったら頑張ってホームディレクトリに行く
      - C:\Users\(ユーザー名) とかのはず
  - .sshフォルダを開く
  - わかりやすいファイル名を付けて保存する
    - e.g.) id_ed25519_VM

### SSH公開鍵をVM側で登録

以下ターミナルで

```
cd ~/.ssh
cat id_ed25519.pub >> authorized_keys
```

### VM側のSSH公開鍵認証を有効にする

```
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
```

たぶんデフォルトではこんな感じ
```
PasswordAuthentication yes
```

設定追加後
```
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
```

書き込み終わったらCtrl-O, エンター, Ctrl-Xの順で上書き保存

```
sudo systemctl reload sshd
```

ここまで進んだら一回SSH接続を切っておく
- 画面右下の>< SSH:192.168.32.32みたいなのをクリック
- 一番下にあるSSHを切断

### VSCode側に秘密鍵を登録する

- 左下の青い >< みたいなアイコンをクリック
- ホストに接続する... Remote-SSH
  - SSHホストを構成する
    - 初めに設定した構成ファイルを選ぶ

- こんな感じになってるはず
```
Host 192.168.32.32
  HostName 192.168.32.32
  User poteto
```

- 設定を追加
```
Host c
  HostName 192.168.32.32
  User poteto
  PreferredAuthentications publickey
  IdentityFile C:\Users\potet\.ssh\id_ed25519_VM
```

- 左下の青い >< みたいなアイコンをクリック
- ホストに接続する... Remote-SSH
  - 構成したホストを選択して接続
  - パスワードを聞かれずにログイン出来たら完成