Eine lokale Repository (Quelle) für PCLinuxOS erstellen

von Robert Stahl (Hairyplotter)

Einige werden sich fragen, "Wieso eine lokale Repository erstellen, wenn alles was gebraucht wird, auch im Internet zu bekommen ist?" Das ist eine berechtigte Frage, jedoch gibt es ein paar gute Gründe, diese zu erstellen. Erst einmal macht es bei der Installation von PCLinuxOS auf mehreren Rechnern, das aktualisieren schneller und auch einfacher. Wenn Sie die Repository auf einem externen Speichermedium erstellen, so können Sie die Rechner installieren und aktualisieren ohne mit dem Internet verbunden zu sein. Oder Sie sind wie ich und sagen; "was ich habe das habe ich".

Ich gehe hier nicht auf spezifische Hardware Konfigurationen ein. Sie können die Repository auf einem Ersatz Rechner der mit dem Internet verbunden ist speichern oder einer externen Festplatte, oder auf ihren Desktop Rechner. Der Schlüssel zur automatischen Synchronisierung ihrer Repository ist das Update Script das beim starten Ihres Systems durch cron gestartet wird, eine Verbindung mit dem Internet und das die Partition der Quelle gemounted ist (siehe unten).

Schritt 1

Planen Sie den Speicherplatz für ihre Quelle und stellen Sie sicher das genügend Speicherplatz vorhanden ist. Sie können sich den freien Speicherplatz von eingebundenden Partitionen und Geräten anzeigen lassen, indem sie den Befehl df in einer Konsole eingeben und die >Enter-Taste< drücken.

Filesystem  Size  Used    Avail     Use% Mounted on
/dev/sda1    12G   4.7G   6.6G      42%  /
/dev/sda6    40G   18G     22G      46%  /home
/dev/hda    550M   550M     0      100%  /media/cdrom0
/dev/sdb1   459G  176G    260G      41%  /media/Seagate

Wie zu sehen ist, habe ich 260GB freien Speicherplatz auf meinem externen Speichermedium (/dev/sdb1). Ich werde die Repository dort speichern. Das ermöglicht mir auch, falls erforderlich, weitere Computer zu aktualisieren.

WARNUNG: Stellen Sie sicher das ihre Repository nicht mit anderen Ordern oder Verzeichnissen verschmelzen. Besser ist es, wenn Sie die Repository in einem Unterverzeichnis ablegen /media/Seagate/Repository/PCLinux/. Der rsync Befehl (weiter unten) wird alle Dateien die nicht zur Synchronisierung gefunden werden in dem Quellverzeichnis löschen. So würde alles gelöscht werden, was sich im / Verzeichnis befindet. Fatal wenn es sich um ein Dateisystem handeln würde.

Wenn Sie nur die standard Repository-Sektionen (main extra nonfree kde4 gnome) nutzen wollen, benötigen Sie ca 15GB freien Speicherplatz. Benötigen Sie auch die SRPM (Source RPMS) (Paketebäcker), dann sollten Sie schon zwischen 30-40GB einrechnen.

Schritt 2

Wählen Sie eine Repository nahe ihres Heimatortes. Das downloaden der zu initialisierende Quelle ist der längste Part und ich wähle dafür eine interaktive Sitzung. Das gewährleistet die Überwachung des Prozess auf Unterbrechungen beim speichern. Der folgende Befehl ist ohne Zeilenumbruch.

rsync -aP --no-motd --stats --exclude=*testing --exclude=SRPM* spout.ussg.indiana.edu::pclinuxos/pclinuxos/apt/pclinuxos/2010/ /home/ftp/pub/linux

  • Achten Sie darauf den Befehl auf ihren Speicherort abzugleichen.
  • Lösche --exclude=SRPM* um die Source RPMS mit auf zu nehmen.

Dieser Teil ist erledigt und ich schrieb folgendes Script das mir das tägliche abgleichen/synchronisieren der Repository abnimmt. Das habe ich in /usr/local/bin gespeichert und eine Verknüpfung nach /etc/cron.daily* erstellt.

* ln -s /usr/local/bin /etc/cron.daily

#!/bin/bash
#--------------[ Change Log ]--------------
# 3/10/2010 Added --delete to the rsync command that was omitted by mistake.
#           Added $REPFILE variable to hold the location of the repository.
#
#
#
#
#
#
#--------------[ To Do List ]--------------
#--
#--
#--
#--
#--
#----------------------------------------------------------
# Function to perform some housekeeping before exiting.
#----------------------------------------------------------
function cleanup {
#
# Did we create a temporary file?
if [ -f $TMPFILE ]; then
# YES, then delete it before we exit.
rm $TMPFILE
fi
# Terminate the script with a return code of 0 (normal termination) or any other number (abnormal termination).
exit $RETVAL
}
# name the file we are going to log our output to.
REPFILE="/media/Seagate/Repository/PCLinux"
LOGFILE="/media/Seagate/Repository/rsync.log"
# Create a temporary file.
TMPFILE=`mktemp -t rsync.XXXXXXXXXX`
# Was the temporary file created without errors?
if [ $? -ne 0 ]; then
# NO, print a message to our log file then terminate.
   printf "\n********** `date +'[%A %b %d %Y] - [%r]'` **********\n" >> $LOGFILE
   printf "Repository update FAILED: Unable to create temporary file\n" >> $LOGFILE
   RETVAL=1
   cleanup
fi
# Set our file counter to 0
COUNT=0

