⚠️ 운영 서버에 바로 적용하기 전 필수 전제
- 스냅샷/이미지 백업 + 설정/데이터 백업
- 동일 사양의 테스트 환경에서 리허설 1회 이상
- 업그레이드 중 네트워크가 끊길 수 있으니 콘솔 접근(IPMI/iDRAC/가상화 콘솔) 확보
1) 왜 지금 해야 하나? (EOS/EOL 리스크)
CentOS 7은 EOL 상태이므로 보안 업데이트가 중단된다. 결과적으로,
- 신규 취약점(CVE)이 떠도 패치 적용 경로가 약해짐
- ISMS/ISMS-P, 내부 보안점검, 감사 대응 시 리스크로 분류될 가능성 증가
- 레거시 라이브러리/패키지 유지로 장애 가능성 확대
따라서 “운영 지속” 자체가 리스크가 되고, 최소한 보안 업데이트가 제공되는 EL 계열로 전환이 필요하다.
2) 어떤 선택지가 있나? (리빌드 vs 인플레이스)
현실적으로 선택지는 2가지다.
| 방식 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
| 리빌드(신규 설치 후 이관) | 가장 안전, 표준화 쉬움, 문제 시 롤백이 쉬움 | 설계/이관 작업량 증가 | 가능하면 무조건 권장 |
| 인플레이스 업그레이드(7→8) | 서버를 그대로 두고 OS만 교체 | 블로커/예외가 많고 리허설 필수 | 재설치가 현실적으로 어려울 때 |
이 문서는 인플레이스 업그레이드 관점으로 진행한다.
3) “CentOS 8을 거쳐야 하나?” 자주 생기는 오해 정리
결론부터 말하면 CentOS 7.9 → Rocky 8.10으로 가는데, 중간에 CentOS 8을 거칠 필요는 없다.
오해가 생기는 이유는 보통 다음 두 흐름이 섞이기 때문이다.
- (전환/리브랜딩) EL8 계열(CentOS 8 / Alma 8 등) → Rocky 8 로 전환하는 도구/흐름
- (메이저 업그레이드) CentOS 7 → EL8 로 올리는 흐름(ELevate/Leapp)
CentOS Linux 8 자체는 이미 수명이 끝났기 때문에 “중간 경유지”로 삼는 건 보통 권장되지 않는다.
4) 사전 준비 체크리스트(필수)
4-1. 필수 전제
- OS가 CentOS 7.9(최신 마이너)인지 확인
- 콘솔 접근 가능(원격 콘솔/IPMI/가상화 콘솔)
/,/var,/boot여유 공간 확인- 백업/스냅샷 확보
- 다운타임 공지/변경 승인/롤백 플랜 수립
4-2. 현재 상태 백업(운영자 관점 최소 덤프)
# 패키지/리포/커널
rpm -qa | sort > /root/pkglist_el7.txt
yum repolist all > /root/yum_repolist_el7.txt
uname -a > /root/uname_el7.txt
# 서비스/포트
systemctl list-unit-files --type=service > /root/services_el7.txt
ss -lntup > /root/listen_ports_el7.txt
# 네트워크
ip a > /root/ip_addr_el7.txt
ip r > /root/ip_route_el7.txt
cat /etc/resolv.conf > /root/resolv_el7.conf
# 방화벽(사용 중이면)
firewall-cmd --list-all > /root/firewalld_el7.txt 2>/dev/null || true
5) 업그레이드 절차(CentOS 7.9 → Rocky 8.10)
큰 흐름
- CentOS 7 리포를 안정적으로 고정
- ELevate(Leapp) 설치
leapp preupgrade로 블로커 제거leapp upgrade실행 후 업그레이드 커널로 부팅- Rocky 8로 올라온 뒤
dnf update로 8.10 최신화
Step 1) 현재 버전 확인
cat /etc/redhat-release
uname -r
Step 2) CentOS 7 리포지토리 Vault 고정(권장)
EOL 이후 일반 미러가 불안정할 수 있어, 설치/업데이트 안정성을 위해 Vault로 고정하는 케이스가 많다.
cat << "EOF" | sudo tee /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://vault.centos.org/7.9.2009/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
yum clean all
yum makecache
업데이트 후 재부팅:
yum upgrade -y
reboot
Step 3) ELevate 리포지토리 설치
yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
Step 4) Leapp + Rocky 업그레이드 데이터 설치
yum install -y leapp-upgrade leapp-data-rocky
Step 5) 사전 점검(핵심): leapp preupgrade
leapp preupgrade
리포트 확인:
less /var/log/leapp/leapp-report.txt
less /var/log/leapp/leapp-preupgrade.log
- 리포트에 **inhibitor(차단)**가 있으면 업그레이드가 진행되지 않는다.
- 보통 “리포트 확인 → 조치 → preupgrade 재실행”을 반복한다.
(자주 등장) Answerfile 항목이 필요한 경우
리포트에서 Missing required answers in the answer file가 보이면 아래처럼 답변을 기록한 뒤 재실행한다.
leapp answer --section remove_pam_pkcs11_module_check.confirm=True
leapp preupgrade
Step 6) 업그레이드 실행: leapp upgrade → reboot
leapp upgrade
reboot
재부팅 후 GRUB 메뉴에서 보통 다음 항목을 선택한다.
ELevate-Upgrade-Initramfs
업그레이드가 완료되면 Rocky 8로 부팅된다.
6) 업그레이드 후 후처리(정리/최신화)
6-1. Rocky 8 repo 확인 + 최신화
dnf repolist
dnf -y update
dnf -y distro-sync
6-2. EL7 잔존 패키지 확인
rpm -qa | egrep '\.el7(\.|$)' | sort
드라이버/보안모듈/에이전트 계열이 남아 있으면 바로 삭제하지 말고 영향도 확인 후 정리한다.
7) Rocky 8.10 업그레이드 완료 “확인 명령어”(붙여넣기용)
아래는 운영에서 바로 쓰는 검증 명령어들이다.
7-1. Rocky 8.10 전환 여부(가장 핵심)
# 1) 릴리즈 파일
cat /etc/redhat-release
# 2) OS 메타 정보
cat /etc/os-release
# 3) Rocky 릴리즈 패키지
rpm -q rocky-release rocky-repos
# 4) 커널/아키텍처
uname -r
uname -m
정상 기준(패턴)
/etc/redhat-release에Rocky Linux release 8.10포함/etc/os-release에NAME="Rocky Linux"및VERSION="8.10"또는VERSION_ID="8.10"
7-2. 리포지토리/업데이트 상태
# 활성 repo가 Rocky 8 계열인지 확인
dnf repolist enabled
# 최신화(권장)
dnf -y update
# 패키지 정합성(가능하면)
dnf -y distro-sync
7-3. SELinux 확인
getenforce
sestatus 2>/dev/null || true
cat /etc/selinux/config | egrep '^(SELINUX=|SELINUXTYPE=)'
7-4. 네트워크/포트/방화벽 점검
ip a
ip r
cat /etc/resolv.conf
ss -lntup
systemctl is-active firewalld && firewall-cmd --list-all || echo "firewalld inactive"
# 환경에 맞게 통신 점검(예)
# ping -c 3 8.8.8.8
# curl -I https://example.com
7-5. 시스템/서비스 장애 스캔
systemctl --failed
journalctl -b -p err --no-pager | tail -n 200
journalctl -p err --no-pager | tail -n 300
8) 한 번에 요약 출력(복붙 스크립트)
echo "===== [OS] /etc/redhat-release ====="; cat /etc/redhat-release
echo "===== [OS] /etc/os-release ====="; cat /etc/os-release
echo "===== [PKG] rocky-release/rocky-repos ====="; rpm -q rocky-release rocky-repos || true
echo "===== [KERNEL] uname ====="; uname -r; uname -m
echo "===== [DNF] repolist enabled ====="; dnf repolist enabled || true
echo "===== [SELINUX] ====="; getenforce; sestatus 2>/dev/null || true
echo "===== [NETWORK] ip a ====="; ip a
echo "===== [NETWORK] ip r ====="; ip r
echo "===== [PORTS] ss -lntup ====="; ss -lntup
echo "===== [SYSTEMD] failed units ====="; systemctl --failed || true
echo "===== [LOG] boot errors (last 200) ====="; journalctl -b -p err --no-pager | tail -n 200
echo "===== [EL7 leftovers] ====="; rpm -qa | egrep '\.el7(\.|$)' | sort || true
9) “업그레이드 완료” 판정 기준
/etc/redhat-release및/etc/os-release에서 Rocky Linux 8.10 확인dnf repolist enabled에서 Rocky 8 리포지토리 활성 확인systemctl --failed가 비어 있고, 서비스/포트가 기대값과 일치journalctl -b -p err에서 부팅/스토리지/네트워크 치명 오류가 보이지 않음el7잔존 패키지는 최소화(또는 영향도 파악 후 정리 계획 수립)
10) FAQ / 트러블 포인트(짧게)
Q1. 업그레이드 중 SSH가 끊기면?
- 정상이다. 그래서 콘솔 접근을 확보해야 한다.
Q2. leapp preupgrade에서 inhibitor가 계속 뜨면?
- 리포트(
/var/log/leapp/leapp-report.txt) 기준으로 하나씩 조치하고 재실행.
Q3. Python 스크립트가 깨질 수 있나?
- EL8 계열은 Python3 중심이라
/usr/bin/python을 가정한 레거시 스크립트는 점검이 필요.