Linux: direkter Zugriff auf die Festplatte in C

8

Wie kann ich einen rohen Zugriff auf die HD erhalten und wissen, ob dieser Ort verwendet wird oder ein freier Speicherplatz ist? Nur ein Beispiel, ich kann einen direkten Zugriff einfach mit einem Öffnen und einem Lesen auf einem Plattengerät erhalten, das Ziel ist zu wissen, ob das zB 10.000 Byte verwendet wird oder nicht.

    
Lopoc 10.06.2009, 19:56
quelle

7 Antworten

9

Um mit den Vorsichtshinweisen anzuhäufen ...

Vergessen Sie nicht, dass Sie mit den eigenen Threadsicherheitsbestimmungen und dem internen Caching des vorhandenen Treiberstapels zusammenarbeiten müssen. Viele Threads im System können (und werden) die ganze Zeit auf die Festplatte schreiben. Um einen freien Sektor zu löschen, müssen Sie wissen, dass es frei ist und frei bleibt, solange Sie damit fertig sind. Es wäre schlecht, wenn Sie einen Sektor löschen würden, den das Dateisystem bereits verwendet hat, aber den Beweis dieser Entscheidung noch nicht auf den Datenträger gebracht hat, so dass Sie nicht wissen konnten, dass er verwendet wurde. Dies kann zu Datenverlust führen, der zu empörten Benutzern führen kann.

Wenn Sie garantieren können, dass das Dateisystem momentan nicht gemountet ist, dann können Sie zumindest /dev/sda (wahrscheinlich nicht das spezifische, das Sie wollen!) öffnen und die Disk Datenstrukturen zu tun, was Sie tun müssen. Dies ist tatsächlich, wie Dienstprogramme wie fsck und mkfs implementiert werden.

Das verbleibende große Problem ist, dass Sie mit jeder Version jedes Dateisystems, das Ihnen begegnen könnte, synchron bleiben müssen. Zumindest haben Sie den Quellcode für das Dateisystem selbst als Referenz verfügbar, aber es wird nicht einfach sein, ihn einfach aus dem Kernel heraus und in eine Anwendung im Benutzermodus zu portieren.

Mein Rat wäre, das Dateisystem selbst zu verwenden, um Ihnen die Garantien zu geben, die Sie brauchen. Öffnen Sie große Dateien und füllen Sie sie mit Ihren Löschmustern. Fülle die Festplatte aus. Beachten Sie, dass schwerwiegende Auswirkungen auf alle laufenden Daemons, die davon ausgehen, dass ein wenig Speicherplatz verfügbar ist, auf einem System mit den meisten Daemons und solchen, die getötet wurden, auftreten müssen. Wenn Sie eine sichere Löschung anstreben, müssen Sie sich trotzdem darum sorgen, die geschriebenen Blöcke zwischen den Durchläufen auf die Festplatte zu übertragen, da alles im normalen Dateisystem versucht, mehrere Schreibvorgänge eines einzelnen Blocks zu optimieren.

    
RBerteig 10.06.2009, 20:46
quelle
17

Sie können nur open das Block-Gerät (z. B. /dev/sda ) und die Sektoren manuell lesen. Aber das wird nicht sagen, ob es leer oder nicht direkt ist. Leer zu sein oder nicht, ist etwas, das auf der Abstraktionsebene des Dateisystems definiert ist. Dateisystem-Datenstrukturen speichern diese Art von Daten, und Sie sollten ein tiefgreifendes Verständnis des spezifischen Dateisystems haben, um dies von den rohen Blöcken aus zu tun (ohne Verwendung einer vom Dateisystem bereitgestellten Funktion).

    
Mehrdad Afshari 10.06.2009 20:03
quelle
9

In aller Wahrscheinlichkeit wollen Sie nicht direkt über / dev / sd * oder / dev / hd * auf das Blockgerät zugreifen. Wie andere gesagt haben, müssen Sie das rohe zugrundeliegende Dateisystem verstehen, und das wird sehr schwierig sein.

