Rocky Linux 9 부트 관리: bootctl의 역할과 GRUB2/grubby 마스터링

Rocky Linux 9 부팅 관리 완벽 가이드. bootctl의 진실과 표준 부트로더 GRUB2, grubby 명령어 사용법을 상세히 설명합니다. 전문가를 위한 필수 팁 포함.
인프라코디

Rocky Linux 9 부팅 프로세스 탐색하기

서버 환경에서 부트로더의 중요성은 아무리 강조해도 지나치지 않습니다. 부트로더는 운영 체제 전체로 들어가는 관문이며, 그 설정을 마스터하는 것은 문제 해결, 보안 강화, 성능 튜닝에 필수적인 시니어 시스템 관리자의 역량을 보여주는 징표입니다.

Arch Linux와 같은 배포판이나 최신 systemd 기능을 다루던 관리자라면 Rocky Linux 9에서 부팅 설정을 위해 자연스럽게 "bootctl 사용법"을 검색할 수 있습니다. 이는 bootctlsystemd-boot를 관리하는 표준 유틸리티이므로 지극히 논리적인 접근입니다. 실제로 최신 Rocky Linux 9 시스템에서는 bootctl 명령어를 찾을 수 있습니다. 하지만 바로 이 지점에서 엔터프라이즈 리눅스, 특히 RHEL(Red Hat Enterprise Linux) 생태계는 다른 길을 택합니다.

이 가이드는 먼저 Rocky Linux 9에서 bootctl 명령어의 역할과 위치를 명확히 하고, 왜 GRUB2가 여전히 표준 부트로더인지 설명할 것입니다. 그리고 나서 여러분이 실제로 사용해야 할 도구, 즉 견고한 GRUB2 부트로더와 필수적인 grubby 커맨드라인 유틸리티에 대한 가장 포괄적이고 전문가 수준의 튜토리얼을 제공할 것입니다. 이 글을 끝까지 읽으시면 Rocky Linux 9가 왜 이런 방식으로 구성되었는지 이해하게 될 뿐만 아니라, 마주하게 될 모든 부트 관리 작업을 위한 네이티브 툴셋을 완벽하게 마스터하게 될 것입니다.

Rocky Linux 9의 bootctl: 왜 존재하지만 기본이 아닐까?

systemd-boot와 bootctl이란 무엇인가?

bootctl의 역할을 이해하기 전에, 그것이 무엇인지부터 알아야 합니다. 이 섹션에서는 systemd-boot(이전 명칭 Gummiboot)와 그 관리 도구인 bootctl에 대한 기본 개념을 정립합니다.

systemd-boot의 핵심 철학은 단순하고, 빠르며, 설정이 가벼운 UEFI 부트 매니저를 지향하는 것입니다. 이것은 GRUB처럼 모든 기능을 갖춘 완전한 부트로더가 아니라, 다른 EFI 실행 파일을 실행시키는 부트 매니저에 가깝습니다. 설정 방식은 EFI 시스템 파티션(ESP) 내, 일반적으로 /boot/efi/loader/ 경로에 위치한 간단하고 사람이 읽기 쉬운 텍스트 파일(.conf)을 통해 이루어집니다. 이는 GRUB의 복잡한 스크립트 생성 과정과 극명한 대조를 이룹니다.

bootctl은 바로 이 systemd-boot를 위한 커맨드라인 인터페이스(CLI)입니다. 주요 기능은 부트 매니저 파일을 ESP에 설치하거나 업데이트하고, 부트로더의 상태를 확인하는 것입니다.

이러한 설계는 "하나의 일을 제대로 하자"는 유닉스 철학을 부팅 과정에 적용한 것으로 볼 수 있습니다. systemd-boot는 장치 및 파일 시스템 탐색과 같은 복잡한 작업은 UEFI 펌웨어에 맡기고 자신은 최소한의 역할만 수행합니다. 반면, GRUB은 파일 시스템, 입력 장치 등을 위한 자체 드라이버를 포함하는 거대한 단일형(monolithic) 솔루션입니다. 이 근본적인 설계 철학의 차이가 systemd-boot가 왜 더 단순하지만 유연성은 떨어지는지를 설명해 줍니다. 이것은 단순히 다른 도구가 아니라, 부팅이라는 문제에 대한 다른 접근 방식인 것입니다.

Rocky Linux 9에 bootctl이 있지만 표준이 아닌 이유

