ubuntuusers.de » Wiki » udev

udev

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

udev ist ein Programm zur Überwachung und Auswertung von hotplug-Ereignissen. Bekommt udev Informationen über ein neues Gerät, wertet es diese anhand frei konfigurierbarer Regeln aus und gibt dem Gerät einen Namen. Anhand dieses Namens ist es dann als neue Gerätedatei im /dev/-Verzeichnis ansprechbar.

udev-Regeln

Nach udev-Regeln wird entschieden, wie ein Gerät heißt und was passieren soll, wenn ein Gerät erkannt wird, das einer Regel entspricht. Um den Namen zu vergeben, wird ein Symlink vom Kernelnamen des Geräts zu dem Namen erzeugt, den es bekommen soll. Die Regeln liegen in /lib/udev/rules.d/ bzw. bei älteren Systemen auch in /etc/udev/rules.d/. Die einzelnen Regeldateien beginnen hier mit einer zweistelligen Zahl. So ist sichergestellt, dass wichtige Regeln zuerst behandelt werden. Die Regeln werden alphabetisch abgearbeitet. Es können mehrere Regeln auf ein Device angewendet werden, das hat z.B. den Vorteil, dass ein Gerät mit mehreren Symlinks ausgestattet wird.

Eigene udev-Regeln

Eigene udev-Regeln legt man im Verzeichnis /etc/udev/rules.d/ ab. Um sicherzugehen, dass die eigenen Regeln vor den Systemstandards ausgeführt werden, sollte man die Datei mit einer niedrigen Zahl beginnen lassen. Wichtig ist auch, dass die Dateien, die die Regeln enthalten, mit ".rules" enden, da sie sonst nicht ausgeführt werden.

Ab Ubuntu 10.04 Lucid Lynx werden über udev auch Eingabegeräte konfiguriert, da HAL entfällt. Weitere Hinweise hierzu findet man im englischen Wiki.

SYSFS wird in zukünftigen Versionen durch ATTR für Events (event device) und ATTRS für den Haupteintrag (parent device) verwendet. (siehe Beispiel von udevadm weiter unten im Artikel)

Sinn eigener Regeln

Eigene Regeln sind z.B. sinnvoll, wenn man mehrere USB-Massenspeicher besitzt und diese nicht mit eindeutig zugeordneten Verzeichnis- oder Gerätenamen eingebunden werden. Dies ist dann ärgerlich, wenn z.B. auf einer USB-Festplatte die mp3-Dateien für Amarok liegen, die Platte aber immer anders eingebunden wird und die Sammlung dann neu eingelesen werden muss.

Mit udev erreicht man auch eine Unabhängigkeit von der Einschaltreihenfolge. Gerätenamen werden unter Linux "hochgezählt", so heißt z.B. der erste USB Stick /dev/sda1, der zweite /dev/sdb1. Das System kennt zunächst keinen Unterschied zwischen beiden Sticks.

Ein ähnliches Problem ergibt sich beim fehlerhaften Aushängen von Geräten. Das Gerät verschwindet plötzlich aus dem System, Gerätedateien, z.B. /dev/cdrom funktionieren nicht mehr. SCSI-Geräte werden bei Fehlern einfach "hochgezählt" und fehlerhafte Gerätedateien verworfen. Ein zunächst als sr0 eingebundenes Gerät heißt nach einem Disconnect auf einmal sr1. Der zugehörige Verweis - z.B. von /dev/cdrom auf /dev/sr0 - ist dann nicht mehr verwendbar.

Beispiele für eigene udev-Regeln

#USB-Stick
BUS=="usb", KERNEL=="sd?1", SYSFS{idVendor}=="0204", SYMLINK+="usbstick", RUN+="/usr/local/bin/usbstick-backup"
#USB HDD Musik
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="ABCDEF012345", SYMLINK+="musik"
#externes LG DVD-ROM
SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", NAME="dvd-rom-lg"
#Handy sync
SYSTEM=="usb", SYSFS{serial}=="123456789123456789" , OWNER="benutzername"

