# Kernel Management

I encountered [this bug](https://bugs.launchpad.net/ubuntu/+source/backport-iwlwifi-dkms/+bug/1932158/comments/12) While running `5.13.0-25-generic`. The bug for me was related to the `5.11.0-46-generic` Linux kernel. I have unfortunately lost the exact error message I recieved on my system due to a reboot, but in general the error message was the following, which I encountered during an upgrade. (taken from the comment on the bug linked above)

```
sudo apt upgrade

Error! The /var/lib/dkms/backport-iwlwifi/8324/5.4.0-77-generic/aarch64/dkms.conf for module backport-iwlwifi includes a BUILD_EXCLUSIVE directive which
does not match this kernel/arch. This indicates that it should not be built.
Skipped.
```

After some searching, I found a [topic on Linux Mint Forums](https://forums.linuxmint.com/viewtopic.php?f=52&t=358954) that led me to reinstalling my `5.11.0-46-generic` kernel. 

First, be sure that you have any kernel installed that isn't producing errors. For me, `5.11.0-46-generic` was giving errors but I was actually on `5.13.0-25-generic` so no issue there. If you are on the faulty kernel, just run the following commands to install a different kernel version.

For the sake of the example, I will install `5.11.0-44-generic` in the following commands.

```bash
# Search for all Linux kernel images >= 5.10.0
apt search linux-image-5.1 generic
# Install 5.11.0-44-generic image and headers
sudo apt install linux-image-5.11.0-44-generic linux-headers-5.11.0-44-generic
# Important! This updates grub entries with the new kernel
# + In the next step, we use this new entry to boot into a different kernel
sudo update-grub
```

Run the following command to edit your GRUB config. 

```bash
sudoedit /etc/default/grub
```

Now, **read the header comment** and notice the recommendation to run the command `info -f grub -n 'Simple configuration'`. This is useful, and can provide more information on these settings if needed. For swapping a kernel, we don't need to get too crazy. We just need to make sure that GRUB is displayed, and that the timeout is not set to 0.

For me, this was the default configuration. This results in GRUB not being displayed with no timeout. Makes for quick reboots, but does not allow us to boot from a different kernel.

```
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
```

Change the settings to something like the below. The lines to node are `GRUB_TIMEOUT_STYLE` and `GRUB_TIMEOUT`. 

```
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
```

This will show the GRUB menu for 5 seconds on boot. If you don't press a key in 5 seconds, the system will boot. Save and exit this file with the new changes applied, then again run the following commands to updat GRUB and reboot.
```bash
sudo update-grub
reboot
```

When GRUB is displayed, you can select `Ubuntu` or `Advanced Options for Ubuntu`. Select `Advanced Options for Ubuntu` and then select any kernel version (NOT safe mode). This will boot Ubuntu with that Linux kernel, and now we've detached ourselves from the faulty kernel.

Once you're at a terminal in your desktop again, you can run the following commands to remove the kernel and reinstall it.


```bash
sudo apt remove linux-image-5.11.0-46-generic linux-headers-5.11.0-46-generic
sudo apt install linux-image-5.11.0-46-generic linux-headers-5.11.0-46-generic
sudo update-grub
```

That's it! For me, this fixed the specific issue I noted at the top of the page, but you could want to do this for various reasons so I thought it was useful to document it. After the install is complete and you've updated GRUB, you can reboot back into the default `Ubuntu` selection in the GRUB menu.

##### Notes

Also noteworthy, I encountered this issue on an XPS 9310 using dell PPAs for some drivers. These PPAs just happened to target the kernel I removed, and at some point while debugging this I ran an update with `--autoremove`, so I also removed the `oem-somerville-melisa-meta` package in the process. This meant that I removed the keys for the PPA that was still in my apt sources. I was getting warnings about unable to update the PPA during `apt update`. I solved by reinstalling the `oem-somerville-melisa-meta` package. After this, everything was good!

```bash
sudo apt remove oem-somerville-melisa-meta
sudo apt install oem-somerville-melisa-meta
```