kernel-clean.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env bash
  2. # Copyright (c) 2021-2023 tteck
  3. # Author: tteck (tteckster)
  4. # License: MIT
  5. # https://github.com/tteck/Proxmox/raw/main/LICENSE
  6. function header_info {
  7. cat <<"EOF"
  8. __ __ __ ________
  9. / //_/__ _________ ___ / / / ____/ /__ ____ _____
  10. / ,< / _ \/ ___/ __ \/ _ \/ / / / / / _ \/ __ `/ __ \
  11. / /| / __/ / / / / / __/ / / /___/ / __/ /_/ / / / /
  12. /_/ |_\___/_/ /_/ /_/\___/_/ \____/_/\___/\__,_/_/ /_/
  13. EOF
  14. }
  15. set -euo pipefail
  16. shopt -s inherit_errexit nullglob
  17. YW=$(echo "\033[33m")
  18. BL=$(echo "\033[36m")
  19. RD=$(echo "\033[01;31m")
  20. BGN=$(echo "\033[4;92m")
  21. GN=$(echo "\033[1;92m")
  22. DGN=$(echo "\033[32m")
  23. CL=$(echo "\033[m")
  24. BFR="\\r\\033[K"
  25. HOLD="-"
  26. CM="${GN}✓${CL}"
  27. CROSS="${RD}✗${CL}"
  28. PARTY="🎉"
  29. current_kernel=$(uname -r)
  30. clear
  31. header_info
  32. while true; do
  33. read -p "This will Clean Unused Kernel Images, USE AT YOUR OWN RISK. Proceed(y/n)?" yn
  34. case $yn in
  35. [Yy]*) break ;;
  36. [Nn]*) exit ;;
  37. *) echo -e "${RD}Please answer y/n${CL}" ;;
  38. esac
  39. done
  40. clear
  41. function msg_info() {
  42. local msg="$1"
  43. echo -ne " ${HOLD} ${YW}${msg}..."
  44. }
  45. function msg_ok() {
  46. local msg="$1"
  47. echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
  48. }
  49. function check_root() {
  50. if [[ $EUID -ne 0 ]]; then
  51. echo -e "${CROSS}${RD}Error: This script must be ran as the root user.\n${CL}"
  52. exit 1
  53. else
  54. header_info
  55. other_kernel
  56. kernel_info
  57. kernel_clean
  58. fi
  59. }
  60. VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
  61. function other_kernel() {
  62. if [[ "${VERSION}" == "bullseye" ]]; then
  63. if [[ "$current_kernel" == *"edge"* ]]; then
  64. echo -e "\n${CROSS} ${RD}ERROR:${CL} Proxmox ${BL}${current_kernel}${CL} Kernel Active"
  65. echo -e "\nAn Active PVE Kernel is required to use Kernel Clean\n"
  66. exit 1
  67. fi
  68. if [[ "$current_kernel" == *"6.1"* || "$current_kernel" == *"6.2"* ]]; then
  69. echo -e "\n${CROSS} ${RD}ERROR:${CL} Proxmox ${BL}${current_kernel}${CL} Kernel Active"
  70. echo -e "\nThe script cannot be used when running opt-in kernels. \nProxmox VE's package management relies directly on the current default kernel, which is 5.15. \nTherefore, it is not possible to utilize this script. In this case, you should use autoremove instead. \n`apt-get autoremove`\n"
  71. exit 1
  72. fi
  73. fi
  74. }
  75. function kernel_info() {
  76. if [[ "$MODE" != "PBS" ]]; then
  77. echo -e "${YW}PVE Version: ${BL}$(pveversion)\n${CL}"
  78. fi
  79. if [[ "$current_kernel" == *"pve"* ]]; then
  80. echo -e "${YW}Current Kernel: ${BL}$current_kernel\n${CL}"
  81. else
  82. echo -e "\n${CROSS} ${RD}ERROR: No PVE Kernel Found\n${CL}"
  83. exit 1
  84. fi
  85. }
  86. function kernel_clean() {
  87. kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | sort -V)
  88. remove_kernels=""
  89. for kernel in $kernels; do
  90. if [ "$(echo $kernel | grep $current_kernel)" ]; then
  91. break
  92. else
  93. echo -e "${BL}'$kernel' ${CL}${YW}has been added to the remove Kernel list\n${CL}"
  94. remove_kernels+=" $kernel"
  95. fi
  96. done
  97. msg_ok "Kernel Search Completed\n"
  98. if [[ "$remove_kernels" != *"pve"* ]]; then
  99. echo -e "${PARTY} ${GN}It appears there are no old Kernels on your system. \n${CL}"
  100. msg_info "Exiting"
  101. sleep 2
  102. msg_ok "Done"
  103. else
  104. read -p "Would you like to remove the $(echo $remove_kernels | awk '{print NF}') selected Kernels listed above? [y/n]: " -n 1 -r
  105. echo
  106. if [[ $REPLY =~ ^[Yy]$ ]]; then
  107. msg_info "Removing ${CL}${RD}$(echo $remove_kernels | awk '{print NF}') ${CL}${YW}old Kernels${CL}"
  108. /usr/bin/apt purge -y $remove_kernels >/dev/null 2>&1
  109. msg_ok "Successfully Removed Kernels"
  110. msg_info "Updating GRUB"
  111. /usr/sbin/update-grub >/dev/null 2>&1
  112. msg_ok "Successfully Updated GRUB"
  113. msg_info "Exiting"
  114. sleep 2
  115. msg_ok "Done"
  116. else
  117. msg_info "Exiting"
  118. sleep 2
  119. msg_ok "Done"
  120. fi
  121. fi
  122. }
  123. if ! command -v pveversion >/dev/null 2>&1; then
  124. echo -e " Switching to PBS mode"
  125. MODE="PBS"
  126. sleep 2
  127. else
  128. MODE="PVE"
  129. fi
  130. check_root