CentOS/Alma/RockyのWSL環境をDockerイメージから構築する
Windows 10以降、仮想環境中でLinuxディストリビューションを動かす「WSL」という機能が搭載されています。基本的に、そこで使えるディストリビューションは、Microsoftストアで配信されているもののみですので、CentOSなどは利用できません。
ですが、いろいろ調べてみると、LinuxディストリビューションのDockerイメージから簡単にWSL用のディストリが作成できるみたいですので、その方法を使ってWSL2でCentOSなどの環境を構築する方法を紹介します。
今回はCentOS、AlmaLinux、Rocky Linuxを例に紹介しますが、Dockerイメージさえあれば、他のディストリでも同様に構築可能かと思います。
はじめに
Windows 10以降、WSL2 (Windows Subsystem for Linux)という、Windows上の仮想環境でLinuxディストリビューションを動かす仕組みが搭載されています。WSL2のコンポーネントをインストールした上で、MicrosoftストアからLinuxディストリビューションをインストールするだけで、Windows上でシームレスにLinuxが使えるようになります。
ですが、Microsoftストアからインストールできるのは、wsl -l --online
を実行したときに出てくるもののみです。
PS C:\> wsl -l --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
openSUSE-42 openSUSE Leap 42
SLES-12 SUSE Linux Enterprise Server v12
Ubuntu-16.04 Ubuntu 16.04 LTS
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
従って、基本的にCentOSなどのディストリビューションは、WSL2上では使えません。
いろいろ調べてみたところ、WSL2ベースで動くDocker Desktop環境があれば、比較的簡単にDockerのOSイメージからWSL2用のイメージを作成できるそうです。そこで本記事では、CentOSやAlmaLinux、Rocky Linuxを例にして、DockerイメージからWSL2環境を構築する方法を紹介します。
ちなみに、今回例に挙げているCentOS 8は、Red Hatの運営方針が変わって2021年でサポートが切れます。その方針変更に反発して、代替として生まれたディストリビューションがAlmaLinuxやRocky Linuxです。
本記事は、WSL2ベースで動いているDocker Desktop環境が必要です。Docker Desktopをインストール済みの方は、Docker Desktopの設定画面(歯車マーク)から「Use the WSL 2 based engine」のチェックが入っているか確認してください。
まだインストールされていない方は、こちらの記事を参考にWSL2とDocker Desktopの設定を行ってください。Windows 10をご利用の方はこちらが、
Windows 11をご利用の方はこちらが参考になると思います。
Docker Desktopをインストールする際、下図の一つ目のチェックを忘れないようにしてください。
先の記事ではチュートリアルをやったりしていましたが、Docker Desktopをインストール・PC再起動して、下記の画面まで来たらOKです。
PowerShellスクリプトで全自動構築する
Dockerイメージの取得からWSL2へのインポートまでを全自動で行うPowerShellスクリプトを作成しました。こちらを実行するだけでWSL2上でCentOS 8が使えるようになります。次項では、スクリプトの解説を兼ねて、一つ一つコマンドを説明しています。スクリプトを使いたくない方は、この項を飛ばして次項を参照ください。
<#
build-CentOS-on-WSL2.ps1
DockerイメージからCentOSやRocky LinuxのWSL2環境を構築します
https://astherier.com/blog/2021/08/centos-almalinux-rocky-linux-on-wsl2-from-docker/
最終更新:2021/08/11
Copyright (c) 2021 astherier
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
#>
# Docker HubからPullするイメージ名を指定してください
# 例:"centos:8"、"almalinux:8"、"rockylinux/rockylinux:8"
$dockerName="centos:8"
# WSL2上の表示名を入力してください
# 例:"CentOS-8"、"AlmaLinux-8"、"Rocky-Linux-8"
$distroName="CentOS-8"
# WSL2中で使用するユーザーアカウント名を入力してください。
# (Windows側のユーザー名と同じにする必要はありません)
$myUserName="username"
# WSL2ディストリの元となるtarファイル(docker exportしたもの)の
# 保存先(ファイルパス)を指定してください。
# (WSL2環境ができあがったら削除可能です)
$tarPath="C:\wsl\distro-tar\${distroName}.tar"
# WSL2ディストリのディスクイメージファイルの保存先(フォルダ)を指定してください。
# (こちらは、永続的に保存できる場所を指定してください)
$distroDir="C:\wsl\distro\${distroName}"
New-Item (Split-Path -Parent $tarPath) -type directory -Force
New-Item $distroDir -type directory -Force
docker run --name "${distroName}-temp" "$dockerName"
docker export "${distroName}-temp" -o "$tarPath"
docker container rm "${distroName}-temp"
docker image rm "$dockerName"
wsl --import "$distroName" "$distroDir" "$tarPath"
wsl -d "$distroName" -- yum update -y "&&" yum install glibc-langpack-en passwd sudo -y
wsl -d "$distroName" -- adduser -G wheel "$myUserName" "&&" passwd "$myUserName"
wsl -d "$distroName" -- echo -e "[user]\\ndefault=$myUserName" ">>" /etc/wsl.conf
wsl -t "$distroName"
echo @"
WSL2への $distroName の構築が完了しました。
> wsl -d $distroName
で $distroName が起動できます。
また、Windows Terminalを再起動すれば、新規タブ欄からも起動できます。
"@
上記ファイルはこちらからダウンロードできるようにしておきましたので、PowerShell上でダウンロードして実行するだけでOKです。
https://astherier.com/static/blog/2021-08-11/build-CentOS-on-WSL2.ps1
なお、上記スクリプトをそのまま実行すると、CentOS 8を構築し、「username」という名前のアカウントが作成されます。好みに合わせて調整の上、実行してください。
- AlmaLinuxやRocky Linux環境を構築したい場合は、14行目と18行目を適切に書き換えてください。18行目はWSL2上の表示名ですので、任意に変更して構いません。
- ユーザー名を変更したい場合は、22行目を編集してください。このユーザー名は、Windowsのユーザー名と合わせる必要はありません。
- ディスクイメージ等の保存先を変更したい場合は、27行目と31行目を編集してください。
curlコマンドでダウンロードできます。ダウンロードが終わったら、実行します。
curl -O https://astherier.com/static/blog/2021-08-11/build-CentOS-on-WSL2.ps1
& .\build-CentOS-on-WSL2.ps1
実行後しばらくすると、下記のプロンプトが表示されます。これは、WSL2上のユーザーアカウントのパスワード設定です。設定したいパスワードを入力してください。
Changing password for user username.
New password:
設定が終わったら、「構築が完了しました」というメッセージが出てくると思いますので、ここまで終わったら完了です。
次に、「インストールできたか確認する」へ進んでください。
手動で設定する
この項では、前項のPowerShellスクリプトの解説も兼ねて、コマンドを一つずつ解説していきます。手動でWSL2上にCentOS環境を構築したい場合は、こちらを参考にしてください。
ここでは、CentOS 8をインストールする例を示していますので、pullするDockerイメージは「centos:8」、WSL2上の表示名は「CentOS-8」としています。CentOSではなく、代替ディストリビューションの
- AlmaLinuxをインストールするなら「almalinux:8」と「AlmaLinux-8」へ
- Rocky Linuxをインストールするなら「rockylinux/rockylinux:8」と「Rocky-Linux-8」へ
それぞれ読み替えてください。Dockerイメージのタグ等は、好みに応じてマイナーバージョンまで指定したり、latestを指定したりしてください。後者の表示名も任意ですので、好みに合わせて変更して構いません。
おおまかにいえば、Dockerコンテナを作成してexport → WSL2へimport → WSL2上でアカウント作成 という流れで進めていきます。
Dockerイメージを取得して、コンテナをexportする
まずは、Dockerイメージを取得し、コンテナを作成します。実行するコマンドはdocker run --name <作成するコンテナ名> <使用したいDockerイメージ名>
です。手元にCentOSのイメージがない場合、イメージのダウンロードから始まりますので、少し時間がかかります。
docker run --name CentOS-8-temp centos:8
上記コマンドが終わったら、作成したコンテナをtarファイルとしてエクスポートします。コマンドはdocker export <作成したコンテナ名> -o <エクスポート先パス>
です。ここで出力するファイルは、最終的には不要になるものですので、一時的な保存場所に置いても構いません。
docker export CentOS-8-temp -o "C:\wsl\distro-tar\CentOS-8.tar"
tarファイルができたら、Dockerのコンテナやイメージは不要ですので、他に用途がなければ削除しておきましょう(他のコンテナでCentOSイメージを使用している場合は、イメージの削除はできません)。コンテナの削除はdocker container rm <作成したコンテナ名>
、イメージの削除はdocker image rm <使用したイメージ名>
でできます。
docker container rm CentOS-8-temp
docker image rm centos:8
DockerコンテナをWSL2にインポートする
Dockerからエクスポートしたコンテナファイルは、WSL2にインポート可能です。ここで実行するコマンドはwsl --import <WSL2上のディストリ名> <ディスクイメージの保存フォルダ> <エクスポートしたtarファイル>
です。ディストリ名は任意に決めてください。ディスクイメージの保存フォルダは、WSL2ディストリの実体が保存されるフォルダですので、永続的に保存しておけるフォルダを指定してください。
wsl --import CentOS-8 "C:\wsl\distro\CentOS-8" "C:\wsl\distro-tar\CentOS-8.tar"
実行し終わったら、正しくインストールできたか確認してみます。wsl -l -v
を実行してみて、「CentOS-8」というディストリビューションが表示されていれば問題ありません。
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Running 2
CentOS-8 Stopped 2
Ubuntu Stopped 2
docker-desktop-data Running 2
Ubuntu-20.04 Running 2
docker-desktop Running 2
ここまで来たら、前項でdocker exportしたtarファイルは削除しても構いません。ただ、ディストリ名を変えてインポートすれば、CentOS環境をたくさんつくれますので、その予定がある方は残しておきましょう。
WSL2(CentOS)側でユーザーを作成する
このままでも利用可能ですが、一般ユーザーを作成していないため、常にrootでログインすることになってしまいます。それでは危なかったりしますので、一般ユーザーを作成しましょう。
まず、wsl -d <ディストリ名>
コマンドを実行して、先ほど作成したCentOSを起動します。
wsl -d CentOS-8
すると、WSL2のCentOS 8が起動し、プロンプトが変わります。まず始めに、各パッケージのアップデートと必要コマンドのインストールを行います。
yum update -y && yum install glibc-langpack-en passwd sudo -y
続いて、一般ユーザーの作成とパスワードの設定を行います。ここでは「username」という名前のユーザーを作成しますが、これも任意ですので適宜読み替えてください。CentOS側のユーザー名ですので、Windowsのユーザー名と合わせる必要はありません。
myUserName=username
adduser -G wheel $myUserName && passwd $myUserName
上記を実行すると、設定したいパスワードを聞かれますので、パスワードを入力してエンターキーを押してください。続いて、確認のためもう一度聞かれますので、同じパスワードを入力します。(入力しても「●●●」や「***」とも出てきませんが、入力できています)
次に、次回から、作成した一般ユーザーでログインするよう、wsl.confファイルを作成します。
echo -e "[user]\ndefault=$myUserName" >> /etc/wsl.conf
以上でCentOS側で行う作業は終了です。exit
を実行してCentOSから抜けて、PowerShellへ戻ります。
exit
wsl.confファイルは、次回CentOSを起動した際に読み込まれますので、一旦CentOSを終了するためwsl -t <ディストリ名>
を実行します。
wsl -t CentOS-8
以上で環境構築は完了です。
インストールできたか確認する
インストールできたか確認してみます。
もう一度wsl -d <ディストリ名>
を実行して、CentOSを起動してみます。
wsl -d CentOS-8
もしくは、Windows Terminalをご利用の方は、Windows Terminalを再起動すると新規タブ欄にCentOS-8が追加されていると思います。それを開いても同様に起動することができます。
どちらかで起動して、作成した一般ユーザーでプロンプトが表示されたらOKです。ついでに、cat /etc/os-release
を実行して、バージョン等を確認してみましょう。
[username@z390 username]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
以上で設定は終了です。CentOS、AlmaLinux、Rocky Linuxいずれも同じ方法で設定できます。
あとがき
DockerのOSイメージを利用して、WSL2上にCentOS、AlmaLinux、Rocky Linux環境を構築する方法を紹介しました。
Docker Desktopが必須というデメリットはあるものの、Rocky Linuxのドキュメントで紹介されている、「WSL2+Ubuntu+rinseを使用した構築方法」より簡単ですのでおすすめです。Dockerイメージが公開されていれば、他のディストリビューションでも同様にWSL2へ移植できると思われます。
また、途中でdocker exportでtarファイルを出力していますが、WSL2上のディストリ名を変更すれば、このtarファイルから複数のWSL2環境を構築できます(「DockerコンテナをWSL2にインポートする」以降を行う)。テスト用に使い捨て環境をつくる、という使い方も便利でしょう。
参考サイト
本記事は、主にRocky Linuxのドキュメントを参照して作成しました。こちらのドキュメントでは、VirtualBoxを用いた方法も紹介されていますが、WSL2を使う方法の方が楽だと思います。
Microsoftにも同様のドキュメントがありますが、古いDocker Desktopを前提にして書かれているようです。
ちなみに、あとがきに書いた「WSL2+Ubuntu+rinse」を使う方法は、こちらのドキュメントで説明されています。結構大変そうです。
ディスカッション
コメント一覧
まだ、コメントがありません