使用dd命令转移系统和数据到新的硬盘

服务器已经经历过一次8G电子盘升级16G电子盘了,当时数据比较简单,索性直接重新安装的系统。这次16G的硬盘空间被占满了,同样重装系统后却发现配置的网址竟然不能访问。 经过两天的尝试后仍然没有解决,决定放弃重新配置,改成直接把原来硬盘上的数据复制到新的硬盘上。这时就接触到了linux的dd命令,然后把转移过程记录在这里。
最终目的:将16G的原数据转移到新的64G硬盘,并且将16G以外的空间分配到根目录。

一、准备工作

准备的材料:
①64G容量的新固态硬盘(实际上是咸鱼上买的二手固态,嘘~)
注意:下面是比较安全的准备材料,但是本人并没有这么做。所以对不安全情况下造成的数据损失不负任何责任。
安全的准备材料:
①正常功能的linux机器(或者安装在U盘中的linux系统)
②要转移数据的旧硬盘
③用来容纳数据的新硬盘(容量要求大于或者等于旧硬盘的容量)
然后使用任意系统将新的固态硬盘的所有分区删除,把新固态硬盘还原成还未分区的状态。在windows10上是: “此电脑右键” --> “管理” --> “磁盘管理” --> “在蓝条下的白色区域右键” --> “删除卷”。
介绍dd命令
dd命令的基本格式:
															dd if=/dev/sda of=/dev/sdb
															#dd if=代表旧硬盘的目录 of=代表新硬盘的目录
															#意义是:把数据从/dev/sda复制到/dev/sdb(这种复制十分的彻底,连硬盘的分区和UUID都可以复制)
														

二、使用dd命令

本人是直接将新的硬盘连接到了正在运行旧硬盘上的系统的设备上。也就是直接把新硬盘插在了旧硬盘的机器上。然后打开命令行界面。(不推荐)
安全的操作:(避免复制正在运行的系统导致意外的错误)
①将两块硬盘接入到正常的linux设备,然后重启设备。这时两块硬盘应该被自动临时挂载到了默认位置。
②进入正常linux设备的命令行界面
然后在命令行输入命令:
															#输入:
															lsblk #列出所有块设备
															#系统返回:
															NAME                       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
															sdb                          8:16   1 55.9G  0 disk
															sda                          8:32   0 14.8G  0 disk 
															├─sda1                       8:33   0    1G  0 part /boot
															└─sda2                       8:34   0 13.8G  0 part 
															  ├─centos_liusserver-root 253:0    0 12.3G  0 lvm  /
															  └─centos_liusserver-swap 253:1    0  1.5G  0 lvm  [SWAP]
															#可以从容量看出sda共14.8g,是提到的16g容量的旧硬盘。sdb是55.9G,是64G的新硬盘。
															
															#接下来使用dd命令转移数据
															dd if=/dev/sda of=/dev/sdb
															#其中的sda和sdb是根据上一步lsblk命令返回的信息决定的。前一个为新硬盘,后一个是旧硬盘。不同的系统分配给的名称不同,需要具体问题具体分析。
															#其实dd命令有一些参数,这里不加任何参数,比较简单,由命令自行处理。
															
															#之后等待一段时间,直到dd命令执行完毕。等待的时间和数据量成正比,基本上以小时为单位等待。
															#dd命令执行完毕后新硬盘的UUID也会和旧的一样,可以不加修改直接接入到新的设备上去。
														
dd命令执行完毕后,会得到一个有三个分区的新硬盘:前两个分区和旧硬盘的完全一致,第三个分区是一个空分区,没有被使用。 这第三个分区的未使用空间就是需要扩容到根目录的分区。

三、新硬盘启动

接下来将操作的设备关机。拆下两块硬盘,将旧的硬盘保存下来作为数据的备份。然后将新的硬盘接入到旧硬盘所在的设备,然后开机。顺利的话,可以直接进入转移好的系统。
如果不能进入系统。则关闭机器,然后重新开机,进入BIOS,选择新的硬盘作为启动盘即可。
个人在操作时遇到了如下问题:
不能进入系统,在CentOS7欢迎界面(指那个由线条组成的‘7’的界面)一段时间后,会黑屏进入一个类似命令行的界面。因为是回忆写的文章,没能记录下来界面的文字。
解决办法:个人在dd命令结束后没有进入新的系统,而直接对剩下的空闲分区进行了分区操作,导致系统路径识别错误。在任意系统上删除过早操作的第三个分区,还原成空分区后成功进入系统。

四、根目录扩容(LVM)

这部分的解决方法参考自知乎上的:Linux 扩容 / 根分区(LVM+非LVM)的“二、CentOS7,LVM根分区扩容步骤”部分。
															#输入:
															lsblk #在新硬盘的设备上查看所有块设备
															#系统返回:
															sdc                          8:32   0 55.9G  0 disk 
															├─sdc1                       8:33   0    1G  0 part /boot
															└─sdc2                       8:34   0 13.8G  0 part 
															  ├─centos_liusserver-root 253:0    0 12.3G  0 lvm  /
															  └─centos_liusserver-swap 253:1    0  1.5G  0 lvm  [SWAP]
															#可以发现空间容量对不上,存在空分区。并且了解到此时的硬盘被叫做sdc。
															
															#接下来对空分区,创建分区
															fdisk /dev/sdc #写最顶层的名称
														
然后系统会逐步返回下面图片的信息:

如上图中①和②默认如图。③是编号,这里编号选3(也就是可以默认,直接回车),其结果就是sdc3。④是分区的起始位置,括号内是范围。这里自己是填写的最小的数值。 这里需要注意,我自己进行这步时的默认数据不是最小的数据,导致一片存储空间没有利用。注意核实First sector后括号内的最小值和default(默认数值)后的数值是否一致。 ⑤是分区的结束位置,注意默认值和最大值相同即可。⑥和⑦的选择如图即可。
															#刷新分区
															partprobe /dev/sdc #这里是整个分区
															
															#创建物理卷
															pvcreate /dev/sdc3 #上图步骤中创建的那个分区
															
															#查看卷组名称
															vgdisplay
															#对应系统返回:
															  --- Volume group ---
															  VG Name               centos_lytnib
															  System ID             
															  Format                lvm2
															  Metadata Areas        2
															  #后面系统返回的内容省略
															#通过返回了解到VG Name为centos_lytnib。这个在后面使用。
															
															#物理卷扩展到卷组 卷组名就是VG Name。
															vgextend centos_lytnib /dev/sdc3 #中间的参数就是VG Name
															
															#查看当前逻辑卷的空间状态
															lvdisplay
															#对应系统返回:
															  --- Logical volume ---
															  LV Path                /dev/centos_lytnib/swap
															  LV Name                swap
															  VG Name                centos_lytnib
															  #返回内容省略
															  --- Logical volume ---
															  LV Path                /dev/centos_lytnib/root
															  LV Name                root
															  VG Name                centos_lytnib
															  #返回内容省略
															#计划是把剩余空间分配给根分区,即root。发现第二个信息为根分区信息。LV Path的参数记下来(/dev/centos_lytnib/root),后面需要使用。
															
															#将卷组中的空闲空间扩展到根分区的逻辑卷
															lvextend -l +100%FREE /dev/centos_lytnib/root #LV Path的参数
															
															#刷新根分区
															xfs_growfs /dev/centos_lytnib/root #LV Path的参数
														
此时,查看容量就会发现根分区容量变大了。实际使用硬盘工具查看会发现是分了三个分区,但是第三个分区的空间分给了根分区。
使用宝塔linux面板查看如下,根目录有了54G空间: