プロジェクト

全般

プロフィール

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/

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

ベータ版(Bash on Windows)

ベータ版での機能の有効化、インストール、アンインストールの記述です。

機能の有効化

  • [スタートメニュー]を右クリック > [プログラムと機能]で、左側ペインの[Windowsの機能の有効化または無効化]をクリック
  • [Windows Subsystem for Linux (Beta)]にチェックを付け、[OK]をクリック
  • インストールが実行、終わったら[今すぐ再起動]ボタンをクリック
  • 再起動後、[スタートメニュー] > [設定] > [更新とセキュリティ]で、左側ペインの[開発者向け]を選択、右側ペインの[開発者モード]にチェックを付け

インストール

管理者権限でコマンドプロンプトを起動し、以下を実行します。(以下はベータ版のときの結果)

C:\WINDOWS\system32>lxrun /install
-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください:
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: torutk
新しい UNIX パスワードを入力してください: ********
新しい UNIX パスワードを再入力してください: ********
passwd: password updated successfully
インストールが正常に終了しました

インストール先は、%LOCALAPPDATA%\lxss のようです。隠しフォルダになっています。

アンインストール

管理者権限でコマンドプロンプトを起動し、以下を実行します。

C:\> lxrun /uninstall /full
警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。
ディストリビューションは次の Windows ストアを訪問してインストールすることができます:
https://aka.ms/wslstore

これにより Windows 上の Ubuntu がアンインストールされます。
Ubuntu 環境および次の項目を除くすべての変更内容と新しいアプリケーションが削除されます。
続行するには、"y" を入力してください: y

C:\Users\torutk\AppData\Local\lxss\home
C:\Users\torutk\AppData\Local\lxss
oot

続行するには、"y" を入力してください:
アンインストールしています...

C:\>

アンインストールがうまくいかない場合(例えば次のメッセージが表示)

windows subsystem for linux でインストール、アンインストール操作が保留中です。

再起動して上述コマンドを実行します。
それでもダメな場合、[プログラムと機能] > [Windowsの機能の有効化または無効化]から[Windows Subsystem for Linux]のチェックを外し、再起動してから、インストール先のフォルダ(%LOCALAPPDATA%\lxss)を削除します。
インストール先のフォルダは隠し属性が付いているのでコマンド(rd /s %LOCALAPPDATA%\lxss)で削除しました。

Windows 10 1709

機能の有効化

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

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

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

  • Ubuntu
  • openSUSE Leap 42
  • SUSE Linux Enterprise Server 12
  • Debian GNU/Linux
  • Kali Linux

メモ)Microsoft Storeで検索欄にLinuxを入れて検索、「C:\> Linux on Windows? 本当です。」の表示が出たら[アプリを入手する]をクリック、すると、利用可能なディストリビューションが表示されます。

Fedoraは未だにリリースされていません。Red Hat系に慣れた身ではSUSEがよさそうです。ということで、openSUSEをストアからインストールすることにします。

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

ストア上で、[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 ファイルが置かれています。

設定

ホスト名

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

~$ 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コンソールを閉じて再度開くとファイルシステムのキャッシュが更新されるので可視になりますが、パーミッションが付いていません。

雑記

コマンドプロンプト

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

Windowsのドライブを参照する

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

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

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

クリップボードから画像を追加 (サイズの上限: 1 GB)