Here are the commands needed to load a new kernel without rebooting your server or desktop computer. Why you need this? Sometime rebooting a server could take 5 to 10 minutes and loading a new kernel is just up to a minute. In fact in most cases loading the new kernel and starting the system then is just under 20-30 seconds, so upgrading your server even with new kernel is super easy lately. We tested it on CentOS 7 server and it was successful. The system uses systemd and the process is really easy and safe for the systems.
When the processes is initiated the system shutdowns normally (shutting down all running service with systemd) and then load the system immediately with the new kernel and starts the services as usual!
So no need to worry about unflushed data or not proper shutdown of a service! It’s like a normal reboot but without a hardware reboot and is a lot faster!
Here is what is required to load a kernel without hardware rebooting your computer box:
- kexec-tools
- Load the new kernel, initram file and the command line arguments with “kexec”
- Start a systemd target – kexec.target
CentOS 7 using kexec to load a new kernel
The real commands only for CentOS 7:
yum install -y kexec-tools kexec -l /boot/vmlinuz-3.10.0-862.11.6.el7.x86_64 --initrd=/boot/initramfs-3.10.0-862.11.6.el7.x86_64.img --command-line="root=/dev/mapper/centos_srv-root ro crashkernel=auto rd.lvm.lv=centos_srv/root rd.lvm.lv=centos_srv/swap rhgb quiet LANG=en_US.UTF-8" systemctl start kexec.target
Here is a real world example with all the output:
As you can see it is important to load the initram file and the exact arguments to the kernel. You should take them from the grub 2 configuration – /boot/grub2/grub.cfg
Here is the real output:
[root@srv ~]# yum -y update Loaded plugins: fastestmirror Determining fastest mirrors * base: mirrors.neterra.net * extras: mirrors.neterra.net * updates: mirrors.neterra.net base | 3.6 kB 00:00:00 centos-sclo-rh | 3.0 kB 00:00:00 centos-sclo-sclo | 2.9 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/4): extras/7/x86_64/primary_db | 187 kB 00:00:00 (2/4): updates/7/x86_64/primary_db | 5.2 MB 00:00:01 (3/4): centos-sclo-sclo/x86_64/primary_db | 292 kB 00:00:01 (4/4): centos-sclo-rh/x86_64/primary_db | 3.7 MB 00:00:02 Resolving Dependencies --> Running transaction check ---> Package kernel.x86_64 0:3.10.0-862.11.6.el7 will be installed ---> Package kernel-headers.x86_64 0:3.10.0-862.3.2.el7 will be updated ---> Package kernel-headers.x86_64 0:3.10.0-862.11.6.el7 will be an update ---> Package kernel-tools.x86_64 0:3.10.0-862.3.2.el7 will be updated ---> Package kernel-tools.x86_64 0:3.10.0-862.11.6.el7 will be an update ---> Package kernel-tools-libs.x86_64 0:3.10.0-862.3.2.el7 will be updated ---> Package kernel-tools-libs.x86_64 0:3.10.0-862.11.6.el7 will be an update .... .... [root@srv ~]# yum install -y kexec-tools Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.neterra.net * extras: mirrors.neterra.net * updates: mirrors.neterra.net Package kexec-tools-2.0.15-13.el7.x86_64 already installed and latest version Nothing to do
So we performed an update and there was a new kernel kernel.x86_64 0:3.10.0-862.11.6.el7, which we would like to load without hardware reboot.
Here is our new kernel in “/boot”
[root@srv ~]# ls -altr /boot/ total 171812 -rw-------. 1 root root 3228420 22 Aug 2017 System.map-3.10.0-693.el7.x86_64 -rw-r--r--. 1 root root 140894 22 Aug 2017 config-3.10.0-693.el7.x86_64 -rw-r--r--. 1 root root 166 22 Aug 2017 .vmlinuz-3.10.0-693.el7.x86_64.hmac -rwxr-xr-x. 1 root root 5877760 22 Aug 2017 vmlinuz-3.10.0-693.el7.x86_64 -rw-r--r--. 1 root root 293027 22 Aug 2017 symvers-3.10.0-693.el7.x86_64.gz drwxr-xr-x. 3 root root 17 20 Feb 2018 efi drwxr-xr-x. 2 root root 27 20 Feb 2018 grub -rw-r--r--. 1 root root 611343 20 Feb 2018 initrd-plymouth.img -rw-------. 1 root root 51315067 20 Feb 2018 initramfs-0-rescue-cc7889764e86441b8d1eb54e29e81a91.img -rwxr-xr-x. 1 root root 5877760 20 Feb 2018 vmlinuz-0-rescue-cc7889764e86441b8d1eb54e29e81a91 -rw-------. 1 root root 3409912 21 May 23,50 System.map-3.10.0-862.3.2.el7.x86_64 -rw-r--r--. 1 root root 147823 21 May 23,50 config-3.10.0-862.3.2.el7.x86_64 -rw-r--r--. 1 root root 170 21 May 23,50 .vmlinuz-3.10.0-862.3.2.el7.x86_64.hmac -rwxr-xr-x. 1 root root 6228832 21 May 23,50 vmlinuz-3.10.0-862.3.2.el7.x86_64 -rw-r--r--. 1 root root 304943 21 May 23,52 symvers-3.10.0-862.3.2.el7.x86_64.gz dr-xr-xr-x. 17 root root 224 14 Jun 7,18 .. -rw-------. 1 root root 12997841 14 Jun 7,19 initramfs-3.10.0-693.el7.x86_64kdump.img -rw-------. 1 root root 20771492 14 Jun 7,20 initramfs-3.10.0-693.el7.x86_64.img -rw-------. 1 root root 13007444 14 Jun 7,23 initramfs-3.10.0-862.3.2.el7.x86_64kdump.img -rw-r--r--. 1 root root 147859 14 Aug 22,02 config-3.10.0-862.11.6.el7.x86_64 -rw-------. 1 root root 3414344 14 Aug 22,02 System.map-3.10.0-862.11.6.el7.x86_64 -rw-r--r--. 1 root root 171 14 Aug 22,02 .vmlinuz-3.10.0-862.11.6.el7.x86_64.hmac -rwxr-xr-x. 1 root root 6242208 14 Aug 22,02 vmlinuz-3.10.0-862.11.6.el7.x86_64 -rw-r--r--. 1 root root 305158 14 Aug 22,05 symvers-3.10.0-862.11.6.el7.x86_64.gz -rw-------. 1 root root 20774393 5 Sep 15,20 initramfs-3.10.0-862.11.6.el7.x86_64.img drwx------. 5 root root 97 5 Sep 15,20 grub2 dr-xr-xr-x. 5 root root 4096 5 Sep 15,21 . -rw-------. 1 root root 20782404 5 Sep 15,21 initramfs-3.10.0-862.3.2.el7.x86_64.img
Now we know the kernel and initram file names we just check the kernel arguments in the kernel, load them with kexec and start an systemd target to load the new kernel:
[root@srv ~]# grep vmlinuz-3.10.0-862.11.6.el7.x86_64 /boot/grub2/grub.cfg linux16 /vmlinuz-3.10.0-862.11.6.el7.x86_64 root=/dev/mapper/centos_srv-root ro crashkernel=auto rd.lvm.lv=centos_srv/root rd.lvm.lv=centos_srv/swap rhgb quiet LANG=en_US.UTF-8 [root@srv ~]# kexec -l /boot/vmlinuz-3.10.0-862.11.6.el7.x86_64 --initrd=/boot/initramfs-3.10.0-862.11.6.el7.x86_64.img --command-line="root=/dev/mapper/centos_srv-root ro crashkernel=auto rd.lvm.lv=centos_srv/root rd.lvm.lv=centos_srv/swap rhgb quiet LANG=en_US.UTF-8" [root@srv ~]# systemctl start kexec.target Connection to srv closed by remote host. Connection to srv closed.
As you can see systemd performs a normal shutdown of all services and targets.
The ssh connection is immediately closed because the reboot is initiated.
After 10-15 seconds our host is alive and the new kernel is loaded successfully:
root@test ~ $ ssh root@srv root@srv's password: Last login: Wed Sep 5 15:16:08 2018 from test [root@srv ~]# uname -a Linux srv.local 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [root@srv ~]#
Because we do not wanted to mess up the two output from different linux distros in one article we decided to split it in two separate ones, so here is the one for Ubuntu 16/18 LTS – “Ubuntu 16/18 LTS – load a new kernel without rebooting the server“
One thought on “CentOS 7 – load a new kernel without rebooting the server”