Direkter Zugriff auf die Festplatte ohne FS vom C-Programm unter Linux

Lesezeit: 2 Minuten

Benutzer-Avatar
Engel C

Ich möchte direkt aus einem C-Programm auf die gesamte Festplatte zugreifen. Da ist kein FS drauf und wird es auch nie werden.

Ich möchte nur /dev/sda (zum Beispiel) öffnen und I/O auf Block-/Sektorebene der Festplatte ausführen.

Ich plane, einige Programme zum Erlernen der C-Programmierung in der Linux-Umgebung zu schreiben (ich kenne die Sprache C, Python, Perl und Java), habe aber kein Vertrauen in die Linux-Umgebung.

Für meine Lernzwecke denke ich darüber nach, mit kyoto-cabinet zu spielen und den Wert, der dem berechneten Hash entspricht, direkt in einem “Block/Sektor” der Festplatte zu speichern und das Paar aufzuzeichnen: “Hash, Block/Sektor-Referenz” in a kyoto-cabinet Hash-Datenbankdatei.

Ich weiß nicht, ob dies mit Standard-CI / O-Funktionen machbar ist, oder ich müsste sonst einen “Gerätetreiber” oder ähnliches schreiben …

Wie an anderer Stelle erwähnt, blockieren Sie unter *NIX-Systemen Geräte wie /dev/sda können als einfache Dateien abgerufen werden. Beachten Sie, dass, wenn das Dateisystem vom Gerät gemountet wird, das Öffnen als Datei zum Schreiben fehlschlagen würde.

Wenn Sie mit Blockgeräten spielen möchten, würde ich raten, zuerst die zu verwenden loop device, das eine einfache Datei als Blockgerät darstellt. Zum Beispiel:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB

Danach, /dev/loop0 würde sich wie ein Blockgerät verhalten, aber alle geschriebenen Informationen würden in der Datei gespeichert.

  • Danke allen für die schnelle Antwort. Ich werde es zuerst mit Loop-Geräten versuchen.

    – Engel C

    19. August 2010 um 13:11 Uhr

Als Gerätedateien für Laufwerke (zB /dev/sda) sind Blockgeräte, d. h. Sie können die Datei fast wie eine normale Datei öffnen, suchen und verwenden.

Ja, wie andere angemerkt haben, können Sie das Blockgerät einfach öffnen.

Es ist jedoch eine wirklich gute Idee, IO (schreibt trotzdem) an Blockgrenzen und ganzen Blöcken auszuführen. Sie können so etwas wie pread() und pwrite() verwenden, um diese IO auszuführen, oder einen Teil oder das gesamte Gerät mmapping.

Es gibt eine Reihe von ioctls, die verwendet werden können, siehe “man sd” für weitere Informationen. Sie scheinen nicht alle am selben Ort dokumentiert zu sein.

In linux/fs.h sind BLKROSET und eine Menge anderer ioctls definiert, Sie müssen sich umsehen, um herauszufinden, wie man sie benutzt. Sie können nützliche Dinge tun, z. B. herausfinden, wie groß das Gerät ist und wie groß die Blockgröße ist.

Der Quellcode des Pakets util-linux-ng ist Ihr Freund, er enthält Beispiele.

1371560cookie-checkDirekter Zugriff auf die Festplatte ohne FS vom C-Programm unter Linux

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy