Sao chép phân vùng Windows từ Linux


12

Vì vậy, tôi đã có một ổ SSD Intel 120 GB, với một phân vùng cho Windows và một cái khác cho Ubuntu. Ubuntu là hệ điều hành chính của tôi, Windows là để chơi game. Nhưng bây giờ tôi đang tìm cách cài đặt Mac OS X và tôi muốn nó có trên SSD, vì vậy tôi đang tìm cách chuyển Windows sang một ổ đĩa khác (160GB bên ngoài cũ mà tôi đã lấy ra khỏi vỏ và đã được sử dụng như một ổ đĩa thử nghiệm. Tôi giữ các trò chơi của mình trên bất kỳ cách nào bên ngoài khác, vì vậy hiệu suất không bị ảnh hưởng, ngoài thời gian khởi động).

Cách tốt nhất để đi về điều này là gì? Bất kỳ công cụ tốt để nhân bản phân vùng? Tôi hỏi điều này bởi vì Google đang đưa ra rất nhiều kết quả về việc nhân bản ổ đĩa bạn đang sử dụng / cài đặt Ubuntu, thay vì cho tôi biết cách sao chép một phân vùng hoàn toàn không liên quan đến một vị trí không liên quan khác.

Ồ, và phân vùng Windows mới có cho phép tôi chạy nó mà không cần chỉnh sửa trước khi sao chép không? Bất kỳ thông tin khác liên quan đến điều này sẽ được nhiều đánh giá cao.

(Tôi đang làm điều này bởi vì tôi cần lấy bàn chân của mình trên XCode và MacBook Pro của tôi đang dần chết đi).


Chà, tất cả những gì bạn cần là cfdiskdd . Điều duy nhất có phần nghi vấn là khu vực khởi động. Phiên bản nào của Windows?
Xxx

Windows 7. Tôi nhớ cài đặt nó là một nỗi đau hoàng gia, vì một số vấn đề liên quan đến phân vùng.
Lỗi

Bạn có đĩa W7 theo ý của bạn?
Xxx

Không hoàn toàn chắc chắn nơi tôi đã đặt nó, nhưng tôi có thể đào nó lên nếu cần.
Lỗi

Câu trả lời:


7

Bạn sẽ cần sao chép 2 phân vùng với dd - một là nơi chứa bộ nạp khởi động / bootmanager (cần thiết để tải chuỗi hệ điều hành) [ System Reserved , thường là 100M] và cái còn lại là cài đặt W7 thực tế.

Kiểm tra bảng phân vùng với cfdisk - nó sẽ cung cấp cho bạn một đại diện trực quan. Sau đó xóa tất cả các phân vùng trên ổ đĩa đích - cfdisk là bạn của bạn.

Cú pháp nhân bản có thể được tìm thấy trên wiki ở đây . Bạn cũng sẽ cần một MBR thích hợp (có thể nó đã có trên ổ đĩa thử của bạn ).

Có lẽ bạn cũng sẽ cần gán cờ có thể khởi động cho phân vùng [Dự trữ hệ thống] (đó phải là lần đầu tiên được nhân bản) - cfdisk có thể thực hiện điều đó.

Nếu thất bại - chỉ cần khởi động từ đĩa cài đặt W7 và làm theo hướng dẫn tại đây cho Vista.

CẬP NHẬT :

Quên đề cập đến một phần quan trọng của toàn bộ quá trình có thể không quá rõ ràng. Bạn sẽ phải sao chép bảng phân vùng khỏi ổ đĩa gốc và xóa mọi thứ trừ 2 phân vùng liên quan đến Windows HOẶC tạo lại chúng bằng cfdisk / chia tay với cùng kích thước.

Dưới đây là một vài ví dụ (giả sử, sda là ổ đĩa nguồn của bạn và sdb là mục tiêu):

dd if = / dev / sda bs = 1 Skip = 446 Count = 66 of = / dev / sdb seek = 446 (điều này sẽ sao chép hiệu quả bảng phân vùng DOS hiện tại của bạn cùng với chữ ký MBR vào ổ đĩa đầu ra)

dd if = / dev / sda bs = 1 Skip = 440 Count = 72 of = / dev / sdb seek = 440 (điều này cũng sẽ sao chép ID đĩa đôi khi có thể dẫn đến khởi động thất bại nếu thiếu - tuy nhiên, các đĩa như vậy sẽ không có thể làm việc cùng nhau trên môi trường Windows, cho đến khi ID được thay đổi)

parted / dev / sda usp (đây là cách bạn có thể kiểm tra bảng phân vùng hiện tại và kích thước trong các cung trên ổ đĩa nguồn để sao chép sau này trên mục tiêu bằng cfdisk hoặc chia tay chính nó)


Đó là một nỗi đau và thường không khởi động
sehe

Tại sao? Nếu có vấn đề với quá trình khởi động - khởi tạo phiên nhắc lệnh từ đĩa cài đặt W7 và thực thi bootrec / fixmbr , bootrec / fixboot hoặc bootrec / construcildbcd có thể khắc phục sự cố.
Xxx

đủ công bằng. Tôi đã có nó thất bại cho tôi trong quá khứ. Tôi chắc chắn đó là lý do tại sao tôi phát hiện ra các dụng cụ để ngăn chặn sự rủi ro. Ngoài ra, sử dụng dd để sao chép phân vùng ít nhất là không hiệu quả lắm
sehe

