tag:crieit.net,2005:https://crieit.net/tags/WSL2/feed 「WSL2」の記事 - Crieit Crieitでタグ「WSL2」に投稿された最近の記事 2023-05-07T08:55:07+09:00 https://crieit.net/tags/WSL2/feed tag:crieit.net,2005:PublicArticle/18427 2023-05-07T08:47:15+09:00 2023-05-07T08:55:07+09:00 https://crieit.net/posts/resolve-key-is-stored-in-legacy-truste-gpg-keyring-issue 【Ubuntu】apt updateでKey is stored in legacy trusted.gpg keyringと注意されたので対応する <p>こんにちは、しきゆらです。<br /> 今回は公式のドキュメントを見ながら対応したのに、<code>apt update</code>で怒られるようになったので<br /> なぜなのか調べつつ、対応方法を見つけて対応したのでメモしておきます。</p> <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>今回起こったのはPostgreSQLのインストール時のこと。<br /> PostgreSQLをインストールするためにリポジトリ追加を行った。 手順はこれ。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.postgresql.org/download/linux/ubuntu/">PostgreSQL: Linux downloads (Ubuntu) </a></p> <p>該当箇所は以下の通り。</p> <pre><code class="zsh"># Create the file repository configuration: $ sudo sh -c 'echo "deb <http://apt.postgresql.org/pub/repos/apt> $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # Import the repository signing key: $ wget --quiet -O - <https://www.postgresql.org/media/keys/ACCC4CF8.asc> | sudo apt-key add - # Update the package lists: $ sudo apt-get update # <= ここでWarningが出た ... Key is stored in legacy trusted.gpg keyring </code></pre> <p>ということで、記載されているが、そもそも何を怒っているのかを調べてみました。</p> <h2 id="何が起きているのか"><a href="#%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">何が起きているのか</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675">apt-keyはなぜ廃止予定となったのか</a><br /> <a target="_blank" rel="nofollow noopener" href="https://salsa.debian.org/apt-team/apt/-/commit/ee284d5917d09649b68ff1632d44e892f290c52f">Fully deprecate apt-key, schedule removal for Q2/2022 (ee284d59) · Commits · APT Developers / apt · GitLab</a></p> <p>apt-keyコマンドがだいぶ前の2020年8月ころから廃止予定で、2022年Q2に廃止となっていたようです。<br /> 手元の環境はWSL2上のUbuntu 22.10でしたが、まだ残っているようでした。<br /> 今後はなくなるんでしょう。</p> <blockquote> <p>セキュリティ上の懸念点からくるもので、簡単にまとめると次の2点が理由です。</p> <ol> <li>apt-key addは単一ファイル(/etc/apt/trusted.gpg)に鍵を追加していくため、複数のリスクの異なるリポジトリの鍵を同じ権限で管理しなくてはならない。</li> <li>リポジトリ鍵として追加した鍵は、すべてのリポジトリに対して適用される。</li> </ol> <p>引用元: https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675</p> </blockquote> <p>ということで、リポジトリごとにリスクが異なるカギを全体で使うのよくいないよね、ということでこれをやめた、という感じなのかなと。<br /> やめたはいいが、この記事時点では代替となるものが用意されていないようです。 今後は、各リポジトリで利用するカギを/usr/share/keyrings/配下に設置して個別に指定する運用が良いだろう、として締めています。</p> <h2 id="対応方法"><a href="#%E5%AF%BE%E5%BF%9C%E6%96%B9%E6%B3%95">対応方法</a></h2> <p>大きく分けると以下の通り。</p> <ol> <li>既存のカギを削除する</li> <li>別途カギを取得し設定しなおす</li> <li>リポジトリとカギを紐づける</li> </ol> <h3 id="1. 既存のカギを削除する"><a href="#1.+%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%AB%E3%82%AE%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">1. 既存のカギを削除する</a></h3> <pre><code class="zsh">$ apt-key list Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg # <= これを削除する --------------------------------------------- pub rsa4096 2011-10-13 [SC] B97B 0AFC AA1A 47F0 44F2 44A0 7FCC 7D46 ACCC 4CF8 uid [ unknown] PostgreSQL Debian Repository ... # 鍵の削除はfinger printの最後の8文字のようです $ sudo apt-key del ACCC4CF8 Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). OK # 消えたことを確認 $ apt-key list Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). ... </code></pre> <h3 id="2. 別途カギを取得し設定しなおす"><a href="#2.+%E5%88%A5%E9%80%94%E3%82%AB%E3%82%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%8A%E3%81%99">2. 別途カギを取得し設定しなおす</a></h3> <p>カギについては、ここに記載されているので取得して入れなおします。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.postgresql.org/download/linux/ubuntu/">PostgreSQL: Linux downloads (Ubuntu) </a></p> <pre><code class="zsh"># カギの取得 $ wget <https://www.postgresql.org/media/keys/ACCC4CF8.asc> # カギをgpgコマンドを使って変換 $ gpg --no-default-keyring -o postgresql-keyring.gpg --dearmor ACCC4CF8.asc # カギを確認 $ file postgres-keyring.gpg postgres-keyring.gpg: GPG keybox database version 1 ... # 変換したカギを/usr/share/keyrings/へ設置する # 手元ではフォルダがなかったので手動で作成 $ sudo mkdir -p /usr/share/keyrings $ sudo cp postgres-keyring.gpg /usr/local/share/keyrings </code></pre> <h3 id="3. リポジトリとカギを紐づける"><a href="#3.+%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%A8%E3%82%AB%E3%82%AE%E3%82%92%E7%B4%90%E3%81%A5%E3%81%91%E3%82%8B">3. リポジトリとカギを紐づける</a></h3> <p>リポジトリは/etc/apt/sources.list.d/pgdg.listに作成しているので、このファイルを以下のように変更。</p> <pre><code class="zsh"># deb [signed-by=/path/to/gpg_key] URLの形式でカギの場所を記載 deb [signed-by=/usr/local/share/keyrings/postgresql-keyring.gpg] <http://apt.postgresql.org/pub/repos/apt> kinetic-pgdg main </code></pre> <p>これにて対応完了です。<br /> Warningが出ないことを確認しましょう。</p> <pre><code class="zsh"># warningが出ないことを確認 $ sudo apt update ... Hit:7 <http://apt.postgresql.org/pub/repos/apt> kinetic-pgdg InRelease </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回は、apt-keyコマンドが廃止となっているために、ドキュメント通りに対応してもWarningが出てしまっていたので、諸々調べつつ対応してみました。 そもそもの廃止から知らなかったので勉強になりました。</p> <p>なお、DockerやGithub CLIでは /etc/apt/keyrings 配下に設置しているようです。<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository">Install Docker Engine on Ubuntu | Docker Documentation</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/cli/cli/issues/5122">Linux installation instructions recommend storing GPG keyring in the wrong location · Issue #5122 · cli/cli · GitHub</a></p> <p>管理をユーザ側でやる、という形であれば1か所にまとめたほうが良いので どこか1か所を決めて、リポジトリ追加時にそこへ追加していく方法をとったほうが良いかもしれません。<br /> DebianのWikiにも /etc/apt/keyrings 配下に設置しよう、となっているのでこっちに合わせたほうが良いかもしれません。<br /> <a target="_blank" rel="nofollow noopener" href="https://wiki.debian.org/DebianRepository/UseThirdParty">DebianRepository/UseThirdParty - Debian Wiki</a></p> <p>今回はここまで。<br /> おわり</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/18221 2022-06-12T20:06:21+09:00 2022-06-12T20:06:50+09:00 https://crieit.net/posts/WSL2-clasp-WSL2-clasp-push-Error-Looks-like-you-are-offline 【WSL2/clasp】WSL2上からclasp pushするとError: Looks like you are offline.と怒られる問題を回避する <p>こんにちは、しきゆらです。<br /> 今回は、タイトルの通りWSL2からclaspを使おうとするとofflineと怒られる問題が起こったのでこれを回避する方法をメモしておきます。</p> <p>気が付くとWSL2からclasp pushをしようとすると、以下のようなエラーが出てしまってプッシュできない状態になっていました。<br /> よくわからないですが、たまにプッシュできたりするので何が悪いのかよくわかりません。<br /> WSLをインストールしなおしたりしても解決しませんでした。<br /> また、調べてもそれっぽい記事が出てこないので「おま環」ぽい気がしています。</p> <p>さて、これではWSL内で書いたGASをプッシュできません。<br /> これを回避する方法をメモしておきます。</p> <p>回避方法は単純で、Docker上からclasp pushをするだけ。<br /> 調べてみると、結構DockerでGASを管理したい人がいるようで、情報がそこそこありました。<br /> ということで、プロジェクト諸々をDocker上にマウントしてコマンド実行できるようにしていきます。<br /> なお、ここではGASをTypeScriptで書いたのちWebpackでビルドしたものをclaspコマンドでプッシュする流れです。<br /> 参考: <a target="_blank" rel="nofollow noopener" href="https://qiita.com/rei-ta/items/61b3fde6a069b77d335d">https://qiita.com/rei-ta/items/61b3fde6a069b77d335d</a></p> <h1 id="Dockerの準備"><a href="#Docker%E3%81%AE%E6%BA%96%E5%82%99">Dockerの準備</a></h1> <p>まずは、Dockerの準備をしましょう。<br /> Dockerのインストールは、WSLのホストであるWindows側に行えば良いようです。<br /> Dockerfileを以下のように作成します。</p> <pre><code>FROM node:slim RUN npm install @google/clasp -g </code></pre> <p>claspを実行する環境が必要なので、イメージとしてnodeを使います。<br /> サイズが小さいほうが何かと便利なのでnode:slimを使っていますが、nodeが動けばなんでもよいかと思います。<br /> また、claspを使えるようにインストールしておきます。</p> <p>続いて、docker-compose.ymlを作成します。</p> <pre><code>version: "3" services: clasp: build: . tty: true stdin_open: true volumes: - "/home/:/usr/src" working_dir: /usr/src/${user} </code></pre> <p>clasp loginしたのち、認証情報がhome直下にできるため/home/${user}をマウントしています。<br /> これで準備は完了。</p> <h1 id="offlineと怒られる問題を回避する"><a href="#offline%E3%81%A8%E6%80%92%E3%82%89%E3%82%8C%E3%82%8B%E5%95%8F%E9%A1%8C%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B">offlineと怒られる問題を回避する</a></h1> <p>Dockerを立ち上げていきます。<br /> <code>docker-compose run --rm -u ${id -u $usr} clasp /bin/bash</code><br /> シェルが立ち上がったら以下のコマンドでログインします。<br /> <code>clasp login --no-localhost</code><br /> これにて準備は完了です。<br /> あとは、コードを書いてWebapckでビルドしたものをclasp pushしましょう。</p> <pre><code>node@ded2ca180394:$ clasp push └─ /usr/src/path/to/project/appsscript.json └─ /usr/src/path/to/project/bundle.js Pushed 2 files. </code></pre> <p>問題なくプッシュできていますね。<br /> これにて回避完了です。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>手元の環境では、これにてofflineと怒られる問題を回避できました。<br /> ちょっと手間ですが、ひとまずは回避できました。<br /> 同じような問題が起こっている場合は試して見てください。</p> <p>今回は、ここまで。<br /> おしまい</p> しきゆら tag:crieit.net,2005:PublicArticle/18153 2022-03-13T18:31:26+09:00 2022-03-13T18:31:26+09:00 https://crieit.net/posts/WSL2-Arch-systemctl WSL2(Arch)でsystemctlを使用できるようにするために行ったこと <p>環境:<br /> WSL=WSL2<br /> ディストリビューション=Arch</p> <p>TeraTarmでSSH接続をしたかったけれど、デフォルトではsystemctlが実行できないようだったので、設定を行った。</p> <p>【使用したもの】<br /> <a target="_blank" rel="nofollow noopener" href="https://rustrepo.com/repo/nullpo-head-wsl-distrod">Distrod</a></p> <p>【設定方法】<br /> 動いていたArchに入れたので、下記のページのOption2を実行<br /> <a target="_blank" rel="nofollow noopener" href="https://rustrepo.com/repo/nullpo-head-wsl-distrod#option-2-make-your-current-distro-run-systemd">Option 2: Make your Current Distro Run Systemd</a></p> <p>★実行内容<br /> 手順1:記載されている通りに実施<br /> 手順2:下記のほうを実行<br /> <code>/opt/distrod/bin/distrod enable</code><br /> 手順3は実行してもエラーとなっただけだった。</p> <p>【実行後】<br /> systemctl が利用できるようになっていて、daemonの再起動などもできるようになった。<br /> 便利。</p> ao-iro tag:crieit.net,2005:PublicArticle/16828 2021-04-10T00:26:58+09:00 2021-05-25T12:56:00+09:00 https://crieit.net/posts/VSCode-WSL-ssh-CMake-GoogleTest-C VSCode+WSL(ssh接続)+CMake+GoogleTestでC++プログラミング環境を構築 <p>以前の記事<br /> <a href="https://crieit.net/posts/VSCode-WSL-CMake-GoogleTest-C">VSCode+WSL+CMake+GoogleTestでC++プログラミング環境を構築</a><br /> で作った環境、なーーんかスマートじゃないなーと思ってたんですが<br /> WSLにssh接続で入るようにしたらしっくりきたので、改めて記事を書きました。<br /> ①以外は以前の記事とほぼ同じですが、この記事だけ読んでできるようにしたかったので、ご了承ください。<br /> Windows10のVersionは1803以降でお願いします。それより前だと、WSLのウインドウを開いておいてsshデーモンも起動して・・・とか毎回やらないとssh接続できないらしいです。</p> <h4 id="①VSCode&WSLでC/C++を使えるようにする"><a href="#%E2%91%A0VSCode%EF%BC%86WSL%E3%81%A7C%2FC%2B%2B%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B">①VSCode&WSLでC/C++を使えるようにする</a></h4> <h6 id="①-1 WSLを使えるようにする"><a href="#%E2%91%A0-1+WSL%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B">①-1 WSLを使えるようにする</a></h6> <p>画面左下の窓アイコンを右クリック→Windows Powershell (管理者)を選択。<br /> 出てきたウインドウに以下を打ち込んでしばし待ち、指示が出たらPC再起動します。</p> <pre><code>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux </code></pre> <h6 id="①-2 ubuntuをインストール"><a href="#%E2%91%A0-2+ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①-2 ubuntuをインストール</a></h6> <p>Microsoft Storeを開いてubuntuと入力し出てきたUbuntu 18.04 LTSをインストール&起動します。</p> <h6 id="①-3 ubuntu初期設定、gcc、opensshインストール"><a href="#%E2%91%A0-3+ubuntu%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%80%81gcc%E3%80%81openssh%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①-3 ubuntu初期設定、gcc、opensshインストール</a></h6> <p>インストール完了したら、ユーザー名パスワードを設定後、以下のコマンドで最新に更新、</p> <pre><code class="sh">$ sudo apt update $ sudo apt upgrade </code></pre> <p>次にgccなどをインストール、</p> <pre><code class="sh">sudo apt install build-essential </code></pre> <p>最後にopensshを入れなおします。</p> <pre><code class="sh">sudo apt-get purge openssh-server sudo apt-get install openssh-server </code></pre> <p>入れなおす事で、パスワード入力を不要にしたりとかRSA鍵を作ったりとか勝手にやってくれるっぽいです。</p> <h6 id="①-4 WindowsのVSCodeインストール"><a href="#%E2%91%A0-4+Windows%E3%81%AEVSCode%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①-4 WindowsのVSCodeインストール</a></h6> <p>vscodeでググった一番上のリンクから「今すぐダウンロード」してインストールしてください。</p> <h6 id="①-5 VSCodeに拡張機能をインストールしてWSLに接続"><a href="#%E2%91%A0-5+VSCode%E3%81%AB%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6WSL%E3%81%AB%E6%8E%A5%E7%B6%9A">①-5 VSCodeに拡張機能をインストールしてWSLに接続</a></h6> <p>「Remote Development」で検索して出てきたやつをインストール<br /> <a href="https://crieit.now.sh/upload_images/0d06249ecfc2f7e22566f5488ed5242c60706e1070007.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0d06249ecfc2f7e22566f5488ed5242c60706e1070007.png?mw=700" alt="image" /></a><br /> すると左側にモニタみたいなアイコンが出るのでクリック<br /> <a href="https://crieit.now.sh/upload_images/efcc14bf54749592002ebc1ca3780ae860706e33c17fd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/efcc14bf54749592002ebc1ca3780ae860706e33c17fd.png?mw=700" alt="image" /></a><br /> 表示されたubuntu18.04を選択して右のウインドウに+がついたようなアイコンをクリックでWSLに接続し、VSCode(WSL側)のウインドウがもう一つ表示されます。以降はVSCode起動後この2ポチでWSL環境が開きます。前より簡単ですね。</p> <h6 id="①-6 VSCode(WSL側)に拡張機能をインストール"><a href="#%E2%91%A0-6+VSCode%28WSL%E5%81%B4%29%E3%81%AB%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①-6 VSCode(WSL側)に拡張機能をインストール</a></h6> <p>①-5の最後で開いたWSL側のVSCodeに以下の拡張機能をインストール<br /> ・C/C++<br /> ・他日本語などお好みで<br /> ここまでやればC/C++のコーディングとビルドはできるようになります。</p> <h4 id="②cmakeのインストール"><a href="#%E2%91%A1cmake%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">②cmakeのインストール</a></h4> <p>以降の操作は①-3で使ってたウインドウでもできますが、VSCode(WSL側)のターミナル(bash)でも行えます。コピペとかしやすいので後者をおすすめします。</p> <pre><code class="sh">sudo apt-get install cmake </code></pre> <p>おわり</p> <h4 id="③GoogleTestのインストール"><a href="#%E2%91%A2GoogleTest%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">③GoogleTestのインストール</a></h4> <p>インストール方法をググると、tar.gzダウンロードしてきてせこせこ解凍したり、makeしたあと生成物をなぜか手動でコピーしてたりと色んなインストール方法が出てきますが、苦労なくできるのは以下です。</p> <pre><code class="sh">cd git clone https://github.com/google/googletest.git cd googletest mkdir build cd build cmake .. sudo make sudo make install </code></pre> <h4 id="④C++のコード書く"><a href="#%E2%91%A3C%2B%2B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B8%E3%81%8F">④C++のコード書く</a></h4> <p>書いてください。</p> <h4 id="⑤GoogleTest使ってみたソースのCMakeLists.txt"><a href="#%E2%91%A4GoogleTest%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AECMakeLists.txt">⑤GoogleTest使ってみたソースのCMakeLists.txt</a></h4> <pre><code class="sh">cmake_minimum_required(VERSION 3.0) project("hello_gtest") add_executable(hello_gtest main.cpp) target_link_libraries(hello_gtest PRIVATE gtest gmock pthread) </code></pre> <p>①②③あたりを上に書いた通りにやっておけば、includepathの指定とか特に何も書かないでも、上のような内容でビルド&実行できると思います。<br /> お疲れさまでした。次の⑥は読まなくていいです。</p> <h4 id="⑥■■■■■■■■■■"><a href="#%E2%91%A5%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0">⑥■■■■■■■■■■</a></h4> <p>前の記事で作った環境、正直なんか使いにくくてその後二度と自宅でC/C++打たなかったんですが、バチが当たってHDDがぶっ壊れたので、SSDに換装後、今回環境を作り直すにあたって、もっと楽にできるようにしてみました。</p> uskz 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/16240 2020-11-26T18:56:31+09:00 2021-05-25T12:15:30+09:00 https://crieit.net/posts/VSCode-WSL-CMake-GoogleTest-C VSCode+WSL+CMake+GoogleTestでC++プログラミング環境を構築 <p><strong>2021/4/9追記</strong><br /> WSLにssh接続で入った方が色々変な事気にしないでいいんじゃない?<br /> ということで、アップデートした記事を書きました。<br /> こちらになります。<br /> <a href="https://crieit.net/posts/VSCode-WSL-ssh-CMake-GoogleTest-C">VSCode+WSL(ssh接続)+CMake+GoogleTestでC++プログラミング環境を構築</a></p> <p>以下はアップデート前の記事です。</p> <hr /> <p>Windows10で掲題の環境を作成したのでメモ<br /> サクッとやりたかった<br /> 次の機会にはサクッとできるはず</p> <h4 id="①まずは↓を見ながらVSCode&WSLでC/C++を使えるようにする"><a href="#%E2%91%A0%E3%81%BE%E3%81%9A%E3%81%AF%E2%86%93%E3%82%92%E8%A6%8B%E3%81%AA%E3%81%8C%E3%82%89VSCode%EF%BC%86WSL%E3%81%A7C%2FC%2B%2B%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B">①まずは↓を見ながらVSCode&WSLでC/C++を使えるようにする</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://ynucpc.github.io/blog/2020/03/24/howtowsl-vscode/">WSL+VSCODEで競技プログラミング環境構築</a></p> <p>途中、</p> <blockquote> <p>拡張機能がインストールできたら上部のメニューから「ファイル」->「フォルダーを開く」<br /> から<strong>好きなフォルダー</strong>を開いてください。</p> </blockquote> <p>と書かれているが、自分は好きなフォルダーじゃなくて、<br /> <strong>WSLのrootfsディレクトリ以下</strong>を指定した<br /> 具体的にはUbuntu18.04なら以下</p> <pre><code class="sh">C:\Users\[ユーザー名]\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs </code></pre> <p>本当にマイドキュメントとか好きなフォルダにしたら、<br /> gtest.hをincludeするときとかの補完機能がなんかアレとか、CMakelists.txtを書く時に全然アレとか、<br /> とにかく無用な苦労をしたので・・・(だから「競技プログラミング」って書いてあったのかな)</p> <h4 id="②cmakeのインストール"><a href="#%E2%91%A1cmake%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">②cmakeのインストール</a></h4> <pre><code class="text">sudo apt-get install cmake </code></pre> <p>おわり</p> <h4 id="③GoogleTestのインストール"><a href="#%E2%91%A2GoogleTest%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">③GoogleTestのインストール</a></h4> <pre><code class="sh">cd git clone https://github.com/google/googletest.git cd googletest mkdir build cd build cmake .. sudo make install </code></pre> <p>ググると色んなインストール方法が出てくるが、自分が苦労なくできたのはこれだけだった<br /> 他はヒューマンのエラーが入る余地がありすぎる<br /> 特に最後のmake installはmakeだけやって手作業で.aとか.hをコピーしてる記事が多くてなんで?? ってなった</p> <h4 id="④C++のコード書く"><a href="#%E2%91%A3C%2B%2B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B8%E3%81%8F">④C++のコード書く</a></h4> <p>さすがに省略</p> <h4 id="⑤GoogleTest使ってみたソースのCMakeLists.txt"><a href="#%E2%91%A4GoogleTest%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AECMakeLists.txt">⑤GoogleTest使ってみたソースのCMakeLists.txt</a></h4> <pre><code class="sh">cmake_minimum_required(VERSION 3.0) project("hello_gtest") add_executable(hello_gtest main.cpp) target_link_libraries(hello_gtest PRIVATE gtest gmock pthread) </code></pre> <p>①②③あたりを上に書いた通りにやっておけば、includepathの指定とか特に何も書かないで<br /> 上の内容でビルド&実行できると思う<br /> お疲れさまでした。次の⑥は読まなくていいです</p> <h4 id="⑥■■■■■■■■■■"><a href="#%E2%91%A5%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0%E2%96%A0">⑥■■■■■■■■■■</a></h4> <p>仕事でどうしてもわかんないとこがあったが職場にいられる時間があまりなく、<br /> しかたない、家でC++環境構築してやってみるか・・男の子なら自宅WindowsPCで<br /> CやC++のコンパイル環境があるべきだよな・・・<br /> と思ってとりかかったら、上記の環境設定だけで終わってしまった</p> <p>何も考えず仮想PCにlinux入れてssh接続でやる方法ならむしろ確実だったが<br /> 「めんどい&重い&時間かかる」<br /> というのはわかっていたので、他に軽い方法ないかとググったらMinGWを使う方法がいっぱいでてきた<br /> このMinGWが無駄にした時間のほぼ全て<br /> 最初のapt-getに相当する部分でpacmanとか打ち込まされる時点で嫌な予感がして、<br /> 騙されたかなと思ってそれでもやってみたら騙された<br /> MinGWってなんで今も存在してるんだろう・・・</p> <p>WSLはすごい楽でした<br /> ありがとうMicroSoft</p> uskz 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/16041 2020-08-31T17:17:10+09:00 2020-08-31T17:17:10+09:00 https://crieit.net/posts/WSL-2-Desktop-Docker WSL 2 と Desktop Docker の開発環境を整えてみた <p>本来自分はゲーム作りたい系の人なのですが、人生の大河の流れに身を委ねていたらWeb開発に貢献する必要が出たので、某Webシステムの開発に貢献するために、開発環境を整えたいと思います。本記事は、そのための開発環境を整える記録ただの日記です。</p> <p>Web開発自体は、けっこうしばらくぶりなので(仕事でやっていたのが5年くらい前)、色々わかってないので調べながらになります。</p> <p>最終的な目標となる環境は Node.js、Express、MongoDB の環境を整えることですが、今回は、とりあえず Docker が使える状態になるところまでやってみます。</p> <p>自宅メインPCを最近新調していて、開発まわりの環境はほぼ整えていない状態で、ほぼ最初からやっていく感じです。メインPCの OS は Windows 10 Home です。</p> <h2 id="Windows Subsystem for Linux 2 (WSL 2) を利用するために Windows 10 をバージョンアップ"><a href="#Windows+Subsystem+for+Linux+2+%28WSL+2%29+%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB+Windows+10+%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97">Windows Subsystem for Linux 2 (WSL 2) を利用するために Windows 10 をバージョンアップ</a></h2> <p>巷ちまたでは、Web開発する際はローカルの仮想環境上で環境を整えて、その上でWebバックエンドのシステムを動かして動作確認して開発するのが主流のスタイルだと思うので、それに倣ならいたいと思います。</p> <p>で、Webバックエンド開発をする際、CUI(コマンドラインインターフェース)をよく使いますが、世に多くある技術情報は、Linux 環境が前提であるものが大多数です。Windows のコマンドプロンプトや PowerShell での開発情報は少ないので、できれば Linux 環境で開発したいです。</p> <p>Windows 10 で使える(いつのバージョンからかは分からないけど)Windows Subsystem for Linux (略して WSL)という機能を用いれば、Windows 環境上に Linux 環境を作ることができるので、これを使います。<br /> で、WSL にはバージョン1とバージョン2があり、どうやらバージョン2から、仮想環境を作る上での利点があるようなので、WSL 2 にしてみたいと思います。</p> <p>「windows10 wsl2 インストール」でGoogle検索したら、Microsoft の公式の解説ページがあったので、これを見ながら試してみます。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/windows/wsl/install-win10">Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs</a></p> <p>解説ページにある「WSL 2 に更新する」の項目で、以下のような記述がありました。</p> <blockquote> <p>WSL 2 に更新するには、次の条件を満たす必要があります。</p> <ul> <li>バージョン 2004、ビルド 19041 以上に更新された Windows 10 を実行している。</li> <li>Windows のバージョンを確認するには Windows ロゴ キー + R キーを押します。次に「winver」と入力し、 [OK] を選択します (または、Windows コマンド プロンプトで ver コマンドを入力します)。 お使いのビルドが 19041 より前の場合は、最新の Windows バージョンに更新してください。 Windows 更新アシスタントを入手する。</li> </ul> </blockquote> <p>メインPCにインストールされている Windows のバージョンを確認してみたところ、バージョン2004未満だったので、更新しようと思い、「最新の Windows バージョンに更新してください」という文からリンクされている Windows の設定([設定]→[更新とセキュリティ]→[Windows Update])から、更新をしてみたけど、バージョン2004まで上がりませんでした。</p> <p>調べてみると、「Download Windows 10」という Microsoft 公式ページから更新用プログラムをダウンロードしてインストールする必要があるようでした。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://qiita.com/homelan/items/eb5d404b1e67b8daf555">Windows10 バージョン2004 ビルド19041に上げてみた - Qiita</a></p> <p>このページを参考にして、Windows 10 のバージョンを上げてみたところ、うまくバージョンアップできました。</p> <p><a href="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cab70cd213.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cab70cd213.png?mw=700" alt="image.png" /></a></p> <h2 id="WSL 2の環境を整える"><a href="#WSL+2%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B">WSL 2の環境を整える</a></h2> <p>引き続き、Microsoft の公式ドキュメントに従ってWSL2の環境を整えます。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/windows/wsl/install-win10">Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs</a></p> <p>ドキュメントの「WSL 2 を既定のバージョンとして設定する」の項目にある、<code>wsl --set-default-version 2</code>コマンドを PowerShell で実行しようとしたところ、以下のようなエラーが発生しました。</p> <pre><code>> wsl --set-default-version 2 エラー: 0x1bc WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください </code></pre> <p>「wsl "set-default-version" "0x1bc"」でGoogle検索してみたら、それっぽいページが見つかりました。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/WSL/issues/5651">Error 0x1bc when setting wsl default version · Issue #5651 · microsoft/WSL</a></p> <p>Github の Microsoft 公式のWSLのリポジトリの issue です。(英語の読解スキルがまだまだ貧弱なので)Google翻訳して読んでいくと、カーネルエラーがどうのこうのって書いてありました。</p> <p>公式ドキュメントにも、以下のような注意書きがありました。</p> <blockquote> <p>このメッセージは、コマンド <code>WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel</code> を実行した後に表示されることがあります。 リンク (https://aka.ms/wsl2kernel) に従って、WSL 2 で使用する Linux カーネルをコンピューターにインストールするためのドキュメントのこのページから MSI をインストールしてください。 カーネルをインストールしたら、コマンドを再度実行すると、メッセージが表示されることなく正常に完了します。</p> </blockquote> <p>ここで説明されているメッセージが出たわけではないのですが、カーネルがどうのって書いてあって関係しそうなので、ここにあるリンクに従って何かをインストールしてみます。</p> <p>リンク先はここでした。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel">WSL 2 Linux カーネルの更新 | Microsoft Docs</a></p> <p>カーネル更新のインストールのようです。ここにある「x64 マシン用の最新の WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードしてインストールしてみます。(使用しているメインPCは 64ビット環境です)</p> <p>「wsl_update_x64.msi」というファイルがダウンロードされたので、インストーラーを実行します。</p> <p>インストールはすぐに終わりました。</p> <p>インストールが終わってすぐに、もう1回、PowerShell で<code>wsl --set-default-version 2</code>を実行してみます。</p> <pre><code>> wsl --set-default-version 2 WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください </code></pre> <p>エラーが表示されなくなりました。ふう……😓💦</p> <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>Microsoft 公式ドキュメントの流れに従い、Microsoft Store から Linux ディストリビューションをインストールします。開発に貢献する某システムの環境は Ubuntu で動作しているので、それに合わせて Ubuntu をインストールします。</p> <p><a href="https://crieit.now.sh/upload_images/5605666742df2b3bb27b959673dbff005f2cb6c824364.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5605666742df2b3bb27b959673dbff005f2cb6c824364.png?mw=700" alt="2020080701.png" /></a></p> <p>Windows のアプリ一覧から Ubuntu を起動させ、初期セットアップを行います。</p> <p><a href="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cb773d82c3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cb773d82c3.png?mw=700" alt="image.png" /></a></p> <p>新しい Linxu ディストリビューションのユーザーアカウントの作成とパスワードの設定を行いました。</p> <p>PoewrShell から<code>wsl --list --verbose</code>を実行して、Linux ディストリビューションに割り当てられている WSL のバージョンを確認します。</p> <pre><code>> wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2 </code></pre> <p>WSL 2で動いています。</p> <p>Windows Terminal にも、Ubuntu が認識されました。</p> <p><a href="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cbbf6b4a83.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2cbbf6b4a83.png?mw=700" alt="image.png" /></a></p> <h2 id="Docker のインストール"><a href="#Docker+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Docker のインストール</a></h2> <p>5年くらい前に私が仕事でWeb開発をやっていたときに使用していた仮想環境のためのツールが Vagrant だった記憶があります。しかし、昨今の流行は Docker というツールのようなので、それを使ってみたいと思います。(流行情報の追跡だけはちまちましている)</p> <p>「wsl2 docker」でGoogle検索して、以下のQiitaの記事が出てきたので、これを参考にして作業してみたいと思います。</p> <p>➢ <a target="_blank" rel="nofollow noopener" href="https://qiita.com/KoKeCross/items/a6365af2594a102a817b">Windows 10 Home で WSL 2 + Docker を使う - Qiita</a></p> <p>タスクマネージャーから確認※できる CPU の Virtualization が Enable になっていないといけない、ということなんですが、今の自分の環境で確認してみたら「仮想化」という様に日本語になっていました。そして、この項目は「有効」となっていたので問題なさそうです。</p> <p><a href="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2ccb49c2fa2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2ccb49c2fa2.png?mw=700" alt="image.png" /></a></p> <p>※タスクマネージャーの起動は Ctrl + Shift + Esc というショートカットキーを使うと便利です</p> <p>参考記事には WSL 2 の設定についても書かれていますが、これはもう完了しているので、Docker のインストールからの部分を参考にします。</p> <p>今や Docker は GUI で操作できるようなので、Docker Desktop for Windows を導入します。2020年8月7日時点での Stable 版(安定版)のインストーラーをダウンロードしてインストールします。インストーラーのウィンドウのタイトルバーに「Installing Desktop Docker 2.3.0.4 (46911)」と書いてあり、ここで初めてバージョンを確認できました。</p> <p>インストーラーの Configuration で Enable WSL 2 Windows Features にチェックがついているのを確認して [OK] ボタンを押すと、インストールが開始されました。インストールが完了すると「Installation succeeded」と表示され、「Close and log out」ボタンを押すと、Windows から強制的にログアウトしました。</p> <p>Windows の再ログインすると、Docker の GUI が起動しました。</p> <p><a href="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2ccdfb5177d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/73fa3c1674554d4f14b54d8812bf4b895f2ccdfb5177d.png?mw=700" alt="image.png" /></a></p> <p>チュートリアルをしてくれるみたいなんですが、一旦スキップします。</p> <p>Desktop Docker の設定(ギアのアイコン)の General で「Use the WSL 2 based engine (Windows Home can only run the WSL 2 backend)」にチェックが入っているのを確認します。確認すると、すでにチェックが入っていましたが、項目全体が薄灰色になっていて、チェックが外せないようでした。英語のカッコ書きで「Windows Home は WSL 2 バックエンドだけで動作する」って書いてあるので、WSL 2 が前提になっている状態なのでしょう。</p> <p>設定の Resouces の WSL INTEGRATION の「Enable integration with my default WSL distro」にチェックが入っているのを確認します。確認したら、問題なくチェックが入っていました。</p> <p>この WSL 2 での Docker を使えば、Hyper-V を使わなくても仮想環境が作れる、というのが利点のようなんですが、Hyper-V というのが BIOS 的な何か、というくらいの理解しかしていません。</p> <p>これで、とりあえず WSL2 と Docker が使えるようになりました。</p> mozukichi