Systemkonfiguration mit GNU RCS


Inhalt

Einführung
Verwaltung der RCS-Repositories
Anwendung von RCS
Verwaltung der RCS-Repositories eines Verzeichnisses
Wichtige RCS-Kommandos

Einführung

GNU RCS, das Revison Control System, dient allgemein der Verwaltung unterschiedlicher Versionen von Dateien. Mit Dateien sind in diesem Zusammenhang in erster Linie die Quelltexte eines Programms zu verstehen. Dabei dient RCS dazu, unterschiedliche Versionsstände von Programmen zu verwalten, z.B. um Produktivversionen von Entwicklungsversionen zu trennen. RCS verwaltet dazu spezielle Dateien, Repositories genannt, in denen die "Urversion" und die Änderungen gespeichert sind. Damit ist RCS in der Lage, den Zustand der Originaldatei in beliebigen Versionsständen wieder herzustellen. Dieser Vorgang wird "auschecken" genannt.. Da RCS jede Datei mit einem einzelnen Repository verwaltet, ist es für die Quellen von Programmen, die üblicherweise aus einer Vielzahl einzelner Dateien bestehen, wenig geeignet. Die Weiterentwicklung diese Konzepts ist GNU CVS.

Bei der Versionsverwaltung von Systemkonfigurationen gibt es einen bedeutenden Unterschied zur Versionsverwaltung von Programmen:
  • Bei Programmen ist eine "Version" der Stand aller beteiligten Quelltextdateien im entsprechenden Zustand.
  • Bei Systemkonfigurationen hat jeder einzelne Dienst (Samba, DHCP, ssh, etc) einen eigenen Versionsstand.
    Der Stand des Gesamtsystems ergibt sich aus den Versionsständen der einzelnen Dienste.
Die einzelnen Dienste werden mit einer überschaubaren Anzahl von Konfigurationsdateien (vielfach nur eine) konfiguriert. Um die verschiedenen Versionsstände weniger Dateien zu verwalten, deren Versionsstand zur Konfiguration eines Dienstes sogar unabhäng voneinander sein kann, ist RCS bestens geeignet.

Verwaltung der RCS-Repositories

Nach der Installation des erforderlichen Pakets kann RCS direkt verwendet werden. Ohne weiter Einrichtung erzeugt ci, das RCS-Kommando zum einchecken eines Versionsstandes, das erforderliche Repository im gleichen Verzeichnis wie die Originaldatei. Das Repository unterscheidet sich vom Original durch die Dateinamenerweiterung ",v".
Es ist jedoch wünschenswert, die Repositories von den Originaldateien zu trennen. Dazu muss im gleichen Verzeichnis, in dem die Originaldatei steht, ein Unterverzeichnis RCS (Großschreibung beachten!) erzeugt werden. ci erzeugt dann die Repositories für alle Dateien, auf die es angewendet wird, in diesem Unterverzeichnis.

Beispiel: Original und Repository für die Konfiguration des SSH-Daemons sshd, /etc/ssh/sshd_conf:

ohne RCS-Verzeichnis /etc/ssh: sshd_conf sshd_conf,v
mit RCS-Verzeichnis /etc/ssh: sshd_conf
/etc/ssh/RCS: sshd_conf,v

Anwendung von RCS

