WSL上にUbuntu18.04を構築してみた

WSL上にubuntu18.04を構築してみたので、メモ書きを残します。
(いろいろハマったので備忘も兼ねて)

#はじめに
以下のPCスペックが実行環境となります。

###PCスペック
* OS：Windows 10 Home
* CPU：Intel Core i7-10510U 1.80GHz(2.30GHz)
* RAM：16.0GB

※wsl2を利用
wsl1の場合はwsl2に更新して以下進める。
更新方法は以下を参照。
[WSL1からWSL2への移行](https://qiita.com/muzzumuzu/items/4b0cd2e259b2a8e204e7)

###Ubuntu バージョン
* Ubuntu 18.04

##流れ
1. Ubuntuインストール
2. パッケージインストール
3. ファイルのやり取り方法
4. PID(1)をsystemdにする

#Ubuntu インストール
Windows Storeから、「Ubuntu」と検索し、「Ubuntu 18.04」をインストール。

WSLをWindowsで有効化する。
スタート＞コントロールパネル＞プログラムと機能＞Windowsの機能の有効化または無効化　と移動し、
「Windows Subsystem for Linux」にチェックを入れる。

スタートメニューから「Ubuntu 18.04」を起動する。
初回は、一般ユーザー作成が求められるので、任意のユーザー名とパスワードを入力する。
※このパスワードはsudo実行時に必要になるので、忘れないように注意


###以下は任意で行ってください
rootユーザーになれるようにする。
※本来は推奨されていないですが、個人利用で不便だったため設定。

以下を実行し、rootユーザーのパスワード変更する。

```
sudo passwd root
```

rootユーザーになれることを確認。(先ほど設定したパスワードを入力)

```
su -
```

以上でUbuntuのインストールは完了です。

今後諸々のパッケージインストールを行う。

#パッケージインストール
基本的に以下のサイトを参考にインストールを行う。
[Ubuntu 18.04のWSL上へのインストールと初期設定](http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToInstallUbuntu1804OnWSL.html#toc9)

###1.リポジトリを日本国内に変更する
デフォルトでは海外になっており、若干時間がかかるので、国内のリポジトリにアクセスするように変更する。

```bash
$ cd /etc/apt
$ ls #sources.listが存在することを確認する。
$ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list
# 「http://archive.ubuntu.com」という文字列を 「http://jp.archive.ubuntu.com」という文字列に置き換える。
$ ls #sources.listとsources.list.bakが存在することを確認する。
$ diff sources.list.bak sources.list #差分が表示される。
```

###2.インストール済のパッケージを更新する。
インストール可能ソフトウェア一覧の取得と一覧をもとにしたソフトウェアのインストールおよび更新を行う。

```bash
$ sudo apt update
$ sudo apt upgrade -y
```

###3.インストールしたいパッケージの検索

```bash
$ sudo apt search 検索したい文字列
```

例えば、日本語設定用パッケージを検索してみる。

```bash
$ sudo apt search language-pack-ja
```

###4.ソフトウェアのインストール

```bash
$ sudo apt install パッケージ名, ...
```

上記の日本語設定用パッケージをインストールしてみる。
(Do you want to continue? [Y/n]が出た時はYで進める。)

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

###5.インストール済ソフトウェアの確認

```bash
$ which 調べたいLinuxコマンド
```

pythonで確認してみる。

```bash
$ which python3
```
/usr/bin/python3　と表示されればインストールされている。

###6.日本語環境の設定
現在の設定を確認する。(初期は英語設定になっている)

```
$ date
```
`Sat Nov 21 23:27:23 JST 2020`のように表示されれば英語設定になっている。

```bash
$ sudo update-locale LANG=ja_JP.UTF-8
$ exit
```
一度Ubuntuを再起動し、以下コマンドを実行し日本語設定になっていることを確認する。

```bash
$ date
$ echo $LANG
```

###7.タイムゾーンの変更
東京(JST)に変更する。

```bash
$ sudo dpkg-reconfigure tzdata
```
方向キーで「アジア」を選択し、tabキーで「了解」を選択、Enterキーを押下する。
方向キーで「東京」を選択し、tabキーで「了解」を選択、Enterキーを押下する。
Current default time zone: 'Asia/Tokyo'と表示されれば完了。
または、dateコマンドの末尾がJSTになっていれば設定完了。

###8.manコマンド(マニュアル)の日本語化
現状の確認。Enterキーまたはスペースキーでページスクロール、qキーで終了できる。

```bash
$ man ls
```
日本語設定用パッケージをインストール。

```bash
$ sudo apt install manpages-ja manpages-ja-dev
$ man ls
```
マニュアルが日本語になっていれば完了。


#ファイルのやり取り方法
まず、Windows側のバージョンが1903より新しくないとできない点に注意。
Ubuntuが起動している状態でしか参照できない。

###WindowsからUbuntuのファイルを参照
1. エクスプローラーを開く。
2. アドレスバーに「&yen;&yen;wsl$」と入力しEnterキーを押す。
3. 「Ubuntu18.04」のフォルダに移動する。

###UbuntuからWindowsのファイルを参照
1. Ubuntuにログインする。
2. Cドライブのファイルを参照する場合は、以下コマンドを入力する。(Dドライブの場合は/mnt/d)

```bash
$ cd /mnt/c
```

#PID(1)をsystemdにする
初期設定ではPID(1)はinitになっていて、不便が多いので変更してみる。
以下のサイトを参考に変更する。
[【WSL2】systemctlが動かない問題をきちんと解決する](https://shikiyura.com/2020/06/execute_systemctl_on_wsl2/)
[Ubuntu に .NET SDK または .NET ランタイムをインストールする](https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu)
[Windows 10 Home（WSL2）のUbuntuでsystemctlを利用する方法（systemdをPID1で動作させる方法）](https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/#toc_id_2)

```bash
$ wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update; \
   sudo apt-get install -y apt-transport-https && \
   sudo apt-get update && \
   sudo apt-get install -y dotnet-sdk-3.1
$ sudo apt install daemonize
$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
$ sudo apt install -y systemd-genie
$ genie -c bash
```
他サイトでは「genie -s」と記載されていたが、不可だったため「genie -c bash」とすれば完了した。

ここで以下コマンドでPIDを確認。

```bash
$ ps -aux
```

次回以降起動時にsystemdがPID(1)で実行できるように設定を変更する。

```bash:.bashrc
if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then
  genie -c bash
fi
```

再起動し、再度プロセスを確認し、systemdがPID(1)で起動されていれば完了。
念のためsystemctlが実行できるか確認しておく。

```bash
$ sudo systemctl status
```

#最後に
いろんなサイトを参照させていただきましたが、最後のgenie起動の部分でかなり時間がかかってしまいました。
何とか更新できたので、何かの参考になればとメモを残しておきます。