bởi vì nó sử dụng một bản sao theo từng khu vực và sẽ sao chép trên không gian trống trong hệ thống tập tin được phân bổ? Tôi nghĩ, trong bối cảnh OP, điều này có lẽ sẽ hoàn toàn không liên quan. Chúng tôi thậm chí không biết liệu phân vùng có đầy đủ hay không, chưa kể đến anh ấy chăm sóc cho một chờ đợi thêm một vài phút (đạt được trong thời gian có thể được tối thiểu) thay vì cố gắng một giải pháp thay thế chưa rõ ràng
XXL

nhưng nó có lợi thế khác biệt là có thể sao chép vào một phân vùng có kích thước khác nhau. DD giả định đích đến có cùng kích thước (mặc dù, nó có thể lớn hơn ). Đây có thể là một vấn đề cản trở, đặc biệt là khi SSD có liên quan (chúng không có dung lượng 'không giới hạn' )
sehe

4

Có một cái nhìn

  • ntfsclone (chỉ sao chép các lĩnh vực đang sử dụng)
  • fixntfs.c để sửa lỗi bù thông tin khởi động

IIRC, Trinity Rescue Kit chứa các phần mềm cần thiết cũng như nhiều phần mềm khác (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; ntfs-3g, rsync, v.v.).

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

Cách nhân bản ổ đĩa Windows này hoạt động rất tốt đối với tôi. Vì đây là lần đầu tiên tôi có thể chuyển cài đặt Windows sang ổ cứng mới, tôi sẽ chia sẻ quy trình của mình ở đây để giúp Googler tiếp theo ghé thăm.

Tình huống của tôi:
Windows 7 x64 của người quản lý đã sử dụng tối đa SSD 128G, vì vậy tôi đã mua một thay thế 240 GB.

Vấn đề:
Tôi có hai ổ đĩa SATA nhưng linux không nhận ra cả hai cùng một lúc, ngăn chặn một bản sao dễ dàng giữa chúng.

Phần cứng:
Tôi sắp thiết lập một tường lửa NIC kép, vì vậy tôi đã cài đặt SSD nguồn trong máy tính này. SSD 240G đích đã đi vào dock ngoài.

Quá trình:
1) Thanh USB đầu tiên tôi nhặt được có đĩa CD trực tiếp Linux Mint, đã trở thành /dev/sda1
2) SSD 128G "cũ" được phát hiện và trở thành /dev/sdb1/dev/sdb2
3) Được sử dụng # fdisk -l /dev/sdbtừ hướng dẫn và sao chép thông tin của cửa sổ phân vùng nguồn sang Gedit.
- Lưu ý, hướng dẫn bao gồm -utùy chọn, tuy nhiên đối với tôi, fdisk đã hiển thị các khối (đầu ra mong muốn) nên bao gồm cả công tắc đó cung cấp thông tin sai.
4) Cắm và bật dock ổ đĩa với SSD 240G đích, sẽ trở thành /dev/sdc.
5) Sử dụng fdisk /dev/sdcđể tạo các phân vùng trên /dev/sdcđó khớp chính xác /dev/sdb, bao gồm cả cờ khởi động và hệ thống.
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1để sao chép MBR vào ổ đĩa đích.
- Hướng dẫn hiện gợi ý sử dụnghdparmđể bật DMA, nhưng tôi đã thất bại với lệnh
7) ntfsclone -O /dev/sdc1 /dev/sdb1để sao chép phân vùng hệ thống ẩn của windows.
- -Ohoặc --overwritetùy chọn được sử dụng để đặt đích, làm cho lệnh xuất hiện ngược. Kudos to Linux Mint live CD có ntfsclone, vì tôi chưa từng nghe về lệnh này trước đây và tôi không phải truy cập mạng.
8) Sử dụng ntfsclone -O /dev/sdc2 /dev/sdb2để sao chép các cửa sổ "C Drive". Điều này đã mất một vài loại bia để hoàn thành.
9) Để thay đổi kích thước phân vùng, tôi đã sử dụng gparted
10) Cài đặt lại SSD mới trong máy tính windows và nó chạy checkdisk (Tôi đã để lại hướng dẫn & không nhận thấy anh ta làm điều này).
11) Windows được khởi động lại và tất cả đã trở lại bình thường nhưng có nhiều không gian trống hơn.


1
  1. Tôi đã tìm kiếm " Đĩa " trong menu ứng dụng Ubuntu và mở ứng dụng tiện ích Đĩa.
  2. Tôi đã chọn phân vùng để sao chép. Sau đó nhấp vào biểu tượng cài đặt và chọn " Tạo ảnh đĩa ".
  3. Sẽ mất một lúc để tạo hình ảnh khôi phục .
  4. Sau khi hoàn thành việc tạo hình ảnh khôi phục, tôi nhấp vào phân vùng mà tôi muốn sao chép phân vùng cũ.
  5. Sau đó nhấp vào biểu tượng cài đặt một lần nữa và chọn " Khôi phục ảnh đĩa " và chọn tệp ảnh đĩa được tạo trước đó.
  6. Sau đó chờ nó kết thúc.

Tôi mới khám phá ứng dụng tiện ích Disks, và đó là nó. Tôi đã không cài đặt bất cứ điều gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.