私のWindows11の開発環境セットアップ
はじめに
私が、Windows11を初期化したあと、セットアップする手順をまとめます(よく初期化する悪癖があります)。
WindowsとそのWSL2を開発環境として用いており、メインとしてそのセットアップ手順になります。出先ではノートパソコンを使用し、必要があればWindowsにRemote DesktopやSSHを使って接続して作業するイメージです。
OOBE (Out Of Box Experience)
-
ローカルアカウントを作成
https://forest.watch.impress.co.jp/docs/serial/yajiuma/2002656.html -
表示言語は英語にしていても、RegionはJapanがお勧め
Windows Updateの確認
- <a href="ms-settings:windowsupdate">ms-settings:windowsupdate</a>
エクスプローラーの設定
- ファイルの拡張子を表示
Set-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -Name HideFileExt -Value 0 Stop-Process -Name explorer -Force
- 隠しファイル表示
Set-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced -Name Hidden -Value 1 Stop-Process -Name explorer -Force
アプリのインストール
wingetを使って必要なアプリをインストールします。ChocolatelyやScoopは使わないことにしてます。
ついでに不要なデフォルトアプリも消します。
# uninstall unnecessary default apps
winget uninstall Microsoft.OneDrive
Get-AppxPackage *Skype* | Remove-AppxPackage
Get-AppxPackage *MicrosoftTeams* | Remove-AppxPackage
Get-AppxPackage *WindowsCalculator* | Remove-AppxPackage
Get-AppxPackage *windowscommunicationsapps* | Remove-AppxPackage
Get-AppxPackage *WindowsMaps* | Remove-AppxPackage
Get-AppxPackage *Microsoft.Todos* | Remove-AppxPackage
Get-AppxPackage *BingNews* | Remove-AppxPackage
Get-AppxPackage *OneNote* | Remove-AppxPackage
Get-AppxPackage *People* | Remove-AppxPackage
Get-AppxPackage *MSTeams* | Remove-AppxPackage
Get-AppxPackage *Teams* | Remove-AppxPackage
Get-AppxPackage *OutlookForWindows* | Remove-AppxPackage
Get-AppxPackage *Solitaire* | Remove-AppxPackage
Get-AppxPackage *StickyNotes* | Remove-AppxPackage
Get-AppxPackage *BingWeather* | Remove-AppxPackage
# common app
winget install Google.Chrome
winget install Google.ChromeRemoteDesktop
winget install 7zip.7zip
winget install DeepL.DeepL
winget install --id Microsoft.PowerToys -e
# develop
winget install Git.Git
winget install Google.AndroidStudio
winget install Microsoft.VisualStudioCode
winget install Microsoft.VisualStudio.2022.Community
winget install "Node.js LTS"
# game
winget install Discord.Discord
winget install Valve.Steam
winget install EpicGames.EpicGamesLauncher
スタートアップアプリの無効化
- タスクマネージャーから不要なスタートアップアプリを無効化します
キーボード設定
- Microsoft PowerToysのキーリマップでCapsLockをCtrlにする
Chrome Remote Desktopのセットアップ
すでに、wingetで必要なホストアプリ入れています。以下のサイトから、画面共有できるように設定しましょう。
NVIDIAドライバのインストール
NVIDIAドライバのインストールを行います。Studio DriverとGame Readyはプログラミング用途ならどちらでも良いと思いますが、私はゲームをするのでGame Readyをインストール。
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のDNS設定
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 sudo rm -f /etc/resolv.conf sudo sh -c 'cat >/etc/resolv.conf <<EOF # /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 options timeout:2 attempts:3 rotate EOF' sudo chmod 644 /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は、以下を参考にインストールできます。
NVIDIA Container Toolkitのインストール
DNVIDIA Container Toolkitを下記リンクからインストールします。Docker内でcudaを利用するために必要みたいです。
下記のコマンドを実行し、NVIDIA GPUが利用できるコンテナランタイムを構成します。
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
WSLのSSH鍵をコンテナ内で使う方法
以下のコマンドをWSLで実行することで、Dockerのコンテナ内からSSH鍵を参照してくれるようになり、コンテナ内でGithubのコミット等を行えるようになります。
ssh-keygen
echo -e "\n/usr/bin/keychain -q --nogui \$HOME/.ssh/id_ed25519\nsource \$HOME/.keychain/\$(hostname)-sh" >> ~/.bashrc
sudo apt-get install keychain
/usr/bin/keychain -q --nogui $HOME/.ssh/id_ed25519
source $HOME/.keychain/$(hostname)-sh
sudo apt install openssh-client socat -y
eval `ssh-agent`
ssh-add ~/.ssh/id_ed25519
Githubに鍵を登録
-
githubに鍵登録
githubでid_ed25519.pubを登録
-
gitに情報登録
git config --global user.name "name" git config --global user.email XXX@gmail.com git config --global init.defaultBranch main
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
でコンテナに接続できます。
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