LinuxからWindowsパーティションを複製する


12

だから私は120 GBのIntel SSDを手に入れました。Windows用とUbuntu用のパーティションがあります。Ubuntuは私の主なOSで、Windowsはゲーム用です。しかし、今私はMac OS Xをインストールしたいと思っており、それをSSDに置きたいので、Windowsを別のドライブに移動しようとしています(シェルから取り出した古い160GBの外部ドライブで、テストドライブとして使用しています。私はとにかくゲームを別の外部に置いているので、起動時間以外はパフォーマンスに影響を与えません。

これに対処する最良の方法は何ですか?パーティションのクローンに適したツールはありますか?まったく関係のないパーティションを別の関係のない場所にクローンする方法を教えるのではなく、実際に使用しているドライブやUbuntuがインストールされているドライブのクローンについて、Googleは多くの結果を出しています。

ああ、新しいWindowsパーティションでは、クローン後の微調整なしで実行できますか?これに関するその他の情報をいただければ幸いです。

(私はXCodeで足を取得する必要があるため、これを行っています。MacBookProはゆっくりと死んでいきます)。


まあ、必要なのはcfdiskddだけです。やや疑わしいのは、ブートセクターだけです。どのバージョンのWindowsですか?
XXL、2011年

Windows7。パーティションに関連する問題があるため、インストールは非常に苦痛でした。
障害

W7ディスクはありますか?
XXL

どこに配置したかは完全にはわかりませんが、必要に応じて掘り下げることができます。
障害

回答:


7

ddを使用して 2つのパーティションのクローンを作成する必要があります。1つはブートローダー/ブートマネージャーが存在する場所(OSをチェーンロードするために必要)[ システム予約、通常100M]で、もう1つは実際のW7インストールです。

cfdiskでパーティションテーブルを確認します。視覚的に表示されます。次に、ターゲットドライブのすべてのパーティションを削除します-cfdiskはあなたの友達です。

クローンの構文は、wikiのこちらにあります。また、適切なMBRも必要です(おそらく、テストドライブに既に存在しています)。

おそらく、[System Reserved]パーティションにもブート可能なフラグを割り当てる必要があります(これは最初にクローンを作成する必要があります-cfdiskはそれを実現できます。

W7のインストールディスクから簡単に起動し、ガイドラインに従ってください-それが失敗した場合は、ここで Vistaの。

更新

プロセス全体の中でそれほど明白ではないかもしれない重要な部分について言及するのを忘れていました。元のドライブからパーティションテーブルのクローンを作成し、Windows関連の2つのパーティション以外をすべて削除するか、同じサイズの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(これにより、ディスクIDもコピーされ、見つからない場合に起動に失敗することがあります-ただし、そのようなディスクはIDが変更されるまで、Windows環境で一緒に作業できます)

parted / dev / sda usp(これは、現在のパーティションテーブルとソースドライブのセクターサイズを検査して、cfdiskまたはparted自体を使用してターゲットで後でレプリケーションするための方法です)


それは
面倒で

どうして?ブートプロセスに問題がある場合-W7インストールディスクからコマンドプロンプトセッションをインスタンス化してbootrec / fixmbrを実行すると、bootrec / fixbootまたはbootrec / rebuildbcdで問題を解決できるはずです。
XXL

けっこうだ。私は過去に失敗しました。私が事故を防ぐためにutilsを見つけたのはそのためだと確信しています。また、ddを使用してパーティションを複製することは、少なくともあまり効率的ではありません
sehe

それはセクターごとのコピーを使用し、割り当てられたファイルシステムの空のスペースにコピーするためですか?OPのコンテキストでは、これはおそらくまったく無関係です。あまり明確でない代替ソリューションを試す代わりに、パーティションがいっぱいであるかどうかさえわからず、数分待っていることを気にかけている(時間の増加は最小限かもしれません)
XXL

ただし、異なるサイズのパーティションにコピーできるという明確な利点があります。DDは、宛先がまったく同じサイズであると想定します(ただし、それより大きい場合もあります)。これは、特にSSDが関係している場合(容量が「無制限」ではない場合)の妨げになる可能性があります
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のインストールを新しいハードドライブに転送できたのは今回が初めてなので、次のGoogle社員がアクセスできるように手順をここで共有します。

私の状況:
マネージャーのWindows 7 x64は128G SSDを使い果たしたため、240 GBの交換品を購入しました。

問題:
2つのSATAドライブドックがありますが、Linuxは両方を同時に認識できなかったため、それらの間で簡単にコピーできませんでした。

ハードウェア:
デュアルNICファイアウォールをセットアップしようとしているので、このコンピューターにソースSSDをインストールしました。宛先240G SSDが外部ドックに入りました。

プロセス:
1)最初のUSBスティック私が拾うとなったことでLinuxのミントのライブCD、持っていた/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=1MBRを宛先ドライブにコピーします。
-ガイドは現在、hdparmDMAをオンにしますが、コマンドが失敗しました
7)ntfsclone -O /dev/sdc1 /dev/sdb1Windows非表示のシステムパーティションをコピーします。
- -Oまたは--overwriteオプションを使用して宛先を設定し、コマンドを逆に表示します。ntfscloneを含むLinux MintライブCDへの称賛。これまでこのコマンドについて聞いたことがないため、ネットワークに接続する必要がありませんでした。
8)ntfsclone -O /dev/sdc2 /dev/sdb2ウィンドウ「Cドライブ」をコピーするために使用します。これは、ビールを数杯かけて完成させました。
9)パーティションのサイズを変更するために、gparted
10)を使用しました。Windowsコンピューターに新しいSSDを再インストールし、checkdiskを実行しました(チュートリアルを終了したので、彼がこれを実行していることに気付きませんでした)。
11)Windowsを再起動すると、すべてが通常の状態に戻りますが、空き容量が増えます。


1
  1. Ubuntuのアプリケーションメニューで「ディスク」を検索し、ディスクユーティリティアプリを開きました。
  2. コピーするパーティションを選択しました。次に、設定アイコンをクリックし、 「ディスクイメージの作成」を選択しました。
  3. リカバリイメージの生成にはしばらく時間がかかります
  4. リカバリイメージの生成が完了したら、以前のパーティションのクローンを作成たいパーティションをクリックしました。
  5. 次に、設定アイコンを再度クリックし、「ディスクイメージの復元」を選択して、以前に生成されたディスクイメージファイルを選択しました。
  6. それが終わるのを待ちました。

Disksユーティリティアプリを調べたところ、これで終わりです。 何もインストールしていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.