Windows Server 2019のWSLにUbuntu18.04をインストール

タイトル通り，Windows Server 2019上のWSL (Windows Subsystem for Linux)でUbuntu18.04を使えるようにした際の備忘録です．
[Windows Server 2019でWSLやHyper-V上のUbuntu18.04にCUDA環境を構築しようとして断念](https://qiita.com/fararrow/items/5f9eb1e4386707c11b3c)
の，WSL部分(Ubuntuのインストール)です．

ほとんどの部分がWindows 10でも共通で，試しにWin10に入れてみた際のメモも所々にあります．

# はじめに
主に，Windows Serverならではの部分で

- [WSL を Windows Server 2019 にインストールする方法](https://qiita.com/mihochannel/items/669fa1e56f74b0a45161)
- [WSL その110 - Windows ServerでLinuxがインストール可能に・Windows Server 2016にUbuntuをインストールするには](https://kledgeb.blogspot.com/2017/08/wsl-110-windows-serverlinuxwindows.html)

を，設定周りで

- [WSL(ubuntu18.04)の初期設定](https://qiita.com/misosiru6655/items/218246c17d95fd12f5fb)

辺りを参考にインストールしました．
以降，Administratorで作業しているので元々管理者ですが，Windows 10でやるなら普通は権限付いてこないので管理者権限付きPowerShellで行なう必要あり．

# WSLの有効化
とりあえずTask ManagerのUserか

```powershell
> query user
```

で誰か使ってないか＆弄くり回して大丈夫か確認．

そして，

```powershell
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

でWSLを有効化．
GUIなら「役割と機能の追加ウィザード」の「機能」にある「Windows Subsystem for Linux」からでも良い．
(Win10のGUIならコントロールパネルの「プログラムと機能」の「Windowsの機能の有効化または無効化」)

```powershell
Path          :
Online        : True
RestartNeeded : False
```

というメモがあるので，おそらくサーバ自体の環境構築中に無意識にGUIでインストール済みだったと思われる．

そして，

```powershell
> Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

で

```powershell
FeatureName      : Microsoft-Windows-Subsystem-Linux
DisplayName      : Windows Subsystem for Linux
Description      : ネイティブなユーザー モードの Linux シェルおよびツールを Windows で実行するためのサービスと環境を提
                   供します。
RestartRequired  : Possible
State            : Enabled
CustomProperties :
                   ServerComponent\Description : ネイティブなユーザー モードの Linux シェルおよびツールを Windows で実
                   行するためのサービスと環境を提供します。
                   ServerComponent\DisplayName : Windows Subsystem for Linux
                   ServerComponent\Id : 1033
                   ServerComponent\Type : Feature
                   ServerComponent\UniqueName : Microsoft-Windows-Subsystem-Linux
                   ServerComponent\Deploys\Update\Name : Microsoft-Windows-Subsystem-Linux
```

のように「State: Enabled」ならOK．
いちいち確認しなくても，駄目なら[インストール時](#ubuntu1804のインストール)に怒られるのでわかりますが．


# Ubuntu18.04のインストールと設定

めちゃ簡単です．

## インストール

大抵の場合ググると「Microsoft Store(旧Windows Store)からサクッとインストール」な記事が出てきますが，Windows Serverにそんなものは無いので…

参考記事に従って [Ubuntu 18.04](https://aka.ms/wsl-ubuntu-1804) から「CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2018.817.0_x64__79rhkp1fndgsc.Appx」をDownload．
せっかくサクサク動くGUI付きサーバなので普通にブラウザで落としました．

そしてこれまたGUIでエクスプローラから探してzipとして解凍，中にある「ubuntu1804.exe」を実行．
ちなみにココはCUIからの実行でもGUIでのダブルクリックでも良いし管理者権限も要らない模様．
インストール自体はUNIX usernameとUNIX passwordを聞かれる程度で終了．

## 起動
wslと叩けば

```powershell
> wsl
$ 
```

Ubuntuのコンソールに突入．

起動方法は

- [WSL 起動方法の違いについて](https://qiita.com/mizutoki79/items/f6ba08b7f73133102c91)

こんな差があるそうですが，自分はwslとしか叩いてないです．
インストール中のコンソールはウィンドウのアイコンがUbuntuのマーク(ubuntu1804.exeのアイコン)だったけど，これを今後どう呼び出すのかは不明．~~Windows 10でMicrosoft Store経由ならどっかにショートカットとか出来上がるのかも？~~
→試しに1903なWin10の手元のノートへMicrosoft Store経由で入れてみたらスタートメニューに追加されてました．
![MicrosoftStore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/c479385f-e4bf-15e3-c9d4-e0b03b757533.png)
Microsoft Store，初めて触りました(^_^;)


## 初期設定

この後色々入れるため，参考記事に「ダウンロード速くなるよ」って書いてあったのでそのまま従って以下のようにRepositoryを日本サーバへ．

```shell-session
$ cd /etc/apt
$ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list
```

そのまま参考記事通りに更新と時刻設定．

```shell-session
$ sudo apt update && sudo apt upgrade -y
$ sudo dpkg-reconfigure tzdata
```

更新は日本サーバになっててもそれなりに時間がかかる．
タイムゾーンに関しては↓のように画面で「Asia→Tokyo」を選ぶだけ．
Japanとかは経由せずに地域→都市名(タイムゾーン)です．
![Area](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/c8677096-a948-7ae3-18b0-95b1f69c32ed.png)
![TimeZone](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/77c51556-5ff1-15de-8611-5f238203edd0.png)
ちゃんと設定されると

```shell-session
$ sudo dpkg-reconfigure tzdata

Current default time zone: 'Asia/Tokyo'
Local time is now:      Wed Jun 12 12:14:15 JST 2019.
Universal Time is now:  Wed Jun 12 03:14:15 UTC 2019.
```

こうなります．
→試しに1903なWin10にMicrosoft Store経由で入れた場合は初めからTokyoになっていました．

あとこれも参考記事通りに

```shell-session
$ sudo apt install build-essential
```

でgccとかをとりあえず入れておく．

ただ，nvidiaのドライバを手動で頑張って入れようとするとKernelのコンパイラバージョンと合わせるだの何だのが出てきて依存関係等々厄介な事になるので，そういう可能性があるならその辺も見越して自分で個別に入れていった方が良い．
(自分はココは解決したものの結局別の部分で断念した)
まぁ，そもそも使えないので関係ないのですが．


# WslFsへ

やってもやらなくても良いと思うけど，lxfs→wslfsな作業．
``--upgrade``オプションでいけます．

```shell-session
$ df -T
Filesystem     Type   1K-blocks      Used  Available Use% Mounted on
rootfs         lxfs   976197628 177239700  798957928  19% /
none           tmpfs  976197628 177239700  798957928  19% /dev
none           tmpfs  976197628 177239700  798957928  19% /run
none           tmpfs  976197628 177239700  798957928  19% /run/lock
none           tmpfs  976197628 177239700  798957928  19% /run/shm
none           tmpfs  976197628 177239700  798957928  19% /run/user
C:             drvfs  976197628 177239700  798957928  19% /mnt/c
D:             drvfs 1953497084   8864984 1944632100   1% /mnt/d
```

こんな感じでdefaultはlxfsで，

```powershell
$ exit
logout
> wslconfig /l
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)
> wslconfig /upgrade Ubuntu-18.04
```

とすると

```powershell
> wslconfig /upgrade Ubuntu-18.04
アップグレードしています...
アップグレードが正常に完了しました。
> wsl
$ df -T
Filesystem     Type   1K-blocks      Used  Available Use% Mounted on
rootfs         wslfs  976197628 177359424  798838204  19% /
none           tmpfs  976197628 177359424  798838204  19% /dev
none           tmpfs  976197628 177359424  798838204  19% /run
none           tmpfs  976197628 177359424  798838204  19% /run/lock
none           tmpfs  976197628 177359424  798838204  19% /run/shm
none           tmpfs  976197628 177359424  798838204  19% /run/user
C:             drvfs  976197628 177359424  798838204  19% /mnt/c
D:             drvfs 1953497084   9065128 1944431956   1% /mnt/d
```

という感じでwslfsになります．

ちなみに確認用に手元のWin10で同じ操作をやろうとしたら，

<details><summary>コマンドが無い！</summary><div>

```powershell:1803
> wslconfig --help
Linux 用 Windows サブシステムの管理操作を実行します

使用法:
    /l、/list [/all] - 登録されたディストリビューションを一覧表示します。
        /all - すべてのディストリビューションを一覧表示します (オプション)。
               現在インストールまたはアンインストール中のものも含まれます。
    /s、/setdefault <DistributionName> - 指定のディストリビューションを既定として設定します。
    /u、/unregister <DistributionName> - ディストリビューションの登録を解除します。
```
</div></details></div></details>

よく見たら1803でした，そりゃ無いですわ(´・ω・｀)
1809以降であれば
<details><summary>terminateなど色々使えます．</summary><div>

```powershell:1809
> wslconfig --help
Linux 用 Windows サブシステムの管理操作を実行します

使用法:
    /l, /list [/all]
        登録されたディストリビューションを一覧表示します。
        /all - すべてのディストリビューションを一覧表示します (オプション)。
               現在インストールまたはアンインストール中のものも含まれます。

    /s, /setdefault <ディストリビューション名>
        ディストリビューションを既定として設定します。

    /t, /terminate <ディストリビューション名>
        ディストリビューションを終了します。

    /u, /unregister <ディストリビューション名>
        ディストリビューションの登録を解除します。

    /upgrade <ディストリビューション名>
        ディストリビューションを WslFs ファイル システム形式にアップグレードします。
```
</div></details>

こうなります．
そこで手元のノートにも試して気付いたのですが，1903ならwslconfig使わなくても
<details><summary>wslのオプションに統合された模様．</summary><div>

```powershell:1903
> wsl --help
Copyright (c) Microsoft Corporation. All rights reserved.

使用法: wsl.exe [Argument] [Options...] [CommandLine]

Linux バイナリを実行するための引数:

    コマンド ラインを指定しないと、wsl.exe は既定のシェルを起動します。

    --exec, -e <コマンド ライン>
        指定したコマンドを、既定の Linux シェルを使用しないで実行します。

    --
        残りのコマンド ラインをそのまま渡します。

オプション:
    --distribution, -d <ディストリビューション名>
        指定したディストリビューションを実行します。

    --user, -u <ユーザー名>
        指定したユーザーとして実行します。

Windows Subsystem for Linux を管理するための引数:

    --export <ディストリビューション名> <ファイル名>
        ディストリビューションを tar ファイルにエクスポートします。
        標準出力の場合は、ファイル名を - にできます。

    --import <ディストリビューション名> <インストール場所> <ファイル名>
        指定した tar ファイルを新しいディストリビューションとしてインポートします。
        標準入力の場合は、ファイル名を - にできます。

    --list, -l [Options]
        ディストリビューションを一覧表示します。

        オプション:
            --all
                現在インストール中またはアンインストール中のものを含めて
                すべてのディストリビューションを一覧表示します。

            --running
                現在実行中のディストリビューションのみを一覧表示します。

    -setdefault, -s <ディストリビューション名>
        ディストリビューションを既定として設定します。

    --terminate, -t <ディストリビューション名>
        ディストリビューションを終了します。

    --unregister <ディストリビューション名>
        ディストリビューションの登録を解除します。

    --upgrade <ディストリビューション名>
        ディストリビューションを WslFs ファイル システム形式にアップグレードします。

    --help
        使用法を表示します。
```
</div></details>

つまり，

```powershell
$ df -T
Filesystem     Type   1K-blocks       Used Available Use% Mounted on
rootfs         lxfs   248915528  160652060  88263468  65% /
none           tmpfs  248915528  160652060  88263468  65% /dev
none           tmpfs  248915528  160652060  88263468  65% /run
none           tmpfs  248915528  160652060  88263468  65% /run/lock
none           tmpfs  248915528  160652060  88263468  65% /run/shm
none           tmpfs  248915528  160652060  88263468  65% /run/user
cgroup         tmpfs  248915528  160652060  88263468  65% /sys/fs/cgroup
C:\            drvfs  248915528  160652060  88263468  65% /mnt/c
D:\            drvfs 1932902396 1461197200 471705196  76% /mnt/d
$ exit
> wsl -l
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)
> wsl --upgrade Ubuntu-18.04
アップグレードしています...
アップグレードが正常に完了しました。

> wsl
$ df -T
Filesystem     Type   1K-blocks       Used Available Use% Mounted on
rootfs         wslfs  248915528  160877036  88038492  65% /
none           tmpfs  248915528  160877036  88038492  65% /dev
none           tmpfs  248915528  160877036  88038492  65% /run
none           tmpfs  248915528  160877036  88038492  65% /run/lock
none           tmpfs  248915528  160877036  88038492  65% /run/shm
none           tmpfs  248915528  160877036  88038492  65% /run/user
cgroup         tmpfs  248915528  160877036  88038492  65% /sys/fs/cgroup
C:\            drvfs  248915528  160877036  88038492  65% /mnt/c
D:\            drvfs 1932902396 1461304468 471597928  76% /mnt/d
```

でいけました．

# GUI操作設定

要らないんじゃないかという気もしたけど，試してみたかったので

- [WSLでwindows上にLinuxのGUI環境を作る[メモ]](https://qiita.com/MERIK/items/ef4ecf7a51f89c403e94)

を参考にxfce4の設定．

ちなみに

<details><summary>xfce4-terminal: After this operation, 69.2 MB of additional disk space will be used.</summary><div>

```shell-session
The following NEW packages will be installed:
  adwaita-icon-theme at-spi2-core dbus-user-session dconf-gsettings-backend dconf-service exo-utils fontconfig
  fontconfig-config fonts-dejavu-core glib-networking glib-networking-common glib-networking-services
  gsettings-desktop-schemas gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme libatk-bridge2.0-0
  libatk1.0-0 libatk1.0-data libatspi2.0-0 libavahi-client3 libavahi-common-data libavahi-common3 libcairo-gobject2
  libcairo2 libcolord2 libcroco3 libcups2 libdatrie1 libdbus-glib-1-2 libdconf1 libepoxy0 libexo-2-0 libexo-common
  libexo-helpers libfontconfig1 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgraphite2-3
  libgtk-3-0 libgtk-3-bin libgtk-3-common libharfbuzz0b libice6 libjbig0 libjpeg-turbo8 libjpeg8 libjson-glib-1.0-0
  libjson-glib-1.0-common liblcms2-2 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpixman-1-0 libproxy1v5
  librest-0.7-0 librsvg2-2 librsvg2-common libsm6 libsoup-gnome2.4-1 libsoup2.4-1 libstartup-notification0
  libthai-data libthai0 libtiff5 liburi-perl libvte-2.91-0 libvte-2.91-common libwayland-client0 libwayland-cursor0
  libwayland-egl1 libx11-xcb1 libxcb-render0 libxcb-shm0 libxcb-util1 libxcomposite1 libxcursor1 libxdamage1
  libxfce4ui-2-0 libxfce4ui-common libxfce4util-bin libxfce4util-common libxfce4util7 libxfconf-0-2 libxfixes3 libxi6
  libxinerama1 libxkbcommon0 libxrandr2 libxrender1 libxtst6 ubuntu-mono x11-common xfce4-terminal xfconf
0 upgraded, 96 newly installed, 0 to remove and 0 not upgraded.
Need to get 14.3 MB of archives.
After this operation, 69.2 MB of additional disk space will be used.
Do you want to continue? [Y/n]
```
</div></details>
<details><summary>xfce4: After this operation, 437 MB of additional disk space will be used.</summary><div>

```shell-session
The following additional packages will be installed:
  dbus-x11 desktop-base desktop-file-utils dictionaries-common emacsen-common gconf-service gconf-service-backend
  gconf2 gconf2-common greybird-gtk-theme gstreamer1.0-plugins-base gtk2-engines-murrine gtk2-engines-xfce gvfs
  gvfs-common gvfs-daemons gvfs-libs libart-2.0-2 libasound2 libasound2-data libasound2-plugins libasyncns0
  libatasmart4 libatkmm-1.6-1v5 libauthen-sasl-perl libavahi-glib1 libblockdev-crypto2 libblockdev-fs2
  libblockdev-loop2 libblockdev-part-err2 libblockdev-part2 libblockdev-swap2 libblockdev-utils2 libblockdev2
  libbonobo2-0 libbonobo2-common libbonoboui2-0 libbonoboui2-common libcairomm-1.0-1v5 libcanberra-gtk3-0
  libcanberra-gtk3-module libcanberra0 libcdparanoia0 libdata-dump-perl libdrm-amdgpu1 libdrm-intel1 libdrm-nouveau2
  libdrm-radeon1 libegl-mesa0 libegl1 libegl1-mesa libencode-locale-perl libevdev2 libexif12 libexo-1-0
  libfile-listing-perl libflac8 libfont-afm-perl libfontenc1 libgail-common libgail18 libgarcon-1-0 libgarcon-common
  libgbm1 libgck-1-0 libgconf-2-4 libgcr-base-3-1 libgl1 libgl1-mesa-dri libgl1-mesa-glx libglade2-0 libglapi-mesa
  libglibmm-2.4-1v5 libglu1-mesa libglvnd0 libglx-mesa0 libglx0 libgnome-2-0 libgnome-keyring-common libgnome-keyring0
  libgnome2-common libgnomecanvas2-0 libgnomecanvas2-common libgnomeui-0 libgnomeui-common libgnomevfs2-0
  libgnomevfs2-common libgpgme11 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libgtk2.0-0 libgtk2.0-bin
  libgtk2.0-common libgtkmm-3.0-1v5 libgudev-1.0-0 libhtml-form-perl libhtml-format-perl libhtml-parser-perl
  libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl
  libhttp-message-perl libhttp-negotiate-perl libical3 libimobiledevice6 libinput-bin libinput10 libio-html-perl
  libio-socket-ssl-perl libjack-jackd2-0 libjpeg-turbo-progs libkeybinder-3.0-0 libllvm7 libltdl7
  liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libmtdev1 libnet-http-perl libnet-smtp-ssl-perl
  libnet-ssleay-perl libnotify-bin libnotify4 libnspr4 libnss3 libogg0 libopus0 liborbit-2-0 liborc-0.4-0
  libpangomm-1.4-1v5 libparted-fs-resize0 libpciaccess0 libplist3 libpoppler-glib8 libpoppler73
  libpulse-mainloop-glib0 libpulse0 libpulsedsp libsamplerate0 libsecret-1-0 libsecret-common libsensors4
  libsigc++-2.0-0v5 libsndfile1 libspeexdsp1 libtdb1 libtheora0 libthunarx-2-0 libtimedate-perl libtry-tiny-perl
  libtumbler-1-0 libudisks2-0 libupower-glib3 libusbmuxd4 libvisual-0.4-0 libvolume-key1 libvorbis0a libvorbisenc2
  libvorbisfile3 libwacom-bin libwacom-common libwacom2 libwayland-server0 libwebrtc-audio-processing1 libwnck-3-0
  libwnck-3-common libwnck-common libwnck22 libwww-perl libwww-robotrules-perl libxatracker2 libxaw7 libxcb-dri2-0
  libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-shape0 libxcb-sync1 libxcb-xfixes0 libxfce4panel-2.0-4
  libxfce4ui-1-0 libxfce4ui-utils libxfont2 libxft2 libxkbfile1 libxklavier16 libxmu6 libxpm4 libxres1 libxshmfence1
  libxss1 libxt6 libxv1 libxvmc1 libxxf86dga1 libxxf86vm1 miscfiles notification-daemon orage pavucontrol
  perl-openssl-defaults poppler-data pulseaudio pulseaudio-utils rtkit sound-theme-freedesktop tango-icon-theme thunar
  thunar-data thunar-volman tumbler tumbler-common udisks2 upower usbmuxd x11-apps x11-session-utils x11-utils
  x11-xkb-utils x11-xserver-utils xbitmaps xfce4-appfinder xfce4-notifyd xfce4-panel xfce4-pulseaudio-plugin
  xfce4-session xfce4-settings xfdesktop4 xfdesktop4-data xfonts-base xfonts-encodings xfonts-scalable xfonts-utils
  xfwm4 xinit xinput xorg xorg-docs-core xscreensaver xscreensaver-data xserver-common xserver-xorg xserver-xorg-core
  xserver-xorg-input-all xserver-xorg-input-libinput xserver-xorg-input-wacom xserver-xorg-legacy
  xserver-xorg-video-all xserver-xorg-video-amdgpu xserver-xorg-video-ati xserver-xorg-video-fbdev
  xserver-xorg-video-intel xserver-xorg-video-nouveau xserver-xorg-video-qxl xserver-xorg-video-radeon
  xserver-xorg-video-vesa xserver-xorg-video-vmware xubuntu-icon-theme
Suggested packages:
  ispell | aspell | hunspell gconf-defaults-service gvfs-backends alsa-utils libdigest-hmac-perl libgssapi-perl
  libbonobo2-bin libcanberra-gtk0 libcanberra-pulse gnome-keyring gnome-icon-theme libgnomevfs2-bin libgnomevfs2-extra
  gamin | fam gnome-mime-data libvisual-0.4-plugins gstreamer1.0-tools libusbmuxd-tools jackd2 libcrypt-ssleay-perl
  opus-tools libparted-dev lm-sensors libauthen-ntlm-perl sox poppler-utils ghostscript fonts-japanese-mincho
  | fonts-ipafont-mincho fonts-japanese-gothic | fonts-ipafont-gothic fonts-arphic-ukai fonts-arphic-uming fonts-nanum
  pavumeter paman paprefs ubuntu-sounds avahi-daemon kdelibs-data thunar-archive-plugin thunar-media-tags-plugin
  tumbler-plugins-extra exfat-utils f2fs-tools libblockdev-mdraid2 nilfs-tools reiserfsprogs udftools udisks2-btrfs
  udisks2-lvm2 mesa-utils nickle cairo-5c xfce4-goodies xfce4-power-manager gtk3-engines-xfce fortunes-mod pm-utils
  menu xfwm4-themes xorg-docs xfonts-100dpi xfonts-75dpi x11-xfs-utils xfishtank xdaliclock xscreensaver-data-extra
  xscreensaver-gl xscreensaver-gl-extra fortune qcam | streamer gdm3 | kdm-gdmcompat xfonts-100dpi | xfonts-75dpi
  firmware-amd-graphics xserver-xorg-video-r128 xserver-xorg-video-mach64 firmware-misc-nonfree
Recommended packages:
  perl5
The following NEW packages will be installed:
  dbus-x11 desktop-base desktop-file-utils dictionaries-common emacsen-common gconf-service gconf-service-backend
  gconf2 gconf2-common greybird-gtk-theme gstreamer1.0-plugins-base gtk2-engines-murrine gtk2-engines-xfce gvfs
  gvfs-common gvfs-daemons gvfs-libs libart-2.0-2 libasound2 libasound2-data libasound2-plugins libasyncns0
  libatasmart4 libatkmm-1.6-1v5 libauthen-sasl-perl libavahi-glib1 libblockdev-crypto2 libblockdev-fs2
  libblockdev-loop2 libblockdev-part-err2 libblockdev-part2 libblockdev-swap2 libblockdev-utils2 libblockdev2
  libbonobo2-0 libbonobo2-common libbonoboui2-0 libbonoboui2-common libcairomm-1.0-1v5 libcanberra-gtk3-0
  libcanberra-gtk3-module libcanberra0 libcdparanoia0 libdata-dump-perl libdrm-amdgpu1 libdrm-intel1 libdrm-nouveau2
  libdrm-radeon1 libegl-mesa0 libegl1 libegl1-mesa libencode-locale-perl libevdev2 libexif12 libexo-1-0
  libfile-listing-perl libflac8 libfont-afm-perl libfontenc1 libgail-common libgail18 libgarcon-1-0 libgarcon-common
  libgbm1 libgck-1-0 libgconf-2-4 libgcr-base-3-1 libgl1 libgl1-mesa-dri libgl1-mesa-glx libglade2-0 libglapi-mesa
  libglibmm-2.4-1v5 libglu1-mesa libglvnd0 libglx-mesa0 libglx0 libgnome-2-0 libgnome-keyring-common libgnome-keyring0
  libgnome2-common libgnomecanvas2-0 libgnomecanvas2-common libgnomeui-0 libgnomeui-common libgnomevfs2-0
  libgnomevfs2-common libgpgme11 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libgtk2.0-0 libgtk2.0-bin
  libgtk2.0-common libgtkmm-3.0-1v5 libgudev-1.0-0 libhtml-form-perl libhtml-format-perl libhtml-parser-perl
  libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl
  libhttp-message-perl libhttp-negotiate-perl libical3 libimobiledevice6 libinput-bin libinput10 libio-html-perl
  libio-socket-ssl-perl libjack-jackd2-0 libjpeg-turbo-progs libkeybinder-3.0-0 libllvm7 libltdl7
  liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libmtdev1 libnet-http-perl libnet-smtp-ssl-perl
  libnet-ssleay-perl libnotify-bin libnotify4 libnspr4 libnss3 libogg0 libopus0 liborbit-2-0 liborc-0.4-0
  libpangomm-1.4-1v5 libparted-fs-resize0 libpciaccess0 libplist3 libpoppler-glib8 libpoppler73
  libpulse-mainloop-glib0 libpulse0 libpulsedsp libsamplerate0 libsecret-1-0 libsecret-common libsensors4
  libsigc++-2.0-0v5 libsndfile1 libspeexdsp1 libtdb1 libtheora0 libthunarx-2-0 libtimedate-perl libtry-tiny-perl
  libtumbler-1-0 libudisks2-0 libupower-glib3 libusbmuxd4 libvisual-0.4-0 libvolume-key1 libvorbis0a libvorbisenc2
  libvorbisfile3 libwacom-bin libwacom-common libwacom2 libwayland-server0 libwebrtc-audio-processing1 libwnck-3-0
  libwnck-3-common libwnck-common libwnck22 libwww-perl libwww-robotrules-perl libxatracker2 libxaw7 libxcb-dri2-0
  libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-shape0 libxcb-sync1 libxcb-xfixes0 libxfce4panel-2.0-4
  libxfce4ui-1-0 libxfce4ui-utils libxfont2 libxft2 libxkbfile1 libxklavier16 libxmu6 libxpm4 libxres1 libxshmfence1
  libxss1 libxt6 libxv1 libxvmc1 libxxf86dga1 libxxf86vm1 miscfiles notification-daemon orage pavucontrol
  perl-openssl-defaults poppler-data pulseaudio pulseaudio-utils rtkit sound-theme-freedesktop tango-icon-theme thunar
  thunar-data thunar-volman tumbler tumbler-common udisks2 upower usbmuxd x11-apps x11-session-utils x11-utils
  x11-xkb-utils x11-xserver-utils xbitmaps xfce4 xfce4-appfinder xfce4-notifyd xfce4-panel xfce4-pulseaudio-plugin
  xfce4-session xfce4-settings xfdesktop4 xfdesktop4-data xfonts-base xfonts-encodings xfonts-scalable xfonts-utils
  xfwm4 xinit xinput xorg xorg-docs-core xscreensaver xscreensaver-data xserver-common xserver-xorg xserver-xorg-core
  xserver-xorg-input-all xserver-xorg-input-libinput xserver-xorg-input-wacom xserver-xorg-legacy
  xserver-xorg-video-all xserver-xorg-video-amdgpu xserver-xorg-video-ati xserver-xorg-video-fbdev
  xserver-xorg-video-intel xserver-xorg-video-nouveau xserver-xorg-video-qxl xserver-xorg-video-radeon
  xserver-xorg-video-vesa xserver-xorg-video-vmware xubuntu-icon-theme
0 upgraded, 261 newly installed, 0 to remove and 0 not upgraded.
Need to get 80.8 MB of archives.
After this operation, 437 MB of additional disk space will be used.
Do you want to continue? [Y/n]
```
</div></details>
と，それなりに容量を食うので不要ならスキップ推奨です．


## VcXsrv Windows X Serverのインストール

SourceForgeの
https://sourceforge.net/projects/vcxsrv/
からVcXsrv Windows X Serverを落としてきてインストールしておく．


## xfce4のインストール

WSLで

```shell-session
$ sudo apt install xfce4-terminal
$ sudo apt install xfce4
```

と打ってxfce4をインストール．
ちなみにServerでどうだったか覚えてませんが，1903なWin10でテストしていたら``xfce4``入れてる最中にUnable to fetch some archivesが出たので
<details><summary>こうしました．</summary><div>

```shell-session
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
$ sudo apt update
$ sudo apt install xfce4
```

</div></details>


## 環境変数の設定

```shell-session
$ vi ~/.bashrc
```

で

```shell:.bashrc
export DISPLAY=localhost:0.0
export LIBGL_ALWAYS_INDIRECT=1
```

とか書いておく．
前者はぶつかるようなら適宜別の値で．後者はlibGL周りのエラー回避がしやすいらしい．


## いざ，起動

先程インストールしたXLaunchを起動し，適当にOne large windowか何かでDisplay numberを0(DISPLAYに設定したもの)に設定し，「Select how to start clients」はStart no client，「Extra settings」はそのまま(ここのNative openglに先程のLIBGL_ALWAYS_INDIRECTが効く模様)で，一応楽なように「Configuration complete」でSave configurationしておく．
(今後は保存した設定ファイルをダブルクリックすればOK)

新しくTerminalを立ち上げるか

```shell-session
$ source ~/.bashrc
```

を行なうかして設定が反映された状態で

```shell-session
$ startxfce4
```

とすればVcXsrv Serverの真っ黒画面にXfce Desktop Environmentが表示される．
自分はとりあえずUse default configを押した．

## sudoしてしまった場合

なお，下手にstartxfce4を

```shell-session
$ sudo startxfce4
```
sudoとかしてしまうと

![sudo_moz.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/2a2a291e-79e5-f3ba-c8f7-fddec3dcbae6.png)

「you may harm your system」と忠告され，
さらに次回普通に起動しようとすると

```shell-session
$ startxfce4
/usr/bin/startxfce4: X server already running on display localhost:0.0
xfce4-session: Unable to access file /home/(user_name)/.ICEauthority: Permission denied
$ ls ~/ -a -l
total 136
drwxr-xr-x 1 (user_name) (user_name)    512 Jun 20 10:36 .
drwxr-xr-x 1 root        root           512 Jun 17 15:02 ..
-rw------- 1 root        root          3552 Jun 20 10:25 .ICEauthority
```

のように``.ICEauthority``がrootのものになって起動できなくなるので注意．

```shell-session
$ sudo chown (user_name):(user_name) ~/.ICEauthority
```

すれば起動します．


## 文字化け対応

ここでFilesystem rootとかから/mnt/c/などを辿ってWindowsのファイルシステムが見える事を確認すると，日本語が文字化けしている事に気付く．

```shell-session
$ sudo apt install fonts-takao
```

としてあげると直る．日本語フォントなら何でも良いと思われる．

```shell-session
$ sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/windows
$ sudo fc-cache -fv
```

で直接Windowsのフォントにリンク，でも~~おそらく~~OK．
→Win10で試した結果，日本語フォントのインストールなし，Windowsフォントへのリンクのみ，でOKでした．

あと，Command promptから入ると大丈夫なんだが，PowerShellからだとこれまた文字化けする．
こちらはまぁcmdで問題ないし，そもそも日本語ファイル名にぶつかる事がほぼ無いので放置中．

ちなみに

```shell-session
$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8
$ sudo apt -y install manpages-ja manpages-ja-dev
$ exit
> wslconfig /t Ubuntu-18.04
> wsl
```

などとして日本語化してしまっても良いが，そうすると鬱陶しいところまで日本語化されて

```shell-session
$ sudo apt install xdg-user-dirs-gtk
$ LANG=C xdg-user-dirs-gtk-update
```

とかしないといけない．
WSLは主にCUIで使うものだと思われるので，日本語化は要らないと思う．
あと，文字化け問題はどの道残るのでフォント関連の処理は要る．

## WARNINGを減らす

コンソール上に大量に現れる

```shell-session
Unable to locate theme engine in module_path: "pixmap",
```

は

```shell-session
$ sudo apt install gtk2-engines-pixbuf
```

で消える．それでもまだエラーは出るけど，↑だけでかなり減るのでとりあえず放置．


## ブラウザのインストール

せっかくGUI操作出来るようにしたので，ブラウザを入れてみる．

- [Ubuntu 18.04でaptを使ってchromeをインストール](https://hnakamur.github.io/blog/2018/05/04/install-chrome-using-apt-on-ubuntu-18.04/)

を参考に

```shell-session
$ curl https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list
$ sudo apt update
$ sudo apt install google-chrome-stable
```

で入れてみる．
これでXfceに「Applications→Internet→Google Chrome」が登場．
しかしエラーが出て起動できない，もしくは映らない．

```shell-session
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Permission denied
```

どうも

```shell-session
$ sudo google-chrome --no-sandbox
```

で起動しないと駄目らしい．
「大人しくFirefoxとか入れた方が良いんじゃないか」となった時点で「そもそもブラウザ要らないよね」~~「そもそもGUI要らないよね」~~とここでストップ．
クリップボード共有はされるので，マルチディスプレイ環境なら1画面をX，残りをWindowsで使ってWindows側のブラウザを使えば良いし，ファイルのダウンロードなんかもそちらで落として``/mnt/c/``などからアクセスすれば良い．
シングルディスプレイ環境なら快適に動作するようにしておいた方が便利と思われる．


# Python環境の構築
[Windows Server 2019でWSLのUbuntu18.04にJupyterHub環境を構築](https://qiita.com/fararrow/items/483f0f5a9d5092adead5)
↑こちら