윈도우로 쓰고있던 데스크탑과 노트북을 활용해서 서버를 구축해볼텐데, 들어가기 전에 스펙을 먼저 언급하고 들어가겠다.
Control Plane & Worker 1 (Desktop)
Spec: 4 Core CPU / 16GB RAM
Storage: 400GB HDD (RHEL 할당 영역)
Worker 2 (Laptop)
Spec: 4 Core CPU / 12GB RAM
Storage: 150GB HDD (RHEL 할당 영역)
참고로 멀티부트란 하나의 컴퓨터 하드웨어에 두 개 이상의 운영체제를 설치하고, 부팅 시점에 사용자가 원하는 운영체제를 선택하여 실행하는 구성 방식을 의미한다.
VM을 사용하지 않고 굳이 이 방식을 사용하는 이유는 PC들의 사양이 충분하지 않아 최대한 이용하기 위해서이다.
그럼 이제 그럼 이제 멀티부트 설정법을 알아보자.
먼저, 윈도우에서 RHEL에 할당할 디스크 볼륨을 나눠야 한다.
Win + X를 눌러 디스크 관리 창으로 들어가자.

디스크 구성은 개인마다 다를것이며, 나는 여유가 많은 D드라이브를 선택하였다. 처음에는 전부 주 파티션(파란색)으로 채워져 있을 것이다.
선택한 디스크 위에서 우클릭후 볼륨 축소를 누르면 입력창이 생성되며, 여기에 다른 OS에 할당할 디스크 크기를 입력한다.
기준은 MB이므로, 409600을 입력해주었다.
그 후 축소를 누르면 진행되며, 이는 사용하는 디스크의 종류에 따라 시간 차이가 많이 생길 것이다. SSD는 보통 수 분 이내에 완료 되나, HDD의 경우는 물리적인 헤드가 움직이면서 손수 흩어져 있는 데이터를 긁어모아 공간을 확보해야 하므로 시간이 더욱 걸린다. 내 경우에는 20분 넘게 걸린것 같다.
혹시나 응답 없음같은 문구가 출력되더라도, 시간이 너무 오래 걸리는 것 같아도 참고 기다리자. 강제종료를 하는 순간 디스크가 깨질수도 있다.
이제 RHEL 설치를 위해 전용 USB를 만들어야 한다.
빈 USB를 하나 준비 후, OS의 iso파일을 USB에 구워야 한다.
이를 위해서, Rufus라는 프로그램을 사용할 것이다.

상관 없는 이야기이긴 하다만, 멋있다..
사이트 접속 후 본인의 운영체제에 맞는 프로그램을 받아주자.
실행 후 다음 창이 뜬다. 각 항목에 대해 알아보자.

장치 칸에는 USB명, 부팅 선택 칸에는 iso이미지가 들어간다. 우측의 선택을 누르면 파일 시스템에서 선택이 가능하다.

다음은 영구 파티션이다.

이는 USB를 OS설치용이 아닌 컴퓨터 자체를 들고다니고 싶을 때 설정하는 용도로, 이를 설정해놓으면 설치 후 그 컴퓨터에서 작업한 내용이 USB의 특정 구역에 저장된다.
나는 설치용으로만 사용할 예정이므로 0으로 설정하겠다.
파티션 구성과 대상 시스템이다.

파티션 구성은 MBR과 GPT가 있으며, 각 특징은 다음과 같다.
MBR (Master Boot Record)
1980년대부터 쓰인 오래된 방식이며, 주 파티션을 최대 4개까지만 만들 수 있고, 2TB 이상의 디스크를 인식하지 못하고, 아주 오래된 컴퓨터(BIOS 방식)에서 사용한다.
GPT (GUID Partition Table)
현재 표준으로 쓰이는 최신 방식이며, 파티션을 거의 무제한(기본 128개)으로 나눌 수 있고, 2TB가 넘는 대용량 디스크도 지원한다. 또한, 지도가 디스크 여러 곳에 저장되어 있어 하나가 깨져도 복구가 가능하다는 특징이 있다.
다음 대상 시스템은 BIOS 또는 UEFI 하나만 존재한다. 공용인듯 하다.
BIOS (또는 CSM)
전통적인 텍스트 기반의 부팅 제어 방식이다.
UEFI (Unified Extensible Firmware Interface)
마우스 사용이 가능하고 보안 부팅을 지원하는 현대적인 부팅 방식이다.
GPT + BIOS 또는 UEFI로 하고 넘어가자.
고급 속성들은 다룰 필요 없으므로 넘어가겠다.
다음은 포멧 옵션이다.

먼저 볼륨 레이블은 USB 드라이브의 논리적 명칭이며, 파일 시스템의 메타데이터 영역(정확히는 루트 디렉토리의 Volume ID 필드)에 저장되는 문자열이다.
다음 파일 시스템은 FAT32로 설정되어 있고, 이는 Rufus가 자동으로 추천해 준 시스템이다. 파일 시스템까지 여기서 설명하긴 너무 기니, 넘어가겠다.
클러스터 크기는 디스크에서 데이터를 저장하는 최소 크기를 의미하며, 블록 크기와 개념이 비슷하다.
이제 대충 다 설명했으니 시작 버튼을 누르자.
다음 ISO 모드와 DD모드가 있는데 ISO 모드를 선택하면 된다.