Hier sieht man vier Beispiele für udev-Regeln.

Im ersten Beispiel wird ein USB-Stick, der die Herstellernummer "0204" übermittelt, als /dev/usbstick erzeugt und ein Skript usbstick-backup gestartet.

Im zweiten Beispiel wird eine USB-Festplatte über die Seriennummer erkannt und die Gerätedatei wird in /dev/musik erzeugt.

Das dritte Beispiel bindet ein externes USB-DVD-Laufwerk mit der Modellbezeichnung "DVD-ROM GDR8163B" immer mit denselben Gerätenamen /dev/dvd-rom-lg ein. Unabhängig davon, ob es als sr1, sr2 oder sr3 eingebunden wird.

Das vierten Beispiel schaltet ein Mobilegerät am USB-Port für den Zugriff als normaler Benutzer frei. Das ermöglicht die Syncronisation z.B. per OpenSync.

Erstellen eigener udev-Regeln

Hier wird die Erstellung eigener udev-Regeln am Beispiel einer USB-Festplatte und einem externen USB-DVD Laufwerk erklärt.

Die Aufgabe ist, die USB-Festplatte beim Einschalten oder Anstecken automatisch einzubinden und ein Backup-Skript zu starten, um eine bequeme Datensicherung durchzuführen.

Die Aufgabe für das DVD-Laufwerk ist simpler. Es geht darum, dass das Gerät immer unter einem spezifischen Gerätenamen verfügbar ist.

Zunächst müssen Informationen über die Geräte gesammelt werden. Diese werden später als Filter zur Erkennung des Gerätes genutzt. Informationen bekommt kann auf mehrerlei Weise sammeln.

Probleme mit einigen Digitalkameras

Es kann sein, dass eine Kamera nicht als Massenspeichermedium erkannt wird, sondern nur über das Protokoll Gphoto2 {en} arbeitet. In diesem Fall wird die Bearbeitung durch Userspace-Programme gemacht, anstatt über einen Kernel-Treiber. Dass Problem daran ist vor allem, dass die später erwähnten Kernel-Name in diesem Fall nichts mehr bringen, da die Kamera ja wie gesagt kein Block-Device ist.

Daten über ein USB Gerät herausfinden mit lsusb

Als erstes wenden wir uns der USB Festplatte zu. Zuerst sollte man das Gerät anstecken oder einschalten und ein Terminal öffnen [1]. Dort führt man folgenden Befehl aus:

sudo lsusb 

Die Ausgabe sieht dann in etwa wie folgt aus:

Bus 005 Device 036: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter
Bus 005 Device 033: ID 144d:c019
Bus 005 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000

Das Wichtige zu merken ist die Nummer hinter Device, hier die 036.

Jetzt führt man Folgendes aus:

sudo lsusb -v > ~/lsusb.txt 

Die Ausgabe von lsusb wurde hierbei in die Datei lsusb.txt umgelenkt, man öffnet sie am besten mit einem Editor [2]. Dort sucht man dann den Abschnitt, der wie folgt beginnt:

Bus 005 Device 036: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter

Darunter sind viele Eigenschaften des Gerätes aufgeführt, man benötigt aber nur den Abschnitt Device Descriptor:

Bus 005 Device 013: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x0ab4 Cypress Semiconductor Corp.
  idProduct          0x685a USB-2.0 IDE Adapter
  bcdDevice            0.01
  iManufacturer          56 Cypress Semiconductor
  iProduct               78 USB2.0 Storage Device
  iSerial               100 ABCDEF012345
  bNumConfigurations      1

Hier sind vor allem die Zeilen idVendor, idProduct und iSerial interessant.

Daten über beliebige Geräte auslesen mit udevadm

SCSI- oder andere Geräte können eine andere Vorgehensweise nötig machen. Zuerst und bevor man das Gerät einsteckt, öffnet man ein Terminal [1] und beobachtet das Ende der Logdatei /var/log/messages. Dort werden die Linuxkernel-Informationen anzeigt:

