WSL — практическо ръководство

Част 2: Как настройвам WSL за реална работа

Инсталирахме WSL, избрахме дистрибуция, разбрахме как работи. Сега идва моментът, в който превръщам тази чиста Ubuntu инсталация в нещо, с което мога да работя всеки ден. Без да си губя времето в излишни конфигурации, без да се боря с неясни проблеми.

Нова инсталация, стари навици. Първото нещо, което правя, когато отворя нов терминал, е да проверя дали apt е актуален. Звучи тривиално, но колко пъти съм губил минути, защото някой пакет не е бил намерен, а причината е била стара кеш памет на пакетния мениджър.

1. Обновяване на системата и базови пакети

Още в първия момент след инсталацията на Ubuntu изпълнявам тези две команди:

WSL терминал
sudo apt update && sudo apt upgrade -y

-y автоматично потвърждава всички промени. За лични инсталации ползвам винаги така, защото не ми се иска да стоя и да натискам Y на всеки пакет. В production сървъри бих бил по-внимателен, но тук говорим за моята локална среда.

След обновяването инсталирам набор от пакети, без които не мога:

Базови инструменти
sudo apt install -y git curl wget vim htop build-essential unzip zip
sudo apt install -y ca-certificates gnupg lsb-release
  • git — основният ми инструмент за работа с код.
  • curl и wget — за сваляне на файлове и тестване на API-та.
  • vim — за бърза редакция на конфигурации.
  • htop — за следене на ресурсите, особено когато Docker започне да яде памет.
  • build-essential — за компилиране на софтуер от сорс.
  • unzip/zip — архивите са навсякъде.

2. Смених bash с Zsh — и това промени всичко

Bash е ок, но Zsh с Oh My Zsh ми спестява часове. Auto-suggestions, цветове, плъгини за git — правят терминала много по-приятен.

Инсталиране на Zsh и Oh My Zsh
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Инсталацията ще попита дали искам да направя Zsh моята shell по подразбиране. Казвам Y. След това рестартирам терминала и вече виждам Oh My Zsh промпта.

Добавям още няколко плъгина, които използвам постоянно:

Плъгини в ~/.zshrc
# Редактирам ~/.zshrc и добавям:
plugins=(git docker docker-compose kubectl history sudo)
  • git — съкращения за често използвани git команди.
  • docker и docker-compose — auto-completion за контейнери.
  • sudo — двойно натискане на ESC добавя sudo пред текущата команда.
  • history — по-лесно търсене в историята.
Един съвет: когато за пръв път отворя WSL след инсталацията на Oh My Zsh, понякога ми се налага да рестартирам Windows терминала, за да зареди правилно промените.

3. Настройка на Git – идентичност и SSH ключове

Git без правилна конфигурация е най-честата причина за неуспешни push-ове. Настройвам си името и имейла:

Глобална git конфигурация
git config --global user.name "Федя Серафиев"
git config --global user.email "[email protected]"
git config --global core.editor "vim"
git config --global init.defaultBranch main

След това генерирам SSH ключ и го добавям в GitHub / GitLab / Bitbucket:

Създаване на SSH ключ
ssh-keygen -t ed25519 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub

Копирам публичния ключ и го добавям в настройките на съответния git хост. Това е един от онези моменти, които ако пропусна, после се чудя защо не мога да клонирам репозитори.

4. Docker в WSL — моят предпочитан подход

Докер е тема за цяла книга, но ще споделя как го инсталирам и ползвам аз.

Има два основни варианта:

  • Docker Desktop с WSL2 backend — удобно, с GUI, но понякога тежи и прави странни неща с мрежата.
  • Docker Engine директно в WSL дистрибуцията — лек, бърз и пълен контрол. Това използвам аз.

Ето как инсталирам Docker Engine в Ubuntu:

Инсталация на Docker
# Добавям официалния GPG ключ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Добавям репозиторито
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Инсталирам Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

За да не пиша винаги sudo пред всяка docker команда, добавям потребителя си към групата docker:

Добавяне към docker групата
sudo usermod -aG docker $USER
Важно: след тази промяна трябва да изляза от WSL сесията и да вляза отново, за да се приложат правата.

След рестарт проверявам, че Docker работи:

Тест на Docker
docker run hello-world

Ако видя съобщението "Hello from Docker!", значи всичко е наред.

5. Моите проекти — организация и workflow

Създавам основна директория за всички проекти:

Структура на проектите
mkdir -p ~/projects
cd ~/projects

Вътре всяко нещо си има папка:

  • ~/projects/work/ — проекти за клиенти и работа.
  • ~/projects/personal/ — лични експерименти и open source.
  • ~/projects/tools/ — всякакви помощни скриптове и инструменти.

