17.4. USB Speichermedien

Beigetragen von Marc Fonvieille.

Der Universal Serial Bus (USB) wird von vielen externen Speichern benutzt: Festplatten, USB-Thumbdrives sowie von CD- und DVD-Brennern. FreeBSD bietet Unterstützung für Geräte mit USB 1.x, 2.0 und 3.0.

Anmerkung:

Die Unterstützung für USB 3.0 ist mit einiger Hardware, einschließlich Haswell (Lynx Point) Chipsätzen, nicht kompatibel. Wenn FreeBSD beim Booten mit dem Fehler failed with error 19 abbricht, müssen Sie xHCI/USB3 im BIOS deaktivieren.

Unterstützung für USB-Massenspeicher ist im GENERIC-Kernel enthalten. Für einen angepassten Kernel müssen die nachstehenden Zeilen in der Kernelkonfigurationsdatei enthalten sein:

device scbus    # SCSI bus (required for ATA/SCSI)
device da	# Direct Access (disks)
device pass	# Passthrough device (direct ATA/SCSI access)
device uhci	# provides USB 1.x support
device ohci	# provides USB 1.x support
device ehci	# provides USB 2.0 support
device xhci	# provides USB 3.0 support
device usb	# USB Bus (required)
device umass	# Disks/Mass storage - Requires scbus and da
device cd	# needed for CD and DVD burners

FreeBSD benutzt den umass(4)-Treiber, der das SCSI-Subsystem verwendet um auf USB-Geräte zuzugreifen. Da alle USB-Geräte vom System als SCSI-Geräte erkannt werden, dürfen Sie nicht device atapicam in die Kernelkonfigurationsdatei aufnehmen, wenn es sich bei dem Gerät um einen CD- oder DVD-Brenner handelt.

Der übrige Abschnitt beschreibt, wie Sie überprüfen können ob ein USB-Gerät von FreeBSD erkannt wird und wie Sie das Gerät so konfigurieren, dass es verwendet werden kann.

17.4.1. Konfiguration von Geräten

Um die USB-Konfiguration zu testen, schließen Sie das USB-Gerät an. Verwenden Sie dmesg um zu überprüfen, ob das Gerät in den Systemmeldungen erscheint. Dies sollte in etwa so aussehen:

umass0: <STECH Simple Drive, class 0/0, rev 2.00/1.04, addr 3> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:4:0:-1: Attached to scbus4
da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
da0: <STECH Simple Drive 1.04> Fixed Direct Access SCSI-4 device
da0: Serial Number WD-WXE508CAN263
da0: 40.000MB/s transfers
da0: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da0: quirks=0x2<NO_6_BYTE>

Fabrikat, Gerätedatei (da0), Geschwindigkeit und Kapazität werden je nach Gerät unterschiedlich sein.

Da ein USB-Gerät als SCSI-Gerät erkannt wird, kann camcontrol benutzt werden, um die mit dem System verbundenen USB-Massenspeicher anzuzeigen:

# camcontrol devlist
<STECH Simple Drive 1.04>          at scbus4 target 0 lun 0 (pass3,da0)

Alternativ kann usbconfig benutzt werden, um die Geräte aufzulisten. Weitere Informationen zu diesem Kommando finden Sie in usbconfig(8).

# usbconfig
ugen0.3: <Simple Drive STECH> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)

Wenn das Gerät noch nicht formatiert ist, finden Sie in Abschnitt 17.2, „Hinzufügen von Laufwerken“ Informationen, wie Sie USB-Laufwerke formatieren und Partitionen einrichten. Wenn das Laufwerk bereits ein Dateisystem enthält, kann es von root nach den Anweisungen in Abschnitt 3.7, „Anhängen und Abhängen von Dateisystemen“ eingehängt werden.

Warnung:

Aus Sicherheitsgründen sollten Sie Benutzern, denen Sie nicht vertrauen, das Einhängen (z.B. durch die unten beschriebene Aktivierung von vfs.usermount) beliebiger Medien verbieten. Die meisten Dateisysteme wurden nicht entwickelt, um sich vor böswilligen Geräten zu schützen.

Um auch normalen Anwendern das Einhängen des Laufwerks zu gestatten, könnten Sie beispielsweise mit pw(8) alle potentiellen Benutzer dieser Gerätedateien in die Gruppe operator aufnehmen. Außerdem muss sichergestellt werden, dass operator Schreib- und Lesezugriff auf diese Gerätedateien haben. Hierfür werden die folgenden Zeilen in /etc/devfs.rules hinzugefügt:

