プロジェクト

全般

プロフィール

Windows Subsystem for Linuxの概要

Windowsのカーネルとサブシステム

現在のWindows OSのカーネルは、Windows NT系の発展で、当初(Windows NT 3.x)はマイクロカーネル方式の設計をしていました。Windows OSの主要機能は、Windowsサブシステムで実現されています。マイクロカーネル方式はオーバーヘッドが大きく性能が出にくいため、Windows NT 4.0以降ではグラフィックス機能などがカーネルに移されモノリシック方式に移行しています。しかし、カーネルとサブシステムによる構成はそのまま残っており、これがUNIX/Linuxサブシステムの追加を可能にしています。

UNIXサブシステム

過去、Windows Services for UNIX(SFU)というLinux環境をPOSIXサブシステム上で提供する機能がありました。その後継のSubsystem for Unix Application(SUA)もありました。Windowsサブシステムとは別のサブシステム上で動作するので、Windowsサブシステムの機能は利用できません。

このSFUやSUAはUNIXですがLinuxとは異なるものです。

Linuxサブシステム

Windows 10では2016年夏に新たにLinux環境を提供するWindows Subsystem for Linux(WSL)が開発者向け(ベータ版)として追加され、2017年秋のWindows 10更新から正式機能となりました。Windows OSの機能(サブシステム)としてのWSLと、Linux環境部分と2つに分かれて提供されており、後者はWindowsストアから好みのLinux環境(2017年10月末時点ではUbuntu、openSUSE、SUSE Enterprise Linuxの3つが提供、今後Fedoraが提供予定)を選択してインストールします。ELF64形式のバイナリファイルをそのまま実行し、LinuxカーネルへのシステムコールをWindows NTカーネルへの呼び出しに変換します。
ファイルシステムは、NTFS上にLinuxの属性を追加するVoIFsと、Windows側のファイルシステムを参照するDriveFxが用意されています。

参考

https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/

WSL 2 におけるLinuxカーネル

2020年にリリースされたWSL 2は、これまでのWSLとは異なり、仮想マシン上にLinuxカーネルを置く構造になりました。
仮想マシンはHyper-V ハイパーバイザー上で動作する軽量LinuxユーティリティVMで、Linuxカーネル(WSL2パッチ)が動作します。
この軽量LinuxユーティリティVM上にWSL2のLinuxディストリビューションのユーザーランドが動く構造です。

Hyper-V仮想マシンは従来はWindows 10のHomeエディションではサポートされていませんでしたが、WSL2の仮想マシンはHomeエディションでもサポートされています。

軽量といえども仮想マシンとなるので、Windowsカーネルとは別にLinuxカーネルが動作し、ネットワーク的にも別マシンとして扱われます。

インストール/アンインストール

WSL の有効化

  • [スタートメニュー]を右クリック > [アプリと機能] で下側にある [プログラムと機能]をクリック、左側ペインの[Windowsの機能の有効化または無効化]をクリック
  • [Windows Subsystem for Linux]にチェックを付け、[OK]をクリック
  • インストールが実行、終わったら[今すぐ再起動]ボタンをクリック

WSL 2の有効化

WSLの有効化に加えて、

  • [スタートメニュー]を右クリック > [アプリと機能] で下側にある [プログラムと機能]をクリック、左側ペインの[Windowsの機能の有効化または無効化]をクリック
  • [仮想マシンプラットフォーム]にチェックを付け、[OK]をクリック
  • インストールが実行、終わったら[今すぐ再起動]ボタンをクリック

Linuxディストリビューションの選択

Linuxディストリビューションは、Microsoft Storeで配布されています。Windows Subsystem for Linux上で実行できるLinuxディストリビューションは2020-06-07時点で次です。

  • Ubuntu 18.04 LTS / 20.04 LTS
  • Alpine WSL
  • openSUSE Leap 15-1
  • SUSE Linux Enterprise Server 15 SP1
  • Debian GNU/Linux
  • Kali Linux

Fedoraは有償版がMicrosoft Storeで販売されています。

Linuxディストリビューションのインストール

openSUSE Leap 42 のインストール

本項の記述は少し古い openSUSE Leap 42 をインストールした時の記録です。

ストア上で、[openSUSE Leap 42]をクリックします。次に[入手]をクリックします。「複数のデバイスで使用する」ダイアログが出たら、とりあえず[必要ありません]をクリックして進めました。ダウンロードが終了すると、[起動]ボタンが出るのでクリックします。コマンド画面が表示され、

Installing, this may take a fiew minutes...

しばらくすると

Installation successful!
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: charlie

とユーザーアカウント名を聞いてくるので、Linuxで使用するユーザー名を入力します。

New password: ********
Retype new password: ********
passwd: password updated successfully
Use same password for root user? 
Type "y" to approve, any other key to reject: y

パスワードを入力します。確認のためもう一度入力します。また、rootユーザーのパスワードを同一のものとするか聞いてきます。

