Linux on Windows 10-11

(2022.3.18-2023.10.18)

WindowsではWSL2Cygwinでlinuxコマンドが使える。WSL2はLinuxのエミュレーターで,Linuxのバイナリーが動く。CygwinはLinuxの互換レイヤーで,LinuxのソフトウェアをCygwin環境で再コンパイルして使う。

WSL2  - Windows Subsystem for Linux 2

インストール

コマンドプロンプトを管理者権限で起動して,

wsl --install 

指示に従って再起動すると,Ubuntsuのウインドウが開くので,ユーザー名とパスワードを入れる(初回のみ)。そして,パッケージ更新と日本語化

sudo apt update
sudo apt upgrade
sudo apt install language-pack-ja

sudo update-locale LANG=ja_JP.UTF8

wsl --list --verbose 

WSL2をインストールしたつもりなのにWSL1だったということがあった。バージョンアップは

wsl --set-version Ubuntu 2

2022年11月よりWSL2はストア版にアップデートされる。上記のようにインストールするとそれまではインボックス版,その後はストア版がインストールされる。インボックス版をストア版にアップデートするには

wsl --update

ストア版は,systemd対応し,Linux GUIアプリが利用可能。WSL2のGUIアプリは,Windows の, [スタート] から起動でき,Windowsとの間で切り取りと貼り付けが可能。

wsl --version

コマンドが成功すれば,ストア版,失敗すればインボックス版

アンインストール

アンインストール:[アプリと機能]で,[Ubuntu]と[Windows Subsystem for Linux Update]を[アンインストール]。

起動・終了

起動は,スタートのUbuntsu,または,コマンドプロンプトでwsl。終了は

wsl --shutdown

rootログインとコマンド実行

wsl -u root 

初期ディレクトリをlinuxのホームにするには,~/.bashrcにcd行を追加。

wsl -u root -- コマンド

Windows Terminal

上記コマンドは,Windows Terminalのオプションに指定して実行できる。例えば,ショートカットのリンク先を

wt wsl -u root

とすれば,WSL2にrootでログインしてWindows Terminalが起動する。外部サーバーへの接続は

wt wsl -u root -- ssh ホスト名

など。

ユーザーログインとコマンド実行

上の,rootログインとコマンド実行の -u root をとる。

IPアドレス固定とsshd, cronの開始

以下のスクリプトを管理者権限で実行すると,cronとsshサービスを開始して,ssh転送でipアドレスをWindowsに揃えて固定できる:

init.sh(# chmod a+xし,# apt install net-toolsでifconfigが使えるようにしておく)

#!/bin/bash

service cron start

service ssh start

# WSL2のIPアドレス取得

IP=$(ifconfig eth0 | grep 'inet ' | awk '{print $2}')

# ssh(22)の転送ルールを削除して,上記IPに転送するよう設定

netsh.exe interface portproxy delete v4tov4 listenport=22

netsh.exe interface portproxy add    v4tov4 listenport=22 connectaddress=$IP

#上記設定の有効化

sc.exe config iphlpsvc start=auto

sc.exe start  iphlpsvc

# service cron status
# service ssh status

このスクリプトは起動時に実行したいが,WSL2は起動スクリプト/etc/rc.localが使えないので,スタートアップ時にコマンド

wsl -u root -- /root/init.sh

を管理者として実行する。ただし,最新(2023.9.7)のWSL2は,Terminalなどでシェルを起動するか,wslコマンドでサービスを起動していないと勝手に終了」してしまう。そこで,以下のようなbatファイルを作り,

wsl -u root -- /root/init.sh

service cron restart

Windowsのタスクスケジューラで,最上位の特権で実行するようにする。その際,Windowsは自動ログインするように設定しておき,「ユーザーがログオンしているときのみ実行する」にし,遅延時間を30秒~1分ほどとる。なお,systemdは切っておかないとうまくいかないので,/etc/wsl.confの以下の2行は削除するかtrueをfalseに変える:

[boot]

systemd=true

以上で,Windows起動直後から,WSL2のsshサーバーが起動して,外部からWindowsのIPアドレスにsshでアクセスするとWSL2にログインすることができ(IPアドレス固定),cronも有効になり,WSL2をサーバーとして使えるようになる。

ドライブ

[automount]
options = "metadata"

# mount -t drvfs e: /mnt/e/

のように手動マウントする。eはドライブ文字。アンマウントは

# umount /mnt/e/

wmic diskdrive list brief

でWindowsにマウントされたVHDのディスクパス(\\.\PHYSICALDRIVE1など)を調べ,

wsl --mount \\.\PHYSICALDRIVE1 --bare

でWSL2にマウントし,gpartedで領域確保しフォーマットして利用する。 

その他

sshdを動かしたりddでisoファイルを作るときは,Cygwinを使うのが便利。しかし,それらも,上述のように,WSL2でできるようになったので,Cygwinは必要なくなりつつある。