[localrules=5]
add path 'da*' mode 0660 group operator

Anmerkung:

Verfügt das System über interne SCSI-Laufwerke, so verändern Sie die zweite Zeile wie folgt:

add path 'da[3-9]*' mode 0660 group operator

Dies wird die ersten drei SCSI-Laufwerke (da0 bis da2) davon ausschließen, in die Gruppe operator aufgenommen zu werden. Ersetzen Sie 3 durch die Anzahl der SCSI-Laufwerke. Weitere Informationen zu dieser Datei finden Sie in devfs.rules(5).

Aktivieren Sie nun die Regeln in /etc/rc.conf:

devfs_system_ruleset="localrules"

Als nächstes müssen Sie das System anweisen, auch normalen Benutzern das mounten von Dateisystemen zu erlauben, indem Sie die folgende Zeile in /etc/sysctl.conf hinzufügen:

vfs.usermount=1

Da diese Einstellung erst nach einem Neustart wirksam wird, können Sie diese Variable mit sysctl auch direkt setzen:

# sysctl vfs.usermount=1
vfs.usermount: 0 -> 1

Zuletzt müssen Sie noch ein Verzeichnis anlegen, in das das USB-Laufwerk eingehängt werden soll. Dieses Verzeichnis muss dem Benutzer gehören, der das USB-Laufwerk in den Verzeichnisbaum einhängen will. Dazu legen Sie als root ein Unterverzeichnis /mnt/username an, wobei Sie username durch den Login des jeweiligen Benutzers sowie usergroup durch die primäre Gruppe des Benutzers ersetzen:

# mkdir /mnt/username
# chown username:usergroup /mnt/username

Wenn Sie nun beispielsweise einen USB-Stick anschließen, wird automatisch die Gerätedatei /dev/da0s1 erzeugt. Ist das Gerät mit einem FAT-Dateisystem formatiert, kann es der Benutzer mit dem folgenden Befehl in den Verzeichnisbaum einhängen:

% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username

Bevor das Gerät entfernt werden kann, muss es abgehängt werden:

# umount /mnt/username

Nach Entfernen des Geräts stehen in den Systemmeldungen Einträge, ähnlich der folgenden:

umass0: at uhub3, port 2, addr 3 (disconnected)
da0 at umass-sim0 bus 0 scbus4 target 0 lun 0
da0: <STECH Simple Drive 1.04> s/n WD-WXE508CAN263          detached
(da0:umass-sim0:0:0:0): Periph destroyed

17.4.2. Automatisches Einhängen von Wechselmedien

Anmerkung:

autofs(5) unterstützt das automatische Einhängen von Wechselmedien beginnend mit FreeBSD 10.2-RELEASE.

Damit USB-Geräte automatisch eingehängt werden, muss der Kommentar für folgende Zeile in /etc/auto_master entfernt werden:

/media		-media		-nosuid

Anschließend fügen Sie folgende Zeilen in /etc/devd.conf hinzu:

notify 100 {
	match "system" "GEOM";
	match "subsystem" "DEV";
	action "/usr/sbin/automount -c";
};

Falls autofs(5) und devd(8) bereits ausgeführt werden, müssen Sie die Konfiguration neu einlesen:

# service automount reload
# service devd restart

autofs(5) wird beim Booten automatisch gestartet, wenn Sie folgende Zeile in /etc/rc.conf hinzufügen:

autofs_enable="YES"

Damit autofs(5) funktioniert, muss devd(8) aktiviert sein, was aber in der Voreinstellung der Fall ist.

Starten Sie jetzt die Dienste:

# service automount start
# service automountd start
# service autounmountd start
# service devd start

Jedes Dateisystem, das automatisch eingehängt werden kann, erscheint als ein Verzeichnis unterhalb von media. Das Verzeichnis wird nach dem Dateisystemlabel benannt, bzw. nach dem Gerätenamen, falls kein Label existiert.

Das Dateisystem wird transparent beim ersten Zugriff in den Verzeichnisbaum eingehängt und auch nach gewisser Zeit der Inaktivität wieder ausgehängt. Laufwerke können auch manuell ausgehängt werden:

# automount -fu

Diese Methode wird in der Regel bei Speicherkarten und USB-Sticks verwendet. Sie funktioniert aber mit allen Blockgeräten, einschließlich optischen Laufwerken und iSCSI-LUNs.

17.4.3. USB-Massenspeicher

Anmerkung:

Der cfumass(4)-Treiber ist ein USB Geräte-Modus-Treiber und steht mit FreeBSD 12.0 zur Verfügung.

