WSL2 + CentOS 8 で快適なローカルLinux環境を作る

はじめに

Windows 10 May 2020 Update (Version 2004) が 2020/5/30 にリリースされ、ようやく WSL2 (Windows Subsystem for Linux 2) が使えるようになった。もろもろの不具合はあるらしいが、社内インフラ担当という立場上および個人的興味からここは先陣を切って突撃せねばならない。

語弊を恐れずにいえば、以前の WSL1 は実質 Ubuntu 専用ではないかと思えるもので、密接に動いているようで Windows ホストとのファイル交換も壊れやすいという代物だった。仕事柄 Red Hat Linux / CentOS の RPM ベースディストリビューションが社内では広く使われているのだが、WSL1 ではとうとうサポートされず、WSL2 には強く期待していた。

結論から言うと WSL2 が正式に CentOS に対応したわけではない。Microsoft Store からダウンロードできる CentOS は、作成者が中国人名の謎の有料アプリしかない。

いろいろ調べるうちに、有志で WSL2 対応の CentOS8 パッケージを公開されている方がおり、導入例の記事も参考にしながらローカル CentOS 8 のコンソールが起動できるようになった。前置きはこのくらいにして以下に手順を記載する。

構築目標

  • 軽量でさっと立ち上がる Windows PC 内での CentOS 8 Linux 環境
  • Windows / Linux 間のファイル交換手順の確立
  • 快適なターミナル環境
  • 快適な Linux 側ファイル編集環境

前提

下記の環境は用意済みとする。

  • Windows 10 May 2020 Update (Version 2004) にアップグレード済みのPC (Home Edition でも可)
  • BIOS で CPU 仮想マシン支援機能 (Intel VT / AMD-V) を有効化
  • Windows Terminal 1.0 正式版インストール済み
    • Windows Terminal には 白源 (HackGen) フォントがおすすめ。美しい等幅フォントは心の平安をもたらす。
  • zip, gzip を解凍できるツール
    • 7-Zip ZS がコマンド1つで unzip や gunzip に対応しているのでおすすめ
  • (推奨) Visual Studio Code WSL関連のあらゆるファイル編集に
  • 多少の不具合でも折れない心と解決への努力

導入手順

WSL2 の有効化

PowerShell (管理者) から以下を実行する。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

Windows 再起動で有効化される。

WSL2 カーネルの更新

WSL2 Linux カーネル更新プログラム をダウンロードしてインストール

wsl_update_x64.msi

WSL用 CentOS8 パッケージをダウンロード

GitHub yuk7/CentWSL レポジトリ から CentOS8.zip ファイルをダウンロードする。

本記事の時点で “8.1.1911.1 for Insider only” という位置づけだが、いまのところ動作している。あくまで有志の作成なので、理解した上で導入すること。

ファイルの展開

CentOS8.zip をダウンロードしたフォルダ内で中身を展開する。

7za x CentOS8.zip rootfs.tar.gz
7za x rootfs.tar.gz  # -> rootfs.tar ができる
del rootfs.tar.gz  # 展開前のファイルは削除

CentOS 8 を WSL2 ディストリビューションに登録

個人ユーザーのフォルダにインストールするには、下記を PowerShell から実行。

#配置先フォルダ作成
mkdir ${env:LOCALAPPDATA}\Packages\CentOS8
#WSL2にインポート
wsl --import CentOS8 ${env:LOCALAPPDATA}\Packages\CentOS8 rootfs.tar --version 2

WSL2 としてディストリビューションに登録されているか確認

PS C:\> wsl -l -v
  NAME       STATE           VERSION
* CentOS8    Stopped         2

起動

登録したディストリビューションを起動する

wsl -d CentOS8

数秒後に bash プロンプトが出る

PS C:\> wsl -d CentOS8
[root@WindowsPCName c]#

Ctrl-D でプロンプトを抜けて wsl のステータスを見ると、ディストリビューションプロセスは生きたまま。

[root@LPC-3017 c]# logout
PS C:\> wsl -l -v
  NAME       STATE           VERSION
* CentOS8    Running         2

プロセスを停止するには:

wsl -t CentOS8

確認してみる。

PS C:\> wsl -l -v
  NAME       STATE           VERSION
* CentOS8    Stopped         2

Windows Terminal からの利用

Windows Terminal は WSL にネイティブ対応しているので、上記のディストリビューション登録後には CentOS8 というメニューが自動的に現れる。Windows Terminal の設定ファイルにも自動的に追加されているのがわかる。

Windows TerminalのメニューにCentOS8が現れる

WSL から起動した Linux プロセスは「ログインシェル」ではないため、.bashrc などの初期化ファイルを読んでくれないという問題がある。普通の CentOS では使用できるはずの ll (ls -l –color) 等の alias が未定義になってしまう。この問題は起動オプションに bash を指定すれば解決する。

Windows Terminal の「設定」で settings.json ファイルを開いて、CentOS8 の設定を修正する。

    "profiles": {
        "list": [
            {
                "guid": "XXXXXXXXXX",   //元のファイルのまま
                "hidden": false,
                "name": "CentOS8",
                // "source": "Windows.Terminal.Wsl",
                "commandline": "wsl.exe -d CentOS8 bash",   // bashを指定
                "startingDirectory": "//wsl$/CentOS8/root"  //起動フォルダ指定
            },
        ]
    }

Windows Terminal は PowerShell がデフォルトになっている。変更も可能だが、wt.exe の起動オプションで直接エントリを指定することができる。“CentOS8” という名前のショートカットを新規作成し、下記を指定すればよい。

wt.exe -p "CentOS8"

WSL2/CentOS8 の追加設定

上記の手順ではミニマムの環境しか入っていないため、必要なパッケージを追加する。

#先にmanを入れないとman pageが出ないことがある
dnf install -y man man-pages
dnf update -y
dnf install -y bash-completion net-tools which zip unzip bzip2 openssh-clients telnet python3 perl coreutils-common
dnf reinstall -y bash util-linux
#エディタはお好みで
dnf install -y vim-enhanced

systemd 対応

WSL2 では原理的に systemd 対応不可のため、代替パッケージを入れる。

dnf install python2
ln -s /usr/bin/python2 /usr/bin/python
cd /tmp
curl -O https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py
mv /usr/bin/systemctl /usr/bin/systemctl.old
cp -a systemctl.py /usr/bin/systemctl
chmod +x /usr/bin/systemctl

自動起動はできないが、systemd 用の起動スクリプトにより手動でサービスを上げることはできるようになる。 例)nginx を起動

systemctl start nginx

WSL / CentOS 8 での注意点まとめ

  • who / w コマンドでユーザが誰もログインしていないように見える。
  • シャットダウンという概念がない(?) ため、完全に終了するには wsl –shutdown 等のコマンドが必要。
  • Windows フォルダは /mnt/c 等にマウントされている。

参考