최신 Rocky Linux 9 시스템(예: systemd-udev-252-51.el9 이상 패키지 포함)에서는 bootctl 명령어가 실제로 존재합니다. 하지만 이것이 시스템의 기본 부트로더가 systemd-boot라는 의미는 아닙니다.

여기에는 약간의 역사적 배경이 있습니다. Rocky Linux 9 초기 버전(systemd-udev-250-6.el9_0.1 등)에서는 빌드 종속성을 줄이기 위해 systemd-boot 관련 도구인 bootctl이 의도적으로 제외되었습니다. 당시에는 dnf provides "*/bootctl" 명령어로도 찾을 수 없었습니다. 하지만 이후 systemd 패키지가 업데이트되면서 systemd의 전체 기능 세트를 제공하기 위해 bootctl이 다시 포함되었습니다.

그럼에도 불구하고, Rocky Linux 9와 RHEL 9의 공식적이고 지원되는 표준 부트로더는 여전히 GRUB2입니다. bootctl의 존재는 systemd의 일부로서 제공되는 것이며, 시스템의 기본 부팅 방식을 systemd-boot로 변경하지는 않습니다. 엔터프라이즈 환경에서 요구되는 안정성, 레거시 BIOS 시스템과의 호환성, 그리고 풍부한 기능 때문에 GRUB2가 표준으로 유지되고 있습니다.

systemd-boot 대 GRUB2: 시스템 엔지니어를 위한 정면 비교

이제 두 부트로더를 여러 핵심 지표에 걸쳐 비교 분석합니다. 이를 통해 독자는 장단점을 이해하고 왜 GRUB2가 Rocky Linux의 선택인지 재확인할 수 있습니다.

이 비교를 통해 명확한 주제가 드러납니다. systemd-boot는 기능과 호환성을 희생하여 단순성과 속도를 제공하는 반면, GRUB2는 복잡성을 대가로 엄청난 기능과 유연성을 제공합니다. 단일 사용자의 최신 UEFI 데스크톱 환경에서는 systemd-boot가 더 나은 선택일 수 있습니다. 하지만 구형 하드웨어, BIOS 시스템을 포함하거나 테마 메뉴, Btrfs 스냅샷 직접 부팅과 같은 고급 기능이 필요한 다양한 서버 환경에서는 GRUB2가 훨씬 더 유능한 도구입니다. 이는 "어느 것이 좋다, 나쁘다"를 넘어선 미묘한 차이를 이해하게 하고, 관리자가 현재 사용하는 도구의 가치를 제대로 인식하도록 돕습니다.

systemd-boot vs. GRUB2 - 기술적 비교

기능 systemd-boot GRUB2 분석
호환성 UEFI 전용 UEFI & 레거시 BIOS 지원 GRUB2는 다양한 하드웨어 환경을 포괄해야 하는 엔터프라이즈에서 필수적인 폭넓은 호환성을 제공합니다.
설정 방식 간단한 텍스트 .conf 파일 /etc/default/grub/etc/grub.d 스크립트에서 grub.cfg 생성 systemd-boot는 직관적이고 수동 편집이 용이하지만, GRUB2는 자동화된 스크립트 기반 생성을 통해 더 복잡한 로직을 처리할 수 있습니다.
커널 위치 ESP 또는 XBOOTLDR 파티션에 커널/initrd 필요 ext4/XFS 등 읽기 가능한 모든 파일 시스템에서 로드 가능 (예: /boot) GRUB2의 유연성은 ESP 파티션 크기 제약에서 자유롭게 하고, 표준 리눅스 파일 시스템 레이아웃을 유지할 수 있게 합니다.
복잡성 최소한의 구조, 이해하기 쉬움 매우 복잡, 의사 스크립팅 언어, 높은 학습 곡선 systemd-boot의 단순성은 관리 오버헤드를 줄이지만, GRUB2의 복잡성은 그만큼 강력한 제어 능력을 부여합니다.
유지보수 엔트리 파일 수동 편집 또는 배포판 훅에 의존 grub2-mkconfig 실행으로 변경 사항 적용 GRUB2의 중앙 집중식 업데이트 방식은 일관성을 보장하지만, systemd-boot는 각 OS가 독립적으로 부팅 항목을 관리할 수 있는 장점이 있습니다.
주요 기능 기본 메뉴, Windows/macOS 자동 감지 테마, Btrfs/ZFS 스냅샷 통합, 암호 보호, 강력한 복구 셸 등 GRUB2는 보안 강화, 고급 파일 시스템 지원, 사용자 정의 등 엔터프라이즈급 기능을 압도적으로 많이 제공합니다.
장애/복구 고장 확률 낮음, 복구 시 수동 EFI 조작 필요 가능성 복잡성으로 인한 고장 지점 많음, 강력한 복구 커맨드라인 제공 systemd-boot는 단순해서 안정적이지만, GRUB2는 문제가 발생했을 때 자체적으로 해결할 수 있는 강력한 도구를 내장하고 있습니다.

