【WSL】Ubuntu 24.04環境を一発構築！開発環境の自動セットアップ術

Windows で Linux 環境を手軽に利用できる**WSL（Windows Subsystem for Linux）** は、開発者にとって非常に便利なツールですが、その中でも**Ubuntu**を使用している方も多いのでは無いかと思います。

しかし、**「毎回同じ環境をセットアップするのが面倒…」** と思ったことはありませんか？

そこで今回紹介するのは **WSLのカスタムUbuntu環境を作る方法** となります。

- **WSL のUbuntu 24.04**をカスタマイズする
- **cloud-init（後述） を利用して自動セットアップ**
- **独自のディストリビューション名で管理する**

この方法を使えば、**開発環境のセットアップを一瞬で完了**できます！
`Docker`でもできるけどね🙄

以前は、既存にある**WSL**の既存ディストリビューションを基にイメージを`export`し、更にそのイメージを`import`するという手段でしたが、今回は更に一歩進めて、デフォルト状態の**Ubuntu**から設定ファイルを元にカスタマイズをしていく方法となります。

**参考**


https://uepon.hatenadiary.com/entry/2024/07/16/011624


※ 本記事の内容は、以下の Ubuntu 公式ブログの記事を参考にしています。

**Ubuntu WSL の新しいフォーマットについて**


https://ubuntu.com/blog/ubuntu-wsl-new-format-available?fbclid=IwY2xjawIXY3NleHRuA2FlbQIxMQABHTwUao6MTyY6NmvMvxYASZKXChLSUZKtYP93LtZliIXiG-yS5Gq-vpJGmw_aem_COTFzpdDBnkZqtXnPoPYDw






# `cloud-init` とは？

自分も今回始めて知ったのですが、`cloud-init`は、Linux システムの初期設定を自動化するためのツールです。`cloud-init`自体はクラウド環境や仮想環境で、初回起動時に各種設定を適用できる仕組みとして広く利用されているそうです。

**WSL**も同様に、この機能があるため、`cloud-init`を活用することで、**初回起動時に自動的にパッケージをインストールしたり、設定を適用したりすることが可能になります。**

詳しくは、以下の公式ドキュメントをご参照ください。

**cloud-init 公式ドキュメント**


https://cloud-init.io/


**Ubuntu cloud-init ドキュメント**


https://canonical-cloud-init.readthedocs-hosted.com/en/latest/


# **WSL**のディストリビューションをカスタムするとは？

**WSL**では、**Microsoft Store**から**Ubuntu**をインストールできますが、

**Microsoft StoreからUbuntuをインストールする場合**

![](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ueponx/20250215/20250215132626.png)

**WSL**で全くUbuntuを導入していなかった方であれば、`cloud-init`の設定だけで、**初回起動時に自動的にカスタム環境を構築**できるため、**「環境構築、すぐに開発」**ができます！

また、**Ubuntuの基本rootfs（ルートファイルシステム）**や**既存のWSLのディストリビューションをベース**から独自の環境を作成することも可能**です。

# カスタムUbuntu環境を作る手順

いくつかパターンはあると思いますが、今回は2つ（厳密には3つ）のパターンを考えていきます。【case2-1】、【case2-2】は最初の作業のみことなるものの実質同じ作業となります。

- **【case1】WSLのディストリビューションにUbuntu24.04がない場合**
- **【case2-1】Ubuntuデフォルトの rootfs を取得し、カスタム化、cloud-init を適用する場合**
- **【case2-2】既存の Ubuntu WSLイメージをエクスポートし、cloud-init を適用する場合**

# 【case 1】WSLのディストリビューションにUbuntu24.04がない場合

このcaseは最も簡単です。**WSL**のコマンドで以下を入力して、Ubuntu-24.04などが存在していない状態。**WSL**を常用している人はこの状態はあまりないと思いますが、以下ような場合となります。

```powershell
PS> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped       2
  docker-desktop     Stopped      2
  docker-desktop-data    Stopped         2
```

**WSL**のインストールに関しては、こちらでは記載しないので以下を御覧ください。


