[Pop!_OS] 부트로더 초기화

개요

ssd 가 잘 인식이 안되서 잘 꼽혀있던 두 개의 자리를 바꿨습니다. 그랬더니 거짓말처럼 Pop!_OS 가 메뉴에서 사라졌습니다. 이게 무슨 일이죠.. 이제 리눅스를 부팅할 수가 없었습니다…

Pop!_OS 부팅이 제대로 안되는 문제를 발벗고 해결하기 위해 나섰습니다. 본래 설치를 하면 Pop!_OS 는 systemd-boot 로 부팅된다고 합니다. (아래 인용문 참조) 그게 무슨 소리일까요? 저도 모릅니다. GRUB 도 뭔지 모릅니다. 버전이 GRUB2 와 아닌 것이 있는 것 같지만 차이점도 모릅니다. 이 문제를 어떻게 극복해나가야 할까요? 인터넷에 나온 흔한 방법으로는 도무지 해결이 되지 않는데 운영체제론에서 부팅 관련된 부분을 처음부터 공부해야 하는 운명인 걸까요?

On a fresh install of Pop!_OS 18.04, systemd-boot is used rather than the GRUB bootloader, and the following instructions do not apply please refer to the systemd-boot section on this page.

https://support.system76.com/articles/bootloader/

필자의 기기 환경은, AMD64 CPU 를 사용중이고, UEFI 부팅 환경입니다. UEFI 부팅 인지 고전적인 BIOS 부팅인지 확인하는 방법은 아래 명령어를 터미널에 쳐보면 됩니다. (리눅스 명령어입니다.) 그리고 ssd가 NVMe 인터페이스에 장착되어 있음에 따라 /dev 안에서 보이는 장치 이름은 nvme 와 관련되어 있습니다.

[ -d /sys/firmware/efi ] && echo "Installed in UEFI mode" || echo "Installed in Legacy mode"

현상

부팅 화면

자 저는 위와 같은 화면이 떴습니다.

  1. UEFI: SanDisk, Partition 2 : 부팅용 usb 입니다. Ventoy 를 이용해 부팅용으로 만들어두었던 것입니다. 추후에 언급하겠지만, 이 안에 Pop!_OS 라이브 디스크, Super Grub2 Disk, Boot Reapir Disk 등이 들어있습니다. 얘는 ssd에서 부팅을 못잡는 문제와는 전혀 관계가 없습니다.
  2. Windows Boot Manager (250GB) 윈도우 부팅됩니다. 잘 됩니다.
  3. ubuntu (250GB) : 왜인지는 모르겠지만 윈도우가 깔려있는 ssd 에 우분투 부트로더가 장착되어 있습니다. 실행시키면 아래에서 이야기할 GRUB terminal 이 나옵니다.
  4. UEFI OS (1TB) : 위와 마찬가지로 GRUB terminal 이 실행될 뿐입니다.
  5. pop (1TB) : 마찬가지로 grub terminal 이 그냥 실행되고 맙니다.

자, GRUB terminal 이란?

grub terminal

이렇게 터미널로 나오고 뭐 아무것도 진행이 안됩니다. 직접 세팅을 해서 부팅을 해야 하는 것 같은데, 이건 누구도 원하는 결과가 아닙니다!

여러가지 안됐던 시도들

GRUB Terminal 에서 직접 부팅 시도하기

GRUB Rescue 를 쓰기

근데 그냥 안돼… 필자 ssd 는 SATA 인터페이스가 아니라 sda 가 아닌 nvme 이런 식으로 표시가 되는데, root 로 nvme0, nvme0n1, nvme1n1 등을 시도해보았지만 모두 되지 않았습니다. 그냥 장치를 찾을 수가 없다네요. sda 도 장치를 찾을 수가 없었습니다.. 에러가 폭발!

Super Grub2 Disk

https://www.supergrubdisk.org/super-grub2-disk/

Super Grub2 Disk 는 부팅용 iso 디스크이며, 기능은 현재 연결되어있는 장치에서 모든 부팅가능한 요소를 끄집어내는 데 있습니다. 애초에 Super Grub2 Disk 는 해결을 위한 툴은 아닙니다. 그냥 부팅 가능한 파일을 나열하고 고저 실행시켜볼 뿐인데, 이걸로 잘 작동한다면 이제 해결의 여지가 있는 것입니다. 이것조차 없다면 아예 부팅가능한 파일이 없는 것이니까요.. 하지만 어쨌든 이것도 해결 과정에서 사용해봄직 하니까 단단히 기억해두도록 합시다.

Boot Repair Disk

https://sourceforge.net/projects/boot-repair-cd/

이것도 크게 도움은 되지 않았습니다.시키는 대로 다 했더니 그냥 에러만 뜰 뿐이었습니다… 후…

boot repair disk 에러

해결법

우선 부트로더가 동작하지 않는다는 말은, 기존에 설치되어 있었던 Pop!_OS 가 제대로 실행되지 않는다는 것인데, 그래서 Pop!_OS에 억지로 접속하여 뭔가 조치를 취해야 한다는 뜻입니다. 그래서 일단 Pop!_OS 에 접근하는 방법을 크게 두 가지로 나눌 수 있습니다.

  1. Live Disk 를 만들어 해당 디스크를 mount한 뒤 chroot 로 접속하는 방법
  2. Super Grub2 Disk 등으로 억지로 부팅시키는 방법

저는 결국 1. Live Disk 를 만들어서 접속했습니다.

그리고 이 해결법에서 중요한 점은, grub 와 관련된 세팅을 초기화해줘야 한다는 건데, 단순히 grub-efi-amd64 를 삭제하고 다시 설치하는 걸로는 부족했습니다. 그래서 더 확실한 방법이 초기화 방법이 필요했고, 글 어디에서도 나오지 않았던 방법으로 시도해본 결과 결국 성공했습니다. 바로 /boot/efi/EFI/ 안에 있는, 불필요해 보이는 내용을 삭제하는 것이었습니다! 하지만 삭제하는 방법이 정말로 효능이 있는지는 근거가 명확하지 않으므로 조심스레 접근해주세요. 우선 아래 명령어들은, 위 링크에 나와있는 UEFI NVMe SSD 해결방법을 축약하고, 또 제가 추가한 단계도 있습니다. 적절히 비교해주세요.


  1. Live Disk 를 만든다.
  2. 그 Disk 에 접속하여 다음 명령어를 작성한다.
sudo mount /dev/nvme1n1p3 /mnt # /dev/nvme1n1p3 를 주 파티션으로 적절히 변경해주세요.
sudo mount /dev/nvme1n1p1 /mnt/boot/efi #/dev/nvme1n1p1 를 부팅용 파티션으로 적절히 변경해주세요.
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo cp -n /etc/resolv.conf /mnt/etc/ 

sudo chroot /mnt
sudo rm -r /boot/efi/EFI/BOOT && rm -r /boot/efi/EFI/pop # 그 외에 systemd 를 제외한 모든 폴더를 일일히 삭제해주세요!
sudo apt install --reinstall grub-efi-amd64 linux-generic linux-headers-generic
sudo update-initramfs -c -k all
sudo update-grub 
sudo grub-install /dev/nvme1n1 # 주 파티션과 부팅용 파티션의 바로 상위 이름으로 지정해주세요.

만약 Super Grub2 Disk 등으로 억지로 부팅하였다면 sudo rm -r /boot/efi/EFI/BOOT && rm -r /boot/efi/EFI/pop 부터 진행해보시면 되겠습니다.

아래는 필자의 디스크 상태(sudo parted -ls 의 결과)입니다. nvme1n1p3 에 Pop!_OS 주 파티션이 있고 nvme1n1p1 이 부팅용 파티션입니다. nvme0 은 윈도우가 설치되어 있습니다. 기타 명령어는 이 글의 최하단 유용한 명령어를 참조해주세요.

Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sda: 30.8GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  30.7GB  30.7GB  primary               boot
 2      30.7GB  30.8GB  33.6MB  primary  fat16        esp


Model: Linux device-mapper (crypt) (dm)
Disk /dev/mapper/cryptswap: 8589MB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags: 

Number  Start  End     Size    File system     Flags
 1      0.00B  8589MB  8589MB  linux-swap(v1)


Model: Samsung SSD 970 EVO 250GB (nvme)
Disk /dev/nvme0n1: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name                          Flags
 1      1049kB  524MB  523MB   ntfs         Basic data partition          hidden, diag
 2      524MB   628MB  104MB   fat32        EFI system partition          boot, esp
 3      628MB   645MB  16.8MB               Microsoft reserved partition  msftres
 4      645MB   224GB  224GB   ntfs         Basic data partition          msftdata
 5      224GB   225GB  581MB   ntfs                                       hidden, diag


Model: Samsung SSD 970 EVO 1TB (nvme)
Disk /dev/nvme1n1: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  578MB   577MB   fat32                 boot, esp
 2      578MB   9168MB  8590MB  linux-swap(v1)        swap
 3      9168MB  1000GB  991GB   ext4

유용한 명령어

  • sudo parted -ls 또는 sudo fdisk -l : 디스크등 장치의 종류를 확인할 수 있습니다.
  • efibootmgr -v: 현재 로딩되는 부트 로더들을 확인하실 수 있습니다. 처음 부팅 기기 설정할 때 볼 수 있는 화면과 동일합니다.
  • update-initramfs -c -k all : /boot 경로에 있는 initrd.img 파일을 갱신시켜줍니다. 이 파일의 역할은 저도 잘 모릅니다. 대충 부팅 과정에 필요한 녀석입니다. 다른 블로그 글 참조
  • grub-update : grub 설정 파일들을 갱신해줍니다. 아래 인용문 참조해주세요.
  • sudo install-grub : /boot/efi/EFI 폴더 내에 적절하게 부트 로더를 설치합니다. 마찬가지로 아래 인용문을 참조해주세요.

update-grub, at least in Debian and its relatives like Ubuntu, is basically just a wrapper around grub-mkconfig. So it creates/updates/regenerates the GRUB configuration, not the actual bootloader itself.

(중략)

With the UEFI GRUB, the main part of the GRUB bootloader will be located as a file in the EFI System Partition, typically as /boot/efi/EFI/<name of distribution>/grubx64.efi or similar. This bootloader pathname is stored in system NVRAM (= the place where BIOS settings are stored) in the UEFI boot variables. The main part of GRUB may be completely self-contained (and must be if Secure Boot is in use!) or it may load additional functionality as GRUB modules, typically from the /boot/grub directory of the Linux distribution it’s part of.

update-grub vs. grub-install? https://unix.stackexchange.com/questions/465189/update-grub-vs-grub-install/465207

후기

거 참 힘드네요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

Scroll to top