Клонировать Windows раздел из Linux


12

Итак, у меня есть Intel SSD на 120 ГБ, с разделом для Windows и другим для Ubuntu. Ubuntu - моя основная ОС, Windows - для игр. Но сейчас я пытаюсь установить Mac OS X и хочу, чтобы он был на SSD, поэтому я хочу переместить Windows на другой диск (старый внешний 160 ГБ, который я вынул из своей оболочки и использую в качестве тест-драйва. В любом случае я держу свои игры на другом внешнем устройстве, так что на производительность не следует влиять, кроме времени запуска).

Какой лучший способ пойти по этому поводу? Какие-нибудь хорошие инструменты для клонирования разделов? Я спрашиваю об этом, потому что Google выдает много результатов по клонированию диска, на котором вы фактически используете / на котором установлена ​​Ubuntu, вместо того, чтобы рассказывать, как клонировать совершенно не связанный раздел в другое, не связанное с этим место.

О, и позволит ли новый раздел Windows запустить его без предварительной настройки после клонирования? Любая другая информация по этому поводу будет принята с благодарностью.

(Я делаю это, потому что мне нужно взять свои лапы на XCode, а мой MacBook Pro медленно умирает).


Ну, все, что вам нужно, это cfdisk и dd . Единственное, что вызывает сомнения - это загрузочный сектор. Какая версия Windows?
XXL

Windows 7. Я помню, что установить его было очень сложно из-за проблем, связанных с разделами.
Ошибка

У вас есть диск W7?
XXL

Не совсем уверен, где я его разместил, но я могу выкопать его, если это будет необходимо.
Ошибка

Ответы:


7

Вам нужно будет клонировать 2 раздела с помощью dd - один находится там, где находится загрузчик / начальный загрузчик (необходим для загрузки ОС) [ System Reserved , обычно 100M], а другой - фактическая установка W7.

Проверьте таблицу разделов с помощью cfdisk - это даст вам визуальное представление. Затем удалите все разделы на целевом диске - cfdisk - ваш друг.

Синтаксис для клонирования можно найти в вики здесь . Вам также понадобится правильный MBR (он, вероятно, уже присутствует на вашем тест-драйве ).

Возможно, вам также потребуется назначить загрузочный флаг разделу [System Reserved] (который должен быть первым клонированным) - cfdisk может сделать это.

Если это не помогло - просто загрузитесь с установочного диска W7 и следуйте приведенным здесь инструкциям для Vista.

ОБНОВЛЕНИЕ :

Забыл упомянуть одну важную часть всего процесса, которая может быть не столь очевидной. Вам нужно будет либо клонировать таблицу разделов с исходного диска и удалить все, кроме двух разделов, связанных с Windows, либо заново создать их с помощью cfdisk / parted с тем же размером.

Вот несколько примеров (при условии, что sda - ваш исходный диск, а sdb - цель):

dd if = / dev / sda bs = 1 skip = 446 count = 66 of = / dev / sdb seek = 446 (это эффективно клонирует вашу текущую таблицу разделов DOS вместе с подписью MBR на выходной диск)

dd if = / dev / sda bs = 1 skip = 440 count = 72 of = / dev / sdb seek = 440 (это также скопирует идентификатор диска, который иногда может привести к неудачной загрузке в случае отсутствия, однако такие диски не будут уметь работать вместе в среде Windows, пока идентификатор не изменится)

parted / dev / sda usp (именно так вы можете проверить текущую таблицу разделов и размер в секторах на исходном диске для последующей репликации на целевом диске cfdisk или самого parted )


Это боль и обычно не загружается
сех

Почему? Если есть проблема с процессом загрузки - создание экземпляра сеанса командной строки с установочного диска W7 и выполнение bootrec / fixmbr , bootrec / fixboot или bootrec / rebuildbcd должны быть в состоянии решить проблему.
XXL

справедливо. Я потерпел неудачу для меня в прошлом. Я уверен, что именно поэтому я узнал об утилитах, чтобы предотвратить несчастный случай. Кроме того, использование dd для репликации раздела, по крайней мере, не очень эффективно
sehe

потому что он использует посекторное копирование и будет копировать пустое пространство в выделенной файловой системе? Я думаю, что в контексте ОП это, вероятно, будет совершенно неактуально. Мы даже не знаем, заполнен ли раздел или нет, не говоря уже о том, что он заботится о том, чтобы подождать несколько дополнительных минут (выигрыш во времени может быть минимальным) вместо того, чтобы пытаться найти менее ясное альтернативное решение
XXL

но он имеет явное преимущество, заключающееся в возможности копирования на раздел другого размера. DD предполагает, что пункт назначения точно такого же размера (хотя и может быть больше ). Это может быть проблемой, особенно когда задействованы твердотельные накопители (они не имеют «неограниченной» емкости)
смотри

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 на новый жесткий диск, я поделюсь своей процедурой, чтобы помочь следующему посетителю Googler.

Моя ситуация: в
диспетчере Windows 7 x64 максимальный объем SSD 128 ГБ, поэтому я купил замену на 240 ГБ.

Проблема: у
меня есть две док- станции для дисков SATA, но linux не распознал их одновременно, что препятствовало их простому копированию.

Оборудование:
я собираюсь настроить брандмауэр с двумя сетевыми картами, поэтому я установил исходный SSD на этот компьютер. Назначение 240G SSD ушло во внешнюю док-станцию.

Процесс:
1) На первой USB-флешке, которую я взял, был установлен Linux Mint live CD, который стал /dev/sda1
2) «Старый» 128G SSD был обнаружен и стал /dev/sdb1и /dev/sdb2
3) Использован # fdisk -l /dev/sdbиз учебника и скопировал информацию окна исходного раздела в Gedit.
- Обратите внимание, что в руководстве есть -uопция, однако для меня fdisk уже отображал блоки (желаемый вывод), поэтому включение этого переключателя дает неверную информацию.
4) Подключите и включите док-станцию ​​с SSD назначения 240G, который становится /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) перезагрузил винду и все вернулось на круги своя, но с большим количеством свободного места.


1
  1. Я искал " Диски " в меню приложений Ubuntu и открыл приложение утилиты Диски.
  2. Я выбрал раздел для копирования. Затем щелкнул значок настроек и выбрал « Создать образ диска ».
  3. Создание образа восстановления займет некоторое время .
  4. После завершения создания образа восстановления я щелкнул по разделу, на котором я хотел клонировать предыдущий раздел.
  5. Затем снова щелкните значок настроек , выберите « Восстановить образ диска » и выберите ранее созданный файл образа диска.
  6. Затем ждал, пока это закончится.

Я только что изучил приложение Disks, и все. Я ничего не установил.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.