Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Tip: gooi de oude kernels in de vuilbak  (gelezen 6910 keer)

Offline Dave

  • Lid
Re: Tip: gooi de oude kernels in de vuilbak
« Reactie #25 Gepost op: 2013/03/20, 17:47:31 »
Een kernel die niet in gebruik is kun je probleemloos verwijderen hoor als de huidige goed blijkt te werken, dat heeft absoluut geen verdere gevolgen voor je systeem.


De keren dat ik een accuut probleem had na een update maakte opstarten met een oudere versie geheel geen verschil.
Ik mik ze net zo lief weg dan.
En zo af en toe een nieuwe installatie ruimt ook weer lekker op  ^-^

Offline HarzG

  • Lid
Re: Tip: gooi de oude kernels in de vuilbak
« Reactie #26 Gepost op: 2013/04/18, 22:18:44 »
Bij mijn oude makkers van sidux/siduction staat een script wat oude kernels verwijderd. Wie daar belang bij heeft, kan dat in /home/username/bin plaatsen onder de naam kernel-remover en "uitvoerbaar" maken. Een dubbelklik vraagt je sudo wachtwoord en toont je vervolgens de kernels die verwijderd kunnen worden. De oude code staat hieronder (werkt nog steeds). Wie de actuele versie als DEB wil hebben, moet hier kijken (niet getest).

#!/bin/sh
#
# we need gettext (is loaded in ssft.sh or cloned...)
if [ -f /usr/bin/gettext.sh ]; then
. /usr/bin/gettext.sh || exit 1
else
exit 1
fi
#---------------------------------------------------------------------
# we need root rights
#---------------------------------------------------------------------
if [ "$(id -u)" -ne 0 ]; then
if [ -x "$(which su-to-root)" ]; then
[ -n "$DISPLAY" ] &&  exec su-to-root -X -c "${0} $@"
exec su-to-root -c "${0} $@"
fi
printf "ERROR: $0 needs root capabilities, please start it as root.\n\n" >&2
exit 1
else
if  test  -n "$DISPLAY"  && ! xset q > /dev/null  2>&1 ; then unset DISPLAY; fi
fi

TEXTDOMAIN="kernel-remover"
export TEXTDOMAIN
TEXTDOMAINDIR=/usr/share/locale
export TEXTDOMAINDIR

#---------------------------------------------------------------------
usage()
{
echo  "$(basename $0)"
echo  "     -F parameter    use parameter as the graphical frontend"
echo  "                     one of text | dialog | kdialog | zenity "
echo  "     -f              proceed without asking, do complete cleanup"
echo  "     -h              show this usage"
exit 1
}
#---------------------------------------------------------------------
force=0
xtra=0
unset frontend
while getopts fhxF: name
do
case $name in
f)  force=1;;
F)  frontend="$OPTARG";;
h)  usage;;
x) xtra=1;;
*)  usage;;
esac
done
shift $(($OPTIND - 1))

#---------------------------------------------------------------------
prepare()
{
if [ "$force" -eq 0 ]; then
# we need ssft
if [ -f /usr/bin/ssft.sh ]; then
. /usr/bin/ssft.sh || exit 1
else
echo "Please install the package \"ssft\"."
exit 1
fi
fi

if [ -n "${frontend}" ]; then
case $frontend in
text)  SSFT_FRONTEND="${frontend}";;
dialog)  SSFT_FRONTEND="${frontend}";;
kdialog)  SSFT_FRONTEND="${frontend}";;
zenity) SSFT_FRONTEND="${frontend}";;
*)  echo unknown frontend && exit 1;;
esac
fi