Wenn Sie eine Anwendung schreiben, die Bytes auf der Festplatte als großen linearen Adressraum behandeln möchte, sehen Sie sich den Systemaufruf mmap () an. Sie können eine große, leere Datei auf dem Datenträger erstellen und sie dann mit mmap () in Ihren Prozessbereich abbilden. Von dort aus können Sie normale Speicheroperationen zum Lesen und Schreiben in die zugrunde liegende große Datei verwenden. Beachten Sie, dass Schreibvorgänge gepuffert sind, so dass die Gewährleistung der Konsistenz schwierig sein kann.

Der Vorteil dieses Ansatzes besteht darin, dass Ihre Zugriffsmuster auch dann, wenn die zugrunde liegende Datei fragmentiert ist, sie als eine lineare Sammlung von Bytes betrachten können.

    
slacy 10.06.2009 20:19
quelle
6

Wenn Sie den gesamten freien Speicherplatz in einem Dateisystem löschen möchten, können Sie das Dateisystem mit einer großen Datei voller Nullen füllen, sie mit der Festplatte synchronisieren und dann löschen. Das kann nicht unbedingt alles bekommen, besonders wenn Sie mit einem Logging-Dateisystem oder ähnlichem zu tun haben, aber es wird das meiste davon machen. Wenn Sie die Festplatte löschen möchten, damit ein Bild besser komprimiert wird, ist dies wahrscheinlich alles, was Sie tun müssen. Wenn Sie die Festplatte aus Sicherheitsgründen reinigen möchten ... willkommen in der Welt der Kernel-Entwicklung, treten Sie bitte in das tiefe Ende, und denken Sie daran, etwas schwer entflammbar zu tragen.

Es gibt ein Dienstprogramm namens zerofree , um freie Blöcke in null zu setzen ext-Dateisysteme und ist für VM-Images gedacht. Denken Sie daran, das sollten Sie nicht mit einem angehängten Dateisystem tun. Auf dieser Seite befinden sich auch einige alte Kernel-Patches, die sich als interessanter Ausgangspunkt für Live-Dateisysteme erweisen könnten.

    
retracile 10.06.2009 20:22
quelle
5

OH Meiner.

Ihr Code müsste:

  1. Gehen Sie die Partitionstabelle durch, um zu sehen, in welche Partition sie fällt.
  2. Bestimmen Sie, um was für ein Dateisystem es sich handelt.
  3. Stellen Sie für jedes von Ihnen unterstützte Dateisystem eine solche Routine bereit, um festzustellen, ob dieses Byte verwendet wird
  4. Überprüfen Sie, ob das Dateisystem eingebunden ist
  5. Wenn dies der Fall ist, gehen Sie in die Kernel-Datensätze, um herauszufinden, ob etwas noch nicht auf die Festplatte geschrieben wurde.
  6. Oh, und wenn du EXT4 oder REISER verwendest, kannst du die Antwort nicht wissen, also kannst du genauso gut aufgeben.

Wenn ich du wäre, würde ich es überdenken, was du zu tun versuchst.

EDIT: Sehen Sie seinen Kommentar für das, was er eigentlich versucht,

  • Übernehmen Sie eine Partition und nicht eine unformatierte Festplatte
  • Erforderliche Bereitstellung aufgehoben
  • Rufen Sie e3fsck auf, um das Journal aufzurollen
  • Gehe jeden Inode durch, finde den letzten Block und wische jeden freien Platz in diesem Block ab (die Dateigröße sollte angeben, wo die Daten im Block enden)
  • Verfolgen Sie die Zuweisungs-Bitmaps, suchen Sie nach nicht zugewiesenen Blöcken und löschen Sie sie.
  • Jetzt der schwierige Teil, lösche das Journal.
  • Viel Glück
  • Oh, und LESEN SIE DIE FILESYSTEM DOKUMENTATION
Joshua 10.06.2009 20:04
quelle
2

Sehr abhängig von vielen Faktoren wie

  • Dateisystemtyp
  • Betriebssystemtyp
  • mittlerer Typ

Lösungen:

Janus Troelsen 25.03.2012 00:07
quelle
0

Sie können möglicherweise die gleichen Funktionen verwenden, die das Dateisystem und / oder die Datenträger-Tools verwenden, um zu überprüfen, ob ein Speicherort frei ist oder nicht.

    
10.06.2009 20:07
quelle