tail -n 10 -f /var/log/messages 

Wie oben sollte man anschließend das Gerät - den Scanner, ein SCSI-Laufwerk, Handy, Kamera - anstecken oder einschalten. Die Ausgabe für ein externes USB-DVD-Gerät, welches als SCSI-Gerät erkannt wird, zeigt, was nach dem Einstecken passiert.

[51755.613225] usb 4-1: new high speed USB device using ehci_hcd and address 16
[51755.754296] usb 4-1: configuration #1 chosen from 1 choice
[51755.766872] scsi13 : SCSI emulation for USB Mass Storage devices
[51755.767872] usb-storage: device found at 16
[51755.767880] usb-storage: waiting for device to settle before scanning
[51760.764575] usb-storage: device scan complete
[51760.769702] scsi 13:0:0:0: CD-ROM            HL-DT-ST DVD-ROM GDR8163B 0L23 PQ: 0 ANSI: 0
[51760.790142] sr1: scsi3-mmc drive: 52x/52x cd/rw xa/form2 cdda tray
[51760.790274] sr 13:0:0:0: Attached scsi CD-ROM sr1
[51760.790372] sr 13:0:0:0: Attached scsi generic sg1 type 5

Wie man sieht, wurde ein externes CD-ROM-USB-Laufwerk eingesteckt, das jedoch als SCSI-Gerät erkannt und geführt wird: sr1. Wenn die Erkennung des Gerätes nach ein paar Sekunden abgeschlossen ist, kann man die Ausgabe abbrechen. Eine Kontrolle im /dev/ (Geräte)-Verzeichnis zeigt die Existenz des neuen Gerätes /dev/sr1:

ls -l /dev/sr1 

Nun kann man mit diesem Gerätenamen (/dev/sr1) genaue Informationen darüber finden, mit welchen Attributen das Gerät im System geführt wird. Diese Attribute können später 1:1 für eine udev-Regel verwendet werden. Die Eingabe des Befehls

udevadm info --query=all --name=/dev/sr1 

Zumindest bei Ubuntu 9.10 ist folgender Befehl nötig um den vollständigen Output zu bekommen:

udevadm info --query=all --attribute-walk --name=/dev/sr1 

führt meist zu einer sehr langen Ausgabe, da alle beim Einstecken des Gerätes beteiligten Systeme angezeigt werden. Dies können die z.B. sein

  • einzelne Chipsätze, Controller

  • Subsysteme, wie verschiedene USB Systeme (1.0, 1.1, 2.0)

  • Linux-Treiber (z.B. ehci_hcd)

  • einzelne Partitionen des Gerätes

Dementsprechend fein kann die Erkennung dieser Geräte mit udev für einen speziellen Zweck erfolgen. Es ist jedoch mit ein wenig Fantasie möglich, die Spreu vom Weizen zu trennen.

Die Ausgabe der beteiligten (Unter-) Systeme erfolgt blockweise. Jeder Block beginnt mit:

looking at ...

Der erste Ausgabeblock für das obige Gerät lautet z.B.

looking at device '/block/sr1':
  KERNEL=="sr1"
  SUBSYSTEM=="block"
  [...]

Der nächste und in diesem Fall interessante Ausgabeblock:

looking at parent device '/devices/pci0000:00/[...gekürzt]':
[...]
SUBSYSTEMS=="scsi"
[...]
ATTRS{model}=="DVD-ROM GDR8163B"
ATTRS{vendor}=="HL-DT-ST"
[...]

Hier bekommt man direkt die nötigen Informationen, welche später als "Filter" zur Erkennung eines spezifischen Gerätes verwendet werden können. Hier nimmt man die Modellnummer (ATTRS{model}), um das DVD-Laufwerk als solches eindeutig zu erkennen. Der Unterschied zur Methode mit lsusb ist, dass man dies für beliebige Geräte anwenden kann und direkt die Attributnamen (ATTRS{...}) für die Erstellung der udev-Regeln verwenden kann. Beliebt ist auch die Seriennummer des Gerätes, meist ATTRS{serial}.

