Klon partisi Windows dari Linux

12

Jadi saya punya SSD Intel 120 GB, dengan partisi untuk Windows dan lainnya untuk Ubuntu. Ubuntu adalah OS utama saya, Windows untuk bermain game. Tapi sekarang saya sedang mencari untuk menginstal Mac OS X, dan saya ingin berada di SSD, jadi saya ingin memindahkan Windows ke drive yang berbeda (eksternal 160GB lama yang saya ambil dari cangkangnya dan telah menggunakan sebagai test drive. Saya menyimpan game saya di eksternal lain, jadi kinerja tidak akan terpengaruh, selain waktu start up).

Apa cara terbaik untuk melakukannya? Adakah alat yang bagus untuk mengkloning partisi? Saya bertanya ini karena Google menghasilkan banyak hasil pada kloning drive yang sebenarnya Anda gunakan / instal Ubuntu, daripada memberi tahu saya bagaimana mengkloning partisi yang sama sekali tidak terkait ke lokasi lain yang tidak terkait.

Oh, dan apakah partisi Windows yang baru akan membiarkan saya menjalankannya tanpa mengutak-atik pasca-klon sebelumnya? Informasi lain mengenai hal ini akan sangat dihargai.

(Saya melakukan ini karena saya perlu mendapatkan kaki saya di XCode, dan MacBook Pro saya perlahan-lahan sekarat).

Kesalahan
sumber
Nah, yang Anda butuhkan adalah cfdisk dan dd . Satu-satunya hal yang agak dipertanyakan adalah sektor boot. Versi Windows yang mana?
XXL
Windows 7. Saya ingat menginstalnya sebagai masalah besar, karena beberapa masalah terkait partisi.
Kesalahan
Apakah Anda memiliki disk W7 yang Anda inginkan?
XXL
Tidak sepenuhnya yakin di mana saya meletakkannya, tetapi saya bisa menggali jika perlu.
Kesalahan

Jawaban:

7

Anda harus mengkloning 2 partisi dengan dd - satu adalah tempat bootloader / bootmanager berada (diperlukan untuk membuat rantai memuat OS) [ System Reserved , biasanya 100M] dan yang lainnya adalah instalasi W7 yang sebenarnya.

Periksa tabel partisi dengan cfdisk - ini akan memberi Anda representasi visual. Kemudian hapus semua partisi pada drive target - cfdisk adalah teman Anda.

Sintaks untuk kloning dapat ditemukan di wiki di sini . Anda juga akan membutuhkan MBR yang tepat (mungkin sudah ada di drive test Anda ).

Anda mungkin perlu menetapkan flag yang dapat di - boot ke partisi [Cadangan Sistem] juga (yang seharusnya menjadi yang pertama dikloning) - cfdisk dapat mencapainya.

Jika gagal - cukup boot dari disk instalasi W7 dan ikuti pedoman di sini untuk Vista.

PEMBARUAN :

Lupa menyebutkan satu bagian penting dari keseluruhan proses yang mungkin tidak begitu jelas. Anda harus mengkloning tabel partisi dari drive asli dan menghapus semuanya kecuali 2 partisi yang berhubungan dengan Windows ATAU membuatnya kembali dengan cfdisk / berpisah dengan ukuran yang sama .

Berikut adalah beberapa contoh (dengan asumsi, bahwa sda adalah drive sumber Anda dan sdb adalah target):

dd jika = / dev / sda bs = 1 lewati = 446 count = 66 dari = / dev / sdb seek = 446 (ini akan secara efektif mengkloning tabel partisi DOS Anda saat ini bersama dengan tanda tangan MBR ke drive output)

dd jika = / dev / sda bs = 1 lewati = 440 count = 72 dari = / dev / sdb seek = 440 (ini juga akan menyalin ID disk yang kadang-kadang dapat menyebabkan boot gagal jika hilang - namun, disk seperti itu tidak akan dapat bekerja bersama di lingkungan Windows, hingga ID diubah)

parted / dev / sda usp (ini adalah bagaimana Anda dapat memeriksa tabel dan ukuran partisi saat ini di sektor-sektor pada drive sumber untuk replikasi nanti pada target dengan cfdisk atau berpisah sendiri)

XXL
sumber
Itu
menyebalkan
Mengapa? Jika ada masalah dengan proses boot - instantiating sesi prompt perintah dari disk instalasi W7 dan menjalankan bootrec / fixmbr , bootrec / fixboot atau bootrec / rebuildbcd harus dapat memperbaiki masalah tersebut.
XXL
cukup adil. Saya pernah gagal untuk saya di masa lalu. Saya yakin itu sebabnya saya tahu tentang utilitas untuk mencegah kecelakaan. Juga, menggunakan dd untuk mereplikasi partisi setidaknya tidak terlalu efisien
lihat
karena ia menggunakan salinan sektor per sektor dan akan menyalin ruang kosong di sistem file yang dialokasikan? Saya pikir, dalam konteks OPs, ini mungkin akan sama sekali tidak relevan. Kita bahkan tidak tahu apakah partisi itu penuh atau tidak, belum lagi dia peduli menunggu beberapa menit tambahan (keuntungan dalam waktu mungkin minimal) daripada mencoba solusi alternatif yang kurang jelas
XXL
tetapi memiliki keuntungan berbeda karena dapat menyalin ke partisi dengan ukuran berbeda. DD mengasumsikan tujuan ukurannya persis sama (meskipun, mungkin lebih besar ). Ini bisa menjadi masalah yang menghambat, terutama ketika SSD terlibat (mereka tidak memiliki kapasitas 'tidak terbatas' )
sehe
4

Lihatlah

  • ntfsclone (hanya menyalin sektor yang digunakan)
  • fixntfs.c untuk memperbaiki offset info boot

IIRC, Trinity Rescue Kit berisi perangkat lunak yang diperlukan dan juga banyak lainnya (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; pemasangan ntfs-3g, rsync dll.).

/*
 * fixntfs: change some attributes of an NTFS bootsector
 *
 * brought to you by Phoenix
 * url: www.grhack.gr/phoenix
 * mail: [email protected]
 * 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);
}
lihat
sumber
2

Ini bagaimana-untuk untuk kloning drive Windows bekerja baik sekali untuk saya. Karena ini adalah pertama kalinya saya dapat mentransfer instalasi Windows ke hard drive baru, saya akan membagikan prosedur saya di sini untuk membantu Googler berikutnya untuk mengunjungi.

Situasi saya:
Manajer Windows 7 x64 telah memaksimalkan 128G SSD-nya, jadi saya membeli pengganti 240 GB.

Masalah:
Saya memiliki dua dok drive SATA tetapi linux tidak mengenali keduanya secara bersamaan, sehingga mencegah penyalinan yang mudah di antara mereka.

Perangkat Keras:
Saya akan mengatur firewall NIC ganda, jadi saya menginstal SSD sumber di komputer ini. SSD tujuan 240G masuk ke dermaga eksternal.

Proses:
1) USB stick pertama yang saya ambil memiliki live Linux Mint di atasnya, yang menjadi /dev/sda1
2) "Lama" 128G SSD terdeteksi dan menjadi /dev/sdb1dan /dev/sdb2
3) Digunakan # fdisk -l /dev/sdbdari tutorial dan menyalin informasi jendela partisi sumber ke Gedit.
- Catatan, tutorial menyertakan -uopsi, namun bagi saya, fdisk sudah menampilkan blok (output yang diinginkan) jadi termasuk sakelar yang memberikan informasi yang salah.
4) Sambungkan dan nyalakan dok drive dengan tujuan 240G SSD, yang menjadi /dev/sdc.
5) Gunakan fdisk /dev/sdcuntuk membuat partisi /dev/sdcyang benar-benar cocok /dev/sdb, termasuk boot dan flag sistem.
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1untuk menyalin MBR ke drive tujuan.
- Panduan sekarang menyarankan untuk menggunakanhdparmuntuk mengaktifkan DMA, tetapi perintah gagal bagi saya
7) ntfsclone -O /dev/sdc1 /dev/sdb1untuk menyalin partisi sistem windows tersembunyi.
- -Oatau --overwriteopsi digunakan untuk mengatur tujuan, membuat perintah muncul mundur. Kudos to Linux Mint live CD memiliki ntfsclone, karena saya belum pernah mendengar perintah ini sebelumnya & saya tidak harus masuk ke jaringan.
8) Gunakan ntfsclone -O /dev/sdc2 /dev/sdb2untuk menyalin windows "Drive C". Butuh beberapa gelas bir untuk menyelesaikannya.
9) Untuk mengubah ukuran partisi, saya menggunakan gparted
10) Instal ulang SSD baru di komputer windows dan menjalankan checkdisk (saya telah meninggalkan tutorial & tidak melihat dia melakukan ini).
11) Rebooted Windows dan semuanya kembali normal tetapi dengan lebih banyak ruang kosong.

Chris K
sumber
1
  1. Saya mencari " Disk " di menu aplikasi Ubuntu dan membuka aplikasi utilitas Disk.
  2. Saya memilih partisi untuk disalin. Kemudian klik ikon pengaturan dan pilih " Buat Disk Gambar ".
  3. Butuh beberapa saat untuk menghasilkan gambar pemulihan .
  4. Setelah selesai menghasilkan gambar pemulihan, saya mengklik partisi tempat saya ingin mengkloning partisi sebelumnya.
  5. Kemudian klik ikon pengaturan lagi, dan pilih " Restore Disk Image " dan pilih file gambar disk yang dibuat sebelumnya.
  6. Kemudian menunggu sampai selesai.

Saya baru saja menjelajahi aplikasi utilitas Disk, dan hanya itu. Saya tidak menginstal apa pun.

Niño Angelo Orlanes Lapura
sumber