꼭 우분투에만 적용되는 내용은 아니지만, 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
나중에 커널 판올림이 이뤄진 뒤, 다른 커널을 선택하려면 이 작업을 다시 해줘야 한다.