꽃삽질 : Clover Bootloader, Linux(Ext4/Btrfs) 사용하기.

내용은 그다지 꽃삽질에 해당하진 않지만, 이 방법을 알아내기까지는 꽤 고생을 했다. 또, 이걸 해내기 위해선, 그동안 이런 저런 바닥에서 굴렀던 내 자신의 노고가 가장 큰 도움이 되었으므로, 내 자신에게 스스로 칭찬을 해주고 싶다. 하하하하!


해킨토시가 설치되어 있는 한 PC 에는, Ext4 를 루트로 쓰는 우분투와, Btrfs 를 루트로 사용하는 우분투가 더 들어있다. 해킨토시를 쓰기 훨씬 전부터 쓰던 PC 이기에, rEFInd 가 먼저 설치되어 있었다.

따라서, 내가 사용하던 부팅 절차는 이랬다.

  • rEFInd 로 먼저 부팅
  • rEFInd 가 Clover / Ubuntu #1 / Ubuntu #2 를 목록에 표시
  • rEFInd 를 통해 우분투 중 하나로 접근하거나, 또는,
  • rEFInd 로 Clover 로 접근
  • Clover 를 통해 macOS 부팅

해킨토시는 Clover 를 통해서만 부팅이 가능하므로, Clover 는 필수 불가결한 존재다. 여기서, Clover 만 쓸 수는 없을까? 라는 의문이 생겨났다.

게다가, 저 PC 는 랩탑이었는데, 랩탑들의 펌웨어는 일반 데스크탑 펌웨어에 비해 제약이 있다고들 한다. 내 랩탑도 마찬가지여서, efi/BOOT 디렉토리에 있는 부트관리자만 실행이 되고, efi/refind 등, 다른 디렉토리에 있으면 인식이 되질 않는다.

따라서, refind 를 –usedefault 로 해줘야만 refind 가 실행되는 문제가 있었다.
그런데, 이게 또 다른 귀찮음을 야기시킨다.

Clover 를 설치하면, efi/BOOT 디렉토리에 있던 BOOTX64.efi(refind) 를 지우고, CLOVERX64.efi 를 BOOTX64.efi(Clover) 로 덮어써버린다.
Clover 는 판올림이 잦기 때문에, 이럴 때마다 다시 refind_x64.efi (또는 refind-install –usedefault 명령)를 BOOTX64.efi 로 바꿔줘야 refind 를 유지할 수 있게 된다.
간단한 작업이지만, 그리 즐거운 일은 또 아니다. 번거롭고 살짝 짜증나는 일이지.

어차피 부트로더는 OS 를 부팅시켜주는 일만 하면 되는데, 굳이 2개를 쓸 이유는 없지 않은가? 따라서, 그냥 Clover 가 리눅스까지 부팅해주도록 해주면 일은 간단해질 터.


헌데.. 이상한 일이 있었다.
일단, Clover 는 ‘리눅스’를 자동으로 찾아준다고 한다. 특별한 선택사항등을 주기 위한 사용자 설정도 추가할 수는 있지만, 리눅스가 있으면 그냥 메뉴에 뜨는게 정상이라고 한다.

그런데, 최초에 refind 로 부팅한 후 Clover 로 들어가면 리눅스(우분투 중 Ext4 에 설치된 것)가 보이는데, 그냥 Clover 로 부팅하면 리눅스는 보이질 않았다.

왜 이런 현상이 생길까?
첫번째로, ‘Clover 가 Btrfs 를 제대로 지원하지 못하나 보다.’ 라는 의심을 했다.
refind 도 Btrfs 를 위해선 refind_linux.conf 라는 파일이 있어야 하므로, Clover 에도 뭔가 그런게 필요하지 않을까하는 추리(?)를 할 수 있었다.

두번째는, Btrfs 는 그렇다치고, ‘왜 Clover 자체 부팅을 하면 Ext4 도 찾아내질 못할까?’ 라는 문제에 부딪혔다.
refind 로 부팅하고, 이후 Clover 로 진입했을 때만 리눅스를 찾아내다니.. 그 둘간 무슨 상관관계가 있다고..???

두번째 문제에 대해 좀 더 진지하게 생각했다면, 논리로 추론을 했다면 답은 좀 더 빨리 나올 수 있었을텐데.. 이런 저런 꽃삽질로 시간을 보낸 게 무척이나 아쉽다.


refind 가 각 파티션을 인식하기 위해서는, 각 파티션용 드라이버가 필요하다. 이 드라이버는 refind/drivers_x64 산하에 설치되는데, refind 설치파일에는 ext2_x64.efi, ext3_x64.efi, ext4_x64.efi, btrfs_x64.efi 등등이 포함되어 있다.

따라서, ext4 나 btrfs 를 root 디렉토리로 사용하는 파티션으로 부팅하려면, 저 디렉토리에 해당 파일들이 들어가 있어야 한다.
내가 사용하던 refind 의 해당 디렉토리 (정확하게는 ESP 의 EFI/BOOT/drivers_x64) 에는, ext4_x64.efi, btrfs_x64.efi 파일이 들어있었다.
따라서, 양 파일시스템을 사용하는 우분투로 모두 부팅할 수 있었다.

그런데, Clover 에는 저 파일들이 들어있지 않다. 정확하게, ESP 의 EFI/CLOVER/drivers64UEFI 디렉토리에 저 파일들이 없기 때문에, Clover 자체로 부팅을 하면 EXT4, BTRFS 형식의 파티션은 인식을 못하게 되고, 당연히 그 형식을 사용해 설치된 우분투도 존재 자체를 알 수가 없게 된다.

그러면, 왜 refind ➙ Clover 로 진행을 한 경우엔 Ext4 형식의 우분투는 Clover 메뉴 항목에 떴을까?
그건, refind 에 있는 Ext4 드라이버(ext4_x64.efi)가 램에 적재됐고, 그게 Clover 에까지 영향을 미쳤다고 볼 수밖에 없다.

여기까지가 내 나름의 ‘논리’로 풀어본 이 현상의 인과관계였다.
그렇다면 내가 해야할 작업은 하나. refind 의 파일 시스템 드라이버가 Clover 에도 영향을 미침을 내 눈으로 확인했으므로, 그 파일들을 Clover Driver 디렉토리(ESP 의 EFI/CLOVER/drivers64UEFI)에 복사해주면, Clover 로 부팅해도 리눅스가 떠야하지 않을까???

그 시도는 헛되이 끝나지 않았다.
그게 바로 정답이었다.

efi 형식은, 아마도 부트 매니저에 관계없이 작동을 하는 모양이다. 여기에 관한 지식이 없어서 그저 경험에 입각한 사실로 추론할 수 밖에 없음이 안타깝다. (???)

어쨌든, 정리하면 이렇다.


Clover 로 리눅스(Ext4) 부팅!

Clover 부트로더를 통해 리눅스를 부팅하려면, ESP 의 EFI/CLOVER/drivers64UEFI 에 파일시스템 드라이버(*.efi)를 넣어줘야 한다.
이 드라이버는, Clover 에는 들어있지 않다. Installer 에도, Bootable_ISO 에도 없다. 이 파일들은 refind 에서 구할 수 있다. Sourceforge refind 다운로드 페이지에는 여러가지가 있는데, refind-bin-xxx.zip 등을 내려받아 압축을 풀면, refind/drivers_x64 디렉토리에서 해당 파일들을 찾을 수 있다.
혹은, 이미 refind 를 사용 중이라면, /usr/share/refind/refind/drivers_x64/
에서도 찾을 수 있다.

어떤 식으로든 원하는 파일들을 찾아, 저 위치에 복사해준다.

이렇게 한 뒤, Clover 로 부팅하면(refind 도움 없이 단독 부팅), 이젠 비로소 보이지 않던 리눅스 파티션들이 보이기 시작한다.
여기에, 좀 더 원활한 사용(최신 커널만 표시되도록)을 위해서 Clover 의 config.plist 를 편집할 필요가 있다. (이 부분은 아래에서 다시 언급)

Clover 로 Btrfs 는 어떻게?

위와 마찬가지로, btrfs.efi 드라이버 파일을 먼저 해당 위치에 복사해야 한다.
그럼에도 불구하고, btrfs 에 설치된 우분투는 여전히 Clover 가 찾질 못한다. 시험해보지는 않았지만, 아마도 OpenSuse 는 잘 되리라 생각한다. (바로 인식되어야만 한다. 그렇지 않으면, 내가 정리한 내용이 모두 거짓말이 돼 버린다.)
이 둘간의 차이는, subvolume set-default 를 해줬느냐, 그렇지 않았느냐에 있다.

Clover 는, 자세히 살펴보지 않아서 잘은 모르지만, refind 의 방식을 생각해보면 Btrfs 에 설치된 우분투를 찾지 못한 이유를 짐작은 해볼 수 있다.

우분투는 Btrfs 로 설치했을 경우, 루트 파티션을 @ 이라는 서브볼륨 아래에 생성한다. 즉, Ext4 는 Root 의 위치가 FS(File System)/ 가 되는데, Btrfs 는 FS/@ 가 된다.
부트 로더는 커널 이미지를 찾기 위해서 각 파티션의 /boot 디렉토리들을 검색한다. 그렇기에 ext4 로 된 파티션에 존재하는 우분투를 찾아낼 수 있었다.

그러나, Btrfs 는 사정이 좀 다르다. Btrfs 라면, /boot 가 아니라 /@/boot 를 찾아야 하는데, 아마도 Clover 에는 이런 설정이 없는 모양이다. refind 는 @ 를 자동으로 찾게끔 프로그램했다고 본 듯 한데.. (그랬으니 잘 찾겠지.)

그러나, /@/boot 를 자동으로 찾았다고 해도, 커널에 root 디렉토리를 인식시킬 때 또 오류가 발생한다. 이를 방지하기 위해서 refind 는 refind_linux.conf 파일을 이용해서 다음과 같은 선택사항을 입력해줘야 한다.

"Boot with standard options"  "root=UUID=xxxxx ro rootflags=subvol=@ quiet splash vt.handoff=7"

rootflags=subvol=@ 이 부분이 없다면, 결국 리눅스는 부팅에 실패하게 된다.
이걸 넣어주려면, Clover 의 config.plist 를 수동 편집해야 한다.

정리하자면 이렇다.

  • /@/boot 를 인식시키기 위해서, Clover 의 config.plist 에 해당 부분을 추가해줘야 한다.
  • rootflags=subvol=@ 역시, config.plist 편집이 필요하다.

‘편집’이라고 표현했지만, 이건 정확한 커널이미지명을 Clover 에게 알리는 작업이다. ‘어느 위치에 있는 리눅스 커널을, 어떤 선택사항을 줘서 부팅시키라’는 명령을, config.plist 에 수기(手記)로 입력해줘야 한다.

이러면 Btrfs 로 부팅이 가능은 한데..
여기엔 한가지 문제점(귀찮음!)이 있다.

refind 의 경우, 리눅스 커널이 판올림 되었을 때, 가장 최신판으로 자동 부팅시켜준다. 사실, refind 는 최신판(판본이 높은) 커널을 인식하는 게 아니고, 커널 이미지 중 가장 최신 날짜로 기록된 파일을 부팅시켜준다.

그런데.. 위와 같이 커널을 콕! 지정하여 Clover 에 등록시켜 놓으면, 커널 판올림이 되었을 때 config.plist 를 또 수정을 해줘야 한다.
이게 자주 있는 일은 아니지만, 그래도 살짝 귀찮은 일이긴 하다.

자.. 해결책은?

Clover 와 Btrfs : Set Default Subvolume

우분투 Btrfs 의 root 디렉토리인, @ 을, Default Subvolume 으로 만들어주면, 위 모든 문제가 한번에 풀린다.

