Cloner la partition Windows de Linux

12

J'ai donc un SSD Intel de 120 Go, avec une partition pour Windows et une autre pour Ubuntu. Ubuntu est mon système d'exploitation principal, Windows est destiné aux jeux. Mais maintenant, je cherche à installer Mac OS X, et j'aimerais qu'il soit sur le SSD, donc je cherche à déplacer Windows vers un autre lecteur (ancien 160 Go externe que j'ai retiré de son shell et qui a été en utilisant comme un essai routier. Je garde mes jeux sur un autre externe de toute façon, donc les performances ne devraient pas être affectées, à part le temps de démarrage).

Quelle est la meilleure façon de procéder? De bons outils pour cloner des partitions? Je pose cette question, car Google obtient de nombreux résultats sur le clonage du lecteur sur lequel vous utilisez / avez installé Ubuntu, plutôt que de me dire comment cloner une partition totalement indépendante vers un autre emplacement indépendant.

Oh, et la nouvelle partition Windows me permettra-t-elle de l'exécuter sans aucun ajustement post-clone préalable? Toute autre information à ce sujet serait très appréciée.

(Je fais cela parce que j'ai besoin de mettre la patte sur XCode, et mon MacBook Pro meurt lentement).

Faute
la source
Eh bien, tout ce dont vous avez besoin est cfdisk et dd . La seule chose qui est quelque peu discutable est le secteur de démarrage. Quelle version de Windows?
XXL
Windows 7. Je me souviens que son installation était une douleur royale, en raison de certains problèmes liés aux partitions.
Faute
Avez-vous le disque W7 à votre disposition?
XXL
Je ne sais pas exactement où je l'ai placé, mais je peux le déterrer si besoin est.
Défaut

Réponses:

7

Vous devrez cloner 2 partitions avec dd - l'une est où réside le chargeur de démarrage / gestionnaire de démarrage (nécessaire pour charger en chaîne le système d'exploitation) [ Système réservé , généralement 100 Mo] et l'autre étant l'installation réelle de W7.

Vérifiez la table de partition avec cfdisk - cela vous donnera une représentation visuelle. Supprimez ensuite toutes les partitions sur le lecteur cible - cfdisk est votre ami.

La syntaxe du clonage peut être trouvée sur wiki ici . Vous aurez également besoin d'un MBR approprié (il est probablement déjà présent sur votre essai routier ).

Vous devrez probablement également affecter un indicateur de démarrage à la partition [System Reserved] (qui devrait être la première clonée) - cfdisk peut accomplir cela.

Si cela échoue - démarrez simplement à partir d'un disque d'installation W7 et suivez les instructions ici pour Vista.

MISE À JOUR :

J'ai oublié de mentionner une partie importante de l'ensemble du processus qui pourrait ne pas être aussi évidente. Vous devrez soit cloner la table de partition du lecteur d'origine et supprimer tout sauf les 2 partitions liées à Windows OU les recréer avec cfdisk / parted avec la même taille.

Voici quelques exemples (en supposant que sda est votre lecteur source et sdb est la cible):

dd if = / dev / sda bs = 1 skip = 446 count = 66 of = / dev / sdb Seek = 446 (cela clonera efficacement votre table de partition DOS actuelle avec la signature MBR sur le lecteur de sortie)

dd if = / dev / sda bs = 1 skip = 440 count = 72 of = / dev / sdb Seek = 440 (cela copiera également l'ID du disque qui peut parfois entraîner un échec de démarrage s'il est manquant - cependant, ces disques ne seront pas pouvoir travailler ensemble sur un environnement Windows, jusqu'à ce que l'ID soit modifié)

parted / dev / sda usp (c'est ainsi que vous pouvez inspecter la table de partition actuelle et la taille en secteurs sur le lecteur source pour une réplication ultérieure sur la cible avec cfdisk ou séparé lui-même)

XXL
la source
C'est une douleur et ne démarre pas habituellement
sehe
Pourquoi? En cas de problème avec le processus de démarrage - l'instanciation d'une session d'invite de commandes à partir du disque d'installation de W7 et l'exécution de bootrec / fixmbr , bootrec / fixboot ou bootrec / rebuildbcd devraient pouvoir résoudre le problème.
XXL
C'est suffisant. Je l'ai fait échouer pour moi dans le passé. Je suis sûr que c'est pourquoi j'ai découvert des outils pour éviter les mésaventures. De plus, en utilisant dd pour répliquer la partition est au moins pas très efficace
sehe
car il utilise une copie secteur par secteur et copierait sur l'espace vide du système de fichiers alloué? Je pense que, dans le contexte des PO, cela va probablement être complètement hors de propos. Nous ne savons même pas si la partition est pleine ou non, sans parler du fait qu'il s'occupe d'une attente de quelques minutes supplémentaires (le gain de temps peut être minime) au lieu d'essayer une solution alternative moins claire
XXL
mais il a le net avantage de pouvoir copier sur une partition de taille différente. DD suppose que la destination est exactement de la même taille (bien qu'elle puisse être plus grande ). Cela pourrait être un problème entrave, surtout quand les disques SSD sont impliqués (ils ne sont pas « illimité » capacité)
sehe
4

Jettes un coup d'oeil à

  • ntfsclone (copie uniquement les secteurs en cours d'utilisation)
  • fixntfs.c pour corriger les décalages d'informations de démarrage

IIRC, Trinity Rescue Kit contient le logiciel nécessaire ainsi que de nombreux autres (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; montage ntfs-3g, rsync etc. etc.).

/*
 * fixntfs: change some attributes of an NTFS bootsector
 *
 * brought to you by Phoenix
 * url: www.grhack.gr/phoenix
 * mail: [email protected]
 * 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);
}
sehe
la source
2

Ce mode d'emploi pour cloner un lecteur Windows a parfaitement fonctionné pour moi. Comme c'est la première fois que je peux transférer une installation de Windows vers un nouveau disque dur, je vais partager ma procédure ici pour aider le prochain Googler à visiter.

Ma situation:
Windows 7 x64 de Manager avait maximisé son SSD 128G, j'ai donc acheté un remplacement de 240 Go.

Problème:
j'ai deux stations d'accueil pour disques SATA mais Linux n'a pas reconnu les deux en même temps, empêchant une copie facile entre elles.

Matériel:
je suis sur le point de configurer un pare-feu double NIC, j'ai donc installé le SSD source sur cet ordinateur. Le SSD de destination 240G est entré dans un dock externe.

Processus:
1) La première clé USB que j'ai /dev/sda1
récupérée contenait un CD live Linux Mint, qui est devenu 2) Le "vieux" SSD 128G a été détecté et est devenu /dev/sdb1et /dev/sdb2
3) utilisé à # fdisk -l /dev/sdbpartir du tutoriel et copié les informations de la fenêtre de partition source sur Gedit.
- Remarque, le tutoriel inclut l' -uoption, cependant pour moi, fdisk affichait déjà des blocs (la sortie souhaitée), donc l'inclusion de ce commutateur donne des informations erronées.
4) Branchez et allumez la station d'accueil avec le SSD 240G de destination, qui devient /dev/sdc.
5) Utilisez fdisk /dev/sdcpour créer des partitions /dev/sdcqui correspondent exactement /dev/sdb, y compris les indicateurs de démarrage et de système.
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1pour copier le MBR sur le lecteur de destination.
- Le guide suggère maintenant d'utiliserhdparmpour activer DMA, mais la commande a échoué pour moi
7) ntfsclone -O /dev/sdc1 /dev/sdb1pour copier la partition système cachée de Windows.
- -Oou l' --overwriteoption est utilisée pour définir la destination, faisant apparaître la commande à l'envers. Félicitations au CD live de Linux Mint avec ntfsclone, car je n'avais jamais entendu parler de cette commande auparavant et je n'avais pas à me connecter au réseau.
8) Utilisez ntfsclone -O /dev/sdc2 /dev/sdb2pour copier les fenêtres "C Drive". Cela a pris quelques bières pour terminer.
9) Pour redimensionner la partition, j'ai utilisé gparted
10) Réinstallé le nouveau SSD dans l'ordinateur Windows et il exécute checkdisk (j'avais quitté le tutoriel et je n'ai pas remarqué qu'il le faisait).
11) Windows redémarré et tout est revenu à la normale mais avec plus d'espace libre.

Chris K
la source
1
  1. J'ai recherché " Disks " dans le menu des applications Ubuntu et ouvert l'application utilitaire Disks.
  2. J'ai sélectionné la partition à copier. Cliquez ensuite sur l' icône des paramètres et choisissez " Créer une image disque ".
  3. Il faudrait un certain temps pour générer l'image de récupération .
  4. Une fois la génération de l'image de récupération terminée, j'ai cliqué sur la partition où je voulais cloner l'ancienne partition.
  5. Ensuite, cliquez à nouveau sur l' icône des paramètres , choisissez " Restaurer l'image du disque " et sélectionnez le fichier d'image disque généré précédemment.
  6. Puis j'ai attendu qu'il se termine.

Je viens d'explorer l'application utilitaire Disks, et c'est tout. Je n'ai rien installé.

Niño Angelo Orlanes Lapura
la source