技术分享
dd命令 linux系统硬盘移植 linux系统备份
2020-05-05
现有linux系统,由硬盘sda运行,想将其整体拷贝至硬盘sdb,并由sdb启动系统,如何做?
两种方案,第一种方案tar命令压缩拷贝;第二种方案,linux dd命令直接拷贝。
1、第一种方案,tar压缩备份恢复
tar压缩备份后,在恢复时,需修改引导分区,修改GRUB,详见网址:
限于时间,本人未亲测第一方案,应该可行。
2、第二种方案,dd命令整盘复制
dd命令,无脑的按字节复制方式,不仅复制数据,而且复制分区和UUID等信息。具体操作如下。
在Linux上,一块硬盘或者一个分区都由一个目录表示,一般存在于系统根目录的/dev/之下。例如/dev/hda代表你的第一块IDE硬盘,/dev/sdb代表第二块SCSI硬盘,/dev/fd0代表系统的软盘驱动器等等。同样每块硬盘上的分区也有独特的目录名,例如/dev/hda1表示你第一块硬盘上的第一个分区(至于这个分区上有什么东西在进行备份操作的时候并不重要)。
2.1. 磁盘克隆
也就是把整个硬盘复制一份。当然你首先需要在计算机上在接上一块新硬盘,并让系统识别。例如这块硬盘可能被识别为/dev/sdb,原有硬盘叫/dev/sda.然后你可以在linux命令行上简单地执行:dd if=/dev/sda of=/dev/sdb
对就这么简单,此命令完成后,你的第二块硬盘上将有一个和第一块硬盘一模一样的副本,也是可以启动的。因为dd操作就是简单的按字节复制,什么分区表啊,MBR啊统统照搬。
当然你也可以做一些微调,来定制一下克隆操作。例如你可能希望把硬盘上的内容全部备份到一个磁盘文件中,而不是另一块新硬盘,你可以dd if=/dev/sda of=~/disk1.img
之后,disk1.img就是备份好的磁盘映像文件,你可以复制或转移到其他介质也可以压缩一下:gzip disk1.img #generates disk1.img.gz
或者在创建磁盘映像文件的同时就执行压缩:dd if=/dev/sda | gzip > disk.img.gz
dd if=/dev/sda | bzip2 > disk.img.bz2
不错吧!ghost的功能都有了。
2.2.分区克隆
如果我们不想克隆整块磁盘,只想把某些存放数据的分区备份一下,你会需要克隆一个分区。正如预备知识所述,分区在linux下也是一个文件。例如dd if=/dev/sda1 of=~/part1.img
将把第一块磁盘的第一个分区备份到名为part1.img的文件中。
也可以进行分区复制:dd if=/dev/hda1 of=/dev/hda3
将把分区一原样复制到分区3.
2.3. 从镜像文件恢复磁盘或分区
很简单,把上面命令中,of和if指向的文件名互换一下即可实现恢复。例如dd if=disk1.img of=/dev/sda
把保存在disk1.img中的映像恢复到第一块磁盘dd if=part1.img of=/dev/hda2
把保存在part1.img中的映像恢复到第一块硬盘的第二个分区
最后,需要注意一点是,无论备份还是恢复,都需要保证 of 指向的文件或磁盘空间要大于 if 指向的内容,因为是按字节复制如果没有足够的空间去存储内容,备份自然会失败。
注:该方案,如果备份硬盘大于原硬盘,由于分区表也被复制,会出现硬盘空间闲置或无法全部发现的问题,解决方案:首先,我使用命令sudo dd if=/dev/sda1 of=/dev/sdb1 然后运行sudo e2fsck -f /dev/sdb1 再 sudo resize2fs /dev/sdb1 然后成功挂载分区 过程完毕............只有3条命令。
3、查看复制进度
复制# dd if=/dev/sdb of=/dev/sdd
另开启一个终端,查询dd进程号
#ps -auxe | grep dd或
#ps -ef|grep dd
取得dd命令的进程号
#kill -USR1 dd进程号
记录了993665+0 的读入
记录了993665+0 的写出
508756480字节(509 MB)已复制,239.29 秒,2.1 MB/秒
4、问题解决
4.1、dd后硬盘分区挂载失败,bad option,bad superblock,bda fs
将最后一个分区重新分区,然后格式化,格式命令:mkfs.ext4 -T -c -L EPIPHAN_DATA /dev/sdb5

- 标签:
-
容灾备份