Skip to content

Instantly share code, notes, and snippets.

@xemuliam
Last active April 3, 2023 11:18
Show Gist options
  • Save xemuliam/2f66336a730272e923895a69530c79c7 to your computer and use it in GitHub Desktop.
Save xemuliam/2f66336a730272e923895a69530c79c7 to your computer and use it in GitHub Desktop.
WSL. Windows subsystem for Linux. How to use everyday.

Here I'll explain how to use true Linux inside your Windows machine.

WSL

How to install

There are two possible ways:

  1. Enable Windows Subsystem for Linux in Windows Features
  2. Use following script in administrative PS-shell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Special note for Ubuntu release upgrade in old (before 1709) WSL

bash
sudo -S apt-mark hold procps strace sudo
sudo -S env RELEASE_UPGRADER_NO_SCREEN=1 do-release-upgrade

Docker

Legacy network usage

sudo update-alternatives --config iptables choose 'iptables-legacy'

Enable docker daemon

sudo nano /etc/wsl.conf

[boot]
command=/etc/init.d/docker start

Volumes

18.03+

sudo nano /etc/wsl.conf

[automount]
root = /
options = "metadata"

17.09-

sudo mkdir -p /c
echo "sudo mount --bind /mnt/c /c" >> ~/.bashrc && source ~/.bashrc
sudo visudo
**your_username** ALL=(root) NOPASSWD: /bin/mount
ln -s /c/users/**your_username**/Projects ~/Projects

Docker compose

sudo curl -L $(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url | grep "$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)"'"$' | cut -d: -f 2,3 | tr -d \") -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose

Docker buildx

docker buildx create --use --name mybuilder
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx ls

docker buildx build --platform linux/amd64,linux/arm64 -t xemuliam/dbt:1.0.5-redshift -t xemuliam/dbt:1.0-redshift -t xemuliam/dbt:redshift --build-arg PLUGINS=redshift --push - < ~/Projects/Docker/dbt/Dockerfile.multistage.universal

docker buildx rm
docker buildx prune

Python

sudo apt-get install python3 python3-dev python3-setuptools
sudo python3 -m easy_install pip
sudo pip install virtualenv

Node and N as Node version manager

sudo apt install node
sudo apt install npm
sudo npm install -g n
sudo n lts
sudo npm install npm@lts -g
sudo chown -R $USER:$(id -gn $USER) /home/xemuliam/.config

restart WSL terminal
chown will reflect your home directory in WSL

Git

Credentials caching for HTTPS (31 days)

git config --global credential.helper 'cache --timeout=2678400'

Remove remote merged branches

git branch --remote --merged origin/master | grep -Ev 'master|qa' | cut -b 10- | xargs -n 1 git push --delete origin

Remove local merged branches

git branch --remote --merged origin/master | grep -Ev 'master|qa' | cut -b 10- | xargs -n 1 git branch -d

Java

sudo update-alternatives --config java

export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"

Ionic Android Development on WSL

Installing the required software

Execute the following commands to install Node, npm, git, Java, Ionic, Cordova and Angular CLI:

cd ~
sudo apt update
sudo apt upgrade

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm i -g ionic cordova @nestjs/cli @angular/cli

sudo apt install git
git config --global user.email "you@yourmail.com"
git config --global user.name "Your Name"
git config --global core.autocrlf input

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt install oracle-java8-set-default

NOTE: Node can be installed via NVM (node version manager) on ZSH as described here: http://www.boekhoff.info/how-to-install-nodejs-and-npm-using-nvm-and-zsh-nvm/

Downloading the Android SDK Tools

To download the Android SDK tools in your home folder execute the following commands:

cd ~
sudo mkdir android-sdk
cd android-sdk
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux-4333796.zip

Note: you can get an updated Android SDK link from https://developer.android.com/studio/#downloads

Adding the Android SDK to your PATH

Add the following to your .profile (or .zshenv if you use zsh):

# Add Android SKD to PATH
export ANDROID_HOME=$HOME/android-sdk
PATH="$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH"
export PATH

Installing the required Android SDK components

Execute the following commands to install some basic Android SDK components.

Note that you can install any component listed with sdkmanager --list by running sdkmanager "packagename". Always run sdkmanager --licenses to accept all the licenses after installing something.

sdkmanager --update
sdkmanager --list
sdkmanager "build-tools;26.0.2" "platform-tools" "platforms;android-26" "tools"
sdkmanager --licenses

Alternative way for Android SDK

cd /home/<user>/
sudo apt-get install unzip
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux-4333796.zip -d Android
rm sdk-tools-linux-4333796.zip
sudo apt-get install -y lib32z1 openjdk-8-jdk
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
printf "\n\nexport JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64\nexport PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bashrc
cd Android/tools/bin
./sdkmanager "platform-tools" "platforms;android-26" "build-tools;26.0.3"
export ANDROID_HOME=/home/<user>/Android
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
printf "\n\nexport ANDROID_HOME=/home/<user>/Android\nexport PATH=\$PATH:\$ANDROID_HOME/tools\nexport PATH=\$PATH:\$ANDROID_HOME/platform-tools" >> ~/.bashrc
android update sdk --no-ui
sudo apt-get install gradle
gradle -v
adb start-server

Install Gradle

Install gradle with the following command:

sudo apt install gradle

ADB Alias

We can default to Windows's adb.exe (which can read USB) instead of the Linux one.

Create a ~/.aliases file with the following content:

alias adb='adb.exe'

ZSH

If you use ZSH, add the following to your .zshrc

source $HOME/.aliases

Bash

If you use bash, add the following to your .bashrc

if [ -f ~/.aliases ]; then
    . ~/.aliases
fi

Misc

hub and yq install

distr=$(uname -s | tr '[:upper:]' '[:lower:]')_$([ $(uname -m) == "x86_64" ] && echo amd64 || echo 'unknown arch')

echo 'yq install'
sudo curl -sL $(curl -s https://api.github.com/repos/mikefarah/yq/releases/latest | grep browser_download_url | grep $distr | cut -d: -f 2,3 | tr -d \") -o /usr/local/bin/yq && sudo chmod +x /usr/local/bin/yq

echo 'hub install'
curl -sL $(curl -s https://api.github.com/repos/github/hub/releases/latest | grep browser_download_url | grep ${distr//_/-} | cut -d: -f 2,3 | tr -d \") | tar -xz && sudo ./hub-${distr//_/-}-*/install && rm -rf hub-${distr//_/-}-*

Reclaim memory using WSL2, VSCode with Remote-WSL extension, big git projects, and Docker with WSL2 integration.

create this alias at the end of your ~/.bashrc file

alias drop_cache="sudo sh -c \"echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'\""

run: source ~/.bashrc in your shell to setup the alias

then you can run the drop_cache command when you need it

You can run it manually when you notice high memory usage or you can try to create a crontab job or to add this command in the same ~/.bashrc and it will be running each time you open new WSL console

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