快適WSLのためのちょっとしたTips.

## あらまし

WSL(Windows Subsystem for Linux）は、Windows上の軽量VMで動作する、Linuxである。
動的にメモリが割り当てられ、大変便利である。凄く便利で重宝である。

足りない部分はスクリプトで頑張る。

以下のように頑張る。


## VMを別箇所に移す

- VMの中データモリモリにしたいならコレ大事。
- SSDにしましょう。

### `lxrunoffline`のインストール

| Manager |Install |
|:-------:|:--------:|
| Chocolatey | sudo choco install lxrunoffline |
| Scoop |sudo scoop install lxrunoffline |

- ※`sudo.ps1`導入時
- 個人的、Scoopのほうがおすすめ。(Dutyなリポジトリ少ないイメージ）

### 移行

```bat
REM ディストリビューションの終了
wsl.exe -t Ubuntu-18.04

REM 移行
lxrunoffline move -n Ubuntu-18.04 -d D:\VM\WSL\Ubuntu-18.04

REM 確認
lxrunoffline get-dir -n Ubuntu-18.04
```


## C:\User\USER\.wslconfigによるVMの共通設定

```toml
[wsl2]
# 独自Linuxカーネル指定とCMD引数（Windowsパス)
#kernel=
#kernelCommnadLine=

# メモリ
memory=4GB
# CPU
processor=4
# SWAPなし
swap=0
# SWAP用VHDファイル（Windowsパス)
swapFile=
# localhost転送
localhostForwarding=true

```

## /etc/wsl.confによるVMの独自設定

```toml
#==========================================================
[automount]
enabled=true # /mnt/[c,d,...]
mountFsTab=true # /etc/fstabベース
root="/media/" # /mnt/c -> /media/c
options=""
#======================================
# ディストリビューション同士(2020 May Update - v2004以降）
crossDistro=true 
#==========================================================
[network]
generateHosts=true # /etc/hosts
generateResolvConf=true # /etc/resolv.conf
#==========================================================
# 2019 Nov Update v1009以降
[interop]
enabled=true # *.exeの起動
appendWindowsPATH=true # WindowsのPATHを追記
#==========================================================
[user]
default=eric # 2020 May Update - v2004 以降
#==========================================================
[filesystem]
umask=0022 # = 0755, 2020 May Update - v2004以降
#==========================================================

```


## Startup!

### Windows起動時にWSL起動

- `shell:startup`配下に配置

#### wsl.startup.bat

```bat
@echo off
wsl.exe -u root -- /root/wsl.startup.sh
```

or...

#### wsl.startup.vbs

```vbs
Set ws = WScript.CreateObject("WScript.Shell")
ws.run "C:\Windows\System32\bash.exe -c 'sudo /root/init.wsl.sh'",0
```

### wsl.startup.shによるinitスクリプト

```bash

#!/bin/bash -eu

# start_services
while read -r service
do
  status="$(/etc/init.d/$service status)"
  if [ $(echo "$status" | grep -e 'not running' -e 'NOT running' | wc -l ) -gt 0 ]
  then
    /etc/init.d/$service start > /dev/null
  fi
done << LIST
cron
ssh
atd
LIST

# get Windows vEthernet IP

if [[ $(grep 'CUSTOM CONFIG' /etc/hosts)  == '' ]]
then

# VEthernetからみたWindows側(default-gw）のIP
winIP=$(ip route show default | cut -d' ' -f3)
# WSL以外に、VirtualBoxなどで、NATを立てているときに、便利
# WSL[vmIP] --vEthernet--> [winIP]Windows[127.0.0.x]VirtualBox<---VBoxNAT-Network-->VirtualBoxVM
#
# e.g.
# > PortFowarding: 0.0.0.0:2222 -> 10.10.0.100:22(VM)
# ssh vmhost -p2222

# VM自身のIP
vmIP=$(ip addr | grep eth0 | grep -o '\ inet\ [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | awk '{print $2}')

cat << TEXTS >> /etc/hosts
# ======== CUSTOM CONFIG =========
# Windows vEthernet IP
$winIP vmhost
$vmIP vmclient
TEXTS

fi # /etc/hosts

if [[ $(grep 'CUSTOM CONFIG' /etc/resolv.conf)  == '' ]]
then

cat << TEXTS >> /etc/resolv.conf
# ========= CUSTOM CONFIG =========
nameserver 1.1.1.1 # CloudFlare
nameserver 8.8.8.8 # Google Public DNS
domain eric-lightning.info
TEXTS

fi #/etc/resolv.conf

```

- `chmod u+x /root/wsl.startup.sh`

## WSLのDistroを日時でFULLバックアップするBATスクリプト

```bat
@ECHO OFF

REM ===============================================
REM 適宜設定
SET DIST_NAME=Ubuntu-18.04
SET BACKUP_DIR=%HOMEPATH%\wsl-backup.d
REM ===============================================

REM Parse '10/06/2020 Tue' Style
SET CDATE=%date:~6,4%%date:~0,2%%date:~3,2%

SET TEMP_TIME=%time: =0%
SET CTIME=%TEMP_TIME:~0,2%%TEMP_TIME:~3,2%

IF NOT EXIST %BACKUP_DIR% MKDIR %BACKUP_DIR% 
SET BACKUP_FULL_PATH=%BACKUP_DIR%\%DIST_NAME%_%CDATE%-%CTIME%.tar.gz

echo START BACKUP %DIST_NAME% to %BACKUP_FULL_PATH%

wsl --export %DIST_NAME%  %BACKUP_FULL_PATH%

echo DONE

REM e.g. export to Ubuntu-18.04_20201112-1809.tar.gz
```

- 時間帯表記が、`'10/06/2020 Tue'`の場合に`Ubuntu-18.04_20201007-0004.tar`のような出力になる。
- ダブルクリック！

## `Ctrl+Alt+T`で端末を起動

- `Ctrl+Alt+T`でWindows Terminalを起動.
- AutoHotKeyを使用.
- スタートアップフォルダに投げる。

```ahk
; Ctrl+Alt+T for launch Windows Terminal
^!T::Run,wt.exe
```

### 起動時のカレントディレクトリ

```zsh

# DETECT WINDOWS STARTUP_PATH↲
if [[ "$PWD" =~ "/mnt/c/.*/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup" ]]
then
  cd $HOME > /dev/null
fi

# If Windows Terminal
if [[ "$PWD" =~ "/mnt/c/.*/eric" ]]
then
  cd $HOME > /dev/null
fi
```

## さいごに

- 普段Linux触っていない人ほど、WSLをおススメしたい。
- 一時期、VirtualBoxとの共存問題みたいなのあったけど解決したみたいなので、全力布教に努める所存である。