Natürlich muß ein unterstützter SCSI Kontroller vorhanden sein. Außerdem muß der Kernel noch Treiber für SCSI, den/die SCSI-Hostadapter und das generische Interface beinhalten.
Die Kernelkonfiguration (mittels make config
unter
/usr/src/linux
) sieht typischerweise so aus:
...
*
* SCSI support
*
SCSI support? (CONFIG_SCSI) [n] y
*
* SCSI support type (disk, tape, CDrom)
*
...
Scsi generic support (CONFIG_CHR_DEV_SG) [n] y
*
* SCSI low-level drivers
*
...
Falls Module möglich sind, können diese natürlich auch stattdessen verwendet werden.
Das generische SCSI Interface verwendet eigene Devicedeskriptoren, also
nicht die der anderen SCSI Gerätetreiber. Das Skript MAKEDEV
(zu finden im /dev
Verzeichnis) kann die Einträge erzeugen.
Der Aufruf MAKEDEV sg
erzeugt diese Einträge:
crw------- 1 root system 21, 0 Aug 20 20:09 /dev/sga
crw------- 1 root system 21, 1 Aug 20 20:09 /dev/sgb
crw------- 1 root system 21, 2 Aug 20 20:09 /dev/sgc
crw------- 1 root system 21, 3 Aug 20 20:09 /dev/sgd
crw------- 1 root system 21, 4 Aug 20 20:09 /dev/sge
crw------- 1 root system 21, 5 Aug 20 20:09 /dev/sgf
crw------- 1 root system 21, 6 Aug 20 20:09 /dev/sgg
crw------- 1 root system 21, 7 Aug 20 20:09 /dev/sgh
| |
Major, Minor Device Nummern
Es fällt auf, daß dies Character-Deviceeinträge für Lowlevelzugriff sind.
Hinweis: Auf manchen Systemen mögen die Namen auch
/dev/{sg0,sg1,...}
lauten,
die folgenden Beispiele müssen dann entsprechend angepaßt werden.
Diese Deskriptoren werden dynamisch auf die aktiven SCSI ID/LUNs der SCSI-Busse abgebildet (LUN bedeutet logische Einheit von logical unit). Die Zuordnung (beim SCSI-Busscan) weist der Reihe nach alle LUNs von allen IDs von allen SCSI-Bussen zu. Begonnen wird bei der kleinsten LUN der kleinsten ID des ersten SCSI-Busses. Bei mehreren SCSI-Kontrollern schließen sich die folgenden Busse ohne Lücken an. Dieser Schritt findet beim Initialisieren des SCSI-Hosttreibers statt (also zum Zeitpunkt des Bootens oder beim Einfügen des Hosttreibermoduls).
Ein Beispiel: Nehmen wir an, es gibt drei angeschlossene SCSI Geräte mit den Ids 1, 3 und 5 auf dem ersten SCSI-Bus (jedes belegt eine LUN). Dann würde sich die folgende Zuordnung ergeben:
/dev/sga -> SCSI Id 1
/dev/sgb -> SCSI Id 3
/dev/sgc -> SCSI Id 5
Falls jetzt ein weiteres Gerät mit ID 4 dazukommt, verändert sich die Zuodnung (nach erneutem Busscan) zu:
/dev/sga -> SCSI Id 1
/dev/sgb -> SCSI Id 3
/dev/sgc -> SCSI Id 4
/dev/sgd -> SCSI Id 5
Beachte die Änderung bei Id 5 -- das entsprechende Gerät ist nicht
mehr
/dev/sgc
zugeordnet, sondern erscheint als /dev/sgd
.
Zum Glück gibt es bei modernen Kerneln eine Möglichkeit, darauf Einfluß zu nehmen.
Wenn alls ein neuerer Kernel und das /proc
Filesystem läuft,
können Geräte, die gerade nicht benutzt werden, mitten im Betrieb
ausgetragen und neu angemeldet werden. Dazu sind natürlich Superuser-
privilegien erforderlich.
Zum Austragen eines angemeldeten SCSI-Gerätes wird
echo "scsi remove-single-device a b c d" > /proc/scsi/scsi
und ähnlich zum Anmelden
echo "scsi add-single-device a b c d" > /proc/scsi/scsi
verwendet, dabei ist
'a' die Hostadapter Id (die erste ist 0)
'b' der SCSI-Bus des Hostadapters (der erste ist 0)
'c' die ID
'd' die LUN (die erste ist 0)
Um also die Zuordnungen der beiden Geräte /dev/sgc
und
/dev/sgd
zu vertauschen (siehe letztes Beispiel),
geben wir Folgendes ein:
echo "scsi remove-single-device 0 0 4 0" > /proc/scsi/scsi
echo "scsi remove-single-device 0 0 5 0" > /proc/scsi/scsi
echo "scsi add-single-device 0 0 5 0" > /proc/scsi/scsi
echo "scsi add-single-device 0 0 4 0" > /proc/scsi/scsi
Das klappt, weil die Gerätezuordnung nach Anmeldereihenfolge erfolgt.
Beim Anmelden neuer SCSI-Geräte ist zu beachten, daß nur eine begrenzte Anzahl von freien Einträgen zur Verfügung steht. Der Speicher ist zur Bootzeit reserviert worden und erlaubt zwei weitere Gerätezuordnungen.