プロジェクト

全般

プロフィール

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カーネルが動作し、ネットワーク的にも別マシンとして扱われます。

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

Windows 10

WSL(WSL 1)の有効化

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

WSL 2の有効化

WSLの有効化に加えて、

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

WSL 2では、Hyper-Vを活用したコンテナ環境で動作するため、Hyper-Vの機能および仮想マシンプラットフォームを有効にします。

Windows 11(WSL 2)

Windows 11は標準でwslコマンドを搭載しているので、wslコマンドでユーザーランドのLinuxディストリビューションをインストール可能です。

  • 管理者権限でWindowsターミナルを起動
  • オンラインで提供されるLinuxディストリビューションの一覧を見る
    > wsl --list --online
    インストールできる有効なディストリビューションの一覧を次に示します。
    既定の分布は ' * ' で表されます。
     'wsl --install -d <Distro>'を使用してインストールします。
    
      NAME                                   FRIENDLY NAME
    * Ubuntu                                 Ubuntu
      Debian                                 Debian GNU/Linux
      kali-linux                             Kali Linux Rolling
      Ubuntu-18.04                           Ubuntu 18.04 LTS
      Ubuntu-20.04                           Ubuntu 20.04 LTS
      Ubuntu-22.04                           Ubuntu 22.04 LTS
      OracleLinux_7_9                        Oracle Linux 7.9
      OracleLinux_8_7                        Oracle Linux 8.7
      OracleLinux_9_1                        Oracle Linux 9.1
      openSUSE-Leap-15.5                     openSUSE Leap 15.5
      SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
      SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
      openSUSE-Tumbleweed                    openSUSE Tumbleweed
    

初回のインストール

最初にWSL 2を使用するときは、OSの機能の有効化を伴うため、インストールの途中で再起動が要求されます。

PS > wsl --install -d Ubuntu
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Ubuntu
Ubuntu はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要が あります。

再起動すると、自動でターミナルが起動されます。

Ubuntu は既にインストールされています。
Ubuntu を起動しています...
Installing, this may take a few minutes...
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: torutk
New password: xxxxxxxxxxxx
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This message is shown once a day. To disable it please create the
/home/torutk/.hushlogin file.

WSLの更新

wslコマンドにupdateオプションを指定して更新します。
更新後のバージョンは、version オプションを指定して確認可能です。

C:\Users\torutk> wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

PS > wsl --version
WSL バージョン: 2.0.9.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
MSRDC バージョン: 1.2.4677
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.2861

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.

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

WSLのLinuxディストリビューションのインストールディレクトリは、インストール作業を実施したWindowsユーザー固有のディレクトリとなります。レジストリを調べて確認できます。

PS2> Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss

インストール時にはディレクトリを指定することができませんが、インストール後にLinuxイメージをエクスポートし、別なディレクトリにインポートする方法はあります。

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

OpenSUSEの場合の例です。

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 ファイルが置かれています。

Ubuntu のインストール

C:\Users\torutk> >wsl --install ubuntu-22.04
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
Installing, this may take a few minutes...
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: torutk
New password: **********
Retype new password: **********
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This message is shown once a day. To disable it please create the
/home/torutk/.hushlogin file.

ディストリビューション一覧の確認

C:\Users\torutk> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

ログインユーザーの設定

デフォルトでは、rootユーザーでログインする設定となっています。

変更:

設定

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 1の記述を表示

WSLのLinux側からWindowsのディレクトリにアクセス

WSL2のLinuxでは、/mnt/c でWindowsのCドライブがアクセス可能です。Dドライブ等があれば、/mnt/d にマウントされます。

Windows側からWSLのLinuxのディレクトリにアクセス

ネットワークフォルダとして、\\wsl$の下にディストリビューションフォルダが存在し、その下にLinuxのディレクトリが存在します。
Windows file explorer $wsl

Windows file explorer $wsl Ubuntu-22.04

Windows 11では、File explorerの左ペインに、[Linux]が表示され、その下にOS名が表示され、中に入るとLinuxファイルシステムをFile Explorerで参照できます。

雑記

コマンドプロンプト

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)
参考ブログ


3ヶ月前に更新