🐧 Rocky Linux 9.6 Vagrant 기반 VMware 템플릿 생성 가이드 (v3.0)
이 문서는 Rocky Linux 9.6 Vagrant VMware 이미지를 기반으로 vCenter 배포를 위한 공식 인프라 템플릿으로 마이그레이션하고, VM 생성 시 cloud-init을 통해 IP/라우팅 및 루트 디스크 자동 확장이 한 오차도 없이 안정적으로 동작하도록 제작하는 절차예요.
📌 핵심 기본 전제
템플릿 빌드 시 무조건 확보되어야 하는 핵심 요구사항 항목이에요.
* OS 네트워크 제어 엔진은 NetworkManager를 사용해요.
* cloud-init의 메타데이터 탐색 datasource는 VMware 및 OVF로 한정 제한해요.
* 자동 용량 증설을 완벽하게 대응하도록 cloud-utils-growpart를 빌드 단계에서 확실히 적재해 주어야 해요.
* 최종 템플릿 변환 직전에는 cloud-init clean --logs --machine-id 명령으로 고유 ID와 캐시를 지워 완전한 첫 부팅(First Boot) 상태를 강제해야 해요.
1. 이미지 준비 및 OVF 변환 절차
1.1 Rocky Linux Vagrant 이미지 다운로드
Rocky Linux 아카이브 스토리지에서 VMware 가상화용 최신 Box를 직접 내려받아요.
* 다운로드 경로: Rocky Linux Vault - x86_64 이미지
* 다운로드 대상 파일: Rocky-9-Vagrant-VMware.latest.x86_64.box
1.2 Vagrant Box 압축 해제 및 확인
Box 파일은 실질적으로 tar 압축 파일이에요. 확장자를 변경하여 안에 들어있는 .vmx 설정을 추출해요.
# 확장자 명칭 변경
mv Rocky-9-Vagrant-VMware.latest.x86_64.box Rocky-9-Vagrant-VMware.latest.x86_64.tar.gz
# tar 압축 해제
tar xvf Rocky-9-Vagrant-VMware.latest.x86_64.tar.gz
# vmx 가상 머신 설정 파일 확보 검증
ls -al *.vmx
1.3 OVF 변환 도구 설치
VMware 가상 머신 구성을 OVF 구조로 컨버전하기 위해 Broadcom 포털에서 ovftool을 획득하여 터미널에 설치해요.
* 도구 획득 경로: Broadcom OVF Tool 다운로드 링크
1.4 OVF 포맷 변환 기동
변환 툴을 이용하여 vmx 구조를 업로드용 OVF 구조로 트랜스폼해요.
2. vCenter 업로드 및 하드웨어 구성 조정
2.1 OVF 템플릿 배포 및 등록
vCenter 관리 콘솔의 OVF 템플릿 배포 메뉴를 실행하여 방금 빌드한 Rocky-9-Template.ovf 리소스를 업로드해요.
2.2 가상 하드웨어 환경 편집
- 네트워크 어댑터: 신규 어댑터를 추가하고, 드라이버 방식을 예측 가능하고 고성능인 VMXNET3 유형으로 변경해요.
- 부팅 사양: 하드웨어 가상 펌웨어 구동 설정을 BIOS 부팅 방식으로 지정해요.
- CPU/메모리/디스크: 타겟 인프라 요건에 따라 사양을 조정해요.
[!NOTE] 자동 볼륨 리사이징은 루트 파티션이 대상 디스크의 가장 뒤쪽(연속된 공간)에 배정되어 있을 때 오류 없이 매끄럽게 동작해요. LVM(논리 볼륨) 기반인 가이드가 요구될 때는 수동
pvresize,lvextend -r절차를 태워야 할 수 있어요.
3. 서비스 설치 및 cloud-init 환경 튜닝
3.1 부팅 및 최초 권한 획득
가상 머신 구동 후 Vagrant 기본 계정을 사용해 루트 셸을 확보해요.
* 기본 사용자 계정: vagrant
* 기본 비밀번호: vagrant
구동 직후 필수 데몬 가동 현황을 파악해요.
3.2 임시 네트워크 인터페이스 구성
필수 모듈의 DNF 팩 다운로드를 위해 nmcli 명령으로 일시 인터넷 접속 경로를 셋업해요.
# 디바이스 명칭 스캔
sudo nmcli connection show
# "Wired connection 1" 명칭 확인 시, static IP 및 게이트웨이 강제 적용
sudo nmcli connection modify "Wired connection 1" \
ipv4.addresses x.x.x.x/x \
ipv4.gateway x.x.x.x \
ipv4.dns x.x.x.x \
ipv4.method manual
# 인터페이스 적용 및 핑 검증
sudo nmcli connection up "Wired connection 1"
ping -c 3 8.8.8.8
ping -c 3 dl.rockylinux.org
3.3 핵심 패키지 주입
가상화 드라이브 안정화와 디스크 리사이즈를 완벽하게 구동하는 패키지를 dnf로 적재해요.
sudo dnf install -y \
cloud-init \
cloud-utils-growpart \
open-vm-tools \
NetworkManager \
openssh-server \
xfsprogs
- 패키지별 요약:
cloud-init: VM 부팅 시 메타데이터 매핑 및 파티션 자동 리사이즈 수행.cloud-utils-growpart:/파티션 강제 볼륨 할당용growpart쉘 유틸리티 제공.open-vm-tools: 게스트 커스터마이제이션 지원.NetworkManager: 클라우드 메타데이터 네트워크 렌더링.xfsprogs: XFS 파일시스템 확장 도구(xfs_growfs) 제공.
설치 완료 검사:
rpm -q cloud-init cloud-utils-growpart open-vm-tools NetworkManager openssh-server xfsprogs
command -v growpart
command -v xfs_growfs
3.4 cloud-init 렌더러 NetworkManager 강제 지정
네트워크 제어가 충돌 없이 NetworkManager 프로토콜로 작동되게 렌더러 설정을 드롭인 경로에 작성해 주어요. (YAML 들여쓰기 정렬 철저 준수)
sudo tee /etc/cloud/cloud.cfg.d/99-network-renderer.cfg >/dev/null <<'EOF'
system_info:
network:
renderers: ['network-manager']
EOF
3.5 VMware 전용 Datasource 제한 설정
VMware Guest OS Customization 및 vCenter GuestInfo의 cloud-init 정보 주입 방식을 타도록 datasource 경로를 구성해요.
sudo tee /etc/cloud/cloud.cfg.d/99_vmware.cfg >/dev/null <<'EOF'
datasource_list: [ VMware, OVF, None ]
datasource:
VMware:
allow_raw_data: true
allow_update_network: true
network_config:
encoding: base64
variable: network
EOF
3.6 디스크 자동 팽창(growpart & resizefs) 세부 설정
디스크 1의 확장이 일어났을 때, 마운트 지점(/)과 파티션 공간을 100% 동기화해 주도록 관련 드롭인 스크립트를 작성하고 불필요한 비활성화 파일을 차단해요.
sudo tee /etc/cloud/cloud.cfg.d/98-growpart-resizefs.cfg >/dev/null <<'EOF'
growpart:
mode: auto
devices: ['/']
ignore_growroot_disabled: true
resize_rootfs: true
EOF
# 혹시 남아있을 비활성화 식별 태그 제거
sudo rm -f /etc/growroot-disabled
설정 파일의 무결성을 화면에 표시하여 육안 확인해요.
3.7 모듈 활성화 수준 확인 및 스키마 검증
/etc/cloud/cloud.cfg 내부에 해당 컴포넌트 모듈들이 적절히 할당되어 있는지 그랩하여 점검하고 스키마 문법 유효성을 최종 체크해요.
* 정상 출력 스냅샷:- 스키마 구조적 유효성 검증:
3.8 필수 프로세스 활성화 등록
인프라의 주요 백그라운드 프로세스들을 부팅 시 구동되게 활성화 조치해요.
sudo systemctl enable --now cloud-init
sudo systemctl enable --now vmtoolsd
sudo systemctl enable --now NetworkManager
sudo systemctl enable --now sshd
4. 모니터링 에이전트(Node Exporter) 주입
인프라 통합 수집 시스템과의 지표 연동을 위해 Node Exporter 1.7.0을 사전 탑재시켜 주어요.
1. 가상 머신 내부로 node_exporter-1.7.0.tar.gz 바이너리를 파일 업로드해요.
2. 아래 순서로 수동 빌드를 기동하여 서비스 파일 등록까지 마치도록 설정해요.
sudo systemctl status node_exporter.service
# 로컬에서 메트릭 수집 가능 유무 점검
curl http://localhost:9100/metrics | head -n 10
5. 네트워크 인터페이스 예측 가능 명칭 고정 (eth0)
vCenter 및 CMP에서 고정 IP를 할당할 때 인터페이스명이 유동적으로 흔들리지 않도록 eth0, eth1 등의 일관성 있는 이름 체계를 커널 파라미터 수준에서 하드 코딩해 주어요.
5.1 커널 파라미터 옵션 튜닝
/etc/default/grub 파일의 GRUB_CMDLINE_LINUX 지시어 마지막 줄 우측 끝에 아래 옵션을 공백 하나 뒤에 이어 붙여 수동 적용해요.
* 추가 옵션: net.ifnames=0 biosdevname=0
그 다음 커널 명령어 실행 툴인 grubby를 이용해 가동 중인 전체 부팅 환경 커널에 반영을 선언해요.
5.2 Grub 환경 파일 재생성 (부팅 정보 동기화)
서버 부팅 유형(BIOS vs UEFI)에 맞춰 적절한 타겟 디렉토리에 빌드를 수행해요.
# BIOS 구동 환경인 경우
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI 구동 환경인 경우
sudo grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
5.3 변경 후 재부팅 확인
[!NOTE] 명령 결과에
eth0,eth1형태의 예측 가능한 명칭이 매핑되어 출력되는 것을 눈으로 검증해야 해요.
6. 시스템 초기화 및 최종 템플릿 잠금 단계
배포 템플릿의 잔여 캐시 정보로 인해 중복 IP 할당, 호스트 고유 ID 오버랩 에러 등이 발생하는 참사를 막기 위한 극도로 엄격한 청소 스크립트 절차예요.
# 6.1 임시 임베디드 네트워크 바인딩 연결 파일의 원천 제거
sudo rm -f /etc/NetworkManager/system-connections/*.nmconnection
sudo rm -f /etc/netplan/*
sudo systemctl restart NetworkManager
# 6.2 cloud-init 로그, 로컬 machine-id 지문, 저널로그 청소
sudo cloud-init clean --logs --machine-id
sudo rm -rf /var/lib/cloud/*
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
sudo rm -f /etc/NetworkManager/system-connections/*.nmconnection
sudo journalctl --vacuum-time=0
sudo rm -rf /tmp/*
# 6.3 쉘 실행 이력 흔적 말소
history -c && history -w
# 6.4 가상 머신 즉각 종료
sudo poweroff
가상 머신이 파워오프 상태가 되면, vCenter 콘솔에서 해당 VM을 우클릭하고 템플릿으로 변환을 실행하면 최종적으로 패키징이 끝나요.
7. 템플릿 가동 후 자동 볼륨 증가 확인 디버깅 가이드
해당 템플릿으로 최종 프로비저닝된 신규 가상 머신을 켜고 디스크 1이 늘어난 하드웨어 크기를 인식했는지 확인해요.
# 1. cloud-init 구동 성공 대기
sudo cloud-init status --wait
sudo cloud-init status --long
# 2. 파일시스템 크기 비교 점검
lsblk -f
df -hT /
findmnt -no SOURCE,FSTYPE,SIZE,USED,AVAIL /
# 3. cloud-init 실행 로그 내 리사이저 동작 패턴 조사
sudo grep -Ei 'growpart|resizefs|resize_rootfs|growroot|NOCHANGE|FAILED|ERROR|WARN' \
/var/log/cloud-init.log /var/log/cloud-init-output.log
🚨 트러블슈팅 대표 유형
Q. 디스크 크기는 확대되었는데 파티션(/dev/sda5 등) 용량이 이전 템플릿 수준에 머물러 있어요.
- 원인 1:
cloud-utils-growpart패키지가 템플릿 제작 단계에서 설치 누락된 경우예요.- 조치:
sudo dnf install -y cloud-utils-growpart실행 후 수동 리사이즈를 기동해 봐요.
- 조치:
- 원인 2: 확장하고자 하는 루트 파티션 뒤쪽에 다른 고정 파티션(예: Swap 파티션 등)이 달라붙어 있어, 디스크의 연속된 Free Space 공간 팽창을 막고 있는 경우예요.
- 확인:
sudo parted /dev/sda unit MiB print free실행 시,/dev/sda5바로 옆 뒤쪽 구간에Free Space영역이 표시되는지 대조해요. 만약 비연속 공간이라면 디스크 파티션 구조를 앞단으로 다시 조정하는 템플릿 재설계가 필요해요.
- 확인:
- 원인 3: 새 VM 배포 후 1회 구동(first boot) 인식이 되지 않아 작동이 멈춘 상태예요.
- 조치: 템플릿 변환 종료 스크립트 실행 시
cloud-init clean --logs --machine-id단계가 정상적으로 돌았는지 이력을 면밀히 되짚어봐요.
- 조치: 템플릿 변환 종료 스크립트 실행 시