오픈소스 인사이트
home
오픈소스 기술 동향
home
🚀

RHEL 9 환경에서 Boot Parameter 적용 방식에 따른 동작 원리 및 적용 범위 분석

7 more properties

👋🏻 들어가며

에스코어에서 RHEL 기술지원을 수행하고 있는 정세혁입니다.
RHEL 8 및 이전 버전에서는 커널 부트 파라미터(Kernel Boot Parameter)를 적용할 때 주로 /etc/default/grub파일의 GRUB_CMDLINE_LINUX항목을 수정한 뒤, grub2-mkconfig -o /boot/grub2/grub.cfg (Legacy) or /boot/efi/EFI/redhat/grub.cfg(UEFI)명령을 실행해 일괄 반영하는 방식을 사용해 왔습니다.
하지만 RHEL 9 환경에서 동일하게 작업을 진행할 경우, grub.cfg파일 내용은 갱신된 것처럼 보이지만 실제 재부팅 후 커널에 파라미터가 반영되지 않는 현상이 발생합니다. 이는 RHEL 8부터 기본 활성화된 BLS(Boot Loader Specification) 아키텍처 때문입니다.
본 글에서는 RHEL 9 환경에서 커널 부트 파라미터를 적용하는 4가지 방식의 적용 범위와 파일별 반영 여부를 직접 검증하고, 향후 RHEL 10 환경까지 고려했을 때 어떤 방식을 사용하는 것이 적합한지 상세히 소개하고자 합니다.

❔ Boot Loader Specification(BLS)이란?

