无损将普通分区转换为LVM分区

  服务器用于存放数据的硬盘不够了,但是由于装机时没有采用LVM卷组,因此无法将新硬盘快速合并为一个大的存储空间。现在服务器的sda用于安装操作系统,sdb为一个普通ext4分区挂载至/home,现希望将新加入的sdcsdb一起创建一个lvm卷组,并挂载至/home

使用须知

  请务必先完整阅读后在操作,并确保你具有以下知识:

  • 熟练的Linux运维技术
  • 了解磁盘分区
  • 了解LVM原理
  • 明白数据是无价的

操作步骤

  1. 卸载正在使用的硬盘
1
2
3
umount /dev/sdb1
# 如果提示设备正忙,可以使用fuser命令查看正在操作硬盘的进程,并合理关闭它们
fuser -cu /dev/sdb1
  1. 在新硬盘上创建新分区并格式化
1
2
3
4
5
6
7
8
fdisk /dev/sdc
g 新建一份 GPT 分区表
n 添加新分区
默认回车 分区号
默认回车 第一个扇区
默认回车 大小
w 将分区表写入磁盘并退出
mkfs.ext4 /dev/sdc1
  1. 将sdb的内容传输至sdc,虽然采购的硬盘为同一型号,但是由于批次的原因两者大小并不相同,新硬盘有7814033408个扇区大于旧硬盘的7814035087,因此可以直接操作,否则参考第4步,现缩小文件系统
1
2
3
dd if=/dev/sdb1 of=/dev/sdc1 bs=512M
# 可以再开一个终端执行此命令查看进度
watch -n 10 kill -USR1 682642
  1. 缩小新硬盘上的文件系统(移动存储的内容)
1
2
3
4
5
6
7
# 操作前要先进行文件系统检查
e2fsck -f /dev/sdc1
# 缩小到3.5G,这里要留意一下缩小后文件系统占用的块数
resize2fs -p /dev/sdc1 3584G
> /dev/sdc1 上的文件系统现在为 939524096 个块(每块4k)。
# 如果没记下来,可以用这个命令查看
dumpe2fs -h /dev/sdc1
  1. 缩小新硬盘上的文件系统(缩小分区表)
1
2
3
4
5
6
7
fdisk /dev/sdc
d 删除分区
n 添加新分区
默认回车 分区号
默认回车 第一个扇区
上一步的块数*4
w 将分区表写入磁盘并退出
  1. 将旧硬盘的分区类型改为LVM
1
2
3
4
fdisk /dev/sdb
t 更改分区类型
31 Linux LVM
w 将分区表写入磁盘并退出
  1. 创建LVM卷组并格式化
1
2
3
4
5
lvm
pvcreate /dev/sdb1
vgcreate vg_data /dev/sdb1
lvcreate -n lv_home -l 100%FREE vg_data
mkfs.ext4 /dev/vg_data/lv_home
  1. 将新硬盘上的数据传至LVM卷组
1
dd if=/dev/sdc1 of=/dev/mapper/vg_data-lv_home bs=512M
  1. 重新分区新硬盘
1
2
3
4
5
6
7
fdisk /dev/sdc
d 删除分区
n 添加新分区
默认回车 分区号
默认回车 第一个扇区
默认回车 大小
w 将分区表写入磁盘并退出
  1. 将新硬盘加入LVM卷组
1
2
3
4
lvm
pvcreate /dev/sdc1
vgextend vg_data /dev/sdc1
lvextend -l +100%FREE /dev/vg_data/lv_home
  1. 扩容LVM卷组的文件系统
1
2
e2fsck -f /dev/vg_data/lv_home
resize2fs -p /dev/vg_data/lv_home
  1. 查询新硬盘的UUID,修改fstab,使之开机可以自动挂载
1
2
3
4
5
6
7
ll /dev/disk/by-uuid/

# 编辑 /etc/fstab
vim /etc/fstab

# 立即重新挂载
mount -a