GNU/Linux >> Belajar Linux >  >> Linux

Kloning partisi Windows dari Linux

Anda perlu mengkloning 2 partisi dengan dd - salah satunya adalah tempat bootloader/bootmanager berada (diperlukan untuk melakukan chainload OS) [Cadangan Sistem , biasanya 100M] dan yang lainnya adalah instalasi W7 yang sebenarnya.

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

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

Anda mungkin perlu menetapkan bootable tandai juga ke partisi [System Reserved] (yang seharusnya menjadi yang pertama digandakan) - cfdisk dapat mencapai itu.

Jika gagal - cukup boot dari disk instalasi W7 dan ikuti panduan 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 terkait Windows ATAU membuatnya ulang dengan cfdisk / berpisah dengan sama ukuran.

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

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

dd if=/dev/sda bs=1 lewati=440 count=72 of=/dev/sdb seek=440 (ini juga akan menyalin ID disk yang terkadang dapat menyebabkan booting gagal jika hilang - namun, disk tersebut tidak akan dapat bekerja sama di lingkungan Windows, hingga ID diubah)

berpisah /dev/sda u s p (inilah cara Anda dapat memeriksa tabel partisi saat ini dan ukuran di sektor pada drive sumber untuk replikasi nanti pada target dengan cfdisk atau berpisah sendiri)


Lihat

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

IIRC, Trinity Rescue Kit berisi perangkat lunak yang diperlukan serta banyak lainnya (ssh, partimage, fdisk, fdisk, cfdisk, parted, gparted, testdisk, ntfsfix; pemasangan ntfs-3g, rsync dll. 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);
}

Cara mengkloning drive Windows ini bekerja dengan sangat baik untuk saya. Karena ini adalah pertama kalinya saya dapat mentransfer penginstalan Windows ke hard drive baru, saya akan membagikan prosedur saya di sini untuk membantu kunjungan Karyawan Google berikutnya.

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

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

Perangkat Keras:
Saya akan menyiapkan firewall NIC ganda, jadi saya memasang SSD sumber di komputer ini. SSD 240G tujuan masuk ke dok eksternal.

Proses:
1) Stik USB pertama yang saya ambil memiliki live CD Linux Mint, yang menjadi /dev/sda1
2) SSD 128G "Lama" terdeteksi dan menjadi /dev/sdb1 dan /dev/sdb2
3) Menggunakan # fdisk -l /dev/sdb dari tutorial dan salin informasi jendela partisi sumber ke Gedit.
-- Perhatikan, tutorial menyertakan -u opsi, namun bagi saya, fdisk sudah menampilkan blok (keluaran yang diinginkan) jadi memasukkan sakelar itu memberikan informasi yang salah.
4) Sambungkan dan hidupkan dok drive dengan SSD 240G tujuan, yang menjadi /dev/sdc .
5) Gunakan fdisk /dev/sdc untuk membuat partisi pada /dev/sdc yang sama persis dengan /dev/sdb , termasuk bendera boot dan sistem.
6) dd if=/dev/sdb of=/dev/sda bs=446 count=1 untuk menyalin MBR ke drive tujuan.
-- Panduan sekarang menyarankan penggunaan hdparm untuk mengaktifkan DMA, tetapi perintah itu gagal untuk saya
7) ntfsclone -O /dev/sdc1 /dev/sdb1 untuk menyalin partisi sistem tersembunyi windows.
-- -O atau --overwrite pilihan 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 perlu masuk ke jaringan.
8) Gunakan ntfsclone -O /dev/sdc2 /dev/sdb2 untuk menyalin windows "C Drive". Ini membutuhkan beberapa gelas bir untuk diselesaikan.
9) Untuk mengubah ukuran partisi, saya menggunakan gparted
10) Menginstal ulang SSD baru di komputer windows dan menjalankan checkdisk (saya telah meninggalkan tutorial &tidak menyadari dia melakukan ini).
11) Reboot Windows dan semuanya kembali normal tetapi dengan lebih banyak ruang kosong.


Linux
  1. Cara dual boot Windows 10 dan MX Linux

  2. Linux – Bagaimana Memulai Partisi Windows Dari Baris Perintah Grub?

  3. Buat drive USB Windows 10 (UEFI) yang dapat di-boot dari Linux

  1. Menggunakan Windows DLL dari Linux

  2. Matikan mesin Windows dari terminal linux

  3. Menggunakan putty untuk scp dari windows ke Linux

  1. salin file pscp dari jarak jauh dari Windows ke Linux

  2. menyalin file dari windows ke Linux

  3. Buat gambar partisi Windows di Linux