GPU 서버 환경 설정 — Ubuntu 22.04

이 가이드는 폐쇄망 환경에서 DO-Solution 2.0 GPU 서버의 Ubuntu 22.04 OS 환경 구축 방법을 제공합니다.

전제 조건

  • 공개망 서버와 폐쇄망 서버의 OS 및 커널 버전 일치:
    • OS Version: Ubuntu 22.04 LTS
    • Kernel Version: 6.8.0-110-generic
  • Root 또는 sudo 권한 필요

1. 패키지 레포지토리 반입

SCP 또는 물리적 이동을 통해 폐쇄망 서버 /home/$USERdo-repo-ubuntu2204.tar.gz 파일을 반입합니다.

2. 로컬 레포지토리 등록

Repo명 지정

bash
export DEB_REPO_NAME="do-repo"

파일 압축 해제 및 배치

bash
tar -xzvf ${DEB_REPO_NAME}-ubuntu2204.tar.gz
sudo mv ${DEB_REPO_NAME} /opt/${DEB_REPO_NAME}

로컬 .list 파일 등록

bash
sudo cp /opt/${DEB_REPO_NAME}/${DEB_REPO_NAME}.list \
    /etc/apt/sources.list.d/${DEB_REPO_NAME}.list

3. 외부 레포지토리 비활성화

기존 sources.list 비활성화

bash
# 기존 sources.list 비활성화
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak 2>/dev/null || true

# sources.list.d 내 do-repo.list를 제외한 다른 .list 파일 비활성화
sudo find /etc/apt/sources.list.d/ -type f -name "*.list" ! -name "${DEB_REPO_NAME}.list" \
    -exec mv {} {}.bak \;

APT 캐시 갱신

bash
sudo apt clean
sudo apt update

레포지토리 인식 확인

bash
apt-cache policy | grep -A2 "${DEB_REPO_NAME}"

# 기대 출력:
#  500 file:/opt/do-repo ./ Packages
#      release c=

4. 시스템 패키지 설치

운영 유틸리티 설치

bash
sudo apt install -y --no-install-recommends \
    vim pv telnet net-tools nvtop sysstat htop iotop lsof tcpdump \
    dnsutils curl unzip zip jq tree rsync

커널 설치 및 GCC 버전 설정

bash
# 커널 버전 변수 지정 (공개망에서 고정한 버전과 동일)
export KERNEL_VER="6.8.0-110-generic"

# 커널 설치
sudo apt install -y --no-install-recommends \
    linux-image-${KERNEL_VER} linux-modules-${KERNEL_VER} linux-headers-${KERNEL_VER} \
    build-essential dkms gcc-12 g++-12

# 커널 버전 고정 (자동 업그레이드 방지)
sudo apt-mark hold \
    linux-image-${KERNEL_VER} \
    linux-modules-${KERNEL_VER} \
    linux-headers-${KERNEL_VER}

# 메타패키지 hold (새 커널 자동 설치 방지)
sudo apt-mark hold linux-image-generic linux-headers-generic linux-generic

# 고정 확인
apt-mark showhold

# GCC 12로 변경
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100

# GCC 버전 확인
gcc --version | head -n 1

GRUB 부팅 커널 변경

bash
# 설치된 커널 목록 확인
dpkg --list | grep linux-image

# GRUB 메뉴 엔트리 확인 (정확한 문자열 확인용)
awk -F"'" '/menuentry |submenu / {print $2}' /boot/grub/grub.cfg

# saved 모드 설정
sudo sed -i 's|^GRUB_DEFAULT=.*|GRUB_DEFAULT=saved|' /etc/default/grub
sudo update-grub

# 설치한 커널을 기본 부팅 커널로 지정
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux ${KERNEL_VER}"

# 설정 확인
grub-editenv list

서버 재부팅

bash
sudo reboot

재부팅 이후 커널 버전 확인

bash
uname -r

# 기대 출력 (반드시 아래 버전이어야 함):
# 6.8.0-110-generic

5. NVIDIA 패키지 설치 (GPU 서버만 진행)

