본문 바로가기

Linux/systemd

systemd-boot를 부트로더로 사용하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

저도 리눅스 입문을 우분투로 했기 때문에 처음 부트로더로 사용한 것은 GRUB2였습니다. 초기에는 딱히 만질줄도 모르고 수정할 일도 없었기에 설치된 그대로 사용하였지만 리눅스에 익숙해지고 커널 파라미터를 넣거나 커스텀 커널을 사용하려니 너무 설정하기 복잡했습니다. 그러다가 아치리눅스로 넘어오고 systemd-boot를 알게 되었습니다.

 

systemd-boot는 굉장히 심플하며 최소한의 기능만 들어있습니다. 그래서 GRUB2과 비교한다면 빈약하고 제약사항이 많다고도 할 수 있습니다. 그럼에도 불구하고 제가 사용하는 이유는 설정의 편리함 때문입니다. GRUB2은 /etc/default/grub, /etc/grub.d/ 등의 설정을 만져주고 업데이트를 실행해야만 비로소 적용됩니다. 그 설정파일도 쉘코드로 되어있는 것도 있어서 필요한 부분을 찾다보면 머리아픕니다. 그에 반해 systemd-boot는 <파티션 마운트 위치>/loader/entries/ 디렉토리에 간단한 설정파일만 넣으면 해당 설정으로 부팅하는 엔트리가 만들어지고 설정은 끝납니다.

 

설치하기 전에 먼저 systemd-boot의 제약사항을 설명하겠습니다. systemd-boot는 UEFI 지원되는 메인보드에서만 작동하며 설치되는 파티션 포맷은 FAT32이어야 합니다. 메인보드가 다른 파티션 타입을 지원한다면 그걸 사용할 수도 있겠지만 UEFI 스펙으로 FAT 타입을 필수적으로 지원해야하니 괜히 다른걸로 고생하지말고 순순히 FAT32로 합시다.

그리고 설치되는 저장장치의 파티션 테이블은 GPT여야 합니다. MBR도 사용가능할 수 있지만 최근 Windows도 GPT를 기본적으로 사용하고 어떤 에로사항이 생길지 모르니 더 좋은 GPT로 합시다.

마지막으로 가장 중요한 제약사항은 systemd-boot가 설치된 파티션 밖에 인식하지 못합니다. 그러므로 다른 파티션에 있는 리눅스 커널 이미지를 로드할 수 없고, windows의 부트 매니저 efi 파일도 동일한 파티션에 존재해야 systemd-boot를 통해 윈도우즈로 부팅할 수 있습니다.

 

본격적으로 설치를 시작하겠습니다. 먼저 설치할 저장장치에 파티션 하나를 생성하고 FAT32로 포맷합니다.

저는 256MiB를 할당했지만 반 이상이 낭비되고 있습니다. 아치리눅스와 윈도우즈 부트 매니저만 들어있을 때 이 정도이지만 우분투같은 경우는 업데이트 할 때마다 이전 커널과 initramfs를 그대로 남겨두기 때문에 넉넉하게 잡아주는게 정신건강에 이로울 것 같습니다.

파티션을 만들고 플래그 설정을 해줘야 합니다. 해당 파티션이 boot, esp 플래그가 설정되어야 메인보드에서 인식합니다.

gparted 기준으로 만들어진 파티션을 우클릭하면 플래그를 설정하는 옵션이 있습니다.

 

이제 이 파티션을 어딘가에 마운트하고 systemd-boot를 설치해줍니다.

# bootctl --esp-path=<마운트 디렉토리> install

 

부트로더 설치는 끝났습니다. 보통 리눅스 배포판들은 /boot 디렉토리에 커널 이미지와 initramfs를 설치하니 이후에 부팅했을 때 /boot로 마운트될 수 있도록 /etc/fstab에 설정해줍시다. (아치리눅스 설치 설명대로 따라한다면 genfstab 이 알아서 만들어주니 손댈 일도 없겠지만 보편적으로 응용할 수 있는 방법으로 적다보니 약간 복잡해지는 감이 있습니다...)

 

설치가 완료되었으니 이제 설정을 해야합니다. 부트로더 자체의 설정은 <마운트 디렉토리>/loader/loader.conf 에서 합니다.

옵션이 몇 개 있지만 timeout, editor, default 만 설정해도 무방합니다.

timeout 3
default archlinux
editor no

저는 위의 설정을 사용하고 있습니다.

timeout은 몇 초 뒤에 자동으로 선택된 엔트리로 부팅할 지 설정합니다.

default는 뒤에서 설정할 엔트리 중에 어떤 엔트리를 기본 선택으로 할 지 설정합니다.

editor는 부트로더에서 엔트리 수정 기능을 사용 가능하게 할 지 설정합니다. 저는 다른 사람이 무단으로 설정을 바꾸는걸 막기위해 no로 했습니다.

 

부트로더에 표시될 각 엔트리에 대한 설정은 <마운트 디렉토리>/loader/entries/*.conf 로 저장되어야 합니다. 여기서 * 부분에 들어가는 문자열이 위의 default 옵션값으로 쓰입니다. 그러므로 저는 archlinux.conf 라는 엔트리 설정 파일을 사용하여 아치리눅스를 기본 부팅 엔트리로 설정한 것입니다.

 

이 엔트리 설정 파일은 title, linux, initrd, options 옵션만 알면 됩니다. 먼저 제 설정을 예로 보여드리겠습니다.

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options rd.luks.name=<파티션 UUID>=root root=/dev/mapper/root

title은 부트로더에 표시될 엔트리명을 나타냅니다.

linux는 리눅스의 커널 이미지 경로를 값으로 받습니다. systemd-boot가 설치된 파티션을 / 로 합니다.

initrd는 initramfs와 CPU의 마이크로코드 경로를 값으로 받습니다. 주의할 점은 마이크로코드가 initramfs보다 먼저 나와야합니다.

options는 커널 파라미터를 설정하는데 사용됩니다. 저는 기본적으로 암호화된 파티션을 사용하고 있어서 rd.luks.name이란 파라미터를 사용했지만 암호화를 사용하지 않다면 root= 만 사용하면 됩니다. 대신 root=PARTUUID=<root 파티션 UUID> 로 설정해서 고정적인 값으로 root 파티션을 지정하는게 안정적입니다. 파티션 UUID는 gparted 등으로 확인할 수 있습니다.

 

이제 리부팅하고 메인보드 설정에 들어가서 systemd-boot EFI를 기본 부팅으로 지정하면 systemd-boot 부트로더를 볼 수 있습니다.

 

추가적으로 Windows의 boot manager EFI가 위의 파티션에 들어있다면 systemd-boot가 알아서 인식하고 windows boot manager를 엔트리로 띄워줍니다.