original in en Gerrit Renker
en to zh_CN 汪 君
下面描述的所有方法都是建立在网络连接的基础上,即,需要在“源”电脑(就是那台有数据要被复制的电脑)和“目标”电脑(就是需要数据的那台电脑)之间有网络连接。可以直接通过集线器连接,或者通过特殊连接线(crossover cable)将 两张网卡连接起来(注意:一般的网线是不行的)。 对目标电脑来说,需要一张Live-CD(如Knoppix 或 LNX-BBC)或一个最小安装,以保证可对网卡进行操作而且使ssh 和/或 netcat能用。甚至有的软盘上的系统(就像我用tomsrtb也能很好工作),而且如果你想安装另一个全新的发行版,这是一个很不错的选择。两台电脑的IP 要在同一个网段,以便他们能相互进行“会话”,如上图。
通过基本的准备,有几种方法来进行复制:
ssh-keygen -t rsa为简便起见,不要输入密码。公钥就会保存在/root/.ssh/id_rsa.pub文件里。复制此文件到源电脑上
scp /root/.ssh/id_rsa SourcePC:/tmp在此 SourcePC 是你源电脑的IP 地址,当提示你是否确认时,输入完整的“yes”(单独的“y” 有时会不行)。在源电脑上你还会被要求输入root 的密码。现在把目标电脑加入你源电脑的可信任网络节点里去
cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys为检查是否成功完成,重复上面的复制命令,应该不会再要求你输入密码了!
通常第一步都是对你的硬盘分区,然后创建ext2/ext3文件系统。 ext3 的需要在mke2fs 命令里加一个-j (journalling)的选项(需要内核对ext3的支持)。你甚至可以将ext2的分区转化为 ext3的, 参见tune2fs(8)。 假设我们的源电脑上有如下的分区:
Filesystem | Size | Used | Use% | Mounted on |
---|---|---|---|---|
/dev/hda3 | 2.7G | 552M | 22% | / |
/dev/hda5 | 7.8G |
1.6G | 22% | /usr |
/dev/hda7 | 6.3G | 1.7G | 28% | /usr/share |
/dev/hda8 | 3.4G | 601M | 19% | /home |
/dev/hda12 | 5.3G | 1.9G | 37% | /opt |
/dev/hda1 | 587M | 70M | 13% |
/var/backup |
我推荐大家一定要做一些分区,否则,文件系统的错误使用或者硬盘磁道的一点损坏就会完全破坏掉你所有的数据。而且根据Murphy 定律,在事先没有做好硬盘分区而是直接使用整块硬盘的时候,这通常就会发生。我最近就遇到过这样的情况,如果事先没有做好分区的话,就会由于主分区的一点问题而丢失掉我的所有数据。上面的文件表明/usr 分区增长的太大了,所以/usr/share必须被加入。是该换一个大点的硬盘的时候了。
在目标电脑上,使用parted (推荐) 或者你喜爱的分区工具(Qtparted 是一个很好的图形界面的工具,据说是Partition Magic 克隆版)。创建的分区不能比源电脑上对应的分区小。另外,别忘了 swap 分区。保存好分区表,在刚创建的分区上创建文件系统,可以使用mke2fs -j -L <label> /dev/xxx这里 xxx 是你的分区名,然后用<label>设置卷标号。我经常使用如 “/usr”一类的作为卷标。你也可以通过tune2fs(8)来设置各种任务,比如周期性的文件系统检查。
mount /dev/xxx /mnt在复制的时候,转到目标目录里面去是很必要的
cd /mnt在目标电脑上键入
ssh sourcePC 'dump -0 -f - /' | restore -r -f -这里 targetPC 是你目标电脑的 IP 地址。参数“-0” 表示完全备份,“-f -”表示使用stdin/stdout做为文件描述符,而“-r”意思是指示 restore 去重新创建通过网络传送的文件系统到目标电脑上去。更多内容请参考dump(8) 和 restore(8)。 下面你看到的是传送主文件系统的输出。
$ ssh 10.42.3.42 'dump -0 -f - /' | restore -r -f - DUMP: Date of this level 0 dump: Tue Feb 22 15:50:12 2005 DUMP: Dumping /dev/hda3 (/) to standard output DUMP: Label: debian DUMP: Writing 10 Kilobyte records DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 547312 blocks. DUMP: Volume 1 started with block 1 at: Tue Feb 22 15:50:14 2005 DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: Volume 1 completed at: Tue Feb 22 15:51:43 2005 DUMP: Volume 1 546590 blocks (533.78MB) DUMP: Volume 1 took 0:01:29 DUMP: Volume 1 transfer rate: 6141 kB/s DUMP: 546590 blocks (533.78MB) DUMP: finished in 89 seconds, throughput 6141 kBytes/sec DUMP: Date of this level 0 dump: Tue Feb 22 15:50:12 2005 DUMP: Date this dump completed: Tue Feb 22 15:51:43 2005 DUMP: Average transfer rate: 6141 kB/s DUMP: DUMP IS DONERestore 通常会创建一个名叫 restoresymtable的文件,如果你确信在文件系统重建过程中没有错误发生,你可以将这个文件删掉。 完成主文件系统的复制,下面我们依次完成其他子分区的复制。从 /usr开始吧(假定你现在的工作目录是未来的主文件系统)。
mount /dev/xxx ./usr cd ./usr ssh targetPC 'dump -0 -f - /usr' | restore -r -f -这个 mount-cd-dump/restore 循环现在可以对你的所有目录重复进行操作。上面提到的对 /usr/share(在源电脑上是个独立的分区)的处理, 可以简单的通过切换目录到 ./usr/share (注意这个“.”),然后简单的重复
ssh targetPC 'dump -0 -f - /usr/share' | restore -r -f -在目标文件系统有你要 restore 的文件时,Restore 会报错。通过 ssh 复制一整台电脑的数据会花费大概一个小时和100MB 网卡(也许还要特殊数据线crossover cable)。
注意: 转储文件系统时,并不需要加载,你可以仅仅通过给定 分区名, 如 /dev/hda6,而非加载后的目录名。
另一个种方法不使用 ssh,而使用 netcat(1), netcat 简称 nc. Netcat 是一把非常简单易用的基于 TCP/IP 协议(C/S模型的)的“瑞士军刀”,它能允许我们通过网络创建管道(pipe)。上面的例子只需像下面一样改一点点东西就可以用了。我们假设加载在 /var/backup 上的分区是我们要通过dump/restore 来传送的。
在接收端(目标电脑),创建一个 netcat 的监听例程(-l),这个监听例程将管道输出到 restore。nc -l -p 2000 -q 1 | restore -r -f -在 源电脑, 创建另一个 netcat 的例程,这个例程将它从管道里得到的输入发给目标电脑,这里 target-IP 是目标电脑的 IP 地址。
dump -0 -f - /var/backup | nc <target-ip> 2000-q 选项是让 nc 在到达文件结束(EOF)时停止运行,但我是手动结束 nc 的。不过,仍然建议大家使用ssh 。
grub> root (hd0,xxx) ... filesystem is ... grub> setup (hd0) ... lots of output here grub> quit或运行 grub-install /dev/xxx 其中 xxx 是你的硬盘。在此,检查你的root (hdn,xx) ,并加上 root=/dev/xxx 的设置。
可能的情况是,你现在复制好的电脑有了一些更好的硬件,因此可能需要修改你 内核的配置 。如果你的系统有很多预先配置的好的模块(如 RedHat, SuSe, Mandrake, Fedora ...) ,那么很可能已经有了合适的模块(module)了。否则, lspci -vv 并自己重新编译内核。如果你的显卡不同了,更新 /etc/X11/XF86Config-4(或者在 RH/Fedora 中xorg.conf )。如果可能,启动到运行级别 3 并使用工具来配置你的 X。在 debian 里,一些调查是必要的,我就很幸运的发现我的驱动从r128 变为了radeon。
这篇文章讲解了克隆 ext2/ext3 文件系统的全过程。很多类似的命令可以在很多其他的 *nix 系统上,诸如 FreeBSD, HP-UX, IRIX 等也提供 dump/restore 这些命令; 在 Solaris 中,这被称作 ufsdump/ufsrestore。当然也有的文件系统不提供 dump 功能,例如 ReiserFS,这种情况就最好使用 rsync了。关于使用 rsync 成功复制Linux 系统的问题,参见 [1]。