方法 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
如何在不重启 Linux 的情况下在线将逻辑卷和卷组从一个磁盘迁移到另一个磁盘

在本文中,将介绍两种无需重新启动即可将逻辑卷 /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)
日期:2020-06-02 22:17:02 来源:oir作者:oir