Default UNIX user set to: charlie
charlie@myhost:~>

Linux(bash)プロンプトが表示されます。スタートメニューの中に、[openSUSE Leap 42]が追加され、これを起動するとbashコマンドプロンプトが表示されます。

Linuxディストリビューションのアンインストール

T.B.D.

インストールディレクトリ

LinuxディストリビューションはWindowsストアアプリケーション形式なので、インストールされるディレクトリは、インストール作業を実施したWindowsユーザー固有のディレクトリとなります。openSUSEの場合、次のディレクトリでした。

Linuxディストリビューションのインストール先

C:\Users\<ユーザー名>\AppData\Local\Packages\46932SUSE.openSUSELeap42.2.022rs5jcyhyac

Linuxのルートディレクトリは、この下の LocalState\rootfs\ になります。この下に、bin、boot、dev、etc、home、・・・とLinuxディストリビューションのディレクトリが並びます。

WSLのコンソールを起動するWindowsコマンド

C:\Users\<ユーザー名>\AppData\Local\Microsoft\WindowsApps\46932SUSE.openSUSELeap42.2.022rs5jcyhyac

このディレクトリの下に、openSUSE-42.exe ファイルが置かれています。

設定

WSL

複数ディストリビューションの管理

一覧の表示
C:\>wslconfig /list
Windows Subsystem for Linux ディストリビューション:
openSUSE-42 (既定)
openSUSE-Leap-15
規定のディストリビューションを変更
C:\>wslconfig /setdefault openSUSE-Leap-15

C:\>wslconfig /list
Windows Subsystem for Linux ディストリビューション:
openSUSE-Leap-15 (既定)
openSUSE-42

OpenSUSE Leap

ホスト名

デフォルトでは、コンピュータ名がホスト名になっています。

~$ hostname
NUBIUM

~$ sudo vi /etc/hosts

192.168.1.23 nubium

/etc/hosts に、ホスト名とIPアドレスを記載します。

リポジトリを日本のサーバーに変更

/etc/apt/sources.list を修正

-deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
-deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
-deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse
-deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
+deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty main restricted universe multiverse
+deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-updates main restricted universe multiverse
+deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-backports main restricted universe multiverse
+deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-security main restricted universe multiverse

リポジトリ情報をapt updateで更新し、パッケージのアップデートをapt upgradeで実施します。

~$ sudo apt update
~$ sudo apt upgrade

制約

ファイルシステム

WSL管理下のファイルシステムをWindows側からいじる

  • WSL管理下のファイルシステム上にWindows側からディレクトリ・ファイルを作成しても、WSL側からは見えない
    • WSL側でファイルシステムをキャッシュしているので外からの変更は可視にならないようです。
    • すべてのWSLコンソールを閉じて再度開くとファイルシステムのキャッシュが更新されるので可視になりますが、パーミッションが付いていません。

WSLのファイルシステム

WSLには、次の2つのファイルシステムがあります。

  • VolFs(lxfs)
    WSL上で、Linuxディストリビューションがインストールされるファイルシステム
  • DrvFs
    NTFS上のファイルシステムでLinuxからWindowsのファイルにアクセスする際使われる

ここに、WslFsが登場しました。WslFsはlxfsを置き換えるものですが、有意な差が何かはよく分からず今後の調査事項です。

雑記

コマンドプロンプト

Cmder を使う

デフォルトのコンソールはほぼコマンドプロンプトなので使い勝手がよくないので、いろいろ探してみたときに、タブ対応もするコマンドプロンプト互換なツールCmderを見つけました。
http://cmder.net/

設定をしていない場合、CmderはWindowsのコマンドプロンプト(cmd.exe)がデフォルトです。コマンドwslを実行すると、WSLのデフォルトディストリビューションのbashが実行されます。

Windowsのドライブを参照する

Windowsのシステムドライブ(Cドライブ)以外のドライブ

デフォルトでは、Windowsのシステムドライブ(Cドライブ)が、/mnt/c にマウントされています。それ以外のドライブがある場合、WSL側から参照するにはmountを実行します。以下はDドライブ(NTFS)をマウントする例です。

~$ sudo mkdir /mnt/d
~$ sudo mount -t drvfs D: /mnt/d

CentOS 7 をWSLで動かす補足

WSLでCentOSが利用できたかも?

の補足メモ

WSL上のCentOS 7にSSH接続する

sshdを起動しSSH接続を受け付けるようにします。

  • openssh-server のインストール
  • systemctl をCentOS 7標準からdocker対応のモノに差し替え
    次のgithubで公開されているsystemctl.pyを/usr/bin/systemctl と差し替え
    https://github.com/gdraheim/docker-systemctl-replacement
  • ホストのSSH鍵生成(sudo ssh-keygen -A)
  • 差し替えたsystemctlでsshdを登録(enable)&起動(start)
参考ブログ