WSL(ubuntu18.04)の初期設定

# 初めに
この記事はubuntu18.04のWSLの初期設定について、自分が行ったことを記したものである。

## WSL(windows subsystem for linux)とは
WSL(windows subsystem for linux)とは
>Windows Subsystem for Linux (WSL) とは、Linuxの（ELFフォーマット形式の）バイナリ実行ファイルをWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。
(wikipediaより、https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux)

つまり、windowsでもlinuxそのものが使えることです。いままで、windowsが搭載されているPCでlinuxのOSを使いたい場合は、VMwareなどwindows上で仮想環境を作るアプリを用いてその上でlinuxを動かすか、あるいはPCに直接linuxのOSをブートさせたり、windowsとのデュアルブートを行ったりといった手段を私たちはとっていました。しかしwslはwindows上で動きますが、仮想環境とは違う方法をとっているらしいです。どちらにせよ、手軽にwindowsストアからlinuxのOSをインストールして動かせるので、自分のような初学者にとってはとてもハードルが低くて助かります。

ただし、機能面ではやや不便利なところがあります(´･_･`)、が、linuxネイティブのc言語プログラムの実行環境を整えられてり、あまりリスクを負わずにlinuxの扱いを学ぶことができたりと、いい面はたくさんあります。少しの工夫でGUIアプリケーションも開けます(開けないものもあるかも)。

自分はc言語を勉強するための環境と、競技プログラミングの環境としてWSLを使っています。

## 注意

wsl側からwindows側のファイルを編集することは問題ないですが、windows側からwsl内のファイルを編集するとWSLが正しく起動しなくなることがあるので、注意してください。

## 参考にしたサイト

[WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)

[Ubuntu 18.04のWSL上へのインストールと初期設定](http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToInstallUbuntu1804OnWSL.html)

# 手順

## 1.windowsの更新の確認
windowsのスタートボタンから、「設定」→「更新とセキュリティ」
でインストールしていない更新があるかどうか確認できます。
なるべく最新のバージョンである方が好ましい(?)と思います。
![2020-07-19 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/2c88e1e3-15e8-1584-c686-f77a2fe99ef7.png)

## 2.WSLを有効にする
デフォルトでWSLが無効になっている場合は有効にする必要があります。
windowsのスタートボタンから、「設定」→「アプリ」→「プログラムと機能」
![2020-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/c6e9738d-ccd1-eaf3-3129-669c8253e297.png)

表示されたコントロールパネルの画面の「Windowsの機能の有効化または無効化」
をクリック
![2020-07-19 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/c16abe14-6a61-09d9-f650-f0fa3163806c.png)

「Windows Subsystem for Linux」にチェックをつけて有効化する。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/7209f510-9657-35c8-0784-267032520fbd.png)



## 3.インストール
windows storeから「ubuntu」と検索して、「ubuntu18.04」をインストールします。
![2020-07-19 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/fd9e7a9f-2d87-771c-3ff5-3e97e476120a.png)


## 4.起動
インストールが完了したら、スタートボタンを押してスタートメニューを開くと、「最近追加された項目」のところにubuntu18.04のアイコンがあるので、それを押して起動します。起動したあと、ターミナル画面が表示され、ubuntuの方で設定が始まるので、しばし待ちましょう。

設定がひと段落すると、ユーザーネームとパスワードの登録を要求されます。パスワードは管理者権限が必要なコマンドを使うときによく要求されるので、設定したらちゃんと覚えておきましょう。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/fb4bfc8c-8680-9ecc-ce83-fa2834a0f8f8.png)

パスワードは2回入力して間違いが無いか確認するので、タイプミスはあまり心配しなくていいです。

## 5.レポジトリの変更
この設定はやらなくても大丈夫ですが、全然やってもいいと思います。

(2020-12-27-17:21追記

この設定をubuntu20.04でしたところ，次項の「日本語環境の設定」ができませんでした．
language-pack-jaパッケージが日本のレポジトリだと取れないのかな？
)

ubuntuや他のオープンソースのlinuxは、必要なプログラムやソフトをインターネット上のサーバに置いて、公開しています。それを「レポジトリ」といいます。インストールした段階ではレポジトリの場所は海外に設定されていますが、日本にもレポジトリサーバがあるので、レポジトリの設定を変更します。これで、更新やソフトウェアのインストールが少し?だけ速くなります。

```terminal
$ cd /etc/apt
$ ls 
    (sources.listというファイルがあるかどうか確かめる)
    
$ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list

```

(sources.list中の``http://archive.ubuntu.com``という文字列``http://jp.archive.ubuntu.com``という文字列に置き換える。元のファイルはsources.list.bakという名前でバックアップをとっている)

```terminal
$ ls 
    (sources.listとsources.list.bakというバックアップファイルがあるかどうかを確かめる)

$ diff sources.list.bak sources.list
    (バックアップのファイルと置換した後のファイルの差を確認)
```

## 6. 日本語環境の設定
この項目はやらなくても大丈夫です。

日本語パッケージをインストールします。

```terminal
$ sudo apt install language-pack-ja
```

言語を日本語に設定します。

```terminal
$ sudo update-locale LANG=ja_JP.UTF-8
```

一度Ubuntuを終了します。

```terminal
$ exit
```

再び起動して、日本語環境になっているか確認します。


```terminal
$ echo $LANG
    (「ja_JP.UTF-8」と出力されればOK)
$ date
    (日本語で年月日、曜日、時刻が表示されればOK)
```

## 7. 更新
OSを更新します。

```terminal
$ sudo apt update && sudo apt upgrade -y
```

## 8. 時刻の設定
タイムゾーンを日本(JST)にします。

```terminal
$ sudo dpkg-reconfigure tzdata
```

このコマンドを実行すると、背景が青色の設定画面に移動します。
「アジア」→「東京」と選択
![2020-07-19 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/e83dfe32-e333-615e-6537-a71cdd5c2f11.png)
![2020-07-19 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/0708b515-0df9-f333-f7f5-575063089bef.png)


## 9. ソフトウェアのインストール
c言語やc++言語のプログラムを実際にコンパイルするのに必要なGCC(the GNU Compiler Collection)というソフトやデバッグ用のgdbなどを含んだパッケージである「build essential」をインストールします。

```terminal
$ sudo apt install build-essential
```

また、WSLではlinuxネイティブのGUIアプリケーションを、Xserverを用いて使うことができます。そのために必要なソフトx11-apps, x11-utils, x11-xserver-utils, dbus-x11をインストールします。

```terminal
$ sudo apt install x11-apps x11-utils x11-xserver-utils dbus-x11
```

そのあと、windows側でVcXsrvというxサーバーのアプリケーションをインストールします。
[VcXsrvのインストールページ](https://sourceforge.net/projects/vcxsrv/)

インストーラを起動させたら、特にオプションは変更せずにインストールします。
デスクトップにVcXsrvのアイコンが生成されます。

<img width="100" alt="2020-07-19 (11).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/60e9a82d-8ecf-5a36-1660-22d0b8d40cef.png">

インストールしたあと、WSL側で、WSLを起動したときのカレントディレクトリにある```.bashrc```
という設定ファイルの末尾に

```bash
export DISPLAY=localhost:0.0
```

を書き加えます。それをするには、WSL上でホームディレクトリ(``/home/(ユーザー名)``、カレントディレクトリが表示されている部分で``~``と書かれていればそれがホームディレクトリ)をカレントディレクトリに移動した状態(``pwd``コマンドで確認できる)で

```terminal
$ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
```

と打ちます。
このあと、変更した設定ファイル``.bashrc``を読み込ませます。

```terminal
$ source ~/.bashrc
```

これで、vcxsrvを起動して、wsl側でGUIアプリを起動すると、GUIアプリケーションが使えるようになります。

まず、さっきインストールした「Xlaunch」を起動します。
特に変更を加えずに、そのまま「次へ(N)」を押します。
![2020-07-19 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/b16a7cb0-935d-c61f-80a1-7566a4c59cfd.png)

「次へ(N)」
![2020-07-19 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/3887cb61-b44f-3005-729f-d15998902987.png)

「次へ(N)」
![2020-07-19 (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/66d72e1a-13c0-984e-2799-d3efdef65239.png)

「完了」
![2020-07-19 (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/df5bece8-8786-4e75-2299-a953b8d96b76.png)

その後、以下のような警告がでてきますが、これは「キャンセル」を押します。
「キャンセル」とする理由は、[ファイアウォールのアクセス許可について
](#ファイアウォールのアクセス許可について
)で後述します。
![2020-07-19 (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/f6e17c19-9ff7-45da-3677-7ce7f085b0d8.png)

デスクトップ画面右下にXlaunchのマークが出ていたら成功です。

<img width="200" alt="2020-07-19 (18).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/39eacef0-526b-25c7-18cd-df3a6877dd21.png">

最後に、WSLのコマンド上で以下のコマンドを実行します。

```terminal
$ xeyes &
```

以下の画像のような目がでたら成功です。

<img width="200" alt="2020-07-19 (19).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252117/df2a0110-a8a8-edcc-44d0-df16d06d86c2.png">


# ファイアウォールのアクセス許可について

[Windows Defender ファイアウォールを介してアプリを許可する際のリスク](https://support.microsoft.com/ja-jp/help/4525108/security-risks-of-allowing-apps-through-windows-defender-firewall)
>Windows Defender ファイアウォールの許可されているアプリの一覧にアプリを追加する場合 (ブロック解除 と呼ばれることもあります)、または Windows Defender ファイアウォール ポートを開く場合、ファイアウォールに穴を開けるかのように、ファイアウォールを介してお使いのデバイスとの間での情報の送受信を特定のアプリに許可することになります。これにより、デバイスの安全性が低下し、ハッカーやマルウェアがこれらの開口部のいずれかを使用してお使いのファイルにアクセスしたり、デバイスを使用してマルウェアを他のデバイスに拡散したりする機会を生じさせる可能性があります。


このようなことから、ファイアウォールを介してアプリを許可するのはセキュリティ上よろしくないそうです。