2025년 9월 4일 목요일

BtrFS에서 드라이브 2개 합치기

 

개념

물리적으로 분리된 2개의 드라이브를 한 개의 드라이브 처럼 쓰고 싶을 때가 있다. 특히 오래된 노트북에서 적은 용량의 SSD와 HDD가 함께 장착되어 있을 경우 HDD를 SSD로 바꾼 후 그렇게 쓰고 싶은 마음이 무럭무럭 자라게 된다.

보통 이런 목적으로 사용하게 되는 게 LVM 인데 이게 좀 불편하다. 레이어 비슷하게 여러 단계로 나뉜 계층 구조를 따라야 하고 사용하는 명령어도 좀 그렇고...

그래서 좀 찾아보니 BtrFS에서 이렇게 분리된 드라이브를 하나로 합쳐서 1개의 드라이브로 쓸 수 있다고 해서 실험해봤더니 아주 잘 작동한다.

부수적으로 2개의 드라이브에 데이터 블록을 분산해서 실제 억세스 속도도 좋아지는 모양이다.

다만 이렇게 합친 드라이브 중 하나가 깨지면 전체가 깨진다. 이게 좀 불안한 문제이긴 한데 어차피 오늘만 살아가고 있으니 상관 없다.

작업 내용

  1. 2개의 드라이브가 필요하다.
  2. 1개의 드라이브에 BtrFS를 사용하는 리눅스를 설치한다. 여기서는 Debian 13 Testing을 사용했다.
  3. 리눅스로 부팅 후 2번째 드라이브를 1번 드라이브에 추가해준다.
  4. 잘쓴다.

실제 작업 명령들

sudo btrfs device add /dev/sdb /

/ 디렉토리에다가 2번째 드라이브를 합치는 명령이다. 간혹 강제로 붙이기 위해 -f 옵션을 추가해야 하는 경우도 있다. (내 경우는 늘...)

sudo btrfs device add -f /dev/sdb /

이렇게 붙이고 나면 일단 2개의 드라이브가 하나로 합쳐져서 보이게 된다. 예를 들자면 아래와 같이 분리된 드라이브가 하나로 보인다.

 debian ~ $ lsblk

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb           8:0    0 238.5G  0 disk 
zram0       254:0    0   7.7G  0 disk [SWAP]
nvme0n1     259:0    0 238.5G  0 disk 
├─nvme0n1p1 259:1    0   953M  0 part /boot/efi
└─nvme0n1p2 259:2    0 237.5G  0 part /opt
                                      /tmp
                                      /var
                                      /.snapshots
                                      /home
                                      /

 debian ~ $ df -H

파일 시스템     크기  사용  가용 사용% 마운트위치
udev            8.3G     0  8.3G    0% /dev
tmpfs           1.7G  1.8M  1.7G    1% /run
/dev/nvme0n1p2  512G   61G  448G   12% /
tmpfs           8.3G   26M  8.3G    1% /dev/shm
efivarfs        132k   47k   80k   37% /sys/firmware/efi/efivars
tmpfs           5.3M  8.2k  5.3M    1% /run/lock
tmpfs           1.1M     0  1.1M    0% /run/credentials/systemd-journald.service
/dev/nvme0n1p2  512G   61G  448G   12% /home
/dev/nvme0n1p2  512G   61G  448G   12% /.snapshots
/dev/nvme0n1p2  512G   61G  448G   12% /var
/dev/nvme0n1p2  512G   61G  448G   12% /tmp
/dev/nvme0n1p2  512G   61G  448G   12% /opt
/dev/nvme0n1p1  998M  9.2M  989M    1% /boot/efi
tmpfs           1.7G  148k  1.7G    1% /run/user/1000

 debian ~ $ 

lsblk 명령으로 나온 드라이브 장착 상태는 sdb와 nvme0n1p2 등 256GB 드라이브 2개인데 아래 df 명령의 결과 나온 내용을 보면 512GB 1개로 보인다.

실제 사용할 때도 이렇게 1개로 보인다.

위에서 보인 명령어만 쓰면 합치기만 하는 것이고 저장된 데이터를 2개의 드라이브에 분산하려면 다음과 같이 balance 명령도 사용해야 한다. 이 명령을 사용하면 저장된 데이터 블록들을 2개의 드라이브에 분산해서 데이터 억세스 속도를 높여주게 된다.

sudo btrfs balance start --full-balance /

이 작업은 시간이 꽤 걸린다.

어마어마한 개선은 아니라도 좋아진 속도를 체감할 정도는 되는 것 같다.

마지막으로 저장된 파일들의 파편화를 제거하기 위해 디스크 조각 모음을 해주면 끝이다.

sudo btrfs filesystem defrag -r /

여기서 -r 옵션은 재귀적으로 하위 디렉토리 속의 파일들도 조각 모음을 하라는 뜻이다. 저장된 파일의 용량이나 갯수에 따라 진행 시간은 다르다.

이제 끝.

2025년 5월 21일 수요일

systemctl 명령어 정리

WSL을 이용해 이런 저런 실험과 장난을 치다 보면 필연적으로 systemctl 명령을 자주 사용하게 된다.

명령의 옵션이 많은 데 전부 정리하긴 어렵고 자주 쓸만한 것들만 정리한다.

서비스 상태 파악하기

전체 서비스 목록 보기

sudo systemctl


서비스 목록 간단히 보기

sudo systemctl list-unit-files


특정 서비스 활성화 여부 보기

sudo systemctl is-enabled [서비스 이름]


특정 서비스의 현재 작동 여부 보기

sudo systemctl is-active [서비스 이름]


특정 서비스의 현재 상태 보기

sudo systemctl status [서비스 이름]


서비스 시작하고 끝내기

서비스 활성화

sudo systemctl enable [서비스 이름]

서비스 비활성화

sudo systemctl disable [서비스 이름]

서비스 시작

sudo systemctl start [서비스 이름]

서비스 종료

sudo systemctl stop [서비스 이름]

서비스 재시작

sudo systemctl restart [서비스 이름]

서비스 설정 갱신

sudo systemctl reload [서비스 이름]

서비스 전체 설정 갱신

sudo systemctl daemon-reload

파일 시스템에 저장된 설정 파일의 변경 사항을 읽고 의존성 트리를 새로 만든다.


2025년 5월 20일 화요일

Windows Powershell에서 WSL의 Docker 사용하기

Windows에서 Docker Desktop을 사용하는 것은 라이선스가 좀 골 아프다. 그러니 그냥 WSL에 설치한 Docker를 Windows에서도 Docker Client를 이용해 사용해보자.

우선 Docker Client를 Windows 쪽에 설치하자.

https://download.docker.com/win/static/stable/x86_64/

이 위치에 접속하면 Docker 버전 별로 Windows용 Client가 있다. 적당한 파일을 다운로드 받고 압축을 풀어서서 Windows의 Path에 포함된 위치에 저장한다.

Windows에 시스템 환경 변수를 하나 추가한다.

DOCKER_HOST

환경 변수의 값은 아래와 같이 설정한다.

tcp://127.0.0.1:2375

설정이 끝나면 아래 그림과 같이 된다.

시스템 속성 창에서 '환경 변수(N)...' 버튼을 클릭해서 환경 변수를 추가한다. 이 화면에서 Path도 추가할 수 있다.

'시스템 속성' 창에서 '환경 변수(N)...' 버튼을 클릭해서 '환경 변수' 창을 열고 환경 변수를 추가한다. 이 화면에서 Path도 추가할 수 있다.

('시스템 속성' 창은 Windows 메뉴에서 검색하면 바로 나온다)


이제 WSL에서 Docker 설정 파일을 수정한다.

sudo vi /usr/lib/systemd/system/docker.service

내용 중 ExecStart 항목을 수정한다.

[Service]
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375

이제 WSL에서 Docker를 재시작한 후 Windows Powershell에서 Docker 명령을 실행하면 잘된다. 혹시 restart 대신 설정을 데몬에 즉시 반영하게 하려면 아래와 같이 하면 된다.

sudo systemctl daemon-reload

간혹 reload가 제대로 동작하지 않는 경우가 있기는 하니까 확실하게 하려면 reload 후에 restart까지 해버리는 게 편할 때도 있다.


<같은 회사 AA 분에게 배웠다>

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 모델이 실행되고 프롬프트가 뜨게 된다.