Demonstration der Anwendung von RCS am Beispiel der Konfigurationsdatei für den SSH-Daemon sshd.
Ausgangsszenario:
  • Sie haben das Paket für den SSH-Daemon "frisch" installiert.
  • Das von Ihnen verwendete Paket installiert die Konfigurationsdateien für ssh und sshd in /etc/ssh/.

  • Einchecken der Default-Konfiguration
    • Wechseln in das Konfigurationsverzeichnis
      cd /etc/ssh
    • Erstellen des Repository-Verzeichnis für alle Originaldateien in /etc/ssh/
      mkdir RCS
    • Einchecken der Standardkonfiguration von sshd_config
      ci -l sshd_config
      ci verlangt die Eingabe einer Beschreibung. Diese kann etwa so aussehen:
      Default
      .
      Der einzelne . schließt die mehrzeilige Eingabe ab.
  • Einchecken einer Änderung
    • Führen Sie die Änderungen von sshd_config mit einem Texteditor durch.
    • Einchecken der Änderung
      ci -l sshd_config
      ci verlangt eine Beschreibung der Änderung.
      Beschreiben Sie alle durchgeführten Änderungen Zeile für Zeile:
      Nur Mitglieder der Gruppe wheel dürfen sich per ssh einloggen
      usw.
      .
      Der einzelne . schließt die mehrzeilige Eingabe ab.
  • Anzeigen der Änderung
    • Anzeigen der Änderungsbeschreibungen und die Änderugen zwischen der letzten eingepflegten Änderung und der Standardkonfiguration.
      rcsdiff sshd_conf
Weiter Hinweise zu den RCS-Kommandos finden Sie unter "Wichtige RCS-Kommandos".

Verwaltung der RCS-Repositories eines Verzeichnisses

Wie in der "Einführung" angedeutet wurde, entspricht die hier vorgestellte Methode nicht ganz der Absicht der RCS-Entwickler. RCS pflegt den Versionsstand einer Datei. Bei der Verwaltung der Konfiguration eines Systems müssen die Informationen der verschienden RCS-Repositories in einem Verzeichnis zusammengefasst werden.
Zuvor muss außerdem sichergestellt werden, dass alle Änderungen an den Konfigurationsdateien mit ci eingepflegt worden sind.
Beide Aufgaben können nicht mit den "Bordmitteln" von RCS gelöst werden.
Das Perl-Skript
PL  checkrcs.pl
bietet die erforderlichen Funktionen.

Für die Nutzung dieses Skripts müssen folgende Perl-Pakete installiert sein:
Perl-Paket Debian SuSE
Getopt::Mixed libgetopt-mixed-perl perl-Getopt-Mixed
Rcs librcs-perl Nicht Bestandteil der SuSE Distribution
CPAN-Installation erforderlich

Aktualität der Repositories überprüfen

Die Option -c (check) überprüft die unter dem angegebenen Verzeichnis vorhanden RCS-Repositories auf Aktualität.
Das folgende Beispiel muss als root ausgeführt werden, da nicht alle Dateien in /etc als normaler User lesbar sind:

# bin/checkrcs.pl -c /etc
Ueberrpuefe RCS-Repositories in /etc
24 RCS-Repositories gefunden
2180 Originaldateien gefunden

RCS-Repositories ohne Quelldatei:
0 RCS-Repositories ohne Quelldateien gefunden

Quelldateien mit veralteten RCS-Repositories
/etc/fstab
1 Quelldatei mit veraltetem RCS-Repository gefunden

Hinweise:

RCS-Repositories ohne Quelldateien
Wenn RCS-Repositories ohne Quelldateien gefunden werden, deutet dies darauf hin, dass Pakete installiert, konfiguriert und die Versionen mit RCS verwaltet worden waren. In der Zwischenzeit sind die betreffenden Pakete gelöscht worden. Die entsprechenden Repositories können ggf. auch gelöscht werden.

Quelldateien mit veralteten RCS-Repositories
Wenn die letzte in RCS eingepflegte Version die Quelldatei verschieden sind, ist das Repository veraltet.
  • Wechseln Sie in das Verzeichnis der Quelldatei,
  • lassen Sie sich mit rcsdiff die Unterschiede anzeigen und
  • pflegen Sie die neue Version mit Angabe der Änderungen mit ci -l <Quelldatei> ein.

Dokumentation der Änderungen in einem Verzeichnis

