tag:crieit.net,2005:https://crieit.net/tags/WSL/feed 「WSL」の記事 - Crieit Crieitでタグ「WSL」に投稿された最近の記事 2023-10-29T22:05:54+09:00 https://crieit.net/tags/WSL/feed tag:crieit.net,2005:PublicArticle/18631 2023-10-29T22:01:49+09:00 2023-10-29T22:05:54+09:00 https://crieit.net/posts/how-to-fix-login-user-on-wsl 【WSL】ユーザアカウントにログインできなくなった場合の確認と対処方法 <p>こんにちは、しきゆらです。<br /> 今回は、WSL起動時に初期設定したユーザでログインできなくなったので、調べたり対応したことをメモしておきます。</p> <p>WSLのインストール時にユーザアカウントを作成しますが、いつの間にかユーザアカウントへログインできずにrootとしてログインしてしまう状況になっていました。<br /> 何が起こっているのかわからなかったので、諸々も調べてユーザアカウントとしてログインできるよう修正したのでメモしておきます。</p> <p>WSLはWindows Subsystem for Linuxという通り、動いているのはLinuxになります。<br /> なのでLinuxコマンドや各ファイルをもとに確認していきます。</p> <h2 id="作業の流れ"><a href="#%E4%BD%9C%E6%A5%AD%E3%81%AE%E6%B5%81%E3%82%8C">作業の流れ</a></h2> <p>ざっと流れを記載しておくと以下の通りです。</p> <ul> <li>現在ログインしているユーザを確認する</li> <li>ユーザアカウントの有無を確認する</li> <li>デフォルトのログインユーザを指定する</li> <li>指定したユーザでログインできるか確認する</li> </ul> <p>では、それぞれを見ていきます。</p> <h3 id="現在ログインしているユーザを確認する"><a href="#%E7%8F%BE%E5%9C%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">現在ログインしているユーザを確認する</a></h3> <p>ほぼログイン時のパスなどでわかると思いますが、念のため書いておきます。<br /> <code>whoami</code>コマンドで確認すると以下のように表示されます。</p> <pre><code class="bash">> whoami root </code></pre> <p>コマンド名の通り、現在のユーザを確認するコマンドになります。 rootとなっていれば大本の管理アカウントなので、普段使っているユーザアカウントとは異なっていることがわかります。</p> <p>ユーザアカウントの有無を確認する</p> <p>続いて、これまで使っていたユーザが残っているのかどうかを確認してみます。<br /> これはコマンドではなく<code>/etc/passwd</code>ファイルにまとまっているので、中身を確認してみます。<br /> このファイルには、ユーザ以外にもデーモンなど裏側で作られているものも含まれているので、grepコマンドでほしい情報があるかを絞ったほうが見やすいです。</p> <pre><code class="bash"># 全体の確認 > cat /etc/passwd root:x:0:0:root:/root:/bin/bash ... ### これまでのアカウントがあるかどうかを確認する場合 > cat /etc/passwd | grep <ユーザ名> # ファイルの中にユーザ名が含まれていればその行が表示され、含まれていなければ何も表示されません </code></pre> <p>grepしてユーザ名が書かれた行がなければ、<code>/home/<ユーザ名></code>のディレクトリを確認し必要なファイルのバックアップを取ったうえで初期化したほうが良いかもしれません。</p> <p>私の場合は、このファイルにユーザ名の行があったので以下の手順で復帰しました。</p> <h3 id="ログインするユーザを指定する"><a href="#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B">ログインするユーザを指定する</a></h3> <p>上記でユーザが残っていることはわかったので、ログインするユーザを明示してあげます。<br /> 記載するファイルは<code>/etc/wsl.conf</code>で以下のように記載します。</p> <pre><code># 以下を追記 [user] default=<ユーザ名> # ログイン時にWindowsのパス情報を追加したくない場合は以下も記載 [interop] appendWindowsPath = false </code></pre> <p>上記を記載したら、念のためWSLの再起動をしてあげた後にログインしてみましょう。<br /> PowerShellからWSLを止めます。</p> <pre><code class="powershell"># PowerShellからWSLをシャットダウンする > wsl --shutdown </code></pre> <h3 id="指定したユーザでログインできるか確認する"><a href="#%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">指定したユーザでログインできるか確認する</a></h3> <p>WSLを一度シャットダウンしたので、該当するディストリビューションへログインましょう。</p> <pre><code class="PoqweShell"># wslを立ち上げてログインする > wsl -d <ディストリビューション> </code></pre> <pre><code class="bash"># whoamiコマンドで意図したユーザとしてログインできているかを確認する > whoami <ユーザ名> </code></pre> <p>無事に指定したユーザでログインできれば、修正完了です。</p> <p>rootのままだった場合は、ユーザの指定を間違えていないかを確認してみてください。<br /> 解消しなければ「ユーザアカウントの有無を確認する」のところにも記載していますが、バックアップを取ったうえで初期化したほうが安全かと思います。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回は、WSLのログインがrootになってしまったので修正方法を調べつつまとめました。<br /> 私の場合は、たまたま今回はアカウントが残っていたので無事に修正できましたが、アカウントそのものが残っていない場合は復旧が難しいかもしれません。<br /> その場合は、できるだけ必要なファイルをバックアップしたうえで初期化するしかないかと思います。<br /> 幸い、WSLの初期化は簡単なので使える状態にするには時間がかからないかと思います。</p> <p>参考情報としてLinuxディストリビューションの登録解除の方法を置いておきます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#unregister-or-uninstall-a-linux-distribution">WSL の基本的なコマンド | Microsoft Learn https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#unregister-or-uninstall-a-linux-distribution</a></p> <p>今回は、ここまで。</p> <p>おわり</p> しきゆら tag:crieit.net,2005:PublicArticle/18318 2022-11-19T08:32:00+09:00 2022-11-19T08:33:44+09:00 https://crieit.net/posts/systemd-supported-in-wsl 【WSL2】systemdがサポートされたようなので試してみた <p>ここ数年はWindowsの環境をクリーンインストールするたびにWSL2の環境を作り直し、その度にgenieを使ってsystemdをPID 1 にするための方法をメモしてきました。<br /> <a target="_blank" rel="nofollow noopener" href="https://shikiyura.com/2020/06/execute_systemctl_on_wsl2/">【WSL2】systemctlが動かない問題をきちんと解決する</a><br /> <a target="_blank" rel="nofollow noopener" href="https://shikiyura.com/2020/08/run_systemd_as_pid_1_on_wsl2/">【WSL2】Ubuntu20.04でPID1をSystemdにする</a><br /> <a target="_blank" rel="nofollow noopener" href="https://shikiyura.com/2021/03/run_systemd_as_pid_1_on_wsl2_at_202103/">【WSL2/Ubuntu】systemdをPID1で動かす 2021年3月版</a></p> <p>しかし、気が付いたらWSL自体がsystemdをサポートしたようなので、WSLだけでsystemdをPID 1にしてみたのでメモしておきます。</p> <p>詳しいことは公式ブログを参照ください。<br /> <a target="_blank" rel="nofollow noopener" href="https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/">Systemd support is now available in WSL!</a></p> <h2 id="設定手順"><a href="#%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86">設定手順</a></h2> <p>公式ブログによると、WSLのバージョンが0.67.6以上で使えるとのこと。<br /> なお、手元のWSLのバージョンを確認するとすでに1.0になっていたのでだいぶ前から使えたんだなぁともっと早く気づきたかった気持ちでいっぱいです。<br /> 確認するためのコマンドは以下の通り。</p> <pre><code class="powershell">powershell > wsl --version WSL バージョン: 1.0.0.0 カーネル バージョン: 5.15.74.2 WSLg バージョン: 1.0.47 MSRDC バージョン: 1.2.3575 Direct3D バージョン: 1.606.4 DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp Windowsバージョン: 10.0.22621.819 </code></pre> <p>なお、WSLの更新もwslコマンドでできるようになったようなので、バージョンが古い場合は以下のコマンドで更新すればよい。</p> <pre><code class="powershell">powershell > wsl --update </code></pre> <p>次に、WSL環境にwsl.confというファイルを作成し、以下を書き込む。</p> <pre><code class="bash">wsl(Ubuntu) > sudo emacs /etc/wsl.conf # 以下を追記 [boot] systemd=true </code></pre> <p>書き込んだらWSL環境を再起動。<br /> これにて準備完了です。</p> <pre><code class="powershell">powershell > wsl --shutdown </code></pre> <p>この後、WSL環境に入りsystemctlを動かしてみます。<br /> 以下のようにエラーが起きずにつらつら表示されたらOK。</p> <pre><code class="bash">wsl(Ubuntu) > systemctl UNIT LOAD ACTIVE SUB DESCRIPTION > sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-0fd20160\x2d7ac7\x2d4158\x2d9e38\x2d8685d280c3a6-net-eth0.device loaded active plugged /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0004:00/VMBUS:> sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-ba31a026\x2d5b46\x2d4a8d\x2da6dc\x2df00324cf1e90-pci5b46:00-5b46:00:00.0-virtio0-virtio\x2dports-vport0p0.device loaded active plugged /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0004:00/VMBUS:> sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-target0:0:0-0:0:0:0-block-sda.device loaded active plugged Virtual_Disk sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-target0:0:0-0:0:0:1-block-sdb.device loaded active plugged Virtual_Disk sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-target0:0:0-0:0:0:2-block-sdc.device loaded active plugged Virtual_Disk sys-devices-platform-serial8250-tty-ttyS0.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS0 sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS1 sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS2 sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS3 ... </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回は、WSLがsystemdをサポートしたということで設定してみました。<br /> 今後はgenieを入れずともWSLだけでsystemdを使えるので、より手軽に環境を使えるようになりました。</p> <p>今回は、ここまで。</p> <p>おわり</p> しきゆら tag:crieit.net,2005:PublicArticle/18314 2022-11-10T10:08:52+09:00 2023-10-19T14:22:13+09:00 https://crieit.net/posts/WSL-Windows-Ubuntu 【WSL】WindowsでUbuntuを検証したいときによく使うコマンド <h2 id="確認済み環境"><a href="#%E7%A2%BA%E8%AA%8D%E6%B8%88%E3%81%BF%E7%92%B0%E5%A2%83">確認済み環境</a></h2> <ul> <li>Windows 11 22H2</li> </ul> <h2 id="Ubuntuをインストール"><a href="#Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Ubuntuをインストール</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、WSL未導入の場合は再起動(バックグラウンドでWSLを導入するため、ハイパーバイザーや仮想マシンプラットフォーム機能などが有効化されるため)が必要です。再起動後Ubuntuが起動するのでID/PWの設定を行います。</p> <pre><code class="dos">> wsl --install -d Ubuntu </code></pre> <h2 id="インストール状況を確認する"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%8A%B6%E6%B3%81%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">インストール状況を確認する</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、インストールされたディストリビューション名や状態、WSLバージョンが確認できます</p> <pre><code class="dos">> wsl -l -v </code></pre> <h2 id="Ubuntuをエクスポート"><a href="#Ubuntu%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">Ubuntuをエクスポート</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、他のPCに環境を移動したい時に使います</p> <pre><code class="dos">> wsl --export "ディストリビューション名(例:Ubuntu)" "エクスポートファイル名(例:Ubuntu_export.tar)" </code></pre> <h2 id="Ubuntuをインポート"><a href="#Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88">Ubuntuをインポート</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、WSLを導入していないPCの場合は事前に導入が必要です(私の環境ではWSL未導入だと--importオプションが使えませんでした)</p> <pre><code class="dos">> wsl --import Ubuntu "インポート先のフォルダ名(例:c:¥wslimg→フォルダがない場合は自動で作られる)" "エクスポートファイル名(例:Ubuntu_export.tar)" </code></pre> arohajiro tag:crieit.net,2005:PublicArticle/16657 2021-01-27T09:33:58+09:00 2023-02-22T12:42:54+09:00 https://crieit.net/posts/VPN-WSL2-Hyper-V-VM VPN に繋ぐと WSL2 や Hyper-V VM でネットワークに繋がらなくなる問題を解消する <p>OpenVPN や Cisco AnyConnect, GlobalProtect 等といった VPN に接続した際、 Hyper-V 仮想マシン内からや、 WSL2 のディストリビューション内、 Windows Sandbox 内、 WSL2 ベースの Docker コンテナ内 等々、 Hyper-V 系の技術を使った仮想環境から、 PC 外のネットワークにアクセスしようとすると、 以下のようなエラーが発生して失敗する。</p> <pre><code class="console">$ # curl 利用時の例 curl: (6) Could not resolve host: example.com curl: (5) Could not resolve proxy: proxy.example.com $ # apt で更新しようとした場合の例 W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease Temporary failure resolving 'proxy.example.com' </code></pre> <p>エラーの内容からわかるとおり、アクセス先やプロキシーのドメイン名を DNS で解決できなくなっている。</p> <p>このような問題が発生することは以前から知っていたのだが、このご時世で VPN 使うことが増えてきて、いい加減鬱陶しくなってきたので、なんとかしようと思う。</p> <h2 id="解決方法"><a href="#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95">解決方法</a></h2> <p>とりあえず、まずは解決方法から。</p> <p>以前は AnyConnect でもこの方法が使えたはずなのだが、どうやら対策されて打つ手なしになってしまった模様。<br /> 今のところ、以下の方法で回避の確認が取れているのは、 GlobalProtect のみだ。</p> <ol> <li>WSL2 の場合は何らかの WSL2 を使ったディストリビューションを立ち上げる。 <ul> <li>WSL 2 based engine が有効になった Docker Desktop を起動するだけでも OK。</li> <li>WSL2 を使っていないなら、何もする必要はない。</li> </ul></li> <li>VPN を接続状態にする。</li> <li><p>管理者権限で Windows PowerShell を立ち上げ、以下のコードを実行する。 (GlobalProtect の例)</p> <pre><code class="powershell">$targetIfName = 'PANGP Virtual Ethernet Adapter'; # define function function Get-NetworkAddress { param([Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$IPAddress, [Parameter(Mandatory, ValueFromPipelineByPropertyName)][int]$PrefixLength); process { $bitNwAddr = [ipaddress]::Parse($IPAddress).Address -band [uint64][BitConverter]::ToUInt32([System.Linq.Enumerable]::Reverse([BitConverter]::GetBytes([uint32](0xFFFFFFFFL -shl (32 - $PrefixLength) -band 0xFFFFFFFFL))), 0); [pscustomobject]@{ Addr = $IPAddress; Prfx = $PrefixLength; NwAddr = [ipaddress]::new($bitNwAddr).IPAddressToString + '/' + $PrefixLength; }; } } # extend route metric $targetAddresses = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match 'Hyper-V Virtual Ethernet Adapter' | Get-NetIPAddress -AddressFamily IPv4 | Get-NetworkAddress; $targetIfs = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match $targetIfName; $targetIfs | Set-NetIPInterface -InterfaceMetric 2; $targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $_.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $_.Prfx).NwAddr } } | Set-NetRoute -RouteMetric 6000; </code></pre> <ul> <li>GlobalProtect 以外の場合は、 上記コード一行目の <code>'PANGP Virtual Ethernet Adapter'</code> のところを VPN ソリューションの ネットワーク接続 アダプタ名に書き換える。<br /> 具体的には、 <code>Win+R</code> で <code>ncpa.cpl</code> を実行して「ネットワーク接続」を開き、該当する VPN の接続のプロパティを開いて、 "接続の方法" のところに書かれた名前 (の一部) を指定する。 <ul> <li>OpenVPN なら <code>TAP-Windows Adapter</code> とか、 AnyConnect なら <code>Cisco AnyConnect</code> とか。 環境によっても違うかも。</li> </ul></li> <li>管理者権限の PowerShell は、 スタート ボタンを右クリックで簡単に立ち上げられる。<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2021/01/wsl-hyperv-with-vpn-01.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2021/01/wsl-hyperv-with-vpn-01.png" alt="" /></a></li> <li><p>1回の実行で成功しない場合、 <strong>上記コードの最後の行</strong> を、ルートメトリックが書き換わるまで何度もしつこく実行する。</p> <ul> <li><p>ルートメトリックが書き換わっていない状態の例:</p> <p>```text/plain<br /> $targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $<em>.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $</em>.Prfx).NwAddr } }</p> <p>ifIndex DestinationPrefix NextHop RouteMetric ifMetric<br /> ------- ----------------- ------- ----------- --------<br /> 36 172.30.175.255/32 0.0.0.0 0 0<br /> 36 172.30.160.1/32 0.0.0.0 0 0<br /> 36 172.30.160.0/20 0.0.0.0 0 0<br /> 20 172.18.31.255/32 0.0.0.0 0 0<br /> 20 172.18.16.1/32 0.0.0.0 0 0<br /> 20 172.18.16.0/20 0.0.0.0 0 0<br /> ```</p></li> <li><p>ルートメトリックの書き換えに成功した例:</p> <p>```text/plain<br /> $targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $<em>.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $</em>.Prfx).NwAddr } }</p> <p>ifIndex DestinationPrefix NextHop RouteMetric ifMetric<br /> ------- ----------------- ------- ----------- --------<br /> 36 172.30.175.255/32 0.0.0.0 6000 0<br /> 36 172.30.160.1/32 0.0.0.0 6000 0<br /> 36 172.30.160.0/20 0.0.0.0 6000 0<br /> 20 172.18.31.255/32 0.0.0.0 6000 0<br /> 20 172.18.16.1/32 0.0.0.0 6000 0<br /> 20 172.18.16.0/20 0.0.0.0 6000 0<br /> ```</p></li> </ul></li> </ul></li> <li>上記を、 <strong>PC を再起動したり、 VPN を接続しなおす度に、毎回実行</strong>する。</li> </ol> <h2 id="解説"><a href="#%E8%A7%A3%E8%AA%AC">解説</a></h2> <p>上記のコードは、 VPN プロバイダが ホスト PC に作成しているルーティングの設定のうち、 Hyper-V や WSL に関係する宛先ものだけ、ルーティングのメトリックをめっちゃ長くしている。</p> <p>Hyper-V や WSL のネットワークの仕組みに簡単に触れながら、もう少し細かく説明していこう。</p> <h3 id="Hyper-V と WSL2 の NAT"><a href="#Hyper-V+%E3%81%A8+WSL2+%E3%81%AE+NAT">Hyper-V と WSL2 の NAT</a></h3> <p>まずそもそもの前提として、 <strong>ホストPC と WSL2 の仮想環境で異なる IPアドレス を持っている</strong>。<br /> 利便性のため、 WSL2 の localhost のリッスンが、ホスト PC の localhost へ転送されているなど、 IPアドレス が異なることをあまり意識せずすむような仕組みにはなっているけれども。</p> <p>そして その WSL2 や、 Hyper-V の VM では、 PC の外と通信する際に NAT を経由して通信を行う仕組みがメインとなる。</p> <p>このとき、 Hyper-V や WSL2 のバックエンドとなる Hyper-V ハイパーバイザーは、 ホスト PC 上に 仮想 NIC を作成する。<br /> そしてその仮想 NIC に、 <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network">WinNAT</a> と呼ばれる 機能を割り当て、 更に WSL2 向けには DNS の機能も割り当てて、 ホスト PC の外との通信の中継を担わせるようになっている。</p> <p>これら、 仮想 NIC や、 WSL2 に自動で割り当てられる IP アドレスは、 ホスト PC と被らない適当なプライベート IP アドレスが割り当てられる。</p> <p>なお、 <strong>やっかいなことに、この割り当てられた IP アドレスは、起動する度に毎回異なる。</strong></p> <p><img src="https://www.plantuml.com/plantuml/svg/VP51R-8m48Nl_XMZx6Nt0DBsY42YWggjH14I5HoQ7enj4Wjd78qTAAheRwzDqYQAr1wYEEFtldapcJhFoLU5OUwWiUJ42n2S9BmpW9qbgMXcZILOw2ptzyJFxCAOHgzepuK2zHPEo0rZf8Jdc1a5oODr7hOQfJqvMCsI2AkfoVAn-GHe8SagFpijk84xdoV07PIeHL-qqI5ehKbnRmasg-LLV2onhpq6aI9K7lxErPvNniFwfBt8_wKOtdbCjxnzhksXLtxyXR1TBtwmdPo9lkyjm7WmQBF70um_OhuH-0fH6OrPvseuR9gF8CKqadkNROi8wHZQKYlhGYxXARauy2p-ZdEfQB3vsZjQ6RVvL4zH_E_BmxWt7MrTWRbsdlIkyjhYrHawobYpZRyE1kF9onzIydNIe9jmdNfhlB2fGbaLvXC0.svg" alt="" /></p> <h3 id="VPN 側の動作"><a href="#VPN+%E5%81%B4%E3%81%AE%E5%8B%95%E4%BD%9C">VPN 側の動作</a></h3> <p>一方の ソフトウェア VPN では、 VPN の有効化と同時に、 ホスト PC のルーティングを片っ端から書き換えている。</p> <p>具体的には、 VPN の 仮想 NIC に対して短いメトリックとなるよう、 ルーティングを書き加える。<br /> それによって、全ての通信が VPN トンネルを通るようになっているのだ。</p> <p><img src="https://www.plantuml.com/plantuml/svg/VP4nRy8m48Lt_ufJkhG3IEs86AYWQYjHX4G50s4miKaid7DqTg2eeh-zDYQ2Hg9Pubo-z-xvRc0T9rUNcjcjmeeJBo7Z9E2R0QmD2Kb3emt1MEM5UoL-O4V653f96vv9a5_-X5mpHZ9p77Cj8Napri52eJ1x2zDX4ioYQp9vZv_-kPWaq-9WLSOrlBWY0MwXGfMreRaYLqScnOqXc4yd9tXNOPlTUKWIIWVt8xdXjNOmsokN5Gyf-dSHqasUFwFSzofs_pWiPkCRihtL9rqp1UXtEfViuG3zd-KTIR4AANlWQaIf5UPNG7TPA24ahhhdA3r8CGrzRaDDOs_g_pN2TYbWrsP7vkrujkLvMDAXajIPDzj08yACF-BToiSsxeVmz9Vr5HWfwqYjQwSCdfI-emWr4_NdO64kqRI95IfNy94D98gwrBy0.svg" alt="" /></p> <h2 id="そして悲劇が起こる"><a href="#%E3%81%9D%E3%81%97%E3%81%A6%E6%82%B2%E5%8A%87%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B">そして悲劇が起こる</a></h2> <p>その結果、どうなるか。</p> <p>ホスト PC から ゲスト VM (あるいは WSL ディストロ) のプライベート IPアドレス へ通信しようとすると、 <strong>VPN のトンネリング側にルーティングされてしまう</strong>。</p> <p>例えば、 WSL2 から ホストPC へ DNS の問い合わせ (クエリ) を受けると、 そのレスポンスが明後日の方向にルーティングされてしまう。<br /> これが、 <strong>ゲスト側で DNS による名前解決ができなくなる原因だ。</strong></p> <p><img src="https://www.plantuml.com/plantuml/svg/ZP51ZzCm48Nl_XMZS853Lu9Z5AqMRH4WbQXGr1wQ7bnxcbXrnf7jj4Ie_7Ri9X0QLCGXYZFvtfldcIVdkVLjhPaxAcguvJK8RYLyPm1xOoNQPwEDXOKgA__UyevT65FaqHwuGC1luKHSCsPHU4wbHaW-6ETXeqYQiuFbSnBDUjSa_pXy0emcoRBgd19SmpjV9S0TDAJ455gh4BHd2ZeO2-jbVeLF3KtPKu3G4dfuESS3RxM7rLbvKRqgABohc2v_-xMNXrxLwHyEczNYZkpiTDJzdW9aizcOFHuW-x5zOL7kOieKV4k4Mb7v1_2mhPIKIBk78KeA1HMnppreR1nCmxzROIRYmjBGz37RFyxp5Nn1rnXoE9L4c__GNCBJS77aPTnjrw2ThNyjaOoCg_dKZwH-FSN3xDxSig42S-MyLVlMAqDNPGWYOytq-k4-SPpHD8M_ytrkqNO36TGH7Ltk2oxi2KcsjVu9.svg" alt="" /></p> <p>この問題を回避するため、 前述のスクリプトでは、 ルーティングテーブルを書き換えて、 ゲスト VM のアドレスに対して、 VPN の 仮想NIC のメトリックを長くすることで、 VPN にルーティングされないようにしているわけだ。</p> <p>本当は、 VPN へのルーティングを消してしまいたいところなのだが、 ルーティングを消しても、 VPN クライアントが即座にルーティングを復活させてしまうため、 メトリックを長くするだけにとどめている。</p> <p>なお、 GlobalProtect でも、書き換えたメトリックを戻される対策がされたようだが、 インターフェースメトリックを書き換えたり、 短期間に何度も書き換え直したりすると、メトリックを戻すことを諦めてくれる。<br /> このため、上記のようなコードになっている。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/WSL/issues/5068#issuecomment-683917384">WSL2 , problem with network connection when VPN used (PulseSecure) · Issue #5068 · microsoft/WSL | GitHub</a><br /> ちなみに、 上記の Issue ではもっと単純に、 WSL2 へのメトリックは 1 にして、 全ての VPN 関係のルーティングのメトリックを 4000 くらいに延ばすワークアラウンドが紹介されている。<br /> しかしそれだと、本来 VPN 経由にしなくてはならない通信までもが VPN 通らなくなったりする場合があって、 VPN を使わせるポリシー上マズい。<br /> このため、上述のように、 必要な ネットワークアドレス だけに絞ってメトリックを書き換えている。</p> <h3 id="別解"><a href="#%E5%88%A5%E8%A7%A3">別解</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/windows/wsl/troubleshooting#bash-loses-network-connectivity-once-connected-to-a-vpn">Microsoft Docs 上の WSL のトラブルシューティング</a> では、 WSL の <code>/etc/resolv.conf</code> の DNS を、 ホストPC の WinNAT ではなく VPN のトンネリング先のネットワークの DNS に書き換える方法も掲載されている。</p> <p>……が、 これを行うと、ゲスト側の DNS の名前解決こそできるようになるものの、 依然 ホストPC から ゲストOS へのパケットが届かない問題は解消されない。<br /> このため、 ゲストで立てたサーバーに、 ブラウザでアクセスしたり、 ssh 等でログインしたりと言ったことはできないままだ。</p> <p>更に、イントラネット内で別途 DNS を運用していた場合、イントラネット内の名前解決ができなくなる問題もある。</p> <p>このため、この DNS を書き換える方法は、望ましい解決方法とは言えない。</p> <h2 id="改訂履歴"><a href="#%E6%94%B9%E8%A8%82%E5%B1%A5%E6%AD%B4">改訂履歴</a></h2> <ul> <li>2023-02-22: <ul> <li>コードの一部でエラーが発生していた部分を修正。</li> </ul></li> <li>2023-02-14: <ul> <li>各社のメトリック書き換え対策に対し、 GlobalProtect 向けにコードを変更し、 AnyConnect 向けには打つ手なしとなったことを追記。</li> </ul></li> <li>2021-04-04: <ul> <li>Windows Sandbox などでも問題となる旨追記</li> <li>いくつかの VPN ソフトについての設定例を追記</li> <li>Microsoft Docs 記載の改善方法について追記</li> </ul></li> <li>2021-01-28: <ul> <li>仮想ネットワーク上に DHCP は存在しないのに、 DHCP の存在がすると誤記があったので修正。</li> <li>スクリプトで Hyper-V の仮想スイッチをさかす際に、 NIC 名ではなくて、ネットワークアダプタの接続名で探すように変更。</li> </ul></li> </ul> advanceboy tag:crieit.net,2005:PublicArticle/16439 2020-12-26T16:32:04+09:00 2020-12-26T16:33:43+09:00 https://crieit.net/posts/WSL WSLのディストリビューションの格納場所の移動 <p>WSLでUbuntuをインストールしたものの、Cドライブの容量が心元なかったため、ディレクトリ移動した際の手順を記述します。<br /> ``</p> <h5 id="◆手順"><a href="#%E2%97%86%E6%89%8B%E9%A0%86">◆手順</a></h5> <p><strong>1.ディストリビューションをtarファイルにエクスポート</strong></p> <pre><code>wsl --export Ubuntu-20.04 F:\Work\wsl\Ubuntu-20.04.tar </code></pre> <p><strong>2.ディストリビューションの削除</strong></p> <pre><code>wsl --unregister Ubuntu-20.04 </code></pre> <p><strong>3.ディストリビューションのインポート</strong></p> <pre><code>wsl --import Ubuntu-20.04 F:\Work\wsl\Ubuntu20.04 F:\Work\wsl\Ubuntu-20.04.tar </code></pre> <p>構文:<br /> wsl --import <ディストリ名> <インストールディレクトリパス> <1でエクスポートしたtar><br /> ※ ディストリ名は任意でいいらしい</p> <p>``</p> <p>思ったよりすごく簡単にできた。<br /> 3.でディストリ名を任意で設定できるということは、コピーしてディストリ名を別にすれば環境の複製もできるんだろうなぁ。</p> ao-iro tag:crieit.net,2005:PublicArticle/16065 2020-09-20T19:59:37+09:00 2020-09-20T19:59:51+09:00 https://crieit.net/posts/Windows-WSL-Ubuntu-GoogleChrome Windows WSLのUbuntuにGoogleChromeをインストールする <p>Railsで開発をしていてRspecでChromeDriverでのテストを利用しているためChromeが必要になったのでインストール</p> <pre><code class="bash">sudo apt-get update # 必要なライブラリのインストール sudo apt-get install libappindicator1 libappindicator3-1 fonts-liberation # 最新安定版のDL、インストール curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome-stable_current_amd64.deb # ここでパッケージの依存関係で怒られたので依存関係の解消 sudo apt --fix-broken install # 再度インストールを試した sudo dpkg -i google-chrome-stable_current_amd64.deb # インストールされていることの確認 google-chrome --version </code></pre> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://loumo.jp/archives/19801">WSL Ubuntu 18.04 に Headless Chrome を入れて Ruby で操作する | Lonely Mobiler</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ma-tsu-ba-ra/items/25e404387d1726d21cc9#wslでもheadless-chromeを使ってみよう">WindowsとWSLでHeadless Chromeを使ってみよう! - Qiita</a></li> </ul> あっきー💃 tag:crieit.net,2005:PublicArticle/15469 2019-10-09T11:22:41+09:00 2019-10-09T11:22:41+09:00 https://crieit.net/posts/Proxy-vscode-WSL-5d9d4471f2671 Proxy 下で vscode の WSL 上の他の拡張機能のインストールに失敗する <p>プロキシ環境下の vscode で、 WSL 上で拡張機能を動かしたいのに、 インストールインストールに失敗する問題を解決するメモ。</p> <p>前回の↓の記事は、 『Remote – WSL 拡張が有効にできない』問題だったが、今回は『Remote – WSL 拡張 を有効にした後、その環境上で他の拡張機能がインストールできない』問題なのでちょっと違う点に注意。ややこしいね。<br /> <a href="https://crieit.net/posts/Proxy-vscode-WSL">https://crieit.net/posts/Proxy-vscode-WSL</a></p> <h2 id="遭遇した問題"><a href="#%E9%81%AD%E9%81%87%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C">遭遇した問題</a></h2> <p>Visual Sutdio Code (以下、 vscode) へ 無事に Remote – WSL 拡張機能 の "VS Code Server for WSL" のインストールが完了し、 Windows 上から 快適に WSL の環境にアクセスできるようになった。<br /> しかし、 いくつかの vscode の拡張機能は、 Windows 上の環境とは別に WSL 上の環境で改めてインストールしなくてはならない。</p> <p>そこで、 UI 上の案内に従って各拡張機能で "Install in WSL" を行ったところ、 プロキシ環境下だと以下のエラーが発生してインストールに失敗する問題に遭遇した。</p> <pre><code class="text">Failed to install extension </code></pre> <p>パネル上の OUTPUT タブで "Log (Remote Server)" の情報を見ると、以下のようなエラーが発生しているのがわかる。</p> <pre><code class="text">[remoteagent] [error] Failed to install extension: {拡張機能ID} connect ECONNREFUSED 13.107.6.175:443 </code></pre> <p>settings.json ではプロキシの設定しているし、更には WSL 上の環境変数 (<code>http_proxy</code>, <code>https_proxy</code>) にだってプロキシを入れている。<br /> 更には(前述の)前回の記事に倣って、 WSL のコンソール上から <code>code .</code> の立ち上げまで行ってみた。</p> <p>それでも解消しない。何故だ。</p> <p>なお、試した vscode のバージョンは、 August 2019 (version 1.38.1) だ。</p> <h2 id="&quot;Remote [WSL]&quot; 用の設定ファイルを書き換える"><a href="#%26quot%3BRemote+%5BWSL%5D%26quot%3B+%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">"Remote [WSL]" 用の設定ファイルを書き換える</a></h2> <p>Remote – WSL 拡張をインストールすると、 Settings のウィンドウに "Remote [WSL]" というタブが増えている。<br /> <a href="https://crieit.now.sh/upload_images/c1422cf5784c566f688efb098c252f495d9d4402696fa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c1422cf5784c566f688efb098c252f495d9d4402696fa.png?mw=700" alt="1910_vscode-remote-wsl_01.png" /></a></p> <p>そのタブに移動してみると、 Proxy の設定が空欄になっているのがわかる。<br /> <a href="https://crieit.now.sh/upload_images/d51b7217c7491a53f7a90acaf108f09f5d9d4419a4903.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d51b7217c7491a53f7a90acaf108f09f5d9d4419a4903.png?mw=700" alt="1910_vscode-remote-wsl_02.png" /></a><br /> "Modified in: User" って書いてあるので、 User タブの内容で上書きされる動作をしてくれそうだったり、 設定されてなかったら <code>http_proxy</code>, <code>https_proxy</code> の環境変数の値が使われると書いてあったりしているが、 とりあえずその情報は無視。</p> <p>この "Remote [WSL]" 上のプロキシの設定も、 User タブと同様に改めて記載して保存し、 vscode をリロードしてみる。<br /> <a href="https://crieit.now.sh/upload_images/2d1f0e628d1ffe8769c785993596ba165d9d442db205f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2d1f0e628d1ffe8769c785993596ba165d9d442db205f.png?mw=700" alt="1910_vscode-remote-wsl_03.png" /></a></p> <p>その結果、 <strong>WSL 上の拡張機能もインストールに成功するようになった!</strong></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <ul> <li>プロキシ環境下で WLS - Remote を使うときは、 Settings の "Remote [WSL]" タブにもプロキシの設定を書こう。</li> <li>WSL 上の <code>http_proxy</code>, <code>https_proxy</code> の環境変数を設定しただけでは、 vscode の全ての通信をプロキシ経由にするには不十分のようだ。 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1172">VS Code Server for WSL の更新のため</a> に、これらの環境変数は設定しておくべき。</li> <li>もしかしたら、 Windows 側の環境変数にも上記の値を設定させておけば、 本問題が発生しないのかも知れないが、試していない。</li> </ul></li> <li>vscode のプロキシ環境下の動作の作り込みは、まだまだ甘い。</li> </ul> advanceboy tag:crieit.net,2005:PublicArticle/15468 2019-10-09T11:02:59+09:00 2019-10-09T11:32:30+09:00 https://crieit.net/posts/Proxy-vscode-WSL Proxy 下で vscode の WSL 拡張へ接続できない <p>Windows 上の Visual Studio Code (以下、 vscode) で、WSL 上のファイルやシェルを使えるようになる、 <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl">Remote - WSL</a> 拡張機能。</p> <p>これを、プロキシ環境下でインストールしたり更新したりすると、 vscode から WSL 環境ににアクセスするときに、</p> <pre><code class="text">VS Code Server for WSL closed unexpectedly. Check WSL terminal for mor details. </code></pre> <p>とエラーになってしまう。</p> <p>WSL ターミナルのログを見てみると、だいたい以下のようになっていて、どうやら update.code.visualstudio.com から VS Code Server の更新版のファイルをダウンロードするのに失敗しているように見える。</p> <pre><code class="text">Starting VS Code Server inside WSL (default distro) Extension version: 0.39.5, Windows build: 17763. Multi distro support: disabled. WSL path support: enabled Probing if server is already installed: C:\WINDOWS\System32\wsl.exe -e sh -c "[ -d ~/.vscode-server/bin/3db7e09f3b61f915d03bbfa58e258d6eee843f35 ] && echo found || echo missing" No server install found on WSL, downloading server on client side: C:\Users\user\AppData\Local\Temp\vscode-remote-wsl\3db7e09f3b61f915d03bbfa58e258d6eee843f35\vscode-server-linux-x64.tar.gz Unable to detect if server is already installed: Error: connect ECONNREFUSED 104.42.78.153:443 Launching C:\WINDOWS\System32\wsl.exe sh -c '"$VSCODE_WSL_EXT_LOCATION/scripts/wslServer.sh" 3db7e09f3b61f915d03bbfa58e258d6eee843f35 stable .vscode-server 0 --disable-telemetry' in c:\Users\user\.vscode\extensions\ms-vscode-remote.remote-wsl-0.39.5 WSL version: 4.4.0-17763-Microsoft Updating server... Updating VS Code Server to version 3db7e09f3b61f915d03bbfa58e258d6eee843f35 Removing previous installation... Downloading: Failed --2019-09-11 20:50:12-- https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable Resolving update.code.visualstudio.com (update.code.visualstudio.com)... 104.42.78.153 Connecting to update.code.visualstudio.com (update.code.visualstudio.com)|104.42.78.153|:443... failed: Connection refused. ERROR: Failed to download https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable to ~/.vscode-server/bin/3db7e09f3b61f915d03bbfa58e258d6eee843f35-xxxxxxxxxx.tar.gz VS Code Server for WSL closed unexpectedly. For help with startup problems, go to [https://code.visualstudio.com/docs/remote/troubleshooting#_wsl-tips](https://code.visualstudio.com/docs/remote/troubleshooting#_wsl-tips) </code></pre> <p>どう解決したものか。</p> <hr /> <h2 id="そもそも wget でダウンロードができる状態なのか"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82+wget+%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%AA%E3%81%AE%E3%81%8B">そもそも wget でダウンロードができる状態なのか</a></h2> <p>拡張機能の GitHub プロジェクト上の Issue によると、内部的には wget でファイルをダウンロードしているらしい。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/78">https://github.com/microsoft/vscode-remote-release/issues/78</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79">https://github.com/microsoft/vscode-remote-release/issues/79</a></p> <p><code>.bashrc</code> で http_proxy, HTTP_PROXY, https_proxy, HTTPS_PROXY 全ての環境変数にプロキシの URL を設定しているので、 wget に対してプロキシの情報は渡っているはずなのだが。。。</p> <p>とりあえず WSL を起動して、 書き込み権限がある適当なディレクトリで、エラーになっているファイルのダウンロードを <span style="font-family:monospace;word-break:break-word;">wget <a target="_blank" rel="nofollow noopener" href="https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable" rel="noopener" target="_blank">https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable</a></span> で試してみて、 成功するか試してみよう。</p> <p>私の場合、 以下のような初歩的なミスでダウンロードに失敗していた。</p> <ul> <li>HTTP_PROXY と HTTPS_PROXY の大文字の環境変数にしか設定しておらず、 wget がプロキシを認識してくれなかった。<br /> curl とかはどっちでもイケるから、気づくのに時間がかかった。</li> <li>何故か <code>~/.wget-hsts</code> のパーミッションが 666 に書き換わっていて、 wget のセキュリティエラーでダウンロードに失敗している事があった。</li> <li>カレントディレクトリが <code>/mnt/c/</code> になっていて、ダウンロードしたファイルの書き込めなかった。</li> </ul> <hr /> <h2 id="それでもダウンロードに失敗する"><a href="#%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B">それでもダウンロードに失敗する</a></h2> <p>以下の記事によると、 Windows 側から WSL Remote の VS Code Server を起動するとき、 .bash_profile や .bashrc, .profile などを読んでくれないらしい。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/432">https://github.com/microsoft/vscode-remote-release/issues/432</a><br /> このため、環境変数でプロキシを設定しても反映されないようだ。</p> <p>以下のどちらかを行うと、この問題を回避できる。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79#issuecomment-503989625">#79#issuecomment-503989625</a> のコメントのように、 <code>~/.wgetrc</code> にプロキシの設定を書く。 <ul> <li>http_proxy と https_proxy だけ設定すればよいはず。 check_certificate = off をむやみに設定するのはセキュリティ上良くない。</li> </ul></li> <li>いったんすべての VS Code を終了させ、 WSL のコンソール上で <code>code</code> と実行し、 Windows の VS Code を起動する。 <ul> <li>このとき、 WSL 側に Linux 版の VS Code がインストールされていると、そちらが起動してしまうのでダメ。</li> </ul></li> </ul> <p>正直、どちらが良いかは一長一短だ。</p> <p><code>.bashrc</code> や <code>.wgetrc</code> などあちこちにプロキシの設定を書くと管理が大変だし、<br /> VS Code Server が更新されるたびに WSL 側から VS Code を実行するのは手間だ。</p> <p>幸い、 <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79#issuecomment-504368316">#79#issuecomment-504368316</a> によると、 今後のバージョンでは VS Code Server のダウンロードを Windows 側で行うように更新する予定のようだ。<br /> それまでの間は逐一 WSL 側から VS Code を実行する方法で回避するのでも良いかもしれない。</p> <p>しかし、少なくとも現時点のバージョンである VS Code 1.38.0 + Remote - WSL 0.39.5 の組み合わせでは、そうなっていない。</p> advanceboy tag:crieit.net,2005:PublicArticle/14847 2019-03-01T09:57:47+09:00 2019-03-01T09:57:47+09:00 https://crieit.net/posts/WSL-Windows WSLでWindows側のフォントを使う <p>WSL側で使えるフォントを確認してみると最低限のものしかない。Windows側に入っているフォントをそのまま全部使いたかったのでその方法。</p> <p><code>/etc/fonts/conf.d</code>にフォントの設定ファイルがある。そこに下記の設定ファイルを入れる。</p> <pre><code class="xml"><?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <dir>/mnt/c/Windows/Fonts</dir> </fontconfig> </code></pre> <p>これでfc-listしてみるとフォントが追加されているのがわかる。(追加されない場合はキャッシュをクリアする)</p> <p>プログラム側で画像を描画する場合にもフォントが正しく表示されることが確認できた。</p> だら@Crieit開発者