「mmdebstrap」でUbuntuをカスタマイズして、オリジナルのWSLディストリビューションを作ろう

2025年4月15日(火)
水野 源
第11回の今回は、「mmdebstrap」を使ってUbuntuをカスタマイズし、独自のWSLディストリビューションを作成する方法を解説します。

はじめに

どのようなOSであれ、インストール直後の状態で仕事をすることはできないでしょう。必要に応じて様々なミドルウェアやアプリケーションをインストールし、環境に固有の設定も行う必要があります。個人用のデスクトップはもちろん、開発環境であればなおさらです。

そこで本連載では、Ubuntuへのパッケージのインストール方法カスタマイズ方法設定ファイルの管理方法などを紹介してきました。要件に合わせてUbuntuをカスタマイズし、開発環境として仕立て上げる方法が、なんとなく理解できたのではないでしょうか。

春と言えば異動や新入社員の季節です。そしてチームに配属された新人が最初にやることは、環境の立ち上げでしょう。しかしLinuxの操作に慣れていない人が開発環境の立ち上げに手こずって数日を浪費してしまう、というようなこともありがちです。また、滞りなく操作ができたとしても、全員が同じ作業を個別に行うのは無駄ですし、同じパッケージを各自がダウンロードするのもエコではありません。

そこで今回は、自社の要件に合わせてあらかじめカスタマイズされた、オリジナルのWSLディストリビューションの作成方法を紹介します。過去に「Packer」でカスタマイズした仮想マシンのイメージを作り、「Vagrant」と「VirtualBox」を使って開発環境を立ち上げた経験のある方もいるのではないでしょうか。それと同等のことを、WSLでやってしまおうというわけです。

WSLのカスタムディストリビューションとは

従来のWSLディストリビューションは「APPX」という形式で配布されていました。ところが、この形式は作成が非常に面倒くさいという問題があります。また、WSLディストリビューションは原則的にMicrosoft Store経由で配布する必要があり*1、これもハードルを上げる一因となっていました。

*1: エクスポート/インポートを行うことで、この制約を回避すること自体は可能ですが「公式な配布手段」としては裏技めいています。

ところが、2024年11月にリリースされたWSLのバージョン2.4.4以降では、Linuxのルートファイルシステムにいくつかのメタデータファイルを追加し、tar形式でアーカイブするだけでWSLのディストリビューションを作成できるようになりました。また、作成したアーカイブの拡張子を「wsl」に変更しておけば、エクスプローラー上でダブルクリックするだけでインストールすることも可能になりました。

例えば、カスタマイズしたUbuntuの環境をアーカイブし、社内のファイルサーバーなどに配置しておけば、セットアップ済みのWSL環境を簡単に配布展開できるというわけです。

Ubuntuのルートファイルシステムを構築する

本記事では、WSLの標準ディストリビューションである「Ubuntu」をベースにカスタマイズを行っていきます。そのため、まずは「素の」Ubuntuの「ルートファイルシステム」を作らなくてはなりません。

ルートファイルシステムとは、Linuxのディレクトリツリーの頂点である「/」にマウントされるファイルシステムのことです。ルートファイルシステムには、システムが起動するために必要なバイナリ、ライブラリ、設定等のファイル一式が含まれています。具体的には「/bin」ディレクトリとその中の実行コマンドだったり、「/etc」ディレクトリとその中の設定ファイルだったりなどです。

Ubuntuには、ルートファイルシステムを構築するためのツールがいくつか用意されています*2。その中でも一番有名なのが「debootstrap」です。debootstrapは何もない状態からクリーンなDebian/Ubuntuのルートファイルシステムを構築するためのツールとして、広く普及しています。

*2: これらのツールはUbuntuのオリジナルツールではなく、Ubuntuの派生元となったDebian GNU/Linux譲りのものです。

しかし、今回はdebootstrapではなく、その代替ツールである「mmdebstrap」を採用しました。mmdebstrapはdebootstrapと異なり、内部的にAPTを利用してルートファイルシステムを構築します。そのためdebootstrapよりも高速で、また複数のミラーリポジトリにも対応しており、PPAをはじめとする標準外のリポジトリを追加することもできます。カスタマイズした開発環境を構築しようとするとPPAのような外部リポジトリが必要になることもあるでしょう。そうした用途を考慮して「mmdebstrapの方が向いている」と判断したためです。

それでは、実際にカスタマイズ作業を行っていきましょう。本記事では、このカスタマイズ作業もWSL上のUbuntuを使って行っています。

  1. まず、Ubuntuに以下のコマンドでmmdebstrapをインストールしてください。
    $ sudo apt install -U -y mmdebstrap
  2. 以下のコマンドで、作業用のディレクトリを作成しておきましょう。mmdebstrapはルートファイルシステムをサブディレクトリ内に作成するため、この作業自体は必須ではありませんが、1つディレクトリを掘っておいた方が後片付けがしやすい等のメリットがあるためです。
    $ mkdir ~/work && cd ~/work
  3. 続いて、mmdebstrapコマンドを実行します。
    $ sudo mmdebstrap \
      --components=main,restricted,universe,multiverse \
      --include=git,nginx \
      noble \
      noble-rootfs \
      http://jp.archive.ubuntu.com/ubuntu
    「--components」オプションには、利用するUbuntuリポジトリのコンポーネントをスペースもしくはカンマ区切りで列挙します。Ubuntuのリポジトリのコンポーネントについては第4回を参照してください。ここでは4つのコンポーネントをすべて使用する設定としています。

    「--include」オプションには、ルートファイルシステムに追加するパッケージをスペースもしくはカンマ区切りで列挙します。ここではパッケージが追加されていることが分かりやすいよう、例としてgitパッケージとnginx Webサーバーのパッケージを指定しています。実際は、カスタマイズしたい内容に合わせて必要なパッケージを列挙してください。

    Ubuntuのバージョンを指定します。ここでは「noble」と指定しているため、Ubuntu 24.04 LTSのルートファイルシステムが構築されます。慣れないと少し分かりづらいですが、Ubuntuではリリースごとに頭韻を踏んだ英単語で「形容詞+動物名」というコードネームをアルファベット順に付けるという慣習があります。このうち、形容詞部分がリポジトリのディレクトリ名などとして利用されるのです。Ubuntu 24.04 LTSのコードネームは「Noble Numbat」のため、ここが「noble」になるというわけです。Ubuntuのリリースについてはこちらを参照してください。

    その後の「noble-rootfs」はターゲットとなるサブディレクトリ名です。ここでは、先ほど作成したworkディレクトリ内で作業をしているため「~/work/noble-rootfs」というサブディレクトリが作成され、その中にルートファイルシステムが構築されることになります。

    最後のURLは使用するリポジトリのURLです。ここでは日本の公式ミラーサーバーを指定しています。リポジトリのサーバーは複数指定することが可能で、PPAも追加できます。より詳しくはマニュアルを参照してください。

    mmdebstrapでルートファイルシステムを構築する

WSL構成ファイルを作成する

mmdebstrapコマンドの実行が完了すると、noble-rootfsサブディレクトリ内にUbuntuのルートファイルシステムが構築されています。軽く中を覗いてみましょう。

noble-rootfsディレクトリ内にはbinやetcなど、ルートファイルシステムにマウントされるディレクトリツリー一式が構築されている

このUbuntu環境をWSLディストリビューションとして構成するためには、いくつかのメタデータファイルが必要です。これらのファイルもルートファイルシステム内に含める必要があります。

まず、WSLの起動方法を制御するファイルを用意します。「~/work/noble-rootfs/etc/wsl.conf」というファイルを、以下の内容で作成してください。

[boot]
systemd=true

WSLを使用して初めて起動した際に、そのディストリビューションをどのように構成するのかを制御するファイルを作成します。「~/work/noble-rootfs/etc/wsl-distribution.conf」というファイルを、以下の内容で作成してください。

[oobe]
command = /etc/oobe.sh
defaultUid = 1000
defaultName = ubuntu-vtj

[shortcut]
icon = /usr/lib/wsl/vtj.ico

[windowsterminal]
ProfileTemplate = /usr/lib/wsl/terminal-profile.json

「command」は初めてシェルを起動した際に実行されるコマンドの指定です。ここでは/etc/oobe.shというシェルスクリプトを起動して、初期化処理を行うよう設定しています。oobe.shについては後述します。

