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

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

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

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

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

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

参考

uepon.hatenadiary.com

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

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

ubuntu.com

cloud-init とは?

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

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

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

cloud-init 公式ドキュメント

cloud-init.io

Ubuntu cloud-init ドキュメント

canonical-cloud-init.readthedocs-hosted.com

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

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

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

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を常用している人はこの状態はあまりないと思いますが、以下ような場合となります。

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

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

learn.microsoft.com

【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

#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 グループに追加
  • 日本語ロケールの設定

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

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

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

PS> wsl --install -d Ubuntu-24.04

参考

documentation.ubuntu.com

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

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

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


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

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

最初のイメージ取得・作成の作業のみ異なります。

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

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

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

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

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

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

PS> mkdir C:\WSL
PS> mkdir C:\WSL\MyUbuntu
PS> wsl --import MyUbuntu C:\WSL\MyUbuntu ubuntu-24.04-rootfs.tar.xz

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

PS> wsl -d MyUbuntu

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

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

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

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

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

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

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

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

PS> wsl -d MyUbuntu

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

【case2(以降は共通作業)】

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

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

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

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

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

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

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

作成例/etc/cloud/cloud.cfg.d/99_custom.cfg

#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 グループに追加
  • 日本語ロケールの設定

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

$ 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)で起動するようにするには、以下の設定を行います。

$ sudo nano /etc/wsl.conf

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

[user]
default=myuser

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

PS> wsl --shutdown

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

PS> wsl -d MyUbuntu

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

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

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

参考になるサイト

おわりに

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

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

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

参考

uepon.hatenadiary.com