2019/04/24

Grub rEFInd chainloading


Mac PC를 사용하고 있지만 정작 macOS는 늘 방치해 왔는데 iPhone 파일들을 정리하려다 보니 macOS만 한게 없기 때문에 다시 macOS를 돌보기로 했다. 중간에 Recovery 파티션을 삭제했었는데 그 후로 OS를 Upgrade해도 다시는 Recovery 파티션을 생성해 주지 않더라. Recovery Partiton이 없는 상태에서 macOS에 문제가 생겨도 인터넷으로 macOS를 쉽게 설치할 수 있는 것은 Mac의 큰 장점 중 하나이다. 예전에 갖고 놀다가 날려서 어쩔 수 없이 High Sierra를 인터넷으로 설치한 채 방치해왔다. iMessage 동기화가 잘 안돼서 OS Upgrade를 했는데 10.13.4까지만 되고 10.13.6 버전은 설치하다가 파티션을 건드리면 Windows로 부팅할 수 없다는 메시지를 뿌리고는 Upgrade 할 수 없는 상황이 돼 버렸다. 기왕 이렇게 된거 Recovery Partiton도 만들겸 따끈 따끈한 Mojave(10.14.4)로 clean install을 하기로 했다.

모하비(Mojave) Clean 설치 후 ......

새로 설치하려면 8GB 이상의 USB가 필요한데 USB 외장하드를 사용해도 된다. 참고로 외장하드에 macOS의 DiskUtility로 GPT 파티션을 생성하면 200MiB의 EFI System Partition(ESP)을 기본으로 생성하더라. 아무튼, Mac OS 확장(저널링) 파티션(hfs+)을 추가해서 설치 이미지를 복사하면 재 부팅 후 <Option>(= <Alt>) 키를 사용해서 외장하드로 부팅해서 모하비를 설치할 수 있다. 그런데 High Sierra 이후에 macOS 기본 파일시스템이 hfs+에서 apfs로 바뀐 것이 생각나서 인터넷을 뒤져보니 High Sierra에서는 SSD일 때만 hfs+를 apfs(Apple File System)로 자동 변환했는데 모하비 버전부터는 HDD도 무조건 apfs가 기본이 되었단다. 그래서 설치 전에 기존의 hfs+ 파티션을 삭제하고 apfs 파티션을 새로 생성해서 모하비를 설치했다. 모하비 설치 방법은 인터넷에서 쉽게 찾을 수 있기 때문에 따로 정리할 필요는 없어 보인다. 참고로, 나처럼 Mac/iPhone에서 backup 파일이 5GB가 안될 경우에는 iCloud를 사용하면 엄청 편하다. 모든 것을 iCloud에 올려 놓고 icloud.com에서 Backup이 잘됐는지 확인하고 나서 macOS를 설치하면 설치 후에 모든 것이 예전처럼 복원된다. 물론 5GB이상인 경우에도 애플에 추가 비용을 지불하면 된다.

설치 후 재 부팅하면 macOS로 기본 부팅이 되기 때문에 우분투로 부팅하려면 부팅시에 Option키를 눌러서 EFI 아이콘을 선택해야 한다. 그런데, Recovery Partition으로 부팅할 수 있는 icon이 안보인다. 설치가 안됐는지 확인하기 위해 모하비로 부팅 후에 터미널에서,

$ diskutil list

해 보니 APFS container 밑에 분명히 Recovery Partition이 보인다. 혹시나 해서 부팅 시에 <Command>(= <Super> = <Windows>) + <R> 키를 사용했더니 Recovery Partition으로 부팅이 잘 된다.

흠, 이번에는 우분투로 부팅해서 NVRAM 부팅 설정이 비뀐게 있는지 확인하기 위해,

$ efibootmgr -v

로 확인해 보니 부팅 순서를 포함해서 바뀐 것이 없었다. 이게 약간 의아스러운 점인데 기존에 Grub으로 먼저 부팅하도록 설정된 상태이기 때문이다. 아마 macOS를 upgrade 하면서 firmware 설정도 바뀌었기 때문으로 추정된다. 우분투로 먼저 부팅하도록 기존의 순서대로 다시 아래와 같이 해 주고 재 부팅해 보았다.

$ sudo efibootmgr -o 0000,0001,0080

우분투 Grub으로 부팅이 잘 된다. 이번에는 우분투 Grub에 추가했던 macOS 메뉴 엔트리로 부팅해 보았다. 부팅이 안될 것으로 예상했는데 역시나 안된다. apfs 파일 시스템이 나온지 얼마 안돼서 Grub에 apfs module이 없기 때문이다. 리눅스에서 apfs 파일 시스템 지원 부분은 좀 시간이 걸리겠지만 조만간에 문제가 해결되리라 예상한다. 다행히, apfs 파일시스템은 apfs-fuse를 사용하면 리눅스에서 Read-only로 mount해서 사용할 수 있더라. 다만, Grub에서 macOS로 부팅할 수 있는 수단은 추가해야 한다. rEFInd를 Grub에서 chainloading 해 주면 문제가 해결된다.

Grub에서 rEFInd chainloading

사실, rEFInd만을 사용해도 macOS, 우분투, Windows를 모두 부팅할 수 있기 때문에 현재 apfs 모듈이 지원이 되지 않는 상황에서는 Grub을 사용하는 것이 최선은 아니다. macOS를 사용하지 않는 환경에서도 rEFInd를 기본으로 사용하는 사용자들도 많다. 하지만, OS 별 Upgrade가 원활히 동작하도록 하기 위해서는 모든 기본 설정이 정상 동작하도록 하는게 좋다. 더구나 boot manager/loader 들이 서로 chainloading이 되도록 해 주면 부팅 환경이 매우 쾌적해지고, 혹시나 어느 놈이 망가져도 다른 놈으로 부팅해서 문제를 해결할 수 있게 된다.

아무튼 최신 rEFInd-bin-0.11.4.zip 파일을 다운로드 받아서 압축해제 후 설치 폴더에서,

$ sudo refind-install

하면 우분투 또는 macOS에서 rEFInd가 ESP 파티션에 설치되고, rEFInd가 default boot loader가 된다. default boot loader라는 의미는 부팅 시에 별 다른 키를 누르지 않으면 rEFInd로 부팅한다는 의미이다. 즉, Grub을 대체해 버린다. 뭐 이렇게 사용하는 것이 더 편할 수도 있지만, 개인적으로 우분투 사용자 관점에서는 Grub이 Default가 되도록 하는 게 낫다고 본다.

Grub이 default boot loader가 되도록 하려면, efibootmgr -v 명령으로 ubuntu(Grub) boot entry를 확인 한 후, efibootmgr -o 명령으로 ubuntu가 맨 앞에 오도록 부팅 순서를 바꾸면 된다. 이 경우에 rEFInd Grub 부팅 메뉴 엔트리를 아래와 같이 만들어서 우분투의 /etc/grub.d/40_custom 파일에 추가해 주고 나서,

menuentry "rEFInd" {
    search --file --no-floppy --set=root /EFI/refind/refind_x64.efi
    chainloader (${root})/EFI/refind/refind_x64.efi
}

$ sudo update-grub

한 후에 재 부팅해서 Grub에서 rEFInd 메뉴를 선택해서 사용할 수 있게 된다.

참고: macOS에서 rEFInd 설치

기존에 rEFInd를 사용해 왔는데 macOS를 upgrade했거나 clean install 했다면 파티션 정보가 바뀌기 때문에 rEFInd를 다시 설치해야 한다. 그리고, 버전마다 버그 개선 사항이 있기 때문에 가능한 최신 버전을 사용하는 것이 좋다. 이는 우분투를 사용하지 않는 일반 macOS 사용자들에게도 일반적으로 적용된다. 또한, macOS에서 apfs 파일 시스템을 채택했기 때문에 rEFInd 최신 버전에서는 기본적으로 ESP 파티션에만 설치된다. 즉, 이후로는 macOS에서 rEFInd를 설치하든 우분투에서 rEFInd를 설치하든 큰 차이가 없다는 뜻이다. 단, 최근의 macOS에서 rEFInd를 설치하려면 반드시 Recovery 파티션으로 부팅해서 터미널에서,

$ csrutil disable

명령으로 SIP 모드 사용해제하고 나서 다시 Recovery 파티션으로 부팅한 후에야 rEFInd를 설치할 수 있다.

$ refind-install
$ csrutil enable

