2022-12-27 現在では、Microsoft Storeからダウンロード・インストールするWSLが何も考えずにWSL2、WSLgがインストールされます。以下の記事は古すぎるため実施すべきではないです。
(あちこちから情報を持ってきたので、不足と重複があるかもしれないので、徐々にブラッシュアップします。)
Windows上でサーバーサイド開発の環境を整える手法
まずサーバーサイド開発環境とはLinuxサーバでの動作と同じものを作るというのが大前提。さらにシェアの多さで言えばUbuntuかCentOS(うちではデスクトップアプリをサーバーサイドで動かすことも多いのでUbuntuを標準にしてる)
WindowsマシンでUbuntuを使うには以下の複数の選択肢がある
- Windowsをぶっこ抜いてUbuntuをクリーンインストール
- 実はこれでも十分。一番シンプル。MS-Officeが使えない、ゲームができないという以外に不便はない。
- WindowsとデュアルブートでUbuntuを入れる
- 買ったばかりのPCでキーボードが反応しないとかの初期不良を追求するにはプリインストールのOSは残しておいた方がいい。起動しなおせばWindowsだって使える。
- Windows上にWSL1
- 2020年では一番初心者向き
- ただちょっと特殊なLinuxなので、Dockerが使えないなどの「今どきの開発環境にしては不便」な点が残る
- MicrosoftがWSL2を激推ししているのでWSL1へのサポート情報がどんどん減ってる
- Winodws11上にWSL2
- 2022年ではおそらくこれがデファクト
- 仮想マシン上でのLinuxなのでほぼ完全なLinux
- ただしWSL1でできた「Windowsとのシームレスな連携」は逆になくなる
- Windowsとのシームレスな連携がないならもうデュアルブートでいいじゃないって発想に戻る
ここではWindows11上にWSL2を入れるという前提でセットアップ方法を示す。
WSL1とWSL2の使い分けに関しては、別記事で解説する。
以下セットアップ手順
準備するもの
- Windows11(Windows10の例がどんどん減ってるからやめたほうがいい)
- WindowsTerminal(WSL1,WSL2,PoserShellにまたがってアクセスするにはこの一択)
ここで指すGUI込のUbuntuの再現はWSLではWSLgと呼ばれており、WSLgの前提がWindows11なのでそれを指す。
https://github.com/microsoft/wslg#pre-requisites
ここの記事ではGPUドライバを最新化するように指定されいたが、私の環境ではIntelGPUドライバは最新版であったので特に何もしていない。
以下手順
Windows-Terminalを管理者権限で起動する。
# WSLの機能をONにする
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# OSの仮想マシンの機能をONにする
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
さらにWSL2向けのカーネル更新パッケージをインストールする
さらに、WSLを最新版にupdateする
wsl --update
おさらいすると以下の4点をやってる。一気にできればいいんだけど、それぞれ目的が違うので受け入れる。
- WSLの機能をONにする(これはWSL1のときも必要だった)
- Windows側の仮想マシンの機能をONにする(これはWSL1のときには必要なかった)
- Linuxカーネルを最新化する
- WSLを最新化する
Linuxカーネルの最新化とWSLの最新化でおそらくWSL2がWSLgというやつになってるんだと思う。
次にWSL上にUbuntuを入れる。入れれるディストリビューションの一覧はこのように参照できる。
wsl --list --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
ちゃんとバージョン指定してインストールする。
wsl --install -d Ubuntu-20.04
そして、ここで私は既にWSL1上にUbuntu18を入れているのが特殊環境。ディストリビューションごとにWSL1かWSL2かは選べる。複数のディストリビューションを入れることでWSL1とWSL2を共存させることができる。ただし2022年以降の人が無理にWSL1を入れる必要はない(事例もどんどん減っていくはず)
インストールしているWSLをみるとこんな感じ
PS C:\Users\yugoy> wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Running 1
Ubuntu-20.04 Running 2
とりあえず以前入ってるWSL1をデフォルトにしている。
(しばらくは機能比較のために両方を使う予定)
WSL2にインストールができると、WindowsTerminalからも接続先の選択肢加わってる(これがWindowsTerminalの超便利機能)。
Ubuntu20.04を選択してタブを開く。
GUIつきアプリが起動するかどうかをテストするには、昔ながらの方法でxeyesを使う。(これ30年以上変わらない)
まずはxeyesが含まれるパッケージをインストール
sudo apt install x11-apps
xeyesを起動
成功。そして面白いのはどこにもX-Serverが起動してないというところ。X-ServerでGUIを受けるのではなく、RPD(リモートデスクトップ)でWindowsからLinuxを覗きにいってるというのが特徴。仮想化+RDPという超昔ながらの技術ではあるものの、LinuxカーネルをいじったりGPUドライバをいじることで「仮想マシンで起動してる別OSを部分的に覗きに行く」ことに成功している。
2022-05-26 修正
wsl --sytem
でログインすると westonがプロセスとして存在しました。westonのバックエンドにrdbを結びつけてるみたいです。
# pgrep -fa wayland
664 /usr/bin/weston --backend=rdp-backend.so --xwayland --shell=rdprail-shell.so --logger-scopes=log,rdp-backend,rdprail-shell --log=/mnt/wslg/weston.log
WSL2はネットワーク通信が遅いと言われていたので、スピードテストをしてみる。
CLIで動くスピードテストをインストール
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
chmod +x speedtest-cli
起動するとPythonが入ってないとのこと
sudo apt install python
$ E: Package 'python' has no installation candidate
pythonがないのはパッケージマネージャーが古いから
sudo apt update
再度チャレンジ
sudo apt install python
これでPythonが入った。Ubuntu20でもPythonコマンドで入るのは2.7
あらためてスピードテスト
$ ./speedtest-cli
Retrieving speedtest.net configuration...
Testing from DTI (153.232.40.31)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Kobayashi Family Net (Tokyo) [0.89 km]: 9.184 ms
Testing download speed................................................................................
Download: 172.91 Mbit/s
Testing upload speed................................................................................................
Upload: 111.50 Mbit/s
十分なスピード。
あとはどうせ自分しか使わないので、デフォルトのログインユーザをrootにしちゃう。
https://devlights.hatenablog.com/entry/2021/05/29/070000#etcwslconf-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B
を参考に/etc/wsl.confを設定。
サーバーを再起動。ディストリビューション単位で再起動するには、PowerShellで以下のコマンドを実行。
wsl -t Ubuntu-20.04
ここからGUIアプリのインストール
GUIアプリといっても欲しいのはChrome。手元のUbuntuでChromeが動けばクラウドサーバーのUbuntuでGUIつきChromeの開発環境になりうる。
Google Chromeのインストール
https://postgresweb.com/install-google-chrome-ubuntu-20-04
を参考にインストール
フォントが化けてる状態 → でもこれで動くっちゃぁ動く
https://qiita.com/SoraKumo/items/f83548efde26788a1fc7
を参考に
vi /etc/fonts/local.conf
でフォントを設定しWSL2を再起動すれば日本語もレンダリングされる。
Ubuntu上でIMを入れる方法もあるようだけど、2022-01-06 時点のWSLgでは、Windows上でコピーした日本語をUbuntu上のアプリにペーストすることもできたので一旦は不要。
フォントはガビガビしているが、Ubuntu上のChromeで動画も見れるし音声もステレオでしっかり再生される。テスト環境としては100点。ただし普段使いのChromeややディタまでWSLg上のアプリで使えるかというとそこまでのUIにはなってないしやる必要がない。
とりあえず、GUIつきのChromeが入ったことで、Seleniumで起動されるChromeやChromeDriverがUbuntuで完結するようになった。普段使いのChromeのバージョンアップなどに影響されないので便利とも言えるし、普段使いのChromeが自動化できないという点はWSL1からのマイナスとも言える。