Linux on Windows 10-11
(2022.3.18-2023.10.18)
WindowsではWSL2やCygwinでlinuxコマンドが使える。WSL2はLinuxのエミュレーターで,Linuxのバイナリーが動く。CygwinはLinuxの互換レイヤーで,LinuxのソフトウェアをCygwin環境で再コンパイルして使う。
インストール
コマンドプロンプトを管理者権限で起動して,
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ログインとコマンド実行
rootでログイン
wsl -u root
初期ディレクトリをlinuxのホームにするには,~/.bashrcにcd行を追加。
rootでコマンド実行
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 ssh startでエラーFailed to start ssh.service: Unit ssh.service not foundが出るときは# apt install ssh,no hostkeys availableが出る時は,# ssh-keygen -A
サービスが開始しているか確認するには
# 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をサーバーとして使えるようになる。
ドライブ
WSL2は(appdataの)仮想ハードディスク(VHD)ファイル ext4.vhdx に構成される。エクスプローラで\\wsl$と入力するか,LinuxをクリックするとVHDにアクセスできる。
Windowsのドライブは/mnt/にマウントされる。そこにファイルを作成すると,パーミッションが全て777になる。パーミッションを反映するには,/etc/wsl.confに次のように記述する(WSL再起動で反映)。
[automount]
options = "metadata"
光学ドライブ,USBメモリなどは
# mount -t drvfs e: /mnt/e/
のように手動マウントする。eはドライブ文字。アンマウントは
# umount /mnt/e/
Windows11では,仮想ハードディスク(VHD)をマウントできる。
wmic diskdrive list brief
でWindowsにマウントされたVHDのディスクパス(\\.\PHYSICALDRIVE1など)を調べ,
wsl --mount \\.\PHYSICALDRIVE1 --bare
でWSL2にマウントし,gpartedで領域確保しフォーマットして利用する。
その他
viの文字の色が見にくいので,~/.vimrcに :color desert 行を追加する。使える配色は $ ls /usr/share/vim/vim80/colors/
プロンプトのマシン名を変えるには,~/.bashrcのPS1=行の\hを変える。
PATHを通すには,~/.bashrcの末尾に次の行を追加する:
export PATH=$PATH:追加したいパス