Windows10でWSLを使ってみる anchor.png

Windows10の目玉機能の一つにWSL(Windows Subsystem for Linux)がある。
WSLはWindows10でLinuxの実行環境を実現するサブシステムのこと。

Linuxプログラムからのシステムコール(APIやファイルアクセス要求など)をWindows APIに変換して実行することにより,Linuxのプログラムを実行可能にしているようだ。

wsl_linux_image01.png

今までWindowsマシンでLinuxを使用する場合は,以下のようなやり方で行っていた。

  • HDDなどのストレージに別のパーテーションを作成し,そこにLinuxをインストールしてOSを切り換えてブートする方法
    WindowsとLinuxを切り換えて使用するので,同時に使用するということは出来ない。
  • 仮想マシン環境を構築して,そこでWindowsとLinuxの2つのOSを同時に動かす方法
    WindowsとLinuxを同じPCで同時に動かすことが出来るが,仮想マシンにメモリー等のリソースを割り当てるために,PCには多くのリソース(メモリやストレージ)が必要になる。
    このため,コストや手間が結構かかってしまう。

つまり,なかなか手軽に利用するといった事が難しいわけです。

WSLを使うとそんなに多くのリソースをかけずにWindowsマシンでLinux(すべての機能ではないが)を動かして,同時に利用することが出来るようになる。

Page Top

WSLの仕組み anchor.png

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カーネルの機能と併用して処理が行われるようになる。

wsl_linux_image02.png

つまり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のファイルシステムに変換してファイルへのアクセスを行うが,この処理がかなり速度がかなり遅い。

WSLMSYS/MSYS2CygwinVirtual Machine
Windowsとの連携×
実行時の速度,メモリ使用効率×
Linuxバイナリの動作と互換性○(GUI/一部×)××
Page Top

WSLを用いたLinux環境の構築と利用 anchor.png

WSLを利用してLinux環境を使用してみる。

Page Top

WSLの有効化 anchor.png

WSLを利用するにはWSLを使えるようにWindows10の機能を有効にする必要がある。

  • 「コントロールパネル>プログラム>プログラムと機能」の画面左側にある「Windowsの機能の有効化または無効化」をクリックする
  • 「Windows Subsystem for Linux」にマークを入れてOKを押す
  • PCを再起動する

これで,WSLがWindows10で使用できるようになる。

Page Top

Linuxのインストール anchor.png

現在のWSLでは,なんらかのLinuxディストリビューションのインストールが必要になっている。(将来はWindowsにLinuxカーネルが搭載される予定なので,必要なくなるかもしれない。)

Microsoft StoreでLinuxを検索すると,インストールできるLinuxディストリビューションの一覧が表示される。
好きなディストリビューションを選択して使用できるが,今回はUbuntu 18.04 LTSにしてみる。入手をクリックするとインストールされる。

インストールされると,Ubuntuのルートディレクトリは以下の場所になる。

C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
Page Top

Ubuntuを起動 anchor.png

インストールしたUbuntuの起動は,スタートメニューでUbuntuを検索してクリックすれば起動される。

初回起動時は初期設定が行われるためなのか,結構時間がかかる(5~6分)。
初期設定が終わるとアカウントを作成する画面になる。好きなユーザー名/パスワードを入れるとそのアカウントが作成される。

これで,見慣れたbashの画面になる。

bash.png
Page Top

Ubuntuの環境設定等 anchor.png

パッケージ管理ツールaptのリポジトリを日本に変更しておく。
/etc/apt/source.listhttp://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
Page Top

GUIを使えるようにする anchor.png

WSLでインストール出来るUbuntu 18.0.4 LTSにはGUI環境は無い。これは,WSLではGUIがサポートされていないので動作しないから。
しかし,Windows10でX Windowsサーバーを動かして,WSLのLinuxアプリケーションからWindows10側のX ServerにGUIを表示させることは出来る。

XWindow構成.png

図はX Window System構成だが,今回はWorkstationマシンがWindows10マシンで,Remote MachineがWSLで動作しているUbuntuとなる。(両方とも同じPCで動いている)

この方法で,GUIを使えるようにしてみる。

Page Top

Windows10にX Serverをインストール anchor.png

WSLのGUIアプリを表示するために,Windows10にX Serverをインストールすることが必要になる。
昔からX ServerとしてASTEC-Xをインストールしているので,それをそのまま使用する。

フリーで使用できるWindowsのX Serverとしては,VcxSrvがあります。まだ,Windows10マシンにX Serverをインストールしていない場合は,このVcxSrvをインストールすればいいと思う。
上記の配布サイトからダウンロードしたインストーラーを実行して,VcxSrvをインストール出来る。
起動は,XLaunchアイコンをクリックする。

  • Select Display settingsでMultiple windowsを選択して,次へをクリック
  • Select how to start clientsでStart no clientを選択して,次へをクリック
  • Extra settings画面で,次へをクリック
  • 完了をクリック

