Table Of Contents
I’ve been using Gentoo for a few years now. And every time a new kernel version went out, I ended visiting Gentoo’s wiki page Kernel/Upgrade and following its steps to upgrade the kernel.
But I thought it would be better to automate the process, so I wrote a simple bash script that from now on will do the work for me. It may be useful for other Gentoo users:
#!/usr/bin/env bash
## Upgrade gentoo kernel
# The first and only argument must be the folder name of the new kernel.
# Stop script when an error occurs
set -o errexit
set -o pipefail
set -o nounset
# For debugging purposes
set -o xtrace
readonly kernel_path='/usr/src/'
_usage () {
local script_name="$0"
echo "Usage: $0 <newkernelfolder>"
}
_main () {
echo "Backing up old kernel..."
cd "${kernel_path}/linux/"
cp .config ~/kernel-config-"$(uname -r)"
echo "Copying old configuration..."
cp /usr/src/linux/.config /tmp/.config
echo "Setting new kernel as default..."
#ln -sf /usr/src/"$1" /usr/src/linux
cp /tmp/.config /usr/src/linux/
eselect kernel set 2
cd /usr/src/linux/
echo "Building..."
make -j4 olddefconfig
make -j4 modules_prepare
make modules_install
emerge --ask @module-rebuild
make -j4
make install
echo "Please, update your EFI entry: cp /boot/vmlinuz-*-gentoo /boot/efi/boot/bootx64.efi"
}
if [[ $# -eq 1 ]]
then
_main $1
else
_usage
fi
To use it, simply write:
$ sudo ./updatekernel.sh linux-4.12.12-gentoo
Where linux-4.12.12-gentoo
is the name of the new kernel.
Contributions are welcome, because there is still room for improvement, you can check the script in my Dotfiles repository.
After writing the script, I saw portage already have hooks for execute actions when new ebuilds are downloaded, but when I tried it I realized that the .config
from my previous kernel was not being picked up. I am sure there is a way to tell portage hooks to use the previous config, but since I’ve already wrote the script, I decided to use it.
Hope you find the script useful!
Update
I posted this script on the Gentoo subreddit /r/Gentoo and it has received a lot of comments. Some redditors had posted its own ways to update a kernel automatically, here are some of them:
- htay6r7ce script:
eselect kernel list
eselect kernel set #
# Use current kernel config and store copy
gunzip /proc/config.gz -c > /root/config; cp /root/config /root/config-$(uname -r)
# Optionally change module settings in the config file, or use --menuconfig
# with genkernel.
genkernel --makeopts=-j9 --splash --kernel-config=/root/config all
# Update packages with kernel modules
emerge -1 @module-rebuild
# Cleanup old files
for name in $(ls /lib/modules/ | sort -V | head -n -3); do
rm -rf /boot/{initramfs,kernel,System.map}-genkernel-x86_64-${name:?}
rm -rf /lib/modules/${name:?}
done
# Update boot config file
grub-mkconfig -o /boot/grub/grub.cfg
- Btirooh script its repo jeekkd/gentoo-kernel-build.
- KernelKunt has its script on github: t4nki/kupdate
- sQu1rr kernel update on github gists.
- htay6r7ce use the following script:
eselect kernel list
eselect kernel set #
# Use current kernel config and store copy
gunzip /proc/config.gz -c > /root/config; cp /root/config /root/config-$(uname -r)
# Optionally change module settings in the config file, or use --menuconfig
# with genkernel.
genkernel --makeopts=-j9 --splash --kernel-config=/root/config all
# Update packages with kernel modules
emerge -1 @module-rebuild
# Cleanup old files
for name in $(ls /lib/modules/ | sort -V | head -n -3); do
rm -rf /boot/{initramfs,kernel,System.map}-genkernel-x86_64-${name:?}
rm -rf /lib/modules/${name:?}
done
# Update boot config file
grub-mkconfig -o /boot/grub/grub.cfg
All of them are far more elaborate than mine, so I will try to use them and improve mine.
Spot a typo?: Help me fix it by contacting me or commenting below!