「defaultUid」はディストリビューション内に作成されるユーザーの既定のユーザーIDです。Ubuntuの場合は1000のままにしておいてください。

「defaultName」はディストリビューションの名前です。ここでは「ubutnu-vtj」としていますが、任意の名前に変更してください。

「icon」はショートカット等に表示されるアイコンファイルです。ルートファイルシステム内に任意のico形式のファイルをコピーした上で、そのパスを指定してください。

「ProfileTemplate」はWindows Terminal用に作成するプロファイルのテンプレートです。これも後述します。

初期化スクリプトの作成

先ほどcommandに指定した初期化用のスクリプトを用意します。「~/work/noble-rootfs/etc/oobe.sh」というファイルを、以下の内容で作成してください。

#! /bin/bash

set -ue

DEFAULT_GROUPS='adm,cdrom,sudo,dip,plugdev'
DEFAULT_UID='1000'

echo 'Please create a default UNIX user account. The username does not need to match your Windows username.'
echo 'For more information visit: https://aka.ms/wslusers'

if getent passwd "$DEFAULT_UID" > /dev/null ; then
  echo 'User account already exists, skipping creation'
  exit 0
fi

while true; do

  # Prompt from the username
  read -p 'Enter new UNIX username: ' username

  # Create the user
  if /usr/sbin/adduser --uid "$DEFAULT_UID" --quiet --gecos ''  "$username"; then

    if /usr/sbin/usermod "$username" -aG "$DEFAULT_GROUPS"; then
      break
    else
      /usr/bin/deluser "$username"
    fi
  fi
done

スクリプトには実行権限を付けておきます。

$ sudo chmod +x ~/work/noble-rootfs/etc/oobe.sh

Windows Terminalプロファイルの作成と
アイコンファイルの配置

  1. まず、以下のコマンドで「/usr/lib/wsl」ディレクトリを作成します。
    $ sudo mkdir ~/work/noble-rootfs/usr/lib/wsl
  2. そして、このディレクトリに先ほどwsl-distribution.confファイルで指定したアイコンファイルをコピーしておいてください。
  3. Windows Terminalプロファイルを作成します。「/usr/lib/wsl/terminal-profile.json」というファイルを、以下の内容で作成してください。ここでは「VTJ Dark」というカラースキーマを新規作成した上で、それを参照するように設定しています。

    フォントや色は好みの設定に変更しても構いません。なお、JSONファイルのフォーマットに関する詳細はドキュメントを参照してください。
    {
      "profiles": [
        {
          "antialiasingMode": "cleartype",
          "face": "Consolas",
          "fontWeight": "normal",
          "colorScheme": "VTJ Dark"
        }
      ],
      "schemes": [
        {
          "name": "VTJ Dark",
          "black": "#171421",
          "red": "#CC1B25",
          "green": "#33DB8E",
          "yellow": "#E3D432",
          "blue": "#003CED",
          "purple": "#A91DBD",
          "cyan": "#3A96DD",
          "white": "#DBDBDB",
          "brightBlack": "#767676",
          "brightRed": "#F72434",
          "brightGreen": "#3CFFA5",
          "brightYellow": "#FFF61E",
          "brightBlue": "#026AFF",
          "brightPurple": "#DB5FFA",
          "brightCyan": "#18EEFF",
          "brightWhite": "#FFFFFF",
          "cursorColor": "#FFFFFF",
          "selectionBackground": "#33DB8E",
          "background": "#140302",
          "foreground": "#FF911B"
        }
      ]
    }

その他のファイルの配置

この段階でディレクトリ内にファイルを追加すれば、WSLディストリビューションにそのファイルを含めることができます。例えば、インストールしたアプリが社内サーバーを使うよう、デフォルトの接続設定を記述したファイルを入れておく、といった具合です。用途に応じてカスタマイズを行ってください。

ディストリビューションのアーカイブ

カスタマイズと必要なメタデータファイルの配置が完了したら、以下のコマンドでルートファイルシステムをアーカイブします。ルートファイルシステムを構築したディレクトリごとではなく、その中身を直接アーカイブする点に気をつけてください。本記事の例で言えば「nobel-rootfs」ディレクトリをアーカイブするのではなく、「noble-rootfs」ディレクトリ内に入って中身をアーカイブしなくてはなりません。