udev-Regel schreiben und speichern

Zuerst öffnet man sich einen Editor mit Rootrechten [2]. Dann fängt man an, die Regel zu erstellen. Es ist vorteilhaft für spätere Änderungen, nicht mit Kommentaren zu sparen.

# USB Festplatte für Backups

Nun geht es an das eigentliche Erstellen der udev-Regel. Da die Festplatte am USB hängt, wird dies der erste Teil der Regel:

BUS=="usb"

USB-Festplatten werden vom Kernel meist mit /dev/sda oder /dev/sdb usw. benannt, die erste Partition dann /dev/sda1 usw. Daher wird als Regel gesetzt, dass das Gerät als sd?1 erkannt werden wird:

BUS=="usb", KERNEL=="sd?1"

Nun braucht man die Werte, die man vorher ermittelt hat. Ist die iSerial vorhanden bzw. nicht Null, ist der beste Weg, das Gerät über die Seriennummer zu erkennen:

BUS=="usb", KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345"

Ist die iSerial nicht gesetzt, kann man die Erkennung auch alternativ über idProduct:

BUS=="usb", KERNEL=="sd?1",SYSFS{idProduct}=="685a"

oder über idVendor machen.

BUS=="usb", KERNEL=="sd?1",SYSFS{idVendor}=="0ab4"

Ist das geschehen, kann man bestimmen, welchen Namen das Gerät bekommen soll:

BUS=="usb", KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup"

Mit der gleichen Methode wurde die Regel für das externe DVD Laufwerk erstellt (drittes Beispiel der Einführung). Lediglich wurden zur näheren Bestimmung des Gerätes SUBSYSTEMS=="scsi" und das Attribut ATTRS{model} verwendet. Dies genügt zur eindeutigen Bestimmung.

# LG DVD-ROM
SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", NAME="dvd-rom-lg"

Abschließend muss die Datei im Verzeichnis /etc/udev/rules.d/ gespeichert werden, z.B. als 70-usb-storage-custom.rules. Ein paar Richtlinien, nach denen man die Zahl am Anfang aussuchen sollte, finden sich in der Datei /etc/udev/rules.d/README.

Neustart des udev-Systems

Durch einen Neustart des Systems oder durch einen entsprechenden Befehl im Terminal [1] werden nach den Änderungsarbeiten die Dateien neu eingelesen:

sudo /etc/init.d/udev reload 

Bis Hardy Heron (8.04) kann man die Regeln auch mit dem Befehl

sudo udevcontrol reload_rules 

Ab Ubuntu 9.10:

sudo service udev reload 

neu einlesen lassen.

Wurden Regeln für fest eingebaute Geräte (z.B. PCI-Karten) festgelegt, muss udev zusätzlich dazu veranlasst werden, alle Geräte neu einzulesen. Dies geschieht mittels

sudo udevtrigger 

oder bei neueren Distributionen mittels

sudo udevadm trigger 

Wurden die Regel für entfernbare Geräte erstellt, müssen diese einfach entfernt und wieder eingesteckt werden.

Funktionstest

Der Funktionstest ist recht einfach durchzuführen, dazu muss man einfach die USB-Festplatte abziehen und neu anstecken. Ist dann eine Gerätedatei /dev/backup erstellt worden, hat alles geklappt. Wenn nicht, dann ist an der udev-Regel etwas falsch und man sollte sie korrigieren.

Anpassen der fstab und der Mountpunkte

Um die Festplatte auch vernünftig an einem festen Punkt im Dateisystem einbinden zu können, muss die Datei /etc/fstab angepasst werden.

Zuerst wird ein neuer Einhängepunkt angelegt [1]:

sudo mkdir /media/backup/ 