if [ -z "$DISPLAY" ] &&  ! /usr/bin/xdpyinfo >/dev/null 2>&1 ; then
unset DISPLAY
fi
if [ -z "$DISPLAY" ]; then
[ -x /usr/bin/dialog ] && SSFT_FRONTEND=${SSFT_FRONTEND:-"dialog"} || \
SSFT_FRONTEND=${SSFT_FRONTEND:-"text"}
else
if [ -n "$DISPLAY" ] && [ ! -x /usr/bin/zenity ]; then
if [ -x /usr/bin/dialog ]; then
SSFT_FRONTEND="dialog"
else
SSFT_FRONTEND="text"
fi
DISPLAY=""
else
SSFT_FRONTEND=${SSFT_FRONTEND:-"zenity"}
fi
fi

# the current one will not be shown in the list ....

ACTUAL=$(uname -r)
TITLE="$(gettext "Removing installed kernels")"
PAD="======="

[ "${SSFT_FRONTEND}" = "dialog" -o -z "${SSFT_FRONTEND}" ] && \
CURRENT="$(eval_gettext "The actual (active) kernel is ${PAD}$(uname -r)${PAD}")" || \
CURRENT="$(eval_gettext "The actual (active) kernel is $(uname -r)")"

}
#---------------------------------------------------------------------
# some useful functions
#---------------------------------------------------------------------
inputbox()
{
# inputbox Title Text dummy default
Title="$1"
Text="$2"
# $3 not used
# The default value if used
SSFT_DEFAULT=$4
ssft_read_string "${Title}" "${Text}";
}

#---------------------------------------------------------------------
msgbox()
{
# msgbox title text
Title="$1"
Text="$2"
ssft_display_message "${Title}" "${Text}"
}
#---------------------------------------------------------------------
select_more()
{
# select one of a list
Title=$1
Text=$2
shift 2
if ssft_select_multiple "$Title" "$Text" $@ ; then
Selected=$SSFT_RESULT
return 0
else
return 1
fi
}
#---------------------------------------------------------------------
yesno()
{
# yesno title text width
Title=$1
Text=$2
ssft_yesno "${Title}" "${Text}"
return $?
}

#---------------------------------------------------------------------
remove_one_kernel()
{
Kernel=$1
if [ "${Kernel}" != "${ACTUAL}" ]; then
apt-get remove --purge --yes $(dpkg -l | awk "/${Kernel}/{print \$2}")

dpkg -l "linux-headers-${Kernel}-common" >/dev/null 2>&1 && \
apt-get remove --purge --yes "linux-headers-${Kernel}-common"
dpkg -l "linux-support-${Kernel}" >/dev/null 2>&1 && \
apt-get remove --purge --yes "linux-support-${Kernel}"

# dispose make install artefacts
if [ ! -e "/boot/vmlinuz-${Kernel}" ]; then
rm -rf /lib/modules/${Kernel}
fi
else
# do not remove active kernel
:
fi
}

#---------------------------------------------------------------------


get_KernelList()
{
for v in /boot/vmlinuz-*; do
Kernel="$(basename $v | sed s/vmlinuz-//)"
if [ "${Kernel}" != "${ACTUAL}" ]; then
meta_package="$(echo $(grep-available \
-F Depends linux-image-${Kernel} \
-s Package) | cut -d: -f 2)"

case $meta_package in
*$Kernel* ) # this is an old style kernel
KernelList="${KernelList} ${Kernel}"
continue
;;
esac
[ -n "${meta_package}" ] && \
meta_status="$(dpkg-query  -f='${STATUS}\n' \
-W  ${meta_package}|\
cut -d ' ' -f 3)" || \
meta_status="not-installed"

if [ "${meta_status}" = "not-installed" ]; then
[ -z "${KernelList}" ] && KernelList="${Kernel}" ||\
KernelList="${KernelList} ${Kernel}"
# echo KernelList="$KernelList"
else
:
fi
fi
done
}

#---------------------------------------------------------------------
# Main
#---------------------------------------------------------------------
if [ "${xtra}" -eq 1 ]; then
KernelList="$@"
    for i in  ${KernelList} ; do
        removing="$(eval_gettext "removing kernel ${i}")"
        echo $removing
        remove_one_kernel "$i"
    done
    MSG="$(eval_gettext "the following kernels have been removed: \"${KernelList}\"")"
    echo $MSG
    exit 0
