🔥

私のWindows11の開発環境セットアップ

に公開

はじめに

私が、Windows11を初期化したあと、セットアップする手順をまとめます(よく初期化する悪癖があります)。

WindowsとそのWSL2を開発環境として用いており、メインとしてそのセットアップ手順になります。出先ではノートパソコンを使用し、必要があればWindowsにRemote DesktopやSSHを使って接続して作業するイメージです。

OOBE (Out Of Box Experience)

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で必要なホストアプリ入れています。以下のサイトから、画面共有できるように設定しましょう。
https://remotedesktop.google.com/

NVIDIAドライバのインストール

NVIDIAドライバのインストールを行います。Studio DriverとGame Readyはプログラミング用途ならどちらでも良いと思いますが、私はゲームをするのでGame Readyをインストール。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

WSLをインストール

  1. 下準備

    BIOSからCPUのVirtualizeを有効化

    Windowsの追加設定からHyper-V, Windows Sybsystems for Linuxを有効化

  2. wslのハードウェア設定

    $wslConfigPath = "$env:userprofile\.wslconfig"
    $wslConfigContent = @"
    [wsl2]
    vmIdleTimeout=-1
    localhostForwarding=true
    "@
    $wslConfigContent | Out-File -FilePath $wslConfigPath -Encoding utf8
    
  3. wslのインストール

    # powershell
    wsl --update
    wsl --status
    wsl --install -d ubuntu
    
    
  4. アップデート

    # wsl
    sudo apt update -y
    sudo apt upgrade -y
    sudo apt autoremove -y
    
  5. 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
    
  6. 再起動

    # powershell
    wsl -t Ubuntu
    

WSLにDockerをインストール

基本的に、WSL内でDockerコンテナを利用した開発を行っています。Windows Docker Desktopではなく、WSL内のDocker CLIを利用している理由は、現状Docker Desktopでは、外部PCからSSHで接続してVS CodeのDevcontainerを利用することができないためです。

Docker CLIは、以下を参考にインストールできます。
https://docs.docker.com/engine/install/ubuntu/

NVIDIA Container Toolkitのインストール

DNVIDIA Container Toolkitを下記リンクからインストールします。Docker内でcudaを利用するために必要みたいです。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt

下記のコマンドを実行し、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に鍵を登録

  1. githubに鍵登録

    githubでid_ed25519.pubを登録

  2. 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をしコンテナ環境が利用できるという流れです。

  1. Wireguardを設定
  • vpnサーバーに公開鍵登録

    is_rsa.pubを登録

  • VPNキー交換

    鍵を交換し、システム再起動

  1. 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
    
    
  2. 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
    
  3. 外部から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のやり方

  1. Remote SSHを利用して接続
    ラップトップでVS Codeを開き、コマンドパレットからRemote-SSH: Connect to Host...を実行し、<user>@XX.XX.XX.XX:50022と入れるとWSLに入れます

  2. 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