Die Option -d (documentation) erstellt eine Dokumentation für ein Verzeichnis. Die Dokumentation umfasst alle Quelldateien unterhalb des angegebenen Verzeichnisses, für die ein RCS-Repository vorhanden ist:
  • die Beschreibung der Änderung(en), wie mit ci eingegebenen und
  • die Änderung(en).
Die Ausgabe kann durch einen optionalen Parameter beeinflusst werden:
  • -ds (summarize) gibt die Ergebnisse als Zusammenfassung für alle Änderungen der Quelldatei an
  • -dr (revision) gibt die Änderungen für jede Datei versionsweise an.
Beispiel (Auszug, user: root):
# bin/checkrcs.pl -ds /etc
...
/etc/fonts/local.conf:

Versionsbeschreibungen:
Rev. 1.2: Changes made by package maintainer
Änderungen:
30,32c30,32
< <edit name="autohint" mode="assign">
< <bool>true</bool>
< </edit>
---
> <edit name="rgba" mode="assign">
> <const>rgb</const>
> </edit>


/etc/proftpd.conf:

Versionsbeschreibungen:
Rev. 1.1: Initial revision
Rev. 1.2: Adding incoming directory with write permissions to all
Rev. 1.3: Using upload directory instead of incoming for public upload
Änderungen:
79,85d78
< # Allow write to incoming directory
< <Directory upload>
< <Limit WRITE>
< AllowAll
< </Limit>
< </Directory>
<
88,90c81,83
< <Limit WRITE>
< DenyAll
< </Limit>
---
> <Limit WRITE>
> DenyAll
> </Limit>

...

Auf diese Weise erhält man eine vollständige Übersicht über die Änderungen, die in /etc durchgeführt wurden.

Wichtige RCS-Kommandos

Aufgabe Kommando
Check-In
Einchecken der aktuellen Version einer Datei
ci <datei>
Einchecken des aktuellen Standes der <datei>
(Datei wird dabei gelöscht und muß mit co wieder ausgecheckt werden)

ci -l <datei>
Enchecken des aktuellen Standes der <datei> mit gleichzeitigem Auschecken und Sperren.
Datei bleibt erhalten
Datei wird für anderen User zum Einchecken gesperrt

ci -r<revision> <datei>
Einchecken des aktuellen Standes der <datei> unter der Version <revision>.
Erlaubt das Erstellen von Versionsverzweigungen
Lock aufheben
Fehlermeldung der Art
"ci: <verzeichnis>/RCS/244,v: no lock set by <user>"
behandeln
rcs -l -M RCS/<file>,v
Datei für den aktuellen user erneut locken, ohne Kommentar
Check-Out
Wiederherstellen einer Quelldatei
in der letzten bzw. in einem
bestimmten Versionsstand
co <datei>
Checkt die letzte eingecheckte Version der betreffenden Datei aus
co -l <datei>
Checkt die letzte Version aus und sperrt diese für andere User zum Einchecken
co -r<ver> <datei>
Checkt die Version <ver> der Datei aus
co -l -r<ver> <datei>
Checkt die Version <ver> der Datei aus und sperrt diese für andere User zum Einchecken
Versionsliste anzeigen rlog <datei>
Liste aller Versionsstände mit den zugehörgen log-Meldungen
Unterscheide zwischen den Versionen anzeigen rcsdiff <datei>
Anzeige der Änderungen der aktuellen Datei gegen den letzten eingecheckten Stand
rcsdiff -r<ver1> -r<ver2> <datei>
Beisp.: rcsdiff -r1.2 -r1.3 uif.conf
Anzeige der Änderungen zwischen den Versionen <ver1> und <ver2> der aktuellen Datei
Zwischen -r und der Versionsangabe darf kein Leerzeichen stehen!
Log-Messages einer Version ändern rcs -m<ver>:"<Neuer Logtext"> <datei>
Beisp.:
rcs -m1.1:"Version previous changing to IP-Range 10.7.19.171-10.7.19.179" hosts.allow
Symbolische Namen für Revisionen rcs -N<name>:<revison>