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.