BLS(Boot Loader Specification)는 부트로더 설정을 하나의 거대한 설정 파일(grub.cfg)에 전부 모아 관리하는 대신, 설치된 각 커널 엔트리를 /boot/loader/entries 디렉터리 하위에 개별 .conf파일로 분리하여 관리하는 표준 규격입니다.
•
기존 방식 (Non-BLS): 커널 설치/삭제 시마다 grub2-mkconfig스크립트를 통해 전체 grub.cfg파일을 다시 파싱하고 재생성합니다.
•
BLS 방식: 각 커널마다 독립된 설정 파일({MachineID}-{KernelVersion}.conf)이 생성되며, 부팅 시 GRUB2가 이 파일들을 동적으로 읽어 메뉴를 구성합니다.
이로 인해 /etc/default/grub파일을 수정하고 단순히 grub2-mkconfig를 실행하면 최상위 grub.cfg의 일부 변수만 갱신될 뿐, 실제로 부팅 시 각 커널이 참조하는 /boot/loader/entries/*.conf 파일 내의 options 항목은 갱신되지 않아 파라미터가 누락되는 것입니다.

📊 Boot Parameter 적용 방식 별 비교

각 방식에 따른 설정 반영 여부, 설정 파일 갱신 범위, 그리고 신규 커널 설치 시 파라미터 유지 여부를 정리한 표입니다.
1. 기존방식
2. grub_enable_blscfg=false 적용
3. grubby 사용
4. "--update-bls-cmdline" 옵션 사용
적용 방법
/etc/default/grub에 boot parameter 추가 # grub2-mkconfig -o /boot/grub2/grub.cfg
/etc/defualt/grub에 boot parameter 추가, grub_enable_blscfg=false 추가 # grub2-mkconfig -o /boot/grub2/grub.cfg
# grubby --update-kernel=ALL --args "{parameter}"
/etc/defualt/grub에 boot parameter 추가 # grub2-mkconfig -o /boot/grub2/grub.cfg \    --update-bls-cmdline
설정 적용 여부
X
O
O
O
/boot/grub2/grub.cfg 업데이트
O
O
X
O
/boot/loader/entries 업데이트
X
X
O
O
/etc/default/grub 업데이트
O
O(수동 적용)
O(자동 업데이트)
O(수동 적용)
커널 업데이트 후 설정 적용 여부
X
O
O
O
RHEL 10에서 적용 여부
X
X
O
O

🧪 Boot Parameter 적용 방식 별 실전 테스트

동일한 환경에서 mce=off 파라미터를 추가하며 각 방식의 동작을 검증하였습니다.
# 기본 커널 환경 확인 # cat /proc/cmdline BOOT_IMAGE=... selinux=0
Bash
복사

Case 1. 기존 방식 (/etc/default/grub 수정 후 grub2-mkconfig)

/etc/default/grub의 GRUB_CMDLINE_LINUX에 mce=off를 추가한 후 grub2-mkconfig -o /boot/grub2/grub.cfg를 실행했습니다.
# 1. /boot/grub2/grub.cfg 확인 (파일 내용 수정) set kernelopts="root=... selinux=0 mce=off" # 2. grub2-mkconfig 실행 grub2-mkconfig -o /boot/grub2/grub.cfg # 3. /boot/loader/entries/*.conf 확인 (갱신 안 됨) options root=... selinux=0
Bash
복사
재부팅 후 커널 파라미터를 확인한 결과입니다.
# cat /proc/cmdline BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-570.12.1.el9_6.x86_64 ... selinux=0
Bash
복사
결과: grub.cfg파일의 kernelopts에는 파라미터가 들어가지만, 부팅 시 실제 참조하는 BLS 엔트리 파일(loader/entries)이 갱신되지 않아 파라미터가 적용되지 않습니다.

Case 2. GRUB_ENABLE_BLSCFG=false 적용

/etc/default/grub파일에 GRUB_ENABLE_BLSCFG=false옵션을 주어 BLS 기능을 끄고 /etc/default/grub에 파라미터를 직접 수정한 후 grub2-mkconfig를 실행했습니다.
# 1. /boot/grub2/grub.cfg 확인 (menuentry가 grub.cfg 내에 직접 하드코딩됨) linux /vmlinuz-5.14.0-570.12.1.el9_6.x86_64 ... selinux=0 mce=off # 2. grub2-mkconfig 실행 grub2-mkconfig -o /boot/grub2/grub.cfg # 3. /boot/loader/entries/*.conf 확인 (BLS 엔트리는 갱신되지 않음) options root=... selinux=0
Bash
복사
재부팅 후 커널 파라미터를 확인한 결과입니다.
# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-5.14.0-570.12.1.el9_6.x86_64 ... selinux=0 mce=off
Bash
복사
결과: BLS를 사용하지 않고 RHEL 7처럼 grub.cfg의 menuentry를 직접 사용하므로 정상 반영됩니다. 단, Red Hat 공식 문서에 따르면 RHEL 10부터는 BLS 비활성화 옵션이 지원되지 않으므로 권장되지 않는 방식입니다.

Case 3. grubby 명령어 사용 (권장 방식 1)

Red Hat에서 공식적으로 권장하는 grubby를 사용해 모든 커널에 인자를 추가했습니다.
# grubby --update-kernel=ALL --args "mce=off"
Bash
복사
각 설정 파일의 반영 상태를 확인합니다.
# 1. /boot/grub2/grub.cfg 확인 (갱신 안 됨) set kernelopts="... selinux=0 " # 2. /boot/loader/entries/*.conf 확인 (자동 업데이트 완료) options root=... selinux=0 mce=off # 3. /etc/default/grub 확인 (업데이트 완료) GRUB_CMDLINE_LINUX="... selinux=0 mce=off"
Bash
복사
재부팅 후 확인 결과입니다.
# cat /proc/cmdline BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-570.12.1.el9_6.x86_64 ... selinux=0 mce=off
Bash
복사
결과: /boot/loader/entries와 /etc/default/grub파일이 자동으로 함께 수정되며, 재부팅 시 파라미터가 정상 반영됩니다. 다만, /boot/grub2/grub.cfg에는 자동 업데이트 되지 않습니다. 또한, 특정 커널 버전에만 개별적으로 파라미터를 지정할 수도 있는 장점이 있습니다.

Case 4. grub2-mkconfig 시 --update-bls-cmdline 옵션 사용 (권장 방식 2)

/etc/default/grub 수정 후 grub2-mkconfig 실행 시 --update-bls-cmdline 옵션을 추가로 부여했습니다.
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
Bash
복사
설정 파일 반영 상태를 확인합니다.
# 1. /boot/loader/entries/*.conf 확인 (업데이트 완료) options root=... selinux=0 mce=off # 2. /boot/grub2/grub.cfg 확인 (업데이트 완료) set kernelopts="... selinux=0 mce=off "
Bash
복사
재부팅 후 확인 결과입니다.
# cat /proc/cmdline BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-570.49.1.el9_6.x86_64 ... selinux=0 mce=off
Bash
복사
결과: BLS 엔트리 파일과 grub.cfg파일이 모두 갱신되어 파라미터가 정상 반영됩니다.

🔄 커널 업데이트 시 파라미터 유지 테스트

신규 커널 패키지를 설치했을 때 이전 설정이 유지되는지 검증

1. GRUB_ENABLE_BLSCFG=false 환경

신규 커널(5.14.0-570.49.1.el9_6.x86_64) 설치 후:
# dnf install kernel-5.14.0-570.49.1.el9_6
Bash
복사
•
grub.cfg의 신규 menuentry라인에 mce=off가 포함되어 생성됨.
# cat /boot/grub2/grub.cfg (업데이트 완료) menuentry 'Red Hat Enterprise Linux (5.14.0-570.49.1.el9_6.x86_64) 9.6 (Plow)'... { linux /vmlinuz-5.14.0-570.49.1.el9_6.x86_64 root=... selinux=0 mce=off
Bash
복사
•
/boot/loader/*.entries에는 변경사항이 확인되지 않음.
# /boot/loader/entries/xxx-5.14.0-570.49.1.el9_6.x86_64.conf 확인 (업데이트 완료) options root=... selinux=0
Bash
복사
•
재부팅 후 신규 커널에서도 정상 적용됨을 확인.
# 1. cat /proc/cmdline 확인 BOOT_IMAGE=... mce=off
Bash
복사

2. grubby 적용 환경

신규 커널(5.14.0-570.44.1.el9_6.x86_64) 설치 후:
# dnf install kernel-5.14.0-570.44.1.el9_6
Bash
복사
설정 파일 반영 상태를 확인합니다.
•
신규 생성된 /boot/loader/entries/*.conf의 options항목에 mce=off가 자동으로 포함되어 생성됨.
# 1. /boot/loader/entries/xxx-5.14.0-570.44.1.el9_6.x86_64.conf 확인 (업데이트 완료) options root=... selinux=0 mce=off
Bash
복사
•
grubby를 이용하여 등록 시 /etc/default/grub에 기록된 내용 유지 확인 됨.
# /etc/default/grub 확인 (직접 기록한 내용 유지 확인) GRUB_CMDLINE_LINUX=... selinux=0 mce=off
Bash
복사
•
/boot/grub2/grub.cfg의 경우 커널 설치 전과 같이 수정 파라미터 확인되지 않음.
# /etc/default/grub 확인 (갱신 안 됨) GRUB_CMDLINE_LINUX=... selinux=0
Bash
복사
•
재부팅 후 신규 커널에서도 mce=off가 정상 적용됨을 확인.
# 1. cat /proc/cmdline 확인 BOOT_IMAGE=... mce=off
Bash
복사

3. --update-bls-cmdline 적용 환경

신규 커널(5.14.0-570.55.1.el9_6.x86_64) 설치 후:
# dnf install kernel-5.14.0-570.55.1.el9_6
Bash
복사
•
모든 설정 값에 “mce=off”가 기입됨 확인
# 1. /boot/loader/entries/xxx-5.14.0-570.55.1.el9_6.x86_64.conf 확인 (업데이트 완료) options root=... selinux=0 mce=off # 2. /etc/default/grub 확인 (직접 수정) GRUB_CMDLINE_LINUX=... selinux=0 mce=off # 3. /boot/grub2/grub.cfg 확인 (업데이트 완료) set kernelopts=... selinux=0 mce=off
Bash
복사
•
재부팅 후 신규 커널에서도 정상 적용됨을 확인.
# 1. cat /proc/cmdline 확인 BOOT_IMAGE=... mce=off
Bash
복사

🌐 FAQ

Q. grubby와 --update-bls-cmdline 중 어떤 방식을 사용해야 하나요?

•
grubby 사용을 권장하는 경우:
◦
특정 커널 버전에만 파라미터를 테스트하거나 분기 적용해야 하는 경우 (--update-kernel=/boot/vmlinuz-…)
◦
CLI 명령어 한 줄로 즉시 설정 및 /etc/default/grub 동기화를 처리하고자 하는 경우
•
-update-bls-cmdline 사용을 권장하는 경우:
◦
Ansible 등 인프라 설정 관리 도구를 통해 /etc/default/grub 템플릿 파일을 중앙에서 배포/관리하는 환경
◦
모든 설치된 커널의 부트 엔트리를 최신 설정으로 일괄 갱신하고자 하는 경우

Q. UEFI 환경에서 grub.cfg 경로를 /boot/efi/EFI/redhat/grub.cfg로 지정해야 하나요?

아닙니다.
RHEL 9부터는 시스템 부팅 방식(BIOS/UEFI)과 관계없이 항상 /boot/grub2/grub.cfg 단일 경로를 지정해야 합니다.
과거(RHEL 7, 8, 9.0 to 9.2)에는 UEFI 시스템의 경우 /boot/efi/EFI/redhat/grub.cfg 경로에 실제 설정 파일이 생성되었습니다.
하지만 RHEL 9(RHEL 9.3 and later)부터는 부팅 아키텍처가 통합되어 모든 실제 설정 파일이 /boot/grub2/grub.cfg에 저장됩니다. UEFI 환경의 /boot/efi/EFI/redhat/grub.cfg는 /boot/grub2/grub.cfg를 불러오도록 포워딩해 주는 stub파일 역할을 수행합니다.
만약, grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg 명령으로 해당 파일을 덮어쓰게 되면 stub 구조가 손상되어 부팅 시 문제가 발생할 수 있으므로 주의가 필요합니다.

Q. RHEL8에서는 grub2-mkconfig로 정상 동작했었는데 RHEL9에서는 동작 방식에 차이가 있나요?

RHEL8 / RHEL9.0 to 9.2의 경우 BLS(GRUB_ENABLE_BLSCFG=true)가 활성화되어 있더라도, 관리자가 grub2-mkconfig를 실행하면 /etc/default/grub의 GRUB_CMDLINE_LINUX 값을 읽어와 /boot/loader/entries/*.conf 파일 내의 options 항목까지 Overwrite 하였습니다. 이로 인해, RHEL8 / RHEL9.0 to 9.2에서는 기존 방식대로 명령을 내려도 문제 없이 적용되었습니다.
RHEL 9.3부터는 grub2-mkconfig만 실행할 경우 기존 /boot/loader/entries/*.conf 파일들을 건드리지 않도록 동작이 바뀌었습니다.

Q. RHEL 10 환경에서는 어떤 점이 달라지나요?

RHEL 10에서는 BLS가 기본이자 필수 규격으로 확정되어 GRUB_ENABLE_BLSCFG=false옵션이 더 이상 지원되지 않습니다.
따라서 RHEL 7 스타일의 비-BLS 환경 구성은 지양해야 하며, “grubby” 또는 “grub2-mkconfig --update-bls-cmdline”방식을 표준 운영 가이드로 채택해야 합니다.

📌 마무리

RHEL 9 환경에서 기존 습관대로 /etc/default/grub수정 후 grub2-mkconfig만 실행하면 실제 커널 부트 파라미터가 누락되는 문제가 발생합니다.
테스트 결과 모든 부트 설정 영역에서 안정적으로 파라미터를 반영하고 신규 커널 설치 시에도 유지할 수 있는 방법은 1. grubby 활용 또는 2. --update-bls-cmdline 옵션 사용입니다.
시스템 운영 환경과 배포 방식에 맞춰 두 표준 방식 중 적합한 방식을 선택해 적용하시길 권장합니다.

📎 참고 자료

정세혁 프로
RHEL 기술지원 및 Openshift Virtualization 업무를 담당하고 있어요 😄