1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

freien Speicher (HDD) mit Nullen überschreiben

Discussion in 'Software allgemein' started by Q-Base, Jul 13, 2007.

Thread Status:
Not open for further replies.
  1. Q-Base

    Q-Base Byte

    Hallo,

    ich wollte mir meine Festplatte im Notebook durch ein ganz einfaches Backup mittels Knoppix und dd sichern. Nun ist es aber so, dass meine Festplatte nicht randvoll ist, aber trotzdem keine Nutzdaten gespeichert sind, befinden sich ja noch wahllose Bits in dem freien Speicher. Damit ich das nun effizient, aber nicht stark komprimieren kann, sollte der freie Speicher aber auch 'frei aussehen', also alles Nullen oder alles Einsen.

    Kann ich das mit Windows Boardmitteln?

    Ciao, Q
     
  2. Hnas2

    Hnas2 Ganzes Gigabyte

    In ein normales Image werden doch sowieso nur Nutzdaten geschrieben.
    Eine RAW-Sicherung, wo auch die "freien" Speicherbereiche gesichert werden, mach nur für ganz spezielle Zwecke Sinn, z.b. für Versuche zur Datenrekonstruktion.
     
  3. Q-Base

    Q-Base Byte

    Hallo,

    ja, danke für die Antwort.
    Also ich habe mir folgendes gedacht. Ich mache mir ein Image von meiner Festplatte, schiebe es auf einen anderen Rechner und kann es, weil es ein ISO ist, dann dort mounten und im Zweifelsfalls einige Daten extrahieren.

    Das habe ich so gemacht, dass ich mein Notebook mit Knoppix gestartet habe. Dann habe ich auf dem Rechner, auf dem die Sicherung liegen soll, eine Freigabe erzeugt. Nun konnte ich die Freigabe in Knoppix mounten.

    Code:
    mount -t smbfs -o lfs //[i]host[/i]/[i]freigabe[/i] //mnt/[i]mountpoint[/i]
    Die Option 'lfs' sorgt dafür, dass man auch Dateien verschieben kann, die größer als 2 GiB sind. Macht man das nicht, bricht die Sicherung nach 2 GiB mit einer Fehlermeldung ab.

    Danach habe ich mit der Zeile das dumpen angestoßen.
    Code:
    dd if=/dev/hda1 of=/mnt/mountpoint/sicherung.iso
    Nun könnte man dazwischen noch ein gzip packen. Das braucht auch nur eine schwache Kompression zu sein, aber dafür müssen die leeren Bereiche auf der Festplatte auch leer sein, sprich '0' oder '1'. Sonst macht das keinen Sinn.

    Mir wäre das deshalb so lieb, weil ich ein 100 MBit/s-Netz habe. Die Systempartition, mit der ich das getestet habe, ist 20 GiB groß und hat noch viel frei. Es macht also keinen Sinn, ganze 20 GiB durch das Netz zu quälen, wenn man eigentlich nur 12 GiB Nutzdaten hat.

    Mein Ziel war eine einfache Sicherung, die ich woanders mounten kann, ohne es auspacken zu müssen. Ich sehe ein, ohne gzip und Nullen, macht das kein Spaß. Ich muss also vor dem Sichern nur die freien Bereiche mit Nullen überschreiben. Nur ich finde dafür nichts Passendes. :)

    Ciao, Q
     
  4. whisky

    whisky Ganzes Gigabyte


    Folgendes Script sollte, auf dem richtigen Laufwerk gestartet, gewünschtes Erledigen.

    @echo off
    echo 0000000000 > Datei
    :loop
    type Datei >> Datei
    if errorlevel 1 goto raus
    goto loop
    :raus
     
  5. Q-Base

    Q-Base Byte

    lol, OK, das ist natürlich die Methode mit dem Hammer. Aber die ist so einfach, dass sie funktioniert. Allerdings muss ich sagen, dass die Festplatte nicht mit '0' überschrieben wird. Eine ASCII-0 ist kodiert als hex 30, die Bitfolge 00110000. Das ist zwar sehr gut komprimiertbar, weil es regelmäßig ist, ist aber nicht 'nur 0' oder 'nur 1'.

    Und dann scheint die cmd nicht so zuverlässig zu arbeiten. Manchmal kommen die aneinander gefügten ASCII-0 angefügt, und manchmal wird eine neue Zeile aufgemacht. In einem Hex-Editor kann man dann auch sehen, dass da noch Zeilenumbrüche eingefügt werden.

    Ciao, Q
     
  6. Q-Base

    Q-Base Byte

    Na gut, wer einen Java-Compiler hat und den bedienen kann, kann ja den Code hier benutzen.

    Code:
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    
    public class DiskFull {
    
       /**
        * @param args
        */
       public static void main(String[] args) {
    
          File wholeFile = new File("whole.bin");
          
          int mega = 1024*1024;
          
          byte[] mb = new byte[mega];
          for (int i = 0; i < mega; i++) {
             mb[i] = 0x00;
          }
          
          try {
             
             int j = 0;
             
             while (true) {
                FileOutputStream fos = new FileOutputStream(wholeFile, true);
                fos.write(mb);
                j++;
                if (j % 10 == 0) {
                   System.out.println( j + " MiB");
                }
             }
          } catch (FileNotFoundException e) {
             System.out.println("no more disc space to write! delete whole.bin");
          } catch (IOException e) {
             System.out.println("no more disc space to write! delete whole.bin");
          }
           
       }
    
    }
    
    Ciao, Q
     
  7. whisky

    whisky Ganzes Gigabyte

    Ach ja -daran hatte ich nicht gedacht ;)
     
  8. Q-Base

    Q-Base Byte

    Hier noch kleinere Optimierungen.
    1. Es werden schneller Daten geschrieben
    2. bis auf wenige Kilobyte ist die Platte dann auch wirklich voll.
    3. danach wird der Speicherplatz gleich wieder freigegeben

    Code:
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class DiskFull {
    
       public static void main(String[] args) {
    
          File wholeFile = new File("whole.bin");
          FileOutputStream fos = null;
    
          int[] sizes = { 1024 * 4, 1024 * 64, 1024 * 1024 * 6 };
    
          for (int s = sizes.length; s > 0; s--) {
             System.out.println("Buffergröße " + sizes[s - 1] + " Bytes");
             byte[] buffer = new byte[sizes[s - 1]];
    
             for (int i = 0; i < buffer.length; i++) {
                buffer[i] = 0x00;
             }
    
             try {
                int j = 0;
                fos = new FileOutputStream(wholeFile, true);
    
                while (true) {
                   fos.write(buffer);
                   fos.flush();
                   j++;
                   if (j % 10 == 0) {
                      new Thread() {
                         public void run() {
                            File wholeFile = new File("whole.bin");
                            System.out.println((wholeFile.length() / (1024 * 1024)) + " MiB");
                            // System.out.flush();
                         }
                      }.start();
                   }
                }
             } catch (IOException e) {
    
                System.out.println("schalte Buffergröße um");
             } finally {
                try {
                   if (fos != null) 
                      fos.close();
                } catch (IOException e) {
                   e.printStackTrace();
                }
             }
          }
    
          if (wholeFile.delete()) {
             System.out.println("temporäre Datei wurde gelöscht.");
          } else {
             System.out.println("die Datei '" + wholeFile.getAbsolutePath() + "' konnte nicht "
                   + "gelöscht werden. Bitte löschen!");
          }
       }
    }
    Ciao, Q
     
Thread Status:
Not open for further replies.

Share This Page