Anschließend muss die fstab editiert werden [2]. Da die Platte schon einmal eingebunden war, muss diese nur angepasst werden. Ein vorhandenes

/dev/sda1 /media/sda1 ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0

wird dazu einfach in

/dev/backup /media/backup ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0

geändert.

Sollte keine Zeile vorhanden sein, die der USB-Festplatte entspricht, muss eine neue Zeile angelegt werden, siehe hierzu den Artikel über fstab.

Nun kann man die Festplatte mit

mount /media/backup 

einbinden.

Automatischer Start eines Skripts

Man kann über udev ein Skript automatisch starten lassen, wenn ein Gerät erkannt wird. Hierzu werden der udev-Regel zwei weitere Punkte hinzugefügt:

BUS=="usb",ACTION=="add",KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup",RUN+="/usr/local/bin/backup"

Der Punkt ACTION=="add" sorgt dafür, dass die Regel nur zutrifft wenn das Gerät neu angeschlossen wird. Anderenfalls würde das auszuführende Skript nach Beenden sofort automatisch erneut gestartet werden.

Der Punkt RUN+="/usr/local/bin/backup" ruft das Skript /usr/local/bin/backup auf. Dabei muss darauf geachtet werden, dass das Skript mit vollständiger Pfadangabe aufgerufen wird. Dem Punkt RUN kann immer nur ein einzelner Befehl (mit Parametern) übergeben werden. Allerdings lassen sich über mehrere RUN+="..."-Einträge mehrere Befehle hintereinander ausführen:

BUS=="usb",ACTION=="add",KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup",RUN+="/usr/bin/logger Starte Backup.", RUN+="/usr/local/bin/backup"

In obigem Beispiel wird vor Ausführung des Backupskripts die Zeile "Starte Backup." in das Systemlog geschrieben.

Das Skript /usr/local/bin/backup wird nun beim Anstecken der USB-Festplatte gestartet. Dabei muss es sich selbst um das korrekte Einbinden kümmern:

1
2
3
4
5
#!/bin/sh

mount /media/backup
backup.start
eject /media/backup

Nutzung in der grafischen Oberfläche

GNOME Nautilus Drive Dialog

Wenn man Nautilus in der Übersicht "Computer" öffnet, sieht man alle im System eingehängten Massenspeichergeräte. Ein Rechtsklick auf das gewünschte Laufwerk, die Auswahl von "Eigenschaften", und ein Klick auf den Reiter "Drive", liefert die nötigen Informationen, welche auch durch udevadm auf der Kommandozeile angezeigt werden (siehe oben).

Unter "Settings" kann auch direkt ein Einhängepunkt eingegeben werden, ohne eine udev-Regel erstellen zu müssen. Der Einhängepunkt ist ein Verzeichnisname, welcher automatisch unterhalb des Verzeichnisses /media eingebunden wird.

Die weiteren Editierfelder "Dateisystemart" und "Mount Optionen" hat bis Gutsy Gibbon noch nicht funktioniert. Das Einbinden/Mounten wird jedoch in den meisten Fällen automatisch korrekt durchgeführt. Ein Editieren der /etc/fstab entfällt deswegen in den meisten Fällen. Auf Dauer wird dieser Dialog sicher das Erstellen von udev Regeln nur noch in Ausnahmefällen nötig machen.

Beispiel

Adam hat zu wenig Festplattenspeicherplatz auf seinem PC. Er entschließt sich, eine externe USB-Festplatte zu kaufen um damit seine Musiksammlung auszulagern. Er hört und verwaltet seine Musiksammlung mit Banshee und möchte dies auch unkompliziert weiterhin tun. Er entschließt sich, die externe Festplatte so zu integrieren, dass sie beim Anschließen sofort einsatzbereit ist und Banshee anfangen kann zu spielen. Ist die Festplatte nicht angeschlossen, ist die Musiksammlung in Banshee leer.

Folgende Schritte werden durchgeführt:

  1. Eine Regel für udev erstellen

  2. In fstab vier neue Einträge festlegen

