快適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なリポジトリ少ないイメージ)

移行

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の共通設定

[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の独自設定

#==========================================================
[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

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

or...

wsl.startup.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スクリプト


#!/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スクリプト

@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を使用.
  • スタートアップフォルダに投げる。
; Ctrl+Alt+T for launch Windows Terminal
^!T::Run,wt.exe

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


# 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との共存問題みたいなのあったけど解決したみたいなので、全力布教に努める所存である。