Клоніруйте розділ Windows з Linux


13

Отже, у мене є 120 ГБ Intel SSD, з розділом для 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 - один, де завантажувач / bootmanager проживає (необхідний для завантаження ОС) [ System Reserved , як правило, 100M], а інший є фактичною установкою W7.

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

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

Ймовірно, вам потрібно буде призначити завантажувальний прапор розділу [System Reserved] (який повинен бути першим клонованим) - cfdisk може це зробити.

Якщо це не вдається - просто завантажтеся з інсталяційного диску W7 і дотримуйтесь тут інструкцій для Vista.

ОНОВЛЕННЯ :

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

Ось кілька прикладів (якщо припустити, що sda - це ваш джерело, а sdb - ціль):

dd, якщо = / dev / sda bs = 1 пропуск = 446 count = 66 of = / dev / sdb search = 446 (це ефективно клонує вашу поточну таблицю розділів DOS разом із підписом MBR на вихідний диск)

dd, якщо = / dev / sda bs = 1 пропуск = 440 count = 72 of = / dev / sdb search = 440 (це також скопіює ідентифікатор диска, який іноді може призвести до невдалого завантаження, якщо він відсутній - однак, такі диски не будуть мати можливість працювати разом у середовищі Windows, поки не буде змінено ідентифікатор)

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


Це біль і зазвичай не завантажується
sehe

Чому? Якщо виникає проблема з процесом завантаження - екземпляр сеансу командного рядка з диска встановлення W7 та виконання bootrec / fixmbr , bootrec / fixboot або bootrec / rebuildbcd повинні мати змогу виправити проблему.
XXL

справедливо. У мене це було невдало для мене в минулому. Я впевнений, що тому я дізнався про утиліти, щоб запобігти випадковістю. Крім того , з допомогою дд повторити розділ, по крайней мере , не дуже ефективно
sehe

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

але це явна перевага - можливість копіювати в розділ різного розміру. DD передбачає, що адресат точно такого ж розміру (хоча він може бути більшим ). Це може бути проблемою , що перешкоджає, особливо коли твердотільні накопичувачі беруть участь (вони не мають «необмежений» потужності)
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 на новий жорсткий диск, я поділюсь тут своєю процедурою, щоб допомогти наступному Googler відвідати.

Моя ситуація:
менеджер Windows 7 x64 склав 128G SSD, тому я купив заміну 240 ГБ.

Проблема: У
мене є два док-накопичувачі SATA, але Linux не розпізнавав обидва одночасно, що запобігає легкій копії між ними.

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

Процес:
1) Перший USB-накопичувач, який я взяв, мав на ньому живий компакт-диск Linux Mint, який став /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параметр використовується для встановлення призначення, завдяки чому команда відображається назад. Kudos на Linux Mint Live CD, що має ntfsclone, оскільки я не чув про цю команду раніше, і мені не довелося потрапляти в мережу.
8) Використовуйте ntfsclone -O /dev/sdc2 /dev/sdb2для копіювання вікон "C Drive". На це пішло кілька сортів пива.
9) Для зміни розміру розділу я використав gparted
10) Переустановив новий SSD на комп'ютері з Windows, і він запускає контрольний диск (я покинув підручник і не помітив, що він це робить).
11) Перезавантажили Windows, і все повернеться до звичайного, але з більшою кількістю вільного місця.


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

Я щойно вивчив утиліту програми Disks, і все. Я нічого не встановлював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.