Por ejemplo, tener en el musthave los paquetes libreoffice y libreoffice-writer es redundante. Las dependencias del primero implican tener instalado el segundo, por que solo con tener el primero en musthave es suficiente. Sobre las librerías (paquetes lib*) mejor ni hablar: casi todas se instalan de forma automática al cumplir las dependencias de otro paquete de rango superior.
El hecho de tener en musthave solo los paquetes importantes, y no sus dependencias, lo hacen mas manejable y menos susceptible a caer en el "pkgsync installation loop" (esté término me lo acabo de inventar). Este "loop" pasa cuando tenemos en el musthave paquetes que son excluyentes entre si y pkgsync resuelve esta situación esquizofrénica instalando y quitando grupos de paquetes en cada llamada de forma alternativa. Eso no debe ser así, ya que pkgsync debe comportarse de forma idempotente: si no tocamos ningún fichero (mayhave/musthave/maynothave/...) todas las llamadas de pkgsync deben quedar el sistema de paquetes como estaba, invariante.
Por esto y porque me apetecía me puse a mirar como reducir el tamaño del musthave para que esté lo mas puro y mínimo posible. Vamos a ver poco a poco lo que he encontrado:
Primero sacamos una lista ordenada con los paquetes instalados de forma no automática (de esta forma nos libramos de los paquetes tipo librería y otros dependientes). Es lo que se llama paquetes explícitos:
# paquetes_explicitos=$(aptitude search '~i !~M' -F '%p' --disable-columns | sort -u)
De estos paquetes los habrá que se han instalado desde /etc/pkgsync/musthave, también estarán los que se hayan instalado desde /etc/pkgsync/musthave.d por tareas independientes nuestras y, por último, los que se hayan instalado a mano y puesto en /etc/pkgsyc/mayhave para no ser desinstalados. Solo nos interesan los primeros (ya que lo que queremos es aligerar el etc/pkgsync/musthave inicial).for i in $paquetes_explicitos
do
echo -n "Paquete $i"
if grep $i /etc/pkgsync/musthave > /dev/null
then
echo " ->instalado por musthave"
echo $i >> musthave.new
else
if grep $i /etc/pkgsync/mayhave > /dev/null
then
echo " ->instalado por mayhave"
else
echo " ->instalado por musthave.d"
fi
fi
done
sort -u -o musthave.new musthave.new
A la salida tenemos en musthave.new los paquetes explícitos que están en el /etc/pkgsync/musthave original. Con esto tenemos una selección bastante buena de paquetes, pero no es suficiente. Si miramos detenidamente en el musthave.new vemos que sigue habiendo redundancias. Hay que ir mas allá y limpiar todos los paquetes de musthave.new que dependan de otros paquetes que estén en ese mismo fichero.Con el siguiente bucle que recorre musthave.new voy metiendo en musthave.deps todas las dependencias de cada paquete. Para ello uso el comando apt-rdepends (que saca las dependencias y sugerencias de un paquete), aplico un par de filtros para quedarme sólo con las dependencias y si aparece el propio paquete entre sus dependencias lo ignoro (por extraño que parezca, a veces sucede). Por último ordenamos la lista de paquetes dependientes y quitamos los repetidos usando "sort -u":
for i in $(cat musthave.new)
do
#echo "Dependencias de $i"
apt-rdepends $i |grep Depends: | awk ' { print $2 } ' | sed "/^${i}$/d" >> musthave.deps
done
sort -u -o musthave.deps musthave.deps
Una vez hecho esto, quitamos de musthave.new todos los paquetes que también estén en musthave.deps mediante "comm -23", borrando los paquetes redundantes y dejando el resultado en musthave.final:comm -23 musthave.new musthave.deps > musthave.final
Todo el script junto queda:# cat musthave-minimo
#!/bin/bash
if [ ! -f /usr/bin/apt-rdepends ]
then
echo "Instalando apt-rdepends"
apt-get install apt-rdepends
fi
cp /dev/null musthave.new
cp /dev/null musthave.deps
paquetes_explicitos=$(aptitude search '~i !~M' -F '%p' --disable-columns | sort -u)
for i in $paquetes_explicitos
do
echo -n "Paquete $i"
if grep $i /etc/pkgsync/musthave > /dev/null
then
echo " ->instalado por musthave"
echo $i >> musthave.new
else
if grep $i /etc/pkgsync/mayhave > /dev/null
then
echo " ->instalado por mayhave"
else
echo " ->instalado por musthave.d"
fi
fi
done
sort -u -o musthave.new musthave.new
num=1
total=$(wc -l musthave.new)
for i in $(cat musthave.new)
do
echo "Dependencias de $i: $num/$total"
((num++))
apt-rdepends $i |grep Depends: | awk ' { print $2 } ' | sed "/^${i}$/d" >> musthave.deps
done
sort -u -o musthave.deps musthave.deps
comm -23 musthave.new musthave.deps > musthave.final
exit 0
Una vez obtenido el musthave.final podemos compararlo con el musthave inicial y con mushave.new usando "wc -l". Veremos que el número de paquetes se ha reducido considerablemente. Esto es un ejemplo sobre un Ubuntu con la imagen LTSP:# wc -l musthave*
1837 musthave.deps
174 musthave.final
1285 musthave
501 musthave.new
Como vemos pasamos de 1285 paquetes en el musthave generado con el script generar_musthave.sh a 174 en musthave.final, tras realizar las sucesivas purgas de paquetes dependientes.Antes de aplicar musthave.final de forma general es conveniente hacer una copia de seguridad /etc/pkgsync/musthave, sobrescribir musthave.final sobre él y ejecutar pkgsync en modo simulación (no hace nada de verdad, simplemente te dice que ficheros quitaría y que ficheros instalaría), para calibrar si es inofensivo.
# cp /etc/pkgsync/musthave /etc/pkgsync/musthave.backup
# cp musthave.final /etc/pkgsync/musthave
# pkgsync -s
Normalmente nos dirá que quiere quitar algunos paquete secundarios raros que no parecen tener mayor importancia. Aquí entra en juego la pericia de cada cual a la hora de evaluar el riesgo de dejarle que quite esos paquetes, pero por mi experiencia y tras investigar el contenido los paquetes propuestos puedo decir que todas las veces me han salido paquetes anodinos, que ni sé que hacen ahí ni los voy a echar de menos cuando se vayan.Una vez seguros de lo que queremos hacer cogemos aire, nos encomendamos a Odín y ejecutamos "pkgsync" sin mirar atrás. En el peor de los casos, siempre podemos volver a cargar la imagen con clonezilla ;-).
Muy bueno. Tenía ganas de algo así.
ResponderEliminarHace unos meses estuve intentándolo basándome en el comando aptitude why. Pero al final no saqué nada útil de aquello.
Deseando reducir mis musthave.
Crees que podrá usarse el mismo musthave para todos los siatics de todos los centros, todos los ltspservers... Etc. Yo creo que sí.
Hola, Nando. Me alegro de que te funcione. Yo también he mirado el aptitude why, el apt-cache depends, varias cosas. Creo que esto es lo mas completo que he podido encontrar. Eso si, hay que usarlo con precaución ya que un musthave mal te puede dejar el sistema hecho unos zorros.
EliminarMejor ejecutar primero "pksync -s" y ver detenidamente que quiere quitar antes de hacer el pkgsync definitivo.
Creo que si se podrá usar el mismo musthave, uno básico con los paquetes mínimos. Luego ya cada cual puede instalar los suyos con sus musthave.d/* y musthave.ies. Seria cuestion de crearlos en varios centros distintos y comparar si siempre sale el mismo musthave o hay diferencias.
Saludos.