方法 2:使用 pvmove
在这里,我将我们的逻辑卷“lv1”从 /dev/sdc1 迁移到 /dev/sdb1
让我们再次使用 /dev/sdb1 扩展我们的卷组
[root@onitroad-server ~]# vgextend rhel /dev/sdb1 Volume group "rhel" successfully extended
接下来使用 dmsetup 和以下命令监视设备 ID
[root@onitroad-server ~]# ls -l /dev | grep sd brw-rw---- 1 root disk 8, 0 Apr 7 21:25 sda brw-rw---- 1 root disk 8, 1 Apr 7 21:25 sda1 brw-rw---- 1 root disk 8, 2 Apr 7 21:40 sda2 brw-rw---- 1 root disk 8, 16 Apr 7 21:25 sdb brw-rw---- 1 root disk 8, 17 Apr 7 21:40 sdb1 brw-rw---- 1 root disk 8, 32 Apr 7 21:30 sdc brw-rw---- 1 root disk 8, 33 Apr 7 21:40 sdc1
[root@onitroad-server ~]# dmsetup deps /dev/rhel/lv1 1 dependencies : (8, 33)
现在是时候将我们的逻辑卷从 /dev/sdc1 迁移到 /dev/sdb1,下面的命令可能需要一些时间
[root@onitroad-server ~]# pvmove -n lv1 /dev/sdc1 /dev/sdb1 /dev/sdc1: Moved: 1.56% /dev/sdc1: Moved: 100.00%
这样迁移就完成了,使用 dmsetup 验证一下
[root@onitroad-server ~]# dmsetup deps /dev/rhel/lv1 1 dependencies : (8, 17) [root@onitroad-server ~]# ls -l /dev | grep sd brw-rw---- 1 root disk 8, 0 Apr 7 21:25 sda brw-rw---- 1 root disk 8, 1 Apr 7 21:25 sda1 brw-rw---- 1 root disk 8, 2 Apr 7 21:40 sda2 brw-rw---- 1 root disk 8, 16 Apr 7 21:25 sdb brw-rw---- 1 root disk 8, 17 Apr 7 21:40 sdb1 brw-rw---- 1 root disk 8, 32 Apr 7 21:30 sdc brw-rw---- 1 root disk 8, 33 Apr 7 21:40 sdc1 [root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices lv1 rhel -wi-ao---- 1.00g /dev/sdb1(0) root rhel -wi-ao---- <13.10g /dev/sda2(401) swap rhel -wi-ao---- <1.57g /dev/sda2(0)
一切看起来都很完美..
最后再次重新验证文件内容
[root@onitroad-server ~]# cat /lv1/myfile This is a test file [root@onitroad-server ~]# md5sum /lv1/myfile 5dd39cab1c53c2c77cd352983f9641e1 /lv1/myfile
将我所有的 lvms 迁移到新设备 /dev/sdd 的快速示例
目前,如我们所见,我的 root 和交换分区位于 /dev/sda 上,我打算将其移至 /dev/sdd
[root@onitroad-server ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 15.7G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 14.7G 0 part ├─rhel-root 253:0 0 13.1G 0 lvm / └─rhel-swap 253:1 0 1.6G 0 lvm [SWAP] sdd 8:48 0 20G 0 disk sr0 11:0 1 1024M 0 rom sr1 11:1 1 1024M 0 rom
我的卷组当前驻留在 /dev/sda2
[root@onitroad-server ~]# vgs -o+devices VG #PV #LV #SN Attr VSize VFree Devices rhel 2 3 0 wz--n- <16.61g 964.00m /dev/sda2(0) rhel 2 3 0 wz--n- <16.61g 964.00m /dev/sda2(401)
下面是我打算迁移的两个逻辑卷
[root@onitroad-server ~]# lvs LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert root rhel -wi-ao---- <13.10g swap rhel -wi-ao---- <1.57g
使用新磁盘 /dev/sdd 扩展我们的“rhel”卷组
[root@onitroad-server ~]# vgextend rhel /dev/sdd Volume group "rhel" successfully extended [root@onitroad-server ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 rhel lvm2 a-- <14.67g 4.00m /dev/sdb1 rhel lvm2 a-- <1.94g 960.00m /dev/sdd rhel lvm2 a-- <20.00g <20.00g [root@onitroad-server ~]# pvmove -n root /dev/sda2 /dev/sdd /dev/sda2: Moved: 0.03% /dev/sda2: Moved: 2.15% ... /dev/sda2: Moved: 78.53% /dev/sda2: Moved: 100.00% [root@onitroad-server ~]# pvmove -n swap /dev/sda2 /dev/sdd /dev/sda2: Moved: 0.00% /dev/sda2: Moved: 100.00%
如我们所见,我的 root 和交换逻辑卷现在驻留在 /dev/sdd 上
[root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices root rhel -wi-ao---- <13.10g /dev/sdd(0) swap rhel -wi-ao---- <1.57g /dev/sdd(3353)
我的卷组现在位于 /dev/sdd 上
[root@onitroad-server ~]# vgs -o+devices VG #PV #LV #SN Attr VSize VFree Devices rhel 4 3 0 wz--n- <38.60g 22.93g /dev/sdd(3353) rhel 4 3 0 wz--n- <38.60g 22.93g /dev/sdd(0)
所以我的 root 和 swap 分区现在都迁移到了 /dev/sdd
[root@onitroad-server ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 15.7G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 14.7G 0 part sdb 8:16 0 2G 0 disk └─sdb1 8:17 0 2G 0 part sdd 8:48 0 20G 0 disk ├─rhel-root 253:0 0 13.1G 0 lvm / └─rhel-swap 253:1 0 1.6G 0 lvm [SWAP] sr0 11:0 1 1024M 0 rom sr1 11:1 1 1024M 0 rom
在本文中,将介绍两种无需重新启动即可将逻辑卷 /dev/rhel/lv1 从一个磁盘迁移到另一个磁盘的方法,
前提是系统上已经有另外的磁盘可用。
另外在文章的最后一个快速示例将我的所有逻辑卷迁移到新分区(磁盘)
- LVM 镜像
- LVM pvmove 命令
以下步骤是在 Red Hat Enterprise Linux 7 上操作完成
方法一:使用LVM镜像
首先让我们用逻辑卷检查映射的设备,这里你看到我的逻辑卷 lv1 驻留在 /dev/sdb1
[root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices lv1 rhel -wi-a----- 1.00g /dev/sdb1(0) root rhel -wi-ao---- <13.10g /dev/sda2(401) swap rhel -wi-ao---- <1.57g /dev/sda2(0)
这个逻辑卷挂载在 /lv1
[root@onitroad-server ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 14G 7.0G 6.2G 54% / devtmpfs 671M 0 671M 0% /dev tmpfs 686M 0 686M 0% /dev/shm tmpfs 686M 8.7M 678M 2% /run tmpfs 686M 0 686M 0% /sys/fs/cgroup /dev/sda1 1014M 160M 855M 16% /boot tmpfs 138M 0 138M 0% /run/user/0 /dev/mapper/rhel-lv1 976M 2.6M 907M 1% /lv1
在这个分区上,我有一个文件,我们将用它来监控我们的迁移
[root@onitroad-server ~]# md5sum /lv1/myfile 5dd39cab1c53c2c77cd352983f9641e1 /lv1/myfile [root@onitroad-server ~]# cat /lv1/myfile This is a test file
现在引入一个新的 PV,我们希望其中移动我们的新逻辑卷。
因此我添加了一个新的虚拟磁盘 /dev/sdc
[root@onitroad-server ~]# lsscsi [0:0:0:0] cd/dvd VBOX CD-ROM 1.0 /dev/sr0 [1:0:0:0] cd/dvd VBOX CD-ROM 1.0 /dev/sr1 [2:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sda [3:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdb [4:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdc
因此,让我们在我新添加的磁盘上创建一个分区 /dev/sdc1,分区类型为“Linux LVM”
[root@onitroad-server ~]# fdisk /dev/sdc Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x046a1def. Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): First sector (2048-4194303, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-4194303, default 4194303): Using default value 4194303 Partition 1 of type Linux and of size 2 GiB is set Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/sdc: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes/512 bytes I/O size (minimum/optimal): 512 bytes/512 bytes Disk label type: dos Disk identifier: 0x046a1def Device Boot Start End Blocks Id System /dev/sdc1 2048 4194303 2096128 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
使用新分区创建新物理卷
[root@onitroad-server ~]# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created.
验证新创建的物理卷
[root@onitroad-server ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 rhel lvm2 a-- <14.67g 4.00m /dev/sdb1 rhel lvm2 a-- <1.94g 960.00m /dev/sdc1 lvm2 --- <2.00g <2.00g
接下来使用新的物理卷扩展“rhel”卷组
[root@onitroad-server ~]# vgextend rhel /dev/sdc1 Volume group "rhel" successfully extended
使用“-v”启用详细选项并查看用于“rhel”卷组的分区列表
[root@onitroad-server ~]# vgdisplay rhel -v --- Volume group -- VG Name rhel System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 6 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 3 Max PV 0 Cur PV 3 Act PV 3 VG Size 18.60 GiB PE Size 4.00 MiB Total PE 4762 Alloc PE/Size 4010/15.66 GiB Free PE/Size 752/<2.94 GiB VG UUID W9RBxy-be7G-7Mai-unE9-CU1P-os6O-1IrAwg --- Logical volume -- LV Path /dev/rhel/swap LV Name swap VG Name rhel LV UUID 5y06cM-RBdD-bP9o-XyTn-vODc-OkdS-1DCCj4 LV Write Access read/write LV Creation host, time localhost, 2015-08-20 12:35:44 +0530 LV Status available # open 2 LV Size <1.57 GiB Current LE 401 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 --- Logical volume -- LV Path /dev/rhel/root LV Name root VG Name rhel LV UUID 8XkPVc-spib-oNu8-3D5E-f1vT-6RpW-ivZvjL LV Write Access read/write LV Creation host, time localhost, 2015-08-20 12:35:44 +0530 LV Status available # open 1 LV Size <13.10 GiB Current LE 3353 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 --- Logical volume -- LV Path /dev/rhel/lv1 LV Name lv1 VG Name rhel LV UUID 1B3itY-r46q-LMrz-Cby0-YqCt-XV1G-TmsqMx LV Write Access read/write LV Creation host, time onitroad-server.example, 2015-04-07 21:22:45 +0530 LV Status available # open 1 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2 --- Physical volumes -- PV Name /dev/sda2 PV UUID Qreqy9-GHr6-mlDN-D3ki-NU5k-3VUb-o2g34D PV Status allocatable Total PE/Free PE 3755/1 PV Name /dev/sdb1 PV UUID VqVvQi-I0BM-epGZ-lhpf-n48v-LM0u-yGGjgK PV Status allocatable Total PE/Free PE 496/240 PV Name /dev/sdc1 PV UUID 6Rzgfb-NOeK-MT5F-TrQ5-cM6i-si8v-192uWO PV Status allocatable Total PE/Free PE 511/511
所以一切看起来都是正确的,在上次开始迁移之前再次验证我们的 lv1 使用的分区,即 /dev/sdb1
[root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices lv1 rhel -wi-ao---- 1.00g /dev/sdb1(0) root rhel -wi-ao---- <13.10g /dev/sda2(401) swap rhel -wi-ao---- <1.57g /dev/sda2(0)
可以使用以下命令进行验证
[root@onitroad-server ~]# dmsetup deps /dev/rhel/lv1 1 dependencies : (8, 17)
如我们所见,我们只有一个依赖项,它映射到 8,17,我们在下面看到的是 /dev/sdb1
[root@onitroad-server ~]# ls -l /dev/| grep sd brw-rw---- 1 root disk 8, 0 Apr 7 21:25 sda brw-rw---- 1 root disk 8, 1 Apr 7 21:25 sda1 brw-rw---- 1 root disk 8, 2 Apr 7 21:31 sda2 brw-rw---- 1 root disk 8, 16 Apr 7 21:25 sdb brw-rw---- 1 root disk 8, 17 Apr 7 21:31 sdb1 brw-rw---- 1 root disk 8, 32 Apr 7 21:30 sdc brw-rw---- 1 root disk 8, 33 Apr 7 21:31 sdc1
让我们从迁移开始
我们将使用以下命令创建单个镜像
[root@onitroad-server ~]# lvconvert -m 1 rhel/lv1 /dev/sdc1 Are you sure you want to convert linear LV rhel/lv1 to raid1 with 2 images enhancing resilience? [y/n]: y Logical volume rhel/lv1 successfully converted.
让我们看看我们的文件是否仍然可用
[root@onitroad-server ~]# cat /lv1/myfile This is a test file
如果我们看到设备列表,它会有点不同,因为我们跨越了两个底层设备,因为我们处于镜像结构中
[root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices lv1 rhel rwi-aor--- 1.00g 100.00 lv1_rimage_0(0),lv1_rimage_1(0) root rhel -wi-ao---- <13.10g /dev/sda2(401) swap rhel -wi-ao---- <1.57g /dev/sda2(0)
dmsetup 也应该显示与预期类似的输出
[root@onitroad-server ~]# dmsetup deps /dev/rhel/lv1 4 dependencies : (253, 6) (253, 5) (253, 4) (253, 3)
现在我们可以打破镜子并摆脱我们想要移除的旧设备
[root@onitroad-server ~]# lvconvert -m 0 rhel/lv1 /dev/sdb1 Are you sure you want to convert raid1 LV rhel/lv1 to type linear losing all resilience? [y/n]: y Logical volume rhel/lv1 successfully converted.
所以命令执行成功
在这里你可以看到我们的逻辑卷 lv1 现在驻留在 /dev/sdc1
[root@onitroad-server ~]# lvs -o+devices LV VG Attr LSize Pool Oroirn Data% Meta% Move Log Cpy%Sync Convert Devices lv1 rhel -wi-ao---- 1.00g /dev/sdc1(1) root rhel -wi-ao---- <13.10g /dev/sda2(401) swap rhel -wi-ao---- <1.57g /dev/sda2(0)
同样可以使用 dmsetup 进行验证
[root@onitroad-server ~]# dmsetup deps /dev/rhel/lv1 1 dependencies : (8, 33)
[root@onitroad-server ~]# ls -l /dev/| grep sd brw-rw---- 1 root disk 8, 0 Apr 7 21:25 sda brw-rw---- 1 root disk 8, 1 Apr 7 21:25 sda1 brw-rw---- 1 root disk 8, 2 Apr 7 21:38 sda2 brw-rw---- 1 root disk 8, 16 Apr 7 21:25 sdb brw-rw---- 1 root disk 8, 17 Apr 7 21:38 sdb1 brw-rw---- 1 root disk 8, 32 Apr 7 21:30 sdc brw-rw---- 1 root disk 8, 33 Apr 7 21:38 sdc1
最后的测试是验证我们的文件及其内容,它看起来与迁移前一样
[root@onitroad-server ~]# cat /lv1/myfile This is a test file [root@onitroad-server ~]# md5sum /lv1/myfile 5dd39cab1c53c2c77cd352983f9641e1 /lv1/myfile
现在一切都完成了,我们不再需要 /dev/sdb1 并且可以安全地从“rhel”卷组中删除
[root@onitroad-server ~]# vgreduce rhel /dev/sdb1 Removed "/dev/sdb1" from volume group "rhel"
验证相同,如我们所见,我们不再拥有 /dev/sdb1
[root@onitroad-server ~]# vgs -o+devices VG #PV #LV #SN Attr VSize VFree Devices rhel 2 3 0 wz--n- 16.66g 1.00g /dev/sda2(0) rhel 2 3 0 wz--n- 16.66g 1.00g /dev/sda2(401) rhel 2 3 0 wz--n- 16.66g 1.00g /dev/sdc1(1)