개요
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"
현상
자 저는 위와 같은 화면이 떴습니다.
UEFI: SanDisk, Partition 2
: 부팅용 usb 입니다. Ventoy 를 이용해 부팅용으로 만들어두었던 것입니다. 추후에 언급하겠지만, 이 안에 Pop!_OS 라이브 디스크, Super Grub2 Disk, Boot Reapir Disk 등이 들어있습니다. 얘는 ssd에서 부팅을 못잡는 문제와는 전혀 관계가 없습니다.Windows Boot Manager (250GB)
윈도우 부팅됩니다. 잘 됩니다.ubuntu (250GB)
: 왜인지는 모르겠지만 윈도우가 깔려있는 ssd 에 우분투 부트로더가 장착되어 있습니다. 실행시키면 아래에서 이야기할 GRUB terminal 이 나옵니다.UEFI OS (1TB)
: 위와 마찬가지로 GRUB terminal 이 실행될 뿐입니다.pop (1TB)
: 마찬가지로 grub terminal 이 그냥 실행되고 맙니다.
자, GRUB terminal 이란?
이렇게 터미널로 나오고 뭐 아무것도 진행이 안됩니다. 직접 세팅을 해서 부팅을 해야 하는 것 같은데, 이건 누구도 원하는 결과가 아닙니다!
여러가지 안됐던 시도들
GRUB Terminal 에서 직접 부팅 시도하기
근데 그냥 안돼… 필자 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/
이것도 크게 도움은 되지 않았습니다.시키는 대로 다 했더니 그냥 에러만 뜰 뿐이었습니다… 후…
해결법
우선 부트로더가 동작하지 않는다는 말은, 기존에 설치되어 있었던 Pop!_OS 가 제대로 실행되지 않는다는 것인데, 그래서 Pop!_OS에 억지로 접속하여 뭔가 조치를 취해야 한다는 뜻입니다. 그래서 일단 Pop!_OS 에 접근하는 방법을 크게 두 가지로 나눌 수 있습니다.
- Live Disk 를 만들어 해당 디스크를 mount한 뒤 chroot 로 접속하는 방법
- Super Grub2 Disk 등으로 억지로 부팅시키는 방법
저는 결국 1. Live Disk 를 만들어서 접속했습니다.
그리고 이 해결법에서 중요한 점은, grub 와 관련된 세팅을 초기화해줘야 한다는 건데, 단순히 grub-efi-amd64
를 삭제하고 다시 설치하는 걸로는 부족했습니다. 그래서 더 확실한 방법이 초기화 방법이 필요했고, 글 어디에서도 나오지 않았던 방법으로 시도해본 결과 결국 성공했습니다. 바로 /boot/efi/EFI/
안에 있는, 불필요해 보이는 내용을 삭제하는 것이었습니다! 하지만 삭제하는 방법이 정말로 효능이 있는지는 근거가 명확하지 않으므로 조심스레 접근해주세요. 우선 아래 명령어들은, 위 링크에 나와있는 UEFI NVMe SSD 해결방법을 축약하고, 또 제가 추가한 단계도 있습니다. 적절히 비교해주세요.
- Live Disk 를 만든다.
- 그 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 aroundgrub-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
update-grub vs. grub-install? https://unix.stackexchange.com/questions/465189/update-grub-vs-grub-install/465207/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.
후기
거 참 힘드네요.