Windows で Linux 環境を手軽に利用できるWSL(Windows Subsystem for Linux) は、開発者にとって非常に便利なツールですが、その中でもUbuntuを使用している方も多いのでは無いかと思います。
しかし、「毎回同じ環境をセットアップするのが面倒…」 と思ったことはありませんか?
そこで今回紹介するのは WSLのカスタムUbuntu環境を作る方法 となります。
- WSL のUbuntu 24.04をカスタマイズする
- cloud-init(後述) を利用して自動セットアップ
- 独自のディストリビューション名で管理する
この方法を使えば、開発環境のセットアップを一瞬で完了できます!
Docker
でもできるけどね🙄
以前は、既存にあるWSLの既存ディストリビューションを基にイメージをexport
し、更にそのイメージをimport
するという手段でしたが、今回は更に一歩進めて、デフォルト状態のUbuntuから設定ファイルを元にカスタマイズをしていく方法となります。
参考
※ 本記事の内容は、以下の Ubuntu 公式ブログの記事を参考にしています。
Ubuntu WSL の新しいフォーマットについて
cloud-init
とは?
自分も今回始めて知ったのですが、cloud-init
は、Linux システムの初期設定を自動化するためのツールです。cloud-init
自体はクラウド環境や仮想環境で、初回起動時に各種設定を適用できる仕組みとして広く利用されているそうです。
WSLも同様に、この機能があるため、cloud-init
を活用することで、初回起動時に自動的にパッケージをインストールしたり、設定を適用したりすることが可能になります。
詳しくは、以下の公式ドキュメントをご参照ください。
cloud-init 公式ドキュメント
Ubuntu cloud-init ドキュメント
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のインストールに関しては、こちらでは記載しないので以下を御覧ください。
【case1】(1) cloud-init の設定ファイルを作成
Windows 側のC:\Users\<YOUR_USER_NAME>\.cloud-init\
に Ubuntu-24.04.user-data (ファイル名)を作成します。(には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
参考
これでインストール後にcloud-init
の設定が反映されます。デフォルトのユーザ名もmyuser
になっていると思います。(普通にインストールすると初回起動で使用するユーザ名などが尋ねられます。)
試しにneofetchコマンド
やdockerコマンド
を実行すると設定が反映されているのがわかると思います。
WSLでUbuntuを動作させていない場合にはこの方法が楽です。
【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でもうまくいきましたが少し動きがおかしかったです。
続いて、カスタムディストリビューションを作成・起動を行います。ダウンロードしたrootfsをWSLに登録し、新しいディストリビューションを作成します。
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-init
の packages
セクションでは、apt でインストール可能なパッケージ名を記述する必要があります。
つまり、通常 apt install <パッケージ名>
でインストールできるものを記述します。
例えば、git
や vim
はそのまま記述できますが、node
ではなく nodejs
を記述する必要があります。
参考になるサイト
- Ubuntu Packages Search
-
apt search <パッケージ名>
を実行して確認する
おわりに
今回はWSLの環境構築をcloud-init
を使用して簡単に行う方法に関して説明しました。この方法で以下のことが簡単にできます。
- 毎回の環境構築を自動化
- チームで統一した開発環境を配布
- WSLのインストール時間を大幅に短縮
まあ、Docker
でも全く同じことはできますけどね😑
大学の研究室などの小さな組織では初手として、こういった組織のベースとなるWSLイメージを配布することから始めてみてもいいかなと思います。
参考