🔥

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

2023/09/10に公開

はじめに

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

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

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

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をインストール

  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のソフトウェア設定
    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
    
  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/

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でコンテナに接続できます。

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に鍵を登録

  1. githubに鍵登録

    githubでid_rsa.pubを登録

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