# Call rsync to sync our repository with spout.ussg.indiana.edu.
# -a: This is equivalent to -rlptgoD. It is a quick way of saying you want recursion  and  want  to  preserve  almost everything.
# -P: Show progress. This isn't very useful in a non-interactive session, but its nice when we want to sync interactively.
# --no-motd: Most servers have an motd, we don't need to see it so have rsync ignore it.
# --stats: Give us some extra file transfer stats. Good during an interactive session.
# --exclude=<pattern>: Ignore directories matching <pattern>. In this case, testing, kde4 and SRPM (source rpms).
# --log-file=: Log output to the temporary file we created above.
rsync -aP --no-motd --stats --delete --exclude=*testing --exclude=*kde4 --exclude=SRPM* --log-file=$TMPFILE spout.ussg.indiana.edu::pclinuxos/pclinuxos/apt/pclinuxos/2007/ /home/ftp/pub/linux 2>/dev/null
# get the return value from rsync and assign it to RETVAL for later use.
RETVAL=$?
# Did rsync terminate without errors?
if [[ $RETVAL -ne 0 ]]; then
# NO, there was a problem with rsync. Write a FAILED notice to our log file, then exit.
printf "\n********** `date +'[%A %b %d %Y] - [%r]'` **********\n" >> $LOGFILE
case $RETVAL in
1)      REASON="Syntax or usage error";;
2)      REASON="Protocol incompatibility";;
3)      REASON="Errors selecting input/output files, dirs";;
4)      REASON="Requested  action  not supported";;
5)      REASON="Error starting client-server protocol";;
6)      REASON="Daemon unable to append to log-file";;
10)     REASON="Error in socket I/O";;
11)     REASON="Error in file I/O";;
12)     REASON="Error in rsync protocol data stream";;
13)     REASON="Errors with program diagnostics";;
14)     REASON="Error in IPC code";;
20)     REASON="Received SIGUSR1 or SIGINT";;
21)     REASON="Some error returned by waitpid()";;
22)     REASON="Error allocating core memory buffers";;
23)     REASON="Partial transfer due to error";;
24)     REASON="Partial transfer due to vanished source files";;
25)     REASON="The --max-delete limit stopped deletions";;
30)     REASON="Timeout in data send/receive";;
35)     REASON="Timeout waiting for daemon connection";;
*)      REASON="Undefined error";;
esac
printf "Repository update FAILED with error code $RETVAL: $REASON\n" >> $LOGFILE
RETVAL=2
cleanup
else
# YES, rsync finished without errors.
# get the number of package files transferred.
TRANSFERRED=`cat $TMPFILE | grep -c .rpm`
# Were any files transferred durning this update?
if [ $TRANSFERRED -gt "0" ]; then
# YES, we had some files transferred.
# Add a note to the logfile detailing the current time and the number of files transferred.
    printf "\n********** `date +'[%A %b %d %Y] - [%r]'` **********\n" >> $LOGFILE
    printf "Repository update SUCEEDED with $TRANSFERRED files transferred.\n" >> $LOGFILE
printf "Number\tSection\t\tFilename\n" >> $LOGFILE
echo "-------------------------------------------" >> $LOGFILE
else
# NO, there were no files transferred durning this update.
# No need to add a note to the log file.
# Call the cleanup function which will terminate this script after some housekeeping.
RETVAL=0
cleanup
fi
# Since we had some files transferred, we will parse our temp file line by line to get the filenames.
cat $TMPFILE | while read line
do
# Does this line have .rpm in it (denoting a package file)
FILE=`echo $line | grep .rpm`
if [ ! -z "$FILE" ]; then
# YES, lets increment our counter by 1 then write that number along with the section and filename transferred to our log file.
COUNT=$(($COUNT+1))
FILE=`echo $FILE | awk '{ print $NF }'`
SECTION=`echo $FILE | cut -d'/' -f3`
FILENAME=`basename $FILE`
printf "  $COUNT:\t$SECTION\t$FILENAME\n" >> $LOGFILE
fi
done
fi
RETVAL=0
cleanup

Schritt 3

Nun habe ich die Quelle geladen und bin bereit, jetzt setze ich noch den FTP Server um die Repositories für alle Rechner zugänglich zu machen.

Beginnend mit der Installation von vsftpd aus den Repositories.

Nachdem ich einige vsftpd Konfigurationsdateien studiert habe, öffnete ich die /etc/vsftpd/vsftpd.conf mit kwrite und fügte

*Ändern Sie die FTP Einstellungen zu ihre Konfiguration ab.

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
# I want a read only anonymous ftp.
anonymous_enable=YES
anon_root=/home/ftp
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_world_readable_only=YES

cmds_allowed=PASV,PWD,LIST,TYPE,MKD,CWD,EXIT,QUIT,HELP,RETR

pasv_min_port=10450
pasv_max_port=10500

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

use_localtime=YES

hinzu.

Um vsftpd zu starten gehe ich zu dem PCC (PCLinuxOS Control Centrum) Kontrollzentrum von PCLinuxOS -> System -> Ein- oder Ausschalten von Systemdiensten. Danach öffne ich Synaptic auf den anderen Rechnern und füge unter -> Einstellungen -> Paketquellen die neue ungeprüfte Quelle hinzu durch klicken auf "New".
Davon ausgehend benötigen wir keine weiteren Quellen und können die anderen Quellen deaktivieren.

URI: 192.168.1.105/pub/linux
Distribution: pclinuxos/2010
sections: main extra nonfree kde gnome

Ein Klick auf "OK" gefolgt von einem "Neu Laden" und Sie haben ihre eigene PCLinuxOS Repository die auch noch aktuell ist.

*Anmerkung: 192.168.1.105 ist die IP Adresse die ich meinen übrigen Rechnern manuell zugeordnet habe. Ich nutze für meine Repositories FTP da dies für mich einfacher zu händeln ist, es gibt aber auch noch weitere Methoden.