LVM 마운트 조정하기 (/home 용량 줄이고 루트 볼륨 확장하기)

루트 볼륨 부족으로 Jenkins Agent가 자주 죽는 현상 해결기 —

1. 발단

사내에서 사용 중인 Jenkins에서 Slave(Agent)가 오프라인 상태라 배포가 안 된다는 연락을 받았습니다.

확인해보니 디스크 용량이 가득 찼다는 메시지가 보였습니다.

종종 있는 일이라, 우선 필요 없는 Docker 이미지나 볼륨 정리 작업을 먼저 실행했습니다.

그런데 문득,

“이게 왜 이렇게 자주 발생하지?”

라는 의문이 들었습니다.

서버 현황 문서에는 충분해 보이는 디스크 크기가 적혀 있었는데, 실제로 확인해보니 조금 의외의 상황이 있었습니다.

VM 생성 시 할당했던 250GB(예시) 중 실제로 루트(/) 파티션에는 70GB 정도만 잡혀 있었고, 나머지는 /home 또는 남은 VG(Volume Group) 영역으로 남아 있었습니다.

즉, 전체 디스크 용량을 충분히 가지고 있었음에도 루트 볼륨이 실제 운영에 필요한 만큼 쓰이지 못하고 있었던 것입니다.

그 결과 Jenkins Agent가 로그, 캐시, 임시 파일 등을 쌓을 때마다 루트 공간이 금방 가득 차 버렸고, 그때마다 Agent가 오프라인 상태가 되는 문제가 반복되었습니다.

전 직장에서도 프로젝트별, 계정별로 마운트를 다르게 주곤 했는데, 생각해보면 이런 마운트 조정 작업은 한 번쯤 꼭 겪는 꽤 루틴한 일인 듯합니다.


2. 해결 전략

이번 작업의 방향은 단순했습니다.

  • /home 디렉토리에 과하게 할당된 공간을 줄이고
  • 그 여유 공간을 루트(/) 볼륨으로 확장하고
  • /home은 필요한 만큼만 다시 할당하기

개인적으로는 /home은 서버 용도에 따라 크게 필요하지 않은 경우가 많아서, 이번에는 5GB 정도만 재할당하는 방향으로 잡았습니다.

물론 이 값은 운영 정책이나 사용자 계정 사용량에 따라 달라질 수 있습니다.


3. 원인 분석

이 문제의 원인은 KVM에서 VM 생성 시 자동 파티션(Default Partitioning) 옵션을 그대로 사용했기 때문이었습니다.

RHEL / CentOS 계열 설치 프로그램(virt-install 등)은 기본적으로 아래와 비슷한 구조로 파티션을 구성하는 경우가 있습니다.

  • /boot : 약 1GB
  • swap : 메모리 크기에 따라 자동 할당
  • /home : 남은 용량 대부분
  • / : 최소 운영 가능 수준

즉, 자동 파티션을 그대로 두면 /home이 대부분의 디스크 공간을 가져가고, 정작 서버 운영에 가장 중요한 루트(/)에는 최소 공간만 남게 될 수 있습니다.

이 구조는 데스크톱 사용자 기준으로는 크게 문제 없을 수 있지만, 서버 환경에서는 조금 얘기가 달라집니다.

특히 Jenkins, Docker, 로그 파일, 임시 산출물 등이 루트 영역을 많이 사용하는 서버에서는 이 기본 구조가 꽤 비효율적으로 느껴질 수 있습니다.

결론적으로, 자동 파티션은 편하지만 서버 환경에는 반드시 맞는지 다시 확인해야 한다는 점을 다시 느꼈습니다.


4. 해결 절차

아래 작업은 LVM 기반 서버 기준입니다. 작업 전에 반드시 백업을 먼저 진행하고, /home을 사용하는 프로세스가 없는지 충분히 확인한 뒤 진행하는 것을 권장합니다.

1) 블록 디바이스 / LVM 구조 확인

우선 현재 디스크와 마운트 구조를 확인합니다.

lsblk

필요하다면 아래 명령도 함께 보면 좋습니다.

pvs
vgs
lvs

이 단계에서 /home, /, VG 이름, LV 이름을 정확히 확인해야 이후 명령어를 안전하게 사용할 수 있습니다.


