web-dev-qa-db-ja.com

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

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

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

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

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

12
Fault

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

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

クローンの構文は、wiki here にあります。適切な[〜#〜] mbr [〜#〜]も必要になります(おそらく既にに存在しています)試乗)。

bootableフラグも[System Reserved]パーティションに割り当てる必要があります(これは最初に複製されるはずです)-cfdiskはそれを実現できます。

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

[〜#〜]更新[〜#〜]

プロセス全体の中で、それほど明白ではないかもしれない重要な部分を1つ説明するのを忘れていました。元のドライブからパーティションテーブルのクローンを作成し、2つのWindows関連のパーティションを除くすべてを削除する必要がありますORcfdisk/partedsameサイズ。

以下にいくつかの例を示します(ただし、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自体)

7
XXL

見て

  • 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: [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);
}
4
sehe

この Windowsドライブのクローン作成の方法 は、私にとって見事に機能しました。 Windowsのインストールを新しいハードドライブに転送できたのは今回が初めてなので、次のGoogle社員がアクセスできるように手順をここで共有します。

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

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

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

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

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

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