Auf USB-OTG-kompatibler Hardware, wie in eingebetteten Systemen, kann der FreeBSD USB-Stack im Geräte-Modus laufen. Der Geräte-Modus ermöglicht es dem Rechner, verschiedene Arten von USB-Geräteklassen zu präsentieren, einschließlich serieller Schnittstellen, Netzwerkadapter und Massenspeicher. Ein USB-Host, beispielsweise ein Laptop oder Desktop-Rechner, kann darauf wie auf ein physikalisches USB-Gerät zugreifen.

Je nach angeschlossener Hardware, ermöglicht das usb_template(4) Kernelmodul es dem USB-Stack, automatisch zwischen Host- und Geräteseite umzuschalten. Das Anschließen eines USB-Gerätes an den USB-OTG-Port bewirkt, dass FreeBSD in den Geräte-Modus wechselt.

Was FreeBSD dem USB-Host präsentiert, hängt von der sysctl-Variablen hw.usb.template ab. Eine Liste der verfügbaren Werte finden Sie in usb_template(4). Damit der Host die geänderte Konfiguration erkennt, muss entweder das Gerät getrennt und wieder angeschlossen, oder der USB-Bus neu gescannt werden. Wenn auf dem Host FreeBSD läuft, können Sie usbconfig(8) reset benutzen. Dieser Befehl muss nach dem Laden von usb_template.ko erfolgen, falls der USB-Host bereits am USB-OTG-Port angeschlossen war.

Die sysctl-Variable hw.usb.template ist in der Voreinstellung auf 0 gesetzt, so dass FreeBSD als USB-Massenspeicher funktioniert. Dazu müssen die beiden Kernelmodule usb_template(4) und cfumass(4) geladen sein. cfumass(4) ist die Schnittstelle zum CTL-Subsystem, die auch für iSCSI- und Fibre Channel-Targets benutzt wird. Auf der Host-Seite können USB-Massenspeicher nur auf eine einzelne LUN (LUN 0) zugreifen.

USB-Massenspeicher benötigen keinen aktiven ctld(8)-Daemon, obwohl er bei Bedarf verwendet werden kann. Dies unterscheidet sich von iSCSI. So gibt es zwei Möglichkeiten, ein Target zu konfigurieren: ctladm(8) und ctld(8). Beide erfordern, dass das cfumass.ko Kernelmodul geladen ist. Das Modul kann wie folgt geladen werden:

# kldload cfumass

Wenn cfumass.ko nicht im Kernel enthalten ist, kann das Modul beim Booten über /boot/loader.conf geladen werden:

cfumass_load="YES"

Eine LUN kann auch ohne den ctld(8)-Daemon erstellt werden:

# ctladm create -b block -o file=/data/target0

Damit wird dem USB der Inhalt des Abbilds /data/target0 als LUN präsentiert. Die Datei muss vor dem Ausführen des Befehls vorhanden sein. Um die LUN beim Systemstart zu konfigurieren, fügen Sie den Befehl in /etc/rc.local hinzu.

ctld(8) kann ebenfalls verwendet werden, um LUNs zu verwalten. Erstellen Sie /etc/ctl.conf und fügen Sie eine Zeile in /etc/rc.conf hinzu, um sicherzustellen, dass ctld(8) beim Booten automatisch gestartet wird. Danach starten Sie den Daemon.

Dies ist ein Beispiel für eine einfache /etc/ctl.conf Konfigurationsdatei. ctl.conf(5) enthält eine ausführliche Beschreibung der einzelnen Optionen.

target naa.50015178f369f092 {
	lun 0 {
		path /data/target0
		size 4G
	}
}

Dieses Beispiel erstellt ein Target mit einer einzigen LUN. naa.50015178f369f092 ist eine Gerätekennung aus 32 zufälligen, hexadezimalen Ziffern. Die path-Zeile definiert den vollständigen Pfad einer Datei oder eines zvols, welche als Backend für die LUN benutzt wird. Die Konfigurationsdatei muss vor dem Start von ctld(8) existieren. Die zweite Zeile ist optional und gibt die Größe der LUN an.

Fügen Sie folgende Zeile in /etc/rc.conf hinzu, um den ctld(8)-Daemon beim Booten zu starten:

ctld_enable="YES"

Um ctld(8) zu starten, führen Sie dieses Kommando aus:

# service ctld start

Beim Start liest der ctld(8)-Daemon /etc/ctl.conf ein. Wenn diese Datei nach dem Start des Daemons bearbeitet wird, können Sie sie erneut einlesen, damit die Änderungen direkt wirksam sind:

# service ctld reload

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.