概要
WSL2の設定からディストリビューションのインストールまでの初歩的な使い方をまとめたメモです。
環境
- Windows 10 Professional バージョン 20H2 (インサイダープログラム参加)
参考
- [Windows 10 用 Windows Subsystem for Linux のインストール ガイド] (https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
- [Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能] (https://www.atmarkit.co.jp/ait/articles/1909/09/news020.html)
- [完全なLinuxがWindows 10上で稼働する? 「WSL 2」とは] (https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html)
WSL2のインストール
WSL2のインストールは[Windows 10 用 Windows Subsystem for Linux のインストール ガイド] (https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)で詳しく説明されているので、このページを参考にインストールを行います。
WSLを有効にする
WSLを有効にしていない場合は、管理者権限でPowerShellを起動し下記コマンドを実行してWSLを有効にします。
すでに有効になっている場合は不要なのでスキップします。
> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.329
イメージのバージョン: 10.0.19042.421
機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
WSLでインストールしたLinuxディストリビューションをアンインストールしたい場合
ディストリビューションによってはWSLからWSL2への更新に数分の時間がかかるようです。
今後使用しないディストリビューションがインストールされている場合は、事前にアンインストールしておくといいと思います。
> wsl --unregister Ubuntu-18.04
登録を解除しています...
仮想マシンプラットフォームを有効にする
続けて下記コマンドを実行して仮想マシンプラットフォームを有効にします。
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
展開イメージのサービスと管理ツール
バージョン: 10.0.19041.329
イメージのバージョン: 10.0.19042.421
機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
PCの再起動
ここで一旦PCを再起動します。
PCが立ち上がったらコントロールパネルのWindowsの機能の有効化または無効化
画面で
Linux 用 Windows サブシステム
仮想マシン プラットフォーム
にチェックが付いていることを確認します。
ちなみにWindowsの機能の有効化または無効化
画面に素早くアクセスするには、Winキーを押してスタートメニューを表示させ、その状態で "windows fea (tures)"とまで入力すると図のように表示されるので、そこに表示されたWindowsの機能の有効化または無効化
をクリックします。
WSL2をデフォルトに設定
この設定を行うとインストールするディストリビューションのデフォルトがWSL2になります。
> wsl --set-default-version 2
このとき
- "WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel" 若しくは
- "WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください"
というメッセージが表示された場合はカーネルの更新が必要です。[WSL 2 Linux カーネルの更新] (https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)を参考に更新してください。
私の環境ではこれらのメッセージは表示されず、"エラー: 0x1bc"と表示されました。この現象はすでに報告されており([Error 0x1bc when setting wsl default version] (https://github.com/microsoft/WSL/issues/5651))、そのままカーネルの更新を続けても良いようです。
> wsl --set-default-version 2
エラー: 0x1bc
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
[WSL 2 Linux カーネルの更新] (https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)を参考にカーネルを更新し、もう一度実行すると設定が完了します。
> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
以上でWSL2のインストールは完了です。
ディストリビューションのインストール
ディストリビューションはMicorosoft Storeから行います。
Ubuntu 20.04 LTSをインストール
Microsoft Storeを起動し検索フィールドに"Ubuntu"と入力して検索し、図の"Ubuntu 20.04 LTS"をクリックします。
「入手」というボタンをクリックします。
インストールが完了すると「起動」というボタンが表示されるのでクリックします。
新しいウィンドウが開くので、アカウント名とパスワードを入力してUbuntuの新しいアカウントを作成します。このアカウントはLinux管理者とみなされsudoコマンドが実行できます。
アカウントの作成が終わると図のようにメッセージが表示された後、プロンプトが表示されます。
バージョンの確認
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04 LTS
Release: 20.04
Codename: focal
最新の状態に更新
下記コマンドで最新の状態に更新します。
> sudo apt update && sudo apt upgrade -y
[sudo] password for rubytomato:
インストールしたディストリビューションの確認
PowerShellからwsl
コマンドでインストールしたディストリビューションを確認します。
VERSIONが2
と表示されている通り、インストールしたUbuntu 20.04 LTSはWSL2で実行されています。
> wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 2
PowerShell(またはコマンドプロンプト)からUbuntuのシェルを起動
wslコマンドを使用する
PowerShell(またはコマンドプロンプト)からUbuntuのシェルを起動するにはwsl
コマンドを実行します。
> wsl
オプションを指定せずに実行するとデフォルトのディストリビューションのシェルが起動しますが、複数のディストリビューションをインストールしていてデフォルト以外のディストリビューションのシェルを起動したい場合は-d
オプションで、ディストリビューションを指定します。
> wsl -d {ディストリビューション名}
ubuntu2004コマンドを使用する
wsl
コマンドの他にディストリビューション名が付いた実行ファイルがあります。例えばUbuntu 20.04 LTSの場合ubuntu2004.exe
という名前になります。
> ubuntu2004
ちなみにDebianの場合はdebian.exe
でDebianのシェルを起動することができます。
> debian
ディストリビューションからPowerShellを起動
ディストリビューションのシェルからPowerShellやCMDを起動することもできます。
なお、Windows環境では実行ファイルの拡張子は省略できますが、ディストリビューションのシェルから実行する場合は拡張子を省略することができません。
たとえばPowerShellを起動するときは下記のように.exeまで入力する必要があります。
$ powershell.exe
コマンドプロンプトを任意のディレクトリで起動したい場合は、下記のように/k
オプションでcdコマンドを実行します。この例ではコマンドプロンプト起動後にカレントディレクトリをユーザーホームディレクトリに移動します。
$ cmd.exe /k "cd %HOME%"
留意点
PowerShellやCMD、エクスプローラーをディストリビューションのシェルから起動するには、Cドライブがマウントされている必要があります。
後述しますが、Windowsの固定ドライブをマウントするかどうかは設定することができますので、Cドライブマウントされていないとこれらのコマンドは使えないことになります。
また、デフォルトでWindows環境の環境変数PATHの内容は、ディストリビューションのシェルの環境変数PATHに引き継がれているため、powershell.exeやcmd.exeなども絶対パスを指定せずに実行できます。
$ which cmd.exe
/mnt/c/Windows/system32/cmd.exe
Windowsの環境変数PATHをディストリビューションに引き継ぎたくない場合は、/etc/wsl.confで設定可能で、下記のinterop
セクションを追記します。
[interop]
appendWindowsPath = false
新しいユーザーを登録する
$ sudo adduser test_user
Adding user `test_user' ...
Adding new group `test_user' (1001) ...
Adding new user `test_user' (1001) with group `test_user' ...
Creating home directory `/home/test_user' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for test_user
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
新しいユーザーでログインする
デフォルトユーザーとは異なるユーザーでログインするには-u
オプションでそのユーザーを指定します。
> wsl -u test_user
ログインするデフォルトユーザーを変更する
ログインするユーザーを指定しなかった場合、ディストリビューションのインストール時に作成したアカウントがデフォルトユーザーになります。
デフォルトユーザーでログイン
> wsl
デフォルトユーザーを変更する
デフォルトユーザーの変更はubuntu2004コマンドで行います。
> ubuntu2004 config --default-user test_user
これでユーザーを指定せずにtest_userでログインできます。
> wsl
rootユーザーでログイン
rootユーザーでログインしたい場合(たとえば、ディストリビューションインストール時に作成したLinux管理者ユーザーのパスワードを忘れた場合)、wsl
コマンドからrootユーザーでログインできます。
> wsl -u root
Debianをインストール
ドキュメントに[例外的に WSL 2 ではなく WSL 1 を使用する場合] (https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions#exceptions-for-using-wsl-1-rather-than-wsl-2)という項目があるように、まだWSLを利用した方がよい場合があります。
この例ではインストールしたDebianをWSLで実行するようにしてみます。
Microsoft Storeを起動し検索フィールドに"debian"と入力して検索し、図の"Debian"をクリックします。
「入手」というボタンをクリックします。
インストールが完了すると「起動」というボタンが表示されるのでクリックします。
新しいウィンドウが開くので、Debianの新しいアカウントを作成します。
図のようにアカウント名とパスワードを入力します。
インストールしたディストリビューションの確認
PowerShellからwsl
コマンドでインストールしたディストリビューションを確認します。
VERSIONが2
と表示されている通り、インストールしたDebianはWSL2で実行されています。
> wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 2
Debian Running 2
WSL2からWSLへ更新(ダウングレード)する
> wsl --set-version Debian 1
変換中です。この処理には数分かかることがあります...
変換が完了しました。
WSLのバージョンが変わったことを確認します。
> wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 2
Debian Stopped 1
Debianのシェルを起動します。(この記事ではDebianはデフォルトのディストリビューションではないので-d
オプションで明示します)
> wsl -d debian
Windowsとディストリビューションの連携
ファイルシステム
Windowsからディストリビューション
エクスプローラーから
エクスプローラーを開き、アドレスバーに\\wsl$
と入力すると実行中のディストリビューションがフォルダとして表示されます。
もしくは、ディストリビューション内から下記のようにexplorer.exe
を実行すると、そのディレクトリがエクスプローラーで開きます。
$ explorer.exe .
PowerShellから
> cd \\wsl$\ubuntu-20.04
なお、コマンドプロンプトからは移動できないようです。
> cd \\wsl$\ubuntu-20.04
'\\wsl$\ubuntu-20.04'
CMD では UNC パスは現在のディレクトリとしてサポートされません。
ディストリビューションからWindows
Windowsのファイルシステムは、デフォルトで自動的に/mnt
下に固定ドライブーがマウントされています。(光学ドライブは自動でマウントされません)
$ sudo mount | grep drvfs
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
D:\ on /mnt/d type 9p (rw,noatime,dirsync,aname=drvfs;path=D:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
マウントしたくない場合
固定ドライブを自動でマウントしたくない、もしくは手動でマウントしたい場合は、wsl.confというファイルで起動構成を設定します。
デフォルトでは作成されていないので、初回は作成する必要があります。
$ sudo vi /etc/wsl.conf
下記のようにautomount
セクションを追記します。
[automount]
enabled = false
fstabでマウントしたい場合
上記の設定に加え、/etc/fstabに下記の行を追記し、ディストリビューションを再起動します。
C: /mnt/c drvfs metadata,notime,gid=1000,uid=1000,defaults 0 0
再起動するには-t
オプションでディストリビューションを一旦停止させ
> wsl -t Ubuntu-20.04
もう一度wslコマンドでディストリビューションを開きます。
> wsl
手動でマウントしたい場合
マウント
$ sudo mount -t drvfs -o noatime,uid=1000,gid=1000, C:\\ /mnt/c
アンマウント
$ sudo umount /mnt/c
rfd,wfdの値が違う
自動でマウントした場合とfstabまたはmountコマンドでマウントした場合で、rfdとwfdの値が異なります。
自動マウント
自動ではrfd=8,wfd=8
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
手動マウント
手動ではrfd=3,wfd=3
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=3,wfd=3)
そもそもrfd、wfdが何を意味するのか分からないのですが、このようにmountコマンドの出力結果に違いが出ます。
ネットワーク
Windows(ホスト)側
wslでディストリビューションを開くとvEthernet (WSL)
という仮想ネットワークアダプターが(無ければ)追加されます。
このとき設定されるIPv4は固定ではなく毎回異なります。
> ipconfig
Windows IP 構成
// 省略
イーサネット アダプター vEthernet (WSL):
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::915c:3fa3:8ed5:721a%29
IPv4 アドレス . . . . . . . . . . . .: 172.25.128.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
デフォルト ゲートウェイ . . . . . . .:
WSL2(ゲスト)側
eth0
はWSL2側の仮想イーサネットアダプターです。IPアドレスは固定ではありません。
$ ip addr | grep eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.25.134.52/20 brd 172.25.143.255 scope global eth0
Windowsからディストリビューション
HTTP-SERVER
ディストリビューション内に立ち上げたHTTPサーバーへWindowsのブラウザからアクセスしてみます。
ここではnpmの[http-server] (https://www.npmjs.com/package/http-server)を利用しました。
http-serverのインストール
$ sudo npm install -g http-server
/usr/local/bin/http-server -> /usr/local/lib/node_modules/http-server/bin/http-server
/usr/local/bin/hs -> /usr/local/lib/node_modules/http-server/bin/http-server
+ http-server@0.12.3
added 23 packages from 35 contributors in 4.323s
テスト用ファイルの作成
$ mkdir public
$ vi ./public/index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
</head>
<body>
<div id="app">
<h1>index from ubuntu on wsl2</h1>
</div>
</body>
</html>
起動
$ http-server
Starting up http-server, serving ./
Available on:
http://127.0.0.1:8080
http://172.30.12.40:8080
Hit CTRL-C to stop the server
アクセス
この場合、Windows側のブラウザからhttp://127.0.0.1:8080
またはhttp://172.30.12.40:8080
でアクセスできます。
MySQL
ディストリビューション内に立ち上げたMySQLサーバーへWindowsのMySQLクライアントからアクセスしてみます。
MySQLクライアントのインストール
Windows側なので割愛します。
MySQLサーバーのインストール
$ sudo apt install -y mysql-server
起動
インストール直後は停止しているので
$ sudo service mysql status
* MySQL is stopped.
起動します。
$ sudo service mysql start
* Starting MySQL database server mysqld
su: 警告: ディレクトリを /nonexistent に変更できません: そのようなファイルやディレクトリはありません
[ OK ]
*警告の部分はのちほど対応します。
インストール後のセットアップ
$ sudo mysql_secure_installation
rootでログイン
セットアップが終わったらrootユーザーでログインしてみます。sudo
を付け忘れると正しいパスワードを入力してもログインできません。
$ sudo mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
bind_addressの変更
Windows側のMySQLクライアントからログインできるようにbind_addressを変更します。
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
下記の行をコメントアウトします。
#bind-address = 127.0.0.1
警告の対応
MySQLサーバー起動時に出力された警告に対応します。
$ sudo usermod -d /var/lib/mysql mysql
ここで一旦再起動します。
$ sudo service mysql restart
データベースとユーザーの作成
> CREATE DATABASE IF NOT EXISTS sample_db
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;
Windowsからログインできるユーザーを作成します。
WindowsのIPアドレスが変わってもいいようにホストをワイルドカードにしています。
> CREATE USER IF NOT EXISTS 'sample_user'@'%'
IDENTIFIED BY 'sample_pass'
PASSWORD EXPIRE NEVER;
> GRANT ALL ON sample_db.* TO 'sample_user'@'%';
> FLUSH PRIVILEGES;
ログイン
WinsowsのMySQLクライアントからディストリビューションのMySQLサーバーへログインします。
ホストにディストリビューションのeth0のIPアドレスを指定します。
> mysql -h 172.30.12.40 -u sample_user -p
Enter password: ***********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
eth0のIPアドレスを調べる
$ ip addr | grep eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.30.12.40/20 brd 172.30.15.255 scope global eth0
ディストリビューションからWindows
HTTP-SERVER
Windowsで立ち上げたHTTPサーバーにディストリビューション内からアクセスしてみます。
インストール
割愛します。
テスト用ファイルの作成
$ mkdir public
public内にindex.htmlファイルを作成
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
</head>
<body>
<div id="app">
<h1>index from windows</h1>
</div>
</body>
</html>
起動
Windowsからは下記3つのアドレスへアクセスできますが、
> http-server
Starting up http-server, serving ./public
Available on:
http://192.168.1.20:8080
http://127.0.0.1:8080
http://172.30.0.1:8080
Hit CTRL-C to stop the server
アクセス
ディストリビューションからは192.168.1.20:8080
へしかアクセスできません。
$ curl -i http://192.168.1.20:8080
HTTP/1.1 200 OK
server: ecstatic-3.3.2
cache-control: max-age=3600
last-modified: Fri, 07 Aug 2020 13:25:36 GMT
etag: W/"844424930696936-300-2020-08-07T13:25:36.438Z"
content-length: 300
content-type: text/html; charset=UTF-8
Date: Fri, 07 Aug 2020 16:09:39 GMT
Connection: keep-alive
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>The HTML5 Herald</title>
<meta name="description" content="The HTML5 Herald">
<meta name="author" content="SitePoint">
</head>
<body>
<div id="app">
<h1>index from windows</h1>
</div>
</body>
</html>
理由がよくわかりませんが172.30.0.1:8080
へはアクセスできません。(MySQLの場合172.30.0.1
でアクセスできる)
$ curl -i http://172.30.0.1:8080
curl: (28) Failed to connect to 172.30.0.1 port 8080: 接続がタイムアウトしました
MySQL
Windowsで立ち上げたMySQLサーバーへディストリビューションのMySQLクライアントからアクセスしてみます。
MySQLサーバーのインストール
Windows側なので割愛します。
bind_addressの設定は以下の通りです。
mysql> show variables like '%bind%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| bind_address | * |
| mysqlx_bind_address | * |
+---------------------+-------+
2 rows in set, 1 warning (0.03 sec)
データベースとユーザーの作成
> CREATE DATABASE IF NOT EXISTS sample_db
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci;
ディストリビューションからログインできるユーザーを作成します。
ディストリビューションのIPアドレスが固定ではないので、ホストをワイルドカードにしています。
> CREATE USER IF NOT EXISTS 'sample_user'@'%'
IDENTIFIED BY 'sample_pass'
PASSWORD EXPIRE NEVER;
> GRANT ALL ON sample_db.* TO 'sample_user'@'%';
> FLUSH PRIVILEGES;
MySQLクライアントのインストール
$ sudo apt install -y mysql-client
ログイン
ディストリビューションのMySQLクライアントからWindowsのMySQLサーバーへログインします。
ホストに172.30.0.1
または192.168.20.1
を指定します。
$ mysql -h 172.30.0.1 -u sample_user -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
etc
日本語化
[WSLのUbuntu環境を日本語化する] (https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html)を参考に日本語化します。
ロケールの設定
使用可能なロケールを確認
$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
ランゲージパックをインストール
$ sudo apt install -y language-pack-ja
インストール後の使用可能なロケールを確認
$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
ja_JP.utf8
ロケールをja_JP.UTF-8に設定
$ sudo update-locale LANG=ja_JP.UTF-8
ここで一旦exitして、再度ディストリビューションを開きます。
タイムゾーンをJSTに設定
$ sudo dpkg-reconfigure tzdata
日本語のmanページをインストール
$ sudo apt -y install manpages-ja manpages-ja-dev
Node.jsのインストール
さきにcurlをインストールします。
$ sudo apt install -y curl
Ubuntu 20.04 LTSにNode.jsをインストールする手順は[Ubuntuに最新のNode.jsを難なくインストールする] (https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)を参考にさせて頂きました。
インストールしたバージョンは下記の通りです。
$ node -v
v12.18.3
$ npm -v
6.14.6
Vue.jsのインストール
$ sudo npm install -g @vue/cli
$ vue -V
@vue/cli 4.4.6
プロジェクトを作成する
$ vue create hello-world
$ cd hello-world
$ npm run serve
DONE Compiled successfully in 3227ms
App running at:
- Local: http://localhost:8080/
- Network: http://172.30.11.30:8080/
Note that the development build is not optimized.
To create a production build, run npm run build.
Windows側のブラウザからhttp://localhost:8080/
またはhttp://172.30.11.30:8080/
へアクセスしてみます。