LVM扩容与恢复误删除的LV或VG

踏雪而行 by haven200

NAS新增了两块硬盘,在为LVM扩容时操作失误,将原LV删除了,为此花了些时间才找回来。特此记录,以做备忘。

LVM2与RAID的区别

简单地说,RAID是一种安全存储数据的方法,而LVM是一种可以扩展RAID性能的软件。

RAID

RAID将多个物理硬盘组成一个虚拟硬盘,该虚拟硬盘可以将数据存储在一个或多个物理硬盘上,以提高冗余度,并降低数据丢失的风险。
RAID可以使用专业硬件或者软件来实现。

LVM2

LVM是一种为了使多个硬盘拥有一个或多个分区在内存中对这些硬盘进行逻辑分区的方法。
LVM纯粹是一种管理多个硬盘的软件。

LVM可以在RAID上运行并提高数据读写速度。

恢复已删除的LV

LVM2的恢复命令为vgcfgrestore

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
:~$ vgcfgrestore --help
vgcfgrestore - Restore volume group configuration

Restore VG metadata from last backup.
vgcfgrestore VG
[ COMMON_OPTIONS ]

Restore VG metadata from specified file.
vgcfgrestore -f|--file String VG
[ COMMON_OPTIONS ]

List all VG metadata backups.
vgcfgrestore -l|--list VG
[ COMMON_OPTIONS ]

List one VG metadata backup file.
vgcfgrestore -l|--list -f|--file String
[ COMMON_OPTIONS ]
[ VG ]

Common options for command:
[ -M|--metadatatype lvm2 ]
[ --force ]

背景

假设LVM的信息如下:

1
2
3
4
5
6
7
8
9
10
:~$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
movies media -wi-a----- <2.64t
haven200 shares -wi-ao---- 400.00g
public shares -wi------- 200.00g

:~$ vgs
VG #PV #LV #SN Attr VSize VFree
media 2 1 0 wz--n- <2.64t 77g
shares 1 2 0 wz--n- <1024.00g <424.00g

对使用lvremovevgremove删除的LV或VG进行恢复,操作步骤是一样的,所以我们这里以LV例。

在对LVM进行操作时,错误的执行了lvremove,将LV【public】删除了,如下:

1
2
3
4
5
6
7
8
9
10
11
:~$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
movies media -wi-a----- <2.64t
haven200 shares -wi-ao---- 400.00g
public shares -wi------- 200.00g

:~$ lvremove /dev/shares/public shares
:~$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
movies media -wi-a----- <2.64t
haven200 shares -wi-ao---- 400.00g

对LV进行恢复

查看LV【public】所在VG【shares】的操作记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:~$ vgcfgrestore --list shares
File: /etc/lvm/archive/shares_00000-367217791.vg/shares_00000-367217791.vg
VG name: shares
Description: Created *before* executing 'lvcreate -L 400G -n haven200 shares'
Backup Time: Thu Jan 5 08:40:25 2023

File: /etc/lvm/archive/shares_00001-1927234942.vg/shares_00001-1927234942.vg
VG name: shares
Description: Created *before* executing 'lvcreate -L 200G -n public shares'
Backup Time: Thu Jan 5 08:40:52 2023

File: /etc/lvm/archive/shares_00003-1430114073.vg/shares_00003-1430114073.vg
VG name: shares
Description: Created *before* executing 'lvremove /dev/shares/public'
Backup Time: Sun Jan 15 15:32:54 2023

File: /etc/lvm/backup/shares/shares
VG name: shares
Description: Created *after* executing 'lvremove /dev/shares/public'
Backup Time: Sun Jan 15 15:32:54 2023

看上面信息的这段

1
2
3
4
File:         /etc/lvm/archive/shares_00003-1430114073.vg/shares_00003-1430114073.vg
VG name: shares
Description: Created *before* executing 'lvremove /dev/shares/public'
Backup Time: Sun Jan 15 15:32:54 2023