2) /home 전체 백업

/home LV를 조정할 예정이므로, 먼저 데이터를 안전한 경로로 백업합니다.

mkdir -p /root/backup_home
rsync -aXS /home/ /root/backup_home/

rsync -aXS 옵션은 권한, 타임스탬프, 심볼릭 링크, 확장 속성 등을 최대한 유지하는 데 도움이 됩니다.


3) /home 사용 중인 프로세스 확인

/home을 사용 중인 프로세스가 있으면 언마운트가 되지 않을 수 있습니다.

fuser -mv /home

필요 시 관련 프로세스를 정리한 뒤 다음 단계로 넘어갑니다.


4) /home 언마운트

umount /home

만약 busy 상태라면, 어떤 프로세스가 점유 중인지 다시 확인한 뒤 정리해야 합니다.


5) 기존 /home LV 삭제

/home에 할당된 논리 볼륨을 제거하여 공간을 VG로 반환합니다.

lvremove /dev/mapper/rl-home

또는 환경에 따라 아래처럼 보일 수도 있습니다.

lvremove /dev/rl/home

실제 경로는 lvs 결과를 기준으로 확인하는 것이 가장 안전합니다.


6) 남은 VG 공간을 루트 LV에 확장

루트 볼륨에 여유 공간을 확장합니다.

lvextend -l +95%FREE /dev/mapper/rl-root
xfs_growfs /

만약 파일시스템이 XFS가 아니라면, 파일시스템 종류에 맞는 확장 명령을 사용해야 합니다.

예를 들어 ext4 계열이라면 resize2fs를 사용합니다.


7) 새 /home LV 생성 및 포맷

이제 /home 용도로 작은 LV를 다시 생성합니다.

lvcreate -L 5G -n home rl
mkfs.xfs /dev/rl/home

여기서 rl은 VG 이름의 예시입니다. 환경에 따라 centos, rhel, rocky 등 다른 이름일 수 있으므로 반드시 확인이 필요합니다.


8) /home 마운트 및 fstab 등록

mount /dev/rl/home /home
echo '/dev/mapper/rl-home /home xfs defaults 0 0' | sudo tee -a /etc/fstab
systemctl daemon-reload

fstab 등록 시에는 오타가 있으면 부팅 문제로 이어질 수 있으므로, 가능하면 등록 후 아래 명령으로 한 번 더 검증하는 것이 좋습니다.

mount -a

9) 변경 확인 및 백업 복구

lsblk
rsync -aXS /root/backup_home/ /home/

복구 후에는 권한과 소유자, 필요한 사용자 홈 디렉토리 구조가 정상인지도 함께 확인합니다.


5. 결과

작업 이후 상태는 아래와 같았습니다.

  • 루트(/) 공간을 넉넉하게 확보
  • /home은 5GB로 재할당
  • 기존 데이터와 권한은 유지
  • Jenkins Agent가 디스크 부족으로 자주 오프라인 되던 현상 완화

즉, 서버가 실제 사용하는 영역에 맞게 디스크 구조를 다시 맞춰준 셈입니다.


6. 정리

구분 내용
원인 KVM 자동 파티션 설정으로 /home에 대부분의 용량이 할당됨
현상 Jenkins Agent가 루트 볼륨 부족으로 자주 오프라인 발생
해결 /home 축소 + 루트 볼륨 확장
결과 서버 운영에 적합한 디스크 구조로 개선 완료

7. 마무리

자동 파티션은 분명 편리합니다.

하지만 서버에서는 디스크 용량이 몇 GB인가보다, 그 용량이 어느 마운트 포인트에 배치되어 있는가가 더 중요할 때가 많습니다.

특히 Jenkins나 Docker처럼 루트 볼륨을 자주 사용하는 서비스가 올라가는 서버라면, 초기 구축 시점에 마운트 구조를 꼭 한 번 더 확인하는 것이 좋겠습니다.

/home에 불필요하게 용량이 낭비되는 일은, 가능하면 초기에 한 번 잡아두는 편이 훨씬 마음이 편합니다.


This site uses Just the Docs, a documentation theme for Jekyll.