GRUB2 마스터하기: Rocky Linux 9의 기본 부트로더

Rocky Linux 9의 GRUB2 아키텍처

GRUB2가 우리가 사용할 도구임을 확인했으니, 이제 최신 Rocky Linux 9 시스템에서의 그 구조를 해부해 보겠습니다.

핵심 파일 및 디렉터리:

  • /etc/default/grub: 사용자가 직접 수정하는 주 설정 파일입니다. 전역적인 부팅 옵션을 이곳에서 설정합니다.
  • /etc/grub.d/: grub2-mkconfig가 최종 설정 파일을 생성하기 위해 실행하는 스크립트들이 모여있는 디렉터리입니다 (예: 10_linux, 30_os-prober). 고급 사용자 정의가 이곳에서 이루어집니다.
  • /boot/grub2/grub.cfg: 최종적으로 생성된 설정 파일입니다. 이 파일은 절대로 직접 수정해서는 안 됩니다.
  • /boot/loader/entries/: BootLoaderSpec(BLS) 호환 부팅 항목 파일들이 위치하는 곳입니다. Rocky Linux 9의 GRUB2는 이 디렉터리의 파일들을 읽어 메뉴를 구성하므로, 커널 관리가 더 모듈화되었습니다.

RHEL 9(따라서 Rocky Linux 9)의 중요한 변화 중 하나는 grub.cfg 파일 위치의 표준화입니다. RHEL 7/8과 같은 이전 버전에서는 UEFI 시스템의 경로가 /boot/efi/EFI/redhat/grub.cfg였습니다. 하지만 RHEL 9에서는 BIOS와 UEFI 시스템 모두에서 주 설정 파일이 항상 /boot/grub2/grub.cfg에 위치합니다. UEFI 경로는 이제 실제 설정 파일을 가리키는 작은 "스텁(stub)" 파일만 포함하고 있습니다. 이는 구버전에서 업그레이드하는 관리자들에게 흔한 혼란의 원인이므로, 이 변화를 명확히 인지하는 것은 최신 시스템에 대한 전문적인 지식을 보여줍니다.

/etc/default/grub으로 부팅 환경 사용자 정의하기

이 섹션은 관리자가 수행할 일반적인 수정 작업을 실용적인 예제와 함께 다룹니다.

  • GRUB_TIMEOUT=5: 부팅 메뉴의 대기 시간을 초 단위로 변경합니다.
  • GRUB_DEFAULT=saved: GRUB이 마지막으로 부팅한 항목을 기억하게 설정합니다.
  • GRUB_CMDLINE_LINUX="... rhgb quiet": rhgb(Red Hat Graphical Boot)와 quiet 옵션의 역할을 설명하고, 이를 제거하여 부팅 과정을 상세히 출력(verbose boot)하는 방법을 안내합니다. 이는 매우 일반적인 문제 해결 단계입니다.
  • GRUB_CMDLINE_LINUX="... intel_iommu=on": 특정 하드웨어 관련 커널 파라미터를 전역적으로 추가하는 방법을 보여줍니다.
  • GRUB_TERMINAL_OUTPUT="console": 직렬 콘솔(serial console) 접근 시 이 옵션의 역할을 설명합니다.

grub2-mkconfig로 변경 사항 적용하기

/etc/default/grub 파일을 수정한 후에는 변경 사항을 실제 부팅 설정에 적용해야 합니다.

정확한 명령어는 다음과 같습니다:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

다시 한번 강조하지만, 이 경로는 Rocky Linux 9에서 BIOS와 UEFI 시스템 모두에 적용되는 올바른 경로입니다. 이는 2.1절에서 설명한 "스텁 파일" 구조 때문입니다. 구버전의 UEFI 경로를 사용하면 부팅 설정이 손상될 수 있으므로 절대 사용해서는 안 됩니다.

