IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第21回 WSL2に触ろう (宮崎悟) 2020年8月

前回は、bashの履歴の展開の応用編について説明しました。今回は5月末にリリースされたWSL2について説明します。

WSL2とは

WSL(Windows on Linux)は、Linuxカーネルへの命令をWindowsカーネルに変換して伝える仕組みで動作します。ネットワークがWindowsと同じものを使用し、/ パーティション を wsl ファイルシステムという仮想的なファイルシステムでマウントしています。

Linuxカーネルを持たないことから、ネットワークコマンドの一部が使用できない、カーネルモジュールに関わるコマンドを使用できないという問題がありました。

WSL2では、Windows10 2020 May Updateから追加された機能「仮想マシン プラットフォーム」という軽量の仮想マシンを使用してLinuxカーネル(どのディストリビューションでも共通のもの)を動作します。このため、いくつかの違いが発生します。

  • 独自カーネル
    • 4.19.104-microsoft-standard を使用する
    • カーネルイメージをWSL上に持たない
  • 独自のネットワーク
    • WSL用のブリッジネットワークが作成され、WSLはブリッジ経由で外部とネットワーク接続
    • WSLのディストリビューション単位で、ネットワークサービス(httpd、sshdなど)をそれぞれ起動可能
  • ファイルシステムの変更
    • rootのファイルシステムがext4となり、WindowsのファイルシステムNTFSとは別物
    • Windowsのドライブは、drvfsから9pfs(Plan9 ベース仮想マシン)
    • \wsl$\ディストリビューション名 で、WSLホストのrootファイルシステムをWindowsからネットワークアクセス可能
WSL2 への移行

現在使用中のWSLを、そのままWSL2へ移行可能です。

  1. Windowsアップデートを行い、Windows 2020 Mayを適用(何度か再起動を繰り返す)

  2. 管理者権限のあるPowerShell もしくは cmd.exe を起動し以下のコマンドを実行し、「Linux 用 Windows サブシステム」と「仮想マシン プラットフォーム」を有効にする

    > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    > dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. WSL 2 Linux カーネルの更新」の手順通り、x64 マシン用の最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードし、パッケージを実行してインストールする

  4. 再起動を実施し、管理者権限のあるPowerShellもしくはcmd.exeを実行する

  5. 現在の状況を確認する

    PS C:\WINDOWS\system32> wsl.exe -l -v
      NAME            STATE           VERSION
    * Ubuntu-18.04    Running         1
      Ubuntu-16.04    Running         1
  6. wsl.exeを使用して、指定ディストリビューションのバージョンを2に変更する

    PS C:\WINDOWS\system32> wsl.exe --set-version Ubuntu-18.04 2

Ubuntu-18.04を起動すると、WSL2になっています。

WSL2の変更事項の確認

では、実際にディストリビューションを起動し、WSL2で変更になったことを確認しましょう。

$ mount
/dev/sdc on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
tmpfs on /mnt/wsl type tmpfs (rw,relatime)
tools on /init type 9p (ro,relatime,dirsync,aname=tools;fmask=022,loose,access=client,trans=fd,rfd=6,wfd=6)
none on /dev type devtmpfs (rw,nosuid,relatime,size=52715152k,nr_inodes=13178788,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620,ptmxmode=000)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether e2:1d:71:66:f2:db brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c2:9c:8d:b0:5e:f8 brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:83:10:8e brd ff:ff:ff:ff:ff:ff
    inet 172.31.194.177/20 brd 172.31.207.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe83:108e/64 scope link
       valid_lft forever preferred_lft forever
5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
$ uname -r
4.19.104-microsoft-standard

root ファイルシステムがext4になっていること、ネットワークがWindowsのネットワークとは異なること、カーネルバージョンの変更が分かります。

また、PowerShell側でも、WSL2のファイルシステムにアクセスできることが分かります。

PS C:\Users\User> cd \\wsl$\Ubuntu-18.04
PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Ubuntu-18.04> ls
    ディレクトリ: \\wsl$\Ubuntu-18.04
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2020/06/14     17:24                home
d-----        2020/04/17      0:52                srv
d-----        2020/07/03      8:23                etc
d-----        2020/06/15     22:26                opt
d-----        2020/06/14     17:24                root
d-----        2020/06/15     19:14                lib
d-----        2020/06/18     14:28                mnt
d-----        2020/04/17      0:52                usr
d-----        2020/04/17      0:52                media
d-----        2020/04/17      0:52                lib64
d-----        2020/07/03      8:23                sys
d-----        2020/07/03      8:25                dev
d-----        2020/06/15     19:47                sbin
d-----        2020/04/17      1:06                boot
d-----        2020/06/15     19:47                bin
d-----        2020/07/05     13:28                run
d-----        2020/07/03      8:23                proc
d-----        2019/10/30     21:17                snap
d-----        2020/07/05     13:31                tmp
d-----        2020/06/15     22:26                var
d-----        2019/04/11      1:35                lost+found
------        2020/06/13     19:01         631968 init
PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Ubuntu-18.04>
おわりに

今回は、WSL 2 と WSL2へ移行する手順について説明しました。ユーザランドを使用するだけならWSLで問題ありませんが、今後何らかのサービスを起動するためにはWSL2の方が有利でしょう。次回はWSL2の補足事項と、WSL2でサービスを動かす方法を説明します。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes