RHEL 7 의 기본 커널은 3.10 이다. Kubernetes 나 최신 컨테이너 런타임을 올리려고 커널만 5.x 로 바꾸는 요구가 종종 나오는데, 커널만 올려서 해결되는 문제가 아닌 경우가 대부분이다.
| 구성 요소 | RHEL 7 |
|---|---|
| 커널 | 3.10 |
| systemd | 219 |
| glibc | 2.17 |
| cgroup | v1 |
| iptables | legacy |
최신 Kubernetes 는 cgroup v2 를 권장하고 CRI v1 을 지원하는 런타임을 요구한다. 커널을 5.x 로 올려도 systemd 219 와 glibc 2.17 은 그대로이므로 런타임과 kubelet 쪽에서 계속 막힌다. RHEL 7 은 2024-06-30 로 일반 유지보수가 끝났다. 가능하면 RHEL 9 이나 Rocky Linux 9 로 OS 를 올리는 편이 맞고, 커널 업그레이드는 그것이 불가능할 때의 임시 수단이다.
그래도 올려야 한다면 kernel-ml(최신) 보다 kernel-lt(장기 지원) 계열이 보수적이다. ELRepo 의 EL7 패키지는 현재 아카이브 상태다.
인터넷이 되는 같은 계열 장비에서 받아 매체로 옮긴다. EL7 용 ELRepo 저장소 메타데이터는 아카이브라 yumdownloader 가 깔끔하게 동작하지 않는 경우가 많다. 파일을 직접 받는 편이 확실하다.
mkdir -p /root/offline/kernel-lt
cd /root/offline/kernel-lt
BASE=https://elrepo.org/linux/kernel/el7/x86_64/RPMS
VER=5.4.278-1.el7.elrepo
curl -fLO "${BASE}/kernel-lt-${VER}.x86_64.rpm"
curl -fLO "${BASE}/kernel-lt-headers-${VER}.x86_64.rpm"
curl -fLO "${BASE}/kernel-lt-devel-${VER}.x86_64.rpm"
curl -fLO "${BASE}/kernel-lt-tools-${VER}.x86_64.rpm"
curl -fLO "${BASE}/kernel-lt-tools-libs-${VER}.x86_64.rpm"
curl -fLO "${BASE}/perf-${VER}.x86_64.rpm"
sha256sum *.rpm > SHA256SUMS
ls -lh
부팅만 목적이면 kernel-lt 하나로도 설치된다. 커널 모듈 빌드나 GPU 드라이버가 필요하면 headers 와 devel 을 같이 가져간다.
아카이브 미러 URL 은 자주 바뀐다. 위 경로에서 404 가 나면 https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 디렉터리를 직접 열어 현재 남아 있는 파일명을 확인한다. 특정 버전을 지정해 준 링크가 살아 있으리라 가정하지 않는다.
curl: (60) Peer's Certificate issuer is not recognized.
받는 장비의 CA 번들이 오래됐다. -k 로 검증을 끄지 말고 번들을 갱신한다.
sudo yum update -y ca-certificates
sudo update-ca-trust
wget: unable to resolve host address
이름 해석이 안 되는 것이므로 DNS 설정이나 프록시를 먼저 본다. 미러 주소 자체가 사라진 경우도 있으니 다른 미러를 찾는다.
cd /root/kernel-lt
sha256sum -c SHA256SUMS
sudo yum localinstall -y ./kernel-lt-*.rpm ./perf-*.rpm
기존 커널은 지워지지 않고 새 커널이 추가로 설치된다. 문제가 생기면 GRUB 메뉴에서 옛 커널로 돌아갈 수 있다는 뜻이다.
# 항목 확인
sudo awk -F\' '$1=="menuentry " {print NR-1" : "$2}' /boot/grub2/grub.cfg
# 새 커널을 기본으로
sudo grub2-set-default 0
sudo grub2-editenv list
GRUB_DEFAULT=saved 가 아니면 grub2-set-default 가 듣지 않는다. /etc/default/grub 을 확인하고 설정을 다시 만든다.
# BIOS 부팅
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI 부팅
sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
어느 쪽인지는 다음으로 확인한다.
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
재부팅 후 확인한다.
uname -r
물리 콘솔이나 iLO·IMM 같은 원격 콘솔을 확보한 뒤 작업한다. SSH 만으로는 되돌릴 수 없다.
dracut emergency shell 에서 멈춘다. 옛 커널로 부팅한 뒤 다시 만든다.
sudo dracut -f /boot/initramfs-5.4.278-1.el7.elrepo.x86_64.img 5.4.278-1.el7.elrepo.x86_64
ls -l /boot/initramfs-*
Warning: /dev/mapper/... does not exist 나 루트를 찾지 못하는 형태로 멈춘다. 오래된 RAID 컨트롤러는 새 커널에서 드라이버가 제거되거나 이름이 바뀐 경우가 있다. 옛 커널로 부팅해 현재 쓰는 드라이버를 확인하고 새 커널 쪽에 그 모듈이 있는지 본다.
lsblk -o NAME,MODEL
lspci -k | grep -A3 -i 'raid\|storage'
ls /lib/modules/5.4.278-1.el7.elrepo.x86_64/kernel/drivers/scsi/
megaraid_sas, mpt3sas 같은 모듈을 initramfs 에 강제로 포함시킨다.
sudo dracut -f --add-drivers "megaraid_sas mpt3sas" /boot/initramfs-5.4.278-1.el7.elrepo.x86_64.img 5.4.278-1.el7.elrepo.x86_64
부팅은 되는데 SSH 가 안 된다. 커널이 바뀌면서 NIC 이름이 달라진 경우가 많다(eno1 → enp3s0). 콘솔에서 확인한다.
ip link
ls /etc/sysconfig/network-scripts/
이름을 고정하려면 커널 파라미터에 net.ifnames=0 biosdevname=0 을 주거나, 새 이름에 맞는 ifcfg- 파일을 만든다.
sudo awk -F\' '$1=="menuentry " {print NR-1" : "$2}' /boot/grub2/grub.cfg
sudo grub2-set-default <기존 커널 인덱스>
sudo reboot
# 새 커널 제거
sudo yum remove -y kernel-lt
2013~2015년 세대 장비에 최신 커널을 올릴 때는 CPU 지원 여부보다 주변 장치 드라이버 가 문제가 된다. CPU 아키텍처는 오래돼도 계속 지원되지만, 구형 RAID 컨트롤러와 NIC 은 새 커널에서 드라이버가 정리되거나 동작이 달라진다. 벤더가 게시한 지원 OS 목록은 "이 커널 버전까지 시험했다" 는 뜻이지 그 이상에서 동작을 보증하지 않는다는 뜻이기도 하다.
장비 모델별 지원 커널 범위는 벤더 문서에서 직접 확인해야 한다. 이 항목은 확인 필요.
작업 전에는 반드시 다음을 확보한다.
/boot 여유 공간. 커널이 쌓이면 가득 차 dracut 이 실패한다df -h /boot
rpm -qa 'kernel*' | sort