Klonen Sie die Windows-Partition von Linux


12

Ich habe also eine 120-GB-Intel-SSD mit einer Partition für Windows und einer anderen für Ubuntu. Ubuntu ist mein Hauptbetriebssystem, Windows ist für Spiele. Aber jetzt möchte ich Mac OS X installieren, und ich möchte, dass es auf der SSD installiert wird. Daher möchte ich Windows auf ein anderes Laufwerk verschieben (alte 160 GB extern, die ich aus der Shell genommen habe und war Als Testfahrt verwenden. Ich behalte meine Spiele sowieso auf einem anderen externen Gerät, sodass die Leistung außer der Startzeit nicht beeinträchtigt werden sollte.

Was ist der beste Weg, um dies zu erreichen? Irgendwelche guten Werkzeuge zum Klonen von Partitionen? Ich frage dies, weil Google beim Klonen des Laufwerks, auf dem Sie Ubuntu verwenden / auf dem Ubuntu installiert ist, viele Ergebnisse erzielt, anstatt mir zu sagen, wie eine völlig unabhängige Partition an einen anderen nicht verwandten Speicherort geklont werden soll.

Oh, und kann ich die neue Windows-Partition ohne vorherige Optimierung nach dem Klonen ausführen? Alle anderen Informationen hierzu wären sehr dankbar.

(Ich mache das, weil ich meine Pfoten auf XCode bekommen muss und mein MacBook Pro langsam stirbt).


Alles was Sie brauchen ist cfdisk und dd . Das einzige, was etwas fragwürdig ist, ist der Bootsektor. Welche Windows-Version?
XXL

Windows 7. Ich erinnere mich, dass die Installation aufgrund einiger Probleme im Zusammenhang mit Partitionen ein königlicher Schmerz war.
Fehler

Haben Sie die W7-Disc zur Verfügung?
XXL

Ich bin mir nicht ganz sicher, wo ich es platziert habe, aber ich kann es bei Bedarf ausgraben.
Fehler

Antworten:


7

Sie müssen 2 Partitionen mit dd klonen - eine befindet sich dort, wo sich der Bootloader / Bootmanager befindet (erforderlich, um das Betriebssystem zu ketten) [ Systemreserviert , normalerweise 100 MB] und die andere ist die eigentliche W7-Installation.

Überprüfen Sie die Partitionstabelle mit cfdisk - Sie erhalten eine visuelle Darstellung. Löschen Sie dann alle Partitionen auf dem Ziellaufwerk - cfdisk ist Ihr Freund.

Die Syntax für das Klonen kann auf dem Wiki zu finden hier . Sie benötigen außerdem einen geeigneten MBR (dieser ist wahrscheinlich bereits auf Ihrer Probefahrt vorhanden ).

Sie müssen wahrscheinlich auch der Partition [System Reserved] ein bootfähiges Flag zuweisen (dies sollte die erste sein, die geklont wurde) - cfdisk kann dies erreichen.

Wenn dies fehlschlägt, starten Sie einfach von einer W7-Installations-CD und befolgen Sie die hier aufgeführten Richtlinien für Vista.

UPDATE :

Ich habe vergessen, einen wichtigen Teil des gesamten Prozesses zu erwähnen, der möglicherweise nicht so offensichtlich ist. Sie müssen entweder die Partitionstabelle vom ursprünglichen Laufwerk klonen und alles außer den 2 Windows-bezogenen Partitionen löschen oder sie mit cfdisk / parted mit derselben Größe neu erstellen .

Hier einige Beispiele (unter der Annahme, dass sda Ihr Quelllaufwerk und sdb das Ziel ist):

dd if = / dev / sda bs = 1 skip = 446 count = 66 von = / dev / sdb seek = 446 (dies klont effektiv Ihre aktuelle DOS-Partitionstabelle zusammen mit der MBR-Signatur auf das Ausgabelaufwerk)

dd if = / dev / sda bs = 1 skip = 440 count = 72 von = / dev / sdb seek = 440 (dies kopiert auch die Festplatten-ID, was manchmal zu einem fehlgeschlagenen Start führen kann, wenn sie fehlen - solche Festplatten jedoch nicht in einer Windows-Umgebung zusammenarbeiten können, bis die ID geändert wird)

parted / dev / sda usp (auf diese Weise können Sie die aktuelle Partitionstabelle und -größe in Sektoren auf dem Quelllaufwerk auf spätere Replikation auf dem Ziel mit cfdisk oder parted selbst überprüfen. )


Das ist ein Schmerz und startet normalerweise nicht
siehe

Warum? Wenn es ein Problem mit dem Startvorgang gibt - das Instanziieren einer Eingabeaufforderungssitzung von der W7-Installations-CD und das Ausführen von bootrec / fixmbr , bootrec / fixboot oder bootrec / rebildbcd sollte das Problem beheben können.
XXL

Meinetwegen. Ich hatte es in der Vergangenheit für mich gescheitert. Ich bin sicher, deshalb habe ich etwas über Utensilien herausgefunden, um das Missgeschick zu verhindern. Auch die Verwendung von dd zum Replizieren der Partition ist zumindest nicht sehr effizient
siehe

weil es eine sektorweise Kopie verwendet und über den leeren Speicherplatz im zugewiesenen Dateisystem kopieren würde? Ich denke, im Kontext der OP wird dies wahrscheinlich völlig irrelevant sein. Wir wissen nicht einmal, ob die Partition voll ist oder nicht, ganz zu schweigen davon, dass er sich um ein paar zusätzliche Minuten kümmert (der Zeitgewinn könnte minimal sein), anstatt eine weniger klare alternative Lösung zu versuchen
XXL

Es hat jedoch den entscheidenden Vorteil, dass es auf eine Partition unterschiedlicher Größe kopiert werden kann. DD geht davon aus, dass das Ziel genau dieselbe Größe hat (obwohl es möglicherweise größer ist ). Dies könnte ein störendes Problem sein, insbesondere wenn SSDs beteiligt sind (sie haben keine "unbegrenzte" Kapazität)
siehe

4

Schau es dir an

  • ntfsclone (kopiert nur verwendete Sektoren)
  • fixntfs.c , um die Boot-Info-Offsets zu reparieren

IIRC, Trinity Rescue Kit enthält die erforderliche Software sowie viele andere (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; ntfs-3g-Montage, rsync usw. usw.).

/*
 * fixntfs: change some attributes of an NTFS bootsector
 *
 * brought to you by Phoenix
 * url: www.grhack.gr/phoenix
 * mail: phoenix@grhack.gr
 * irc: phoenix -> #grhack -> undernet
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    FILE *fd;
    FILE *idfd;
    struct stat fst;
    unsigned char cab[32];
    unsigned short log_heads;
    unsigned short ntfs_heads;
    unsigned short force_heads;
    unsigned short ntfs_cab;
    unsigned long long sectors;
    unsigned long long new_sectors;

    log_heads = 0;
    ntfs_heads = 0;
    force_heads = 0;
    ntfs_cab = 0;

    if(argc < 2)
    {
        fprintf(stderr, "Usage:\n\t%s <device> <total_sectors> <force_heads>\n", argv[0]);
        exit(0);
    }

    fprintf(stderr, "Stating file %s... ", argv[1]);

    stat(argv[1], &fst);

    if(!S_ISBLK(fst.st_mode))
    {
        fprintf(stderr, "not a block device\n");
        exit(-1);
    }

    fprintf(stderr, "a block device\n");


    fprintf(stderr, "Opening device %s rw... ", argv[1]);

    fd = fopen(argv[1], "r+");

    if(!fd)
    {
        perror("open device");
        exit(-1);
    }

    fprintf(stderr, "ok\n");


    fprintf(stderr, "Checking partition... ");

    fseek(fd, 3, SEEK_SET);

    if(fread(cab, 1, 4, fd) != 4)
    {
        perror("read system_id");
        exit(-1);
    }

    cab[5] = 0;

    if(strncmp(cab, "NTFS", 4))
    {
        fprintf(stderr, "%s\n", cab);
        exit(-1);
    }

    fprintf(stderr, "%s\n", cab);


    fprintf(stderr, "Reading NTFS bootsector heads... ");

    fseek(fd, 0x1a, SEEK_SET);

    ntfs_heads = 0;

    fread(&ntfs_heads, 1, 2, fd);

    fprintf(stderr, "%u\n", ntfs_heads);


    fprintf(stderr, "Reading NTFS bootsector sectors... ");

    fseek(fd, 0x18, SEEK_SET);

    ntfs_cab = 0;

    fread(&ntfs_cab, 1, 2, fd);

    fprintf(stderr, "%u\n", ntfs_cab);


    fprintf(stderr, "Reading NTFS bootsector sectors_per_cluster... ");

    fseek(fd, 0x0d, SEEK_SET);

    ntfs_cab = 0;

    fread(&ntfs_cab, 1, 1, fd);

    fprintf(stderr, "%u\n", ntfs_cab);


    fprintf(stderr, "Reading NTFS bootsector sectors_size... ");

    fseek(fd, 0x0b, SEEK_SET);

    ntfs_cab = 0;

    fread(&ntfs_cab, 1, 2, fd);

    fprintf(stderr, "%u\n", ntfs_cab);


    fprintf(stderr, "Reading NTFS bootsector boot_loader_routine_jump... ");

    fseek(fd, 0, SEEK_SET);

    bzero(cab, sizeof(cab));

    fread(cab, 1, 3, fd);

    fprintf(stderr, "0x%x 0x%x 0x%x\n", cab[0], cab[1], cab[2]);

    fprintf(stderr, "Reading NTFS bootsector total_sectors... ");

    fseek(fd, 0x28, SEEK_SET);

    sectors = 0;

    fread(&sectors, 1, 8, fd);

    fprintf(stderr, "%Lu\n", sectors);


    fprintf(stderr, "Reading device logical heads... ");

    sprintf(cab, "/proc/ide/hd%c/geometry", *(strrchr(argv[1],'/') + 3));

    idfd = fopen(cab, "r");

    if(!idfd)
    {
        perror(cab);
        exit(-1);
    }

    fscanf(idfd, "%*s %*s\n");

    fscanf(idfd, "%*s %s\n", cab);

    *(strrchr(cab, '/')) = 0;

    log_heads = (unsigned short) atoi(strchr(cab, '/') + 1);

    fprintf(stderr, "%u\n", log_heads);

    if(argc == 4)
    {
        force_heads=atoi(argv[3]);
        fprintf(stderr, "Forcing heads to %u\n", force_heads);
        log_heads=force_heads;
    }

    if(fclose(fd) == EOF)
    {
        perror("close device");
        exit(-1);
    }

    if(log_heads != ntfs_heads)
    {
        fprintf(stderr, "Heads are different... Logical=%u NTFS=%u\n\n"
                "Update NTFS bootsector? (y/n) ",
                log_heads, ntfs_heads);

        if(getc(stdin) == 'y')
        {
            fd = fopen(argv[1], "r+");

            if(!fd)
            {
                perror("open device");
                exit(-1);
            }

            ntfs_heads = log_heads;

            fseek(fd, 0x1a, SEEK_SET);

            fwrite(&ntfs_heads, 1, 2, fd);


            fprintf(stderr, "\nBootsector updated... Verifying... ");

            fclose(fd);

            fd = fopen(argv[1], "r");

            if(!fd)
            {
                perror("open device");
                exit(-1);
            }

            fseek(fd, 0x1a, SEEK_SET);

            ntfs_heads = 0;

            fread(&ntfs_heads, 1, 2, fd);

            if(ntfs_heads == log_heads)
            {
                fprintf(stderr, "ok\n\n");
            }
            else
            {
                fprintf(stderr, "error [%u]\n", ntfs_heads);
                exit(-1);
            }
            fclose(fd);
        }
        else
        {
            fprintf(stderr, "\nHeads update cancelled...\n");
        }

        getc(stdin);
    }

    if(argc >= 3 && atoll(argv[2]))
    {
        fprintf(stderr, "Update NTFS bootsector total_sectors from %Lu to %Lu? (y/n) ",
                sectors, atoll(argv[2]));

        if(getc(stdin) == 'y')
        {
            fd = fopen(argv[1], "r+");

            if(!fd)
            {
                perror("open device");
                exit(-1);
            }

            new_sectors = atoll(argv[2]);

            fseek(fd, 0x28, SEEK_SET);

            fwrite(&new_sectors, 1, 8, fd);


            fprintf(stderr, "\nBootsector updated... Verifying... ");

            fclose(fd);

            fd = fopen(argv[1], "r");

            if(!fd)
            {
                perror("open device");
                exit(-1);
            }

            fseek(fd, 0x28, SEEK_SET);

            sectors = 0;

            fread(&sectors, 1, 8, fd);

            if(sectors == new_sectors)
            {
                fprintf(stderr, "ok\n\n");
            }
            else
            {
                fprintf(stderr, "error [%Lu]\n", sectors);
                exit(-1);
            }

            fclose(fd);
        }
        else
        {
            fprintf(stderr, "\nTotal_sectors update cancelled...\n");
        }
        getc(stdin);
    }

    return(1);
}

2

Diese Anleitung zum Klonen eines Windows-Laufwerks hat für mich hervorragend funktioniert. Da dies das erste Mal ist, dass ich eine Windows-Installation auf eine neue Festplatte übertragen kann, werde ich hier meine Vorgehensweise mitteilen, um dem nächsten Googler den Besuch zu erleichtern.

Meine Situation:
Windows 7 x64 von Manager hatte seine 128G-SSD voll ausgeschöpft, daher kaufte ich einen 240-GB-Ersatz.

Problem:
Ich habe zwei SATA-Laufwerksdocks, aber Linux hat nicht beide gleichzeitig erkannt, was ein einfaches Kopieren zwischen ihnen verhindert.

Hardware:
Ich bin dabei, eine Dual-NIC-Firewall einzurichten, daher habe ich die Quell-SSD auf diesem Computer installiert. Ziel 240G SSD ging in externes Dock.

Prozess:
1) Auf dem ersten USB-Stick, den ich abholte, befand sich eine Linux Mint-Live-CD, die /dev/sda1
2) "alte" 128G-SSD wurde und erkannt wurde /dev/sdb1und /dev/sdb2
3) # fdisk -l /dev/sdbaus dem Lernprogramm verwendet und die Informationen des Quellpartitionsfensters nach Gedit kopiert wurde.
- Beachten Sie, dass das Tutorial die -uOption enthält. Für mich zeigte fdisk jedoch bereits Blöcke (die gewünschte Ausgabe) an, sodass die Einbeziehung dieses Schalters die falschen Informationen liefert.
4) Schließen Sie das Laufwerksdock mit der Ziel-240G-SSD an und schalten Sie es ein /dev/sdc.
5) Verwenden Sie fdisk /dev/sdcdiese Option , um Partitionen zu erstellen /dev/sdc, die genau übereinstimmen /dev/sdb, einschließlich Boot- und Systemflags.
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1um den MBR auf das Ziellaufwerk zu kopieren.
- Die Anleitung schlägt jetzt die Verwendung vorhdparmDMA einschalten, aber der Befehl ist für mich fehlgeschlagen.
7) ntfsclone -O /dev/sdc1 /dev/sdb1Kopieren der versteckten Windows-Systempartition.
- -Ooder --overwriteOption wird verwendet, um das Ziel festzulegen, sodass der Befehl rückwärts angezeigt wird. Ein großes Lob an Linux Mint Live-CD mit ntfsclone, da ich noch nie von diesem Befehl gehört hatte und nicht ins Netzwerk musste.
8) ntfsclone -O /dev/sdc2 /dev/sdb2Kopieren Sie das Windows-Laufwerk "C". Dies dauerte ein paar Biere zu vervollständigen.
9) Zum Ändern der gparted
Größe der Partition habe ich 10) Neue SSD in Windows Computer neu installiert und es läuft checkdisk (ich hatte das Tutorial verlassen und habe nicht bemerkt, dass er dies tut).
11) Windows neu gestartet und alles ist wieder normal, aber mit mehr freiem Speicherplatz.


1
  1. Ich habe im Ubuntu- Anwendungsmenü nach " Disks " gesucht und die App "Disks Utility " geöffnet.
  2. Ich habe die zu kopierende Partition ausgewählt. Klicken Sie dann auf das Einstellungssymbol und wählen Sie " Disk-Image erstellen ".
  3. Es würde eine Weile dauern, bis das Wiederherstellungsimage erstellt ist .
  4. Nachdem das Wiederherstellungsimage generiert wurde, klickte ich auf die Partition, auf die ich die vorherige Partition klonen wollte .
  5. Klicken Sie dann erneut auf das Einstellungssymbol , wählen Sie " Disk Image wiederherstellen " und wählen Sie die zuvor generierte Disk Image-Datei aus.
  6. Dann wartete er, bis es fertig war.

Ich habe gerade die Disks Utility App erkundet und das wars. Ich habe nichts installiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.