RHEL 9 커널 관리 명령어 실무 가이드: 두 판 사이의 차이
초안 |
수정1 |
||
| 1번째 줄: | 1번째 줄: | ||
== 1. 개요 == | == 1. 문서 개요 == | ||
== | === 1.1 목적 === | ||
이 문서는 RHEL 9 계열 시스템에서 자주 사용하는 커널 관련 명령어를 정리한다. | |||
주요 대상은 다음과 같다. | |||
* Red Hat Enterprise Linux 9 | |||
* Rocky Linux 9 | |||
* AlmaLinux 9 | |||
* 기타 RHEL 9 호환 배포판 | |||
커널 버전 확인, 커널 패키지 관리, 기본 부팅 커널 변경, 커널 모듈 관리, 런타임 파라미터 변경, initramfs 재생성 및 커널 장애 분석 절차를 다룬다. | |||
=== | === 1.2 권한 === | ||
조회 명령어 대부분은 일반 사용자도 실행할 수 있지만 다음 작업은 <code>root</code> 권한이 필요하다. | |||
* | * 커널 패키지 설치 및 삭제 | ||
* 기본 부팅 커널 변경 | |||
* 커널 모듈 적재 및 제거 | |||
* 커널 파라미터 변경 | |||
* initramfs 재생성 | |||
* kdump 설정 | |||
* 시스템 재부팅 | |||
관리 명령은 다음 중 한 가지 방식으로 실행한다. | |||
<code>sudo 명령어</code> | |||
또는: | |||
<code>sudo -i</code> | |||
=== 1.3 주요 주의사항 === | |||
커널, GRUB, initramfs 작업은 시스템 부팅 실패로 이어질 수 있다. | |||
작업 전 다음 사항을 확인한다. | |||
<code>uname -r | |||
<code> | grubby --default-kernel | ||
grubby --info=ALL | |||
rpm -qa 'kernel*' | sort | |||
df -h /boot /boot/efi</code> | |||
설정 파일을 수정할 경우 백업한다. | |||
<code>cp -a /etc/default/grub \ | |||
/etc/default/grub.$(date +%Y%m%d-%H%M%S).bak | |||
cp -a /etc/sysctl.conf \ | |||
/etc/sysctl.conf.$(date +%Y%m%d-%H%M%S).bak</code> | |||
원격 서버에서 커널 또는 네트워크 관련 파라미터를 변경할 때는 콘솔 접속 수단을 확보하는 것이 좋다. | |||
---- | |||
= | = 2. 커널 상태 및 버전 확인 = | ||
== 2.1 <code>uname</code> == | |||
== | === 기능 === | ||
현재 실행 중인 커널의 버전, 아키텍처 및 시스템 정보를 확인한다. | |||
<code>uname</code>은 설치된 커널이 아니라 '''현재 부팅되어 실제 실행 중인 커널'''을 표시한다. | |||
== | === 현재 실행 중인 커널 버전 확인 === | ||
<code>uname -r</code> | |||
출력 예: | |||
<code>5.14.0-570.18.1.el9_6.x86_64</code> | |||
=== 전체 커널 정보 확인 === | |||
<code>uname -a</code> | |||
출력 예: | |||
<code>Linux server01 5.14.0-570.18.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC ...</code> | |||
== | === 시스템 아키텍처 확인 === | ||
<code>uname -m</code> | |||
출력 예: | |||
<code>x86_64</code> | |||
=== 확인 포인트 === | |||
== 10. | * 현재 실행 중인 커널 버전 | ||
* <code>x86_64</code>, <code>aarch64</code> 등의 시스템 아키텍처 | |||
* 커널 업데이트 후 실제로 신규 커널로 부팅되었는지 여부 | |||
---- | |||
== 2.2 <code>/proc/version</code> == | |||
=== 기능 === | |||
현재 실행 중인 커널의 버전과 컴파일러 정보를 확인한다. | |||
=== 사용 예제 === | |||
<code>cat /proc/version</code> | |||
출력 예: | |||
<code>Linux version 5.14.0-570.18.1.el9_6.x86_64 ...</code> | |||
=== 활용 === | |||
커널 버전뿐 아니라 커널 빌드에 사용된 GCC 버전과 빌드 정보를 함께 확인할 때 사용한다. | |||
---- | |||
== 2.3 <code>hostnamectl</code> == | |||
=== 기능 === | |||
호스트명, 운영체제, 커널 버전 및 시스템 아키텍처를 한 번에 확인한다. | |||
=== 사용 예제 === | |||
<code>hostnamectl</code> | |||
출력 예: | |||
<code>Static hostname: server01 | |||
Operating System: Rocky Linux 9.6 | |||
Kernel: Linux 5.14.0-570.18.1.el9_6.x86_64 | |||
Architecture: x86-64</code> | |||
=== 확인 포인트 === | |||
* 배포판과 마이너 버전 | |||
* 현재 커널 | |||
* 물리 서버 또는 가상화 환경 여부 | |||
* 시스템 아키텍처 | |||
---- | |||
== 2.4 <code>rpm</code> == | |||
=== 기능 === | |||
설치된 커널 RPM 패키지를 조회한다. | |||
=== 설치된 기본 커널 패키지 확인 === | |||
<code>rpm -q kernel</code> | |||
=== 커널 관련 패키지 전체 확인 === | |||
<code>rpm -qa 'kernel*' | sort</code> | |||
=== 현재 실행 중인 커널 패키지 확인 === | |||
<code>rpm -q kernel-core-$(uname -r)</code> | |||
정상 출력 예: | |||
<code>kernel-core-5.14.0-570.18.1.el9_6.x86_64</code> | |||
패키지가 없으면 다음과 같이 표시될 수 있다. | |||
<code>package kernel-core-5.14.0-570.18.1.el9_6.x86_64 is not installed</code> | |||
=== 커널 패키지 설치 시각 확인 === | |||
<code>rpm -qa --last 'kernel*'</code> | |||
=== 확인 포인트 === | |||
* 설치된 커널 버전 수 | |||
* 실행 중인 커널과 설치된 최신 커널의 차이 | |||
* <code>kernel-core</code>, <code>kernel-modules</code>, <code>kernel-modules-core</code> 버전 일치 여부 | |||
---- | |||
== 2.5 <code>dnf repoquery</code> == | |||
=== 기능 === | |||
설치된 커널 패키지와 저장소에서 제공하는 커널 버전을 조회한다. | |||
=== 설치된 커널 패키지 확인 === | |||
<code>dnf repoquery --installed 'kernel*'</code> | |||
=== 사용 가능한 커널 버전 확인 === | |||
<code>dnf repoquery --available kernel</code> | |||
=== 중복 설치된 커널 버전 확인 === | |||
<code>dnf repoquery --installonly</code> | |||
<code>dnf repoquery</code> 하위 기능이 부족한 경우 다음 패키지가 필요할 수 있다. | |||
<code>dnf install -y dnf-plugins-core</code> | |||
---- | |||
= 3. 커널 패키지 설치 및 업데이트 = | |||
== 3.1 <code>dnf check-update</code> == | |||
=== 기능 === | |||
업데이트 가능한 패키지를 확인한다. | |||
=== 커널 업데이트 확인 === | |||
<code>dnf check-update kernel</code> | |||
커널 관련 패키지를 넓게 확인하려면: | |||
<code>dnf check-update 'kernel*'</code> | |||
<code>dnf check-update</code>는 업데이트가 존재하면 종료 코드 <code>100</code>을 반환할 수 있다. 이는 명령 실패가 아니라 업데이트가 있다는 의미다. | |||
종료 코드 확인: | |||
<code>echo $?</code> | |||
---- | |||
== 3.2 <code>dnf update kernel</code> == | |||
=== 기능 === | |||
커널과 관련 구성 패키지를 업데이트한다. | |||
RHEL 계열은 일반적으로 신규 커널을 기존 커널 위에 덮어쓰지 않고 별도 버전으로 설치한다. 따라서 문제가 발생하면 이전 커널로 부팅할 수 있다. | |||
=== 커널만 업데이트 === | |||
<code>dnf update kernel</code> | |||
=== 커널 관련 패키지 전체 업데이트 === | |||
<code>dnf update 'kernel*'</code> | |||
=== 시스템 전체 업데이트 === | |||
<code>dnf update</code> | |||
=== 업데이트 후 확인 === | |||
<code>rpm -q kernel | |||
grubby --info=ALL</code> | |||
=== 재부팅 === | |||
<code>systemctl reboot</code> | |||
=== 재부팅 후 검증 === | |||
<code>uname -r | |||
grubby --default-kernel</code> | |||
---- | |||
== 3.3 특정 커널 버전 설치 == | |||
=== 기능 === | |||
저장소에 여러 커널 버전이 존재할 경우 특정 버전을 지정하여 설치한다. | |||
=== 사용 가능한 버전 확인 === | |||
<code>dnf --showduplicates list kernel</code> | |||
=== 특정 버전 설치 예제 === | |||
<code>dnf install \ | |||
kernel-5.14.0-570.18.1.el9_6 \ | |||
kernel-core-5.14.0-570.18.1.el9_6 \ | |||
kernel-modules-5.14.0-570.18.1.el9_6</code> | |||
실제 패키지 버전은 저장소 조회 결과에 맞춰 지정한다. | |||
---- | |||
== 3.4 <code>dnf reinstall</code> == | |||
=== 기능 === | |||
커널 파일이나 모듈이 손상된 것으로 의심될 때 동일 버전의 패키지를 다시 설치한다. | |||
=== 현재 커널 패키지 재설치 예제 === | |||
운영 중인 커널을 재설치하기 전에 콘솔 접속 수단과 이전 커널을 확보해야 한다. | |||
<code>dnf reinstall \ | |||
kernel-core-$(uname -r) \ | |||
kernel-modules-core-$(uname -r) \ | |||
kernel-modules-$(uname -r)</code> | |||
배포판과 설치 구성에 따라 일부 패키지는 존재하지 않을 수 있다. | |||
---- | |||
== 3.5 오래된 커널 삭제 == | |||
=== 주의사항 === | |||
다음 커널은 삭제하지 않는다. | |||
* 현재 실행 중인 커널 | |||
* 현재 기본 부팅 커널 | |||
* 장애 복구용으로 남겨둔 직전 정상 커널 | |||
현재 커널 확인: | |||
<code>uname -r</code> | |||
기본 커널 확인: | |||
<code>grubby --default-kernel</code> | |||
=== 직접 버전을 지정하여 삭제 === | |||
<code>dnf remove kernel-core-<삭제할-버전></code> | |||
예: | |||
<code>dnf remove kernel-core-5.14.0-427.13.1.el9_4.x86_64</code> | |||
의존성에 따라 같은 버전의 <code>kernel-modules</code> 등의 패키지도 함께 삭제될 수 있으므로 삭제 목록을 확인한 후 진행한다. | |||
---- | |||
== 3.6 installonly 패키지 보관 개수 확인 == | |||
=== 기능 === | |||
DNF가 커널과 같은 <code>installonly</code> 패키지를 몇 개까지 보관할지 확인한다. | |||
<code>grep -R '^installonly_limit' \ | |||
/etc/dnf/dnf.conf \ | |||
/etc/yum.conf 2>/dev/null</code> | |||
설정 예: | |||
<code>installonly_limit=3</code> | |||
변경 후에는 향후 DNF 작업부터 적용된다. | |||
현재 실행 중인 커널을 포함해 최소 2개 이상의 정상 커널을 보관하는 것이 안전하다. | |||
---- | |||
= 4. 부팅 커널 및 GRUB 관리 = | |||
RHEL 9에서는 설치된 커널 조회, 기본 커널 변경 및 커널 명령행 인수 관리에 <code>grubby</code>를 사용할 수 있다. 신규 커널을 설치할 때 기존 커널 명령행 인수가 신규 커널에도 전달된다. | |||
== 4.1 <code>grubby --info=ALL</code> == | |||
=== 기능 === | |||
설치된 부팅 커널과 각 커널의 GRUB 항목을 확인한다. | |||
=== 사용 예제 === | |||
<code>grubby --info=ALL</code> | |||
간단히 커널 경로만 확인: | |||
<code>grubby --info=ALL | grep '^kernel='</code> | |||
커널 제목 확인: | |||
<code>grubby --info=ALL | grep '^title='</code> | |||
=== 확인 포인트 === | |||
* 설치된 커널 목록 | |||
* 각 커널의 인덱스 | |||
* 커널 이미지 경로 | |||
* initramfs 경로 | |||
* 적용된 커널 명령행 인수 | |||
---- | |||
== 4.2 <code>grubby --default-kernel</code> == | |||
=== 기능 === | |||
다음 부팅에 기본으로 선택되는 커널 이미지 경로를 확인한다. | |||
=== 사용 예제 === | |||
<code>grubby --default-kernel</code> | |||
출력 예: | |||
<code>/boot/vmlinuz-5.14.0-570.18.1.el9_6.x86_64</code> | |||
---- | |||
== 4.3 <code>grubby --default-index</code> == | |||
=== 기능 === | |||
기본 부팅 커널의 인덱스를 확인한다. | |||
<code>grubby --default-index</code> | |||
출력 예: | |||
<code>0</code> | |||
---- | |||
== 4.4 <code>grubby --set-default</code> == | |||
=== 기능 === | |||
특정 커널을 기본 부팅 커널로 지정한다. | |||
Red Hat 공식 문서에서도 특정 커널을 기본값으로 지정할 때 <code>grubby --set-default</code> 사용을 안내한다. | |||
=== 먼저 커널 목록 확인 === | |||
<code>grubby --info=ALL | grep '^kernel='</code> | |||
=== 특정 커널을 기본값으로 지정 === | |||
<code>grubby --set-default \ | |||
/boot/vmlinuz-5.14.0-570.18.1.el9_6.x86_64</code> | |||
=== 적용 결과 확인 === | |||
<code>grubby --default-kernel | |||
grubby --default-index</code> | |||
=== 현재 실행 중인 커널을 기본값으로 지정 === | |||
<code>grubby --set-default /boot/vmlinuz-$(uname -r)</code> | |||
=== 주의사항 === | |||
이 명령은 현재 실행 중인 커널을 즉시 변경하지 않는다. 다음 재부팅부터 적용된다. | |||
---- | |||
== 4.5 <code>grubby --update-kernel</code> == | |||
=== 기능 === | |||
커널 부팅 인수를 추가하거나 제거한다. | |||
=== 모든 설치 커널에 인수 추가 === | |||
<code>grubby --update-kernel=ALL --args="audit=1"</code> | |||
=== 기본 커널에만 인수 추가 === | |||
<code>grubby --update-kernel=DEFAULT --args="audit=1"</code> | |||
=== 특정 커널에 인수 추가 === | |||
<code>grubby \ | |||
--update-kernel=/boot/vmlinuz-$(uname -r) \ | |||
--args="systemd.log_level=debug"</code> | |||
=== 인수 제거 === | |||
<code>grubby --update-kernel=ALL --remove-args="audit=1"</code> | |||
=== 적용 상태 확인 === | |||
<code>grubby --info=ALL | grep '^args='</code> | |||
=== 주의사항 === | |||
커널 부팅 인수는 일반적으로 재부팅 후 적용된다. | |||
잘못된 스토리지, LVM, SELinux, 콘솔 또는 root 파일시스템 관련 인수는 부팅 실패를 유발할 수 있다. | |||
---- | |||
== 4.6 현재 적용된 커널 명령행 확인 == | |||
=== 기능 === | |||
현재 부팅된 커널에 실제 전달된 부팅 인수를 확인한다. | |||
<code>cat /proc/cmdline</code> | |||
출력 예: | |||
<code>BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14... root=/dev/mapper/rl-root ro crashkernel=1G-4G:192M,...</code> | |||
=== 활용 === | |||
<code>grubby</code>에 설정된 값과 실제 부팅에 적용된 값을 비교할 때 사용한다. | |||
<code>grubby --info="$(grubby --default-kernel)" | |||
cat /proc/cmdline</code> | |||
---- | |||
= 5. 커널 모듈 조회 및 관리 = | |||
RHEL 9의 커널 모듈 관리는 <code>lsmod</code>, <code>modinfo</code>, <code>modprobe</code> 등을 중심으로 수행한다. | |||
== 5.1 <code>lsmod</code> == | |||
=== 기능 === | |||
현재 커널에 적재된 모듈을 조회한다. | |||
=== 전체 모듈 확인 === | |||
<code>lsmod</code> | |||
=== 특정 모듈 확인 === | |||
<code>lsmod | grep '^bonding'</code> | |||
<code>lsmod | grep '^nf_conntrack'</code> | |||
=== 출력 항목 === | |||
<code>Module Size Used by</code> | |||
* <code>Module</code>: 모듈 이름 | |||
* <code>Size</code>: 모듈 크기 | |||
* <code>Used by</code>: 사용 횟수 및 의존 모듈 | |||
---- | |||
== 5.2 <code>/proc/modules</code> == | |||
=== 기능 === | |||
현재 적재된 커널 모듈을 proc 파일시스템에서 직접 확인한다. | |||
<code>cat /proc/modules</code> | |||
특정 모듈 확인: | |||
<code>grep '^bonding ' /proc/modules</code> | |||
<code>lsmod</code>와 비슷한 정보를 제공하며, 스크립트에서 직접 확인할 때 사용할 수 있다. | |||
---- | |||
== 5.3 <code>modinfo</code> == | |||
=== 기능 === | |||
커널 모듈 파일의 경로, 설명, 버전, 라이선스, 의존성 및 지원 파라미터를 확인한다. | |||
=== 사용 예제 === | |||
<code>modinfo bonding</code> | |||
=== 주요 항목만 확인 === | |||
<code>modinfo -F filename bonding | |||
modinfo -F description bonding | |||
modinfo -F depends bonding | |||
modinfo -F parm bonding</code> | |||
=== 현재 커널 기준 모듈 확인 === | |||
<code>modinfo -k "$(uname -r)" bonding</code> | |||
=== 다른 설치 커널의 모듈 확인 === | |||
<code>modinfo -k 5.14.0-570.18.1.el9_6.x86_64 bonding</code> | |||
=== 확인 포인트 === | |||
* 모듈 파일이 현재 커널 버전에 존재하는지 | |||
* 모듈 의존성 | |||
* 모듈에서 지원하는 옵션 | |||
* 서명 및 라이선스 정보 | |||
---- | |||
== 5.4 <code>modprobe</code> == | |||
=== 기능 === | |||
모듈과 필요한 의존 모듈을 함께 적재한다. | |||
=== 모듈 적재 === | |||
<code>modprobe bonding</code> | |||
=== 적재 확인 === | |||
<code>lsmod | grep '^bonding'</code> | |||
=== 커널 로그 확인 === | |||
<code>journalctl -k -n 50</code> | |||
또는: | |||
<code>dmesg --level=err,warn</code> | |||
=== 옵션을 지정하여 적재 === | |||
<code>modprobe 모듈명 옵션명=값</code> | |||
예: | |||
<code>modprobe dummy numdummies=2</code> | |||
모듈별 지원 옵션은 다음 명령으로 확인한다. | |||
<code>modinfo -F parm dummy</code> | |||
---- | |||
== 5.5 <code>modprobe -r</code> == | |||
=== 기능 === | |||
현재 적재된 커널 모듈을 제거한다. | |||
=== 사용 예제 === | |||
<code>modprobe -r dummy</code> | |||
=== 제거 확인 === | |||
<code>lsmod | grep '^dummy'</code> | |||
출력이 없으면 제거된 것이다. | |||
=== 주의사항 === | |||
다음 모듈은 운영 중 임의로 제거하면 안 된다. | |||
* 사용 중인 NIC 드라이버 | |||
* 스토리지 컨트롤러 드라이버 | |||
* 루트 파일시스템 관련 모듈 | |||
* 방화벽과 연결 추적에 사용 중인 모듈 | |||
* 다른 모듈이 의존하는 모듈 | |||
사용 중인 모듈은 다음과 같은 오류로 제거되지 않을 수 있다. | |||
<code>modprobe: FATAL: Module ... is in use.</code> | |||
원격 서버에서 NIC 드라이버를 제거하면 즉시 통신이 끊길 수 있다. | |||
---- | |||
== 5.6 <code>insmod</code> == | |||
=== 기능 === | |||
지정한 <code>.ko</code> 모듈 파일을 직접 적재한다. | |||
<code>insmod /path/to/module.ko</code> | |||
=== 권장 사용 방식 === | |||
일반적인 관리에서는 의존성까지 처리하는 <code>modprobe</code> 사용을 권장한다. | |||
<code>modprobe 모듈명</code> | |||
<code>insmod</code>는 모듈 개발이나 의존성 문제를 직접 분석할 때 제한적으로 사용한다. | |||
---- | |||
== 5.7 <code>rmmod</code> == | |||
=== 기능 === | |||
지정한 커널 모듈을 직접 제거한다. | |||
<code>rmmod dummy</code> | |||
일반적으로 의존성을 고려하는 다음 명령을 우선 사용한다. | |||
<code>modprobe -r dummy</code> | |||
---- | |||
== 5.8 <code>depmod</code> == | |||
=== 기능 === | |||
커널 모듈 간 의존성 데이터베이스를 생성하거나 갱신한다. | |||
=== 현재 커널 기준 갱신 === | |||
<code>depmod -a</code> | |||
=== 특정 커널 기준 갱신 === | |||
<code>depmod -a 5.14.0-570.18.1.el9_6.x86_64</code> | |||
=== 사용 사례 === | |||
* 외부 커널 모듈을 수동 설치한 경우 | |||
* <code>/lib/modules/<커널버전>/</code> 아래 모듈을 변경한 경우 | |||
* <code>modprobe</code>에서 모듈을 찾지 못하는 경우 | |||
모듈 파일 위치 확인: | |||
<code>find /lib/modules/$(uname -r) -type f -name '*.ko*'</code> | |||
---- | |||
= 6. 모듈 자동 적재 및 차단 = | |||
== 6.1 부팅 시 모듈 자동 적재 == | |||
=== 설정 디렉터리 === | |||
<code>/etc/modules-load.d/</code> | |||
=== 설정 예제 === | |||
<code>cat > /etc/modules-load.d/bonding.conf <<'EOF' | |||
bonding | |||
EOF</code> | |||
=== 즉시 적용 === | |||
<code>modprobe bonding</code> | |||
=== 확인 === | |||
<code>lsmod | grep '^bonding' | |||
cat /etc/modules-load.d/bonding.conf</code> | |||
---- | |||
== 6.2 모듈 옵션 영구 설정 == | |||
=== 설정 디렉터리 === | |||
<code>/etc/modprobe.d/</code> | |||
=== 설정 예제 === | |||
<code>cat > /etc/modprobe.d/dummy.conf <<'EOF' | |||
options dummy numdummies=2 | |||
EOF</code> | |||
=== 기존 모듈 재적재 === | |||
<code>modprobe -r dummy | |||
modprobe dummy</code> | |||
=== 옵션 확인 === | |||
모듈에 따라 <code>/sys/module</code> 아래에서 실제 적용값을 확인할 수 있다. | |||
<code>find /sys/module/dummy/parameters -maxdepth 1 -type f -print</code> | |||
<code>cat /sys/module/dummy/parameters/numdummies</code> | |||
---- | |||
== 6.3 특정 모듈 차단 == | |||
=== 주의사항 === | |||
NIC, 스토리지 및 루트 파일시스템 관련 모듈을 차단하면 시스템이 부팅되지 않을 수 있다. | |||
먼저 모듈 사용 여부를 확인한다. | |||
<code>lsmod | grep '^모듈명' | |||
modinfo 모듈명</code> | |||
=== 차단 설정 예제 === | |||
<code>cat > /etc/modprobe.d/blacklist-example.conf <<'EOF' | |||
blacklist 모듈명 | |||
install 모듈명 /bin/false | |||
EOF</code> | |||
예: | |||
<code>cat > /etc/modprobe.d/blacklist-firewire.conf <<'EOF' | |||
blacklist firewire_core | |||
install firewire_core /bin/false | |||
EOF</code> | |||
=== initramfs 재생성 === | |||
부팅 초기에 적재되는 모듈은 initramfs에도 포함될 수 있으므로 재생성이 필요할 수 있다. | |||
<code>dracut -f</code> | |||
=== 설정 확인 === | |||
<code>modprobe -n -v firewire_core</code> | |||
출력 예: | |||
<code>install /bin/false</code> | |||
---- | |||
= 7. 커널 런타임 파라미터 관리 = | |||
== 7.1 <code>sysctl</code> == | |||
=== 기능 === | |||
실행 중인 커널의 런타임 파라미터를 조회하거나 변경한다. | |||
커널 파라미터는 <code>/proc/sys/</code> 아래의 값을 읽고 쓰는 방식으로 관리된다. | |||
---- | |||
== 7.2 전체 파라미터 조회 == | |||
<code>sysctl -a</code> | |||
출력이 매우 많으므로 <code>grep</code>과 함께 사용하는 것이 좋다. | |||
<code>sysctl -a | grep '^net.ipv4'</code> | |||
<code>sysctl -a | grep '^vm.'</code> | |||
일부 항목은 조회 과정에서 권한 또는 존재 여부와 관련된 메시지가 출력될 수 있다. | |||
---- | |||
== 7.3 특정 파라미터 확인 == | |||
=== IP 포워딩 확인 === | |||
<code>sysctl net.ipv4.ip_forward</code> | |||
=== 커널 패닉 후 자동 재부팅 시간 확인 === | |||
<code>sysctl kernel.panic</code> | |||
=== 스왑 사용 성향 확인 === | |||
<code>sysctl vm.swappiness</code> | |||
=== 파일 디스크립터 최대값 확인 === | |||
<code>sysctl fs.file-max</code> | |||
---- | |||
== 7.4 일시적으로 파라미터 변경 == | |||
=== IP 포워딩 활성화 === | |||
<code>sysctl -w net.ipv4.ip_forward=1</code> | |||
=== 적용 확인 === | |||
<code>sysctl net.ipv4.ip_forward</code> | |||
=== 주의사항 === | |||
<code>sysctl -w</code>로 설정한 값은 재부팅하면 초기화된다. | |||
---- | |||
== 7.5 <code>/proc/sys</code>를 통한 직접 변경 == | |||
다음 두 방식은 동일한 목적에 사용된다. | |||
<code>sysctl -w net.ipv4.ip_forward=1</code> | |||
<code>echo 1 > /proc/sys/net/ipv4/ip_forward</code> | |||
조회: | |||
<code>cat /proc/sys/net/ipv4/ip_forward</code> | |||
일반적인 운영과 문서화에서는 파라미터 이름이 명확한 <code>sysctl</code> 사용이 편리하다. | |||
---- | |||
== 7.6 영구 파라미터 설정 == | |||
=== 권장 설정 경로 === | |||
<code>/etc/sysctl.d/*.conf</code> | |||
=== 설정 예제 === | |||
<code>cat > /etc/sysctl.d/99-custom.conf <<'EOF' | |||
net.ipv4.ip_forward = 1 | |||
kernel.panic = 10 | |||
vm.swappiness = 10 | |||
EOF</code> | |||
=== 설정 적용 === | |||
<code>sysctl --system</code> | |||
=== 특정 파일만 적용 === | |||
<code>sysctl -p /etc/sysctl.d/99-custom.conf</code> | |||
=== 검증 === | |||
<code>sysctl net.ipv4.ip_forward | |||
sysctl kernel.panic | |||
sysctl vm.swappiness</code> | |||
=== 설정 파일 검색 === | |||
같은 파라미터가 여러 파일에 중복 정의되었는지 확인한다. | |||
<code>grep -R --line-number \ | |||
'net.ipv4.ip_forward' \ | |||
/etc/sysctl.conf \ | |||
/etc/sysctl.d \ | |||
/usr/lib/sysctl.d \ | |||
/run/sysctl.d 2>/dev/null</code> | |||
=== 확인 포인트 === | |||
* 동일 파라미터 중복 정의 여부 | |||
* 파일 적용 순서 | |||
* 마지막에 적용된 값 | |||
* NetworkManager 또는 애플리케이션에서 별도 변경하는 값인지 여부 | |||
---- | |||
= 8. 커널 로그 및 이벤트 확인 = | |||
== 8.1 <code>journalctl -k</code> == | |||
=== 기능 === | |||
systemd journal에 저장된 커널 로그를 확인한다. | |||
=== 현재 부팅의 커널 로그 전체 확인 === | |||
<code>journalctl -k</code> | |||
=== 최근 로그 확인 === | |||
<code>journalctl -k -n 100</code> | |||
=== 실시간 로그 확인 === | |||
<code>journalctl -k -f</code> | |||
=== 오류 이상 로그 확인 === | |||
<code>journalctl -k -p err</code> | |||
=== 경고 이상 로그 확인 === | |||
<code>journalctl -k -p warning</code> | |||
=== 특정 시간 이후 로그 === | |||
<code>journalctl -k --since "2026-07-10 09:00:00"</code> | |||
=== 특정 키워드 검색 === | |||
<code>journalctl -k | grep -iE 'error|fail|timeout|reset'</code> | |||
---- | |||
== 8.2 이전 부팅의 커널 로그 확인 == | |||
=== 부팅 이력 확인 === | |||
<code>journalctl --list-boots</code> | |||
출력 예: | |||
<code>-2 ... | |||
-1 ... | |||
0 ...</code> | |||
=== 직전 부팅의 커널 로그 확인 === | |||
<code>journalctl -k -b -1</code> | |||
=== 두 번 전 부팅 로그 === | |||
<code>journalctl -k -b -2</code> | |||
=== 직전 부팅의 오류 이상 로그 === | |||
<code>journalctl -k -b -1 -p err</code> | |||
=== 활용 === | |||
* 비정상 재부팅 원인 분석 | |||
* 커널 패닉 전후 로그 확인 | |||
* 디스크 또는 NIC 초기화 실패 확인 | |||
* 이전 커널로 부팅했을 때의 오류 비교 | |||
---- | |||
== 8.3 <code>dmesg</code> == | |||
=== 기능 === | |||
커널 링 버퍼 메시지를 조회한다. | |||
=== 전체 로그 확인 === | |||
<code>dmesg</code> | |||
=== 사람이 읽기 쉬운 시간 표시 === | |||
<code>dmesg -T</code> | |||
=== 실시간 로그 확인 === | |||
<code>dmesg -w</code> | |||
=== 오류와 경고만 확인 === | |||
<code>dmesg --level=err,warn</code> | |||
=== 특정 장치 또는 오류 검색 === | |||
<code>dmesg -T | grep -iE 'nvme|scsi|ata|reset|timeout|error'</code> | |||
NIC 관련 확인: | |||
<code>dmesg -T | grep -iE 'link|eth|enp|firmware'</code> | |||
메모리 및 OOM 확인: | |||
<code>dmesg -T | grep -iE 'oom|out of memory|killed process'</code> | |||
=== 주의사항 === | |||
<code>dmesg -T</code>의 사람이 읽기 쉬운 시각은 부팅 후 경과 시간을 현재 시각 기준으로 변환한 값이므로 시스템 시간 변경이 있었던 환경에서는 정확하지 않을 수 있다. | |||
정확한 저널 시각이 필요하면 다음 명령을 우선 사용한다. | |||
<code>journalctl -k -o short-iso</code> | |||
---- | |||
= 9. 커널 및 하드웨어 정보 확인 = | |||
== 9.1 <code>lscpu</code> == | |||
=== 기능 === | |||
CPU 아키텍처, 코어, 스레드, 소켓, 가상화 및 CPU 취약점 상태를 확인한다. | |||
<code>lscpu</code> | |||
주요 항목만 확인: | |||
<code>lscpu | grep -E \ | |||
'Architecture|CPU\(s\)|Thread|Core|Socket|NUMA|Virtualization'</code> | |||
취약점 정보 확인: | |||
<code>lscpu | grep '^Vulnerability'</code> | |||
---- | |||
== 9.2 <code>/proc/cpuinfo</code> == | |||
=== 기능 === | |||
커널이 인식한 CPU 상세 정보를 확인한다. | |||
<code>cat /proc/cpuinfo</code> | |||
CPU 모델 확인: | |||
<code>grep 'model name' /proc/cpuinfo | sort -u</code> | |||
논리 CPU 수 확인: | |||
<code>grep -c '^processor' /proc/cpuinfo</code> | |||
CPU 플래그 확인: | |||
<code>grep -m1 '^flags' /proc/cpuinfo</code> | |||
---- | |||
== 9.3 <code>/proc/meminfo</code> == | |||
=== 기능 === | |||
커널이 관리하는 메모리 상태를 확인한다. | |||
<code>cat /proc/meminfo</code> | |||
주요 항목 확인: | |||
<code>grep -E \ | |||
'MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree' \ | |||
/proc/meminfo</code> | |||
HugePage 확인: | |||
<code>grep -i huge /proc/meminfo</code> | |||
---- | |||
== 9.4 <code>sysfs</code> == | |||
=== 기능 === | |||
커널이 인식한 장치, 드라이버, 모듈 및 클래스 정보를 <code>/sys</code> 아래에서 확인한다. | |||
=== 네트워크 인터페이스 확인 === | |||
<code>ls -l /sys/class/net/</code> | |||
=== NIC 드라이버 확인 === | |||
<code>readlink -f /sys/class/net/eth0/device/driver</code> | |||
인터페이스명이 <code>ens192</code>인 경우: | |||
<code>readlink -f /sys/class/net/ens192/device/driver</code> | |||
=== 모듈 파라미터 확인 === | |||
<code>find /sys/module/모듈명/parameters \ | |||
-maxdepth 1 -type f -print</code> | |||
각 값 출력: | |||
<code>for file in /sys/module/모듈명/parameters/*; do | |||
printf '%s=' "$(basename "$file")" | |||
cat "$file" | |||
done</code> | |||
---- | |||
= 10. initramfs 관리 = | |||
== 10.1 initramfs란 == | |||
initramfs는 커널이 실제 루트 파일시스템을 마운트하기 전에 사용하는 초기 사용자 공간이다. | |||
다음과 같은 구성 요소가 포함될 수 있다. | |||
* 스토리지 드라이버 | |||
* LVM 및 device-mapper | |||
* RAID 모듈 | |||
* 암호화 디스크 지원 | |||
* 루트 파일시스템 드라이버 | |||
* 부팅 초기 네트워크 구성 | |||
initramfs가 손상되거나 필요한 드라이버가 누락되면 루트 디스크를 찾지 못해 부팅에 실패할 수 있다. | |||
---- | |||
== 10.2 <code>lsinitrd</code> == | |||
=== 기능 === | |||
initramfs 이미지에 포함된 파일과 모듈을 확인한다. | |||
=== 현재 커널의 initramfs 확인 === | |||
<code>lsinitrd /boot/initramfs-$(uname -r).img</code> | |||
=== 특정 모듈 포함 여부 확인 === | |||
<code>lsinitrd /boot/initramfs-$(uname -r).img | grep -i nvme</code> | |||
LVM 관련 확인: | |||
<code>lsinitrd /boot/initramfs-$(uname -r).img | grep -i lvm</code> | |||
=== initramfs 이미지 파일 확인 === | |||
<code>ls -lh /boot/initramfs-*.img</code> | |||
---- | |||
== 10.3 <code>dracut</code> == | |||
=== 기능 === | |||
initramfs 이미지를 생성하거나 재생성한다. | |||
=== 주의사항 === | |||
잘못된 initramfs를 생성하면 다음 부팅에서 루트 디스크를 찾지 못할 수 있다. | |||
작업 전 다음을 확인한다. | |||
<code>uname -r | |||
df -h /boot | |||
ls -lh /boot/initramfs-$(uname -r).img</code> | |||
기존 이미지 백업: | |||
<code>cp -a \ | |||
/boot/initramfs-$(uname -r).img \ | |||
/boot/initramfs-$(uname -r).img.$(date +%Y%m%d-%H%M%S).bak</code> | |||
=== 현재 커널 initramfs 강제 재생성 === | |||
<code>dracut -f</code> | |||
=== 파일을 명시하여 재생성 === | |||
<code>dracut -f \ | |||
/boot/initramfs-$(uname -r).img \ | |||
$(uname -r)</code> | |||
=== 특정 설치 커널의 initramfs 생성 === | |||
<code>dracut -f \ | |||
/boot/initramfs-5.14.0-570.18.1.el9_6.x86_64.img \ | |||
5.14.0-570.18.1.el9_6.x86_64</code> | |||
=== 전체 설치 커널 대상 재생성 === | |||
<code>dracut --regenerate-all --force</code> | |||
=== 상세 출력 === | |||
<code>dracut -f -v</code> | |||
=== 생성 후 검증 === | |||
<code>ls -lh /boot/initramfs-$(uname -r).img | |||
lsinitrd /boot/initramfs-$(uname -r).img | head</code> | |||
---- | |||
= 11. 재부팅 필요 여부 확인 = | |||
== 11.1 실행 커널과 최신 설치 커널 비교 == | |||
=== 현재 실행 커널 === | |||
<code>uname -r</code> | |||
=== 기본 부팅 커널 === | |||
<code>basename "$(grubby --default-kernel)" | sed 's/^vmlinuz-//'</code> | |||
=== 설치된 최신 kernel-core === | |||
<code>rpm -q kernel-core \ | |||
--qf '%{VERSION}-%{RELEASE}.%{ARCH}\n' \ | |||
| sort -V \ | |||
| tail -1</code> | |||
=== 간단 비교 스크립트 === | |||
<code>running_kernel=$(uname -r) | |||
default_kernel=$( | |||
basename "$(grubby --default-kernel)" | | |||
sed 's/^vmlinuz-//' | |||
) | |||
printf 'Running kernel : %s\n' "$running_kernel" | |||
printf 'Default kernel : %s\n' "$default_kernel" | |||
if <nowiki>[[ "$running_kernel" == "$default_kernel" ]]</nowiki>; then | |||
echo "현재 기본 커널로 실행 중입니다." | |||
else | |||
echo "재부팅 후 변경될 커널이 존재합니다." | |||
fi</code> | |||
---- | |||
== 11.2 <code>dnf needs-restarting</code> == | |||
=== 기능 === | |||
업데이트 후 재시작이 필요한 프로세스나 시스템 재부팅 필요 여부를 확인한다. | |||
필요 패키지: | |||
<code>dnf install -y dnf-utils</code> | |||
시스템 재부팅 필요 여부 확인: | |||
<code>dnf needs-restarting -r</code> | |||
프로세스 확인: | |||
<code>dnf needs-restarting</code> | |||
배포판 및 패키지 버전에 따라 명령 제공 패키지가 <code>dnf-utils</code> 또는 <code>dnf-plugins-core</code>로 구성될 수 있다. | |||
---- | |||
= 12. kdump 커널 크래시 덤프 = | |||
== 12.1 개요 == | |||
<code>kdump</code>는 커널 패닉이 발생했을 때 별도의 crash kernel로 전환하여 메모리 덤프를 저장하는 기능이다. | |||
RHEL 9에서는 특정 커널 또는 설치된 전체 커널에 대해 kdump 기능을 구성할 수 있으며, 운영 전에 정상 작동 여부를 정기적으로 검증하는 것이 권장된다. | |||
---- | |||
== 12.2 패키지 설치 == | |||
<code>dnf install -y kexec-tools</code> | |||
---- | |||
== 12.3 서비스 활성화 == | |||
<code>systemctl enable --now kdump</code> | |||
=== 상태 확인 === | |||
<code>systemctl status kdump --no-pager</code> | |||
<code>kdumpctl status</code> | |||
정상 예: | |||
<code>kdump: Kdump is operational</code> | |||
---- | |||
== 12.4 crashkernel 설정 확인 == | |||
현재 적용값: | |||
<code>cat /proc/cmdline | grep -o 'crashkernel=[^ ]*'</code> | |||
GRUB 설정 확인: | |||
<code>grubby --info=ALL | grep '^args=' | grep crashkernel</code> | |||
예약된 메모리 확인: | |||
<code>dmesg -T | grep -i crashkernel</code> | |||
---- | |||
== 12.5 덤프 저장 경로 확인 == | |||
<code>grep -Ev '^<nowiki>[[:space:]]</nowiki>*(#|$)' /etc/kdump.conf</code> | |||
기본 저장 경로는 일반적으로 다음 위치를 사용한다. | |||
<code>/var/crash/</code> | |||
확인: | |||
<code>find /var/crash -maxdepth 3 -type f -ls</code> | |||
<code>kdump</code>는 로컬 장치, 파일시스템 또는 지원되는 네트워크 대상으로 덤프를 저장할 수 있다. | |||
---- | |||
== 12.6 설정 검증 == | |||
<code>kdumpctl showmem | |||
kdumpctl status | |||
kdumpctl estimate</code> | |||
서비스 로그: | |||
<code>journalctl -u kdump --no-pager</code> | |||
---- | |||
== 12.7 강제 크래시 테스트 == | |||
=== 매우 위험 === | |||
다음 명령은 시스템을 의도적으로 커널 패닉 상태로 만들며 즉시 중단 또는 재부팅시킨다. | |||
<code>echo c > /proc/sysrq-trigger</code> | |||
운영 서버에서는 실행하지 않는다. | |||
실행 전 반드시 다음 조건을 만족해야 한다. | |||
* 모든 중요 데이터 저장 | |||
* 서비스 중단 승인 | |||
* 유지보수 시간 확보 | |||
* 콘솔 접속 가능 | |||
* kdump 저장 공간 확보 | |||
* 테스트 대상이 운영 시스템이 아님 | |||
Red Hat 문서에서도 해당 테스트가 커널을 강제로 크래시시키며 데이터 손실을 유발할 수 있다고 경고한다. | |||
---- | |||
= 13. 커널 장애 분석 명령어 = | |||
== 13.1 커널 오류 키워드 검색 == | |||
현재 부팅: | |||
<code>journalctl -k -b 0 | | |||
grep -iE \ | |||
'panic|oops|bug:|call trace|segfault|hung task|soft lockup|hard lockup|watchdog'</code> | |||
직전 부팅: | |||
<code>journalctl -k -b -1 | | |||
grep -iE \ | |||
'panic|oops|bug:|call trace|segfault|hung task|soft lockup|hard lockup|watchdog'</code> | |||
---- | |||
== 13.2 하드웨어 오류 검색 == | |||
<code>journalctl -k | | |||
grep -iE \ | |||
'mce|machine check|hardware error|edac|ecc|aer|pcie bus error'</code> | |||
=== 주요 의미 === | |||
* <code>MCE</code>, <code>Machine Check</code>: CPU가 감지한 하드웨어 오류 | |||
* <code>EDAC</code>, <code>ECC</code>: 메모리 오류 또는 오류 정정 관련 | |||
* <code>AER</code>: PCI Express 고급 오류 보고 | |||
* <code>PCIe Bus Error</code>: PCIe 링크 또는 장치 오류 | |||
---- | |||
== 13.3 스토리지 오류 검색 == | |||
<code>journalctl -k | | |||
grep -iE \ | |||
'nvme|scsi|ata|i/o error|blk_update_request|buffer i/o|reset|timeout'</code> | |||
확인 포인트: | |||
* 디스크 I/O 오류 | |||
* 컨트롤러 reset | |||
* 명령 timeout | |||
* NVMe 장치 초기화 실패 | |||
* SCSI sense 오류 | |||
* 파일시스템 remount 또는 read-only 전환 | |||
---- | |||
== 13.4 OOM 확인 == | |||
<code>journalctl -k | | |||
grep -iE \ | |||
'out of memory|oom-killer|killed process'</code> | |||
상세 확인: | |||
<code>journalctl -k -o short-iso | | |||
grep -i -A20 -B10 \ | |||
'out of memory\|oom-killer\|killed process'</code> | |||
확인 포인트: | |||
* 종료된 프로세스 이름 | |||
* 프로세스 PID | |||
* 메모리 사용량 | |||
* swap 사용량 | |||
* OOM 점수 | |||
* cgroup 또는 컨테이너 단위 제한 여부 | |||
---- | |||
== 13.5 커널 taint 상태 확인 == | |||
=== 기능 === | |||
비표준 모듈, 강제 모듈 제거, 하드웨어 오류 또는 커널 경고 등으로 커널이 tainted 상태인지 확인한다. | |||
<code>cat /proc/sys/kernel/tainted</code> | |||
정상 상태: | |||
<code>0</code> | |||
0이 아닌 값이면 하나 이상의 taint 플래그가 설정된 것이다. | |||
관련 커널 로그 확인: | |||
<code>journalctl -k | grep -i taint</code> | |||
외부 모듈 확인: | |||
<code>lsmod</code> | |||
<code>for module in $(lsmod | awk 'NR>1 {print $1}'); do | |||
signer=$(modinfo -F signer "$module" 2>/dev/null) | |||
printf '%-30s %s\n' "$module" "${signer:-unsigned-or-unavailable}" | |||
done</code> | |||
---- | |||
= 14. 실무 점검 명령어 모음 = | |||
== 14.1 기본 커널 상태 점검 == | |||
<code>echo "=== OS ===" | |||
cat /etc/redhat-release | |||
echo "=== Running kernel ===" | |||
uname -r | |||
echo "=== Default kernel ===" | |||
grubby --default-kernel | |||
echo "=== Installed kernels ===" | |||
rpm -q kernel kernel-core | |||
echo "=== Boot command line ===" | |||
cat /proc/cmdline | |||
echo "=== Boot partition ===" | |||
df -h /boot /boot/efi 2>/dev/null | |||
echo "=== Kernel errors ===" | |||
journalctl -k -b 0 -p err --no-pager</code> | |||
---- | |||
== 14.2 커널 업데이트 전 점검 == | |||
<code>uname -r | |||
grubby --default-kernel | |||
grubby --info=ALL | |||
rpm -qa 'kernel*' | sort | |||
df -h /boot /boot/efi | |||
dnf check-update 'kernel*'</code> | |||
확인할 사항: | |||
* <code>/boot</code> 여유 공간 | |||
* 정상 부팅 가능한 이전 커널 존재 여부 | |||
* 현재 커널과 기본 커널 일치 여부 | |||
* kdump 작동 여부 | |||
* 외부 또는 DKMS 계열 드라이버 사용 여부 | |||
---- | |||
== 14.3 커널 업데이트 후 점검 == | |||
재부팅 전: | |||
<code>rpm -q kernel | |||
grubby --info=ALL | |||
grubby --default-kernel | |||
ls -lh /boot/vmlinuz-* /boot/initramfs-*.img</code> | |||
재부팅 후: | |||
<code>uname -r | |||
grubby --default-kernel | |||
systemctl --failed | |||
journalctl -k -b 0 -p err</code> | |||
서비스 상태 확인: | |||
<code>systemctl --failed --no-pager</code> | |||
NIC 확인: | |||
<code>ip -br link | |||
ip -br addr</code> | |||
스토리지 확인: | |||
<code>lsblk | |||
findmnt</code> | |||
---- | |||
== 14.4 커널 모듈 장애 점검 == | |||
<code>module="모듈명" | |||
modinfo "$module" | |||
lsmod | grep "^${module}" | |||
modprobe -n -v "$module" | |||
journalctl -k -b 0 | grep -i "$module" | |||
find /lib/modules/$(uname -r) -type f -iname "*${module}*"</code> | |||
확인할 사항: | |||
* 현재 커널용 모듈 파일 존재 여부 | |||
* 모듈 이름 오타 여부 | |||
* blacklist 또는 <code>install /bin/false</code> 설정 여부 | |||
* 의존 모듈 누락 여부 | |||
* Secure Boot로 인한 서명 거부 여부 | |||
* 커널 버전과 외부 모듈 빌드 버전 일치 여부 | |||
---- | |||
= 15. 증상별 빠른 확인표 = | |||
== 15.1 커널 업데이트 후 이전 버전으로 계속 부팅됨 == | |||
확인: | |||
<code>uname -r | |||
grubby --default-kernel | |||
grubby --info=ALL</code> | |||
조치 예: | |||
<code>grubby --set-default /boot/vmlinuz-<신규커널버전> | |||
systemctl reboot</code> | |||
검증: | |||
<code>uname -r</code> | |||
---- | |||
== 15.2 <code>modprobe: FATAL: Module ... not found</code> == | |||
확인: | |||
<code>uname -r | |||
modinfo 모듈명 | |||
find /lib/modules/$(uname -r) -iname '*모듈명*' | |||
rpm -qa 'kernel-modules*' | sort</code> | |||
의심 구간: | |||
* 현재 커널용 모듈 패키지 미설치 | |||
* 모듈 이름 오류 | |||
* 커널 업데이트 후 미재부팅 | |||
* 외부 모듈 빌드 실패 | |||
* 모듈 의존성 정보 미갱신 | |||
조치 예: | |||
<code>depmod -a | |||
dnf reinstall kernel-modules-$(uname -r)</code> | |||
패키지 존재 여부는 먼저 확인한다. | |||
<code>dnf list --installed kernel-modules-$(uname -r)</code> | |||
---- | |||
== 15.3 <code>/boot</code> 용량 부족 == | |||
확인: | |||
<code>df -h /boot | |||
du -sh /boot/* | |||
rpm -q kernel kernel-core | |||
grubby --info=ALL</code> | |||
조치 방향: | |||
# 현재 실행 커널 확인 | |||
# 기본 부팅 커널 확인 | |||
# 직전 정상 커널 확보 | |||
# 오래된 커널 패키지 삭제 | |||
# <code>/boot</code> 여유 공간 재확인 | |||
<code>uname -r | |||
grubby --default-kernel | |||
dnf remove kernel-core-<오래된버전> | |||
df -h /boot</code> | |||
<code>/boot</code> 안의 커널 및 initramfs 파일을 <code>rm</code>으로 직접 삭제하기보다 RPM/DNF로 패키지를 제거하는 방식이 안전하다. | |||
---- | |||
== 15.4 initramfs 손상 의심 == | |||
확인: | |||
<code>ls -lh /boot/initramfs-*.img | |||
lsinitrd /boot/initramfs-$(uname -r).img | |||
journalctl -k -b 0</code> | |||
백업: | |||
<code>cp -a \ | |||
/boot/initramfs-$(uname -r).img \ | |||
/boot/initramfs-$(uname -r).img.bak</code> | |||
재생성: | |||
<code>dracut -f -v</code> | |||
검증: | |||
<code>lsinitrd /boot/initramfs-$(uname -r).img | head</code> | |||
---- | |||
= 16. 주요 명령어 요약 = | |||
{| class="wikitable" | {| class="wikitable" | ||
! | !명령어 | ||
! | !주요 기능 | ||
|- | |- | ||
| | |<code>uname -r</code> | ||
| | |현재 실행 중인 커널 버전 확인 | ||
| | |- | ||
|<code>uname -a</code> | |||
|커널과 시스템 전체 정보 확인 | |||
|- | |||
|<code>hostnamectl</code> | |||
|OS, 커널, 아키텍처 통합 확인 | |||
|- | |||
|<code>rpm -q kernel</code> | |||
|설치된 커널 패키지 조회 | |||
|- | |||
|<code>rpm -qa 'kernel*'</code> | |||
|커널 관련 패키지 전체 조회 | |||
|- | |||
|<code>dnf check-update kernel</code> | |||
|커널 업데이트 여부 확인 | |||
|- | |||
|<code>dnf update kernel</code> | |||
|커널 업데이트 | |||
|- | |||
|<code>dnf repoquery --installonly</code> | |||
|installonly 패키지 조회 | |||
|- | |||
|<code>grubby --info=ALL</code> | |||
|설치된 부팅 커널 정보 확인 | |||
|- | |||
|<code>grubby --default-kernel</code> | |||
|기본 부팅 커널 확인 | |||
|- | |||
|<code>grubby --set-default</code> | |||
|기본 부팅 커널 변경 | |||
|- | |||
|<code>grubby --update-kernel</code> | |||
|커널 부팅 인수 추가 및 제거 | |||
|- | |||
|<code>cat /proc/cmdline</code> | |||
|현재 적용된 부팅 인수 확인 | |||
|- | |||
|<code>lsmod</code> | |||
|적재된 커널 모듈 확인 | |||
|- | |||
|<code>modinfo</code> | |||
|모듈 상세 정보 확인 | |||
|- | |||
|<code>modprobe</code> | |||
|모듈 적재 | |||
|- | |||
|<code>modprobe -r</code> | |||
|모듈 제거 | |||
|- | |||
|<code>depmod -a</code> | |||
|모듈 의존성 데이터 갱신 | |||
|- | |||
|<code>sysctl</code> | |||
|커널 런타임 파라미터 확인 | |||
|- | |||
|<code>sysctl -w</code> | |||
|커널 파라미터 일시 변경 | |||
|- | |||
|<code>sysctl --system</code> | |||
|sysctl 영구 설정 전체 적용 | |||
|- | |||
|<code>journalctl -k</code> | |||
|커널 저널 확인 | |||
|- | |||
|<code>journalctl -k -b -1</code> | |||
|이전 부팅의 커널 로그 확인 | |||
|- | |||
|<code>dmesg</code> | |||
|커널 링 버퍼 확인 | |||
|- | |||
|<code>lsinitrd</code> | |||
|initramfs 내용 확인 | |||
|- | |||
|<code>dracut -f</code> | |||
|initramfs 재생성 | |||
|- | |||
|<code>kdumpctl status</code> | |||
|kdump 작동 상태 확인 | |||
|- | |||
|<code>lscpu</code> | |||
|CPU 및 커널 인식 정보 확인 | |||
|- | |||
|<code>cat /proc/meminfo</code> | |||
|커널 메모리 관리 정보 확인 | |||
|} | |} | ||
---- | |||
= 17. 권장 문서 분리 방향 = | |||
현재 문서는 커널 관리 명령어를 폭넓게 다루는 상위 문서로 사용한다. | |||
내용이 많아질 경우 다음 문서로 분리한다. | |||
# RHEL 9 커널 버전 확인 및 업데이트 | |||
# RHEL 9 GRUB 및 기본 부팅 커널 관리 | |||
# RHEL 9 커널 모듈 관리 | |||
# RHEL 9 sysctl 커널 파라미터 관리 | |||
# RHEL 9 initramfs 및 dracut 관리 | |||
# RHEL 9 kdump 구성 및 vmcore 분석 | |||
# RHEL 9 커널 패닉 및 부팅 장애 분석 | |||
# RHEL 9 <code>/boot</code> 용량 부족 처리 | |||
# RHEL 9 커널 업데이트 후 네트워크 드라이버 장애 분석 | |||
---- | |||
= 18. 참고사항 = | |||
Red Hat은 RHEL 커널을 RPM 패키지 형태로 제공하며, 커널 업데이트와 검증에는 패키지 관리 체계를 사용하는 것을 전제로 한다. Red Hat에서 제공하지 않은 별도 커널은 공식 지원 범위에 영향을 줄 수 있다. | |||
본 문서의 명령어는 RHEL 9 일반 커널을 기준으로 한다. 다음 환경은 별도의 추가 확인이 필요하다. | |||
* RHEL for Real Time 커널 | |||
* SAP 전용 설정 | |||
* 커스텀 커널 | |||
* DKMS 또는 벤더 외부 드라이버 | |||
* Secure Boot 활성화 환경 | |||
* 클라우드 공급자 전용 커널 | |||
* 실시간 패치 또는 kpatch 적용 환경 | |||
2026년 7월 10일 (금) 23:18 기준 최신판
1. 문서 개요
1.1 목적
이 문서는 RHEL 9 계열 시스템에서 자주 사용하는 커널 관련 명령어를 정리한다.
주요 대상은 다음과 같다.
- Red Hat Enterprise Linux 9
- Rocky Linux 9
- AlmaLinux 9
- 기타 RHEL 9 호환 배포판
커널 버전 확인, 커널 패키지 관리, 기본 부팅 커널 변경, 커널 모듈 관리, 런타임 파라미터 변경, initramfs 재생성 및 커널 장애 분석 절차를 다룬다.
1.2 권한
조회 명령어 대부분은 일반 사용자도 실행할 수 있지만 다음 작업은 root 권한이 필요하다.
- 커널 패키지 설치 및 삭제
- 기본 부팅 커널 변경
- 커널 모듈 적재 및 제거
- 커널 파라미터 변경
- initramfs 재생성
- kdump 설정
- 시스템 재부팅
관리 명령은 다음 중 한 가지 방식으로 실행한다.
sudo 명령어
또는:
sudo -i
1.3 주요 주의사항
커널, GRUB, initramfs 작업은 시스템 부팅 실패로 이어질 수 있다.
작업 전 다음 사항을 확인한다.
uname -r
grubby --default-kernel
grubby --info=ALL
rpm -qa 'kernel*' | sort
df -h /boot /boot/efi
설정 파일을 수정할 경우 백업한다.
cp -a /etc/default/grub \
/etc/default/grub.$(date +%Y%m%d-%H%M%S).bak
cp -a /etc/sysctl.conf \
/etc/sysctl.conf.$(date +%Y%m%d-%H%M%S).bak
원격 서버에서 커널 또는 네트워크 관련 파라미터를 변경할 때는 콘솔 접속 수단을 확보하는 것이 좋다.
2. 커널 상태 및 버전 확인
2.1 uname
기능
현재 실행 중인 커널의 버전, 아키텍처 및 시스템 정보를 확인한다.
uname은 설치된 커널이 아니라 현재 부팅되어 실제 실행 중인 커널을 표시한다.
현재 실행 중인 커널 버전 확인
uname -r
출력 예:
5.14.0-570.18.1.el9_6.x86_64
전체 커널 정보 확인
uname -a
출력 예:
Linux server01 5.14.0-570.18.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC ...
시스템 아키텍처 확인
uname -m
출력 예:
x86_64
확인 포인트
- 현재 실행 중인 커널 버전
x86_64,aarch64등의 시스템 아키텍처- 커널 업데이트 후 실제로 신규 커널로 부팅되었는지 여부
2.2 /proc/version
기능
현재 실행 중인 커널의 버전과 컴파일러 정보를 확인한다.
사용 예제
cat /proc/version
출력 예:
Linux version 5.14.0-570.18.1.el9_6.x86_64 ...
활용
커널 버전뿐 아니라 커널 빌드에 사용된 GCC 버전과 빌드 정보를 함께 확인할 때 사용한다.
2.3 hostnamectl
기능
호스트명, 운영체제, 커널 버전 및 시스템 아키텍처를 한 번에 확인한다.
사용 예제
hostnamectl
출력 예:
Static hostname: server01
Operating System: Rocky Linux 9.6
Kernel: Linux 5.14.0-570.18.1.el9_6.x86_64
Architecture: x86-64
확인 포인트
- 배포판과 마이너 버전
- 현재 커널
- 물리 서버 또는 가상화 환경 여부
- 시스템 아키텍처
2.4 rpm
기능
설치된 커널 RPM 패키지를 조회한다.
설치된 기본 커널 패키지 확인
rpm -q kernel
커널 관련 패키지 전체 확인
rpm -qa 'kernel*' | sort
현재 실행 중인 커널 패키지 확인
rpm -q kernel-core-$(uname -r)
정상 출력 예:
kernel-core-5.14.0-570.18.1.el9_6.x86_64
패키지가 없으면 다음과 같이 표시될 수 있다.
package kernel-core-5.14.0-570.18.1.el9_6.x86_64 is not installed
커널 패키지 설치 시각 확인
rpm -qa --last 'kernel*'
확인 포인트
- 설치된 커널 버전 수
- 실행 중인 커널과 설치된 최신 커널의 차이
kernel-core,kernel-modules,kernel-modules-core버전 일치 여부
2.5 dnf repoquery
기능
설치된 커널 패키지와 저장소에서 제공하는 커널 버전을 조회한다.
설치된 커널 패키지 확인
dnf repoquery --installed 'kernel*'
사용 가능한 커널 버전 확인
dnf repoquery --available kernel
중복 설치된 커널 버전 확인
dnf repoquery --installonly
dnf repoquery 하위 기능이 부족한 경우 다음 패키지가 필요할 수 있다.
dnf install -y dnf-plugins-core
3. 커널 패키지 설치 및 업데이트
3.1 dnf check-update
기능
업데이트 가능한 패키지를 확인한다.
커널 업데이트 확인
dnf check-update kernel
커널 관련 패키지를 넓게 확인하려면:
dnf check-update 'kernel*'
dnf check-update는 업데이트가 존재하면 종료 코드 100을 반환할 수 있다. 이는 명령 실패가 아니라 업데이트가 있다는 의미다.
종료 코드 확인:
echo $?
3.2 dnf update kernel
기능
커널과 관련 구성 패키지를 업데이트한다.
RHEL 계열은 일반적으로 신규 커널을 기존 커널 위에 덮어쓰지 않고 별도 버전으로 설치한다. 따라서 문제가 발생하면 이전 커널로 부팅할 수 있다.
커널만 업데이트
dnf update kernel
커널 관련 패키지 전체 업데이트
dnf update 'kernel*'
시스템 전체 업데이트
dnf update
업데이트 후 확인
rpm -q kernel
grubby --info=ALL
재부팅
systemctl reboot
재부팅 후 검증
uname -r
grubby --default-kernel
3.3 특정 커널 버전 설치
기능
저장소에 여러 커널 버전이 존재할 경우 특정 버전을 지정하여 설치한다.
사용 가능한 버전 확인
dnf --showduplicates list kernel
특정 버전 설치 예제
dnf install \
kernel-5.14.0-570.18.1.el9_6 \
kernel-core-5.14.0-570.18.1.el9_6 \
kernel-modules-5.14.0-570.18.1.el9_6
실제 패키지 버전은 저장소 조회 결과에 맞춰 지정한다.
3.4 dnf reinstall
기능
커널 파일이나 모듈이 손상된 것으로 의심될 때 동일 버전의 패키지를 다시 설치한다.
현재 커널 패키지 재설치 예제
운영 중인 커널을 재설치하기 전에 콘솔 접속 수단과 이전 커널을 확보해야 한다.
dnf reinstall \
kernel-core-$(uname -r) \
kernel-modules-core-$(uname -r) \
kernel-modules-$(uname -r)
배포판과 설치 구성에 따라 일부 패키지는 존재하지 않을 수 있다.
3.5 오래된 커널 삭제
주의사항
다음 커널은 삭제하지 않는다.
- 현재 실행 중인 커널
- 현재 기본 부팅 커널
- 장애 복구용으로 남겨둔 직전 정상 커널
현재 커널 확인:
uname -r
기본 커널 확인:
grubby --default-kernel
직접 버전을 지정하여 삭제
dnf remove kernel-core-<삭제할-버전>
예:
dnf remove kernel-core-5.14.0-427.13.1.el9_4.x86_64
의존성에 따라 같은 버전의 kernel-modules 등의 패키지도 함께 삭제될 수 있으므로 삭제 목록을 확인한 후 진행한다.
3.6 installonly 패키지 보관 개수 확인
기능
DNF가 커널과 같은 installonly 패키지를 몇 개까지 보관할지 확인한다.
grep -R '^installonly_limit' \
/etc/dnf/dnf.conf \
/etc/yum.conf 2>/dev/null
설정 예:
installonly_limit=3
변경 후에는 향후 DNF 작업부터 적용된다.
현재 실행 중인 커널을 포함해 최소 2개 이상의 정상 커널을 보관하는 것이 안전하다.
4. 부팅 커널 및 GRUB 관리
RHEL 9에서는 설치된 커널 조회, 기본 커널 변경 및 커널 명령행 인수 관리에 grubby를 사용할 수 있다. 신규 커널을 설치할 때 기존 커널 명령행 인수가 신규 커널에도 전달된다.
4.1 grubby --info=ALL
기능
설치된 부팅 커널과 각 커널의 GRUB 항목을 확인한다.
사용 예제
grubby --info=ALL
간단히 커널 경로만 확인:
grubby --info=ALL | grep '^kernel='
커널 제목 확인:
grubby --info=ALL | grep '^title='
확인 포인트
- 설치된 커널 목록
- 각 커널의 인덱스
- 커널 이미지 경로
- initramfs 경로
- 적용된 커널 명령행 인수
4.2 grubby --default-kernel
기능
다음 부팅에 기본으로 선택되는 커널 이미지 경로를 확인한다.
사용 예제
grubby --default-kernel
출력 예:
/boot/vmlinuz-5.14.0-570.18.1.el9_6.x86_64
4.3 grubby --default-index
기능
기본 부팅 커널의 인덱스를 확인한다.
grubby --default-index
출력 예:
0
4.4 grubby --set-default
기능
특정 커널을 기본 부팅 커널로 지정한다.
Red Hat 공식 문서에서도 특정 커널을 기본값으로 지정할 때 grubby --set-default 사용을 안내한다.
먼저 커널 목록 확인
grubby --info=ALL | grep '^kernel='
특정 커널을 기본값으로 지정
grubby --set-default \
/boot/vmlinuz-5.14.0-570.18.1.el9_6.x86_64
적용 결과 확인
grubby --default-kernel
grubby --default-index
현재 실행 중인 커널을 기본값으로 지정
grubby --set-default /boot/vmlinuz-$(uname -r)
주의사항
이 명령은 현재 실행 중인 커널을 즉시 변경하지 않는다. 다음 재부팅부터 적용된다.
4.5 grubby --update-kernel
기능
커널 부팅 인수를 추가하거나 제거한다.
모든 설치 커널에 인수 추가
grubby --update-kernel=ALL --args="audit=1"
기본 커널에만 인수 추가
grubby --update-kernel=DEFAULT --args="audit=1"
특정 커널에 인수 추가
grubby \
--update-kernel=/boot/vmlinuz-$(uname -r) \
--args="systemd.log_level=debug"
인수 제거
grubby --update-kernel=ALL --remove-args="audit=1"
적용 상태 확인
grubby --info=ALL | grep '^args='
주의사항
커널 부팅 인수는 일반적으로 재부팅 후 적용된다.
잘못된 스토리지, LVM, SELinux, 콘솔 또는 root 파일시스템 관련 인수는 부팅 실패를 유발할 수 있다.
4.6 현재 적용된 커널 명령행 확인
기능
현재 부팅된 커널에 실제 전달된 부팅 인수를 확인한다.
cat /proc/cmdline
출력 예:
BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14... root=/dev/mapper/rl-root ro crashkernel=1G-4G:192M,...
활용
grubby에 설정된 값과 실제 부팅에 적용된 값을 비교할 때 사용한다.
grubby --info="$(grubby --default-kernel)"
cat /proc/cmdline
5. 커널 모듈 조회 및 관리
RHEL 9의 커널 모듈 관리는 lsmod, modinfo, modprobe 등을 중심으로 수행한다.
5.1 lsmod
기능
현재 커널에 적재된 모듈을 조회한다.
전체 모듈 확인
lsmod
특정 모듈 확인
lsmod | grep '^bonding'
lsmod | grep '^nf_conntrack'
출력 항목
Module Size Used by
Module: 모듈 이름Size: 모듈 크기Used by: 사용 횟수 및 의존 모듈
5.2 /proc/modules
기능
현재 적재된 커널 모듈을 proc 파일시스템에서 직접 확인한다.
cat /proc/modules
특정 모듈 확인:
grep '^bonding ' /proc/modules
lsmod와 비슷한 정보를 제공하며, 스크립트에서 직접 확인할 때 사용할 수 있다.
5.3 modinfo
기능
커널 모듈 파일의 경로, 설명, 버전, 라이선스, 의존성 및 지원 파라미터를 확인한다.
사용 예제
modinfo bonding
주요 항목만 확인
modinfo -F filename bonding
modinfo -F description bonding
modinfo -F depends bonding
modinfo -F parm bonding
현재 커널 기준 모듈 확인
modinfo -k "$(uname -r)" bonding
다른 설치 커널의 모듈 확인
modinfo -k 5.14.0-570.18.1.el9_6.x86_64 bonding
확인 포인트
- 모듈 파일이 현재 커널 버전에 존재하는지
- 모듈 의존성
- 모듈에서 지원하는 옵션
- 서명 및 라이선스 정보
5.4 modprobe
기능
모듈과 필요한 의존 모듈을 함께 적재한다.
모듈 적재
modprobe bonding
적재 확인
lsmod | grep '^bonding'
커널 로그 확인
journalctl -k -n 50
또는:
dmesg --level=err,warn
옵션을 지정하여 적재
modprobe 모듈명 옵션명=값
예:
modprobe dummy numdummies=2
모듈별 지원 옵션은 다음 명령으로 확인한다.
modinfo -F parm dummy
5.5 modprobe -r
기능
현재 적재된 커널 모듈을 제거한다.
사용 예제
modprobe -r dummy
제거 확인
lsmod | grep '^dummy'
출력이 없으면 제거된 것이다.
주의사항
다음 모듈은 운영 중 임의로 제거하면 안 된다.
- 사용 중인 NIC 드라이버
- 스토리지 컨트롤러 드라이버
- 루트 파일시스템 관련 모듈
- 방화벽과 연결 추적에 사용 중인 모듈
- 다른 모듈이 의존하는 모듈
사용 중인 모듈은 다음과 같은 오류로 제거되지 않을 수 있다.
modprobe: FATAL: Module ... is in use.
원격 서버에서 NIC 드라이버를 제거하면 즉시 통신이 끊길 수 있다.
5.6 insmod
기능
지정한 .ko 모듈 파일을 직접 적재한다.
insmod /path/to/module.ko
권장 사용 방식
일반적인 관리에서는 의존성까지 처리하는 modprobe 사용을 권장한다.
modprobe 모듈명
insmod는 모듈 개발이나 의존성 문제를 직접 분석할 때 제한적으로 사용한다.
5.7 rmmod
기능
지정한 커널 모듈을 직접 제거한다.
rmmod dummy
일반적으로 의존성을 고려하는 다음 명령을 우선 사용한다.
modprobe -r dummy
5.8 depmod
기능
커널 모듈 간 의존성 데이터베이스를 생성하거나 갱신한다.
현재 커널 기준 갱신
depmod -a
특정 커널 기준 갱신
depmod -a 5.14.0-570.18.1.el9_6.x86_64
사용 사례
- 외부 커널 모듈을 수동 설치한 경우
/lib/modules/<커널버전>/아래 모듈을 변경한 경우modprobe에서 모듈을 찾지 못하는 경우
모듈 파일 위치 확인:
find /lib/modules/$(uname -r) -type f -name '*.ko*'
6. 모듈 자동 적재 및 차단
6.1 부팅 시 모듈 자동 적재
설정 디렉터리
/etc/modules-load.d/
설정 예제
cat > /etc/modules-load.d/bonding.conf <<'EOF'
bonding
EOF
즉시 적용
modprobe bonding
확인
lsmod | grep '^bonding'
cat /etc/modules-load.d/bonding.conf
6.2 모듈 옵션 영구 설정
설정 디렉터리
/etc/modprobe.d/
설정 예제
cat > /etc/modprobe.d/dummy.conf <<'EOF'
options dummy numdummies=2
EOF
기존 모듈 재적재
modprobe -r dummy
modprobe dummy
옵션 확인
모듈에 따라 /sys/module 아래에서 실제 적용값을 확인할 수 있다.
find /sys/module/dummy/parameters -maxdepth 1 -type f -print
cat /sys/module/dummy/parameters/numdummies
6.3 특정 모듈 차단
주의사항
NIC, 스토리지 및 루트 파일시스템 관련 모듈을 차단하면 시스템이 부팅되지 않을 수 있다.
먼저 모듈 사용 여부를 확인한다.
lsmod | grep '^모듈명'
modinfo 모듈명
차단 설정 예제
cat > /etc/modprobe.d/blacklist-example.conf <<'EOF'
blacklist 모듈명
install 모듈명 /bin/false
EOF
예:
cat > /etc/modprobe.d/blacklist-firewire.conf <<'EOF'
blacklist firewire_core
install firewire_core /bin/false
EOF
initramfs 재생성
부팅 초기에 적재되는 모듈은 initramfs에도 포함될 수 있으므로 재생성이 필요할 수 있다.
dracut -f
설정 확인
modprobe -n -v firewire_core
출력 예:
install /bin/false
7. 커널 런타임 파라미터 관리
7.1 sysctl
기능
실행 중인 커널의 런타임 파라미터를 조회하거나 변경한다.
커널 파라미터는 /proc/sys/ 아래의 값을 읽고 쓰는 방식으로 관리된다.
7.2 전체 파라미터 조회
sysctl -a
출력이 매우 많으므로 grep과 함께 사용하는 것이 좋다.
sysctl -a | grep '^net.ipv4'
sysctl -a | grep '^vm.'
일부 항목은 조회 과정에서 권한 또는 존재 여부와 관련된 메시지가 출력될 수 있다.
7.3 특정 파라미터 확인
IP 포워딩 확인
sysctl net.ipv4.ip_forward
커널 패닉 후 자동 재부팅 시간 확인
sysctl kernel.panic
스왑 사용 성향 확인
sysctl vm.swappiness
파일 디스크립터 최대값 확인
sysctl fs.file-max
7.4 일시적으로 파라미터 변경
IP 포워딩 활성화
sysctl -w net.ipv4.ip_forward=1
적용 확인
sysctl net.ipv4.ip_forward
주의사항
sysctl -w로 설정한 값은 재부팅하면 초기화된다.
7.5 /proc/sys를 통한 직접 변경
다음 두 방식은 동일한 목적에 사용된다.
sysctl -w net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
조회:
cat /proc/sys/net/ipv4/ip_forward
일반적인 운영과 문서화에서는 파라미터 이름이 명확한 sysctl 사용이 편리하다.
7.6 영구 파라미터 설정
권장 설정 경로
/etc/sysctl.d/*.conf
설정 예제
cat > /etc/sysctl.d/99-custom.conf <<'EOF'
net.ipv4.ip_forward = 1
kernel.panic = 10
vm.swappiness = 10
EOF
설정 적용
sysctl --system
특정 파일만 적용
sysctl -p /etc/sysctl.d/99-custom.conf
검증
sysctl net.ipv4.ip_forward
sysctl kernel.panic
sysctl vm.swappiness
설정 파일 검색
같은 파라미터가 여러 파일에 중복 정의되었는지 확인한다.
grep -R --line-number \
'net.ipv4.ip_forward' \
/etc/sysctl.conf \
/etc/sysctl.d \
/usr/lib/sysctl.d \
/run/sysctl.d 2>/dev/null
확인 포인트
- 동일 파라미터 중복 정의 여부
- 파일 적용 순서
- 마지막에 적용된 값
- NetworkManager 또는 애플리케이션에서 별도 변경하는 값인지 여부
8. 커널 로그 및 이벤트 확인
8.1 journalctl -k
기능
systemd journal에 저장된 커널 로그를 확인한다.
현재 부팅의 커널 로그 전체 확인
journalctl -k
최근 로그 확인
journalctl -k -n 100
실시간 로그 확인
journalctl -k -f
오류 이상 로그 확인
journalctl -k -p err
경고 이상 로그 확인
journalctl -k -p warning
특정 시간 이후 로그
journalctl -k --since "2026-07-10 09:00:00"
특정 키워드 검색
journalctl -k | grep -iE 'error|fail|timeout|reset'
8.2 이전 부팅의 커널 로그 확인
부팅 이력 확인
journalctl --list-boots
출력 예:
-2 ...
-1 ...
0 ...
직전 부팅의 커널 로그 확인
journalctl -k -b -1
두 번 전 부팅 로그
journalctl -k -b -2
직전 부팅의 오류 이상 로그
journalctl -k -b -1 -p err
활용
- 비정상 재부팅 원인 분석
- 커널 패닉 전후 로그 확인
- 디스크 또는 NIC 초기화 실패 확인
- 이전 커널로 부팅했을 때의 오류 비교
8.3 dmesg
기능
커널 링 버퍼 메시지를 조회한다.
전체 로그 확인
dmesg
사람이 읽기 쉬운 시간 표시
dmesg -T
실시간 로그 확인
dmesg -w
오류와 경고만 확인
dmesg --level=err,warn
특정 장치 또는 오류 검색
dmesg -T | grep -iE 'nvme|scsi|ata|reset|timeout|error'
NIC 관련 확인:
dmesg -T | grep -iE 'link|eth|enp|firmware'
메모리 및 OOM 확인:
dmesg -T | grep -iE 'oom|out of memory|killed process'
주의사항
dmesg -T의 사람이 읽기 쉬운 시각은 부팅 후 경과 시간을 현재 시각 기준으로 변환한 값이므로 시스템 시간 변경이 있었던 환경에서는 정확하지 않을 수 있다.
정확한 저널 시각이 필요하면 다음 명령을 우선 사용한다.
journalctl -k -o short-iso
9. 커널 및 하드웨어 정보 확인
9.1 lscpu
기능
CPU 아키텍처, 코어, 스레드, 소켓, 가상화 및 CPU 취약점 상태를 확인한다.
lscpu
주요 항목만 확인:
lscpu | grep -E \
'Architecture|CPU\(s\)|Thread|Core|Socket|NUMA|Virtualization'
취약점 정보 확인:
lscpu | grep '^Vulnerability'
9.2 /proc/cpuinfo
기능
커널이 인식한 CPU 상세 정보를 확인한다.
cat /proc/cpuinfo
CPU 모델 확인:
grep 'model name' /proc/cpuinfo | sort -u
논리 CPU 수 확인:
grep -c '^processor' /proc/cpuinfo
CPU 플래그 확인:
grep -m1 '^flags' /proc/cpuinfo
9.3 /proc/meminfo
기능
커널이 관리하는 메모리 상태를 확인한다.
cat /proc/meminfo
주요 항목 확인:
grep -E \
'MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree' \
/proc/meminfo
HugePage 확인:
grep -i huge /proc/meminfo
9.4 sysfs
기능
커널이 인식한 장치, 드라이버, 모듈 및 클래스 정보를 /sys 아래에서 확인한다.
네트워크 인터페이스 확인
ls -l /sys/class/net/
NIC 드라이버 확인
readlink -f /sys/class/net/eth0/device/driver
인터페이스명이 ens192인 경우:
readlink -f /sys/class/net/ens192/device/driver
모듈 파라미터 확인
find /sys/module/모듈명/parameters \
-maxdepth 1 -type f -print
각 값 출력:
for file in /sys/module/모듈명/parameters/*; do
printf '%s=' "$(basename "$file")"
cat "$file"
done
10. initramfs 관리
10.1 initramfs란
initramfs는 커널이 실제 루트 파일시스템을 마운트하기 전에 사용하는 초기 사용자 공간이다.
다음과 같은 구성 요소가 포함될 수 있다.
- 스토리지 드라이버
- LVM 및 device-mapper
- RAID 모듈
- 암호화 디스크 지원
- 루트 파일시스템 드라이버
- 부팅 초기 네트워크 구성
initramfs가 손상되거나 필요한 드라이버가 누락되면 루트 디스크를 찾지 못해 부팅에 실패할 수 있다.
10.2 lsinitrd
기능
initramfs 이미지에 포함된 파일과 모듈을 확인한다.
현재 커널의 initramfs 확인
lsinitrd /boot/initramfs-$(uname -r).img
특정 모듈 포함 여부 확인
lsinitrd /boot/initramfs-$(uname -r).img | grep -i nvme
LVM 관련 확인:
lsinitrd /boot/initramfs-$(uname -r).img | grep -i lvm
initramfs 이미지 파일 확인
ls -lh /boot/initramfs-*.img
10.3 dracut
기능
initramfs 이미지를 생성하거나 재생성한다.
주의사항
잘못된 initramfs를 생성하면 다음 부팅에서 루트 디스크를 찾지 못할 수 있다.
작업 전 다음을 확인한다.
uname -r
df -h /boot
ls -lh /boot/initramfs-$(uname -r).img
기존 이미지 백업:
cp -a \
/boot/initramfs-$(uname -r).img \
/boot/initramfs-$(uname -r).img.$(date +%Y%m%d-%H%M%S).bak
현재 커널 initramfs 강제 재생성
dracut -f
파일을 명시하여 재생성
dracut -f \
/boot/initramfs-$(uname -r).img \
$(uname -r)
특정 설치 커널의 initramfs 생성
dracut -f \
/boot/initramfs-5.14.0-570.18.1.el9_6.x86_64.img \
5.14.0-570.18.1.el9_6.x86_64
전체 설치 커널 대상 재생성
dracut --regenerate-all --force
상세 출력
dracut -f -v
생성 후 검증
ls -lh /boot/initramfs-$(uname -r).img
lsinitrd /boot/initramfs-$(uname -r).img | head
11. 재부팅 필요 여부 확인
11.1 실행 커널과 최신 설치 커널 비교
현재 실행 커널
uname -r
기본 부팅 커널
basename "$(grubby --default-kernel)" | sed 's/^vmlinuz-//'
설치된 최신 kernel-core
rpm -q kernel-core \
--qf '%{VERSION}-%{RELEASE}.%{ARCH}\n' \
| sort -V \
| tail -1
간단 비교 스크립트
running_kernel=$(uname -r)
default_kernel=$(
basename "$(grubby --default-kernel)" |
sed 's/^vmlinuz-//'
)
printf 'Running kernel : %s\n' "$running_kernel"
printf 'Default kernel : %s\n' "$default_kernel"
if [[ "$running_kernel" == "$default_kernel" ]]; then
echo "현재 기본 커널로 실행 중입니다."
else
echo "재부팅 후 변경될 커널이 존재합니다."
fi
11.2 dnf needs-restarting
기능
업데이트 후 재시작이 필요한 프로세스나 시스템 재부팅 필요 여부를 확인한다.
필요 패키지:
dnf install -y dnf-utils
시스템 재부팅 필요 여부 확인:
dnf needs-restarting -r
프로세스 확인:
dnf needs-restarting
배포판 및 패키지 버전에 따라 명령 제공 패키지가 dnf-utils 또는 dnf-plugins-core로 구성될 수 있다.
12. kdump 커널 크래시 덤프
12.1 개요
kdump는 커널 패닉이 발생했을 때 별도의 crash kernel로 전환하여 메모리 덤프를 저장하는 기능이다.
RHEL 9에서는 특정 커널 또는 설치된 전체 커널에 대해 kdump 기능을 구성할 수 있으며, 운영 전에 정상 작동 여부를 정기적으로 검증하는 것이 권장된다.
12.2 패키지 설치
dnf install -y kexec-tools
12.3 서비스 활성화
systemctl enable --now kdump
상태 확인
systemctl status kdump --no-pager
kdumpctl status
정상 예:
kdump: Kdump is operational
12.4 crashkernel 설정 확인
현재 적용값:
cat /proc/cmdline | grep -o 'crashkernel=[^ ]*'
GRUB 설정 확인:
grubby --info=ALL | grep '^args=' | grep crashkernel
예약된 메모리 확인:
dmesg -T | grep -i crashkernel
12.5 덤프 저장 경로 확인
grep -Ev '^[[:space:]]*(#|$)' /etc/kdump.conf
기본 저장 경로는 일반적으로 다음 위치를 사용한다.
/var/crash/
확인:
find /var/crash -maxdepth 3 -type f -ls
kdump는 로컬 장치, 파일시스템 또는 지원되는 네트워크 대상으로 덤프를 저장할 수 있다.
12.6 설정 검증
kdumpctl showmem
kdumpctl status
kdumpctl estimate
서비스 로그:
journalctl -u kdump --no-pager
12.7 강제 크래시 테스트
매우 위험
다음 명령은 시스템을 의도적으로 커널 패닉 상태로 만들며 즉시 중단 또는 재부팅시킨다.
echo c > /proc/sysrq-trigger
운영 서버에서는 실행하지 않는다.
실행 전 반드시 다음 조건을 만족해야 한다.
- 모든 중요 데이터 저장
- 서비스 중단 승인
- 유지보수 시간 확보
- 콘솔 접속 가능
- kdump 저장 공간 확보
- 테스트 대상이 운영 시스템이 아님
Red Hat 문서에서도 해당 테스트가 커널을 강제로 크래시시키며 데이터 손실을 유발할 수 있다고 경고한다.
13. 커널 장애 분석 명령어
13.1 커널 오류 키워드 검색
현재 부팅:
journalctl -k -b 0 |
grep -iE \
'panic|oops|bug:|call trace|segfault|hung task|soft lockup|hard lockup|watchdog'
직전 부팅:
journalctl -k -b -1 |
grep -iE \
'panic|oops|bug:|call trace|segfault|hung task|soft lockup|hard lockup|watchdog'
13.2 하드웨어 오류 검색
journalctl -k |
grep -iE \
'mce|machine check|hardware error|edac|ecc|aer|pcie bus error'
주요 의미
MCE,Machine Check: CPU가 감지한 하드웨어 오류EDAC,ECC: 메모리 오류 또는 오류 정정 관련AER: PCI Express 고급 오류 보고PCIe Bus Error: PCIe 링크 또는 장치 오류
13.3 스토리지 오류 검색
journalctl -k |
grep -iE \
'nvme|scsi|ata|i/o error|blk_update_request|buffer i/o|reset|timeout'
확인 포인트:
- 디스크 I/O 오류
- 컨트롤러 reset
- 명령 timeout
- NVMe 장치 초기화 실패
- SCSI sense 오류
- 파일시스템 remount 또는 read-only 전환
13.4 OOM 확인
journalctl -k |
grep -iE \
'out of memory|oom-killer|killed process'
상세 확인:
journalctl -k -o short-iso |
grep -i -A20 -B10 \
'out of memory\|oom-killer\|killed process'
확인 포인트:
- 종료된 프로세스 이름
- 프로세스 PID
- 메모리 사용량
- swap 사용량
- OOM 점수
- cgroup 또는 컨테이너 단위 제한 여부
13.5 커널 taint 상태 확인
기능
비표준 모듈, 강제 모듈 제거, 하드웨어 오류 또는 커널 경고 등으로 커널이 tainted 상태인지 확인한다.
cat /proc/sys/kernel/tainted
정상 상태:
0
0이 아닌 값이면 하나 이상의 taint 플래그가 설정된 것이다.
관련 커널 로그 확인:
journalctl -k | grep -i taint
외부 모듈 확인:
lsmod
for module in $(lsmod | awk 'NR>1 {print $1}'); do
signer=$(modinfo -F signer "$module" 2>/dev/null)
printf '%-30s %s\n' "$module" "${signer:-unsigned-or-unavailable}"
done
14. 실무 점검 명령어 모음
14.1 기본 커널 상태 점검
echo "=== OS ==="
cat /etc/redhat-release
echo "=== Running kernel ==="
uname -r
echo "=== Default kernel ==="
grubby --default-kernel
echo "=== Installed kernels ==="
rpm -q kernel kernel-core
echo "=== Boot command line ==="
cat /proc/cmdline
echo "=== Boot partition ==="
df -h /boot /boot/efi 2>/dev/null
echo "=== Kernel errors ==="
journalctl -k -b 0 -p err --no-pager
14.2 커널 업데이트 전 점검
uname -r
grubby --default-kernel
grubby --info=ALL
rpm -qa 'kernel*' | sort
df -h /boot /boot/efi
dnf check-update 'kernel*'
확인할 사항:
/boot여유 공간- 정상 부팅 가능한 이전 커널 존재 여부
- 현재 커널과 기본 커널 일치 여부
- kdump 작동 여부
- 외부 또는 DKMS 계열 드라이버 사용 여부
14.3 커널 업데이트 후 점검
재부팅 전:
rpm -q kernel
grubby --info=ALL
grubby --default-kernel
ls -lh /boot/vmlinuz-* /boot/initramfs-*.img
재부팅 후:
uname -r
grubby --default-kernel
systemctl --failed
journalctl -k -b 0 -p err
서비스 상태 확인:
systemctl --failed --no-pager
NIC 확인:
ip -br link
ip -br addr
스토리지 확인:
lsblk
findmnt
14.4 커널 모듈 장애 점검
module="모듈명"
modinfo "$module"
lsmod | grep "^${module}"
modprobe -n -v "$module"
journalctl -k -b 0 | grep -i "$module"
find /lib/modules/$(uname -r) -type f -iname "*${module}*"
확인할 사항:
- 현재 커널용 모듈 파일 존재 여부
- 모듈 이름 오타 여부
- blacklist 또는
install /bin/false설정 여부 - 의존 모듈 누락 여부
- Secure Boot로 인한 서명 거부 여부
- 커널 버전과 외부 모듈 빌드 버전 일치 여부
15. 증상별 빠른 확인표
15.1 커널 업데이트 후 이전 버전으로 계속 부팅됨
확인:
uname -r
grubby --default-kernel
grubby --info=ALL
조치 예:
grubby --set-default /boot/vmlinuz-<신규커널버전>
systemctl reboot
검증:
uname -r
15.2 modprobe: FATAL: Module ... not found
확인:
uname -r
modinfo 모듈명
find /lib/modules/$(uname -r) -iname '*모듈명*'
rpm -qa 'kernel-modules*' | sort
의심 구간:
- 현재 커널용 모듈 패키지 미설치
- 모듈 이름 오류
- 커널 업데이트 후 미재부팅
- 외부 모듈 빌드 실패
- 모듈 의존성 정보 미갱신
조치 예:
depmod -a
dnf reinstall kernel-modules-$(uname -r)
패키지 존재 여부는 먼저 확인한다.
dnf list --installed kernel-modules-$(uname -r)
15.3 /boot 용량 부족
확인:
df -h /boot
du -sh /boot/*
rpm -q kernel kernel-core
grubby --info=ALL
조치 방향:
- 현재 실행 커널 확인
- 기본 부팅 커널 확인
- 직전 정상 커널 확보
- 오래된 커널 패키지 삭제
/boot여유 공간 재확인
uname -r
grubby --default-kernel
dnf remove kernel-core-<오래된버전>
df -h /boot
/boot 안의 커널 및 initramfs 파일을 rm으로 직접 삭제하기보다 RPM/DNF로 패키지를 제거하는 방식이 안전하다.
15.4 initramfs 손상 의심
확인:
ls -lh /boot/initramfs-*.img
lsinitrd /boot/initramfs-$(uname -r).img
journalctl -k -b 0
백업:
cp -a \
/boot/initramfs-$(uname -r).img \
/boot/initramfs-$(uname -r).img.bak
재생성:
dracut -f -v
검증:
lsinitrd /boot/initramfs-$(uname -r).img | head
16. 주요 명령어 요약
| 명령어 | 주요 기능 |
|---|---|
uname -r
|
현재 실행 중인 커널 버전 확인 |
uname -a
|
커널과 시스템 전체 정보 확인 |
hostnamectl
|
OS, 커널, 아키텍처 통합 확인 |
rpm -q kernel
|
설치된 커널 패키지 조회 |
rpm -qa 'kernel*'
|
커널 관련 패키지 전체 조회 |
dnf check-update kernel
|
커널 업데이트 여부 확인 |
dnf update kernel
|
커널 업데이트 |
dnf repoquery --installonly
|
installonly 패키지 조회 |
grubby --info=ALL
|
설치된 부팅 커널 정보 확인 |
grubby --default-kernel
|
기본 부팅 커널 확인 |
grubby --set-default
|
기본 부팅 커널 변경 |
grubby --update-kernel
|
커널 부팅 인수 추가 및 제거 |
cat /proc/cmdline
|
현재 적용된 부팅 인수 확인 |
lsmod
|
적재된 커널 모듈 확인 |
modinfo
|
모듈 상세 정보 확인 |
modprobe
|
모듈 적재 |
modprobe -r
|
모듈 제거 |
depmod -a
|
모듈 의존성 데이터 갱신 |
sysctl
|
커널 런타임 파라미터 확인 |
sysctl -w
|
커널 파라미터 일시 변경 |
sysctl --system
|
sysctl 영구 설정 전체 적용 |
journalctl -k
|
커널 저널 확인 |
journalctl -k -b -1
|
이전 부팅의 커널 로그 확인 |
dmesg
|
커널 링 버퍼 확인 |
lsinitrd
|
initramfs 내용 확인 |
dracut -f
|
initramfs 재생성 |
kdumpctl status
|
kdump 작동 상태 확인 |
lscpu
|
CPU 및 커널 인식 정보 확인 |
cat /proc/meminfo
|
커널 메모리 관리 정보 확인 |
17. 권장 문서 분리 방향
현재 문서는 커널 관리 명령어를 폭넓게 다루는 상위 문서로 사용한다.
내용이 많아질 경우 다음 문서로 분리한다.
- RHEL 9 커널 버전 확인 및 업데이트
- RHEL 9 GRUB 및 기본 부팅 커널 관리
- RHEL 9 커널 모듈 관리
- RHEL 9 sysctl 커널 파라미터 관리
- RHEL 9 initramfs 및 dracut 관리
- RHEL 9 kdump 구성 및 vmcore 분석
- RHEL 9 커널 패닉 및 부팅 장애 분석
- RHEL 9
/boot용량 부족 처리 - RHEL 9 커널 업데이트 후 네트워크 드라이버 장애 분석
18. 참고사항
Red Hat은 RHEL 커널을 RPM 패키지 형태로 제공하며, 커널 업데이트와 검증에는 패키지 관리 체계를 사용하는 것을 전제로 한다. Red Hat에서 제공하지 않은 별도 커널은 공식 지원 범위에 영향을 줄 수 있다.
본 문서의 명령어는 RHEL 9 일반 커널을 기준으로 한다. 다음 환경은 별도의 추가 확인이 필요하다.
- RHEL for Real Time 커널
- SAP 전용 설정
- 커스텀 커널
- DKMS 또는 벤더 외부 드라이버
- Secure Boot 활성화 환경
- 클라우드 공급자 전용 커널
- 실시간 패치 또는 kpatch 적용 환경