다음과 같이 작업중인것을 알 수 있다.
그 후 UEFI 모드로 들어가서 설정을 해 줘야하는데, Secure Boot 모드를 Disable로 설정하고, OS Type 또는 Boot Mode Selection라고 있을텐데 그걸 기타 OS로, 부팅 순서에서 리눅스 부트로더(GRUB)를 위로 올려주었다.
이제 OS를 설치하러 가자.
설치 과정에서 많은 문제가 발생하였다..
내 경우는 RHEL 디스크 지정 후 설치 과정에서 에러가 발생하였는데, 그러면 처음부터 다시 실행해야 한다. 그렇게 되면 이미 디스크가 이렇게 할당이 되어있는데, 이들을 전부 삭제해야 한다.

똑같이 우클릭 후 볼륨 삭제를 눌러준다. 끝나면 다음과 같이 검정색으로 할당되지 않음으로 묶일 것이고, 다시 설치할 수 있게 된다.

다시 하러가자..
An error occured during the transaction: Error in POSTTRANS scriptletin rpm package grub2-common
라는 에러가 발생하였다. rpm 패키지 설치 중 발생한 오류같은데 검색을 해봐도 9.2버전에서 UFEI 시간 설정 오류로 해당 에러가 발생하였다고 한다.
그래서 체크섬 검사도 해 봤는데, 일치하였다.
일단 디스크 초기화 후, UEFI 시간을 확인하고 다시 설치해보자.
그런데!! 여전히 같은 에러가 발생했다.
Ctrl + Alt + F2를 누르면 쉘 창으로 나갈 수 있는데, 거기서 로그 파일을 확인해 보았다.
error level 3
ERROR: dnf : no group base-grachical from environment grapical-server-environment
DEBUG: anaconda.modules.payload.dnf.validation: Resolving has been conpleted: ValidationReport(error_messages=[]. warning_messages=[])
warning:%posttrans(grub2-common-1:2.12-29.el10_1.noarch)scriptlet failed, exit status 1
ERROR: dnf.rpm: Error in POSTTRANS scriptlet in rpm package grub2-common
INFO: anaconda.core.threads: Thread Failed: AnaTaskThread-InstallPackagesTask-1 (140241612650176)
ERROR: anaconda.modules.common.task.task: Thread Failed: AnaTaskThread-InstallPackagesTask-1 has failed: TraceBack (most recent call last):
raise PayloadInstallationError("An Error occurred during the transaction: " + msg)
pyanaconda.modules.common.errors.installation.PayloadInstallationError: An error accurred during the transaction: Error in POSTTRANS script in rpm package grub2-common
WARNING: dasbus.server.handler: The call org.fedoraproject.Anaconda.Task.Finish has failed with an exception:
thread_manager,raise_if_error(self._thread_name)
File "usr/lib64/python3.12/site-packages/pyanaconda/core/threads.py", line 172, in raise_if_error
raise PayloadInstallationError("An error occurred during the transaction: " msg)
이런 에러 때문에 위 문제가 발생하였는데, 대충 에러 내용을 설명하자면 dnf(패키지 관리자)가 설치 소스에서 그래픽 서버 환경에 필요한 패키지 묶음을 찾지 못했고, 패키지 설치의 마지막 단계(POSTTRANS)에서 GRUB2 부트로더 설정을 하게 된다.
이 과정에서 grub2-mkconfig 명령이 실행되며, 내부적으로 os-prober 유틸리티를 호출하는데 이 유틸리티가 하는 일이 문제가 된 것이다.
os-prober는 시스템의 모든 블록 장치를 탐색하여 멀티 부팅 메뉴 구성을 위한 메타데이터를 수집하는데, 여기 아까 디스크 구성에서 보았던 "새 볼륨 (D:)" 파티션 라벨이 문제였다.
이에 대한 로그는 /tmp/packaging.log에 적혀 있었는데,
INFO:dnfrpm:GRUB~깨져서 안보임
/usr/share/grub/grub-mkconfig_lib:(깨짐) 343(깨짐) : printf: '$' (깨짐)
warning: %posttrans(grub2-common-1:2.12-29.eli0_1.noarch) scriptlet failes, exit status 1
대충 이런 로그였다.
제미나이의 설명을 들어보니, grub-mkconfig가 디스크 스캔 중 변수를 출력하다 생긴 오류같다고 해서, 윈도우로 다시 접속해 볼륨 명을 D:로 바꾸니 설치가 정상적으로 되었다.
문제 해결 과정에서 하드웨어 문제인가 싶어 efibootmgr 명령어로 NVRAM에 부팅 항목이 정상적으로 등록되는지 테스트도 해보고, dvd 이미지인데도 설마 패키지를 서버에서 가져오나 해서 레드햇 계정 등록도 해보고, 이미지를 굽는 방식(dd)도 바꿔보고, 이미지 체크섬 검사도 해보고, 이미지 버전도 boot 버전으로 바꿔 보는 등 여러 시도를 해봤었는데, 정작 문제는 문자열 파싱 오류였다니 조금 허무했다.
앞으로는 표면적인 로그만 보고 추측하기 보다는 결정적인 로그를 가장 먼저 찾아야겠다.
다음 포스팅에서는 RHEL에서 쿠버네티스 서버를 설치하는 과정을 다루겠다. SELinux 때문에 꽤나 골치아플 예정일 것 같지만, 할건 해야지 ..