명령으로 SIP 모드를 다시 사용하도록 해준 후 재 부팅하면 된다.

참고: Mac에서 <Option> 키 사용시 rEFInd 사용

우분투를 사용할 경우 이 방법을 권하고 싶지는 않다. Mac PC에서 부팅 시 <Option> 키를 눌렀을 때 macOS Icon과 EFI Boot Icon 두 개가 나타나는데 EFI Boot Icon은 EFI 기본(fallback) boot loader로 부팅하도록 해 준다. 즉, ESP 파티션의 /EFI/Boot/bootx64.efi 파일로 부팅한다. 이 파일을 원하는 boot loader/manager로 교체해도 된다는 뜻이다. /EFI/refind/refind_x64.efi 파일을 /EFI/Boot/bootx64.efi로 복사해서 사용하면 <Option> 키를 사용해서 부팅시 rEFInd를 선택할 수 있다. 다만, 이렇게 하면 text mode의 rEFInd가 뜬다. /EFI/refind 폴더 내의 파일들을 /EFI/Boot 폴더에 복사해 주면 OS 별 Icon들을 사용할 수 있을지도...

참고로, 우분투를 설치하거나 Grub package가 update 되면 /EFI/Boot/bootx64.efi 파일에 /EFI/ubuntu/shimx64.efi 파일을 복사해 놓는다. 언제부터인지 우분투에서 Secure Boot를 사용하지 않는 경우에도 grubx64.efi 파일 대신 shimx64.efi 파일을 사용하고 있더라. 문제는 최신 rEFInd에 버그가 있어서 shimx64.efi로 부팅할 수 있는 방법이 없다. 무조건 우분투는 grubx64.efi 또는 raw kernel만 선택할 수 있다. 문제는 Grub chainloading이 안된다는 것이다.

우분투에서 macOS apfs 파일 시스템 사용

참고로, 이전의 Mac extended 파일 시스템(hfs+)은 hfsprogs 패키지만 우분투에 설치해 주면 mount/umount는 물론이고 gparted에서 format도 할 수 있었다. 앞서 리눅스에서 apfs-fuse를 사용하면 macOS의 apfs 파일 시스템을 사용할 수 있다고 했는데 git 사이트의 설치 방법을 따라가면 된다. 다만, 우분투 19.04에서 제대로 컴파일 하려면 아래 두 개의 패키지를 추가로 설치해 주면 된다.

$ sudo apt install zlib1g-dev libfuse3-dev

컴파일 후에 build 폴더에서 binary 파일만 /usr/local/bin에 복사해 두면 편리하다.

$ sudo fdisk -l /dev/sda

명령으로 macOS apfs 파티션을 확인하고 나서,

$ sudo apfs-fuse -o allow_other /dev/sda2 /mnt

와 같이 mount 하고,

$ sudo umount /mnt

와 같이 unmount 할 수 있다. mount는 read-only로만 할 수 있기 때문에 apfs 파일 시스템을 리눅스에서 망가뜨릴 염려는 안해도 될 것이다.

참고로, apfs는 btrfs와 매우 유사한 파일 시스템이다. Copy on write 방식을 사용하기 때문에 큰 파일 복제시 매우 빠르다. 또한, snapshot, 압축, encryption 등이 지원되는 것도 btrfs와 유사하다. SSD에서는 파일 Block들이 연달아 있지 않아도 되기 때문에 성능이 무척 좋다. HDD인 경우에는 자동 defragmentation 방식을 사용함으로써 성능문제를 해결하고 있다. btrfs는 Oracle과 SUSE 리눅스가 적극적으로 채택하고 있지만 Redhat이 포기한 후로 다른 리눅스 벤더들이 적극적으로 채택하고 있지는 않다. MS가 NTFS를 대체하려던 ReFS도 유사한 파일 시스템인데 그리 성공적이진 않은 모양이다. apfs는 아예 hfs+를 대체하는 것이니까 애플이 심혈을 기울일 수 밖에 없을 것이다. apfs가 잘 정착한다면 리눅스에서 btrfs도 보편화되리라 본다. 반대로, 어쩌면 btrfs가 나름 잘 정착했기 때문에 애플이 apfs를 채택한 것인지도 모른다.

댓글 없음:

댓글 쓰기