$ cd ~/work/noble-rootfs
$ sudo tar --numeric-owner --absolute-names -c * | gzip --best > ~/work/ubuntu-vtj.tar.gz

「~/work」ディレクトリ内に「ubuntu-vtj.tar.gz」というアーカイブが作成されるので、拡張子をwslに変更しておきましょう。

$ cd ~/work
$ mv ubuntu-vtj.{tar.gz,wsl}

完成したwslファイルを、インストール先のWindowsマシンにコピーしてください。

ディストリビューションのインストール

冒頭で述べた通り、tarアーカイブからのインストールに対応しているのはWSL 2.4.4以降です。そのため、まずはWSLを最新にバージョンアップしておきましょう。

  1. PowerShellを開き、以下のコマンドを実行してください。
    $ wsl --update

    WSLを最新にアップデートする

  2. 対応したWSLがインストールされていると、エクスプローラー上でwslファイルのアイコンがペンギンに変化します。この状態であれば、ファイルをダブルクリックするだけでディストリビューションをインストールできます。

    WSL 2.4.4以降がインストールされている環境では、拡張子がwslのファイルがペンギンのアイコンで表示される

  3. アイコンをダブルクリックすると自動的にWindows Terminalが起動し、インストール作業が行われます。

    カスタムディストリビューションのインストール

カスタムディストリビューションの起動

インストールが完了したら、一度Windows Terminalを再起動してください。その後タブバーにある下向き矢印をクリックすると「ubuntu-vtj」という(wsl-distribution.confで指定した名前の)プロファイルが追加されているはずです。これを選択して、ディストリビューションを起動してみましょう。

新しいプロファイルが作成されている。アイコンも指定したicoファイルが使われている

oobe.shが実行され、ユーザーアカウントの作成処理が起動します。また、文字の色がプロファイルテンプレートで指定したカスタムカラーになっていることも分かります。

今回は変更していることが分かりやすいよう、文字色をオレンジにしてみた

今回は、ルートファイルシステム構築時にmmdebstrapでnginxパッケージを追加インストールしています。確認してみましょう。カスタムディストリビューションが起動したら「ss -ltrp」コマンドをroot権限で実行してみてください。

$ sudo ss -lntp

ssコマンドの実行例。80番ポートをnginxのプロセスが待ち受けている

再度WindowsでWebブラウザーを起動して「http://localhost」にアクセスしてみましょう。nginxのデフォルトページが表示されるはずです。

Windowsからカスタムディストリビューション内で動作しているWebサーバーにアクセスできた

このように、最初からnginxがインストールされ、自動的に起動していることが分かります。

おわりに

まっさらなルートファイルシステムを用意し、任意のパッケージを追加したり、独自のファイルを配置したりすることで、簡単にWSL用のカスタムディストリビューションが作成できることが分かったのではないでしょうか。また、これらの作業はUbuntuサーバーさえあれば、自動化することもそれほど難しくありません。CI/CDを使って定期的に自社向けのディストリビューションを更新するというのも面白そうです。

新人向けに「WSLを使った環境構築手順書」のようなものを用意している研修担当者も多いでしょう。開発に必要なツール一式をプリインストールしたディストリビューションを作れば、こうした作業手順を大幅に簡略化することもできます。ぜひ、カスタムディストリビューションの作成にチャレンジしてみてください。

日本仮想化技術株式会社
Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。日本仮想化技術株式会社所属。

連載バックナンバー

開発ツール
第11回

「mmdebstrap」でUbuntuをカスタマイズして、オリジナルのWSLディストリビューションを作ろう

2025/4/15
第11回の今回は、「mmdebstrap」を使ってUbuntuをカスタマイズし、独自のWSLディストリビューションを作成する方法を解説します。
開発ツール技術解説
第10回

「Visual Studio Code」と「WSL」+「Docker」をもっと便利に使いこなそう

2025/3/25
第10回の今回は、VS CodeのDocker拡張機能を活用して、WSL+Docker環境をより便利に使う方法や、VS CodeからWSL環境に直接接続する方法を解説します。
開発ツール技術解説
第9回

Windowsでもコンテナを使いたい! WSLで「Docker」に入門しよう

2025/3/4
第9回の今回は、WSLを利用してWindows上でコンテナの実行環境「Docker」を動かす方法について解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています