Skip to main content

Linux 실무 기초

리눅스는 전 세계 AI/ML 인프라의 표준 운영체제입니다. 클라우드 GPU 인스턴스, 온프레미스 학습 서버, Docker 컨테이너 — 모두 리눅스 위에서 동작합니다. Python 가상환경을 만들고, 학습 데이터를 관리하고, GPU 상태를 모니터링하고, 서비스를 등록하는 모든 과정이 리눅스 명령어로 이루어집니다. 이 문서에서는 GPU 서버를 운영하는 데 필요한 리눅스 실무 지식을 체계적으로 다룹니다.

학습 목표

  • 리눅스 파일시스템 구조를 이해하고, 각 디렉터리의 역할을 설명할 수 있다
  • 파일 관리, 텍스트 처리, 검색 명령어를 상황에 맞게 조합하여 사용할 수 있다
  • 프로세스와 systemd 서비스를 관리하고 문제를 진단할 수 있다
  • 디스크, 메모리, GPU 모니터링을 통해 서버 상태를 실시간으로 파악할 수 있다

왜 중요한가

AI/ML 엔지니어가 마주하는 문제의 상당수는 리눅스 시스템 레벨에서 발생합니다. “디스크가 꽉 찼는데 어디서 용량을 잡아먹는지 모르겠다”, “학습 프로세스가 GPU를 안 쓰고 있다”, “서버 재시작 후 서비스가 자동으로 올라오지 않는다” — 이런 문제를 해결하려면 리눅스 명령어를 자유자재로 다뤄야 합니다. 리눅스 실무 능력은 개발 속도를 직접적으로 좌우합니다. 데이터셋에서 특정 패턴을 찾고, 로그에서 에러를 추적하고, 백그라운드 프로세스를 관리하는 것 — 이 모든 작업의 효율성이 리눅스 숙련도에 달려있습니다.

리눅스 파일시스템 구조

리눅스의 모든 것은 파일입니다. 디바이스, 프로세스 정보, 커널 파라미터까지 파일 형태로 접근합니다.
경로설명ML 실무 연관
/루트 디렉터리, 모든 경로의 시작점
/home사용자 홈 디렉터리개인 설정, SSH 키, 스크립트
/etc시스템 설정 파일네트워크 설정, 서비스 설정, 환경변수
/var가변 데이터 (로그, 캐시, 스풀)시스템 로그(/var/log), Docker 데이터
/tmp임시 파일 (재부팅 시 삭제)학습 중 임시 캐시, 중간 처리 파일
/opt서드파티 소프트웨어 설치Anaconda, 상용 소프트웨어
/usr/local로컬 설치 소프트웨어CUDA, cuDNN, 직접 빌드한 라이브러리
/data(관례적) 대용량 데이터 전용데이터셋, 모델 체크포인트, MLflow artifacts
/proc가상 파일시스템 (프로세스 정보)CPU 정보, 메모리 상태, 프로세스 상세
/dev디바이스 파일GPU 디바이스(/dev/nvidia*), 블록 디바이스
/sys커널과 하드웨어 정보GPU 전력/온도, 디바이스 속성
/mnt, /media마운트 포인트외장 디스크, NFS 공유, S3 FUSE 마운트
/data는 FHS(Filesystem Hierarchy Standard) 표준 디렉터리는 아니지만, ML 서버에서 별도 디스크를 마운트하여 데이터셋과 모델을 저장하는 관례적 경로입니다. 프로젝트마다 /data/datasets, /data/models, /data/archive 등으로 구분하면 관리가 편합니다.

필수 명령어

파일 관리

명령어설명자주 쓰는 옵션
ls디렉터리 내용 목록-la (전체+상세), -lhS (크기순), -lt (시간순)
cp파일/디렉터리 복사-r (재귀), -p (권한 보존), -v (진행 표시)
mv파일/디렉터리 이동/이름변경-i (덮어쓰기 확인), -v (진행 표시)
rm파일/디렉터리 삭제-r (재귀), -f (강제), -i (확인)
mkdir디렉터리 생성-p (중간 디렉터리 자동 생성)
ln링크 생성-s (심볼릭 링크)
touch빈 파일 생성 / 타임스탬프 갱신
tree디렉터리 트리 구조 출력-L 2 (깊이 제한), -d (디렉터리만)
# 실무 예시: ML 프로젝트 디렉터리 구조 생성
mkdir -p project/{data/{raw,processed},src,configs,outputs/{checkpoints,logs}}

# 대용량 데이터셋 복사 (진행 상태 확인)
cp -rv /data/datasets/imagenet/ /data/local/imagenet/

# 심볼릭 링크로 데이터셋 연결 (복사 없이 접근)
ln -s /data/datasets/imagenet ./data/imagenet

텍스트 처리

명령어설명자주 쓰는 옵션
cat파일 내용 출력-n (줄 번호)
head파일 처음 N줄 출력-n 20 (20줄), -c 1000 (1000바이트)
tail파일 마지막 N줄 출력-n 20 (20줄), -f (실시간 추적)
less페이지 단위 파일 읽기/검색어 (검색), q (종료)
wc줄/단어/바이트 수 카운트-l (줄 수만)
sort정렬-n (숫자), -r (역순), -k (필드 지정)
uniq중복 제거-c (카운트)
cut필드 추출-d',' (구분자), -f1,3 (필드 선택)
# 학습 로그에서 loss 추적 (실시간)
tail -f training.log | grep "loss"

# CSV 데이터 빠른 탐색
head -5 data.csv              # 헤더 + 첫 4행 확인
wc -l data.csv                # 전체 행 수
cut -d',' -f1,3 data.csv | head  # 1, 3번째 컬럼만 추출

검색

명령어설명실무 예시
find파일시스템 검색 (이름, 크기, 시간 등)find . -name "*.pt" -size +1G
grep텍스트 패턴 검색grep -r "learning_rate" configs/
rg (ripgrep)고속 텍스트 검색rg "import torch" --type py
locate인덱스 기반 빠른 파일 검색locate "*.ckpt"
# 7일 이상 된 체크포인트 찾기
find /data/checkpoints -name "*.pt" -mtime +7

# 대용량 파일 찾기 (1GB 이상)
find /data -size +1G -exec ls -lh {} \;

# Python 파일에서 deprecated API 검색
rg "torch.cuda.amp" --type py --glob '!.venv/**'

# 로그에서 에러 패턴 찾기 (전후 3줄 포함)
grep -rn -A3 -B3 "RuntimeError" logs/

파일 검색과 텍스트 처리 실전

find + exec 조합

# 30일 이상 된 로그 파일 삭제
find /var/log -name "*.log" -mtime +30 -exec rm -v {} \;

# 모든 Python 파일에서 특정 import 찾기
find . -name "*.py" -exec grep -l "from transformers" {} \;

# 빈 디렉터리 정리
find /data/experiments -type d -empty -delete

awk/sed 기초

# awk: CSV에서 특정 조건 필터링
awk -F',' '$3 > 0.95 {print $1, $3}' results.csv  # 정확도 0.95 이상

# sed: 설정 파일 일괄 수정
sed -i 's/learning_rate: 0.001/learning_rate: 0.0001/g' config.yaml

# 학습 로그에서 epoch별 loss 추출
awk '/Epoch/ {print $2, $4}' training.log

xargs 활용

# 여러 파일 병렬 처리
find . -name "*.jpg" | xargs -P 8 -I {} convert {} -resize 224x224 resized/{}

# 파일 목록에서 일괄 삭제
cat old_checkpoints.txt | xargs rm -v

# GPU별 학습 스크립트 병렬 실행
echo "0 1 2 3" | xargs -n1 -P4 -I {} bash -c 'CUDA_VISIBLE_DEVICES={} python train.py --gpu {}'

프로세스 관리

프로세스 확인과 제어

명령어설명핵심 사용법
ps프로세스 목록ps aux (전체), ps -eo pid,ppid,%cpu,%mem,cmd
top실시간 프로세스 모니터P (CPU순), M (메모리순), 1 (코어별)
htop향상된 프로세스 모니터트리 뷰, 마우스 지원, 필터링
kill프로세스에 시그널 전송kill PID (SIGTERM), kill -9 PID (SIGKILL)
nice우선순위 지정하여 실행nice -n 10 python preprocess.py
renice실행 중 우선순위 변경renice -n 5 -p PID
jobs현재 셸의 백그라운드 작업 목록
fg백그라운드 → 포그라운드fg %1
bg정지된 작업 → 백그라운드 실행bg %1
# GPU를 사용하는 Python 프로세스 찾기
ps aux | grep python | grep -v grep

# 특정 GPU를 점유하는 프로세스 확인
nvidia-smi --query-compute-apps=pid,used_gpu_memory,name --format=csv

# 학습 프로세스를 백그라운드로 전환
# 1) Ctrl+Z (정지) → bg (백그라운드 실행)
# 2) 또는 처음부터: python train.py &
kill -9(SIGKILL)은 프로세스에 정리 기회를 주지 않으므로, 체크포인트 저장이 불가능합니다. 반드시 kill(SIGTERM)을 먼저 시도하고, 응답이 없을 때만 -9를 사용하세요.

systemd 서비스 관리

systemd는 현대 리눅스의 서비스 관리 시스템입니다. 부팅 시 자동 실행, 프로세스 재시작, 로그 관리 등을 담당합니다.

기본 명령어

# 서비스 상태 확인/시작/중지/재시작
systemctl status nginx
systemctl start nginx
systemctl stop nginx
systemctl restart nginx

# 부팅 시 자동 실행 설정
systemctl enable nginx
systemctl disable nginx

# 서비스 목록 확인
systemctl list-units --type=service --state=running

커스텀 서비스 등록

# /etc/systemd/system/mlflow.service
[Unit]
Description=MLflow Tracking Server
After=network.target

[Service]
Type=simple
User=mluser
WorkingDirectory=/data/mlflow
ExecStart=/data/mlflow/.venv/bin/mlflow server \
    --host 0.0.0.0 --port 5000 \
    --backend-store-uri sqlite:///mlflow.db \
    --default-artifact-root /data/models/mlflow-artifacts
Restart=on-failure
RestartSec=10
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
# 서비스 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable mlflow
sudo systemctl start mlflow

# 로그 확인
journalctl -u mlflow -f              # 실시간 로그 추적
journalctl -u mlflow --since "1 hour ago"  # 최근 1시간 로그
journalctl -u mlflow -p err           # 에러 로그만
journalctl은 systemd 서비스의 표준 출력(stdout/stderr)을 자동으로 수집합니다. 학습 스크립트를 systemd 서비스로 등록하면 별도의 로그 파일 설정 없이 journalctl로 로그를 관리할 수 있습니다.

디스크, 메모리, GPU 모니터링

디스크

# 파일시스템별 사용량
df -hT                     # 마운트, 타입, 용량, 사용률

