Clonar partição Windows do Linux

7

Então eu tenho um SSD Intel de 120 GB, com uma partição para o Windows e outra para o Ubuntu. O Ubuntu é meu sistema operacional principal, o Windows é para jogos. Mas agora eu estou olhando para instalar o Mac OS X, e eu gostaria que fosse no SSD, então eu estou olhando para mover o Windows para uma unidade diferente (velho 160GB externo que tirei do shell e ter sido usando como test drive.Eu mantenho meus jogos em outro externo de qualquer maneira, então o desempenho não deve ser afetado, além do tempo de inicialização).

Qual é a melhor maneira de fazer isso? Alguma boa ferramenta para clonar partições? Pergunto isso porque o Google está obtendo muitos resultados na clonagem da unidade em que você está realmente usando / com o Ubuntu instalado, em vez de me dizer como clonar uma partição totalmente não relacionada a outro local não relacionado.

Ah, e será que a nova partição do Windows permitirá que eu a execute sem nenhum ajuste prévio de pós-clone? Qualquer outra informação sobre isso seria muito apreciada.

(Estou fazendo isso porque preciso colocar minhas mãos no XCode e meu MacBook Pro está morrendo lentamente).

    
por Fault 22.10.2011 / 00:40

3 respostas

2

Você precisará clonar 2 partições com dd - uma é onde o bootloader / bootmanager reside (necessário para carregar o sistema operacional) [ Sistema Reservado , geralmente 100M ] e o outro é a instalação real do W7.

Verifique a tabela de partições com cfdisk - isso lhe dará uma representação visual. Em seguida, exclua todas as partições na unidade de destino - cfdisk é seu amigo.

A sintaxe para clonagem pode ser encontrada no wiki aqui . Você também precisará de um MBR adequado (provavelmente já está presente em seu test drive ).

Você provavelmente precisará atribuir um sinalizador inicializável à partição [System Reserved] também (que deve ser o primeiro clonado) - cfdisk pode realizar isso.

Se isso falhar, basta inicializar a partir de um disco de instalação do W7 e seguir as diretrizes aqui para o Vista.

UPDATE :

Esqueceu de mencionar uma parte importante de todo o processo que pode não ser tão evidente. Você terá que clonar a tabela de partições da unidade original e excluir tudo exceto as duas partições relacionadas ao Windows OU recriá-las com cfdisk / dividido com o mesmo tamanho .

Aqui estão alguns exemplos (assumindo que sda é sua unidade de origem e sdb é o destino):

dd if=/dev/sda bs=1 skip=446 count=66 of=/dev/sdb seek=446 (this will effectively clone your current DOS partition table along with the MBR signature to the output drive)

dd if=/dev/sda bs=1 skip=440 count=72 of=/dev/sdb seek=440 (this will also copy the disk ID which can sometimes result in a failed boot if missing - however, such disks will not be able to work together on a Windows environment, until the ID is changed)

parted /dev/sda u s p (this is how you can inspect the current partition table and size in sectors on the source drive for later replication on the target with either cfdisk or parted itself)

    
por 22.10.2011 / 00:54
3

Dê uma olhada em

  • ntfsclone (copia apenas setores em uso)
  • fixntfs.c para corrigir os deslocamentos da informação de inicialização

O IIRC, Trinity Rescue Kit contém o software necessário, assim como muitos outros (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted , testdisk, ntfsfix; montagem 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);
}
    
por 22.10.2011 / 02:18
2

Este tutorial para clonar uma unidade do Windows funcionou esplendidamente para mim. Como esta é a primeira vez que posso transferir uma instalação do Windows para um novo disco rígido, compartilharei meu procedimento aqui para ajudar o próximo Googler a visitar.

Minha situação:
O Windows 7 x64 do gerenciador havia excedido o SSD de 128G, então comprei um substituto de 240 GB.

Problema:
Eu tenho dois pontos de unidade SATA , mas o linux não reconheceu os dois ao mesmo tempo, impedindo uma cópia fácil entre eles .

Hardware:
Estou prestes a configurar um firewall dual NIC, então instalei o SSD de origem neste computador. O SSD 240G de destino foi para o terminal externo.

Processo:
1) O primeiro pendrive que peguei tinha o CD Live do Linux Mint, que se tornou /dev/sda1
2) SSD 128G "antigo" foi detectado e tornou-se /dev/sdb1 e /dev/sdb2
3) Usou o # fdisk -l / dev / sdb do tutorial e copiou as informações da janela de partição de origem para o Gedit.
- Note que o tutorial inclui a opção -u , no entanto, para mim, o fdisk já estava exibindo blocos (a saída desejada), incluindo a opção que fornece informações erradas.
4) Conecte e ligue a estação de acoplamento com o destino 240G SSD, que se torna /dev/sdc .
5) Use fdisk / dev / sdc para criar partições em /dev/sdc que correspondam exatamente a /dev/sdb , incluindo sinalizadores de inicialização e do sistema.
6) dd se = / dev / sdb de = / dev / sda bs = 446 count = 1 para copiar o MBR para a unidade de destino.
- O guia agora sugere usar hdparm para ligar o DMA, mas o comando falhou para mim
7) ntfsclone -O / dev / sdc1 / dev / sdb1 para copiar a partição do sistema oculta do Windows.
- -O ou --overwrite opção é usada para definir o destino , fazendo o comando aparecer para trás. Parabéns ao Linux Mint live CD com o ntfsclone, já que eu não tinha ouvido falar desse comando antes & Eu não tenho que entrar na rede.
8) Use ntfsclone -O / dev / sdc2 / dev / sdb2 para copiar as janelas "C Drive". Isso levou algumas cervejas para completar.
9) Para redimensionar a partição, usei gparted 10) Reinstalado novo SSD no computador windows e roda o checkdisk (deixei o tutorial e não notei que ele faz isso). 11) Reinicie o Windows e tudo volta ao normal, mas com mais espaço livre.

    
por 08.01.2014 / 21:07