私のWindowsの開発環境セットアップ
はじめに
私が、Windowsを初期化したあと、セットアップする手順をまとめます(よく初期化する悪癖があります)。
WindowsとそのWSL2を開発環境として用いており、メインとしてそのセットアップ手順になります。出先のパソコンはChromebookを使っていて、WindowsにRemote DesktopやSSHを使って接続して作業するイメージです。
まずWindowsの諸々
- Windows Updateの確認
- ファイルの拡張子を表示
- 隠しファイル表示
- 表示言語は英語にしていても、RegionはJapanがお勧め
よく使うアプリのインストール
wingetを使って必要なアプリをインストールします。ChocolatelyやScoopは使わないことにしてます。
winget install Google.Chrome
winget install Google.ChromeRemoteDesktop
winget install Google.GoogleDrive
winget install Google.JapaneseIME
winget install Microsoft.BingWallpaper
winget install 7zip.7zip
winget install DeepL.DeepL
winget install "Node.js LTS"
winget install Git.Git
winget install Google.AndroidStudio
winget install Microsoft.VisualStudioCode
winget install Microsoft.VisualStudio.2022.Community
家のパソコンには以下のアプリも入れます。
winget install Discord.Discord
winget install Valve.Steam
winget install EpicGames.EpicGamesLauncher
Chrome Remote Desktopのセットアップ
すでに、wingetで必要なホストアプリ入れています。以下のサイトから、画面共有できるように設定しましょう。
NVIDIAドライバのインストール
NVIDIAドライバのインストールを行います。Studio DriverとGame Readyはプログラミング用途ならどちらでも良いと思いますが、私はゲームをするのでGame Readyをインストール。
NVIDIA Container Toolkitのインストール
DNVIDIA Container Toolkitを下記リンクからインストールします。Docker内でcudaを利用するために必要みたいです。
下記のコマンドを実行し、NVIDIA GPUが利用できるコンテナランタイムを構成します。
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
WSLをインストール
-
下準備
BIOSからCPUのVirtualizeを有効化
Windowsの追加設定からHyper-V, Windows Sybsystems for Linuxを有効化
-
wslのハードウェア設定
$wslConfigPath = "$env:userprofile\.wslconfig" $wslConfigContent = @" [wsl2] vmIdleTimeout=-1 localhostForwarding=true "@ $wslConfigContent | Out-File -FilePath $wslConfigPath -Encoding utf8
-
wslのインストール
# powershell wsl --update wsl --status wsl --install -d ubuntu
-
アップデート
# wsl sudo apt update -y sudo apt upgrade -y sudo apt autoremove -y
-
wslのソフトウェア設定
WSLのDNS設定は通常のlinuxと異なり、WSL特有の設定になっています。この設定がネットワーク関連のエラーを引き起こすため、以下のように修正します。また、ついでに、systemdが使えるようにします。sudo tee /etc/wsl.conf <<EOF [boot] systemd=true [network] generateResolvConf=false EOF
wslではrebootコマンドが使えないので、windowsからwslごと再起動
# powershell wsl -t Ubuntu
# WSL echo -e \ "# /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.4.4.8" \ |sudo tee /etc/resolv.conf > /dev/null sudo chattr +i /etc/resolv.conf
-
再起動
# powershell wsl -t Ubuntu
WSLにDockerをインストール
基本的に、WSL内でDockerコンテナを利用した開発を行っています。Windows Docker Desktopではなく、WSL内のDocker CLIを利用している理由は、現状Docker Desktopでは、外部PCからSSHで接続してVS CodeのDevcontainerを利用することができないためです。
Docker CLIは、以下を参考にインストールできます。
WSLにSSHできるようにする
構成としては、以下のようなネットワーク図になります。ChromebookのVS CodeのRemote SSHでデスクトップに接続し、ポートフォワードによりWSLに接続され、WSL内でReopen in Containerをしコンテナ環境が利用できるという流れです。
- Wireguardを設定
-
vpnサーバーに公開鍵登録
is_rsa.pubを登録
-
VPNキー交換
鍵を交換し、システム再起動
-
DesktopでOpen SSHサーバーを構築
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Set-Service -Name sshd -StartupType 'Automatic' New-NetFirewallRule -DisplayName "ssh-to-wsl" -Direction Inbound -Protocol TCP -LocalPort 50022 -Action Allow
-
WSLでOpen SSHサーバーを構築
sudo apt install openssh-server sudo systemctl enable ssh sudo ssh-keygen -A sudo sed -i -e 's/^#Port 22/Port 50022/' /etc/ssh/sshd_config sudo sed -i -e 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config sudo systemctl start ssh
-
外部からWSLに接続できるようにする
ここまでで、Wireguardを利用してWindowsにSSHできるようになっています。しかし、WSLに直接SSHはまだできません。
そこでポートフォワードを設定します。このポートフォワードはWindows起動時に毎度行う必要があります。そこで、Task Schedulerを用いてStart Up時に自動で実行するよう設定します。
ついでに、Windows起動時に自動的にバックグラウンドでWSLが実行されるように設定します。以下のように、ps1ファイルを利用して、設定しましょう。@" # Wait for some computer setups are completed Start-Sleep -Seconds 5 # Portforwading Wireguard Interface to WSL netsh interface portproxy delete v4tov4 listenaddress=10.10.10.2 listenport=50022 netsh interface portproxy add v4tov4 listenport=50022 listenaddr=10.10.10.2 connectport=50022 connectaddress=localhost # Start WSL C:\PROGRA~1\WSL\wsl.exe "@ | Out-File -FilePath "$env:userprofile\Documents\startup.ps1" -Encoding utf8 schtasks /create /sc ONLOGON /tn "WSL Startup" /tr "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File $env:userprofile\Documents\startup.ps1" /rl highest /F
Devcontinerのやり方
- Remote SSHを利用して接続
ラップトップでVS Codeを開き、コマンドパレットからRemote-SSH: Connect to Host...
を実行し、<user>@XX.XX.XX.XX:50022
と入れるとWSLに入れます - Devcontainerを使う
WSL内の.devcontainerが含まれるプロジェクトファイルを開くと、Reopen in Container
でコンテナに接続できます。
WSLのSSH鍵をコンテナ内で使う方法
以下のコマンドをWSLで実行することで、Dockerのコンテナ内からSSH鍵を参照してくれるようになり、コンテナ内でGithubのコミット等を行えるようになります。
ssh-keygen
echo -e "\n/usr/bin/keychain -q --nogui \$HOME/.ssh/id_rsa\nsource \$HOME/.keychain/\$(hostname)-sh" >> ~/.bashrc
sudo apt-get install keychain
/usr/bin/keychain -q --nogui $HOME/.ssh/id_rsa
source $HOME/.keychain/$(hostname)-sh
sudo apt install openssh-client socat -y
eval `ssh-agent`
ssh-add ~/.ssh/id_rsa
Githubに鍵を登録
-
githubに鍵登録
githubでid_rsa.pubを登録
-
gitに情報登録
git config --global user.name "name" git config --global user.email XXX@gmail.com git config --global init.defaultBranch main
flutter開発環境のセットアップ
mkdir C:\src
cd c:\src
git clone git@github.com:flutter/flutter.git -b stable
$path = [System.Environment]::GetEnvironmentVariable('PATH' , 'User')
$path += ';' + 'C:\src\flutter\bin'
[System.Environment]::SetEnvironmentVariable('PATH' , $path , 'User')
git config --global --add safe.directory C:/src/flutter
おわりに
参考にしてみてね。
あとがき
出先のノーパソからリモートでGPUサーバーに接続し、Devcontainerを使って開発したいと思ったけど、ちょっと難しい。調べると今現在のVS Codeでは、Remote SSHの接続先がWindowsの場合、Reopen in Containerは機能しないことがわかりました。そのため、Docker Desktopは卒業し、WSLの中でDockerを利用することにしました。私としてはWSLは少し面倒で、Windowsに直接接続できると楽だなとは思います。VS Codeのアップデートは頻繁なので、今後の改善に期待できるかも?しれません。
Discussion