Musiksammlung: Die udev-Regel erstellen

Zunächst wird mit einem Editor unter root-Rechten eine neue Datei erstellt, z. B.:

/etc/udev/rules.d/50-usb-storage-custom.rules

Inhalt der Datei:

# USB Festplatte für Music
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="ABCDEF012345", SYMLINK+="Adam-Music", RUN="/bin/mount /media/Adam-Music", RUN+="/bin/mount /media/Adam-Music/Music", RUN+="/bin/mount /media/Adam-Music/.config/banshee", RUN+="/bin/mount /media/Adam-Music/.config/banshee-1"

Die Regel identifiziert zuerst die externe Festplatte anhand der Seriennummer und ordnet ihr einen Namen zu. Danach wird die Festplatte erst einmal allgemein gemountet. Dann werden noch drei weitere Aktionen durchgeführt: Das mounten des Ordners mit der großen Musiksammlung und das einbinden der beiden Konfigurationsordner von Banshee, in denen unter anderem die Musikdatenbank gespeichert ist.

Musiksammlung: fstab anpassen

Damit die Kommandos wie z. B.

/bin/mount /media/Adam-Music/Music

richtig ausgeführt werden können, müssen in die Datei /etc/fstab folgende Zeilen hinzugefügt werden:

# Adam-Music
/dev/Adam-Music /media/Adam-Music ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0
/media/Adam-Music/Music  /home/adam/Music  none  user,bind  0  0
/media/Adam-Music/.config/banshee  /home/adam/.config/banshee  none  users,bind  0  0
/media/Adam-Music/.config/banshee-1  /home/adam/.config/banshee-1  none  users,bind  0  0

Die Festplatte ist in diesem fall mit ext3 formatiert.

Musiksammlung: Ein paar Hinweise

  • Auf der externen Festplatte existieren drei Ordner: Music, .config/banshee und .config/banshee-1. Der Inhalt der drei Ordner wurde anfangs von den gleichnamigen Ordnern aus dem Homeverzeichnis von Adam auf die externe Festplatte verschoben.

  • Die Mountpoints /media/Adam-Music, /home/adam/Music, /home/adam/.config/banshee und /home/adam/.config/banshee-1 müssen vor dem ersten Mounten bspw. mit mkdir angelegt werden.

  • Sind in den in den Mountpoints vor dem Einhängen der Ordner von der externen Festplatte schon Dateien vorhanden, so werden sie beim Mounten "überdeckt". Das heißt, sie sind nicht mehr erreichbar, wenn die externe Festplatte angeschlossen ist. Nach dem Aushängen sind die Daten wieder frei zugänglich. Es empfiehlt sich, die Mountpoints komplett leer zu lassen.

  • Ist die externe Festplatte gerade einmal nicht angeschlossen und Banshee wird gestartet, ist die Musiksammlung von Banshee naturgemäß leer. Außerdem generiert Banshee automatisch Inhalte in die beiden Ordner /home/adam/.config/banshee und /home/adam/.config/banshee-1, sofern die Ordner leer sind. Dies kann ignoriert werden, da dies den Mountvorgang nicht stört (siehe vorherigen Punkt).

  • Die externe Festplatte sollte nur angeschlossen oder ausgehängt werden, wenn Banshee gänzlich (auch im Hintergrund) geschlossen ist, da es sonst zu Dateifehlern kommen kann.

  • Soll die Festplatte im laufenden Betrieb entfernt werden, muss das Aushängen über Konsole und mit Root-Rechten erfolgen.

  • Wenn die Festplatte schon beim Hochfahren von Ubuntu angeschlossen ist, ist die Musiksammlung schon automatisch eingehängt.

  • Wenn der PC heruntergefahren ist, kann die externe Festplatte problemlos entfernt werden.

Diese Revision wurde am 29. Juli 2010 um 22:57 Uhr von DrD erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet: Hardware, System

Passwort vergessen?