fi

prepare

get_KernelList

if [ -z "${KernelList}" ]; then
MSG="$(gettext "There is only one kernel installed on this system. Nothing to be done!")"
if [ "${force}" -eq 1 ]; then
echo "${MSG}"
else
msgbox "${TITLE}" "${MSG}"
fi
exit 0
fi

if [ "${force}" -eq 1 ]; then
current="$(eval_gettext "The actual (active) kernel is $(uname -r)")"
echo ${current}
for i in  ${KernelList} ; do
removing="$(eval_gettext "removing kernel ${i}")"
echo $removing
remove_one_kernel "$i"
done
MSG="$(eval_gettext "the following kernels have been removed: \"${KernelList}\"")"
echo $MSG
else
select_more "${TITLE}" "${CURRENT}" ${KernelList}
if [ "$?" -ne 0 ]; then
exit 10
fi
if [ -z "${SSFT_RESULT}" ]; then
exit 12
fi

one_removed=false
for i in ${SSFT_RESULT}; do
MSG="$i : $(gettext "Should I remove this kernel?") "
yesno "${TITLE}" "${MSG}"

if [ "$?" -eq 0 ]; then
remove_one_kernel "$i"
one_removed=true
else
msgbox "${TiTLE}" "$(gettext "Kernel not removed:") $i"
fi
done
fi

sudo apt-get autoremove

exit 0

edit 19 april 2013, 11:54:59:
Het script heb ik net op een andere pc geïnstalleerd. Daar ontbraken een paar pakketten om het script te laten werken. Voordat je het script gebruikt a.u.b. ssft, dialog en dctrl-tools installeren. NB: Er moet uiteraard geen andere package-manager tegelijkertijd actief zijn, d.w.z. synaptic uit en ook updatebeheer mag niet op de achtergrond draaien.

edit 13 mei 2013, 22:22:
Een dubbelklik op het scipt-bestand "kan", maar dat is niet handig. Je mist daardoor de reacties die de terminal toont. Het is verstandiger om in de map waarin het script staat een terminal te openen en het script te starten met
sudo ./kernel-removerHierdoor worden bijv. de bestanden linux-headers-3.2.0-35, linux-headers-3.2.0-35-generic, linux-image-3.2.0-35-generic in 1 keer verwijderd en dat kan ook voor de volgende ...36,37,38,39 gedaan worden. Per stuk is dat een winst van ca. 200MB. Je moet alleen de meest recente 2 houden, dat zijn vandaag bijv. 3.2.0-41 en de 3.2.0-40.

edit 18 mei 2013, 16:37
Omdat in Mint de opdracht niet werd uitgevoerd, staat er nu sudo ervoor. In Ubuntu kwam sowieso de vraag om sudo/root te worden, in Mint werd een melding geproduceerd
Citaat
ERROR: ./kernel-remover needs root capabilities, please start it as root.

edit: 26 mei 2013, 12:21
Er is 1 regel code nog toegevoegd. Op deze manier zit aan het einde nog een schoonmaakopdracht met autoremove.
« Laatst bewerkt op: 2013/05/26, 12:21:50 door HarzG »
Xubuntu 20.04; siduction-15.1.0 Xfce

Offline HarzG

  • Lid
Re: Tip: gooi de oude kernels in de vuilbak
« Reactie #27 Gepost op: 2013/05/26, 12:27:19 »
De bovenstaande code heb ik aan het einde nog aangevuld met 1 regel.

Overigens is het opruimen van de oudere kernels sowieso zinvol als iemand een vlottere update wil hebben van het systeem.
Voorbeeld 1: bij het verschijnen van nieuwe kernelmodules, drivers e.d. worden deze telkens voor alle geïnstalleerde kernels gemaakt. Heb je minder kernels, gaat dat sneller.
Voorbeeld 2: Grub is er sneller doorheen als er minder kernels worden gevonden.
Xubuntu 20.04; siduction-15.1.0 Xfce