[Linux] GRUB Command Line을 이용하여 리눅스 수동 부팅하기

어제, 계속 사용하던 Ubuntu 18.04 LTS를 20.04 LTS 버전으로 업데이트의 계획을 수행하고 있었습니다. 사용했던 IDE 도구, vim과 환경 변수 설정 등을 모두 정리하고, 살펴보니 그다지 많은 설정 값이 적용되어 있지 않았습니다. 사용했던 노트북을 처분하고 새로 PC를 구입한 것이 어느 덧 3개월 정도 되어갔는데, 그 때문에 20.04 릴리즈가 나오기 전까지 기존의 18.04를 설치하고, 간단한 셋팅만 하고 임시 방편으로 사용하기로 했던 것입니다.

어차피 거의 모든 셋팅을 다시해야 했기 때문에 과감하게 새로 설치를 하기로 마음 먹고, Ubuntu Official 홈페이지에서 Ubuntu Desktop 20.04 iso 이미지를 다운로드 받고, iodd를 사용하여 클린 설치를 하였습니다.

20.04 버전 설치시 가장 마음에 들었던 것은 바로 이러한 설치 옵션이었습니다. 기존에는 설치를 하면, 잡다한 기본 게임과 기본 패키지들이 깔리게 되어, 해당 의존성을 걸러내는 데, 매우 복잡한 과정을 거쳐야 했기 때문입니다.

그래서 가장 기본적인 Minimal Installation을 클릭하여, 클린 설치를 진행하였습니다.

 

 

GRUB Command Line

그런데, 문제가 발생하였습니다. 설치는 성공적으로 진행되었지만 자동으로 설치된 우분투 경로에 부팅되지 못하고, GRUB이 커맨드 라인을 띄우면서, 커널 이미지와 Root File system을 사용할 수 있는 이미지를 알려달라고 외치는 것입니다.

리눅스의 부팅 순서를 떠올려보면, GRUB을 로드한 다음에는 커널의 이미지를 로딩해야 하지만, 지금 GRUB이 커널의 이미지를 찾지 못한 듯한 뉘앙스입니다.

이를 확인하기 위해, set 명령어를 이용해봤습니다. set 명령어는 지금 현재 GRUB이 어느 root(부팅 경로)를 보고 있고, 지금 그 경로에 우분투 리눅스가 설치된 디스크 혹은 파티션인지를 알 수 있습니다.

grub> set

set을 입력해보니, root가 (hd1, gpt2)를 가리키고 있었습니다. 하지만 이 곳은 Windows 10이 설치되어 있는 파티션이었고, 여기에는 리눅스 커널 이미지가 없기 때문에 GRUB이 더 이상 부팅을 진행하지 못했던 것이군요.

왜 이런 일이 발생한 것일까? 일단, Ubuntu 20.04 설치 중에 발생한 사고인 것으로 보입니다. 환경에 따라 다를 것이라고 생각하지만, 일단 저는 Ubuntu 운영체제와 Windows 10을 같이 사용하고 있는데, 두 운영체제는 물리적으로 다른 디스크를 사용하고 있고, 설치했을 때 부팅 포인트를 본래의 우분투 물리 디스크로 진행했음에도 불구하고, 이런 일이 발생한 것입니다.

사실 이런 문제는 파티션을 수동으로 구성했을 경우 많이 생기게 됩니다. 윈도의 경우, 파티션을 수동으로 구성할 때, EFI나 Recovery 파티션곽 같은 시스템 파티션을 설치 매니저가 자동으로 잡고, 진행하게 됩니다. 이러면 자신의 부트 파티션이 어느 쪽에 있는지가 쉽게 찾아낼 수 있기 때문에 물리적으로 2개의 디스크를 구성한다고 하더라도, 이러한 문제가 발생하는 경우가 거의 없습니다.

그러나 우분투 리눅스에서는 수동으로 파티션을 구성하면, 모든 것이 사용자의 지침대로 이루어집니다. 마운트 포인트부터 전부 다 그렇죠. EFI의 경우에는 수동으로 EFI 파티션을 잡아야 하고, 그렇지 않으면 위의 상황처럼 EFI 이미지 등을 수동으로 GRUB을 통해 잡아줘야 하게 되기도 합니다.

 

 

수동으로 부팅하는 방법

GRUB이 리눅스의 커널 이미지를 이용하고, 초기 파일 시스템 이미지를 RAMDISK에 로드하기 위해서는 두 가지 파일이 필요합니다. 한 가지는 vmlinuz이고, 또 다른 한 가지는 initrd.img 파일입니다. 이 두 가지만 설정을 잘 해준다면, 어렵지 않게 리눅스를 수동 부팅시킬 수 있습니다.

grub> ls

먼저 GRUB이 읽고 있는 내 컴퓨터의 디스크 정보를 먼저 확인해봅니다. 여기에서 자신이 어느 쪽에 리눅스를 설치했는지를 알아야 합니다.

잘 모르겠다면, 각 디스크별로, ls 명령어를 사용하는 방법이 있습니다.

grub> ls (hd0,gpt1)/boot

보통 우분투의 경우, /boot 경로에 커널 이미지들이 들어있습니다. 따라서 각 포인트 별로 ls 명령어를 이용해 vmlinuz와 initrd 파일들이 있는지 확인해줍니다.

grub> set root=(hd0,gpt1)

확인이 다 되었다면, root 경로를 해당 디스크로 바꿔줍니다.

grub> linux /boot/vmlinuz root=/dev/nvme0n1p1

리눅스의 커널 이미지 경로를 linux 명령어를 넣어주고, 최상위 마운트 경로가 있는 dev 경로를 입력해줍니다. 만약, 디스크 번호가 잘못 매겨질 경우, 리눅스가 제대로 부팅되지 않고, busybox가 실행될 것입니다.

grub> initrd /boot/initrd.img

마지막으로 리눅스 실제 루트 파일 시스템 마운트를 위해 사용할 초기 마운트 파일 시스템 이미지 경로를 정해줍니다.

grub> boot

이제 boot 명령어를 작동시키면, 수동 부팅이 완료됩니다.

 

 

마치며...

아주 오랜만에 작성해보는 리눅스 글입니다. 매일 리눅스를 사용하면서 리눅스에 대한 글을 거의 올리지 않는 편인데, 물리적인 환경이나 설정 값에 따라 너무나 많은 상황을 고려해야 하기 때문에 일반적인 글을 작성하기 어렵다는 생각을 가지고 있었고, 그렇기 때문에 이 글을 적는 데도 많은 망설임이 있었습니다.

그러나, 재밌고 유익한 글을 작성하기에는 부적합할 수 있어도, 누군가 이 글을 필요할 수 있지 않을까 라는 것을 생각해보며, 가능한 많은 상황을 고려하여, "이 명령어는 이렇게 써야 한다." 라는 부가 설명을 드리며 쉽게 쓰려고 노력하였습니다.

여담으로 이번 우분투 20.04 릴리즈는 LTS임에도 불구하고, 버그들이 좀 많이 있습니다. 아무래도 업데이트를 너무 서두르지 않았나 라는 개인적인 의견입니다. 혹시라도 20.04의 업데이트를 염두해두고 계신 분들이 보고 계신다면, 차후 3~4개월 정도 지난 후에 업데이트 하시는 걸 조심스레 추천드립니다..

 

comments powered by Disqus

Tistory Comments 0