8

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

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

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

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

4 ответа4

3

Вам нужно будет клонировать 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, пока ID не изменится)

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

3

Посмотри на

  • 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 в менеджере максимально использовала твердотельный накопитель 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". Это заняло несколько сортов пива, чтобы завершить.
9) Для изменения размера раздела я использовал gparted
10) Переустановил новый SSD в компьютер с Windows, и он запускает checkdisk (я оставил учебник и не заметил, что он делает это).
11) перезагрузил винду и все возвращается в нормальное состояние, но с большим количеством свободного места.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .