2021年9月22日水曜日

【WSL2】OS起動時に全自動でWSL2の起動と外部接続を行えるようにする

 Windows10はUpdateをして勝手に再起動するので困るのです。

 私の試した環境は

Windows 10 21H1 かな Windows 11insiderなんとか使ってるけど動くかも
WSL2 はcentos7を使用


答えは以下、Windowsアカウントログイン時にタスクスケジューラで最高権限でWSL2のIPアドレスをポートプロキシ設定をする。

  • (windows高権限コマンド)netshでポートの転送ができる。設定は揮発ではない。ただし毎回転送先(WSL2)のIPは変わるので、Windowsアカウントログイン時に毎回設定しないといけない
  • Windowsアカウントログイン時にコマンドを起動する方法…スタートアップでrunasするとUACでひと手間かかるのでタスクスケジューラで最高権限で動作させると良い。

以上ですが、補足をだーと書いときます。

  • ホストWindowsでlocalhost宛に接続を行えばWSL2に転送してくれるが上記のポートプロキシでlocalhostに飛ばしてもWSL2には接続してくれないこれで必ず高権限のコマンドの実施が必要となる。
  • windows10の自動ログイン割愛
  • WSL2でsystemdを使うには、systemdをpidを1で動かす必要があり仮想的に動かすのシンプル。daemonizeなどは標準では導入できないのでレポジトリ追加などが必要(ubuntuは標準かな)
  • WSL2は自動的には起動はできないのでWindowsからwsl.exe から以下コマンドを起動してあげる
if [ "xx" = "x$(pidof systemd)x" ]; then
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
fi

ついてこれてますか、ここからは余談の情報ですが

  • ここでWindowsのネットワークアダプタ"vEthernet (WSL)"に別IPを振れば良いのではないかと思われるかもしれませんがこの方が手間です(実装は可能です)

  • systemdを起動するとnetwork.serviceが動作するのでeth0がリセットされる
  • → /etc/init.d/network 自体もうまく動かないようでタイムアウト待ちになる。
  • → /etc/init.d/networkを exit 0にすれば良いのでけれども何かの拍子でもとに戻った場合都度書き換えないといけない
  • WSL2 のデフォゲを振ったものにしないと応答しない。その実行タイミングもnetwork.targetのAfterで動かすサービスを作らないといけない

その他

  • WSL2上からもWindowsコマンドは実行出来ますが、管理者権限が必要なものは正常に行ったようにみえて中身反映されない。くそめんどくさいcmd.exeでコマンドを組み立てないといけない、、、あpower shell?script?があるのねいらないけど

 

絡み合う事項が多すぎてたどり着いてる人が居ないという、、