grub2-mkconfig는 전체 설정을 다시 생성하는 강력한 도구이지만, 때로는 너무 과할 수 있습니다. 이는 느릴 수 있고, 의도치 않게 수동 변경 사항을 덮어쓸 수도 있습니다. 다음 장에서는 커널별 인수를 관리하는 일상적인 작업에 더 정교하고 안전한 도구인 grubby를 소개할 것입니다. 이는 전역 설정에서 특정 항목 관리로 자연스럽게 넘어가는 논리적 흐름을 만듭니다.

grubby: 커널 엔트리를 스마트하고 안전하게 관리하는 방법

grubby 소개

grubby는 RHEL 생태계에서 부팅 항목 관리를 위해 선호되는, 스크립트화 가능하고 더 안전한 도구입니다.

이 도구의 목적은 grub2-mkconfig를 실행할 필요 없이 개별 부팅 항목의 설정 파일(즉, /boot/loader/entries/에 있는 BLS 파일)을 직접 수정하는 것입니다. grubby는 더 빠르고, 오류 발생 가능성이 적으며, 킥스타트(Kickstart)나 앤서블(Ansible) 플레이북과 같은 자동화 및 스크립팅에 이상적입니다.

일상적인 관리를 위한 필수 grubby 명령어

가장 유용한 정보 조회 명령어들은 다음과 같습니다.

  • sudo grubby --info=ALL: 모든 커널 항목과 그 세부 정보(인덱스, 경로, 인수)를 나열합니다.
  • sudo grubby --default-kernel: 기본으로 부팅될 커널의 경로를 표시합니다.
  • sudo grubby --default-index: 기본 커널의 인덱스 번호를 표시합니다.
  • sudo grubby --info /boot/vmlinuz-$(uname -r): 현재 실행 중인 커널의 상세 정보를 가져옵니다.

실용 예제: 기본 부팅 커널 변경하기

문제 해결을 위해 일시적으로 또는 영구적으로 이전 버전의 커널로 부팅하는 것은 흔한 작업입니다.

  • 1단계: grubby --info=ALL을 사용하여 모든 커널과 해당 인덱스를 나열합니다.
  • 2단계: 인덱스를 사용하여 새 기본 커널을 설정합니다: sudo grubby --set-default-index=1.
  • 3단계: 또는 전체 경로를 사용하여 설정할 수도 있습니다: sudo grubby --set-default=/boot/vmlinuz-5.14.0-....x86_64.
  • 4단계: sudo grubby --default-kernel로 변경 사항을 확인합니다.

실용 예제: 커널 부팅 인수 수정하기

이것이 grubby의 핵심적인 힘입니다. 디버깅, 기능 활성화, 또는 보안 완화 조치 적용을 위해 부팅 파라미터를 추가하거나 제거할 수 있습니다.

  • 모든 커널에 인수 추가: sudo grubby --update-kernel=ALL --args="nouveau.modeset=0"
  • 특정 커널에서 인수 제거: sudo grubby --update-kernel /boot/vmlinuz-5.14.0-....x86_64 --remove-args="rhgb"
  • 기본 커널에 여러 인수 추가: sudo grubby --update-kernel=DEFAULT --args="loglevel=7 console=ttyS0,115200"

중요 사항: --update-kernel과 함께 --args 옵션을 사용하는 것은 멱등성(idempotent)을 가집니다. 즉, 인수가 없으면 추가하고, 있으면 값을 업데이트합니다. --args--remove-args 옵션은 기존 인수 목록에 대해 추가/제거 방식으로 작동하도록 설계되었습니다.

고급 팁: 커널 업데이트 시 인수 유지하기

이 내용은 관리자들의 주요 고충을 해결하고 진정한 전문가 수준의 지식을 보여줍니다.

문제점: dnf update를 통해 새 커널이 설치될 때, 이전에 grubby로 추가했던 인수를 자동으로 상속하지 않습니다.

해결책: 커널 설치 프로세스는 /etc/kernel/cmdline 파일을 확인합니다. 이 파일이 존재하면, 그 내용이 새로 설치된 커널의 인수로 사용됩니다.

여기서 grubby/etc/kernel/cmdline 사이의 숨겨진 연결고리가 드러납니다. 관리자가 /etc/kernel/cmdline을 수동으로 생성할 수도 있지만, grubby --update-kernel=ALL --args="..." 명령을 실행하면 실제로는 이 파일이 백그라운드에서 생성되거나 업데이트됩니다. 이는 매우 강력하고 명확하게 드러나지 않는 정보입니다. 즉, 파라미터가 지속되도록 하는 "올바른" 방법은 ALL 지정자와 함께 grubby를 사용하는 것입니다. 이 접근법은 grubby라는 도구와 /etc/kernel/cmdline이라는 기본 시스템 메커니즘을 연결하여, 견고하고 모범적인 권장 사항을 제공합니다.

