Verzeichnis mit RPMs entrümpeln

Alles rund um die Installation Eures Linuxsystems, sowie die Updatefunktionen des Systems und das Paketmanagement

Moderator: Moderatoren

Antworten
Boccaccio
Member
Member
Beiträge: 59
Registriert: 2. Jun 2004, 20:38
Kontaktdaten:

Verzeichnis mit RPMs entrümpeln

Beitrag von Boccaccio » 9. Mai 2005, 19:30

Hallo zusammen!

Ich verwalte meine Pakete unter SuSE 9.1 mit apt. Da mein /var wo apt die heruntergeladenen RPMs speichert nur 1 GB groß ist, kopiere ich bei Bedarf die RPMs auf eine andere Platte mit mehr Platz.
Nun hat sich im Laufe der Zeit in diesem Verzeichnis eine beträchtliche Anzahl an Paketen gesammelt, insgesamt sind es knapp 3 GB. Dabei ist es aber so, daß ich viele RPMs in mehreren Versionen habe, z.B. kdebase3-3.2.1-68.15, kdebase3-3.2.1-68.23, kdebase3-3.3.1-10, kdebase3-3.3.1-3, kdebase3-3.3.2-7, kdebase3-3.4.0-27.
Um das ganze jetzt etwas zu entrümpeln würde ich gerne die nicht mehr aktuellen Pakete löschen. Dies per Hand zu machen erscheint mir allerdings bei 1289 Dateien sehr mühsam, weshalb ich fragen wollte, ob jemand weiß, wie man dieses Problem einfach lösen kann.

Schönen Dank schon einmal im voraus.

Werbung:
Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus » 9. Mai 2005, 19:37

guggst du hier:

[TIP] apt cache aufräumen
http://www.linux-club.de/viewtopic.php?t=21675

nimm gleich das RPM :)
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User

Boccaccio
Member
Member
Beiträge: 59
Registriert: 2. Jun 2004, 20:38
Kontaktdaten:

Beitrag von Boccaccio » 9. Mai 2005, 20:54

So, ich habe jetzt das apt-smartclean-RPM installiert und dann mal versucht, das ganze an meine Bedürfnisse anzupassen, in dem ich folgende Ersetzung gemacht habe:

Code: Alles auswählen

def cleanaptcache(dryrun=0,dirs=('/var/cache/apt/archives/','/var/cache/apt/archives/partial/')):
wurde zu

Code: Alles auswählen

def cleanaptcache(dryrun=0,dirs=('/home/Bjoern/I/apt-RPMs/')):
Das führte dann aber zu folgendem Ergebnis:

Code: Alles auswählen

computername:/usr/bin # apt-smartclean
Running on SuSE-i386
Traceback (most recent call last):
  File "/usr/bin/apt-smartclean", line 61, in ?
    cleanaptcache(dryrun)
  File "/usr/bin/apt-smartclean", line 26, in cleanaptcache
    for file in os.listdir(dir):
OSError: [Errno 2] No such file or directory: 'h'

Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus » 9. Mai 2005, 20:59

/home/Bjoern/I/apt-RPMs/ ist kein apt-Verzeichnis ....
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User

Grothesk
Ultimate Guru
Ultimate Guru
Beiträge: 14662
Registriert: 26. Okt 2003, 11:52
Wohnort: Köln

Beitrag von Grothesk » 9. Mai 2005, 21:00

An dem skript musst du nichts ändern. Die von apt runtergeladenen rpms liegen immer in var/cache/apt...

Boccaccio
Member
Member
Beiträge: 59
Registriert: 2. Jun 2004, 20:38
Kontaktdaten:

Beitrag von Boccaccio » 9. Mai 2005, 21:02

Aber das ist das Verzeichnis, in dem ich meine RPMs gesammelt habe. Und aus Platzgründen ist es nicht möglich, jetzt erstmal alles nach /var/cache/apt/archives zu kopieren, dort zu entrümpeln und den verbleibenden Rest wieder nach /home/Bjoern/I/apt-RPMs zu bringen.

Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus » 9. Mai 2005, 21:03

Grothesk hat geschrieben:An dem skript musst du nichts ändern. Die von apt runtergeladenen rpms liegen immer in var/cache/apt...
fast richtig :)
in der apt.conf gibt es eine Sektion, die legt fest wo der cache steht. In meinem Fall in /local/packages2 ... und nicht /var

Code: Alles auswählen

Dir "/"
{
...
    Cache "local/packages2/cache/apt/" {
        archives "archives-8.2";
        srcpkgcache "srcpkgcache-8.2.bin";
        pkgcache "pkgcache-8.2.bin";
    };
...
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User

Grothesk
Ultimate Guru
Ultimate Guru
Beiträge: 14662
Registriert: 26. Okt 2003, 11:52
Wohnort: Köln

Beitrag von Grothesk » 9. Mai 2005, 21:05

O.K. du hast recht. Ich war jetzt von einer Standardinstallation ausgegangen wie sie wohl die meisten hier haben. Bei Leuten die sich die Verzeichnisse zurechtbiegen gehe ich davon aus, dass die auch die skripte anpassen können.

Boccaccio
Member
Member
Beiträge: 59
Registriert: 2. Jun 2004, 20:38
Kontaktdaten:

Beitrag von Boccaccio » 9. Mai 2005, 21:13

Also ich hab jetzt an meine apt.conf Folgendes angehängt

Code: Alles auswählen

Dir "/"
{
    Cache "home/Bjoern/I/apt-RPMs/" {
        archives "archives-9.1";
        srcpkgcache "srcpkgcache-9.1.bin";
        pkgcache "pkgcache-9.1.bin";
    };
}
da noch nichts Cache-Bezogenes drin stand. Leider gibt mir apt-smartclean immer noch dieselbe Fehlermeldung aus :-(

Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus » 9. Mai 2005, 21:15

Boccaccio hat geschrieben:Aber das ist das Verzeichnis, in dem ich meine RPMs gesammelt habe. Und aus Platzgründen ist es nicht möglich, jetzt erstmal alles nach /var/cache/apt/archives zu kopieren, dort zu entrümpeln und den verbleibenden Rest wieder nach /home/Bjoern/I/apt-RPMs zu bringen.
dann musst du dir mit apt4rpm (aptate) ein eigenes apt-Repository anlegen und mit aptate indizieren, in der sources.list wird dies durch einen Eintrag
# Mirrors in /local/packages
rpm file:/local/packages2/apt/ SuSE/8.2-i386 SuSE82
eingebunden. dann Wird dieses Verzeichnis zu einem "apt"-Verzeichnis ... und dann kann das apt-smartclean dort auch löschen.

Ansonsten Handarbeit :)
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User

Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus » 9. Mai 2005, 21:16

bevor es das apt-smartclean gab habe ich dieses script verwendet, musst du dir selber ein wenig anpassen ...

wenn das scrip myMirrorCheck heisst werden mit
myMirrorcheck | xargs rm -f die alten Versionen gelöscht ...

Code: Alles auswählen

#! /bin/bash
#####################################################
# actual mirror is checked for "duplicates"
#
# to delete all duplicates:
# myMirrorCheck | xargs rm -f
#####################################################

#####################################################
# params: list of rpm-names
#         directory-name
#####################################################
function processList ()
{
	if [ -n "$1" ]; then
		for name in $1; do
			# search every real package in masterlist
			if [ ! "`grep -o $2/$name $MASTERLIST`" ]; then
				# actual package $name is not most recent version
				if [ "$VERSION" = "yes" ]; then
					getInstalledVersion $name
					echo "$2/$name [$PACKAGEVERSION]"
				else
					echo "$2/$name"
				fi
			fi
		done
	fi
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package
#####################################################
function packageBaseName ()
{
	TMPdatei=$1
	TMPdatei2=${TMPdatei%-*}
	TMPdatei3=${TMPdatei2%-*}
	PACKAGEBASENAME=${TMPdatei3##/*/}
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package
#####################################################
function packageNameVersion ()
{
	TMPdatei=$1
	TMPdatei2=${TMPdatei%.rpm}
	TMPdatei3=${TMPdatei2%.*}
	PACKAGEBASENAME=${TMPdatei3##/*/}
}

#####################################################
#####################################################
function getInstalledVersion ()
{
	packageBaseName $1
	PACKAGEVERSION=`rpm -q $PACKAGEBASENAME 2> /dev/null`
}

#####################################################
# rpms in actual directory $1
#####################################################
function processDirectoryContent ()
{
	LISTE=`ls -1 *.rpm 2> /dev/null`
	processList "$LISTE" $1
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package-0.64-1.i686.rpm
#####################################################
function get686PackageName ()
{
	TEMP=$1
	TEMP2=${TEMP%.i586.rpm}
	PACKAGENAME=$TEMP2.i686.rpm
}

#####################################################
# build master list
#####################################################
function buildMasterList ()
{
	# APT cache directory
	CACHEDIR=$MIRRORBASE/apt/share/$SUSE_VERSION2/cache
	cd $CACHEDIR
	CACHELISTE=`ls -1 . 2> /dev/null`

	# build list with most recent version for every list in cache
	for i in $CACHELISTE; do
		$COMPAREPROG --format path --rpmtype bin $CACHEDIR/$i >  /tmp/$i.mrv
		$COMPAREPROG --format path --rpmtype pat $CACHEDIR/$i >> /tmp/$i.mrv
	done

	# build master list from all (sub)lists
	MASTERLIST=/tmp/MASTER.rmv
	cat /tmp/*.mrv > $MASTERLIST
	rm -f /tmp/*.mrv
}

#####################################################
#####################################################
function setMirrorParam ()
{
	MIRRORBASE=$LOCAL_MIRROR_BASE
	BASEVERZ=$SERVER_BASE_VERZ
	SUSEVERZ=$SUSE_PREFIX

	MIRRORVERZ=""
	case "$SUSE_VERSION" in
	8.2)
		MIRRORVERZ="$MIRRORVERZ SuSE82"
		;;
	9.0)
		MIRRORVERZ="$MIRRORVERZ SuSE90"
		;;
	9.1)
		MIRRORVERZ="$MIRRORVERZ SuSE91"
		;;
	esac
}

#####################################################
# special check for architecture i586 vs i686
#####################################################
function checkArchitecture ()
{
	case "$SUSE_VERSION" in
	8.2)
		PACKMANVERZ=$BASEVERZ/SuSE82
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	9.0)
		PACKMANVERZ=$BASEVERZ/SuSE90
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	9.1)
		PACKMANVERZ=$BASEVERZ/SuSE91
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	esac

	echo ""
	for i in $LISTE; do
		get686PackageName $i
		if [ -f $PACKAGENAME ]; then
			echo $VERZ586/$i
		fi
	done
}

#####################################################
# check for programm
#####################################################
function checkProgramm ()
{
	COMPAREPROG=/usr/lib/apt4rpm/compare_rpm_version
	if [ ! -f $COMPAREPROG ]; then
		echo "$0: programm $COMPAREPROG is missing ??"
		exit 1
	fi
}

#####################################################
# compare mirrored package vs installed package
#####################################################
function checkInstalledPackages ()
{
	for i in $MIRRORVERZ; do
		cd $MIRRORBASE/$i
		LISTE=`ls -1 *.rpm 2> /dev/null`
		processList2 "$LISTE" $i

		# get subdirectory names in actual directory
		SUBDIR=`ls -d * 2> /dev/null`
		for k in $SUBDIR; do
			if [ -d "$k" ] && [ "$k" != "SRPMS" ]; then
				cd $k
				LISTE=`ls -1 *.rpm 2> /dev/null`
				processList2 "$LISTE" $i/$k
				cd ..
			fi
		done
	done
}

#####################################################
# compare mirrored SRPM package vs installed package
#####################################################
function checkSRPMPackages ()
{
	SRPM_VERZ=""
	case "$SUSE_VERSION" in
	8.2)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE82"
		;;
	9.0)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE90"
		;;
	9.1)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE91"
		;;
	esac

	for verz in $SRPM_VERZ; do
		cd $verz
		LISTE=`ls -1 *.src.rpm 2> /dev/null`
		processList2 "$LISTE" $verz
	done
}

#####################################################
# compare mirrored package to installed package
# params: package name
#         directory
#####################################################
function checkVersion ()
{
	getInstalledVersion $1
	if [ -n "$PACKAGEVERSION" ]; then
		packageNameVersion $1
		if [ "$PACKAGEVERSION" != "$PACKAGEBASENAME" ]; then
			echo "$2/$1 [$PACKAGEVERSION]"
		fi
	fi
}

#####################################################
# compare a list of packages vs installed package
# params: list of rpm-names
#         directory-name
#####################################################
function processList2 ()
{
	if [ -n "$1" ]; then
		for name in $1; do
			checkVersion $name $2
		done
	fi
}

#####################################################
# set basic parameters
#####################################################
function setParam ()
{
	case "$1" in
		8.2)
			SUSE_VERSION=8.2
			SUSE_VERSION2=suse82
			;;
		9.0)
			SUSE_VERSION=9.0
			SUSE_VERSION2=suse90
			;;
		9.1)
			SUSE_VERSION=9.1
			SUSE_VERSION2=suse91
			;;
	esac

	LOCAL_MIRROR_BASE=/local/packages
}

#####################################################
# myMirrorCheck [-a] [-v]
#####################################################
ARCHCHECK=no
VERSION=no

# debug option
#set -x

# mirror params
case "$1" in
	8.2)
		setParam 8.2
		;;
	9.0)
		setParam 9.0
		;;
	9.1)
		setParam 9.1
		;;
esac
shift

setMirrorParam

while [ $# -gt 0 ]; do
	case $1 in
	  -a)
		ARCHCHECK=yes
		;;
	  -v)
	  	VERSION=yes
	  	;;
	  -i)
	  	checkInstalledPackages
		exit 0
	  	;;
	  -s)
	  	checkSRPMPackages
		exit 0
	  	;;
	  -h)
	  	echo "$0 [-(a)rchitecture] [-(v)ersion] [-(s)ource] [-(i)nstalled]"
		exit 1
	  	;;
	esac
	shift
done

# version compare programm
checkProgramm

# build list of packagenames from mirror
buildMasterList

# check all mirror directories
for i in $MIRRORVERZ; do
	cd $MIRRORBASE/$i
	processDirectoryContent $i

	# get subdirectory names in actual directory
	SUBDIR=`ls -d * 2> /dev/null`
	for k in $SUBDIR; do
		if [ -d "$k" ] && [ "$k" != "SRPMS" ]; then
			cd $k
			processDirectoryContent $i/$k
			cd ..
		fi
	done
done

# cleanup
rm -f $MASTERLIST

if [ "$ARCHCHECK" = "yes" ]; then
	checkArchitecture
fi
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User

Boccaccio
Member
Member
Beiträge: 59
Registriert: 2. Jun 2004, 20:38
Kontaktdaten:

Beitrag von Boccaccio » 9. Mai 2005, 21:51

Ich hab mich jetzt für eine halbmanuelle Lösung entschieden. Die Dateien aus /home/Bjoern... habe ich in passenden Häppchen nach /var/cache... kopiert, dann apt-smartclean darauf losgelassen und anschließend in einem neuen Verzeichnis gesammelt.

Was mich nur etwas verwundert ist, daß meine ursprünglich angedachte Scriptveränderung nicht funktionierte, da ich mein /home/Bjoern/I/apt-RPMs mit aptate indiziert und zur sources.lsit hinzugefügt habe. Ich kann von dort aus Pakete installieren und ein apt policy xyz zeigt mir auch Pakete dort an.

Egal, Hauptsache ich hab jetzt fürs erste aufgeräumt.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste