Linux磁盘克隆方法

最近公司的一台 CentOS 服务器需要克隆一下,以便在另一台服务器或者虚拟机上运行,因此,研究了一下Linux的磁盘克隆方法。

基本常识

UEFI 与 BIOS 区别

UEFI引导与BIOS引导在结构上的区别:

  • BIOS引导的结构相对简单,由3个部分组成:BIOS程序、MBR(主引导记录)和操作系统引导程序。其中BIOS程序是由计算机制造商预装在ROM芯片中的,MBR是位于磁盘的名列前茅个扇区,用于存储操作系统引导程序的位置信息,操作系统引导程序则是由用户安装的操作系统自带的。

  • UEFI引导的结构相对复杂,由多个部分组成:UEFI固件、GPT(GUID分区表)、EFI系统分区、操作系统引导程序。其中UEFI固件是由计算机制造商预装在主板上的,GPT是磁盘分区表,EFI系统分区是用于存储操作系统引导程序和其他UEFI应用程序的特殊分区,操作系统引导程序则是由用户安装的操作系统自带的。

MBR (Master Boot Record,主引导记录)

主引导扇区是硬盘的第一扇区。它由三个部分组成,主引导记录MBR、硬盘分区表DPT和硬盘有效标志。在总共512字节的主引导扇区里MBR占446个字节,偏移地址0000H–0088H),它负责从活动分区中装载,并运行系统引导程序;第二部分是Partition table区(DPT分区表),占64个字节;第三部分是Magic number,占2个字节。

GPT 分区格式

GPT分区格式包含传统MBR(主引导记录)、分区表头、分区表、备份分区表头、备份分区表以及数据区。

使用工具

  • fdisk, 查看磁盘分区情况,或者用于磁盘分区,注意 fdisk 只支持 MBR 分区格式,只支持 2T 以下的磁盘

  • lsblk, 查看磁盘分区情况

  • blkid, 获取分区 UUID ,用于编辑 /etc/fstab 永久挂在分区

  • parted, 查看磁盘分区情况,或者用于磁盘分区,支持 MBR 或者 GPT 分区格式,支持 2T 以上的磁盘

  • mkfs.ext4, 用于分区后的磁盘文件系统格式化

  • mount, 挂载磁盘分区

  • dd, 磁盘克隆的工具

1
2
3
# 读取硬盘的mbr扇区
dd if=/dev/sdb of=mbr.bin bs=512 count=1 | hexdump
dd if=/dev/sdb of=mbr.bin bs=1 count=512 | hexdump

以上命令的使用方法请参考:

解决方案

目标磁盘大于原磁盘

需要磁盘克隆的服务器,其硬盘有4T大小,但只使用了不到512G,用于克隆的目标磁盘同样有4T大小。因此考虑先生成原磁盘的镜像文件,再向目标磁盘克隆。具体步骤如下:

  • 挂载目标磁盘,GPT分区,并ext4格式化。
  • 生成原磁盘的镜像文件
1
2
# /media/nvme1n1 为目标磁盘挂载目录
dd if=/dev/nvme0n1 status=progress bs=32M | gzip -c -9 > /media/nvme1n1/nvme0n1.dd.gz
  • 将生成的原磁盘镜像文件复制到原磁盘的 root 目录
1
mv /media/nvme1n1/nvme0n1.dd.gz /root
  • 使用原磁盘的镜像文件克隆磁盘
1
gzip -dc /root/nvme0n1.dd.gz | dd of=/dev/nvme1n1

目标磁盘小于原磁盘

如果目标磁盘小于原磁盘,就不能简单的使用dd命令进行全盘克隆了。好在原磁盘实际使用的空间不大,因此,采用的步骤如下:

  • 在目标磁盘安装同样的CentOS操作系统
  • 使用 dd 命令克隆 root 分区

对于 home 分区,应根据不同情况不同处理:

  • 如果 home 分区文件系统占有空间相对较小,可使用 tar 命令压缩 home 分区的文件,然后解压到目标磁盘的 home 分区,并更改 home 分区文件夹的所有者。
  • 如果 home 分区文件系统占用空间相对很大,那干脆用 dd 命令克隆 home 分区更省事。
  • 如果 home 分区为 ext 文件系统,可考虑使用 resize2f 缩小文件系统,在缩小文件系统后,在使用 fdsik 或者 parted 缩小 home 分区大小,没有问题后,考虑使用 dd 命令克隆 home 分区。
  • 如果 home 分区为 xfs 文件系统,由于 xfs 文件系统不支持缩小,可以考虑使用 xfsdump 备份,等缩小 home 分区后,使用 xfsrestore 还原 home 分区。

参考链接

  1. linux下使用fdisk进行磁盘分区详解,by 人生的哲理.
  2. fdisk 管理磁盘分区,by gnu.
  3. UEFI是什么意思?UEFI和BIOS的区别是什么?,by 小橙7.
  4. UEFI是什么?与BIOS的区别在哪?,by 平凡而伟大(心之所向).
  5. 装机、做系统必备:秒懂MBR和GPT分区表,by 张伟.
  6. GPT 磁盘分区格式简介及解析示例,by 一柯.
  7. GUID Partition Table (GPT) Disk Layout,by uefi.
  8. Linux下使用dd命令备份硬盘,by zuyunfei.
  9. How to gzip and keep original file on Unix or Linux command line,by Vivek Gite .
  10. BIOS 与 UEFI 引导流程,by LARRY1024.
  11. LVM原理与实现,by 戴思达.
  12. CentOS 7 调整 XFS 格式的 LVM 分区大小,by Tom Ma.
  13. CentOS 8 逻辑卷管理LVM详解(扩容、快照等),by 把倒立的世界腾空.
  14. resize2fs 缩小根分区 linux缩小根分区大小,by 编程小匠人.
  15. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统],by 散尽浮华.
  16. Linux无损调整分区大小,by anuoua.
  17. 无损扩容Linux磁盘分区容量,by orchidflower.