EFI 파티션 용량 확장(UEFI GPT EFI Partition Expand) GParted
윈도우 설치 디스크에 듀얼부팅으로 아치리눅스(Arch Linux) 설치 중, grub-install 진행 과정에서 "No space left on device" 에러 메세지를 만났습니다.
구글에서 "efi grub No space left on device"라고 입력해보면 수많은 해결 사례들이 나오는데, 윈도우10 설치 과정에서 생성되었던 100MB 용량의 EFI 파티션이 꽉 차면 이러한 문제가 생긴다고 하더군요.
▲ 윈도우로 부팅하여 "디스크 관리(diskmgmt.msc)"로 확인해 봤더니, 구글 검색에서 설명되는 것과 같은 상황이었습니다.
- https://unix.stackexchange.com/questions/497342/am-i-able-to-install-arch-linux-with-the-100mb-efi-partition-that-windows-10-had
- https://superuser.com/questions/1106092/how-to-enlarge-windows-10-efi-partition
- https://superuser.com/questions/1230741/how-to-resize-the-efi-system-partition
- https://wiki.archlinux.org/title/Dual_boot_with_Windows#Bootloader_UEFI_vs_BIOS_limitations
100MB EFI 파티션 문제 해결 방법들이 몇 가지 제안되고 있었는데, 위 링크 문서들을 보면
① EFI 파티션 용량 늘리기(resize) ② EFI 파티션에서 윈도우 부팅 구성요소 중 불필요한 Fonts 또는 language directories 삭제 ③ initramfs images 압축 등의 선택지가 있었습니다.
EFI 파티션 용량이 작으면 리눅스커널 백업본을 저장하지 못한다고 해요.
커널 업그레이드 이후 부팅이 안되면 백업본 커널로 되돌려서 부팅 복구를 하는데, 저장된 백업본이 없으면 아치리눅스 설치용 USB를 항상 챙기고 있어야 복구할 수 있으니까 귀찮겠죠? 그래서 "① EFI 파티션 용량 늘리기(resize)"가 근본적인 해결책인 것 같습니다.
- https://wiki.archlinux.org/title/EFI_system_partition
아치리눅스의 경우, early and/or buggy UEFI 환경이면 최소 512 MiB가 필요하다 하고, - https://wiki.archlinux.org/title/Installation_guide
최소 300MiB, 멀티 커널 체제는 1GiB 이상을 권장하고 있습니다.
그래서 저는 100MB EFI 파티션 용량을 1GB로 확장할 것입니다.
여러분께서는 최소 300MB 이상으로 정하면 될 것 같고요,
GPT 디스크 + UEFI 바이오스 환경 기준으로 설명합니다.
★ 준비물 : USB메모리 2개.
https://wiki.archlinux.org/title/EFI_system_partition#Typical_mount_points
https://wiki.archlinux.org/title/Systemd-boot#Installation_using_XBOOTLDR
▲ 사실, XBOOTLDR(Extended Boot Loader Partition) 기술을 이용해서 기존 100MB EFI 파티션을 끌어오는 식으로 구성한다면 EFI 파티션을 확장하지 않아도 된다고 합니다. 그런데 사례를 찾기가 힘드네요.ㅠㅠ
GParted 다운로드, 미디어 생성
파티션 수정 도구들이 윈도우용으로 많이 나왔는데, 라이선스 문제 없는 것이 좋아서 GParted로 진행했습니다.
▲ ISO 파일 다운로드 하세요.
(사실, https://ubuntu.com/download/desktop 우분투 데스크톱 ISO 이미지에 내장된 GParted를 써도 됩니다.)
▼ FAQ에 적혀 있듯이, GParted는 안전한 도구입니다.
(디스크를 마운트 해제한 상태에서 조작하기 때문에 문제 발생 가능성이 낮습니다.)
▲ 하지만 조작 중 UUID가 바뀌면 부팅이 안될 수 있기 때문에, 윈도우 설치용 USB를 부팅 복구 목적으로 준비하고 작업 시작하는 것이 좋습니다.
▼ 첫번째 USB 메모리를 PC에 꼽고,
※ 윈도우10 설치 USB 쉽게 만들기 : 파일 복사만으로(Rufus 없이)
▲ 위의 글을 참고하여 설치용 USB 제작해 두세요. Rufus든 balenaEtcher든 본인에게 편한 도구를 이용해도 됩니다.
▲ 두번째 USB 메모리를 PC에 꼽고, FAT32 파일 시스템으로 포맷 후 GParted ISO 파일의 내용을 전부 복사+붙여넣기 합니다.
GParted 미디어로 부팅
두번째 USB 메모리(GParted 미디어)로 부팅을 시도합니다.
▲ GParted Live (Default settings) 에서 엔터.
▲ Don't touch keymap 에서 엔터. 영문 키보드로 진행할 겁니다.
▲ 엔터.
33(기본값)은 US English 입니다.
▲ 엔터.
0(기본값)은 해상도/그래픽 환경(start X)을 자동으로 처리합니다.
EFI 주변 파티션, 오른쪽으로 이동(하나씩 처리)
▼ 부팅 직후 GParted 창이 자동으로 뜹니다.
우측 상단에서 디스크(SSD)를 선택합니다. 저는 /dev/sda 였습니다.
위 스크린샷을 보면 /dev/sda3 뒤에 미할당 공간(unallocated)이 많이 있음을 확인할 수 있습니다.
① /dev/sda3을 뒤쪽으로 900MiB만큼 밀고, ② /dev/sda2도 뒤로 900MiB만큼 밀면 /dev/sda1 뒤쪽에 900MiB의 여유 공간이 생기겠지요? ③ 이후 /dev/sda1(100MiB)을 900MiB만큼 확장하면 /dev/sda1 용량이 1000MiB가 될 것입니다.
이번 소제목에서는 ①, ②를 하나씩 처리하는 과정을 적겠습니다.
①, ②를 한꺼번에 처리하지 않고 하나씩 처리하는 이유는 실수 방지 / 문제 발생시 원인 파악이 수월하기 때문입니다.
우선, ① /dev/sda3을 뒤로 900MiB만큼 밀겠습니다.
▲ /dev/sda3 파티션을 클릭하고, Resize/Move 아이콘을 클릭합니다. (메뉴에서 Partition - Resize/Move 순으로 클릭해도 됩니다.)
▲ 앞쪽(preceding) 여유 공간(Free space)이 0으로, 뒤쪽(following) 여유 공간(Free space)이 28000으로 적혀 있습니다. 현재 파티션 용량은 유지할 것이기 때문에 New size는 그대로 놔둡니다.
▲ Free space preceding을 900으로 바꾸면 Free space following이 900만큼 줄어서 표시될 것입니다. Resize/Move 버튼을 클릭하여 대화창을 빠져나옵니다.
▲ 경고창이 뜨는데 OK 눌러줍니다. https://gparted.org/faq.php 알아 둡니다.
(윈도우 설치용 USB로 복구하면 되니까 두렵지 않습니다!)
▲ /dev/sda3 앞쪽에 900MiB unllocated(미할당) 공간이 생긴 것을 확인하고 "Apply All Operations" 버튼을 클릭합니다. (메뉴에서 Edit - Apply All Operations 순으로 클릭해도 됩니다.)
▲ 다시 한 번 묻습니다. Apply 버튼을 눌러 진행합니다.
▲ 기다립니다.
▲ All operations successfully completed 를 보고 Close 버튼을 눌러 빠져나옵니다. Details를 보니 grow(공간 뒤로 확장) -> move file(데이터를 약간 뒤로 밀어냄) -> shrink(앞쪽 공간 줄임) 순으로 진행되는 것을 알 수 있었습니다.
▼ 사실, Apply 전에 Ctrl+Alt+F2 눌러서 TTY 콘솔창 띄우고 sudo blkid 쳐서 UUID, PARTUUID 확보해 두었는데요,
▲ Apply 이후 돌아와서 sudo blkid 다시 쳐보니까 UUID, PARTUUID 동일하게 유지된 것을 확인할 수 있었습니다. 파티션 옮기는 것만으로는 바뀌지 않는가 봅니다.
다음으로, ② /dev/sda2를 뒤로 900MiB만큼 밀겠습니다.
▲ /dev/sda2 파티션을 클릭하고, Resize/Move 아이콘을 클릭합니다. (메뉴에서 Partition - Resize/Move 순으로 클릭해도 됩니다.)
▲ Free space preceding을 900으로 바꾸면 Free space following이 900만큼 줄어서 표시될 것입니다. Resize/Move 버튼을 클릭하여 대화창을 빠져나옵니다.
▲ 경고창이 뜨는데 OK 눌러 줍니다.
▲ /dev/sda2 앞쪽에 900MiB unllocated(미할당) 공간이 생긴 것을 확인하고 "Apply All Operations" 버튼을 클릭합니다. (메뉴에서 Edit - Apply All Operations 순으로 클릭해도 됩니다.)
▲ 다시 한 번 묻습니다. Apply 버튼을 눌러 진행합니다.
▲ All operations successfully completed 를 보고 Close 버튼을 눌러 빠져나옵니다. Details를 보니 grow(확장) -> move file(데이터를 뒤로 옮김) -> shrink(앞쪽 축소) 순으로 진행되는 것을 알 수 있었습니다. checking이 안 되었다는 경고가 뜨긴 했는데 문제될 부분은 아닌 것 같습니다.
▲ 이번에도 전/후로 Ctrl+Alt+F2 눌러서 TTY 콘솔창 띄우고 UUID 변화를 살폈는데, 변함 없는 것을 확인했습니다.
EFI 파티션 용량 확장 방법(GParted libparted 버그 우회, Expand)
▼ 이제 100MB 용량의 EFI 파티션을 확장할 차례입니다. 아래 스샷 기준 /dev/sda1 이지요.
▼ 그런데 ①, ② 과정과 비슷한 느낌으로 Free space following에 있던 900MiB을 New size로 단순하게 옮겼다가는...
▲ 진행이 안 됩니다 ( 0 of 1 operations completed ). grow partition은 통과 되는데 grow file system에서 막히더군요. libparted 에 문제가 있는 것 같죠?
구글에서 "efi libparted gparted"라고 입력해 보니 많은 문서들이 나오더군요.
- http://gparted-forum.surf4.info/viewtopic.php?id=17400
- https://bugzilla.gnome.org/show_bug.cgi?id=649324
- http://gparted-forum.surf4.info/viewtopic.php?id=17904
- http://gparted-forum.surf4.info/viewtopic.php?id=18048
문제의 원인 : libparted 버그.
256MB 미만인 FAT16/FAT32 파일 시스템의 크기를 조정할 수 없습니다(저용량 FAT32 파티션 컨트롤 불가.).
문제 해결을 위해 제안되는 방법은 두가지 정도가 있었습니다.
- EFI 파티션 내용 백업 -> EFI 파티션을 ext4 파일시스템으로 포맷 -> 파티션 크기 조정 -> 다시 FAT32로 포맷 -> 백업본에서 내용 복원.
- EFI 파티션 내용 백업 -> EFI 파티션 삭제 -> 큰 용량의 FAT32 파티션 생성 -> boot/esp로 플래그 지정 -> 백업본에서 내용 복원.
제 생각에는 파티션을 지우고 새로 만들면 UUID / PARTUUID가 바뀔 것 같습니다.
그래서 첫번째 방법으로 EFI 파티션 용량을 1GiB까지 확장해 보겠습니다.
Ctrl + Alt + F2 를 눌러서 TTY 콘솔창(터미널창)으로 전환합니다.
▼ 노란색 밑줄친 명령어들을 차례대로 입력하면 /dev/sda1 의 내용들이 /mnt/backup 경로에 백업됩니다.
▲ sudo mkdir /mnt/sda1
sudo mkdir /mnt/backup
sudo mount /dev/sda1 /mnt/sda1
sudo cp -rap /mnt/sda1/** /mnt/backup
sudo umount /mnt/sda1
Ctrl + Alt + F1 를 눌러서 GParted가 있는 GUI 창으로 돌아옵니다.
▲ /dev/sda1/ EFI 파티션을 ext4 파일시스템으로 포맷하고, 적용(Apply) 합니다. (메뉴에서 Partition - Format to - ext4 선택 후 Edit - Apply All Operations 순으로 클릭해도 됩니다.)
▲ ext4로 변환된 /dev/sda1/ EFI 파티션을 Resize/Move 메뉴를 통해 New size에서 1000MiB로 확장하고 "Apply All Operations" 버튼을 클릭합니다. (메뉴에서 Partition - Resize/Move 선택하여 조정 후 Edit - Apply All Operations 순으로 클릭해도 됩니다.)
▲ /dev/sda1/ (EFI system partition)을 fat32 파일 시스템으로 포맷하고 적용(Apply) 버튼을 누릅니다.
▲ /dev/sda1 EFI 파티션을 클릭하고 Partition - Manage Flags 메뉴로 진입합니다.
▲ boot, esp 체크하고 Close 버튼 눌러 빠져나오면 반영됩니다.
백업했던 기존 EFI 파티션 데이터를 비어 있는 /dev/sda1 EFI 파티션에 복사하여 복원할 차례입니다.
Ctrl + Alt + F2 를 눌러 TTY 콘솔창으로 들어갑니다.
▼ 노란색 밑줄친 명령어들을 차례대로 입력하면 /mnt/backup 의 내용들이 /dev/sda1 경로에 복원됩니다.
▲ sudo mount /dev/sda1 /mnt/sda1
sudo cp -rap /mnt/backup/** /mnt/sda1/
sudo umount /mnt/sda1
sudo rm -rf /mnt/sda1
sudo rm -rf /mnt/backup
(마운트 해제 후 /mnt/sda1 와 /mnt/backup 디렉토리를 삭제하였습니다.)
Ctrl + Alt + F1 를 눌러서 GParted가 있는 GUI 창으로 돌아옵니다.
▲ Refresh Devices 를 하세요. /dev/sda1 EFI 파티션 리사이즈와 데이터 복원이 잘 되었는지, boot/est 플래그 지정이 잘 되었는지 확인하고 PC를 끕니다.
GParted USB를 제거하고 PC를 켰을 때 부팅이 잘 된다면 끝입니다.
문제가 있다면 아래 링크 문서를 참고하여 해결합니다.