Skip to content

Instantly share code, notes, and snippets.

@roustem
Last active February 25, 2024 07:12
Show Gist options
  • Star 42 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save roustem/2702553a5baa21bd3abd1becf951445b to your computer and use it in GitHub Desktop.
Save roustem/2702553a5baa21bd3abd1becf951445b to your computer and use it in GitHub Desktop.
Setting-up-Windows-WSL1

Setting up Windows 10 and WSL

This document describes how to set up Windows 10 for cross-platform development (Go, NodeJS, etc) with Windows Subsystem for Linux (WSL).

Resources

Most of the information here is collected from

WSL Setup

  1. Download Brave beta and Firefox browsers, make either default.
  2. Install 1Password for Windows, sign into personal and company accounts.
  3. Add 1Password X extension in Brave and Firefox
  4. Enable WSL and install latest version of Ubuntu from Microsoft Store
  5. Create C:\home directory, move user's home folder there and update /etc/passwd with the new location
# in /etc/wsl.conf
# Enable extra metadata options by default
[automount]
enabled = true
options = "metadata,umask=22,fmask=11"
mountFsTab = true

Default User

Ubuntu will create a default user on the initial run. It can also be done manually:

  1. Create new user in Ubuntu: useradd -Um roustem
  2. Make sure that user is added to sudoers
  3. Change default user (using PowerShell Admin):
ubuntu config --default-user roustem  
sc stop LxssManager
sc start LxssManager

Install Ubuntu Apps

sudo apt update
sudo apt upgrade
sudo apt remove gnupg gpg
sudo apt install gnupg2 fish tree graphviz build-essential unzip

Go

export GO_VERSION=1.11.4
curl -O "https://dl.google.com/go/go$GO_VERSION.linux-amd64.tar.gz"
sudo mv /usr/local/go /usr/local/go.bak.$GO_VERSION # if installing new version
sudo tar -C /usr/local -xzf go$GO_VERSION.linux-amd64.tar.gz

NodeJS

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt	-get install -y nodejs

Yarn

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update
sudo apt-get install yarn

GPG and Git

# Export key to `key.asc` file and then import
gpg --import key.asc
# or add --pinentry-mode if there is ap problem with entering the password
gpg --import --pinentry-mode loopback key.asc

git config --global commit.gpgsign true  
git config --global user.signingkey E25C1E01F3A98447  
git config --global gpg.program /usr/bin/gpg  
git config --global user.email roustem@1password.com  
git config --global user.name Roustem

git config --global url."git@gitlab.1password.io:".insteadOf "https://gitlab.1password.io/"  
git config --global url."git@gitlab.com:".insteadOf "[https://gitlab.com](https://gitlab.com)"

Debugging gpg signing:

echo “Test” | gpg --clear-sign

Google Cloud SDK

https://cloud.google.com/sdk/docs/downloads-apt-get

sudo apt install kubectl
gcloud init
gcloud container clusters get-credentials cluster-dev

Install Windows Apps

  1. Visual Studio Code
  2. Git
  3. Go
  4. WSLtty
  5. Gpg4win
  6. Ditto

Configure git

After installing Go, press Win-S, type PATH and change the GOPATH to C:\home\roustem\go. This will make sure that GOPATH is shared with WSL and Go can pickup all libraries and vendored code.

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

git config --global commit.gpgsign true  
git config --global user.signingkey E25C1E01F3A98447  
git config --global user.email roustem@1password.com  
git config --global user.name Roustem

Solving Git interoperability with WSL

git config --global core.filemode false
git config --global core.autocrlf input

Also, make sure that local .git/config file has correct settings as well.

Note: you might have to do this without --global in the repo as well.

MinGW (optional)

Install MinGW to get access to make and other command line tools. Update PATH to Include

C:\MinGW\bin
C:\MinGW\msys\1.0\bin

Improving WSL Performance

Based on Speeding up WSL I/O ..., turn off Windows Defender protection for some folders and processes:

Exclude folder: %USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc Exclude processes:

  • git
  • node
  • npm
  • dpkg
  • go

Securing Docker

WSL Interoperability with Docker

go get -d github.com/jstarks/npiperelay
// on Windows:
go install  github.com/jstarks/npiperelay
// in WSL:
sudo apt install socat
sudo apt install docker.io

touch ~/docker-relay
chmod +x ~/docker-relay
vim ~/docker-relay

// contents of ~/docker-relay
#!/bin/sh
exec socat UNIX-LISTEN:/var/run/docker.sock,fork,group=docker,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/docker_engine",nofork

// end ^^^

sudo adduser roustem docker

Configure Ditto

Set keyboard shortcut to Alt-V Exclude 1Password binary Add image clipboard type

Miscellaneous Windows Tips

Keyboard Shortcuts:

  • Cmd-Shift-S – take a screenshot and save it to clipboard

  • Win-. – show emoji panel (see Advanced Keyboard settings to control if emoji panel closes automatically) Configure system and user path:

  • Win-S, type "PATH" Configure taskbar:

  • Cmd-S, type "system icons"

@bepstein111
Copy link

Wow, thank you so much for all of this! Quick question before I give it a shot, do you utilize ssh at all? I've had problems before keeping my home folder on the C drive since ssh requires certain permissions to be set in order for the files in ~/.ssh/ to be picked up. Does your /etc/wsl.conf file fix that? Or do you not use ssh and therefore don't worry about it?
Thanks again!

@roustem
Copy link
Author

roustem commented Apr 4, 2020

Quite a few of these instructions could be ignored now that WSL 2 is available :)

@polyglotdev
Copy link

I have a question about why the command, git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe" . I have looked through Github's docs, and although this solved my inability to sign commits, I want to understand why this is the case.

@roustem
Copy link
Author

roustem commented May 9, 2020

I have a question about why the command, git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe" . I have looked through Github's docs, and although this solved my inability to sign commits, I want to understand why this is the case.

Git needs to know where to find the GPG executable and this is how you tell git where the gpg.exe is located on your machine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment