Windows10の目玉機能の一つにWSL(Windows Subsystem for Linux)がある。
WSLはWindows10でLinuxの実行環境を実現するサブシステムのこと。
Linuxプログラムからのシステムコール(APIやファイルアクセス要求など)をWindows APIに変換して実行することにより,Linuxのプログラムを実行可能にしているようだ。
今までWindowsマシンでLinuxを使用する場合は,以下のようなやり方で行っていた。
つまり,なかなか手軽に利用するといった事が難しいわけです。
WSLを使うとそんなに多くのリソースをかけずにWindowsマシンでLinux(すべての機能ではないが)を動かして,同時に利用することが出来るようになる。
WSLはPicoプロセスと呼ばれる実行環境の中でLinux環境を使用出来るようにしているが,その処理の流れは以下のようになっている。
Linuxアプリを実行するには,まずLinuxアプリが実行できる環境を用意する必要がある。
ユーザーモードのWindows環境側のWin32プロセスでwsl.exe(またはbash.exe)を起動すると,LX Session manager serviceを実行するようにリクエストされる。
LX Session manager serviceは,Linuxのプログラム(/bin/bash)の動作環境を用意するためにカーネルモードにあるLXCore/LXSSを呼び出している。
LXCore/LXSSはLinuxのカーネル機能を提供するもので,これによりPicoプロセスが生成される。Picoプロセスは,通常のLinuxと同様にinitが起動されて/bin/bashが起動するようになっている。
起動した/bin/bashは,LXCore/LXSSへのシステムコールによりWindowsカーネルの機能と併用して処理が行われるようになる。
つまりLXCore/LXSSは,機能が限定されたLinuxのシステムコールをWindowsで処理できるようにするエミュレーションプログラムになっている。
このため,全てのLinuxの機能が使えるわけではなくエミュレーションしている機能のみが使える。
しかし,仮想マシンのようにOSから全ての環境を用意するわけではないのと,サポートするAPI機能は限定的なものなので,非常に高速に動作すると思われる。動くプログラムは限定的ではあるがLinuxバイナリがそのままで動作することが利点です。
APIの提供ということではCygwinと似ているが,CygwinではDLLによるPosixのWindows APIへの変換・足りないAPIの追加を行い,完全なPosixサポートを行っているため,WSLに比べ遥かに重くなるのとLinuxバイナリをそのまま動かせるわけでは無い。
また多くのPosixコマンドが使えるという意味ではMSYS/MSYS2があるが,MSYS/MSYS2はあくまでWindowsのアプリケーションを実行していてLinuxのアプリケーションを実行しているのではないのが大きな違い。
WSLではLinuxのファイルシステムは使えないのでWindowsのファイルシステムに変換してファイルへのアクセスを行うが,この処理がかなり速度がかなり遅い。
WSL | MSYS/MSYS2 | Cygwin | Virtual Machine | |
Windowsとの連携 | ○ | ◎ | ◎ | × |
実行時の速度,メモリ使用効率 | ○ | ◎ | △ | × |
Linuxバイナリの動作と互換性 | ○(GUI/一部×) | × | × | ◎ |
WSLを利用してLinux環境を使用してみる。
WSLを利用するにはWSLを使えるようにWindows10の機能を有効にする必要がある。
これで,WSLがWindows10で使用できるようになる。
現在のWSLでは,なんらかのLinuxディストリビューションのインストールが必要になっている。(将来はWindowsにLinuxカーネルが搭載される予定なので,必要なくなるかもしれない。)
Microsoft StoreでLinuxを検索すると,インストールできるLinuxディストリビューションの一覧が表示される。
好きなディストリビューションを選択して使用できるが,今回はUbuntu 18.04 LTSにしてみる。入手をクリックするとインストールされる。
インストールされると,Ubuntuのルートディレクトリは以下の場所になる。
C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
インストールしたUbuntuの起動は,スタートメニューでUbuntuを検索してクリックすれば起動される。
初回起動時は初期設定が行われるためなのか,結構時間がかかる(5~6分)。
初期設定が終わるとアカウントを作成する画面になる。好きなユーザー名/パスワードを入れるとそのアカウントが作成される。
これで,見慣れたbashの画面になる。
パッケージ管理ツールaptのリポジトリを日本に変更しておく。
/etc/apt/source.listの http://archive.ubuntu.com を, http://jp.archive.ubuntu.com に変更してみた。
$ cd /etc/apt $ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list
パッケージ管理ツールaptを使って,Ubuntuの更新をする。
$ sudo apt update $ sudo apt upgrade
ユーザーのホームディレクトリを変更してみた。
これはデフォルトのホームディレクトリが長いパスの場所になっているので,移動しやすいところに変更したいから。
/etc/passwdファイルを,
yuji:x:1000:1000:,,,:/home/yuji:/bin/bash ↓ yuji:x:1000:1000:,,,:/mnt/d/home/yuji_wsl:/bin/bash
のように変更した。
日本語環境をインストールして,ロケールを日本語(ja_JP.UTF-8)に変更する。
$ sudo apt install language-pack-ja $ sudo update-locale LANG=ja_JP.UTF-8
これで,再ログインするとメッセージなんかが日本語になる。
タイムゾーンを,日本(JST)にする。
$ sudo dpkg-reconfigure tzdata
アジア/東京に設定した。
日本語マニュアルを,インストールしておく。
$ sudo apt install manpages-ja manpages-ja-dev
WSLでインストール出来るUbuntu 18.0.4 LTSにはGUI環境は無い。これは,WSLではGUIがサポートされていないので動作しないから。
しかし,Windows10でX Windowsサーバーを動かして,WSLのLinuxアプリケーションからWindows10側のX ServerにGUIを表示させることは出来る。
図はX Window System構成だが,今回はWorkstationマシンがWindows10マシンで,Remote MachineがWSLで動作しているUbuntuとなる。(両方とも同じPCで動いている)
この方法で,GUIを使えるようにしてみる。
WSLのGUIアプリを表示するために,Windows10にX Serverをインストールすることが必要になる。
昔からX ServerとしてASTEC-Xをインストールしているので,それをそのまま使用する。
フリーで使用できるWindowsのX Serverとしては,VcxSrvがあります。まだ,Windows10マシンにX Serverをインストールしていない場合は,このVcxSrvをインストールすればいいと思う。
上記の配布サイトからダウンロードしたインストーラーを実行して,VcxSrvをインストール出来る。
起動は,XLaunchアイコンをクリックする。
Windows ファイアウォール絡みの表示が出るが,許可ボタンをクリックしておく。(まあ,同じマシン内の通信なのでキャンセルでも問題ないが・・・)
$ sudo apt install x11-apps x11-utils x11-xserver-utils dbus-x11 fonts-ipafont
Xアプリから接続するX Serverを指定するために環境変数をセットする。
$ echo 'export DISPLAY=localhost:0.0' >> ~/.bash_profile $ source ~/.bash_profile
試しにxeyesを実行して,Windows側のX Serverで表示して動作を確認してみる。
$ xeyes
Windows10にインストールされているフォントを,wslのLinuxで使えるようにする。
まず,fontconfigをインストールする。
$ sudo apt install fontconfig
Windowsにインストールされているfontを,Ubuntuから参照できるようにする。
$ sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/windows $ sudo fc-cache -fv
デスクトップ環境としてXFce(XFceは比較的軽いデスクトップ環境)をインストールしてみる。
$ sudo service dbus start $ sudo apt install xfce4-terminal xfce4-session xfce4
インストールがうまく行ったら,以下のようにしてみる。
$ startxfce4
以下のようなデスクトップ画面が表示されればOK。
デスクトップ環境としてXFceではなくLXDE(LXDEは比較的軽いデスクトップ環境。)をインストールしてみる場合。
$ sudo service dbus start $ sudo apt install lxde (or lubuntu-desktop)
インストールがうまく行ったら,以下のようにしてみる。
$ startlxde
デスクトップ環境をXFceやLXDEではなくmateにする場合。
$ sudo service dbus start $ sudo apt install ubuntu-mate-desktop mate-desktop-environment mate-common mate-core
mate-sessionがうまく動作しなかったのでXDMCP経由でログインする方法にしてみる。
LightDMの/etc/lightdm/lightdm.confを作成する。
[LightDM] start-default-seat=false [XDMCPServer] enabled=true port=177
lightdmデーモンを起動する。
$ sudo service lightdm start
X ServerをXDMCPで接続するように設定して,実行する。
connect host: 127.0.0.1
ログイン画面が出ればOK。
必要なパッケージをインストールする。日本語変換はmozc(Google日本語入力)を使ってみる。
$ sudo apt install fcitx fcitx-mozc $ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"
machine-idに生成したUUIDを書き込む。
一度,ログアウトする。
再度,WSLのubuntuにログインして,以下の環境変数を.profileまたは.bashrcに追加する。
export GTK_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export QT_IM_MODULE=fcitx export DefaultIMModule=fcitx
fcitx-autostartを実行する。
$ xset -r 49 $ fcitx-autostart Fcitx is running correctly
と表示される。または,
I/O warning : failed to load external entity "/usr/share/X11/xkb/rules/xorg.extras.xml"
と表示されるかもしれないが,warningは気にしない。
もし,
Connection Error (Failed to connect to socket /tmp/dbus-XXXXXXXXXX: Connection refused)
のようなエラーになったら,再度fcitxを起動してみる。
$ killall fcitx $ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id" $ fcitx-autostart
日本語入力のOn/Offキー設定をする。
$ fcitx-config-gtk3
と実行する。一覧にmozcがなかったら,+ボタンでmozcを追加する。
次に,全体の設定タブで,「入力メソッドのオンオフ」で半角/全角キーを押してZenkakuhankakuを指定する。
「入力メソッド起動のその他のキー」は,無効を指定する。
これで日本語入力の設定はOK。
実際の日本語入力は,半角/全角キーを押すと日本語入力出来る。
WSLでLinux(bash)を動かすには,いくつかの方法がある。
wsl [command]
bash -c [command]
ubutnu1804 -c [command]
WSL環境に複数のLinuxディストリビューションを入れたときなどの管理に,wslconfig.exeが使用できる。
wslconfig.exeは,C:\Windows\System32 にある。実行には管理者権限が必要。
コマンドプロンプトを管理者権限で起動してみる。
C:\WINDOWS\system32> wslconfig Windows Subsystem for Linux の管理操作を実行します 使用法: /l, /list [Option] 登録されているディストリビューションを一覧表示します。 /all - 現在インストール中またはアンインストール中のものを含めて、すべての ディストリビューションを一覧表示します (オプション)。 /running - 現在実行中のディストリビューションのみを一覧表示します。 /s, /setdefault <ディストリビューション名> ディストリビューションを既定として設定します。 /t, /terminate <ディストリビューション名> ディストリビューションを終了します。 /u, /unregister <ディストリビューション名> ディストリビューションの登録を解除します。 /upgrade <ディストリビューション名> ディストリビューションを WslFs ファイル システム形式にアップグレードします。
wsl.exeやbash.exeだと,デフォルト設定されているLinuxディストリビューションが起動されるようになっている。
複数のLinuxディストリビューションをインストールした場合,wslconfig.exeでデフォルトを変更できる。
WSLのメリットは,複数のPCで構成されていた環境を1台のPCで実現できるところ。
Windowsマシンで不得意だった作業も,Linux環境で行うことで効率よく作業ができる。
プログラムなどの開発環境としては,やはりLinux環境の方が圧倒的に優れている。各種アセンブリ言語,C/C++,Ada,Java,Fortran,Perl,Python,Ruby,PHPなどといった多くの言語環境がサポートされており,それに対応する膨大なライブラリなどのミドルウェアもほとんどが無償で提供されている。
また,IoT分野なんかに限らず多くの製品・機器では,Linuxが組み込まれて製品化されている。
WindowsマシンでLinux環境を利用するには,WSL以外にも仮想マシンでのLinux起動や,CygwinによるPosixエミュレーション,MinGWによるbash等各種ツールの実行環境などでも実現出来る。
WSLでは制限された機能ではあるが,実に手軽にLinux環境を使用することが出来ます。この手軽さこそがWSLのメリットになっている。
Windowsのコマンドプロンプトやコンソールアプリで使われているデフォルトの色だと,青なんかが暗くて見にくい。
Windows10だと,多少見やすい配色に変更されている。
だが,この新しい配色はWindows10をクリーンインストールした時にのみ変更されて,アップグレードでWindows10にした場合は前のままの色が使われる。
ComEmu等のターミナルエミュレータを使用すれば良いのだが,コマンドプロンプトなどの色を変更したい。
コマンドプロンプトの色設定は,以下のツールでテンプレートからサクッと変えることが出来ちゃいます。
Introducing the Windows Console Colortool
レジストリエディタregeditで,変更することも出来ます。
ColorTable01(暗い青) :800000(R0/G0/B128) -> ff4221(R33/G66/B255)へ変更する。~ ColorTable09(明るい青):ff0000(R0/G0/B255) -> ff8021(R33/G128/B255)へ変更する。~
これで,コマンドプロンプト(cmd.exe)やWSLのbashターミナルを起動した時のコンソールの青が明るい青で表示されるようになる。
新しくコメントをつける