Клонирам репозитории само в тези папки. Никога не работя в /mnt/c/, защото вече съм платил цената на бавните build-ове.

Малък трик: отварям Windows Explorer и навигирам до \\wsl$\Ubuntu-24.04\home\fedia\projects. После закачам тази папка като бърз достъп. Така мога лесно да отварям файлове с Windows приложения, когато ми трябва.

6. Работа с Python, Node и други езици

Не инсталирам глобално всичко. Ползвам pyenv за Python и nvm за Node.js. Това ми позволява да сменям версиите без да си бъркам системата.

Python с pyenv

Инсталация на pyenv
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils \
tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

curl https://pyenv.run | bash

След инсталацията добавям следното в ~/.zshrc:

pyenv в .zshrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Рестартирам терминала и вече мога да инсталирам Python версии:

Инсталиране на Python
pyenv install 3.11.0
pyenv global 3.11.0

Node.js с nvm

Инсталация на nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

Добавям в ~/.zshrc и рестартирам:

Зареждане на nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

След това инсталирам LTS версията на Node:

Инсталиране на Node
nvm install --lts
nvm use --lts

7. Конфигурации, които помня наизуст

Някои неща ги повтарям на всяка инсталация, защото ми спестяват главоболия.

.wslconfig – ограничаване на ресурсите

Вече споменах този файл в първата част, но тук го повтарям, защото е ключов за стабилност.

C:\Users\Fedia\.wslconfig
[wsl2]
memory=6GB
processors=4
swap=2GB
localhostForwarding=true

След всяка промяна в този файл изпълнявам wsl --shutdown от PowerShell и стартирам WSL отново.

.gitignore_global

Създавам глобален .gitignore, за да не виждам винаги едни и същи временни файлове:

~/.gitignore_global
# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
.env
venv/

# Node
node_modules/
npm-debug.log
.env

# IDE
.vscode/
.idea/
*.swp

После го настройвам в git:

Прилагане на глобалния .gitignore
git config --global core.excludesfile ~/.gitignore_global

8. Бърз скрипт за автоматизация

За да не повтарям ръчно всичко това при всяка нова инсталация, съм написал скрипт. Ето го и него:

~/setup-wsl.sh
#!/bin/bash
set -e

echo "🔧 Обновяване на системата..."
sudo apt update && sudo apt upgrade -y

echo "📦 Инсталиране на базови пакети..."
sudo apt install -y git curl wget vim htop build-essential unzip zip ca-certificates gnupg lsb-release

echo "🐚 Инсталиране на Zsh и Oh My Zsh..."
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended

echo "🔑 Настройка на Git..."
git config --global user.name "Федя Серафиев"
git config --global user.email "[email protected]"
git config --global core.editor "vim"

echo "🐳 Инсталиране на Docker..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

echo "✅ Настройката приключи. Рестартирайте терминала, за да активирате всички промени."

Пускам го с bash ~/setup-wsl.sh и след няколко минути имам работеща среда. Разбира се, ръчно си добавям SSH ключовете, но скриптът върши 80% от работата.

9. Най-честите ми грешки в началото

За да не повтаряте моите грешки, ето какво съм правил и какво ме е учило:

Грешка Какво научих
Работех в /mnt/c/ и build-овете бяха бавни Винаги работя в ~/projects. Това удвои скоростта на компилациите.
Забравих да добавя потребителя си към docker групата Сега го правя веднага и рестартирам сесията.
Инсталирах Python глобално и си счупих системата Ползвам pyenv и никога не пипам системния Python.
Не ограничих RAM в .wslconfig WSL2 може да изяде всичката налична памет. Сега винаги слагам лимит.

10. Как поддържам тази среда чиста

След първоначалната настройка, поддръжката е проста:

  • Веднъж седмично пускам sudo apt update && sudo apt upgrade -y.
  • От време на време docker system prune -af, за да изчистя неизползвани контейнери и образи.
  • Правя backup на важните конфигурации (SSH ключове, .zshrc, .gitconfig).
  • Експортирам цялата дистрибуция с wsl --export, когато съм направил големи промени.
И най-важното: когато усетя, че нещо не работи както трябва — не се боря дълго. Спирам WSL с wsl --shutdown, стартирам отново и в 90% от случаите проблемът изчезва.

11. Какво следва?

С тази настройка вече имам стабилна и бърза работна среда. В следващите части ще разгледам:

  • Мрежови настройки и отстраняване на проблеми с интернет в WSL.
  • Работа с GUI приложения чрез WSLg.
  • Интеграция с Windows Terminal — профили, теми и клавишни комбинации.
  • Как да използвам WSL за автоматизация на административни задачи в Windows.

Ако имате конкретен въпрос или нещо не ви е ясно, пишете ми — винаги се радвам да споделя опит.