CPU 서버: 6단계 — Docker 설치로 건너뜁니다.

NVIDIA 드라이버 설치

bash
# 재부팅 후 변수 재등록
export DEB_REPO_NAME="do-repo"
export NVIDIA_VER=$(apt-cache search "^nvidia-driver-[0-9]+$" \
    | awk '{print $1}' \
    | grep -oP 'nvidia-driver-\K[0-9]+' \
    | sort -n \
    | tail -1)
echo "감지된 NVIDIA 드라이버 버전: ${NVIDIA_VER}"

# 설치할 패키지 목록 구성
NVIDIA_PKG_LIST="\
nvidia-driver-${NVIDIA_VER} \
nvidia-dkms-${NVIDIA_VER} \
nvidia-utils-${NVIDIA_VER} \
nvidia-settings \
libnvidia-cfg1-${NVIDIA_VER} \
libnvidia-compute-${NVIDIA_VER} \
libnvidia-decode-${NVIDIA_VER} \
libnvidia-encode-${NVIDIA_VER} \
libnvidia-extra-${NVIDIA_VER} \
libnvidia-fbc1-${NVIDIA_VER} \
libnvidia-gl-${NVIDIA_VER} \
xserver-xorg-video-nvidia-${NVIDIA_VER}"

# NVIDIA 드라이버 설치
sudo apt install -y --no-install-recommends ${NVIDIA_PKG_LIST}

nouveau 비활성화 및 재부팅

bash
# 기존 blacklist 설정 확인
ls /etc/modprobe.d/ | grep -i nouveau || echo "blacklist 파일 없음"

# blacklist 파일이 없으면 수동 추가
if ! grep -rq "blacklist nouveau" /etc/modprobe.d/ 2>/dev/null; then
    echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
    echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
fi

# initramfs 재생성
sudo update-initramfs -u

# 재부팅
sudo reboot

CUDA 및 cuDNN 설치

bash
sudo apt install -y --no-install-recommends cuda-toolkit-13-2 cudnn9-cuda-13

CUDA 환경변수 설정

bash
# CUDA 설치 경로 확인
ls /usr/local/ | grep cuda

# 환경변수 설정
sudo tee /etc/profile.d/cuda.sh <<EOF
export PATH=/usr/local/cuda/bin:\${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:\${LD_LIBRARY_PATH}
EOF
source /etc/profile.d/cuda.sh

6. Docker 설치

bash
# 재부팅 후 변수 재등록
export DEB_REPO_NAME="do-repo"

sudo apt install -y --no-install-recommends \
    docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Docker 서비스 활성화
sudo systemctl enable --now docker

# Docker 권한 추가 (그룹 적용을 위해 재로그인 필요)
sudo usermod -aG docker $USER

7. NVIDIA Container Toolkit 설치 (GPU 서버만 진행)

CPU 서버: 8단계 — 설치 검증으로 건너뜁니다.

bash
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.0-1

sudo apt install -y --no-install-recommends \
    nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

# Docker Engine Runtime을 nvidia container toolkit으로 지정
sudo nvidia-ctk runtime configure --runtime=docker

# Docker Engine 재시작
sudo systemctl restart docker

8. 설치 검증

NVIDIA 드라이버 확인 (GPU 서버만)

bash
# nvidia 모듈 로드 확인
lsmod | grep nvidia

# nvidia-smi 확인: 전달 받은 GPU 스펙과 일치하는지 확인
nvidia-smi

CUDA 확인 (GPU 서버만)

bash
nvcc --version

# 기대 출력:
# Cuda compilation tools, release 13.2, V13.2.78

cuDNN 확인 (GPU 서버만)

bash
ldconfig -p | grep cudnn

# 기대 출력: libcudnn.so.9, libcudnn_ops.so.9 등

Docker 확인

bash
sudo docker version

NVIDIA Container Toolkit 적용 확인 (GPU 서버만)

bash
sudo nvidia-ctk runtime configure --runtime=docker --dry-run

# 기대 출력:
# {
#     "runtimes": {
#         "nvidia": { "path": "nvidia-container-runtime" }
#     }
# }