우분투의 기본 서브볼륨은, 파일시스템 루트, 즉 ID 5 인 최상위 디렉토리로 설정되어 있다.
(아래 작업은, 오류 발생 가능성이 있으므로, USB Live Disk 로 부팅한 뒤 실행하는 편이 좋겠다. 이렇게 되면 해당 파티션을 특정 디렉토리에 마운트하고 작업해야 하므로, 아래에 나온 디렉토리는 달라져야 한다. 즉, / 가 아니고 /mnt 등으로.)

# btrfs subvolume get-default /
ID 5 (FS_TREE)

# btrfs subvolume list /
ID 259 gen 4556 top level 5 path @

여기서, subvolume @ 을 디폴트로 바꿔준다.

# btrfs subvolume set-default /@
<아무 문구도 출력되지 않는다.>

# btrfs subvolume get-default /
ID 259 gen 4556 top level 5 path @

작업 완료. default subvolume 이 ID 5 에서 ID 259 로 변경되었음을 확인할 수 있다.
이제 Clover 는 Btrfs 에 설치된 우분투를 아무런 문제없이 찾아낼 수 있다.

Clover 가, 모든 커널을 찾아서 목록에 올린다?

이 부분에 대해선, Clover Wiki 를 참고했다.

우분투는 보통 커널 3개 정도를 유지하는 듯 하다. (apt autoremove 를 하지 않아도 이렇던가??) 이 때, Clover 는 모든 커널 이미지를 찾아서 OS 목록에 올려준다.
의미도 없고, 지저분해서 선택하기에도 불편하다.

이 ‘쓸데없음’을 지우기 위해, 드디어 config.plist 를 편집할 시기가 왔다. macOS 에서 Clover Configurator 를 사용해도 되고, 우분투라면 그냥 /boot/efi/EFI/CLOVER/config.plist 를 편집하면 된다. 다만, 이 위치로 이동하려면 root 관리자 권한이 필요하므로, sudo -i 를 사용하는 편이 좋다.
또는, macOS 에서 Clover Configurator 를 사용해도 된다. (이건 최근 웹으로도 있는 듯 한데..)

다음과 같이 config.plist 를 수정한다.

      <key>GUI</key>
        <dict>
                <key>#ScreenResolution</key>
                <string>1920x1080</string>
                <key>Custom</key>
                <dict>
                        <key>Comment</key>
                        <string>Windows Entries</string>
                </dict>
                <key>Hide</key>
                <array>
                        <string>Preboot</string>
                </array>
                <key>Mouse</key>
                <dict>
                        <key>Enabled</key>
                        <false/>
                </dict>
                <key>Scan</key>
                <dict>
                        <key>Kernel</key>
                        <string>MostRecent</string>
                        <key>Linux</key>
                        <true/>
                </dict>
                <key>Theme</key>
                <string>aabb</string>
        </dict>

Scan key 부분을 추가하고, Kernel 을 MostRecent/Newest 중 하나로 설정한다. (Wiki 를 참고했다.) 여기서 선택가능한 인자 중, 몇개만 추려보면 다음과 같다.

  • Newest – newest file modification date (rEFInd 와 같다.)
  • Oldest – oldest file modification date
  • First – first matching
  • Last – last matching
  • MostRecent – most recent version
  • Earliest – earliest version

Newest 는 Clover Configurator 로는 설정할 수 없다. 수동으로 넣어줘야만 한다. 다만, MostRecent 와 거의 같은 동작을 하므로, 굳이 Newest 를 택할 이유는 없을 듯 하다.
rEFInd 도 이 방식을 택하고 있는데, 이 때문에 가끔 최신 커널이 선택되지 않을 때가 있다. 커널 업그레이드 작업을 하다가, 가끔 예전 커널이 최신 커널보다 타임스탬프가 늦게 찍히는 경우가 있는데, 이럴 경우엔 그 커널로 부팅이 되는 경우가 있다.

그 외에, First, Last 등이 있는데, 커널이 여러개 있을 때 어떤 순서로 뭐가 처음이고 뭐가 끝인지는 모르겠다. 판번호 순은 아닌게 확실한데.

부록 : 수동으로 Clover 에 OS 추가.

