He visto muchos hilos sobre cómo liberar espacio en la partición / boot y ese es mi objetivo también. Sin embargo, solo estoy interesado en eliminar viejos núcleos y no cada uno de ellos, sino el actual.
Necesito que la solución sea de una sola línea ya que ejecutaré el script desde Puppet y no quiero tener archivos adicionales por ahí. Hasta ahora obtuve lo siguiente:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs sudo apt-get -y purge
Para ser más precisos, lo que hace en este momento es lo siguiente:
- Liste todos los paquetes linux- * e imprima sus nombres.
- Solo enumere los que tienen números y ordénelos, devolviendo el resultado inverso. De esta manera, los núcleos más antiguos se enumeran al final.
- Imprima solo los resultados que van después del núcleo actual
- Dado que hay algunos resultados de Linux- {imagen, encabezados}, asegúrese de no purgar nada relacionado con mi núcleo actual
- Llamar apto para purgar
Esto funciona, pero estoy seguro de que la solución puede ser más elegante y segura para un entorno de producción, ya que al menos 20 de nuestros servidores ejecutan Ubuntu.
Gracias por tu tiempo, Alejandro.
kernel
bash
boot-partition
Alejandro
fuente
fuente
Respuestas:
Se ve bastante bien, solo algunos comentarios. Los dos primeros comentarios hacen que el comando sea más seguro, mientras que el tercero y el cuarto lo hacen un poco más corto. Siéntase libre de seguir o ignorar a cualquiera de ellos. Aunque les aconsejaré que sigan los dos primeros. Debes asegurarte de que sea lo más seguro posible. Es enserio. Estás lanzando una
sudo apt-get -y purge
lista de paquetes generada automáticamente. Eso es tan malo ! :)Listado de todos
linux-*
obtendrá muchos falsos positivos, como (ejemplo de mi salida)linux-sound-base
. Aunque estos pueden ser filtrados más tarde por el resto de su comando, personalmente me sentiría más seguro si no los enumero en primer lugar. Controle mejor qué paquetes desea eliminar. No haga cosas que puedan tener resultados inesperados. Entonces comenzaría conSu expresión regular para "enumerar solo los que tienen números" es un poco demasiado simple en mi opinión. Por ejemplo, existe el paquete
linux-libc-dev:amd64
cuando estás en un sistema de 64 bits. Tu expresión regular coincidirá. No quieres que coincida. Es cierto que si seguiste mi primer consejo, delinux-libc-dev:amd64
todos modos no apareceré en la lista, pero aún así. Sabemos más sobre la estructura de un número de versión que el simple hecho de que "hay un número". Además, generalmente es una buena idea citar expresiones regulares, solo para evitar posibles interpretaciones erróneas por parte del shell. Entonces haría ese comando egrepLuego está esta cosa de clasificación. ¿Por qué lo clasificas? Como va a eliminar todos los núcleos (excepto el actual) de todos modos, ¿es importante que elimine los más antiguos antes que los más nuevos? No creo que haga ninguna diferencia. ¿O solo está haciendo eso para poder usarlo
sed
para "Imprimir solo los resultados que van después del núcleo actual"? Pero en mi opinión, esto se siente demasiado complicado. ¿Por qué no simplemente filtrar los resultados correspondientes a su núcleo actual, como ya lo está haciendo degrep -v
todos modos, y listo? Honestamente, si tomo la primera parte de su comando (con mis dos sugerencias anteriores integradas), en mi máquina obtengoEliminando ese material de clasificación / sed, obtengo
Entonces, su comando más complicado en realidad perdería dos paquetes en mi máquina, que me gustaría eliminar (ahora es posible que esas
linux-image-extra-*
cosas dependan de laslinux-image-*
cosas y, por lo tanto, se eliminen de todos modos, pero no puede hacer daño hacerlo explícito). En cualquier caso, no veo el punto de su clasificación; ungrep -v
preprocesamiento sencillo y elegante debería estar bien, presumiblemente incluso mejor. Soy un defensor del principio KISS. Le facilitará la comprensión o la depuración más adelante. Además, sin la clasificación es un poco más eficiente;)Esto es puramente estético, pero obtendrá la misma salida con esta variante ligeramente más corta. :-)
En consecuencia, termino con el comando más simple y seguro
Dado que realmente desea limpiar su
/boot
partición, un enfoque completamente diferente sería enumerar los contenidos/boot
, utilizarlosdpkg -S
para determinar los paquetes a los que pertenecen los archivos individuales, filtrar los que pertenecen al núcleo actual y eliminar los paquetes resultantes. Pero me gusta más su enfoque, porque también encontrará paquetes obsoletos comolinux-headers-*
, por ejemplo , que no se instalan/boot
, sino a/usr/src
.fuente
uname -r
. Para mi funciona bien. Sería interesante ver por qué no funciona en su caso.uname -r
produce4.8.0-36-generic
, que no puede excluirlinux-headers-4.8.0-36
de la lista.Escribí este script que elimina los paquetes "linux- *" que tienen una versión menor que la que actualmente arranca. Creo que no es necesario probar el estado del paquete. El comando solicita confirmación antes de purgar paquetes. Si no quiere eso, agregue la opción -y al comando apt-get.
Sin embargo, para poder dejar una cantidad configurable de núcleos de repuesto, recomiendo usar mi
linux-purge
script con--keep
opción. Consulte aquí para obtener más información sobre el script.fuente
TL; DR: saltar al final.
Aunque es un poco más largo. Lo desglosaré por ti:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Justo como Malte sugirió. Enumera los archivos de kernel relevantes.egrep '[0-9]+\.[0-9]+\.[0-9]+'
También sugerido por Malte como la forma más segura de seleccionar solo los archivos del núcleo buscando un número de versión.Dado que ahora posiblemente estamos enumerando tanto la imagen como los paquetes de encabezado, el nombre del paquete puede variar, por lo que tenemos esta solución alternativa que es necesaria para la clasificación.
awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
El resultado es una nueva columna con el número de versión antes del nombre del paquete original, como se muestra a continuación:Ahora debemos ordenar la lista para evitar la desinstalación de imágenes más nuevas que la que se está ejecutando actualmente.
sort -k1,1 --version-sort -r
dándonos esto:Ahora elimine los archivos de kernel actuales y más nuevos
sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
que nos dan esto:Ahora elimine la primera columna que agregamos
awk '{print $2}'
para obtener exactamente lo que queremos:Ahora podemos enviar eso al administrador de paquetes para eliminar automáticamente todo y volver a configurar grub:
Recomiendo hacer una ejecución en seco primero (aunque para sus propósitos de script esto podría no ser práctico si tiene un entorno grande)
Ahora, si todo se ve bien, adelante y quítelo con:
Una vez más, el objetivo de este "one-liner" es eliminar solo los núcleos MÁS ANTIGUOS que el núcleo que se está ejecutando actualmente (lo que deja todos los núcleos recién instalados todavía disponibles)
¡Gracias, hágame saber cómo funciona esto para usted y si puede mejorarlo!
fuente
Simplemente puede enumerar el directorio / boot para ver las versiones del núcleo que tiene usando el comando 'ls'. Luego use 'sudo apt-get -y purge "xxx"' donde "xxx" se reemplaza con el número de versión que desea eliminar. Tenga cuidado de que no sea la versión que está ejecutando actualmente.
fuente
Instalar
bikeshed
(apt install bikeshed
) y llamarpurge-old-kernels
como root.fuente
Una respuesta rápida, explicación a pedido:
fuente
sed '$d'
comando. El script no elimina ningún paquete de encabezado de Linux u otros paquetes relacionados con los paquetes del núcleo que se eliminarán, además no elimina los archivos de configuración de los paquetes. En su lugar, recomendaría usar mi respuesta.echo
) elapt-get
comando que puede ejecutar.Me cansé realmente de toda esta complejidad innecesaria y creé un paquete de Python que hace que la línea simple sea trivial:
Instalarlo con
Ver más en https://github.com/mrts/ubuntu-old-kernel-cleanup .
Espero que esto ayude a otros también.
fuente
sudo pip install ...
como se describe anteriormente?sudo
es realmente importante, de lo contrariopip
lo instalará en algún directorio de usuarios y es posible que Shell no busque en este directorio archivos ejecutables.Funciona todo el tiempo, e incluso ubuntu 17.10
fuente
linux-libc-dev:amd64
, eso no es deseado.