![从 Linux 克隆 Windows 分区](https://linux22.com/image/1293276/%E4%BB%8E%20Linux%20%E5%85%8B%E9%9A%86%20Windows%20%E5%88%86%E5%8C%BA.png)
所以我有一个 120 GB 的 Intel SSD,其中一个分区用于 Windows,另一个分区用于 Ubuntu。Ubuntu 是我的主要操作系统,Windows 用于游戏。但现在我想安装 Mac OS X,我想将它安装在 SSD 上,所以我想将 Windows 移到另一个驱动器上(旧的 160GB 外置驱动器,我从外壳中取出并一直用作测试驱动器。无论如何,我将游戏放在另一个外置驱动器上,因此除了启动时间之外,性能不会受到影响)。
最好的解决方法是什么?有什么好的工具可以克隆分区吗?我之所以问这个问题,是因为 Google 给出的搜索结果很多都是关于克隆你实际使用/安装了 Ubuntu 的驱动器,而不是告诉我如何将完全不相关的分区克隆到另一个不相关的位置。
哦,新的 Windows 分区是否允许我在不进行任何克隆后调整的情况下运行它?如果您能提供与此相关的任何其他信息,我将不胜感激。
(我这样做是因为我需要使用 XCode,而我的 MacBook Pro 正在慢慢报废)。
答案1
你需要克隆 2 个分区日- 一个是引导加载程序/引导管理器所在的位置(需要链式加载操作系统)[系统保留,通常为100M],另一个是实际的W7安装。
使用以下方法检查分区表磁盘管理- 它会给你一个直观的表示。然后删除目标驱动器上的所有分区 -磁盘管理是你的朋友。
克隆的语法可以在 wiki 上找到这里。你还需要一个合适的膜生物反应器(它可能已经存在于你的试驾)。
您可能需要指定一个可启动标志也添加到 [系统保留] 分区(这应该是第一个克隆的)-磁盘管理就能做到这一点。
如果失败 - 只需从 W7 安装光盘启动并按照指南操作即可这里适用于 Vista。
更新:
忘记提到整个过程中一个可能不太明显的重要部分。您要么必须从原始驱动器克隆分区表并删除除 2 个 Windows 相关分区之外的所有内容,要么使用以下方法重新创建它们磁盘管理/分开与相同的尺寸。
以下是几个例子(假设星展银行是你的源驱动器,安全数据库是目标):
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(这是你如何检查源驱动器上的当前分区表和扇区大小,以便稍后在目标上进行复制的方法,磁盘管理或者分开本身)
答案2
看一下
- ntfsclone(仅复制正在使用的扇区)
- 修复ntfs文件修复启动信息偏移
若我没记错的话,三位一体救援工具包包含必要的软件以及许多其他软件(ssh、partimage、fdisk、fdisk、cfdisk、parted、gparted、testdisk、ntfsfix;ntfs-3g mount、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(§ors, 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(§ors, 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);
}
答案3
这如何克隆 Windows 驱动器对我来说效果非常好。由于这是我第一次将 Windows 安装转移到新硬盘上,我将在此分享我的操作过程,以帮助下一位来访的 Google 员工。
我的情况:
经理的 Windows 7 x64 已经用完了其 128G SSD,因此我购买了一个 240 GB 的替代品。
问题:
我有两个SATA 驱动器底座但是 Linux 不能同时识别这两者,从而阻止在它们之间轻松进行复制。
硬件:
我即将设置双网卡防火墙,因此我将源 SSD 安装在这台计算机上。目标 240G SSD 进入外部基座。
过程:
1) 我拿起的第一个 USB 记忆棒上装有 Linux Mint Live CD,后来变成了/dev/sda1
2) 检测到“旧”128G SSD 并变成/dev/sdb1
3 /dev/sdb2
)# 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
选项用于设置目标,使命令反向显示。Linux Mint live CD 有 ntfsclone,这真是太好了,因为我之前没有听说过这个命令,而且我不需要上网。
8) 使用ntfsclone -O /dev/sdc2 /dev/sdb2复制 Windows“C 盘”。这需要喝几杯啤酒才能完成。9
) 为了调整分区大小,我使用了gparted
10) 在 Windows 计算机中重新安装了新的 SSD,并运行 checkdisk(我离开了教程,没有注意到他这样做)。11
) 重新启动 Windows,一切恢复正常,但有更多的可用空间。