자동으로 검색하지 못할 경우, 또는 특별한 옵션이 필요할 경우, config.plist 를 편집하여 다음과 같이 새로운 항목을 넣어줄 수 있다.

 <key>GUI</key>
        <dict>
                <key>#ScreenResolution</key>
                <string>1920x1080</string>
                <key>Custom</key>
                <dict>
                        <key>Comment</key>
                        <string>Windows Entries</string>
                        <key>Entries</key>
                        <array>
                                <dict>
                                        <key>Arguments</key>
                                        <string>initrd=\boot\initrd.img-5.0.0-7-generic root=UUID=파티션의 UUID ro</string>
                                        <key>Disabled</key>
                                        <false/>
                                        <key>Ignore</key>
                                        <false/>
                                        <key>Path</key>
                                        <string>\boot\vmlinuz-5.0.0-7-generic</string>
                                        <key>Title</key>
                                        <string>Kubuntu</string>
                                        <key>Type</key>
                                        <string>Linux</string>
                                        <key>Volume</key>
                                        <string>파티션의 PARTUUID</string>
                                </dict>
                                <dict>
                                        <key>Arguments</key>
                                        <string>initrd=\@\boot\initrd.img-4.18.0-20-generic root=UUID=파티션의 UUID ro rootflags=subvol=@</string>
                                        <key>Disabled</key>
                                        <false/>
                                        <key>Ignore</key>
                                        <false/>
                                        <key>Path</key>
                                        <string>\@\boot\vmlinuz-4.18.0-20-generic</string>
                                        <key>Title</key>
                                        <string>KDE Neon Btrfs</string>
                                        <key>Type</key>
                                        <string>All</string>
                                        <key>Volume</key>
                                        <string>파티션의 PARTUUID</string>
                                </dict>
                        </array>
                </dict>
                <key>Hide</key>
                <array>
                        <string>Preboot</string>
                </array>
                <key>Mouse</key>
                <dict>
                        <key>Enabled</key>
                        <false/>
                </dict>
                <key>Scan</key>
                <true/>
                <key>Theme</key>
                <string>ThinkPad</string>
        </dict>

위 config.plist 로 성공을 하긴 했는데, 좀 확실하지 않은 부분이 있다.

  • Volume : 부팅하고자 하는 파티션의 PARTUUID 를 넣어준다. (blkid 로 확인 가능) 대문자로 넣어줘야 제대로 작동하는 듯 하다. (확실하진 않다.)
  • Path : vmlinuz 파일의 절대경로를 넣어준다.
  • Arguments : initrd 파일의 절대경로, 커널 옵션등을 넣어준다. 여기에 쓰는 UUID 는 어떤 것이든, 지시자(root=PARTUUID=, 또는 root=UUID= 등등)와 함께 적절히/정확히 넣어주면 된다.

위 Kubuntu 는 Ext4 에 설치됐고, KDE Neon Btrfs 는 말 그대로 Btrfs 에 설치되었다. 단, set-default 는 따로 하지 않은 상태다.

Volume 에 쓰이는 PARTUUID 는, macOS 의 Clover Configurator 에서 해당 항목을 보면, 드랍 다운 메뉴로 UUID 를 선택할 수 있게끔 되어 있다. 이렇게 선택해서 나오는 UUID 는 PARTUUID 이다. 아마도, Clover 에서는 PARTUUID 만을 인식하는 모양이다.

다만, Argument 에서 수동으로 넣어줘야할 UUID 는, Clover 입장에선 사용자가 입력한 값을 그대로 넘겨주는 일만 하기 때문에, UUID 를 넣어도 관계는 없다.

** Clover 가 자동으로 찾아 메뉴에 등록한 리눅스의 부트 옵션(Space 키로 선택)을 보면, root=/dev/disk/by-partuuid/xxxx 등으로 모두 PARTUUID 만 사용하고 있다. 그냥 UUID 는 인식하지 못하는 듯 하다.

이렇게, 또 하나의 거대한(?) 꽃삽질(?)이 이렇게 끝이 났다!


크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
One Comment

안녕하세요. 글 남겨주셔서 고맙습니다.