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.
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.
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).
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.
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.
OH Meiner.
Ihr Code müsste:
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,
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.
Tags und Links c memory linux-device-driver hard-drive filesystems