# 디렉터리별 용량
du -sh /data/*             # /data 하위 디렉터리별 크기
du -h --max-depth=1 /data  # 한 단계까지만

# 가장 큰 파일/디렉터리 10개
du -ah /data | sort -rh | head -10

메모리

# 메모리 사용량 요약
free -h                    # 전체, 사용, 여유, 캐시, 스왑

# 상세 메모리 정보
cat /proc/meminfo

# 프로세스별 메모리 사용량 (상위 10개)
ps aux --sort=-%mem | head -10

GPU 모니터링 (nvidia-smi)

# GPU 상태 한눈에 보기
nvidia-smi

# 1초 간격 자동 갱신
watch -n 1 nvidia-smi

# 특정 정보만 추출
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.total --format=csv

# GPU 프로세스 확인
nvidia-smi --query-compute-apps=pid,used_gpu_memory,name --format=csv
nvidia-smi 항목설명주의 사항
GPU-UtilGPU 코어 사용률낮으면 데이터 로딩 병목 가능성
Memory-UsageGPU 메모리 사용량OOM 직전에 확인 필수
TemperatureGPU 온도80–90도에서 스로틀링 발생 (모델별 상이)
Power Usage전력 소비전력 제한 설정 확인
ProcessesGPU 점유 프로세스다른 사용자의 프로세스 확인

사용자/그룹 관리

명령어설명예시
useradd사용자 생성useradd -m -s /bin/bash mluser
usermod사용자 수정usermod -aG docker mluser (docker 그룹 추가)
passwd비밀번호 설정passwd mluser
groups그룹 확인groups mluser
id사용자 ID/그룹 정보id mluser
sudo관리자 권한 실행sudo systemctl restart nginx
# ML 팀 공유 환경 구성
sudo groupadd mlteam
sudo usermod -aG mlteam user1
sudo usermod -aG mlteam user2

# 공유 데이터 디렉터리 설정 (SGID로 그룹 상속)
sudo mkdir -p /data/shared
sudo chown :mlteam /data/shared
sudo chmod 2775 /data/shared

# 주요 설정 파일 위치
cat /etc/passwd       # 사용자 목록 (이름:x:UID:GID:설명:홈:셸)
cat /etc/group        # 그룹 목록 (그룹:x:GID:멤버)
cat /etc/sudoers      # sudo 권한 설정 (visudo로 편집)

패키지 관리

시스템 패키지

패키지 관리자배포판설치검색업데이트
aptDebian, Ubuntuapt install pkgapt search pkgapt update && apt upgrade
dnfRHEL, Fedoradnf install pkgdnf search pkgdnf update
pacmanArchpacman -S pkgpacman -Ss pkgpacman -Syu

Python 패키지 관리자 비교

관리자환경 격리속도CUDA 호환적합한 용도
pipvenv와 조합보통수동 설정일반 Python 패키지
uv자체 venv매우 빠름수동 설정빠른 의존성 관리, 현대적 워크플로
conda자체 환경느림자동CUDA/cuDNN 포함 설치, 과학 컴퓨팅
# uv: 빠른 Python 환경 관리 (권장)
uv venv --python 3.12
source .venv/bin/activate
uv pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130

# pip + venv: 기본 Python 환경
python -m venv .venv
source .venv/bin/activate
pip install torch torchvision

# conda: CUDA 포함 설치
conda create -n ml python=3.12
conda activate ml
conda install pytorch torchvision pytorch-cuda=12.4 -c pytorch -c nvidia
uv는 Rust로 작성된 차세대 Python 패키지 관리자로, pip보다 10-100배 빠릅니다. 새 프로젝트에서는 uv를 권장합니다. 단, CUDA 런타임은 별도로 시스템에 설치해야 합니다.

문제 해결: 체계적 접근

1

증상 파악

무엇이 문제인지 정확히 확인합니다. 에러 메시지를 읽고, 언제부터 발생했는지 확인합니다.
# 최근 시스템 로그 확인
journalctl --since "30 min ago" -p warning
dmesg | tail -30
2

자원 상태 확인

시스템 자원(CPU, 메모리, 디스크, GPU) 상태를 점검합니다.
free -h                # 메모리
df -h                  # 디스크
nvidia-smi             # GPU
top -bn1 | head -5     # CPU 요약
3

프로세스 확인

관련 프로세스의 상태, 자원 사용량, 부모-자식 관계를 확인합니다.
ps aux | grep python
lsof -p <PID>          # 프로세스가 열고 있는 파일
strace -p <PID> -c     # 시스템 콜 통계 (디버깅)
4

로그 분석

관련 로그 파일에서 에러 패턴을 검색합니다.
journalctl -u <서비> --since "1 hour ago"
grep -rn "Error\|Exception\|FATAL" /var/log/
tail -100 training.log | grep -i error
5

원인 해결 및 검증

원인을 파악한 후 수정하고, 문제가 해결되었는지 검증합니다.
# 수정 적용 후
systemctl restart <서비>
# 모니터링으로 안정성 확인
watch -n 5 'systemctl status <서비스> && nvidia-smi'

AI/ML에서 이 개념이 중요한 이유

리눅스 기술ML 실무 활용
find + exec오래된 체크포인트 자동 정리, 데이터셋 파일 관리
grep/rg학습 로그 분석, 설정 파일 검색, 코드베이스 탐색
nvidia-smiGPU 메모리/온도/사용률 실시간 모니터링
systemdMLflow, JupyterLab, API 서버 자동 시작
du/df데이터셋/체크포인트 용량 관리, 디스크 부족 예방
사용자/그룹팀 공유 서버에서 데이터/모델 접근 권한 관리
패키지 관리CUDA, cuDNN, PyTorch 등 의존성 관리
프로세스 관리학습 프로세스 모니터링, 좀비 프로세스 정리
du -sh /* 2>/dev/null | sort -rh | head로 루트 레벨에서 큰 디렉터리를 찾고, 해당 디렉터리로 들어가 반복합니다. ML 환경에서는 체크포인트(*.pt, *.ckpt), Docker 이미지(/var/lib/docker), HuggingFace 캐시(~/.cache/huggingface)가 주범인 경우가 많습니다. find / -size +1G -exec ls -lh {} \; 2>/dev/null로 1GB 이상 파일을 바로 찾을 수도 있습니다.
GPU 메모리만 할당하고 연산을 수행하지 않는 상태입니다. 모델을 GPU로 전송한 후 데이터 로딩 병목이 있거나, 학습이 CPU에서 전처리 중일 수 있습니다. DataLoadernum_workers를 늘리거나 pin_memory=True를 설정하여 데이터 공급 속도를 높이세요. 또한, 다른 사용자의 프로세스가 GPU 메모리를 점유하고 있는 것은 아닌지 확인하세요.
systemctl enable <서비스>로 부팅 시 자동 시작을 설정했는지 확인하세요. Docker 컨테이너라면 --restart=unless-stopped 옵션이 필요합니다. PM2를 사용한다면 pm2 startuppm2 save가 필요합니다. systemctl is-enabled <서비스>로 현재 상태를 확인할 수 있습니다.
find는 실시간으로 파일시스템을 탐색하므로 대용량 디렉터리에서 느립니다. locate 명령어는 인덱스 기반이므로 훨씬 빠르지만, sudo updatedb로 인덱스를 갱신해야 합니다. 코드 검색에는 ripgrep(rg)grep -r보다 수십 배 빠릅니다. 또한 검색 범위를 제한하면(find /specific/path) 속도가 크게 향상됩니다.
새 프로젝트에서는 uv를 권장합니다. 의존성 해결이 빠르고, pyproject.toml 기반의 현대적 워크플로를 지원합니다. CUDA 드라이버와 런타임은 시스템 레벨에서 설치하고, PyTorch는 uv로 --index-url https://download.pytorch.org/whl/cuXXX를 지정하여 설치합니다. conda는 CUDA를 자동으로 관리하지만 속도가 느리고, 환경이 무거워질 수 있습니다.
nvidia-smi로 GPU를 점유하는 프로세스의 PID를 확인한 후, ps -p <PID> -o user,pid,cmd로 어떤 사용자의 어떤 프로세스인지 확인합니다. 팀 규칙으로 CUDA_VISIBLE_DEVICES를 분배하거나, NVIDIA MPS(Multi-Process Service) 또는 GPU 스케줄러(SLURM, Kubernetes GPU Plugin)를 도입하는 것이 바람직합니다.

체크리스트

  • 리눅스 파일시스템 주요 디렉터리의 역할을 설명할 수 있다
  • ls, cp, mv, rm, mkdir를 옵션과 함께 능숙하게 사용할 수 있다
  • find, grep/rg를 사용하여 파일과 텍스트를 검색할 수 있다
  • ps, top/htop, kill로 프로세스를 확인하고 관리할 수 있다
  • systemd 서비스를 확인, 시작, 중지, 등록할 수 있다
  • journalctl로 서비스 로그를 조회할 수 있다
  • df, du, free, nvidia-smi로 시스템 자원을 모니터링할 수 있다
  • 사용자와 그룹을 관리하고, 적절한 권한을 설정할 수 있다
  • 문제 발생 시 5단계 체계적 접근법을 적용할 수 있다

다음 문서