「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を使って行っています。
- まず、Ubuntuに以下のコマンドでmmdebstrapをインストールしてください。
$ sudo apt install -U -y mmdebstrap
- 以下のコマンドで、作業用のディレクトリを作成しておきましょう。mmdebstrapはルートファイルシステムをサブディレクトリ内に作成するため、この作業自体は必須ではありませんが、1つディレクトリを掘っておいた方が後片付けがしやすい等のメリットがあるためです。
$ mkdir ~/work && cd ~/work
- 続いて、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も追加できます。より詳しくはマニュアルを参照してください。
WSL構成ファイルを作成する
mmdebstrapコマンドの実行が完了すると、noble-rootfsサブディレクトリ内にUbuntuのルートファイルシステムが構築されています。軽く中を覗いてみましょう。
この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プロファイルの作成と
アイコンファイルの配置
- まず、以下のコマンドで「/usr/lib/wsl」ディレクトリを作成します。
$ sudo mkdir ~/work/noble-rootfs/usr/lib/wsl
- そして、このディレクトリに先ほどwsl-distribution.confファイルで指定したアイコンファイルをコピーしておいてください。
- 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を最新にバージョンアップしておきましょう。
- PowerShellを開き、以下のコマンドを実行してください。
$ wsl --update
- 対応したWSLがインストールされていると、エクスプローラー上でwslファイルのアイコンがペンギンに変化します。この状態であれば、ファイルをダブルクリックするだけでディストリビューションをインストールできます。
- アイコンをダブルクリックすると自動的にWindows Terminalが起動し、インストール作業が行われます。
カスタムディストリビューションの起動
インストールが完了したら、一度Windows Terminalを再起動してください。その後タブバーにある下向き矢印をクリックすると「ubuntu-vtj」という(wsl-distribution.confで指定した名前の)プロファイルが追加されているはずです。これを選択して、ディストリビューションを起動してみましょう。
oobe.shが実行され、ユーザーアカウントの作成処理が起動します。また、文字の色がプロファイルテンプレートで指定したカスタムカラーになっていることも分かります。
今回は、ルートファイルシステム構築時にmmdebstrapでnginxパッケージを追加インストールしています。確認してみましょう。カスタムディストリビューションが起動したら「ss -ltrp」コマンドをroot権限で実行してみてください。
$ sudo ss -lntp
再度WindowsでWebブラウザーを起動して「http://localhost」にアクセスしてみましょう。nginxのデフォルトページが表示されるはずです。
このように、最初からnginxがインストールされ、自動的に起動していることが分かります。
おわりに
まっさらなルートファイルシステムを用意し、任意のパッケージを追加したり、独自のファイルを配置したりすることで、簡単にWSL用のカスタムディストリビューションが作成できることが分かったのではないでしょうか。また、これらの作業はUbuntuサーバーさえあれば、自動化することもそれほど難しくありません。CI/CDを使って定期的に自社向けのディストリビューションを更新するというのも面白そうです。
新人向けに「WSLを使った環境構築手順書」のようなものを用意している研修担当者も多いでしょう。開発に必要なツール一式をプリインストールしたディストリビューションを作れば、こうした作業手順を大幅に簡略化することもできます。ぜひ、カスタムディストリビューションの作成にチャレンジしてみてください。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 「Visual Studio Code」と「WSL」+「Docker」をもっと便利に使いこなそう
- 「WSL2」をインストールしよう
- Windows 11でLinuxを使う:Windows Subsystem for Linux 2の設定
- Linuxの基礎コマンド群「Coreutils」を使いこなそう
- Windowsでもコンテナを使いたい! WSLで「Docker」に入門しよう
- 「Ubuntu」のパッケージ管理を学ぼう
- ブートローダ/カーネル起動/初期ラムディスク展開の比較
- WSLとWindowsの設定ファイルを「chezmoi」を使って安全に管理しよう
- モジュールのインストール!
- DockerとLinux OSのリソース共有状況の調査