https://learn.microsoft.com/ja-jp/windows/wsl/install


## 【case1】(1) cloud-init の設定ファイルを作成

Windows 側の`C:\Users\<YOUR_USER_NAME>\.cloud-init\`に Ubuntu-24.04.user-data (ファイル名)を作成します。（<YOUR_USER_NAME>にはWindowsのユーザネームを入れてください）

**作成例**`C:\Users\<YOUR_USER_NAME>\.cloud-init\Ubuntu-24.04.user-data`

```yaml
#cloud-config
users:
  - name: myuser
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
packages:
  - git
  - vim
  - python3
  - docker.io
  - nodejs
  - neofetch
runcmd:
  - sudo usermod -aG docker myuser
  - sudo systemctl enable docker
```

この設定では以下を行っています。

- ユーザー `myuser` の作成
- ユーザー `myuser`のsudoでのパスワード不要
- Docker, Git, Vim, Node.js, neofetchなどのインストール
- `myuser` を Docker グループに追加
- 日本語ロケールの設定

<span style="color: #ff0000">【注意】 ファイル名の`Ubuntu-24.04.user-data`の名前は変更しないでください。Ubuntu のバージョンに適した名前でないと、WSL のインストール時に cloud-init が適用されない可能性があります。
</span>

## 【case1】(2)Ubuntu-24.04のインストール

設定ファイルを保存できたら、WSLにUbuntu-24.04をインストールします。

```powershell
PS> wsl --install -d Ubuntu-24.04
```

**参考**


https://documentation.ubuntu.com/wsl/en/latest/howto/install-ubuntu-wsl2/


これでインストール後に`cloud-init`の設定が反映されます。デフォルトのユーザ名も`myuser`になっていると思います。（普通にインストールすると初回起動で使用するユーザ名などが尋ねられます。）

試しに`neofetchコマンド`や`dockerコマンド`を実行すると設定が反映されているのがわかると思います。

**WSL**でUbuntuを動作させていない場合にはこの方法が楽です。

---

# 【case 2】すでにWSL内にUbuntu-24.04がある場合

すでに**WSL**を常用している方は`Ubuntu-24.04`のディストリビューションが無いなんてことはないと思います。そういうとき以下の2つ（厳密にはほとんど変わりませんが）の方法があります。

<span style="color: #ff0000">最初のイメージ取得・作成の作業のみ異なります。
</span>

## 【case 2】(1)WSLのカスタムイメージの作成と起動

### 【case 2-1】(1)Ubuntuデフォルトの**rootfs**を取得し、カスタム化する場合

まずはUbuntu 24.04 の**rootfs**を取得します。公式の Ubuntu クラウドイメージから デフォルトの**rootfs**を取得します。サイズは218MBほどあります。

```sh
$ wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64-root.tar.xz -O ubuntu-24.04-rootfs.tar.xz
```

<span style="color: #ff0000">【注意】Ubuntu のバージョンが 24以降でないと、cloud-init の設定が正しく適用されない可能性があります。バージョン22でもうまくいきましたが少し動きがおかしかったです。
</span>

続いて、カスタムディストリビューションを作成・起動を行います。ダウンロードした**rootfs**を**WSL**に登録し、新しいディストリビューションを作成します。

```powershell
PS> mkdir C:\WSL
PS> mkdir C:\WSL\MyUbuntu
PS> wsl --import MyUbuntu C:\WSL\MyUbuntu ubuntu-24.04-rootfs.tar.xz
```
登録したディストリビューションを起動するには、次のコマンドを実行します。

```powershell
PS> wsl -d MyUbuntu
```

これでカスタムのイメージのベースが作成できました。

### 【case 2-2】(1)既存のWSLのUbuntuイメージをエクスポートする場合

使用するベースとなるディストリビューションイメージがある場合にはこちらの作業になります。

以下のコマンドを実行して、既存のWSLイメージをtarファイル（`ubuntu-24.04-custom.tar`）にしておきます。

```PowerShell
PS> wsl --export Ubuntu-24.04 ubuntu-24.04-custom.tar
```

続いて、このイメージからカスタムディストリビューションを作成・起動を行います。以下のコマンドでカスタムイメージを作成します。

```powershell
PS> wsl --import MyUbuntu C:\WSL\MyUbuntu ubuntu-24.04-custom.tar
```

インポート後、登録したディストリビューションを起動するには、次のコマンドを実行します。

```powershell
PS> wsl -d MyUbuntu
```

これでカスタムのイメージのベースが作成できました。

## 【case2（以降は共通作業）】 

以降の作業共通となります。

### 【case 2（共通作業）】(2)cloud-init の設定を適用

カスタムのWSLイメージが起動したら、次のコマンドを実行して`cloud-init`をインストールします。以下のコマンドを実行します。

```sh
$ sudo apt update && sudo apt install cloud-init -y
```

次に、`cloud-init`の設定を`/etc/cloud/cloud.cfg.d/99_custom.cfg`に保存します。以下のようにエディタを開き

```sh
$ sudo nano /etc/cloud/cloud.cfg.d/99_custom.cfg
```

以下の内容で設定を作成します。

**作成例**（`/etc/cloud/cloud.cfg.d/99_custom.cfg`）

```yaml
#cloud-config
users:
  - name: myuser
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
packages:
  - git
  - vim
  - python3
  - docker.io
  - nodejs
  - neofetch
runcmd:
  - sudo usermod -aG docker myuser
  - sudo systemctl enable docker
```

この設定では以下を行っています。

- ユーザー `myuser` の作成
- ユーザー `myuser`のsudoでのパスワード不要
- Docker, Git, Vim, Node.js, neofetchなどのインストール
- `myuser` を Docker グループに追加
- 日本語ロケールの設定

この設定を適用するには、以下のコマンドを実行します。

```sh
$ sudo cloud-init clean
$ sudo cloud-init init
$ sudo cloud-init modules --mode=config
$ sudo cloud-init modules --mode=final
```

これで、既存の WSL 環境に新しくカスタムWSLイメージを作成し、`cloud-init`の設定が適用されます。

試しに`neofetchコマンド`や`dockerコマンド`を実行すると設定が反映されているのがわかると思います。

# **（必須設定）デフォルトユーザーの変更（root から一般ユーザーへ）**

カスタムのWSLディストリビューションを作成すると、デフォルト（これまでの方法）では`root`ユーザーでログインしてしまいます。これを一般ユーザー（例: `myuser`）で起動するようにするには、以下の設定を行います。

```bash
$ sudo nano /etc/wsl.conf
```

`/etc/wsl.conf`に次の内容を追加します。

```txt
[user]
default=myuser
```

変更を保存したら、**WSL**を再起動します。

```powershell
PS> wsl --shutdown
```

これで次回以降、**WSL**を起動した際に、`myuser` ユーザーとしてログインするようになります。

```powershell
PS> wsl -d MyUbuntu
```

# **config内のpackagesの指定方法について**

`cloud-init`の `packages` セクションでは、**apt でインストール可能なパッケージ名を記述**する必要があります。
つまり、通常 `apt install <パッケージ名>` でインストールできるものを記述します。

例えば、`git` や `vim` はそのまま記述できますが、`node` ではなく `nodejs` を記述する必要があります。

**参考になるサイト**

- [Ubuntu Packages Search](https://packages.ubuntu.com/)
- `apt search <パッケージ名>` を実行して確認する

# おわりに

今回は**WSL**の環境構築を`cloud-init`を使用して簡単に行う方法に関して説明しました。この方法で以下のことが簡単にできます。

- **毎回の環境構築を自動化**
- **チームで統一した開発環境を配布**
- **WSLのインストール時間を大幅に短縮**

まあ、`Docker`でも全く同じことはできますけどね😑
大学の研究室などの小さな組織では初手として、こういった組織のベースとなる**WSLイメージ**を配布することから始めてみてもいいかなと思います。

**参考**


https://uepon.hatenadiary.com/entry/2024/07/16/011624