Ubuntu Grub: 특정 커널 사용하려면?

꼭 우분투에만 적용되는 내용은 아니지만, update-grub 을 사용할 예정이므로 제목에 Ubuntu 를 붙였다.

Grub 이 여러모로 맘에 들진 않지만, (그래서 refind 를 사용 중이지만) 눈에 보이지 않는 곳에 있는 서버(AWS 같은)를 사용할 땐, 혹시나 잘못될 가능성이 있기에 그냥 기본값인 grub 을 쓸 수 밖에 없다.

물론, 최악의 상황이 되어 부팅이 안되는 경우, 아마도 다른 인스턴스를 하나 만들고, 거기에서 이 디스크를 마운트한 뒤 문제를 수정하면 될 듯은 한데.. 번거롭고, 시간과 돈(다만 몇 푼이라도)이 드는 일이니, 가능한한 조심하는게 좋겠지.

굳이 서버의 커널을 바꾸려고 한 이유는, aws 커널보다 최신 커널이 기본값으로 등록되어 있기 때문이다.

** aws 커널이 뭐가 어떻게 다른지는 모른다. 그냥, aws 가 붙어있으니 조금이라도 더 안정감이 있지 않을까 싶어..

현재 AWS Lightsail 에서 제공하는 커널은 다음과 같다.

참고로, 현재 설치된 커널을 알아보려면 다음 명령을 사용한다.

sudo dpkg --list | egrep -i --color 'linux-image|linux-headers'

이 결과로 맨 앞 열에 ii, 또는 rc 가 나타날 수 있는데(아래 예 참고), 이 의미는 다음과 같다.

  • ii : ‘It should be installed and it is installed’
  • rc : ‘It’s removed/uninstalled but it’s configuration files are still there’

실제 사용 예는 다음과 같다.

$ dpkg --list | grep linux-image
ii  linux-image-4.15.0-1021-aws          4.15.0-1021.21                                  amd64        Linux kernel image for version 4.15.0 on 64 bit x86 SMP
rc  linux-image-4.15.0-1054-aws          4.15.0-1054.56                                  amd64        Linux kernel image for version 4.15.0 on 64 bit x86 SMP
rc  linux-image-4.15.0-1056-aws          4.15.0-1056.58                                  amd64        Linux kernel image for version 4.15.0 on 64 bit x86 SMP
rc  linux-image-5.0.0-32-generic         5.0.0-32.34~18.04.2                             amd64        Signed kernel image generic
ii  linux-image-5.3.0-1032-aws           5.3.0-1032.34~18.04.2                           amd64        Linux kernel image for version 5.3.0 on 64 bit x86 SMP
ii  linux-image-5.4.0-42-generic         5.4.0-42.46~18.04.1                             amd64        Signed kernel image generic
ii  linux-image-aws                      5.3.0.1032.31                                   amd64        Linux kernel image for Amazon Web Services (AWS) systems.
ii  linux-image-generic-hwe-18.04        5.4.0.42.46~18.04.35                            amd64        Generic Linux kernel image

기본값은 가장 최신인 linux-image-5.4.0-42-generic 인데, 뒤에 aws 가 붙은 커널은 5.3.0-1032-aws 가 최신이다. refind 라면, 아주 간단히 이 커널로 부팅하게할 수 있는데..

grub 은 이게 좀 복잡하다. 물론, 부팅시에 화면을 볼 수 있다면야 별 문제가 없지만, AWS 서버처럼 어디 먼~ 곳에 기계가 있는 경우 그럴 수가 없으니!

그리하여, 다음과 같은 복잡한 방법을 거쳐야 한다.
StackExchange 에서 도움을 받았다.

$menuentry_id_option 찾아내기.

$ grep submenu /boot/grub/grub.cfg 
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {

여기서 필요한 부분은 ‘gnulinx-‘ 이하다.
정확하게는 다음 내용.

gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282

원하는 커널 정보 찾기.

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
	menuentry 'Ubuntu, with Linux 5.4.0-42-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-42-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
	menuentry 'Ubuntu, with Linux 5.4.0-42-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-42-generic-recovery-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
	menuentry 'Ubuntu, with Linux 5.4.0-39-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-39-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {
	menuentry 'Ubuntu, with Linux 5.4.0-39-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-39-generic-recovery-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282' {

여기서 만약 5.4.0-39 를 기본 커널로 사용하고 싶다면, 필요한 정보는 $menuentry_id_option 이다. 위의 예에서 보자면,

gnulinux-5.4.0-39-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282

조립? 후 /etc/default/grub 에 정보 저장.

위에서 얻은 두 정보를 조합(> 기호 사용)하여, /etc/default/grub 의 GRUB_DEFAULT 항목에 넣어준다.

#GRUB_DEFAULT=0
GRUB_DEFAULT="gnulinux-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282>gnulinux-5.4.0-39-generic-advanced-b7e9ad35-1a1f-45e3-9cfd-084a7ce27282"

GRUB_DEFAULT=0 은 다음을 위해서 지우지는 말고 주석처리만 한다.

마지막으로, update-grub 을 해주고 재부팅한다.

sudo update-grub

나중에 커널 판올림이 이뤄진 뒤, 다른 커널을 선택하려면 이 작업을 다시 해줘야 한다.

안녕하세요. 글 남겨주셔서 고맙습니다.