คัดลอกพาร์ติชัน Windows จาก Linux


13

ดังนั้นฉันจึงมี SSD SSD ขนาด 120 GB พร้อมด้วยพาร์ติชั่นสำหรับ Windows และอีกอันสำหรับ Ubuntu Ubuntu เป็นระบบปฏิบัติการหลักของฉัน Windows ใช้สำหรับเล่นเกม แต่ตอนนี้ฉันกำลังมองหาที่จะติดตั้ง Mac OS X และฉันต้องการให้มันเป็น SSD ดังนั้นฉันกำลังมองหาที่จะย้าย Windows ไปยังไดรฟ์ที่แตกต่างกัน (160GB ภายนอกเก่าที่ฉันเอาออกมาจากเปลือกและได้รับแล้ว ใช้เป็นไดรฟ์ทดสอบฉันเก็บเกมของฉันไว้ในที่อื่น ๆ ภายนอกดังนั้นประสิทธิภาพไม่ควรได้รับผลกระทบนอกเหนือจากเวลาเริ่มต้น)

วิธีที่ดีที่สุดที่จะไปเกี่ยวกับเรื่องนี้คืออะไร? มีเครื่องมือที่ดีสำหรับการลอกพาร์ติชั่นไหม? ฉันถามสิ่งนี้เพราะ Google กำลังแสดงผลลัพธ์จำนวนมากเกี่ยวกับการโคลนไดรฟ์ที่คุณใช้จริง / ติดตั้ง Ubuntu ไว้แทนที่จะบอกวิธีการโคลนพาร์ติชั่นที่ไม่เกี่ยวข้องทั้งหมดไปยังตำแหน่งอื่นที่ไม่เกี่ยวข้อง

อ๊ะและพาร์ติชั่น Windows ใหม่จะให้ฉันรันโดยไม่มีการโพสต์โคลนก่อนหน้านี้ไหม? ข้อมูลอื่น ๆ เกี่ยวกับเรื่องนี้จะได้รับการชื่นชมมาก

(ฉันทำสิ่งนี้เพราะฉันต้องใช้อุ้งมือของฉันบน XCode และ MacBook Pro ของฉันกำลังจะตายอย่างช้าๆ)


ดีที่คุณต้องมีcfdiskและDD สิ่งเดียวที่ค่อนข้างน่าสงสัยคือบูตเซกเตอร์ Windows รุ่นใด
XXL

Windows 7 ฉันจำได้ว่าติดตั้งมันเป็นความเจ็บปวดของราชวงศ์เนื่องจากมีปัญหาเกี่ยวกับพาร์ติชันบางอย่าง
ความผิดพลาด

คุณมีแผ่นดิสก์ W7 ตามที่คุณต้องการหรือไม่?
XXL

ไม่แน่ใจว่าฉันวางไว้ที่ไหน แต่สามารถขุดได้ถ้าจำเป็น
ความผิดพลาด

คำตอบ:


7

คุณจะต้องโคลน 2 พาร์ติชั่นด้วยdd - อันหนึ่งคือที่ bootloader / bootmanager ตั้งอยู่ (จำเป็นในการ chainload OS) [ ระบบที่สงวนไว้ , โดยปกติคือ 100M] และอีกอันหนึ่งเป็นการติดตั้ง W7 จริง

ตรวจสอบตารางพาร์ทิชันด้วยcfdisk - มันจะทำให้คุณเห็นภาพ จากนั้นลบพาร์ติชันทั้งหมดบนไดรฟ์เป้าหมาย - cfdiskคือเพื่อนของคุณ

ไวยากรณ์สำหรับการโคลนสามารถพบได้ในวิกิพีเดียที่นี่ คุณจะต้องมีMBRที่เหมาะสม(อาจมีอยู่ในไดรฟ์ทดสอบของคุณ)

คุณอาจจะต้องกำหนดแฟล็กที่สามารถบู๊ตได้ให้กับพาร์ติชัน [System Reserveed] เช่นกัน (ซึ่งควรเป็นอันแรกที่ถูกโคลน) - cfdiskสามารถทำสิ่งนั้นได้

หากสิ่งนั้นล้มเหลว - เพียงแค่ทำการบูทจากแผ่นดิสก์การติดตั้ง W7 และทำตามคำแนะนำที่นี่สำหรับ Vista

อัปเดต :

ลืมพูดถึงส่วนหนึ่งที่สำคัญของกระบวนการทั้งหมดที่อาจไม่ชัดเจน คุณจะต้องโคลนตารางพาร์ทิชันออกจากไดรฟ์เดิมและลบทุกอย่างยกเว้นพาร์ติชันที่เกี่ยวข้องกับ Windows 2 หรือสร้างใหม่ด้วยcfdisk / แยกด้วยขนาดเดียวกัน

นี่คือตัวอย่างเล็ก ๆ น้อย ๆ (สมมติว่าsdaนั้นเป็นไดรฟ์ต้นทางของคุณและsdbเป็นเป้าหมาย):

dd if = / dev / sda bs = 1 ข้าม = 446 count = 66 of = / dev / sdb แสวงหา = 446 (ซึ่งจะทำการโคลนพาร์ติชั่นตาราง DOS พาร์ติชั่นปัจจุบันพร้อมกับลายเซ็น MBR ไปยังไดรฟ์)

dd if = / dev / sda bs = 1 skip = 440 count = 72 of = / dev / sdb ค้นหา = 440 (สิ่งนี้จะคัดลอก ID ดิสก์ซึ่งบางครั้งอาจส่งผลให้เกิดการบูตล้มเหลวหากหายไป - อย่างไรก็ตามดิสก์ดังกล่าวจะไม่ สามารถทำงานร่วมกันบนสภาพแวดล้อม Windows จนกว่าจะเปลี่ยน ID)

parted / dev / sda usp (นี่คือวิธีที่คุณสามารถตรวจสอบตารางพาร์ติชันปัจจุบันและขนาดในเซ็กเตอร์บนไดรฟ์ต้นทางสำหรับการเรพลิเคทเป้าหมายในภายหลังด้วยcfdiskหรือแยกส่วนเอง)


นั่นคือความเจ็บปวดและมักจะไม่บู๊ต
sehe

ทำไม? หากมีปัญหากับกระบวนการบู๊ต - การเริ่มเซสชันพรอมต์คำสั่งจากแผ่นดิสก์การติดตั้ง W7 และเรียกใช้bootrec / fixmbrให้bootrec / fixbootหรือbootrec / rebuildbcdควรสามารถแก้ไขปัญหาได้
XXL

ยุติธรรมพอสมควร ฉันเคยล้มเหลวมาก่อน ฉันแน่ใจว่านั่นเป็นเหตุผลที่ฉันพบข้อมูลเกี่ยวกับ utils เพื่อป้องกันอุบัติเหตุ นอกจากนี้การใช้ dd เพื่อทำซ้ำพาร์ติชันอย่างน้อยก็ไม่ได้มีประสิทธิภาพมากนัก
sehe

เพราะมันใช้การคัดลอกแต่ละส่วนและจะคัดลอกพื้นที่ว่างในระบบไฟล์ที่จัดสรร? ฉันคิดว่าในบริบทของ OPs นี่อาจจะไม่เกี่ยวข้องอย่างสมบูรณ์ เราไม่รู้ด้วยซ้ำว่าพาร์ทิชันนั้นเต็มหรือไม่และไม่ต้องพูดถึงว่าเขากำลังรอเวลาเพิ่มอีกไม่กี่นาที (การได้รับเวลาอาจน้อย) แทนที่จะลองใช้ทางเลือกที่ไม่ชัดเจน
XXL

แต่มันมีข้อดีที่แตกต่างจากความสามารถในการคัดลอกไปยังพาร์ติชันที่มีขนาดแตกต่างกัน DD ถือว่าปลายทางมีขนาดเท่ากันทุกประการ(แม้ว่ามันอาจใหญ่กว่า ) ปัญหานี้อาจเกิดการขัดขวางโดยเฉพาะอย่างยิ่งเมื่อ SSDs มีส่วนร่วม (พวกเขาจะไม่ได้'ไม่ จำกัด'จุ)
sehe

4

มองไปที่

  • ntfsclone (คัดลอกเฉพาะส่วนที่ใช้งานอยู่)
  • fixntfs.cเพื่อแก้ไขการบูตออฟเซ็ตข้อมูล

