Wie wird by-id unter Linux erstellt?

6512
Pithikos

Wenn Sie einen USB-Mikrocontroller an den Port (ähnlich wie Arduino) anschließen, werden diese beiden Dateien erstellt:

/dev/serial/by-id/usb-MBED_MBED_CMSIS-DAP_10105a42e87da33c103dccfb6bc235360a97-if01 /dev/disk/by-id/usb-MBED_microcontrolleur_10105a42e87da33c103dccfb6bc235360a97-0:0 

Werden die IDs in diesem Fall spontan von einem Programm generiert oder sind sie irgendwo auf dem Gerät selbst fest codiert?

Wenn es on the fly erstellt wird:

  1. Wie genau ist es geschaffen?
  2. Wird es nur auf Linux-Maschinen existieren?
5

2 Antworten auf die Frage

3
Alex P.

by-idSymlinks werden durch udevRegeln erstellt (und sind spezifisch für Betriebssysteme udev)

Sie finden die spezifischen Regeln in /lib/udev/rules.d:

für serialGeräte in 60-persistent-serial.rules:

ENV{.ID_PORT}=="", SYMLINK+="serial/by-id/$env-$env-if$env" ENV{.ID_PORT}=="?*", SYMLINK+="serial/by-id/$env-$env-if$env-port$env{.ID_PORT}" 

und für die diskGeräte in 60-persistent-storage.rules:

KERNEL=="sd*|sr*|cciss*", ENV=="disk", ENV=="?*", SYMLINK+="disk/by-id/$env-$env" 
2
lemonsqueeze

Der Dateiname wird von udev generiert, aber die ID in ihm stammt vom Gerät selbst:

Wenn Sie laufen lsusb -vund danach suchen, werden Sie feststellen, dass dies die Serien-ID des Geräts ist:

... iManufacturer MBED iProduct microcontrolleur iSerial 10105a42e87da33c103dccfb6bc235360a97 

oder etwas ähnliches.


Wie kommt es dazu ?

Nehmen wir an, der USB-Stick wird montiert /mnt/tmp. Auf meinem System bekomme ich:

$ udevadm info --device-id-of-file /mnt/tmp 8:17 

Führen Sie nun das aus und suchen Sie nach 8:17:

$ udevadm info --export-db | less ... P: /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 N: sdb1 W: 61 S: block/8:17 S: disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1 

Dies gibt uns den Gerätepfad, der mit udevadm verwendet werden soll. Führen Sie dies aus und suchen Sie nach Ihrer Geräte-ID ( AA042...in meinem Fall)

$ udevadm test /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 2>&1 | less ... udev_rules_apply_to_event: LINK 'disk/by-id/usb-pqi_IntelligentStick_AA04212900042956-0:0-part1' /lib/udev/rules.d/60-persistent-storage.rules:31 

Das gibt uns alle Regeln von udev + angewendete Zeilennummern ( 60-persistent-storage.rules:31etc)

Und hier kommt der Dateiname:

$ /lib/udev/usb_id /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb pqi_IntelligentStick_AA04212900042956-0:0 
Die Frage ist dann, wie lsusb diese Informationen erhält ... weil udev `wie udisks` verwendet wird. Pithikos vor 9 Jahren 0
Sie können die Seriennummer des Geräts überprüfen, indem Sie ChipGenius unter Windows ausführen. lemonsqueeze vor 9 Jahren 0
Wie Alex zeigte, verkettet `udev` nur die Serien-ID des Kernels zu einer größeren Zeichenfolge. "lsusb" oder "lsblk" verwenden dieselbe Serien-ID. Es gibt keinen Verrat. Sie können den eingebauten `ls'-Befehlen vertrauen. Ansonsten, worauf können Sie vertrauen? underscore_d vor 8 Jahren 0