Description这行,有删除LV【public】的指令,而且这里还有个关键字before,说明此文件shares_00003-1430114073.vg是LV【public】执行删除操作之前的状态,所以我们需要将LVM恢复至这一步。

1
2
3
4
5
6
7
8
9
10
11
:~$ vgcfgrestore -f /etc/lvm/archive/shares_00003-1430114073.vg shares
Volume group shares has active volume: haven200.
WARNING: Found 1 active volume(s) in volume group "shares".
Restoring VG with active LVs, may cause mismatch with its metadata.
Do you really want to proceed with restore of volume group "shares", while 1 volume(s) are active? [y/n]: y
Restored volume group shares.

:~$ lvscan
ACTIVE '/dev/media/movies' [<2.64 TiB] inherit
ACTIVE '/dev/shares/haven200' [400.00 GiB] inherit
inactive '/dev/shares/public' [200.00 GiB] inherit

现在,被删除的LV【public】已经恢复了,但它的状态是未激活的,所以需要我们手动激活一下它。

1
2
3
4
5
6
7
8
9
10
11
12
:~$ lvchange -ay /dev/shares/public
:~$ lvscan
ACTIVE '/dev/media/movies' [<2.64 TiB] inherit
ACTIVE '/dev/shares/haven200' [400.00 GiB] inherit
ACTIVE '/dev/shares/public' [200.00 GiB] inherit

:~$ mount /dev/shares/public /mnt/public
:~$ ll /mnt/public
drwxr-xr-x 2 nas nas 4.0K Jun 18 2019 pure-ftpd/
drwxr-xr-x 2 root root 4.0K Jun 19 2019 rsyncd/
drwxr-xr-x 2 nas nas 4.0K Feb 22 2020 server/
drwxr-xr-x 2 nas nas 4.0K Jun 18 2019 transmission-daemon/

至此,被删除的LV【public】恢复完毕,可以正常挂载使用了。

LV/VG 扩容

  • VG扩容:因为每个PV只能加入一个VG,所以VG空间不足时,只能为此VG添加新的PV。
  • LV扩容,分为以下三种情况
    • VG有空余空间:只需对此LV扩容即可
    • VG没有空间且VG可以扩容:先对VG扩容,然后再对LV扩容即可。
    • VG没有空间且VG不能扩容:缩减此VG上其它LVs的空间,将此空间添加至需扩容的LV上。

LV【movies】的剩余空间基本告罄,所以在这里新增了一块硬盘。以下为扩容记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# format new disk
:~$ gdisk /dev/sdk
...
...
Command (m for help): n
Partition number (1-?): 1
First cylinder (1-xxxx, default 1):
Last cylinder, +cylinders or +size{K,M,G} (1-xxxxx, default xxxxx):
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): lvm

Changed system type of partition 1 to 43 (Linux LVM)
...
...
# create pv
:~$ pvcreate /dev/sdk1
# add pv to vg
:~$ vgextend media /dev/sdk1
:~$ vgs
VG #PV #LV #SN Attr VSize VFree
media 2 1 0 wz--n- <4.64t 3.77g
shares 1 2 0 wz--n- <1024.00g <424.00g

至此,VG【media】已经扩容完毕。下面开始对LV【movies】进行扩容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
:~$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
movies media -wi-a----- <2.64t
haven200 shares -wi-ao---- 400.00g
public shares -wi------- 200.00g

# 要扩容,首先卸载LV
:~$ umount /dev/media/movies
# 对LV进行检查
:~$ e2fsck -f /dev/media/movies
....
....
# 扩展LV
:~$ lvresize -L +2T /dev/media/movies
....
....
:~$ e2fsck -f /dev/media/movies
....
....
# 扩展分区
:~$ resize2fs /dev/media/movies
....
....
:~$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
movies media -wi-a----- <4.64t
haven200 shares -wi-ao---- 400.00g
public shares -wi------- 200.00g

References: