Administration
Hier stehen Dinge, die man nur als Administrator (Root) bzw. Superuser ausführen kann.
- Administratorrechte bekommen:
Sitzt man vor einem Linux-Rechner kann man sich sehr einfach(!) Root-Rechte verschaffen. Dazu muß man nur im Bootmanager als Optioninit=/bin/bash
eingeben. Das System bootet dann ohne(!!) nach dem Passwort zu fragen in eine bash-shell mit Root-Rechten. Jetzt gibt man einfach> passwd
ein und gibt ein neues Passwort ein. Damit hat man das Root-Passwort neu gesetzt und damit sofort Root-Rechte auf diesem Rechner. - Als Administrator/Superuser das Passwort eines anderen Benutzers neu setzen
Als Superuser kann man sich zwar jederzeit mittels sudo -i -u [Benutzername] als Benutzer [Benutzername] anmelden, aber versucht man dann das Passwort mittels passwd neu zu setzen, wird man nach dem alten Passwort des Benutzers [Benutzername] gefragt, das man wahrscheinlich nicht kennt. Viel einfacher und ohne das Passwort des Benutzers zu kennen, setzt man das Passwort als Administrator/Superuser neu:> passwd [Benutzername]
- Passwortänderung beim nächten Login erzwingen:
Will man, dass ein Benutzer beim nächsten Login sein Passwort neu setzt, so benutzt man> passwd -e [Benutzername]
Dies ist auch nützlich, wenn man gerade einen neuen Benutzeraccount angelegt hat und dem Benutzer ein initiales Passwort per Email senden möchte, dass er nur für den ersten Login verwenden soll. Setzt man unmittelbar nach der Erzeugung des Account passwd -e [Benutzername], so ist der Benutzer gezwungen bereits beim ersten Login ein neues Passwort zu setzen. Mehr dazu bei Hakuna Matata:How do I force linux to change (forcefully) user password?. - Als Superuser X-Programme ausführen:
Mit dem üblichen su-Befehl kann man keine X-Programme (Programme mit grafischer Benutzeroberfläche) ausführen, da die entsprechenden Rechte nicht automatisch gesetzt werden. Unter Suse gibt es dafür folgenden Befehl:> sux
Nach Eingabe des Superuserpassworts kann man dann ohne Probleme auch Programme mit grafischer Benutzeroberfläche mit Superuserrechten aus der Kommandozeile starten. - Einem Benutzer in die sudoers-Liste aufnehmen:
Frei nach Wikipedia/Sudo: Man benutzt sudo anstelle von su, um bestimmten Benutzern die Möglichkeit zu geben, gewisse Programme mit den Rechten eines anderen Benutzers (meistens Root) ausführen zu können, ohne das Root-Passwort weitergeben zu müssen. Die Sicherheitsrichtlinien sind bei Linux in der Datei /etc/sudoers gespeichert, die nur vom Superuser root editiert werden darf.
Um also für einen Benutzer sudo freizuschalten, editiert man als root die sudoers-Datei> jpico /etc/sudoers
Folgende Zeilen müssen hinzugefügt werden, um einem Benutzer [username] Zugriff auf alle Befehle mittels sudo zu geben:[username] ALL=(ALL) ALL
Unter Suse Linux wird der Benutzer beim Ausführen von sudo jedoch trotzdem standardmäßig nach dem root-Passwort gefragt. Um das zu verhindern muß man zwei Zeilen wie folgt auskommentieren#Defaults targetpw # ask for the password of the target user i.e. root #%users ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
Jetzt fragt sudo wie gewünscht beim Ausführen nach dem Benutzerpasswort und nicht nach dem root-Passwort. - sudo benutzen:
Um sich als anderer Benutzer [username] einzuloggen:> sudo -i -u [username]
Um sich als root einzuloggen:> sudo -i
Letzterer Befehl ist äquivalent zu sudo su -. Will man eine Shell mit root-Rechten, jedoch ohne die Umgebungsvariablen der aktuellen Umgebung zu verlieren, so benutzt man> sudo -s
Letzteres funktioniert jedoch nur, wenn in der Datei /etc/sudoers die eventuell vorhandene ZeileDefaults env_reset
auskommentiert(!) ist. Mehr zum sudo-Kommando gibt es unter RootSudo(help.ubuntu.com). - Graphische (X-Window) Programme ueber sudo aufrufen:
Das naive Aufrufen graphischer Programme aus einer sudo-Shell scheitert meist, da notwendige Umgebungsvariablen nicht gesetzt sind. Insbesondere wird vom Betriebssystem oft die XAUTHORITY-Variable nicht gesetzt, weswegen auch nach einem sudo -s die X-Window-Ausgabe nicht funktioniert, obwohl sie in der Umgebung des vorherigen Benutzers durchaus funktioniert hat. Man muß daher leider die XAUTHORITY-Variable manuell setzen> export XAUTHORITY=$HOME/.Xauthority > sudo -s > xclock
Will man jedoch eine Login-Shell, so muß man zusaetzlich noch die DISPLAY-Variable setzten und zwar auf den Wert den sie fuer den Benutzer [username] hatte von dem aus man sudo aufgerufen hat> echo $DISPLAY localhost:11.0 > echo $HOME /home/[username] > sudo -i > export DISPLAY=localhost:11.0 > export XAUTHORITY=/home/[username]/.Xauthority > xclock
- Daemonen (Dienste) unter Suse Linux neustarten:
Manchmal hilft ein Neustart eines Hintergrundprozesses (auch Daemon, bzw. Dienst genannt) um die seltsamsten Probleme zu lösen. Den SSH-Server z.B startet man unter Suse 9.3 mit der Kommandozeile> rcsshd restart
neu. - Eigene MAC Adresse herausfinden:
> sudo /sbin/ifconfig eth0 Link encap:Ethernet HWaddr [MAC-Adresse] ...
wobei [MAC-Adresse] die gesuchte MAC-Adresse der ersten eingebauten Netzwerkkarte ist. Braucht man die WLAN MAC-Adresse steht diese oft unter Punkt eth1. - Herausfinden, welche Computer online in einem Subnetz sind:
> nmap -sP 123.123.123.*
Wird derselbe Befehl nicht als root aufgerufen, findet nmap eventuell nicht alle Computer. - Herausfinden, welches Betriebssystem hinter einer bestimmten IP-Nummer steckt:
> nmap -O 123.123.123.*
- Herausfinden, welcher Benutzer und welcher Prozess auf Dateien in einem Verzeichnis zugreift:
> lsof /pfad/verzeichnis
lsof steht dabei für "list open files" (siehe auch UnixforAdvancedUsers). - Alle Dateien eines bestimmten Benutzers finden:
> sudo find / -user [user]
Der Befehl funktioniert natürlich nur, wenn der Benutzer [user] existiert. Mehr Infos gibts bei www.cyberciti.biz.
- Eine Datei schreibschützen (so dass selbst root die Datei nicht verändern kann):
> chattr +i [readonly]
Mit diesem Befehl kann man sicherstellen, dass die Datei [readonly] niemals überschrieben werden kann, auch nicht von root selbst. Allerdings kann man als root den Schutz natürlich wieder entfernen. Das ist nützlich, um sicherzustellen, dass bestimmte Dateien (z.B. /etc/passwd und andere Systemdateien) auch bei Systemupdates nicht überschrieben werden können. Das ganze funktioniert wohl nur auf ext2/3/4 Dateisystemen. Da der Befehl relativ wenig bekannt ist wird er auch von einigen RootKits benutzt um das Beseitigen des RootKits zu erschweren. Mehr Infos über den Befehl gibts bei linuxhelp.blogspot.com.
- Bildschirmsperre (mit Passwort) abschalten:
Manchmal kommt es vor, dass die Bildschirmsperre unter KDE abstürzt oder man das Passwort nicht mehr richtig eingeben kann. Dies passiert z.B. wenn man unter Suse 9.3 und KDE ein Passwort mit lateinischen Zeichen hat, jedoch auf russische Tastaturbelegung umgeschaltet hat kurz bevor die Bildschirmsperre kommt. Da man dann die Tastaturbelegung nicht mehr ändern kann (siehe dazu auch bugs.kde.org), kann man das Passwort mit den lateinischen Buchstaben nicht mehr eingeben und sich auch nicht mehr einloggen. Einzige Möglichkeit ist dann noch die Deaktivierung der Bildschirmsperre als root. Eingeloggt als root findet man die Bildschrimsperre mit> ps aux | grep kdesktop_lock pechvogel 14161 0.0 0.1 2700 704 pts/11 S 14:35
Mittels> kill 14161
kann man jetzt die Bildschirmsperre für den Benutzer pechvogel "abschießen", so dass derjenige wieder mit seiner noch laufenden "Session" weiterarbeiten kann. - Computer über Terminalkommando herunterfahren:
Will man das System sofort herunterfahren, so kann man dass mittels> sux > halt
oder> poweroff
erreichen. Der Befehl halt ist dabei die Abkürzung für shutdown -h now und poweroff steht für halt -p. Wenn man es weniger eilig hat, kann man das System z.B. in 2 Minuten mit dem Befehl> shutdown -h +2
herunterfahren. Will man nur neustarten benutzt man am besten> reboot
which is an alias for shutdown -r now. - System an einem bestimmmten Tag herunterfahren:
Mit dem Befehl shutdown allein ist es nicht möglich, den Computer an einem bestimmten Datum herunterzufahren, da shutdown nur Uhrzeitangaben, jedoch keine Datumsangaben (Tage, Monate, Jahre...) erlaubt. Daher muß man at benutzen, z.B.:> sux > at 05:00 30.08.05 at> halt at> [[Ctrl]]-[[d]] >
Dieser Befehl ([[Ctrl]]-[[d]] steht dabei für die abschließende Tastenkombination Ctrl-d ) fährt das System am 30.08.2005 um 5 Uhr früh herunter. Eventuelle Ausgaben werden als Mail an root@computername.domainname geschickt. - Scratch-Partition einrichten:
Um allen Benutzern auf einem Computer die Möglichkeit zu geben temporär Daten auf dem lokalen Computer abzulegen, ist es üblich sogenannte Scratch-Partitionen (oder ein Scratch-Verzeichnis) anzulegen. Um ein Scratch-Verzeichnis anzulegen kann man z.B. folgendermaßen vorgehen:> sux > cd / > mkdir scratch > chmod a+rwx scratch
Der letze Befehl gibt dabei allen Benutzern Lese- und Schreibrechte. Das Executable-Bit x zusätzlich ist wichtig, damit auch alle Benutzer in das Verzeichnis mittels cd wechseln können. - Windows-Partition unter Linux mounten:
> mount /dev/hdc1 /mnt -t vfat -o umask=000, exec
Dabei steht vfat für das Dateisystem FAT32, umask=000 gibt allen Benutzern Lese- und Schreibrechte und exec erlaubt das Ausführen von Programmen von dem gemounteten Dateisystem. Soll das Laufwerk immer beim booten gemountet werden, sieht ein entsprechender Eintrag in die Datei /etc/fstab folgendermaßen aus:/dev/sda7 /windows/E vfat users,gid=users, umask=0000,exec,utf8=true 0 0
Erläuterung zum umask-code:
Die erste 0 zeigt einfach an, dass eine Octal-Zahl folgt, die zweite Zahl steht für die Rechte des user, die dritte für die rechte der group und die vierte für others. Die Kodierung ist dabei folgendermaßen: keine Leserechte r=4, keine Schreibrechte w=2 und keine Ausführbarkeit x=1, sodass z.B. alle Rechte für others ausgeschlossen sind, wenn die entsprechende Zahl 4+2+1=7 ist. Alle möglichen Kombinationen entnehme man folgender Tabelle:0 1 2 3 4 5 6 7 rwx rw- r-x r-- -wx -w- --x --- - USB-Disk unter Linux als FAT32 formatieren:
Als root oder Superuser eingeben (siehe auch www.linuxclub.de):> mkfs.vfat -F 32 /dev/[laufwerk]
oder> mkdosfs -F 32 /dev/[laufwerk]
Das Laufwerk bekommt man unter KDE auf Suse Linux heraus, indem man das Icon des USB-Sticks auf dem Desktop rechtsklickt und im Menü->Eigenschaften wählt. - Disketten formatieren unter Linux:
Falls man an einem Computer sitzt der noch ein Diskettenlaufwerk besitzt> mformat a:
Dies formatiert eine Diskette mit dem DOS-FAT Dateisystem. Für weitere Informationen siehe SDB:Disketten formatieren unter Linux. - Unterschied zwischen user und users beim mounten:
Es besteht ein subtiler (und in den man-Pages schlecht erklärter) Unterschied zwischen den Optionen user und users, die man beim mounten von Laufwerken angeben kann:
Die Option user erlaubt es, dass jeder Benutzer ein Laufwerk mounten darf; aber nur der Benutzer, welcher das Laufwerk gemountet hat, darf es auch wieder unmounten. Die Option users erlaubt es hingegen, dass jeder Benutzer, egal ob er das Laufwerk gemountet hat oder nicht, dieses wieder unmounten darf. - Detaillierte Yast2-Fehlermeldungen lesen:
Sämtliche Fehler, die bei der Benutzung von Yast2 auftreten, werden detailliert im Yast2-Logfile mitprotokolliert. Lesen kann man dieses unter Suse Linux mit> less /var/log/Yast2/y2log
- NIS-User mit Yast2 verwalten
Unter Suse kann man über Yast2 nicht nur die lokalen Benutzer, sondern auf dem NIS-Server auch die NIS-Benutzer verwalten. Dazu muß ein NIS-Server konfiguriert und gestartet sein. Jedoch erkennt das Benutzerverwaltungsmodul von Yast2 nicht immer, wenn ein NIS-Server läuft, so dass es die Verwaltung der NIS-Benutzer nicht erlaubt. Einzige Abhilfe in diesem Fall ist mittels> /usr/lib/yp/ypinit -m
im Verzeichnis /var/yp den Server manuell neu zu initialisieren. Erst danach erkennt Yast2 wieder, dass ein NIS-Server läuft und erlaubt die NIS-Benutzerverwaltung. - RPM-Pakete von Kommandozeile über Yast2 installieren:
Obwohl es zunächst unsinnig klingen mag, ist es manchmal von Vorteil> kdesu /opt/kde3/share/apps/krpmview/setup_temp_source *.rpm
Dies entspricht der Aktion "Mit Yast installieren", welche man per Rechtsklick auf ein RPM im Kontextmenü des Konqueror findet. Es funktioniert auch mit mehreren RPMs. - RPM-Pakete von Kommandozeile ohne Yast2 installieren:
> rpm -Uhv [paketname].rpm
Die Option -U steht dabei für Upgrade, welches nach der Installation alle älteren installierten Versionen von [paketname] entfernt. -h steht für "hash marks", welches zur Fortschrittsanzeige beim Installieren 50 "hash marks" anzeigt. Die Option -v steht für "verbose" und sorgt u.a. dafür, dass die "hash marks" etwas schöner angezeigt werden. - Herausfinden, welche Version eines Pakets installiert ist:
> rpm -q [paketname]
- Herausfinden, wohin die Dateien eines Pakets installiert werden:
> rpm -q -l [paketname]
Kopieren für Fortgeschrittene
Wer jemals ein komplettes Home-Verzeichnis für z.B. Backup-Zwecke mittels cp -R kopiert hat, wird erstaunt feststellen, dass nicht alle Dateien kopiert wurden und auch die Rechte der Dateien eventuell nicht den ursprünglichen Rechten entsprechen. Ein ziemliches Desaster, wenn man diese Kopie für Backup-Zwecke verwenden wollte. Die Lösung dafür ist
> sudo cp -a -T source dest
Die Option -a ist equivalent zu -r -p -d, kopiert also rekursiv, erhält dabei die Rechte und erhält auch Links. Die Option -T behandelt das Ziel dest wie eine Datei, d.h. falls dest noch nicht existiert, wird es angelegt (mehr zu dieser Option unter http://www.gnu.org/software/coreutils) . Eine vergleichbare Lösung ist (siehe superuser.com):
> sudo cp -a source/. dest
Für den Fall, dass man auf einem sehr alten Unix-System arbeitet, das vielleicht nicht alle genannten cp-Optionen unterstützt, gibt es auch noch die Möglichkeit das Quellverzeichnis in eine tar-Datei zu packen und am Zielort wieder zu entpacken (das ganze funktioniert auch über ssh), siehe www.tech-recipes.com. Will man nur versteckte Dateien (.*) kopieren, stößt man mit dem Standardpatternmatching an Grenzen, denn .* gilt auch für ... Auch dabei kann tar helfen, siehe serverfault.com.
Netzwerkinterface unter Suse/Ubuntu konfigurieren
Unter Suse konfiguriert man Netzwerkarten usw. am besten über Yast2. Will man dennoch über die Kommandozeile arbeiten wird man feststellen, dass die unter Debian/Ubuntu verbreitete Konfigurationsdatei /etc/network/interfaces unter Suse nicht existiert (siehe openSUSE-HOWTO) . Unter Suse wird für jedes Netzwerkinterface eine eigene Datei der Form ifcfg-* unter /etc/sysconfig/network/ angelegt. Informationen über das Format dieser Datei gibt es mit man ifcfg und z.B. bei www.fibel.org. Wie man unter Ubuntu eine Netzwerkarte einrichtet wird bei Ubuntu Server Guide und in den Ubuntu ManPages erklärt. Für eine Netzwerkarte mit dynamischer IP-Adresse schreibt man in /etc/network/interfaces:
auto eth0 iface eth0 inet dhc
Für eine Netzwerkarte mit statischer IP-Adresse z.B.:
auto eth0 iface eth0 inet static address 123.456.10.225 netmask 255.255.255.0 gateway 123.456.10.254
Init-Skripte für Suse Linux schreiben
Init-Skript sind bash-Skripten, die benutzt werden sollten um einen Hintergrund-Dienst (Dämon,Service) zu kontrollieren (starten, stoppen,neustarten). Sie werden auch vom Betriebsystem genutzt um einen Dienst beim Start des System automatisch zu starten. Normalerweise werden sie in /etc/init.d als ausführbare Dateien ohne Suffix (z.B. /etc/init.d/sshd) gespeichert. Mit Suse wird ein Beispiel-Init-Skript mitgeliefert, das als Ausgangspunkt für eigene Init-Skripte dienen kann. Es liegt unter
/etc/init.d/skeleton
Eine ausführliche Anleitung zum Erstellen eigener Init-Skripten findet man bei Novell Developer - Writing_Init_Scripts. Mit
> sudo /sbin/chkconfig -a newservice
kann man einen Dienst beim Betriebssystem registrien, so dass er automatisch gestartet wird. In welchen Runlevels er gestartet wird, wird im Init-Skript definiert. Eine Übersicht über alle Dienste bekommt man mit
> sudo /sbin/chkconfig -l
Mehr über chkconfig steht bei easyLinux - Mit den Dienern reden.
Umgang mit ISO-Images unter Linux
Ein ISO-Image einfach zu dekomprimieren wie unter Windows scheint unter Linux nicht möglich zu sein. Stattdessen muss man als root(!)-User das Image als virtuelles Laufwerk mounten
> mkdir /mnt/iso > mount -r -t iso9660 -o loop Datei.iso /mnt/iso
Dabei bedeutet -r, dass von diesem Laufwerk nur gelesen werden kann und die Angabe -t iso9660 spezifiziert das genaue Dateisystem, kann aber oft auch weggelassen werden.
Jetzt kann man auch als normaler Benutzer das Iso-Image Verzeichnis z.B. ins aktuelle Verzeichnis kopieren
> cp -v -r /mnt/iso .
Jetzt hat man die Daten vom aktuellen Verzeichnis ausgehend im Unterverzeichnis iso. Von dort aus kann man die Daten weiterverarbeiten oder auch das iso-Verzeichnis anders komprimieren. Allerdings kann man das kopierte Verzeichnis iso nicht unmittelbar löschen, da es von einer (virtuellen) CD kopiert wurde und die Rechte noch einer nichtbeschreibbaren CD entsprechen. Daher muss man erst mit
> chmod -R a+w iso
die Rechte entsprechend anpassen, dann kann man das Verzeichnis wieder löschen mit
> rm -r iso
Um das ISO-Image wieder zu unmounten muss man als root eingeben
> umount /mnt/iso > rm -r /mnt/iso
Kommt bei umount der Fehler
umount: /mnt/iso: device is busy
so muss man sicherstellen, dass kein anderer Benutzer oder Programm gerade auf das Laufwerk zugreift (z.B. ein Terminal-Fenster, welches gerade auf /mnt/iso verweist). Dies kann man mit dem lsof-Kommando (siehe oben) überprüfen.
Aber eine Frage nach dieser ganzen Prozedur bleibt: Warum nur kann man ein ISO-Image unter Linux nicht einfach wie ein Archiv als normaler Benutzer entpacken? Aber das wäre wahrscheinlich zu einfach.
NFS-Server unter Suse Linux 9.3 einrichten
Ein Network File System (NFS) Server einzurichten ist unter Suse 9.3 nicht schwer. Jedoch kann es einige Probleme mit der Suse Firewall geben die einen viel Zeit kosten können, daher hier diese Kurzanleitung zur NFS-Server-Installation:
- Yast2 aufrufen und unter Network Services das NFS-Server-Modul aufrufen.
- Den NFS-Server durch anklicken von Start NFS-Server aktivieren und Open Port in Firewall auswählen. Ansonsten funktioniert später garnichts. Dann weiter zum nächsten Dialog gehen.
- Im nächsten Dialog muß man nun durch Auswahl von Add directory das
per NFS zu verteilende Verzeichnis angeben. Im darauffolgenden Eingabefenster
kann man als Host wildcard * übernehmen, aber damit erlaubt
man wirklich jedem, dass NFS-Laufwerk zu mounten. Es ist sicherer dies z.B. nur
für Rechner des eigenen Subnetzes zu erlauben. Man sollte daher für
Host wildcard z.B.
192.168.0.0/255.255.255.0
eintragen. Als Optionen sollte manro,root_squash,async
setzen. Die Option ro erlaubt dabei nur lesenden Zugriff auf das freigegebene Verzeichnis, root_squash (wörtl. "Wurzel zerquetschen") verhindert, dass jemand mit Rootrechten auf einem fremden Rechner, der das NFS-Laufwerk eingebunden hat, diese Rootrechte auch auf dem NFS-Laufwerk hat und async erlaubt einen schnelleren Zugriff und Datentransfer (ist allerdings etwas anfälliger für Fehler als sync). - Durch Anklicken von Finish wird der NFS-Server gestartet.
Die Clientrechner sollten nun in der Lage sein, dass freigegebene Verzeichnis zu sehen und einzubinden. Oft ist dies jedoch noch nicht der Fall. Dann sollte man zunächst mit Rootrechten vom Client aus überprüfen, ob der Portmapper Daemon auf dem Server läuft:
> rpcinfo -p servernameDieser Befehl sollte eigentlich eine Liste anzeigen, die so ähnlich aussieht:
program vers proto port ... 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs ...Passiert jedoch garnichts, so handelt es sich um ein Problem mit der Firewall auf dem Server. Vermutlich wurde Open Port in Firewall vergessen auszuwählen. Wenn stattdessen die Fehlermeldung
RPC: Program not registerederscheint, so sollte man die Dateien /etc/hosts.allow bzw. /etc/hosts.deny überprüfen. In /etc/hosts.allow sollte man folgende Dienste erlauben, falls man ansonsten in /etc/hosts.deny alle Dienste erst einmal generell verboten hat:
portmap: 192.168.0.0/255.255.255.0 :ALLOW mountd: 192.168.0.0/255.255.255.0 :ALLOW lockd: 192.168.0.0/255.255.255.0 :ALLOW rquotad: 192.168.0.0/255.255.255.0 :ALLOW statd: 192.168.0.0/255.255.255.0 :ALLOW
Mehr dazu findet man auch in der Linux-NFS-HOWTO
Funktioniert der rpcinfo-Befehl jedoch ohne Probleme und
der Clientrechner findet die Freigaben immer noch nicht, so hilft es häufig
die Suse Firewall auf dem Server ab- und dann wieder anzuschalten. Dann funktioniert
seltsamerweise oft alles wieder wie es soll.
Mehr zum Thema NFS findet man abgesehen vom oben erwähnten
Linux-NFS-HOWTO auch auf deutsch unter linuxwiki.de.
Subversion (SVN) einrichten
Das Versionskontrollsystem Subversion (SVN) einzurichten lohnt sich nicht nur für Gruppen von Entwicklern
sondern auch für den einzelnen Programmierer, denn mit SVN hat man praktisch eine Zeitmaschine (wie es die
SVN Entwickler selbst ausdrücken), die es einem erlaubt sämtliche(!) Änderungen (d.h. auch das Überschreiben
und Umbenennen von Dateien und Verzeichnissen u.ä.) an einem Projekt transparent zu verfolgen und gegebenenfalls
rückgängig zu machen. Wäre jedes Filesystem ein Versionskontrollsystem gäbe es nie mehr Datenverlust durch das
unbeabsichtigte Überschreiben von Dateien, vor dem auch Techniken wie die Verwendung von "Trashcans" in
modernen Betreibsystemen nicht schützen. Aber es soll hier nicht diskutiert werden, warum es sowas nützliches wieder
nicht gibt, sondern die Installation von SVN dargestellt werden.
Die Installation von SVN ist im Prinzip in der ausführliche offiziellen
Onlineanleitung zu SVN beschrieben. Jedoch liegt der Schwerpunkt
eher auf der Installation im Zusammenhang mit dem WebDAV-Module für Apache. Will man jedoch nicht extra
Apache laufen lassen und stattdessen SVN einfach über SSH bedienen sind einige Fallstricke bezüglich
Benutzerrechten zu umschiffen. Dies wird recht übersichtlich bei
Linux-fuer-alle erklärt
und soll hier nochmal zusammengefasst und ergänzt werden:
- Zunächst muß man Subversion auf dem Server installieren, auf dem man das Repository (die Ablage für die Dateien, die versionskontrolliert werden sollen) anlegen möchte. Dies macht man am besten mit Yast2.
- Dann sollte man eine neue Benutzergruppe (Name z.B. svn) im System anlegen. Alle Benutzer, die später Subversion verwenden wollen, müssen Mitglieder dieser Gruppe werden. Am einfachsten erledigt man das wieder mit Yast2 indem man unter "Security and Users" das Module "Edit and create groups" aufruft (Ob man das "lokal" auf dem Rechner macht, auf dem das Repository liegt, oder "global" auf dem eventuell vorhandenen NIS-Server ist eigentlich egal, aber mit einer globalen Gruppe ist es später leichter, das Repository auf einen anderen Rechner zu verschieben). Nach Aufruf von "Add" (eventuell sollte man vorher unter "Set Filter" "NIS Groups" oder "System Groups" auswählen, damit man später auch die "globalen" Benutzer sieht) gibt man "Group Name" und "Group ID" (diese sollte > 500 sein, andernfalls gibts Probleme) und wählt die zugehörigen Mitglieder aus. Danach kann man das ganze durch Drücken von "Accept" und "Finish" abschließen.
- Damit sich die verschiedenen Benutzer nicht gegenseitig aussperren, weil die gesendeten
Dateien die falschen Benutzungsrechte haben, muß man auf dem Repository-Server den
Befehl /usr/bin/svnserve durch ein Wrapper-Skript ersetzen, welches automatisch
die richtigen Rechte für alle empfangenen Dateien setzt. Dazu sollte man den
Orginalbefehl umbenennen:
> mv svnserve svnserv
und stattdessen folgendes Skript anlegen:> pico svnserve #!/bin/bash umask 002 #Everything is allowed for user and the group, #nothing is allowed for others. /usr/bin/svnserv $*
Nicht vergessen, dass Skript für alle ausführbar zu machen:> chmod a+x svnserve
- Jetzt muß man das Repository anlegen, z.B. kann man mit Rootrechten ein neues Verzeichnis im
Wurzelverzeichnis des Repository-Servers anlegen:
> cd / > mkdir subversion
Will man erlauben, dass auch Benutzer der Gruppe svn neue Repositories innerhalb des Verzeichnises subversion anlegen können, so muß man noch die Gruppenzugehörigkeit und die Schreibrechte dieses Verzeichnisses anpassen:> chown root.svn subversion/ > chmod g+w subversion/
Hat man den letzten Schritt getan, kann man die folgenden mit einem Benutzer aus der Gruppe svn durchfuehren, ansonsten muß man weiter mit Root-Rechten arbeiten.> cd subversion > mkdir projektname
Das Unterverzeichnis projektname ist nur zur Übersicht, da man sicher mehr als nur ein Projekt mit Subversion verwalten möchte. Dieses Unterverzeichnis muß man nun zu einem Repository erklären (subversion legt dazu dort einige Unterverzeichnisse und Dateien an):> svnadmin create --fs-type fsfs projektname
Die Option --fs-type fsfs stellt dabei sicher, dass Subversion als Speichersystem einfach das Filesystem verwendet und nicht die veraltete Berkley Database (DB), die eigentlich nur Nachteile hat (siehe Repository Administration im Online Manual). Ich wundere mich, warum sie immer noch in der Defaulteinstellung verwendet wird. - Nun muß man die Zugriffsrechte auf das Repository so anpassen, dass später alle
Mitglieder der angelegten Gruppe svn Zugriff darauf haben:
> chgrp -R svn projektname
Alle anderen haben im Repository nichts verloren:> chmod -R o-rwx projektname
Die Gruppenmitglieder sollen natürlich auch schreiben dürfen:> chmod -R g+rw projektname
Um sicherzustellen, dass die Logfiles, welche Subversion anlegt auch problemlos geschrieben werden können ist noch folgende Rechteänderung nötig:> chmod g+s projektname/db
- Nun muss man nur noch die Konfiguration des Repositories etwas anpassen.
Dazu sollte man in der Datei /subversion/projektname/conf/svnserve.conf
folgendes eintragen:
[general] #Diese Zeile darf nicht weggelassen werden. anon-access = none auth-access = write realm = projektname
- Falls noch nicht geschehen kann man jetzt Subversion mit Yast2
auch auf den Clientrechnern installieren. Von einem Clientrechner aus kann
man jetzt, wenn man zur Benutzergruppe svn gehört, das Repository
mit Daten füllen:
svn import dirname svn+ssh://[svnserver]/subversion/projektname/dirname -m "Original Version"
Dabei steht dirname z.B. für das Verzeichnis in dem das Projekt (inklusive Sourcecode, Makefiles, Bilder, Readme usw., Subversion verwaltet alles!) bisher auf dem Clientrechner lag. [svnserver] steht für die Adresse des Servers, auf dem das Repository eingerichtet wurde und mit der Option -m hat man die Möglichkeit kurze Notizen zu dem gerade eingerichtet Projekt zu geben. Noch ein Tipp zum Schluß: Falls aus unerfindlichen Gründen beim Datenimport plötzlich vim startet, so kann man diesen mit Eingabe von :quit[[Enter]] beenden. Die darauf folgende Frage muß man dann mit c(ontinue) beantworten. Dann startet der Datenimport aber wirklich.