Ich möchte besser verstehen, was auf Betriebssystemebene passiert, wenn ein neues Gerät (USB-Stick oder IDE/SATA-Festplatte) an einen PC angeschlossen wird, also von der Kernelebene bis zur Userspace-Ebene. Außerdem würde ich gerne wissen, auf welcher Ebene der Befehl „dd“ funktioniert.
Ich habe es so verstanden, dass der Kernel dieses Ereignis „abfängt“, sobald ein externes Laufwerk angeschlossen ist, und das udev-System informiert, das dank des udevd-Daemons immer zuhört. Udisks ist die Instanz zum Sammeln von Informationen über Blockgeräte. Udisks benötigt hierfür udev. Udisks ist mit dem D-Bus verbunden (D-Bus wird nicht nur von Udisks verwendet; viele Programme verwenden D-Bus zum Austausch von Informationen). Über den D-Bus kann sich jeder mit Udisks verbinden und nach der aktuellen Geräteliste fragen.
Frage: Wenn ich den Befehl dd starte, wird vielleicht eine Verbindung zum D-Bus hergestellt, um ein Laufwerk zu kopieren/ein Image zu erstellen?
Ich füge auch ein Bild aus Wikipedia bei, das die Linux-Ebenen zeigt. Können Sie mir bitte auf diesem Bild den Pfad nennen, der vom angeschlossenen Gerät zur Instanz des dd-Befehls führt?
Dank im Voraus.
Vincenzo.
Antwort1
Das sind eigentlich zwei Fragen:
1) dd
ist eine normale Benutzeranwendung, genau wie cp
. Genau wie cp
, kopiert es, indem es Systemaufrufe zum Lesen ausgibt, das Ergebnis abruft und dann Systemaufrufe zum Schreiben ausgibt. Im Gegensatz zu cp
können Sie die Blockgröße für festlegen dd
, weshalb dd
traditionell immer zum Kopieren von Blockgeräten verwendet wurde. Aber heute cp /dev/sdb /dev/sdc
macht genau dasselbe wie dd
und ist genauso schnell, da moderne Versionen von cp
(anders als vielleicht alte Versionen) auch immer komplette Blöcke lesen und schreiben.
Auch ist cp
nichts dd
Besonderes erforderlich, um ein „Datenträgerlayout“ oder ähnliches zu erhalten. Sie lesen einfach, bis das Betriebssystem signalisiert, dass sie am Ende sind.
2)
Sobald ein externes Laufwerk angeschlossen ist, „fängt“ der Kernel dieses Ereignis ab
Der Kernel fängt dieses Ereignis nicht wirklich ab, da alle Aktionen auf Treiberebene bereits im Kernel stattfinden. Wenn Sie also ein USB-Gerät anschließen, bemerkt die Hardware des USB-Hostcontrollers dies, generiert einen Interrupt und der Treiber des USB-Hostcontrollers reagiert darauf. Anschließend beginnen die verschiedenen Teile des USB-Stacks, das neue Gerät aufzulisten, seinen Typ zu identifizieren, potenzielle Treiber zu identifizieren, neue Blockgeräte anzuschließen, die von diesen Treibern erstellt wurden, usw.
udev
ist lediglich ein Mechanismus für den Kernel, um diese Ereignisse dem Benutzerbereich mitzuteilen, sodass der Benutzerbereich darauf reagieren kann, z. B. durch die Erstellung symbolischer Links.
und informiert das udev-System, das dank des udevd-Daemons immer zuhört.
Udisks ist die Instanz zum Sammeln von Informationen über Blockgeräte.
udisks
ist ein Desktop-Dämon, den der Desktop verwendet, um Informationen über Blockgeräte abzurufen, da der Desktop alles gerne über den D-Bus erledigt. Sie brauchen ihn nicht wirklich, udisks
wenn Sie keinen D-Bus-Desktop verwenden (und tatsächlich läuft er auf einigen meiner Maschinen nicht).
Über D-Bus kann sich jeder mit udisks verbinden und nach der aktuellen Geräteliste fragen.
Dies können Sie ebenso gut auf andere Weise tun, z. B. indem Sie sich /dev
oder die Informationen in ansehen /sys
.
Die gesamte udev - udisk - Desktop Kette wird nur benötigt, damit der Desktopinformiertwenn neue Blockgeräte erscheinen oder vorhandene Blockgeräte ihren Status ändern, sodass der Desktop schicke Fenster oder ähnliches öffnen kann. Wenn Sie Linux auf herkömmliche Weise verwenden und kein schickes Fenster benötigen, wenn Sie es auf einen USB-Stick stecken, brauchen Sie dies nicht.