IIRC, Trinity Rescue Kitมีซอฟต์แวร์ที่จำเป็นเช่นเดียวกับซอฟต์แวร์อื่น ๆ (ssh, partimage, fdisk, fdisk, cfdisk, แยก, 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 ไปยังฮาร์ดไดรฟ์ใหม่ฉันจะแบ่งปันขั้นตอนของฉันที่นี่เพื่อช่วย Googler คนต่อไปให้เยี่ยมชม

สถานการณ์ของฉัน:
ผู้จัดการ Windows 7 x64 ได้สูงสุด 128G SSD ดังนั้นฉันจึงซื้อการเปลี่ยน 240 GB

ปัญหา:
ฉันมีที่เก็บไดรฟ์ SATAสองตัวแต่ลีนุกซ์ไม่รู้จักทั้งสองอย่างในเวลาเดียวกันป้องกันการคัดลอกที่ง่ายระหว่างกัน

ฮาร์ดแวร์:
ฉันกำลังจะตั้งค่าไฟร์วอลล์คู่ NIC ดังนั้นฉันจึงติดตั้ง SSD ต้นทางในคอมพิวเตอร์เครื่องนี้ ปลายทาง 240G SSD ไปที่ Dock ภายนอก

กระบวนการ:
1) แท่ง USB ตัวแรกที่ฉันรับมีลินุกซ์มิ้นท์ซีดีอยู่ซึ่งกลายเป็น/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เพื่อสร้างพาร์ติชั่น/dev/sdcที่ตรงกัน/dev/sdbทั้งหมดรวมถึงบูทและแฟล็กระบบ
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1เพื่อคัดลอก MBR ไปยังไดรฟ์ปลายทาง
- คำแนะนำในขณะนี้แนะนำให้ใช้hdparmเพื่อเปิด DMA แต่คำสั่งล้มเหลวสำหรับฉัน
7) ntfsclone -O /dev/sdc1 /dev/sdb1เพื่อคัดลอกพาร์ติชันระบบที่ซ่อนอยู่ของ windows
- -Oหรือ--overwriteตัวเลือกใช้สำหรับตั้งค่าปลายทางทำให้คำสั่งปรากฏขึ้นด้านหลัง รุ่งโรจน์กับ Linux Mint live CD ที่มี ntfsclone เนื่องจากฉันไม่เคยได้ยินคำสั่งนี้มาก่อน & ฉันไม่จำเป็นต้องอยู่บนเครือข่าย
8) ใช้ntfsclone -O /dev/sdc2 /dev/sdb2เพื่อคัดลอกหน้าต่าง "C Drive" การทำเช่นนี้ทำให้เบียร์ไม่กี่เครื่อง
9) สำหรับการปรับขนาดพาร์ติชันฉันใช้gparted
10) ติดตั้ง SSD ใหม่ในคอมพิวเตอร์ที่ใช้ windows และเรียกใช้ checkdisk (ฉันออกจากการสอนแล้ว & ไม่ได้สังเกตว่าเขาทำเช่นนี้)
11) รีบูท Windows และทั้งหมดกลับมาเป็นปกติ แต่มีพื้นที่ว่างมากกว่า


1
  1. ฉันค้นหา " ดิสก์ " ในUbuntuเมนูแอปพลิเคชันและเปิดแอปยูทิลิตี้ดิสก์
  2. ฉันเลือกพาร์ติชันที่จะคัดลอก จากนั้นคลิกที่ ไอคอนการตั้งค่าและเลือก " สร้างภาพดิสก์ "
  3. อาจใช้เวลาสักครู่ในการสร้างอิมเมจการกู้คืนสร้างภาพการกู้คืน
  4. หลังจากสร้างอิมเมจการกู้คืนเสร็จแล้วฉันคลิกพาร์ติชันที่ฉันต้องการโคลนพาร์ติชันเดิม
  5. จากนั้นคลิกที่ไอคอนการตั้งค่าอีกครั้งและเลือก " กู้คืนรูปดิสก์ " และเลือกไฟล์อิมเมจดิสก์ที่สร้างขึ้นก่อนหน้านี้
  6. จากนั้นรอให้เสร็จ

ฉันเพิ่งสำรวจแอพยูทิลิตี้ของดิสก์และนั่นก็คือ ฉันไม่ได้ติดตั้งอะไรเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.