Hardware-Erkennung per Bash-Skript

Gestatten, Sherlock Bash

Die automatische Hardware-Erkennung beherrschen die meisten Distributionen erst seit wenigen Jahren. Dem Benutzer erscheint sie oft mystisch und magisch. Dabei kann jeder mit wenigen Zeilen Bash-Code eine eigene Hardware-Erkennung programmieren.

Zur Jahrtausendwende beherrschte kaum eine Distribution die automatische Hardware-Erkennung, oft genug musste man die nötigen Module selbst heraussuchen und in Konfigurationsdateien eintragen. Dabei ist es keine Hexerei, den passenden Treiber für ein Gerät zu finden.

Den Schlüssel zur die Hardware-Erkennung stellt die Liste der PCI-Geräte in den Unterverzeichnissen von /proc/bus/pci/. Hier gibt es für jedes PCI-Gerät eine eigene Pseudo-Datei mit detaillierten Informationen über die Konfiguration.

Abbildung 1 zeigt den Aufbau der dort abgelegten Konfigurationsdateien. Für die Hardware-Erkennung benötigen wir Angaben über den Hersteller und das Gerät: Die Vendor-ID und die Device-ID.

Abbildung 1: Für jedes PCI-Gerät gibt es in /proc/bus/pci eine Pseudo-Konfigurationsdatei. Sie enthält die für die Hardware-Erkennung wichtigen Vendor-, Device- und Class-IDs.

Genormte IDs

Beide IDs sind in der PCI-ID-Liste auf Sourceforge [1] hinterlegt und werden vom PCI-Konsortium für jedes Gerät einzeln zugewiesen. Auch die Linux-Treiber verlassen sich auf die Vendor- und Device-ID, um festzustellen, welche Geräte sie jeweils unterstützen und welche nicht.

Die PCI-ID-Liste von [1] lässt sich sehr einfach parsen, da die einzelnen Spalten jeweils mit Tabulator getrennt sind. Die Zeilen 20 bis 35 aus Listing 1 übernehmen diese Aufgabe.

Insgesamt gibt es fünf Spalten; die ersten drei sind für uns interessant. In der ersten steht entweder ein "v" für einen Hersteller-Namen oder ein "d" für eine Gerätebezeichnung. Die zweite Spalte enthält die Vendor-ID als vierstellige hexadezimale Zahl und bei Geräte-Einträgen zusätzlich die an die Vendor-ID angehängt Device-ID – also eine achtstellige hexadezimale Zahl. In der dritten Spalte findet sich der Herstellername oder die Gerätebezeichnung als Klartext. Diese Spalte verwenden wir später für die Ausgabe.

Skalare Variablen statt Arrays

Das Einlesen der PCI-ID-Liste erfordert einen Trick: Zweidimensionale Arrays nach dem Muster d[Vendor-ID][Device-ID] beherrscht die Bash nicht, und bei eindimensionalen Arrays ist der Index nicht groß genug, um 32-Bit-Werte nach dem Muster d[Vendor-ID/Device-ID] aufzunehmen.

Die Lösung bieten "Variablennamen mit Variablen", also einfache skalare Variablen: Der Herstellername oder die Gerätebezeichnung landet in einer Variablen, die mit "v" respektive mit "d" beginnt und dann die vierstellige hexadezimale Vendor-ID oder die achtstellige hexadezimale Vendor- und Device-ID trägt. In den Zeilen 28 und 32 sehen Sie die diese Zuweisungen – das Schlüsselwort declare ist erforderlich, damit die Bash aus v${2} respektive d${2} den vollen Variablennamen vor der Zuweisung auflöst.

Doch zurück zur PCI-ID-Datenbank: Spalte 4 hat noch eine besondere Bedeutung: Eine "0" signalisiert, dass es sich um einen von den Moderatoren der Liste verifizierten Geräteeintrag handelt, eine "1" zeigt einen noch nicht überprüften Eintrag eines Benutzers per Web-Formular. Das Skript verwendet bei den Herstellernamen lediglich geprüfte Einträge, siehe Zeile 27.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 08/2017: VIRTUALISIERUNG

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Aktuelle Fragen

Bash awk Verständnis-Frage
Josef Federl, 22.07.2017 17:46, 2 Antworten
#!/bin/bash # Skriptdateiname = test.sh spaltennummer=10 wert=zehner awk '{ $'$spaltennummer'...
Bash - verschachtelte Variablenersetzung, das geht doch eleganter als meine Lösung?
Josef Federl, 18.07.2017 20:24, 2 Antworten
#!/bin/bash #Ziel des Skriptes wird sein die ID zu extrahieren hier nur als Consolentest: root@...
Speicherplatzfreigabe mit "sudo apt-get clean" scheitert
Siegfried Böttcher, 16.07.2017 21:16, 2 Antworten
Speicherplatzfreigabe mit "sudo apt-get clean" scheitert, weil aus mir unerfindlichen Gründen im...
Möchte Zattoo vom PC am Fernsehgerät sehen können
Ilona Nikoui, 15.07.2017 18:25, 3 Antworten
Hallo, ich habe mein Fernsehgerät, ein LG 26LE3300 mit dem PC verbunden per HDMI Kabel, wie empfo...
TUXEDO und Hardwareauswahl , fragwürdig / Kritik
Josef Federl, 11.07.2017 12:44, 7 Antworten
Auf tuxedocomputers.com steht: "....Aber wir können auch Linux und das so, dass "einfach" alles...