테스트를 위해 systemd-boot로 전환 살짝 엿보기

bootctl의 존재를 확인한 사용자의 호기심을 충족시키기 위해, 이 섹션에서는 마이그레이션에 어떤 과정이 포함되는지에 대한 높은 수준의 개념적 개요를 제공합니다. 이 절차는 비표준적이며 고급 과정으로, 프로덕션 시스템에는 절대 권장되지 않음을 명시합니다.

  • 전제 조건: 이 절차는 UEFI 전용입니다. 레거시 BIOS 시스템과는 호환되지 않습니다.
  • 핵심 단계 (개념적):
    1. systemd-boot 설치: Fedora 같은 시스템에서는 dnf install 명령으로 가능할 수 있습니다. Rocky에서는 bootctlsystemd-udev 패키지의 일부로 제공되지만, systemd-boot로의 전환을 위한 공식 지원이나 패키지는 없습니다.
    2. ESP에 설치: sudo bootctl install을 실행합니다. 이 명령은 필요한 .efi 파일을 ESP에 복사하고 UEFI 부팅 항목을 생성합니다.
    3. 커널 이동: 가장 큰 장애물입니다. 커널과 initramfs 파일을 /boot에서 ESP(예: /boot/efi)로 복사해야 합니다. ESP는 여러 커널 버전을 수용할 수 있을 만큼 충분히 커야 합니다(1GB 이상 권장).
    4. 로더 항목 생성: 각 커널에 대해 /boot/efi/loader/entries/title, linux, initrd, options 라인을 포함하는 .conf 파일을 수동으로 생성해야 합니다.
    5. GRUB 제거 (선택적/위험): systemd-boot가 정상적으로 작동하는 것을 확인한 후, grub2 관련 패키지를 제거할 수 있습니다.

이것이 RHEL 파생 배포판에서 어려운 이유는 dnf 커널 업데이트 스크립트, kdump 등 전체 시스템 도구가 GRUB2와 /boot 파티션 구조를 중심으로 구축되어 있기 때문입니다. systemd-boot로 전환하는 것은 단순히 부트로더를 바꾸는 것이 아니라, 배포판 전체 설계의 흐름을 거스르는 것입니다. 커널 업데이트 시 새 커널이 올바른 위치에 배치되거나 필요한 로더 항목이 자동으로 생성되지 않을 가능성이 높으며, 이를 유지하기 위해서는 상당한 수동 개입이나 사용자 정의 스크립트가 필요합니다. 이것이 왜 systemd-boot가 단순한 "또 다른 옵션"이 아니라 근본적인 시스템 변경인지 설명해 줍니다.

마무리: Rocky Linux 9의 네이티브 툴셋 수용하기

핵심 요약:

  • Rocky Linux 9는 bootctl 명령어를 포함하고 있지만, 공식적으로 지원되는 표준 부트로더는 GRUB2입니다. 이는 안정성과 호환성을 위한 의도적인 설계 선택입니다.
  • 전역 부팅 설정은 /etc/default/grub에서 관리하고 grub2-mkconfig로 적용합니다.
  • 커널별 변경 사항은 grubby 명령어를 사용하는 것이 가장 안전하고 효율적인 방법입니다.

학습을 위해 다른 도구를 탐색하는 것도 가치 있지만, 안정적이고 유지보수 가능하며 안전한 프로덕션 서버를 구축하기 위해서는 네이티브로 지원되는 툴셋을 마스터하는 것이 무엇보다 중요합니다. GRUB2와 grubby의 조합은 모든 부팅 관리 요구에 대응할 수 있는 강력하고 유연한 시스템을 제공합니다.

인프라코디
서버, 네트워크, 보안 등 IT 인프라 관리를 하는 시스템 엔지니어로 일하고 있으며, IT 기술 정보 및 일상 정보를 기록하는 블로그를 운영하고 있습니다. 글을 복사하거나 공유 시 게시하신 글에 출처를 남겨주세요.

- 블로그 : www.infracody.com

이 글이 유익했나요? 댓글로 소중한 의견을 남겨주시거나 커피 한 잔의 선물은 큰 힘이 됩니다.
댓글