#!/bin/bash #---------------------------------------------------------------------------- # /usr/libexec/update-initrd-images - create new set of initrd images # # Copyright (c) 2001-2023 the eisfair team, team(at)eisfar(dot)org # # Creation : 2021-02-20 dv # Last Update: 2021-03-13 16:28:02 dv # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #---------------------------------------------------------------------------- #----------------------------------------------------------------------------- # check if space is sufficient to activate new kernel # old initrd has to be replaced by new one. If the new one is larger than # the old one, than we have to check for available disk space in /boot #----------------------------------------------------------------------------- check_for_sufficient_disk_space() { local kernel="${1}" local new_size=$(du "/var/lib/alt-kernel/initrd-${kernel}.gz" | awk '{print $1}') local old_size=$(du "/boot/initrd-${kernel}.gz" | awk '{print $1}') if [ "${new_size:-0}" -gt "${old_size:-0}" ] then local available_space=0 if [ -n "$(df /boot | grep ' /boot$')" ] then set -- $(df /boot | grep ' /boot$') available_space="${4}" else set -- "$(df / | grep ' /')" available_space="${4}" fi local needed_space=$((${new_size:-0} - ${old_size:-0})) if [ "${needed_space}" -gt "${available_space}" ] then # insufficient space return 1 fi fi return 0 } #----------------------------------------------------------------------------- # deactivate the oldest kernel (if possible) #----------------------------------------------------------------------------- deactivate_oldest_kernel() { local current_kernel="${1}" local kernel_list="${2}" local running_kernel="$(uname -r)" local kernel for kernel in ${kernel_list} do if [ "${kernel}" = "${current_kernel}" ] then # end of list reached return 1 fi if [ "${kernel}" != "${running_kernel}" ] && [ -f "/boot/kernel-${kernel}" ] && [ -f "/boot/initrd-${kernel}.gz" ] then local fix_link=false if [ "$(basename $(readlink /boot/kernel))" = "kernel-${kernel}" ] then fix_link=true fi rm -f "/var/lib/alt-kernel/kernel-${kernel}" rm -f "/var/lib/alt-kernel/initrd-${kernel}.gz" mv "/boot/kernel-${kernel}" \ "/var/lib/alt-kernel/kernel-${kernel}" mv "/boot/initrd-${kernel}.gz" \ "/var/lib/alt-kernel/initrd-${kernel}.gz" if [ "${fix_link}" = true ] then rm -f /boot/kernel rm -f /boot/initrd.gz kernels=$(ls /boot/kernel-* | sort -Vr) for next_kernel in ${kernels} do next_version="$(basename ${next_kernel} | sed 's#kernel-##g')" next_initrd="/boot/initrd-${next_version}.gz" if [ -f "${next_initrd}" ] then ln -sr "${next_kernel}" /boot/kernel ln -sr "${next_initrd}" /boot/initrd.gz break fi done fi return 0 fi done return 1 } #----------------------------------------------------------------------------- # main program #----------------------------------------------------------------------------- main() { # list of kernel (newest first) local kernel_reverse_list=$(ls /lib/modules | sort -rV) # list of kernels (oldest first) local kernel_forward_list=$(ls /lib/modules | sort -V) # recreate initrd files for kernels local kernel for kernel in ${kernel_reverse_list} do mkinitrd --force -q /var/lib/alt-kernel/initrd-${kernel}.gz ${kernel} if [ -f "/boot/initrd-${kernel}.gz" ] then if ! check_for_sufficient_disk_space "${kernel}" then if deactivate_oldest_kernel "${kernel}" "${kernel_forward_list}" then # move initrd to boot rm -f /boot/initrd-${kernel}.gz mv /var/lib/alt-kernel/initrd-${kernel}.gz /boot/initrd-${kernel}.gz fi else # move initrd to boot rm -f /boot/initrd-${kernel}.gz mv /var/lib/alt-kernel/initrd-${kernel}.gz /boot/initrd-${kernel}.gz fi fi done } main "${@}"