WSLでホストのファイルシステムを使用すると非常に速度が低下する。  
かといってWSLのディスクを使用するとどんどん肥大化し縮小させることが難しい。  
そのため、WSLのディスクをできるだけ肥大化しないような手法を考える。

## 1. 別の .vhdx ファイルをデータストレージとして使用する
WSL2 のデフォルトのディスクではなく、別の .vhdx ファイルをデータ専用のストレージとして使うことで、WSL2 のディスク膨張を防ぎます。
### 1.1.  \.vhdx ファイルを作成し、適切なサイズでフォーマットする。
***動的サイズ***
```powershell
New-VHD -Path "C:\path\to\your\disk.vhdx" -SizeBytes vhdxサイズ -Dynamic
```
***固定サイズ***
```
New-VHD -Path "C:\path\to\your\disk.vhdx"-SizeBytes vhdxサイズ -Fixed
```

例:
```
New-VHD -Path "E:\WSL_DISK\work_disk0.vhdx" -SizeBytes 50GB -Dynamic
```

### 1.2. WSL2 上で、この .vhdx ファイルをマウントする。
Windows の PowerShell で .vhdx ファイルをマウントする。  
※`Docker Desktop`を停止していなとできない。
```powershell
wsl --mount "C:\path\to\your\disk.vhdx" --vhd --bare
```

例:
```powershell
wsl --mount "E:\WSL_DISK\work_disk0.vhdx" --vhd --bare
```

### 1.3. WSL2 上で、この .vhdx ファイルをマウントする。
1. \.vhdxのデバイス名を確認
    ```bash
    lsblk
    ```
    例:
    ```
    $ lsblk
    NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    sda    8:0    0 388.6M  1 disk
    sdb    8:16   0     1G  0 disk [SWAP]
    sdc    8:32   0    50G  0 disk
    sdd    8:48   0     1T  0 disk /mnt/wslg/distro
    ```
    上記より、`/dev/sbc`が`.vhdx ファイル`と推測できる。

2. \.vhdxのデバイス名をフォーマット

    .vhdx ファイルがフォーマット済みの場合、次のステップへ
    ```
     $ sudo mkfs.ext4 <デバイス名>
    ```
    例：
    ```
     $ sudo mkfs.ext4 /dev/sdc
    ```
3. マウントポジションの作成
    ```
    $ sudo mkdir -p <マウントポジション>
    ```
    例:
    ```
    $ sudo mkdir -p /mnt/vhdx0
    ```
4. \.vhdxのデバイスをマウント
    ```
    sudo mount <.vhdxのデバイス名> <マウントポジション>
    ```
    例:
    ```
    sudo mount /dev/sdc /mnt/vhdx0
    ```

5. アクセス権限の変更

    使用する方法やユーザに合わせてアクセス権限の変更を行います。  
    例:
    ```
    $ sudo chmod 777 /mnt/vhdx0
    ```

### 1.3. 使用後の処理
1. WSL2 上で、この .vhdx ファイルをアンマウントする。
    ```
    $ sudo umount <マウントポイント>
    ```
    例:
    ```
    $ sudo umount /mnt/vhdx0
    ```

2. ホストで .vhdx ファイルをアンマウントする。
    ```
    wsl --unmount "C:\path\to\your\disk.vhdx"
    ```
    例:
    ```
    wsl --unmount "E:\WSL_DISK\work_disk0.vhdx"
    ```

### 1.4. .vhdx ファイルのメンテナンス
```
New-VHD -Path "C:\path\to\your\disk.vhdx" -SizeBytes 50GB -Dynamic
```
で作成したVHDXファイルは「動的拡張ディスク」となり、ディスク上でのサイズが使用量に応じて増減します。ただし、動的に「縮小」は自動で行われないことがあります。以下に動的VHDXの特性とサイズに関する動作を詳しく説明します。

#### 動的拡張ディスク (Dynamic VHDX) の特性
***サイズの増加について***

「動的拡張ディスク」の場合、最初に指定した 50GB は 最大サイズ を意味します。実際のディスクファイル（.vhdx）のサイズは、内部に保存するデータに応じて 動的に増加 します。  
例えば、最初にファイルシステムを作成した直後のVHDXファイルのサイズは非常に小さく、実際のデータが追加されるとその分だけファイルサイズが増加します。
ディスクに書き込むデータが増えるたびに、VHDXファイルのサイズも増大し、最終的に最大 50GB まで使用される可能性があります。  

***サイズの縮小について***

VHDXファイルは 自動的に縮小しません。ディスク内でデータを削除しても、物理的にVHDXファイルが小さくなることはありません。Windowsファイルシステム（NTFS）などでデータを削除しても、それに伴いVHDXファイルの物理サイズが減少することはないため、ディスクのクリーンアップや圧縮を手動で行う必要があります。
圧縮するためには、まず内部の空き領域をゼロで埋め、その後Optimize-VHDコマンドを使ってVHDXファイルを圧縮します。

例:

```powershell
Mount-VHD -Path "C:\path\to\your\disk.vhdx" -ReadOnly
Optimize-VHD -Path "C:\path\to\your\disk.vhdx" -Mode Full
Dismount-VHD -Path "C:\path\to\your\disk.vhdx"
```
この操作により、未使用領域が圧縮され、VHDXファイルのサイズが縮小されます。

***VHDXファイルのサイズ確認***
VHDXファイルの現在のサイズを確認するには、ファイル自体のプロパティを確認するか、以下のコマンドを使ってPowerShellで確認できます。
```powershell
Get-VHD -Path "C:\path\to\your\disk.vhdx"
```
このコマンドはVHDXの FileSize（実際のファイルサイズ）と Size（仮想ディスクの最大サイズ）を表示します。

---

## Page Navigation

- Canonical URL: https://kznagamori.growi.cloud/公開ページ/開発環境/WSL/WSLのディスク肥大化対策
- Permalink: https://kznagamori.growi.cloud/66fa71effe62eb559b0e45c3
- Parent: [WSL](/66e284bd3ab3bc23670d0828.md)
- Children: 0 total
- Total descendants: 0
- Siblings: 10 total
  - [Docker仮想ディスクの移動](/6707be976f5861a252cc8a5c.md)
  - [Ubunut24.04LTSにDockerをインストールする](/6708abb46bbf594265afe9a9.md)
  - [WSL ディスク領域を管理する方法](/6707c8546f5861a252cc9b6f.md)
  - [WSL2でWebカメラを使う](/6735d69df749c73ab2db2822.md)
  - [WSLTips](/68ef55bd2fe986733f7ff5cb.md)
  - [WSLでWindowsのパスで移動する](/68e8b6c92fe986733f7715bc.md)
  - [WSLのインストール](/66e284da3ab3bc23670d0a2e.md)
  - [WSLの使い方](/66e285603ab3bc23670d0f75.md)
  - [WSLの初期設定と問題対策](/66e2858c3ab3bc23670d1167.md)
  - [WindowsTerminalでWSLを使用する](/66e286173ab3bc23670d158f.md)
- Last updated: 2024-10-01T06:00:05.268Z by kznagamori
- Full page listing (all children regardless of count): https://kznagamori.growi.cloud/_api/v3/page-listing/children?id=66fa71effe62eb559b0e45c3