Windows ファイアウォール絡みの表示が出るが,許可ボタンをクリックしておく。(まあ,同じマシン内の通信なのでキャンセルでも問題ないが・・・)

Page Top

X Windowを使用できるようにいくつかツールと日本語フォントをインストールする anchor.png

$ 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で表示して動作を確認してみる。

  • X ServerをWindowsで起動する
  • WSLのbashでxeyesを実行する
    $ xeyes
    目玉が表示されたらOK。
    xyes.png
Page Top

Windows10のフォントを使えるようにする anchor.png

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
Page Top

デスクトップ環境XFceのインストール(おすすめ) anchor.png

デスクトップ環境としてXFce(XFceは比較的軽いデスクトップ環境)をインストールしてみる。

$ sudo service dbus start
$ sudo apt install xfce4-terminal xfce4-session xfce4

インストールがうまく行ったら,以下のようにしてみる。

$ startxfce4

以下のようなデスクトップ画面が表示されればOK。

xfce4.png
Page Top

デスクトップ環境LXDEのインストール anchor.png

デスクトップ環境としてXFceではなくLXDE(LXDEは比較的軽いデスクトップ環境。)をインストールしてみる場合。

$ sudo service dbus start
$ sudo apt install lxde (or lubuntu-desktop)

インストールがうまく行ったら,以下のようにしてみる。

$ startlxde
Page Top

デスクトップ環境mateのインストール anchor.png

デスクトップ環境を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。

Page Top

日本語入力IMのインストール anchor.png

必要なパッケージをインストールする。日本語変換は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。

実際の日本語入力は,半角/全角キーを押すと日本語入力出来る。

Page Top

WSLの起動のしかたと管理 anchor.png

WSLでLinux(bash)を動かすには,いくつかの方法がある。

  • wsl.exeから起動する(管理者権限)
    wsl.exeを実行したディレクトリで,bashが起動される。
    wsl.exeは,C:\Windows\System32 にある。
    単に一つのコマンドのみを実行する場合は,
    wsl [command]
    のようにする。
  • bash.exeから起動する(管理者権限) bash.exeを実行したディレクトリで,bashが起動される。
    bash.exeは,C:\Windows\System32 にある。
    単に一つのコマンドのみを実行する場合は,
    bash -c [command]
    のようにする。複数のコマンド渡す場合は,クオーテーションでくくるようにする必要がある。
  • ubuntu1804.exeから起動する(ユーザー権限)
    exeの名前はインストールしたLinuxディストリビューションで違う名前のコマンドになる。
    ubuntu1884.exeがある場所は,C:\Users\<ユーザー名>\AppData\Local\Microsoft\WindowsApps ディレクトリにインストールされている。 Ubuntu上のホームディレクトリで,bashが起動される。
    単に一つのコマンドのみ実行する場合は,
    ubutnu1804 -c [command]
    とようにする。
Page Top

wslconfigコマンドでの管理 anchor.png

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でデフォルトを変更できる。

Page Top

WSLを利用するメリット anchor.png

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のメリットになっている。

Page Top

コンソールの文字色を見やすくする anchor.png

Windowsのコマンドプロンプトやコンソールアプリで使われているデフォルトの色だと,青なんかが暗くて見にくい。
Windows10だと,多少見やすい配色に変更されている。

だが,この新しい配色はWindows10をクリーンインストールした時にのみ変更されて,アップグレードでWindows10にした場合は前のままの色が使われる。
ComEmu等のターミナルエミュレータを使用すれば良いのだが,コマンドプロンプトなどの色を変更したい。

Page Top

専用ツールを使用する方法 anchor.png

コマンドプロンプトの色設定は,以下のツールでテンプレートからサクッと変えることが出来ちゃいます。
Introducing the Windows Console Colortool

Page Top

レジストリエディタを使って変更する方法 anchor.png

レジストリエディタregeditで,変更することも出来ます。

  • Windows + R キーで,regeditと入れOKボタンを押す
  • HKEY_CURRENT_USER\Console キーをクリックする
  • ColorTable00からColorTable15を変更
    ColorTable00からColorTable15がdword型でコンソールアプリで使われるカラーパレット値が設定されているので,これを少し変更する。
    ColorTable01(暗い青)  :800000(R0/G0/B128) -> ff4221(R33/G66/B255)へ変更する。~
    ColorTable09(明るい青):ff0000(R0/G0/B255) -> ff8021(R33/G128/B255)へ変更する。~

これで,コマンドプロンプト(cmd.exe)やWSLのbashターミナルを起動した時のコンソールの青が明るい青で表示されるようになる。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 55, today: 1, yesterday: 0
Last-modified: 2023-01-15 (Sun) 10:16:18 (JST) (67d) by yuji