Linux에서 Windows 파티션 복제


13

그래서 Windows 용 파티션과 Ubuntu 용 파티션이있는 120GB Intel SSD가 있습니다. 우분투는 내 주요 OS이고 Windows는 게임용입니다. 그러나 지금은 Mac OS X을 설치하고 SSD에 넣고 싶습니다. 따라서 Windows를 다른 드라이브 (이전 셸에서 꺼내서 이전에 160GB 외부로 옮겼습니다. 어쨌든 게임을 다른 외부 장치에 보관하므로 시작 시간 이외의 성능에는 영향을 미치지 않아야합니다.

이것에 대해 가장 좋은 방법은 무엇입니까? 파티션 복제에 유용한 도구가 있습니까? Google이 완전히 관련없는 파티션을 다른 관련없는 위치로 복제하는 방법을 알려주는 대신 실제로 Ubuntu가 설치된 드라이브 복제에 대한 많은 결과를 보여 주므로이 점을 묻습니다.

아, 그리고 새로운 Windows 파티션을 사용하여 사전 복제 후 조정없이 실행할 수 있습니까? 이것에 관한 다른 정보는 대단히 감사하겠습니다.

(XCode에서 발을 가져야하고 MacBook Pro가 천천히 죽어 가고 있기 때문에이 작업을 수행하고 있습니다).


cfdiskdd 만 있으면 됩니다. 다소 의심스러운 것은 부트 섹터입니다. 어떤 버전의 Windows입니까?
XXL

Windows 7. 파티션 관련 문제로 인해 설치가 어려워지는 것을 기억합니다.
오류

W7 디스크를 마음대로 사용할 수 있습니까?
XXL

내가 어디에 배치했는지 확실하지 않지만 필요한 경우 파헤칠 수 있습니다.
오류

답변:


7

dd를 사용 하여 2 개의 파티션을 복제해야합니다. 하나는 부트 로더 / 부팅 관리자가 상주하는 위치 (OS를 체인로드하기 위해 필요) [ 시스템 예약 , 보통 100M]이고 다른 하나는 실제 W7 설치입니다.

cfdisk로 파티션 테이블을 확인하십시오 . 시각적으로 나타납니다. 그런 다음 대상 드라이브에서 모든 파티션을 삭제 하십시오. cfdisk 는 친구입니다.

클로닝 구문은 wiki here 에서 찾을 수 있습니다 . 또한 적절한 MBR이 필요할 것입니다 ( 테스트 드라이브 에 이미있을 수 있습니다 ).

부팅 가능한 플래그를 [System Reserved] 파티션에도 할당해야 할 것입니다 (첫 번째 복제해야 함) . cfdisk가이 를 수행 할 수 있습니다.

W7 설치 디스크에서 간단하게 부팅하고 지침을 따르십시오 - 그 실패 할 경우 여기에 비스타.

업데이트 :

분명하지 않을 수도있는 전체 프로세스의 중요한 부분을 언급하는 것을 잊었습니다. 원래 드라이브에서 파티션 테이블을 복제하고 2 개의 Windows 관련 파티션을 제외한 모든 것을 삭제 하거나 동일한 크기 의 cfdisk / parted 로 다시 생성해야 합니다.

다음은 몇 가지 예입니다 ( sda 가 소스 드라이브이고 sdb 가 대상 이라고 가정 ).

dd if = / dev / sda bs = 1 skip = 446 count = 66 of = / dev / sdb seek = 446 (이는 MBR 서명과 함께 현재 DOS 파티션 테이블을 출력 드라이브에 효과적으로 복제합니다)

dd if = / dev / sda bs = 1 skip = 440 count = 72 of = / dev / sdb seek = 440 (이는 또한 디스크 ID를 복사하여 누락 된 경우 부팅에 실패 할 수 있습니다. 그러나 그러한 디스크는 그렇지 않습니다. ID가 변경 될 때까지 Windows 환경에서 함께 작업 할 수 있어야합니다.)

parted / dev / sda usp (이는 cfdisk 또는 parted 자체로 대상에서 나중에 복제하기 위해 소스 드라이브의 섹터에서 현재 파티션 테이블 및 크기를 검사하는 방법 입니다)


그것은 고통
sehe

왜? 디스크를 설치 W7에서 명령 프롬프트 세션을 인스턴스화하고 실행 - 부팅 과정에 문제가있는 경우 bootrec / FIXMBR , bootrec / fixboot와 또는 bootrec /의 rebuildbcd을 문제를 해결할 수있을 것입니다.
XXL

그럴 수 있지. 나는 과거에 나를 위해 실패했다. 나는 그것이 사고를 예방하기 위해 유틸리티에 대해 알게 된 이유라고 확신합니다. 또한, dd를 사용하여 파티션을 복제하는 것은 그리 효율적이지 않습니다
sehe

섹터 별 복사를 사용하고 할당 된 파일 시스템의 빈 공간을 복사하기 때문입니까? OP의 맥락에서 이것은 아마도 완전히 관련이 없을 것이라고 생각합니다. 파티션이 전체인지 아닌지 우리는 심지어하지 그를 기다리고 몇 푼 분을 돌보는 (시간 게인이 최소화 될 수 있음) 대신 덜 명확 대체 솔루션 노력은 물론, 모르는
XXL

그러나 크기가 다른 파티션에 복사 할 수 있다는 장점이 있습니다. DD는 목적지가 정확히 같은 크기라고 가정합니다 (그러나 더 클 수도 있음 ). 특히 SSD가 관련된 경우 ( '무제한' 용량이 아님)
sehe

4

보세요

  • ntfsclone (사용중인 섹터 만 복사)
  • 부팅 정보 오프셋을 수정하는 fixntfs.c

IIRC, Trinity Rescue Kit 에는 필요한 소프트웨어뿐만 아니라 다른 소프트웨어 (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; ntfs-3g 마운팅, rsync 등)가 포함되어 있습니다.

/*
 * 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

Windows 드라이브 복제를위한방법 은 저에게 훌륭하게 작용했습니다. 처음으로 Windows 설치를 새 하드 드라이브로 전송할 수 있었으므로 다음 Google 직원이 방문 할 수 있도록 여기에서 절차를 공유합니다.

내 상황 :
Manager의 Windows 7 x64는 128G SSD를 최대로 사용했기 때문에 240GB 교체품을 구입했습니다.

문제점 :
두 개의 SATA 드라이브 도크가 있지만 리눅스가 동시에 두 가지를 인식하지 못하기 때문에 두 드라이브 사이에 쉽게 복사 할 수 없습니다.

하드웨어 :
이중 NIC 방화벽을 설정하려고하므로이 컴퓨터에 소스 SSD를 설치했습니다. 대상 240G SSD가 외부 도크에 들어갔습니다.

과정 :
1) 내가 데리러 첫 번째 USB 스틱되었다 거기에 리눅스 민트 라이브 CD했다 /dev/sda1
2) "올드"128G SSD가 감지되고되었다 /dev/sdb1/dev/sdb2
사용) 3 # fdisk -l /dev/sdb튜토리얼에서와 gedit를 원본 파티션 윈도우의 정보를 복사합니다.
-튜토리얼에는 -u옵션이 포함되어 있지만 fdisk에는 이미 블록 (원하는 출력)이 표시되어 있으므로 스위치를 포함하면 잘못된 정보가 표시됩니다.
4) 대상 240G SSD가있는 드라이브 도크를 연결하고 켭니다 /dev/sdc.
5) 부팅 및 시스템 플래그를 포함하여 정확히 일치하는 fdisk /dev/sdc파티션을 만드는 데 사용 합니다 . 6) MBR을 대상 드라이브에 복사합니다. -가이드는 이제 사용을 제안합니다/dev/sdc/dev/sdb
dd if=/dev/sdb of=/dev/sda bs=446 count=1
hdparmDMA를 켜려면 명령이 실패했습니다.
7) ntfsclone -O /dev/sdc1 /dev/sdb1Windows 숨겨진 시스템 파티션을 복사 하지 못했습니다 .
- -O또는 --overwrite옵션을 사용하여 대상을 설정하면 명령이 거꾸로 나타납니다. Linux Mint 라이브 CD에는 ntfsclone이 포함되어 있습니다.이 명령을 들어 본 적이 없으며 네트워크에 연결할 필요가 없었습니다.
8) ntfsclone -O /dev/sdc2 /dev/sdb2창 "C Drive"를 복사하는 데 사용 합니다. 이 작업을 완료하려면 몇 가지 맥주가 필요했습니다.
9) 파티션 크기를 조정하기 위해 gparted
10을 사용했습니다. 10) Windows 컴퓨터에 새 SSD를 다시 설치하고 checkdisk를 실행합니다 (자습서를 떠났으 며 그가하는 것을 알지 못했습니다).
11) Windows를 재부팅하면 모든 것이 정상으로 돌아 왔지만 여유 공간이 더 많습니다.


1
  1. Ubuntu 응용 프로그램 메뉴 에서 " 디스크 "를 검색 하고 디스크 유틸리티 앱을 열었습니다.
  2. 복사 할 파티션을 선택했습니다. 그런 다음 설정 아이콘을 클릭 하고 " 디스크 이미지 생성 "을 선택 하십시오 .
  3. 복구 이미지생성하는 데 시간이 조금 걸립니다 .
  4. 복구 이미지 생성이 끝나면 이전 파티션 을 복제하려는 파티션을 클릭했습니다 .
  5. 그런 다음 설정 아이콘을 다시 클릭 하고 " 디스크 이미지 복원 "을 선택하고 이전에 생성 된 디스크 이미지 파일을 선택하십시오.
  6. 그런 다음 완료 될 때까지 기다렸습니다.

방금 디스크 유틸리티 앱을 살펴 보았습니다. 나는 아무것도 설치하지 않았다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.