2025년 4월 30일 수요일

Windows 11에서 Neovim 설치

 

  • Windows 11 환경에서 Neovim을 설치하고 Copilot을 사용할 수 있게 설정한다.
  • winget 명령을 사용해 Application을 설치하고 업그레이드한다.
  • WSL2에서 사용하면 훨씬 편한데 왜 이러고 있을까 싶지만 그래도 한다.

 Neovim 설치하기

관리자 권한으로 PowerShell 7을 실행한다.

아래 명령으로 neovim을 찾아본다.

winget search Neovim

다음과 같이 입력해서 winget이 Neovim을 설치하게 한다.

winget install Neovim.Neovim

혹시 --source 옵션을 사용해서 원본을 지정하라고 하면 위의 명령에 --source winget 옵션을 추가한다.

winget install Neovim.Neovim --source winget

winget이 자동으로 종속성 검사 후 필요한 추가 패키지를 설치하고 Neovim을 이어서 설치한다.

 Path 설정 추가하기

설치 작업이 끝나면 보통 자동으로 Neovim을 사용할 수 있게 되는데 혹시 어떤 이유로 nvim 명령을 찾지 못한다면 Neovim이 설치된 디렉토리를 Path에 추가한다.

[Environment]::SetEnvironmentVariable("Path", $env:Path + "<path>", "User")

위 명령 중 <path> 부분에 추가해주면 된다. 정상적으로 설치되었다면 C:\Program Files\Neovim\bin을 넣어주면 된다.

 LazyVim 설치하기

Neovim에서 다양한 Plugin들을 사용할 수 있게 해주는 Plugin이다. 먼저 필요한 프로그램들을 설치한다.

  • Microsoft.Git
  • burntsushi.ripgrep.MSVC
  • sharkdp.fd
  • OpenJS.NodeJS
  • zig.zig
  • 7zip.7zip
  • Python.Python.3.13

Python의 경우 버전에 따라 달라지기 때문에 설치하기 전에 아래 명령으로 어떤 버전까지 가능한지 찾아본다.

winget search Python.Python

이 글을 쓰고 있을 때의 최신 버전은 3.13이므로 아래와 같이 설치한다.

winget install Python.Python.3.13

그리고 혹시 필요하다면 PowerShell을 최신 버전으로 설치한다.

  • Microsoft.PowerShell

이제 LazyVim을 설치하기 위해 필요한 프로그램들의 설치가 끝났으니 LazyVim의 설치를 시작한다. 먼저 디렉토리를 생성한다.

cd $env:LOCALAPPDATA
mkdir nvim

설치될 디렉토리 생성이 끝났으면 Git을 이용해서 최신 버전을 받아온다.

git clone <https://github.com/LazyVim/starter> $env:LOCALAPPDATA\nvim

불필요한 .git 디렉토리를 삭제한다.

Remove-Item $env:LOCALAPPDATA\nvim\.git -Recurse -Force

이제 설치가 끝났다.

nvim을 시작한 후 :LazyHealth 명령으로 잘 작동하는지 확인할 수 있다.

 추가 - Copilot

LazyVim Extra에 들어가면 Copilot과 Copilot-Chat을 설치할 수 있다. 이를 이용하면 Curser 같은 IDE에서 AI의 도움을 받는 것 같은 도움을 받을 수 있다.

 추가 - winget 업데이트

winget 명령을 이용하면 Windows에 설치된 Application들의 업데이트를 한 번에 해결할 수 있다. 물론 안되는 것들도 존재한다.

winget update --all

winget을 잘 이용하면 Linux에서 누리던 편리함을 Windows에서도 누릴 수 있다.

WSL2 Docker에서 Ollama 띄우기

 이 문서는 WSL2 환경에서 작동 중인 Docker에 Ollama를 띄우기 위해 필요한 사항을 나열한다. 특히 필요한 Gen AI Model을 자동으로 다운로드 받도록 설정할 수 있어서 편리하다.

 이 내용에 추가해 Open WebUI와 PostgreSQL 컨테이너를 같이 뜨도록 추가하면 편리하게 RAG 구성을 시험할 수 있다.

 필요한 파일 목록

Dockerfile

entrypoint.sh

docker-compose.yml

 Dockerfile


Docker Image 생성을 위해 준비한 Dockerfile이다. 컨테이너 생성 때의 엔트리포인트를 쉘스크립트로 지정한다.

FROM ollama/ollama

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"] 

 entrypoint.sh


Docker 컨테이너가 생성될 때 ollama를 실행하고 완전히 뜰 때까지 대기했다가 ollama에서 사용할 Gen AI 모델을 다운로드 받아 설치한다.

#!/bin/bash
set -e

# Ollama 서버 백그라운드 실행
ollama serve &
OLLAMA_PID=$!

# 서버가 뜰 때까지 대기 (bash 내장 기능으로 포트 연결 시도)
while ! (echo > /dev/tcp/localhost/11434) 2>/dev/null; do
  sleep 1
done

# 모델 다운로드
ollama pull mistral
ollama pull nomic-embed-text

# Ollama 서버를 포그라운드로 유지
wait $OLLAMA_PID

 docker-compose.yml


Docker 컴포즈를 이용해 ollama를 실행한다. 실제 컨테이너를 띄울 때는 나머지 파일들과 함께 저장된 디렉토리에서 이 파일만 사용하면 된다.

version: '3.8'
services:
  ollama:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ollama
    restart: always
    ports:
      - "11434:11434"
    environment:
      - OLLAMA_KEEP_ALIVE=-1
      - OLLAMA_MODELS=/ollama/models
    volumes:
      - ~/ollama_data:/root/.ollama
      - ~/ollama_data/models:/ollama/models
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Docker 컨테이너를 만들 때는 아래 명령을 사용하면 된다.

docker compose -f docker-compose.yml up -d --build

또는 간단히 이렇게 해도 된다.

docker compose up

Docker 컨테이너가 잘 실행된 후에 ollama를 직접 실행해서 Gen AI에 질문을 하고 싶다면 아래와 같이 하면 된다.

docker exec -it ollama ollama run mistral

이렇게 하면 mistral 모델이 실행되고 프롬프트가 뜨게 된다.

Linux 사용자를 위한 WSL2 설정

 이 문서는 리눅스를 사용할 줄 아는 사람이 WSL2를 사용하기 위해 설정할 때 필요한 지식을 정리한 문서이다.

이 문서의 내용을 실행하면 WSL2 환경에서 한글 입력/출력, Gnome 환경의 사용, Windows에서 RDP를 통한 접근 등이 가능하다. 속도는 조금 차이가 나겠지만 일반적으로 Linux 환경에서 사용하던 대부분의 작업을 WSL2에서도 수행할 수 있다.

특히 이 문서의 내용대로 설치하면 nVidia GPU 가속 기능을 WSL2 내부의 Docker 컨테이너에서 사용할 수 있기 때문에 Gen AI를 테스트하는 환경으로 사용하기 편리하다.

 작업 순서

1. WSL2 설치

2. Ubuntu 설치

3. Ubuntu Desktop 설치

4. xrdp 설치 및 설정

5. 한글 입출력 설정

6. nVidia GPU Driver

7. Docker 설치

8. nVidia Container Toolkit & CUDA 설치

9. GPU 가속 작동 확인

참고 자료

 1. WSL2 설치


제어판 > 프로그램 > Windows 기능 켜기/끄기

목록에서 아래 항목을 차례대로 설치 후 Windows 리부팅 - 혹시 한 번에 설치할 때 오류가 발생하면 각각 하나씩 선택해서 설치와 리부팅을 반복한다.

  • Hyper-V
  • Linux용 Windows 하위 시스템
  • Windows 하이퍼바이저 플랫폼

리부팅 후 혹시 모르니 WSL 자체를 업데이트 시도한다.

wsl --update

 2. Ubuntu 설치


설치할 수 있는 배포판 목록을 확인한다.

wsl --list --online

이 가이드에서는 Ubuntu를 설치한다.

wsl --install -d Ubuntu

Ubuntu의 설치가 끝나면 User 계정 생성 후 Ubuntu를 업데이트한다. 배포판 릴리즈 후 수정된 애플리케이션이 많이 있을 수 있다.

sudo apt update && sudo apt full-upgrade -y

혹시 쓸 일이 생길 수 있으니 root 계정의 암호도 설정한다.

sudo passwd

마지막으로 WSL을 리부팅한다.

wsl --shutdown

참고 사항

WSL 내부의 Ubuntu에 자체 방화벽을 설치했고 어떤 이유에서 포트 오픈이 필요하다면 아래 명령으로 포트 오픈 작업을 할 수 있다.

sudo ufw allow 8080/tcp

 3. Ubuntu Desktop 설치


일반적으로 Ubuntu에서 수행하는 작업들은 모두 터미널에서 수행할 수 있지만 혹시 GUI 환경에서 Ubuntu를 사용하길 원할 수 있다. 이런 경우 아래 명령으로 Ubuntu desktop 환경 전체를 설치할 수 있다.

sudo apt update && sudo apt install -y ubuntu-desktop gnome

이 작업은 PC와 네트워크 속도에 따라 상당히 긴 시간이 소요될 수 있다. 작업이 모두 끝나면 아래 명령으로 다시 한 번 WSL을 재시작한다.

wsl --shutdown

 4. xrdp 설치 및 설정


Ubuntu desktop을 설치하면 조금 느리기는 해도 일반적인 Ubuntu를 사용하는 것과 같은 환경에서 WSL을 사용할 수 있다. 하지만 GUI 환경(X-window)을 보려면 윈도우의 원격 데스크탑으로 접속해서 사용해야 한다.

아래 방법으로 Ubuntu 환경을 Windows의 원격 데스크탑으로 접속하게 만들 수 있다.

우선 xrdp라는 서버 프로그램을 Ubuntu에 설치한다.

sudo apt update && sudo apt install xrdp

설치가 끝나면 설정 파일을 조금 수정할 필요가 있으므로 원본을 복사해 백업을 만든다.

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

원본을 백업 했으면 내용을 수정한다.

우선 접속 포트를 표준 원격 데스크탑 포트인 3389에서 3390으로 바꾼다. 혹시 Windows 쪽에 원격 접속이 필요한 경우가 있을 수 있기 때문에 겹치지 않게 하는 것이다.

sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

아래 변경 사항은 화면 품질을 개선하기 위한 것으로 적용하지 않아도 상관 없다.

sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini

이 과정이 끝나면 설정 준비가 끝났으므로 WSL을 리부팅하고 Windows 쪽에서 원격 데스크탑을 이용해 localhost:3390으로 접속해본다. 접속 계정은 Ubuntu를 처음 설치 후 만들었던 User 계정 정보를 사용하면 된다.

 5. 한글 입출력 설정


한국어로 시스템 메시지를 나오게 할 수 있는데 딱히 필요하지는 않다. 다만 Ubuntu desktop을 설치한 경우 한글 입력에 필요하므로 설치하는 것이 좋다. Ubuntu desktop을 설치하지 않은 경우라도 터미널에서 한국어로 출력되는 시스템 메시지를 볼 수 있게 된다.

한글 폰트를 설치한다.

sudo apt-get install fonts-nanum*

한국어 로케일을 생성한다.

sudo dpkg-reconfigure locales

위 명령을 실행하면 로케일 목록이 나오는데 이 목록에서 ko_KR.UTF-8을 선택하고 다음 화면에서 이를 기본 로케일로 선택해 완료하면 한국어 로케일이 생성된다.

재시작 후 locale 명령으로 한국어 로케일이 설정되었는지 확인한다.

아래 명령으로 한국어 입력기를 설치한다.

sudo apt update && sudo apt install fcitx fcitx-hangul fonts-noto-cjk dbus-x11

설치가 끝나면 im-config 명령으로 Input Method Configuration을 실행한다. 이 GUI 화면에서 조금 전 설치한 fcitx를 입력기로 선택하고 설정을 마친다.

여기까지 마친 후 자신의 홈 디렉토리에 있는 .bashrc에 아래 내용을 추가해 설정한 fcitx가 입력기로 사용되게 한다.

(첫 줄은 해당 .bashrc 파일의 첫 줄에 들어가야 하는 것으로 이미 있을 것이다. 파일의 마지막에 이 내용을 추가 한다면 아래 내용의 첫 줄은 넣지 않아도 된다.)

#!/bin/bash
export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
 
#optional
fcitx-autostart &>/dev/null

위 수정 사항을 바로 반영되도록 아래 명령을 수행한다.

source ~/.bashrc

언어 추가 과정이 필요하다. 이 과정은 언어 지원 프로그램을 이용한다. 혹시 없다면 아래 명령으로 설치한다.

sudo apt update && sudo apt install language-selector-gnome

위 프로그램을 아래 명령으로 실행한다.

sudo gnome-language-selector

위 프로그램의 GUI에서 언어 설치 / 제거… 로 들어가 한국어를 선택하고 설치한다. 키보드 입력기: 부분은 Fcitx 4가 선택된 것을 확인한다. 선택되어 있지 않으면 선택한다.

WSL을 리부팅한다.

리부팅이 완료되면 fcitx-config-gtk3를 실행하여 한국어 키보드를 추가한다. 명령을 실행하면 나오는 화면 왼쪽 아래에 + 버튼을 누르면 추가할 입력기를 선택할 수 있는 화면이 나온다. 이 화면에서 Keyboard - 한국어를 선택해 추가한다. 이렇게 하면 Hangul이 첫 화면에 추가될 것이다.

한글 입력을 위한 설정이 모두 완료되었다.

 6. nVidia GPU Driver


아래 명령을 이용해 설치 가능한 드라이버를 찾아본다.

apt search nvidia-driver

설치 가능한 드라이버들 중 최신 버전을 설치한다. 이 문서를 작성할 당시의 최신 버전은 570 버전이었다.

sudo apt update && sudo apt install -y nvidia-driver-570-server

설치가 완료되면 WSL을 리부팅하고 아래 명령으로 설치가 정상적으로 끝난 것을 확인한다.

nvidia-smi

정상적으로 설치가 완료되어 잘 작동하고 있다면 아래와 비슷한 내용이 출력된다.

Sun Apr 20 11:32:03 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.86.15              Driver Version: 576.02         CUDA Version: 12.9     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4060 ...    On  |   00000000:01:00.0  On |                  N/A |
| N/A   33C    P8              1W /  115W |     215MiB /   8188MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

 7. Docker 설치


설치를 시작하기 전에 이전에 설치한 내용을 삭제한다. 아래 명령들을 순서대로 실행하면 된다.

sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Docker 공식 배포를 스크립트로 설치한다.

curl https://get.docker.com | sh

설치가 잘 끝났으면 아래 명령으로 Docker 서비스를 활성화 한다.

sudo systemctl --now enable docker

현재 User를 docker 그룹에 소속시켜 sudo를 붙이지 않고 사용할 수 있게 하려면 아래 명령들을 수행한다.

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

아래 명령으로 잘 작동하는지 확인한다. 이 때 sudo를 붙이지 않았음을 확인한다.

docker run hello-world

혹시 부트 때 docker가 샐행되도록 하려면 아래 명령들을 수행한다.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

 8. nVidia Container Toolkit & CUDA 설치


아래 명령으로 Repository의 GPG Key를 설치한다.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

아래 내용을 가진 APT Sourcelist 파일(nvidia-container-toolkit.list)을 /etc/apt/source.list.d 디렉토리에 생성한다.

deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/$(ARCH) /
#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/experimental/deb/$(ARCH) /

아래 명령으로 nvidia-container-toolkit을 설치한다.

sudo apt update && sudo apt install -y nvidia-container-toolkit

이제 Docker에서 nVidia Runtime을 사용할 수 있게 등록하고 기본 값으로 만든다. 기본 값으로 만들기를 원하지 않는다면 마지막 옵션인 --set-as-default를 빼면 된다.

sudo nvidia-ctk runtime configure --runtime=docker --set-as-default

이제 아래 명령으로 Docker를 재시작하면 사용 준비가 완료된다.

sudo systemctl restart docker

CUDA는 아래 순서로 설치하면 된다.

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-ubuntu2404.pin
sudo mv cuda-ubuntu2404.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-ubuntu2404-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2404-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2404-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt -y install cuda-toolkit-12-8

다음 2가지 방법 중 하나를 택해 CUDA 드라이버를 설치한다.

  • Open kernel module
sudo apt-get install -y nvidia-open
  • Proprietary kernel module
sudo apt-get install -y cuda-drivers

위 두 방법에 대한 참고 문서는 아래 사이트에서 찾을 수 있다.

 9. GPU 가속 작동 확인


Docker의 컨테이너 내부에서 GPU를 잘 사용하고 있는지 확인하려면 아래와 같이 실행해본다. --runtime=nvidia 옵션을 주면 GPU를 사용하게 된다.

docker run --rm --runtime=nvidia nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 nvidia-smi

잘 사용하고 있다면 아래와 비슷한 출력을 볼 수 있다.

==========
== CUDA ==
==========

CUDA Version 11.8.0

Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license

A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience.

Sun Apr 20 02:59:36 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 575.51.02              Driver Version: 576.02         CUDA Version: 12.9     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4060 ...    On  |   00000000:01:00.0  On |                  N/A |
| N/A   33C    P8              1W /  115W |     216MiB /   8188MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

혹시 WSL에서 실행되는 GUI 자체 속도가 느린 것 같다면 외장 GPU를 사용하고 있는지 확인하고 변경할 수 있다.

현재 WSL이 사용하고 있는 GPU는 아래 명령으로 확인한다.

glxinfo | grep "OpenGL renderer"

혹시 Intel GPU를 사용하고 있다면 아래 내용을 실행하면 외장 GPU를 사용하게 할 수 있다.

export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA

필요하다면 이 내용을 ~/.bashrc에 추가해도 된다.

 참고 자료