GNU/Linux >> Linux の 問題 >  >> Linux

Linux から Windows パーティションをクローン

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

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

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

おそらく、ブータブルを割り当てる必要があります [System Reserved] パーティションにもフラグを立てます (最初にクローンを作成する必要があります) - cfdisk

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

更新 :

プロセス全体の重要な部分について言及するのを忘れていました。元のドライブからパーティション テーブルのクローンを作成し、Windows 関連の 2 つのパーティション以外をすべて削除するか、cfdisk で再作成する必要があります。 / 別れ 同じ サイズ。

以下にいくつかの例を示します (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 u s p (これは、cfdisk を使用して後でターゲットに複製するために、ソース ドライブの現在のパーティション テーブルとセクターのサイズを検査する方法です。 または別れ 自体)


見てください

  • 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);
}

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 を使用します Windowsの「Cドライブ」をコピーします。これを完了するには、ビールが数杯かかりました。
9) パーティションのサイズ変更には gparted を使用しました
10) Windows コンピューターに新しい SSD を再インストールすると、checkdisk が実行されます (チュートリアルを終了していて、彼がこれを行っていることに気づきませんでした)。
11) Windows を再起動すると、すべて正常に戻りましたが、空き容量が増えました。


Linux
  1. Linux ターミナルから Windows マシンをシャットダウンする

  2. パテを使用して Windows から Linux に scp する

  3. Windows から Linux にファイルをコピーする

  1. Linux で Windows パーティションのイメージを作成する

  2. Linux から exFAT パーティションを作成してフォーマットする

  3. Linux から Windows への RDP

  1. Windows10とMXLinuxをデュアルブートする方法

  2. Linux – GrubコマンドラインからWindowsパーティションを起動する方法は?

  3. Linux から Windows DLL を使用する