Kann der Inhalt von / dev / disk0 (/ dev / sda usw.) als stdin verwendet werden?

876
Ephemera

Ich lerne über das /devDateisystem. Ich habe mit /dev/sd*(Linux) und /dev/disk*(OS X) angefangen und habe ein interessantes Verhalten gefunden. Wenn ich renne:

$ sudo xxd -l 1024 /dev/disk0 

Ich erhalte folgende Ausgabe:

0000000: 33c0 8ed0 bc00 7c8e c08e d8be 007c bf00 3.....|......|.. 0000010: 06b9 0002 fcf3 a450 681c 06cb fbb9 0400 .......Ph....... 0000020: bdbe 0780 7e00 007c 0b0f 850e 0183 c510 ....~..|........ 0000030: e2f1 cd18 8856 0055 c646 1105 c646 1000 .....V.U.F...F.. 0000040: b441 bbaa 55cd 135d 720f 81fb 55aa 7509 .A..U..]r...U.u. 0000050: f7c1 0100 7403 fe46 1066 6080 7e10 0074 ....t..F.f`.~..t 0000060: 2666 6800 0000 0066 ff76 0868 0000 6800 &fh....f.v.h..h. 0000070: 7c68 0100 6810 00b4 428a 5600 8bf4 cd13 |h..h...B.V..... < ... > 

Ein wenig Googling scheint dies als Beginn eines MBR zu identifizieren (ich habe Bootcamp installiert).

Folgendes funktioniert jedoch nicht:

$ sudo xxd -l 1000 < /dev/disk0 -bash: /dev/disk0: Permission denied 

Meine Fragen sind:

  • In vielen Anwendungen werden kritische Abschnitte von Festplatten (z. B. MBR, Dateisystem-Inodes, Partitionsgrenzen usw.) ausgeblendet. Ist die Ausgabe von xxdeinem echten Low-Level-Dump eines Geräts? Sehe ich alles byteweise auf dem Gerät?
  • Wie /dev/disk0deutlich Daten enthält, warum kann ich es nicht als stdin - Stream benutzen?
1

3 Antworten auf die Frage

4
grawity

In vielen Anwendungen werden kritische Abschnitte von Festplatten (z. B. MBR, Dateisystem-Inodes, Partitionsgrenzen usw.) ausgeblendet.

Welche anwendungen

Es ist keine Anwendungssache; Normalerweise befasst sich das Betriebssystem mit Dateisystemen und Festplattenpartitionierung.

Ist die Ausgabe von xxd ein echter Low-Level-Dump eines Geräts?

Mehr auf mittlerem Niveau, aber ja. Sie sehen die Rohdaten genau so, wie das Betriebssystem sie geschrieben hat, und genau so, wie das Betriebssystem sie zurücklesen wird. In den ersten 512 Bytes gibt es normalerweise einen MBR, in den nächsten Kilobytes ein GPT, und irgendwo in Sektor 63 (alt) oder 2048 (neu) werden die Dateisystemstrukturen der ersten Partition angezeigt.

Ein echtes Low- Level-Dump würde Daten bedeuten, wie sie vom Disk Controller geschrieben wurden: nicht nur die vom Betriebssystem lesbaren Bytes, sondern auch Verschleißdaten, SMART-Fehlerprotokolle, möglicherweise Verschlüsselungsschlüssel. Es ist jedoch für das Betriebssystem nicht sichtbar, und Sie können im Allgemeinen nicht direkt mit einem Programm darauf zugreifen - nur mit spezieller Hardware für die Datenwiederherstellung.

(Das heißt, einige Flash-Geräte sind eine Ausnahme; sie haben keine Festplatten-Firmware. Das Betriebssystem erledigt alles - z. B. verwaltet das Dateisystem jffs2 das Flash-Wear-Leveling auf Betriebssystemebene.)

Sehe ich alles byteweise auf dem Gerät?

Ja, Sie sehen es genauso wie ein Betriebssystem.

Da / dev / disk0 eindeutig Daten enthält, warum kann ich sie nicht als stdin-Stream verwenden?

Natürlich kannst du. In der Tat Sie haben es als Stream in Ihrem ersten Beispiel verwenden; Der einzige Unterschied besteht darin, dass im ersten Beispiel xxdder Aufruf von open ("/ dev / disk0") erfolgte. inzwischen in Ihrem zweiten Beispiel, das wurde von der Shell getan ( sh, bash, zsh).

Aber dieser Unterschied ist, was die Fehlermeldung verursacht. Aber es hat nichts damit zu tun, dass Sie versuchen, eine Platte zu lesen. Die "Erlaubnis verweigert" bedeutet wörtlich, dass Sie nicht öffnen können, /dev/disk0da Sie dazu root sein müssen.

(Dies wurde beantwortet viele Male auf dieser Seite. Hier, hier, hier, hier, hier und hier .)

Um die vorherige Umleitung von stdin / stdout zu erweitern, geschieht dies, indem die Shell die Datei öffnet, bevor sie das Programm startet. Also in Ihrem ersten Beispiel sudo xxd /dev/disk0verwendet zuerst sudolaufen xxd /dev/disk0mit Root - Rechten.

Wenn Sie jedoch ausführen sudo xxd < /dev/disk0, wird die Umleitung < /dev/disk0immer noch von Ihrer unprivilegierten Shell verarbeitet. sudo xxdist noch nicht gelaufen

Damit kann sudo sh -c "xxd < /dev/disk0"der gesamte Befehl als root verarbeitet werden.

3
Daren Beattie

Ich weiß nicht, was Ihre erste Frage ist, aber nach der Manpage zu urteilen xxd, sieht es so aus, als wäre dies wahrscheinlich der Fall.

Für die stdin-Frage können Sie tatsächlich /dev/disk0zu Programmen umleiten, die stdin akzeptieren. Das Problem, das Sie sehen, ist, dass sudo die Umleitung nicht selbst ausführt, sodass der Zugriff auf /dev/disk0die Berechtigungen Ihres regulären Benutzers basiert.

Optionen finden Sie unter Stack Overflow und diese Frage .

-2
ryder

Für mich ist nicht klar, was Sie tun möchten. Vielleicht hilft Ihnen das vielleicht. Wenn Sie auf die Rohdaten der Festplatte zugreifen möchten, ist das Programm dd der richtige Weg. Mit dd können Sie den MBR oder die gesamte Festplatte kopieren.

ciao ryder