第 4 章 使用 CLI 命令管理 LVM
本章总结了可使用 LVM 命令行界面(CLI)创建和维护逻辑卷的独立管理任务。
注意
如果要为集群环境生成或者修改 LVM 卷,则必须确定正在运行 clvmd 守护进程。有关详情请参考 第 3.1 节 “在集群中创建 LVM 卷”。
除 LVM 命令行界面(CLI)外,还可以使用系统存储管理器(System Storage Manager,SSM)配置 LVM 逻辑卷。有关将 SSM 与 LVM 合用的详情,请查看《存储管理指南》。
4.1. 使用 CLI 命令
LVM CLI 命令有一些常规功能。
命令行参数中需要指定大小时,可以明确指定单位。如果不指定单位,那么就使用默认的 KB 或者 MB。LVM CLI 不接受分数。
LVM 指定单位时要无需区分大小写,比如 M 或者 m 的效果是一样的,例如 2 的乘方(乘 1024)。但是,在某个命令中指定 --units 参数时,小写表示该单位乘 1024,而大写表示该单位乘 1000。
在使用卷组或者逻辑卷名称作为命令参数时,完整路径名称是可选项。可将卷组 vg0 中的逻辑卷 lvol0 指定为 vg0/lvol0。如果要求列出卷组列表,但却为空白,则会使用所有卷组列表替换。如果需要列出逻辑卷列表,但给出的是卷组,则会使用该卷组中的所有逻辑卷列表替换。例如:lvdisplay vg0 命令将显示卷组 vg0 中的所有逻辑卷。
所有 LVM 命令都接受 -v 参数,多输入几次 v 可提高输出的详细程度。例如:以下示例显示的是 lvcreate 命令的默认输出。
# lvcreate -L 50MB new_vg
Rounding up size to full physical extent 52.00 MB
Logical volume "lvol0" created
下面是使用 -v 参数的 lvcreate 命令输出结果。
# lvcreate -v -L 50MB new_vg
Finding volume group "new_vg"
Rounding up size to full physical extent 52.00 MB
Archiving volume group "new_vg" metadata (seqno 4).
Creating logical volume lvol0
Creating volume group backup "/etc/lvm/backup/new_vg" (seqno 5).
Found volume group "new_vg"
Creating new_vg-lvol0
Loading new_vg-lvol0 table
Resuming new_vg-lvol0 (253:2)
Clearing start of logical volume "lvol0"
Creating volume group backup "/etc/lvm/backup/new_vg" (seqno 5).
Logical volume "lvol0" created
还可以使用 -vv、-vvv 或者 -vvvv 参数提高命令执行的详细程度。-vvvv 参数可以提供最多的信息。以下是 lvcreate 命令使用 -vvvv 参数时输出结果的前几行。
# lvcreate -vvvv -L 50MB new_vg
#lvmcmdline.c:913 Processing: lvcreate -vvvv -L 50MB new_vg
#lvmcmdline.c:916 O_DIRECT will be used
#config/config.c:864 Setting global/locking_type to 1
#locking/locking.c:138 File-based locking selected.
#config/config.c:841 Setting global/locking_dir to /var/lock/lvm
#activate/activate.c:358 Getting target version for linear
#ioctl/libdm-iface.c:1569 dm version OF [16384]
#ioctl/libdm-iface.c:1569 dm versions OF [16384]
#activate/activate.c:358 Getting target version for striped
#ioctl/libdm-iface.c:1569 dm versions OF [16384]
#config/config.c:864 Setting activation/mirror_region_size to 512
...
可以用命令的 --help 参数来显示任意 LVM CLI 命令的帮助信息。
# commandname --help
要显示某个命令的 man page,请执行 man 命令:
# man commandname
man lvm 命令提供有关 LVM 的常规在线信息。
所有 LVM 对象均使用创建该对象时分配的 UUID 作为内部参考。这在删除作为卷组一部分的名为 /dev/sdf 的物理卷时很有用,因为将其插回后,它的名称会变为 /dev/sdk。LVM 仍可以找到该物理卷,因为它是根据其 UUID 而不是其设备名称识别。有关创建物理卷时指定物理卷 UUID 详情的信息,请查看 第 6.4 节 “恢复物理卷元数据”。
4.2. 物理卷管理
本小节论述了管理物理卷不同方面的命令。
4.2.1. 创建物理卷
以下小节描述了创建物理卷时使用的命令。
4.2.1.1. 设定分区类型
如果您的物理卷使用整张磁盘设备,该磁盘不得有任何分区表。如果使用 DOS 磁盘分区,则应使用 fdisk 或者 cfdisk 命令或对等的命令将分区 id 设定为 0x8e。如果使用整个磁盘设备,则只需要删除分区表,即彻底破坏该磁盘中的数据即可。可使用以下命令将第一扇区归零,从而删除现有分区:
# dd if=/dev/zero of=PhysicalVolume bs=512 count=1
4.2.1.2. 初始化物理卷
使用 pvcreate 命令初始化要作为物理卷使用的块设备。初始化是模拟格式化文件系统。
以下命令将 /dev/sdd、/dev/sde 和 /dev/sdf 作为 LVM 物理卷初始化,以供之后成为 LVM 逻辑卷的一部分使用。
# pvcreate /dev/sdd /dev/sde /dev/sdf
若只是初始化分区而不是整张磁盘,则应在该分区中运行 pvcreate 命令。以下示例将分区 /dev/hdb1 作为 LVM 物理卷初始化,以供之后成为 LVM 逻辑卷的一部分使用。
# pvcreate /dev/hdb1
4.2.1.3. 扫描块设备
可使用 lvmdiskscan 命令扫描要作为物理卷使用的块设备,如下所示。
# lvmdiskscan
/dev/ram0 [ 16.00 MB]
/dev/sda [ 17.15 GB]
/dev/root [ 13.69 GB]
/dev/ram [ 16.00 MB]
/dev/sda1 [ 17.14 GB] LVM physical volume
/dev/VolGroup00/LogVol01 [ 512.00 MB]
/dev/ram2 [ 16.00 MB]
/dev/new_vg/lvol0 [ 52.00 MB]
/dev/ram3 [ 16.00 MB]
/dev/pkl_new_vg/sparkie_lv [ 7.14 GB]
/dev/ram4 [ 16.00 MB]
/dev/ram5 [ 16.00 MB]
/dev/ram6 [ 16.00 MB]
/dev/ram7 [ 16.00 MB]
/dev/ram8 [ 16.00 MB]
/dev/ram9 [ 16.00 MB]
/dev/ram10 [ 16.00 MB]
/dev/ram11 [ 16.00 MB]
/dev/ram12 [ 16.00 MB]
/dev/ram13 [ 16.00 MB]
/dev/ram14 [ 16.00 MB]
/dev/ram15 [ 16.00 MB]
/dev/sdb [ 17.15 GB]
/dev/sdb1 [ 17.14 GB] LVM physical volume
/dev/sdc [ 17.15 GB]
/dev/sdc1 [ 17.14 GB] LVM physical volume
/dev/sdd [ 17.15 GB]
/dev/sdd1 [ 17.14 GB] LVM physical volume
7 disks
17 partitions
0 LVM physical volume whole disks
4 LVM physical volumes
4.2.2. 显示物理卷
可使用以下三个命令显示 LVM 物理卷属性:pvs、pvdisplay 和 pvscan。
pvs 命令以可配置的格式提供物理卷信息,每行显示一个物理卷。pvs 命令提供大量格式控制,供脚本使用。有关使用 pvs 命令自定义输出结果的详情,请查看 第 4.8 节 “LVM 的自定义报告”。
pvdisplay 命令为每个物理卷提供详细的多行输出结果。它以固定格式显示物理属性(大小、扩展、卷组等)。
以下是在单一物理卷中使用 pvdisplay 命令显示的输出结果示例。
# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name new_vg
PV Size 17.14 GB / not usable 3.40 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 4388
Free PE 4375
Allocated PE 13
PV UUID Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
pvscan 命令在系统中为物理卷扫描所有支持的 LVM 块设备。
下面的命令显示所有找到的物理设备:
# pvscan
PV /dev/sdb2 VG vg0 lvm2 [964.00 MB / 0 free]
PV /dev/sdc1 VG vg0 lvm2 [964.00 MB / 428.00 MB free]
PV /dev/sdc2 lvm2 [964.84 MB]
Total: 3 [2.83 GB] / in use: 2 [1.88 GB] / in no VG: 1 [964.84 MB]
可在 lvm.conf 文件中定义过滤器,以便这个命令可以避免扫描特定物理卷。有关使用过滤器控制要扫描设备的详情,请查看 第 4.5 节 “使用过滤器控制 LVM 设备扫描”。
4.2.3. 防止在物理卷中分配
可使用 pvchange 命令防止在一个或多个物理卷的剩余空间中分配物理扩展。如果有磁盘错误或要删除该物理卷时需要这个操作。
以下命令不允许在 /dev/sdk1 中分配物理扩展。
# pvchange -x n /dev/sdk1
还可使用 pvchange 命令的 -xy 参数允许分配之前已禁止分配的扩展。
4.2.4. 重新定义物理卷大小
若出于任何原因需要更改底层块设备的大小,请使用 pvresize 命令使用新大小更新 LVM。可在 LVM 使用物理卷的同时执行这个命令。
4.2.5. 删除物理卷
如果 LVM 不再需要使用某个设备,则可使用 pvremove 命令删除 LVM 标签。执行 pvremove 命令将空白物理卷中的 LVM 元数据归零。
如果要删除的物理卷目前是某个卷组的一部分,则必须使用 vgreduce 命令将其从卷组中删除,如 第 4.3.7 节 “从卷组中删除物理卷” 所述。
# pvremove /dev/ram15
Labels on physical volume "/dev/ram15" successfully wiped
4.3. 卷组管理
本小节论述了执行各种卷组管理的命令。
4.3.1. 创建卷组
请使用 vgcreate 命令为一个或多个物理卷创建卷组。vgcreate 命令根据名称新建卷组,并至少在其中添加一个物理卷。
以下命令创建名为 vg1,包含物理卷 /dev/sdd1 和 /dev/sde1 的卷组。
# vgcreate vg1 /dev/sdd1 /dev/sde1
使用物理卷创建卷组时,默认将其磁盘空间分成大小为 4MB 的扩展。这个扩展是逻辑卷增大或减小的最小的量。大的扩展数目不会影响逻辑卷的 I/O 性能。
如果默认扩展大小不适合您,可使用 vgcreate 命令的 -s 选项指定扩展大小。可以使用 vgcreate 命令的 -p 或 -l 参数设定物理卷或逻辑卷数量限制。
默认情况下,卷组会根据常识规则分配物理扩展,比如不要在同一物理卷中放置平行条带。这是 normal 分配策略。可以使用 vgcreate 命令的 --alloc 参数指定 contiguous、anywhere 或者 cling 策略。通常只在特殊情况下才会需要 normal 以外的分配策略,比如或指定非常规或非标准扩展。有关 LVM 如何分配物理扩展的详情,请查看 第 4.3.2 节 “LVM 分配”。
LVM 卷组及底层逻辑卷均包含在 /dev 目录的设备特殊文件目录树中,其布局为:
/dev/vg/lv/
例如:如果创建了两个卷组,即 myvg1 和 myvg2,每个均包含名为 lv01、lv02 和 lv03 的三个逻辑卷,则会生成六个设备特殊文件,即:
/dev/myvg1/lv01
/dev/myvg1/lv02
/dev/myvg1/lv03
/dev/myvg2/lv01
/dev/myvg2/lv02
/dev/myvg2/lv03
如果对应逻辑卷目前未激活,则不会显示该设备的特殊文件。
64 位 CPU 中的最大 LVM 的设备大小为 8 EB。
4.3.2. LVM 分配
当 LVM 操作需要为一个或多个逻辑卷分配物理扩展时,分配的步骤如下:
在卷组中生成一组完整的未分配物理扩展供使用。如果在命令后结尾处提供任何物理扩展范围,则只会使用指定物理卷中符合那些范围的未分配物理扩展。
将依次尝试每个分配策略,从最严格的策略(即 contiguous)开始,到使用 --alloc 选项指定的分配策略结束,也可以将具体逻辑卷或卷组设定为默认选项。在每个策略中,从需要填充的空白逻辑卷空间数字最小的逻辑扩展开始,该空间填充后,则根据分配策略限制依次填充。如果需要更多空间,则 LVM 会移至下一个策略。
分配策略限制如下:
contiguous 分配策略要求任意逻辑扩展(不是逻辑卷的第一个逻辑扩展)的物理位置紧邻它前面一个逻辑扩展的物理位置。
逻辑卷为条带或镜像时,contiguous 分配限制可独立应用于每个需要空间的条带或镜像(leg)。
cling 分配策略要求将要添加到现有逻辑卷中的任意逻辑扩展使用的物理卷条件到任意逻辑扩展使用的物理卷条件到之前已经由那个逻辑卷中的一个逻辑扩展使用的现有逻辑卷中。如果已定义配置参数 allocation/cling_tag_list,则在两个物理卷中出现任何一个列出的标签时,就将这两个物理卷视为匹配。这样就可以分配为目的,标记有相似属性(比如其物理位置)的物理卷,并将其视为对等。有关与 LVM 标签一同使用 cling 策略指定扩展 LVM 卷时要附加物理卷的详情,请查看 第 4.4.15.3 节 “使用 cling 分配策略扩展逻辑卷”。
逻辑卷为条带或镜像时,cling 分配限制可独立应用于每个需要空间的条带或镜像(leg)。
normal 分配策略不会在平行逻辑卷中使用相同的偏移选择与分配给该平行逻辑卷(即不同的条带或镜像映象/分支)的逻辑扩展共享同一物理卷的物理扩展。
分配镜像日志的同时分配逻辑卷以保留镜像数据时,normal 分配策略会首先尝试为该日志和数据选择不同类型的物理卷。如果无法实现,且将 allocation/mirror_logs_require_separate_pvs 配置参数设定为 0,它就会允许将部分数据记录到共享物理卷中。
同样,分配精简池元数据时,normal 分配策略会与考虑镜像日志分配一样根据 allocation/thin_pool_metadata_require_separate_pvs 配置参数做决定。
如果有足够的剩余扩展满足分配要求,但 normal 分配策略不会使用它们,则 anywhere 会使用,即使出现将两个条带放到同一物理卷,从而降低性能的情况。
可使用 vgchange 命令更改分配策略。
注意
如果根据定义的分配策略需要使用本小节外的任意布局行为,则应注意在以后的版本中可能有所变化。例如:如果在命令行中提供两个有相同可用剩余物理扩展数供分配的空物理卷,LVM 目前考虑使用每个卷以便将其列出;不保证今后的发行本仍保留这个属性。如果获取某个具体逻辑卷的特定布局很重要,则应使用 lvcreate 和 lvconvert 步骤顺序构建,以便在每个步骤中应用分配策略,让 LVM 不会在布局上自由裁量。
要查看目前在任意具体示例中的分配进度方法,可查看 debug 日志输出结果,例如在命令中添加 -vvvv 选项。
4.3.3. 在集群中创建卷组
可使用 vgcreate 命令在集群环境中创建卷组,这与在单一节点中创建卷组是一样的。
默认情况下,所有可访问共享存储的计算机都可以看到使用 CLVM 在共享存储中创建的卷组。但也可以 使用 vgcreate 命令的 -c n 选项创建只能在该集群的一个节点中本地看到的卷组。
在集群环境中执行以下命令可在执行该命令节点中创建本地卷组。该命令创建名为 vg1,包含物理卷 /dev/sdd1 和 /dev/sde1 的卷组。
# vgcreate -c n vg1 /dev/sdd1 /dev/sde1
可使用 vgchange 命令的 -c 选项指定现有卷组是本地卷组还是集群卷组,如 第 4.3.8 节 “更改卷组参数” 所述。
可使用 vgs 命令查看现有卷组是否为集群的卷组,如果是集群的卷组,则会显示 c 属性。下面的命令显示卷组 VolGroup00 和 testvg1 属性。在这个示例中,VolGroup00 不是集群的卷组,而 testvg1 是集群的卷组,如 Attr 标题下的 c 属性所示。
# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup00 1 2 0 wz--n- 19.88G 0
testvg1 1 1 0 wz--nc 46.00G 8.00M
有关 vgs 命令的详情,请查看 第 4.3.5 节 “显示卷组” 第 4.8 节 “LVM 的自定义报告” 以及 vgs man page。
4.3.4. 在卷组中添加物理卷
请使用 vgextend 命令在现有卷组中添加额外的物理卷。vgextend 命令通过添加一个或多个可用物理卷增大卷组容量。
下面的命令在卷组 vg1 中添加物理卷 /dev/sdf1。
# vgextend vg1 /dev/sdf1
4.3.5. 显示卷组
有两个命令可显示 LVM 卷组的属性:即 vgs 和 vgdisplay。
vgscan 命令扫描卷组的所有磁盘,并重新构建 LVM 缓存文件,同时显示卷组。有关 vgscan 命令的详情,请查看 第 4.3.6 节 “为卷组扫描磁盘以构建缓存文件”。
vgs 命令使用可配置格式提供卷组信息,每行表示一个卷组。vgs 命令提供大量的格式控制,有助于脚本编写。有关使用 vgs 命令自定义输出结果的详情,请查看 第 4.8 节 “LVM 的自定义报告”。
vgdisplay 命令采用固定格式显示卷组属性(比如大小、扩展、物理卷数等等)。下面的示例显示使用 vgdisplay 命令显示卷组 new_vg 的输出结果。如果无法指定卷组,则会显示当前所有卷组。
# vgdisplay new_vg
--- Volume group ---
VG Name new_vg
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 11
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 51.42 GB
PE Size 4.00 MB
Total PE 13164
Alloc PE / Size 13 / 52.00 MB
Free PE / Size 13151 / 51.37 GB
VG UUID jxQJ0a-ZKk0-OpMO-0118-nlwO-wwqd-fD5D32
4.3.6. 为卷组扫描磁盘以构建缓存文件
vgscan 命令扫描系统中的所有支持的磁盘设备以查找 LVM 物理卷和卷组。这样可在 /etc/lvm/cache/.cache 文件中构建缓存,以保持当前 LVM 设备列表。
LVM 会在系统启动及执行 LVM 操作时自动运行 vgscan 命令,比如当您执行 vgcreate 命令或 LVM 探测到非一致性时。
注意
更改硬件配置以及在某个节点中添加或删除设备时,可能需要手动运行 vgscan 命令,以便系统可以识别系统启动时不存在的新设备。这是必需的,例如当在 SAN 中的系统中添加新磁盘,或热插拔标记为物理卷的新磁盘时。
可在 lvm.conf 文件中定义过滤器进行限制以避免扫描具体设备。有关使用过滤器限制要扫描设备的详情,请查看 第 4.5 节 “使用过滤器控制 LVM 设备扫描”。
以下是 vgscan 命令的输出结果示例。
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "new_vg" using metadata type lvm2
Found volume group "officevg" using metadata type lvm2
4.3.7. 从卷组中删除物理卷
使用 vgreduce 命令从卷组中删除未使用的物理卷。vgreduce 命令通过删除一个或多个空物理卷来缩小卷组容量。这样可释放那些不同卷组中要使用的物理卷,或者将其从该系统中删除。
从卷组中删除物理卷前,可使用 pvdisplay 命令确定任何逻辑卷都没有使用该物理卷。
# pvdisplay /dev/hda1
-- Physical volume ---
PV Name /dev/hda1
VG Name myvg
PV Size 1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV# 1
PV Status available
Allocatable yes (but full)
Cur LV 1
PE Size (KByte) 4096
Total PE 499
Free PE 0
Allocated PE 499
PV UUID Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7
如果该物理卷仍被使用,则必须使用 pvmove 命令将该数据迁移到另一个物理卷中。然后使用 vgreduce 命令删除该物理卷。
下面的命令从卷组 my_volume_group 中删除物理卷 /dev/hda1。
# vgreduce my_volume_group /dev/hda1
如果逻辑卷包含失败的物理卷,则不能使用那个逻辑卷。要从卷组中删除物理卷,如果没有在缺少的物理卷中分配逻辑卷,则可以使用 vgreduce 命令的 --removemissing 参数。
如果失败的物理卷包含 mirror 片段类型的逻辑卷镜像映像,则可以使用 vgreduce --removemissing --mirrorsonly --force 命令从镜像中删除该映像。这样只会删除该物理卷映像镜像的逻辑卷。
有关从 LVM 镜像失败中进行恢复的详情,请查看 第 6.3 节 “恢复 LVM 镜像错误”。有关从卷组中删除丢失的物理卷的详情,请查看 第 6.6 节 “从卷组中删除丢失的物理卷。”。
4.3.8. 更改卷组参数
vgchange 命令是用来停用和激活卷组,如 第 4.3.9 节 “激活和停用卷组” 所述。还可以使用这个命令为现有卷组更改几个卷组参数。
下面的命令将卷组 vg00 的最大逻辑卷数改为 128。
# vgchange -l 128 /dev/vg00
有关可使用 vgchange 命令更改卷组参数的论述,请查看 vgchange(8) man page。
4.3.9. 激活和停用卷组
创建卷组时,默认为激活状态。就是说可访问该组中的逻辑卷,并可进行更改。
在有些情况下需要让卷组处于不活跃状态,并因此无法被内核所识别。要停用或激活卷组,则请使用 vgchange 命令的 -a(--available)参数。
下面的示例停用卷组 my_volume_group。
# vgchange -a n my_volume_group
如果启用集群的锁定,添加 ‘e’ 只在一个节点中激活或停用卷组;而添加 ‘l’ 则只可在本地节点中激活或停用卷组。使用单主机快照的逻辑卷总是独占激活,因为一次只能在一个节点中使用它们。
可使用 lvchange 命令停用独立逻辑卷,如 第 4.4.11 节 “更改逻辑卷组的参数” 所述。有关在集群内的独立节点中激活逻辑卷的详情,请查看 第 4.7 节 “在集群的独立节点中激活逻辑卷”。
4.3.10. 删除卷组
请使用 vgremove 命令删除不包含逻辑卷的卷组。
# vgremove officevg
Volume group "officevg" successfully removed
4.3.11. 分割卷组
请使用 vgsplit 命令拆分卷组的物理卷,并创建新卷组。
不能在卷组间拆分逻辑卷。每个现有逻辑卷必须全部位于物理卷中,构成旧的或新的卷组。但必要时,也可使用 pvmove 命令强制拆分。
下面的示例从卷组 bigvg 中拆分新卷组 smallvg。
# vgsplit bigvg smallvg /dev/ram15
Volume group "smallvg" successfully split from "bigvg"
4.3.12. 组合卷组
可使用 vgmerge 命令将两个卷组组合为一个卷组。如果卷的物理扩展大小相等,且两个卷组的物理卷和逻辑卷概述均在目的卷组的限制范围内,则可将不活跃“源”卷与活跃或不活跃“目的”卷合并。
下面的命令将不活跃卷组 my_vg 与活跃或不活跃卷组 databases 合并,并给出详细运行时信息。
# vgmerge -v databases my_vg
4.3.13. 备份卷组元数据
每次卷组和逻辑卷配置更改后都会自从生成元数据备份和归档,除非在 lvm.conf 文件中禁用了此功能。默认情况下是在 /etc/lvm/backup 文件中保存元数据备份,在 /etc/lvm/archive 文件中保存元数据归档。可使用 vgcfgbackup 命令手动将元数据备份到 /etc/lvm/backup 文件中。
vgcfrestore 命令使用归档在所有物理卷中恢复卷组元数据。
有关使用 vgcfgrestore 命令恢复物理卷元数据的详情,请查看 第 6.4 节 “恢复物理卷元数据”。
4.3.14. 重新命名卷组
使用 vgrename 命令重命名现有卷组。
使用下面的命令将现有卷组 vg02 重命名为 my_volume_group:
# vgrename /dev/vg02 /dev/my_volume_group
# vgrename vg02 my_volume_group
4.3.15. 将卷组移动到其他系统
可将 LVM 卷组移动到另一个系统。建议使用 vgexport 和 vgimport 命令进行操作。
注意
可使用 vgimport 命令的 --force 参数。这样可导入缺少物理卷的卷组,并随后运行 vgreduce --removemissing 命令。
vgexport 可让不活跃的卷组服务访问该系统,以便拆离其物理卷。vgimport 命令可让机器在使用 vgexport 命令时期不活跃后重新可以访问该卷组。
请执行以下步骤将卷组从一个系统移动到另一个系统:
确定没有用户访问卷组活跃卷中的文件,然后卸载该逻辑卷。
使用 vgchange 命令的 -a n 参数将该卷组标记为不活跃,这样可防止卷组的进一步活动。
使用 vgexport 命令导出卷组。这样可防止要从中删除卷组的系统访问该卷组。
导出卷组后,执行 pvscan 命令时,会在导出的卷组中显示该物理卷,如下面的示例所示。
# pvscan
PV /dev/sda1 is in exported VG myvg [17.15 GB / 7.15 GB free]
PV /dev/sdc1 is in exported VG myvg [17.15 GB / 15.15 GB free]
PV /dev/sdd1 is in exported VG myvg [17.15 GB / 15.15 GB free]
...
下次关闭系统时,可拔出组成该卷组的磁盘,并将其连接到新系统中。
将磁盘插入新系统后,使用 vgimport 命令导入卷组,以便新系统可以访问该卷组。
使用 vgchange 命令的 -a y 参数激活卷组。
挂载该文件系统使其可用。
4.3.16. 重新创建卷组目录
请使用 vgmknodes 命令重新创建卷组和逻辑卷特殊文件。这个命令检查 /dev 目录中用来激活逻辑卷的 LVM2 特殊文件。它会创建所有缺少的特殊文件,并删除不使用的文件。
可在 vgscan 命令中指定 mknodes 参数将 vgmknodes 命令整合至 vgscan 命令。
4.4. 逻辑卷管理
本小节论述执行各方面逻辑卷管理的命令。
4.4.1. 创建线性逻辑卷
请使用 lvcreate 命令创建逻辑卷。如果没有为该逻辑卷指定名称,则默认使用 lvol#,其中 # 是逻辑卷的内部编号。
创建逻辑卷后,则会从组成卷组之物理卷中的剩余扩展中分出逻辑卷。通常逻辑卷会用完底层物理卷中的所有可用空间。修改该逻辑卷可释放并重新分配物理卷中的空间。
下面的命令在卷组 vg1 中创建大小为 10GB 的逻辑卷。
# lvcreate -L 10G vg1
下面的命令创建大小为 1500MB,名为 testlv 的线性逻辑卷,该卷位于卷组 testvg 中,创建块设备 /dev/testvg/testlv。
# lvcreate -L 1500 -n testlv testvg
下面的命令使用卷组 vg0 中的剩余扩展创建名为 gfslv,大小为 50GB 的逻辑卷。
# lvcreate -L 50G -n gfslv vg0
可使用 lvcreate 命令的 -l 参数,以范围为单位指定逻辑卷大小。还可以使用这个参数指定用于该逻辑卷的卷组百分比。下面的命令创建名为 mylv,使用卷组 testvg 总空间 60% 的逻辑卷。
# lvcreate -l 60%VG -n mylv testvg
还可以使用 lvcreate 命令的 -l 参数指定卷组中剩余可用空间的百分比作为逻辑卷的大小。下面的命令创建名为 yourlv,使用卷组 testvg 中所有未分配空间的逻辑卷。
# lvcreate -l 100%FREE -n yourlv testvg
可使用 lvcreate 命令的 -l 参数创建使用整个卷组的逻辑卷。另一个使用整个卷组创建逻辑卷的方法是使用 vgdisplay 命令找到 "Total PE" 大小,并在 lvcreate 命令中输入那些结果。
下面的命令创建名为 mylv 的逻辑卷,该卷充满名为 testvg 的卷组。
# vgdisplay testvg | grep "Total PE"
Total PE 10230
# lvcreate -l 10230 testvg -n mylv
如果需要删除物理卷,则用来创建逻辑卷的基层物理卷会变得很重要,因此需要考虑创建该逻辑卷的可能性。有关从卷组中删除物理卷的详情,请查看 第 4.3.7 节 “从卷组中删除物理卷”。
要创建使用卷组中具体物理卷分配的逻辑卷,请在 lvcreate 命令行的末端指定物理卷或多个物理卷。下面的命令在卷组 testvg 中创建名为 testlv 的逻辑卷,将其分配到物理卷 /dev/sdg1 中。
# lvcreate -L 1500 -ntestlv testvg /dev/sdg1
可指定逻辑卷使用的物理卷扩展。下面的示例中使用卷组 testvg 中的物理卷 /dev/sda1 的扩展 0 到 24 和物理卷 /dev/sdb1 扩展 50 到 124 创建线性逻辑卷。
# lvcreate -l 100 -n testlv testvg /dev/sda1:0-24 /dev/sdb1:50-124
下面的示例使用物理卷 /dev/sda1 的扩展 0 到 25 创建线性逻辑卷,然后继续从扩展 100 开始布设逻辑卷。
# lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-
如何扩展逻辑卷的默认策略是采用 inherit 分配,它在卷组中应用相同的策略。可使用 lvchange 命令更改这些策略。有关分配策略的详情,请查看 第 4.3.1 节 “创建卷组”。
4.4.2. 创建条带卷
如果有大量连续读、写操作,创建条带逻辑卷可提高数据 I/O 的效率。有关条带卷的常规信息,请查看 第 2.3.2 节 “条带逻辑卷”。
创建条带逻辑卷时,可使用 lvcreate 命令的 -i 参数指定条带数。这样就决定了逻辑卷会在多少物理卷之间形成条带。条带数不能超过该卷组中的物理卷数(除非使用 --alloc anywhere 参数)。
如果组成逻辑卷的底层物理设备大小不同,则最大的条带卷是由最小的底层设备决定。例如:在有两个分支的条带中,条带卷大小不能超过较小设备的两倍。在有三个分支的条带中,条带卷大小不能超过最小设备的三倍。
下面的命令在两个物理卷之间创建条带逻辑卷,条带大小为 64kB。该逻辑卷为 50GB,名为 gfslv,并从中创建卷组 vg0。
# lvcreate -L 50G -i 2 -I 64 -n gfslv vg0
可使用线性卷指定用于该条带的物理卷。下面的命令创建大小为 100 扩展的条带卷,该条带跨两个物理卷,名为 stripelv,位于卷组 testvg 中。该条带使用 /dev/sda1 的扇区 0-49,以及 /dev/sdb1 的扇区 50-99。
# lvcreate -l 100 -i 2 -nstripelv testvg /dev/sda1:0-49 /dev/sdb1:50-99
Using default stripesize 64.00 KB
Logical volume "stripelv" created
4.4.3. RAID 逻辑卷
LVM 支持 RAID1/4/5/6/10。
注意
集群无法识别 RAID 逻辑卷。由于只可在一台机器中创建并激活 RAID 逻辑卷,因此无法在一台以上的机器中同时激活它们。如果需要费独占镜像卷,则必须使用 mirror 片段类型创建卷,如 第 4.4.4 节 “创建镜像卷” 所述。
可使用 lvcreate 命令的 --type 参数指定 raid 类型,以便创建 RAID 逻辑卷。可能的 RAID 片段类型如 表 4.1 “RAID 片段类型” 所述。
表 4.1. RAID 片段类型
片段类型 |
描述 |
||
raid1 |
RAID1 镜像。这是在指定 -m 但没有指定条带时,lvcreate 命令 --type 参数的默认值。 |
||
raid4 |
RAID2 专用奇偶磁盘 |
||
raid5 |
同 raid5_ls |
||
raid5_la |
|
||
raid5_ra |
|
||
raid5_ls |
|
||
raid5_rs |
|
||
raid6 |
同 raid6_zr |
||
raid6_zr |
|
||
raid6_nr |
|
||
raid6_nc |
|
||
raid10 |
|
对大多数用户来说,指定五个主要类型(raid1、raid4、raid5、raid6、raid10)之一应该就足够了。有关 RAID5/6 所使用的不同算法的详情,请查看《通用 RAID 磁盘数据格式规格》一书中的第四章,网址为:http://www.snia.org/sites/default/files/SNIA_DDF_Technical_Position_v2.0.pdf。
创建 RAID 逻辑卷时,LVM 会为每个数据生成大小为 1 个扩展的元数据子卷,或在阵列中生成奇偶校验子卷。例如:生成双向 RAID1 阵列可得到两个元数据子卷(即 lv_rmeta_0 和 lv_rmeta_1)和两个数据子卷(lv_rimage_0 和 lv_rimage_1)。同样,创建三向条带(加上一个隐式奇偶校验设备)RAID4 得到四个元数据子卷(lv_rmeta_0、lv_rmeta_1、lv_rmeta_2 和 lv_rmeta_3)及四个数据子卷(lv_rimage_0、lv_rimage_1、lv_rimage_2 和 lv_rimage_3)。
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的双向 RAID1 阵列。
# lvcreate --type raid1 -m 1 -L 1G -n my_lv my_vg
可根据指定的 -m 参数值使用不同副本数创建 RAID1 阵列。同样,可使用 -i argument 选项为 RAID4/5/6 逻辑卷指定条带数。还可以使用 -I 参数指定条带大小。
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的 RAID5 阵列(三个条带 + 一个隐式奇偶校验驱动器)。注:指定要在 LVM 条带卷中的条带数,会自动添加奇偶校验驱动器的正确数字。
# lvcreate --type raid5 -i 3 -L 1G -n my_lv my_vg
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的 RAID6 阵列(三个条带 + 两个隐式奇偶校验驱动器)。
# lvcreate --type raid6 -i 3 -L 1G -n my_lv my_vg
使用 LVM 创建 RAID 逻辑卷后,可如同其他 LVM 逻辑卷一样激活、更改、删除、显示并使用该卷。
创建 RAID10 逻辑卷后,初始化附带 sync 操作逻辑卷所需的后台 I/O 会将其他 I/O 操作挤入 LVM 设备,比如卷组元数据更新,特别是在创建很多 RAID 逻辑卷时。这样会导致其他 LVM 操作变缓。
可使用恢复限制控制 RAID 逻辑卷初始化的比例。通过使用 lvcreate 命令的 --minrecoveryrate 和 --maxrecoveryrate 选项设定那些操作的最小和最大 I/O 比例控制 sync 操作的执行比例。可按以下方法指定这些选项。
--maxrecoveryrate Rate[bBsSkKmMgG]
为 RAID 逻辑卷设定最大恢复比例,以便其不会排挤正常 I/O 操作。将 Rate 指定为该阵列中每个设备的每秒恢复数量。如果没有给出后缀,则假设使用 kiB/sec/device。将恢复比例设定为 0 的含义是不绑定。
--minrecoveryrate Rate[bBsSkKmMgG]
为 RAID 逻辑卷设定最小恢复比例,这样可以保证即使有很多正常 I/O 操作,sync 操作的 I/O 也可达到最小的吞吐量。将 Rate 指定为阵列中的每台设备的每秒恢复量。如果没有给出后缀,则假设为 kiB/sec/device。
下面的命令使用大小为 10GB 的三个条带创建一个双向 RAID10 阵列,其最大恢复比例为 128 kiB/sec/device。这个阵列名为 my_lv,位于卷组 my_vg 。
lvcreate --type raid10 -i 2 -m 1 -L 10G --maxrecoveryrate 128 -n my_lv my_vg
还可为 RAID 擦除操作指定最小和最大恢复比例。有关 RAID 擦除的详情,请查看 第 4.4.3.7.4 节 “擦除 RAID 逻辑卷”。
下面各小节论述了可在 LVM RAID 设备中执行的管理任务:
第 4.4.3.1 节 “将线性设备转换为 RAID 设备”
第 4.4.3.2 节 “将 LVM RAID1 逻辑卷转换为 LVM 线性逻辑卷”
第 4.4.3.3 节 “将镜像 LVM 卷转换为 RAID1 设备”
第 4.4.3.4 节 “更改现有 RAID1 设备中的映像数”
第 4.4.3.5 节 “将 RAID 映像拆分为独立的逻辑卷”
第 4.4.3.6 节 “拆分及合并 RAID 映象”
第 4.4.3.7 节 “设定 RAID 错误策略”
第 4.4.3.7.3 节 “替换 RAID 设备”
第 4.4.3.7.4 节 “擦除 RAID 逻辑卷”
第 4.4.3.7.5 节 “控制 RAID 逻辑卷中的 I/O 操作”
4.4.3.1. 将线性设备转换为 RAID 设备
可使用 lvconvert 命令的 --type 参数将现有线性逻辑卷转换为 RAID 设备。
使用下面的命令可将卷组 my_vg 中的线性逻辑卷 my_lv 转换为双向 RAID1 阵列。
# lvconvert --type raid1 -m 1 my_vg/my_lv
因为 RAID 逻辑卷由元数据及数据子卷对组成,当将线性设备转换为 RAID1 阵列时,会创建新的元数据子卷,并与该线性卷所在物理卷相同的原始逻辑卷(之一)关联。会将该附加映像添加到元数据/数组子卷对中。例如:如果原始设备如下:
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv /dev/sde1(0)
转换为双向 RAID1 阵列后,该设备包含以下数据和元数据子卷对:
# lvconvert --type raid1 -m 1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 6.25 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(0)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(256)
[my_lv_rmeta_1] /dev/sdf1(0)
如果与原始逻辑卷配对的元数据映像无法放到同一物理卷中,则 lvconvert 会失败。
4.4.3.2. 将 LVM RAID1 逻辑卷转换为 LVM 线性逻辑卷
使用 lvconvert 命令的 -m0 参数可将现有 RAID2 LVM 逻辑卷转换为 LVM 现有逻辑卷。这样会删除所有 RAID 数据子卷,及组成 RAID 阵列的所有 RAID 元数据子卷,让顶层 RAID2 映像保留为线性逻辑卷。
下面的示例显示现有 LVM RAID1 逻辑卷。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
下面的命令将 LVM RAID1 逻辑卷 my_vg/my_lv 转换为 LVM 线性设备。
# lvconvert -m0 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv /dev/sde1(1)
将 LVM RAID1 逻辑卷转换为 LVM 线性卷时,可指定要删除的物理卷。下面的示例显示组成两个映像的 LVM RAID1 逻辑卷布局:/dev/sda1 和 /dev/sda2。在这个示例中,lvconvert 命令指定要删除 /dev/sda1,保留 /dev/sdb1 作为组成线性设备的物理卷。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdb1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdb1(0)
# lvconvert -m0 my_vg/my_lv /dev/sda1
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv /dev/sdb1(1)
4.4.3.3. 将镜像 LVM 卷转换为 RAID1 设备
可使用 lvconvert 命令的 --type raid1 参数将现有使用 mirror 片段类型的镜像 LVM 设备转换为 RAID1 LVM 设备。这样会将该镜像子卷(*_mimage_*)重命名为 RAID 子卷(*_rimage_*)。此外,会删除该镜像日志,并在同一物理卷中为数据子卷创建元数据子卷(*_rmeta_*)作为对应的数据子卷。
下面的示例显示镜像逻辑卷 my_vg/my_lv 的布局。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 15.20 my_lv_mimage_0(0),my_lv_mimage_1(0)
[my_lv_mimage_0] /dev/sde1(0)
[my_lv_mimage_1] /dev/sdf1(0)
[my_lv_mlog] /dev/sdd1(0)
下面的命令将镜像逻辑卷 my_vg/my_lv 转换为 RAID1 逻辑卷。
# lvconvert --type raid1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(0)
[my_lv_rimage_1] /dev/sdf1(0)
[my_lv_rmeta_0] /dev/sde1(125)
[my_lv_rmeta_1] /dev/sdf1(125)
4.4.3.4. 更改现有 RAID1 设备中的映像数
可与更改之前的 LVM 镜像部署中的映像数一样更改现有 RAID1 阵列的映像数,方法是使用 lvconvert 命令指定要添加或删除的额外元数据/数据子卷对。有关在之前的 LVM 镜像实施中更改卷配置的详情,请查看 第 4.4.4.4 节 “更改镜像卷配置”。
使用 lvconvert 命令在 RAID1 设备中添加映像时,可为得到的设备指定映像总数,或指定要在该设备中添加多少映像。还可自选指定新元数据/数据映像对所在物理卷。
元数据子卷(名为 *_rmeta_*)总是位于其数据子卷副本(*_rimage_*)所在的同一物理设备中。不会在该 RAID 阵列中的另一个元数据/数据子卷对所在的同一物理卷中创建该元数据/数据子卷对(除非指定 --alloc anywhere 选项)。
在 RAID1 卷中添加映像命令的格式如下:
lvconvert -m new_absolute_count vg/lv [removable_PVs]
lvconvert -m +num_additional_images vg/lv [removable_PVs]
例如:下面内容中的 LVM 设备 my_vg/my_lv 是一个双向 RAID1 阵列:
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 6.25 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(0)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(256)
[my_lv_rmeta_1] /dev/sdf1(0)
下面的命令将双向 RAID 1 设备 my_vg/my_lv 转换为三向 RAID1 设备:
# lvconvert -m 2 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 6.25 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sde1(0)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sde1(256)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
在 RAID1 阵列添加映像时,可指定使用该映像的物理卷。下面的命令将双向 RAID1 设备 my_vg/my_lv 转换为三向 RAID1 设备,指定该阵列使用物理卷 /dev/sdd1:
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 56.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdb1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdb1(0)
# lvconvert -m 2 my_vg/my_lv /dev/sdd1
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 28.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdb1(1)
[my_lv_rimage_2] /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdb1(0)
[my_lv_rmeta_2] /dev/sdd1(0)
可使用下面的命令从 RAID1 阵列删除映像。使用 lvconvert 命令从 RAID1 设备中删除映像时,可为得到的设备指定映像总数,或者可指定要从该设备中删除多少映像。还可以自选指定要从中删除该设备的物理卷。
lvconvert -m new_absolute_count vg/lv [removable_PVs]
lvconvert -m -num_fewer_images vg/lv [removable_PVs]
另外,删除某个映像机器关联的元数据子卷后,数字较高的映像会降低以填入该插槽。如果要从一个由 lv_rimage_0、lv_rimage_1 和 lv_rimage_2 组成的三向 RAID1 阵列中删除 lv_rimage_1,得到的 RAID1 阵列由 lv_rimage_0 和 lv_rimage_1 组成。该子卷 lv_rimage_2 会重新命名,并接管空白的插槽,使其成为 lv_rimage_1。
下面的示例演示三向 RAID1 逻辑卷 my_vg/my_lv 的布局。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
下面的命令将三向 RAID1 逻辑卷转换为双向 RAID1 逻辑卷。
# lvconvert -m1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
下面的命令将三向 RAID1 逻辑卷转换为双向 RAID1 逻辑卷,指定包含删除为 /dev/sde1 映象的物理卷。
# lvconvert -m1 my_vg/my_lv /dev/sde1
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sdf1(1)
[my_lv_rimage_1] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sdf1(0)
[my_lv_rmeta_1] /dev/sdg1(0)
4.4.3.5. 将 RAID 映像拆分为独立的逻辑卷
可拆分 RAID 逻辑卷映像,以便组成新的逻辑卷。这个拆分 RAID 映像的过程与拆分镜像逻辑卷冗余映像的过程一样,如 第 4.4.4.2 节 “拆分镜像逻辑卷的冗余映象” 所述。
拆分 RAID 映像的命令格式如下:
lvconvert --splitmirrors count -n splitname vg/lv [removable_PVs]
与从现有 RAID1 逻辑卷中删除 RAID 映像一样(如 第 4.4.3.4 节 “更改现有 RAID1 设备中的映像数” 所述),从该设备中间删除 RAID 数据子卷(及其关联元数据子卷)时,所有较高编号的映像都会向下填入该槽。因此组成 RAID 阵列的逻辑卷索引号不会破坏其整数顺序。
注意
如果该 RAID1 阵列未同步则无法拆分 RAID 映像。
下面的示例演示了如何将双向 RAID1 逻辑卷 my_lv 拆分为两个线性逻辑卷 my_lv 和 new。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 12.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
# lvconvert --splitmirror 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv /dev/sde1(1)
new /dev/sdf1(1)
下面的示例演示了如何将三向 RAID1 逻辑卷 my_lv 拆分为一个双向逻辑卷 my_lv 和一个线性逻辑卷 new。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
# lvconvert --splitmirror 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
new /dev/sdg1(1)
4.4.3.6. 拆分及合并 RAID 映象
可与 lvconvert 命令的 --splitmirrors 参数联合使用 --trackchanges 参数临时拆分 RAID1 阵列,同时跟踪所有变更。这样可稍后将该映象合并回该阵列,同时只重新同步那些将该映象拆分后阵列有变化的部分。
lvconvert 命令拆分 RAID 映象的格式如下。
lvconvert --splitmirrors count --trackchanges vg/lv [removable_PVs]
使用 --trackchanges 参数拆分 RAID 映象时,可指定要拆分的映象,但不能更改要拆分的卷名称。另外,得到的卷有以下限制。
所创建新卷为只读。
无法重新定义新卷大小。
无法重新命名剩余阵列。
无法重新定义剩余的阵列大小。
可单独激活新卷及剩余的阵列。
可通过随后执行附带 --merge 参数的 lvconvert 命令指定 --trackchanges 参数,以合并拆分的映象。合并该映象时,只重新同步拆分该映象后更改的那部分阵列。
合并 RAID 映象的 lvconvert 命令格式如下。
lvconvert --merge raid_image
下面的示例创建了一个 RAID1 逻辑卷,然后从该卷中拆分出一个映象,同时跟踪剩余阵列的变化。
# lvcreate --type raid1 -m 2 -L 1G -n my_lv .vg
Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sdb1(1)
[my_lv_rimage_1] /dev/sdc1(1)
[my_lv_rimage_2] /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sdb1(0)
[my_lv_rmeta_1] /dev/sdc1(0)
[my_lv_rmeta_2] /dev/sdd1(0)
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
my_lv_rimage_2 split from my_lv for read-only purposes.
Use 'lvconvert --merge my_vg/my_lv_rimage_2' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sdb1(1)
[my_lv_rimage_1] /dev/sdc1(1)
my_lv_rimage_2 /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sdb1(0)
[my_lv_rmeta_1] /dev/sdc1(0)
[my_lv_rmeta_2] /dev/sdd1(0)
下面的示例演示了从 RAID1卷中拆分出一个映象,同时追踪剩余阵列的变化,然后将该卷合并回该阵列。
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
lv_rimage_1 split from my_lv for read-only purposes.
Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sdc1(1)
my_lv_rimage_1 /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sdc1(0)
[my_lv_rmeta_1] /dev/sdd1(0)
# lvconvert --merge my_vg/my_lv_rimage_1
my_vg/my_lv_rimage_1 successfully merged back into my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sdc1(1)
[my_lv_rimage_1] /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sdc1(0)
[my_lv_rmeta_1] /dev/sdd1(0)
从 RAID1 卷中拆分出映象后,再次运行 lvconvert --splitmirrors 命令,即重复最初用来拆分该映象的 lvconvert 命令,但不指定 --trackchanges 参数,即可永久获得该拆分。这样会破坏 --trackchanges 参数生成的链接。
使用 --trackchanges 参数拆分映象后,则无法在那个阵列中继续使用 lvconvert --splitmirrors 命令,除非要永久拆分所跟踪的映象。
下面的一系列命令可拆分映象,并跟踪该映象,然后永久拆分那个跟踪的映象。
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
my_lv_rimage_1 split from my_lv for read-only purposes.
Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvconvert --splitmirrors 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv /dev/sdc1(1)
new /dev/sdd1(1)
注:但以下命令系列会失败。
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
my_lv_rimage_1 split from my_lv for read-only purposes.
Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
Cannot track more than one split image at a time
同样,下面的命令系列也会失败,因为拆分的映象不是跟踪的映象。
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
my_lv_rimage_1 split from my_lv for read-only purposes.
Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sdc1(1)
my_lv_rimage_1 /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sdc1(0)
[my_lv_rmeta_1] /dev/sdd1(0)
# lvconvert --splitmirrors 1 -n new my_vg/my_lv /dev/sdc1
Unable to split additional image from my_lv while tracking changes for my_lv_rimage_1
4.4.3.7. 设定 RAID 错误策略
LVM RAID 根据 lvm.conf 文件中 raid_fault_policy 字段所定义的属性,以自动方式处理设备失败。
如果将 raid_fault_policy 字段设定为 allocate,则系统会尝试使用该卷组中的可用设备替换失败的设备。如果没有可用的剩余设备,则会在系统日志中记录。
如果将 raid_fault_policy 字段设定为 warn,则该系统会生成警告,并在日志中记录该设备已失败。这样可让用户决定要采取的行动。
只要有足够的设备可供使用,RAID 逻辑卷就会继续运行。
4.4.3.7.1. allocate RAID 错误策略
在下面的示例中,已在 lvm.conf 文件中将 raid_fault_policy 字段设定为 allocate。RAID 逻辑卷的布局如下。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
如果 /dev/sde 设备失败,则系统日志中会显示出错信息。
# grep lvm /var/log/messages
Jan 17 15:57:18 bp-01 lvm[8599]: Device #0 of raid1 array, my_vg-my_lv, has failed.
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
250994294784: Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
250994376704: Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at 0:
Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
4096: Input/output error
Jan 17 15:57:19 bp-01 lvm[8599]: Couldn't find device with uuid
3lugiV-3eSP-AFAR-sdrP-H20O-wM2M-qdMANy.
Jan 17 15:57:27 bp-01 lvm[8599]: raid1 array, my_vg-my_lv, is not in-sync.
Jan 17 15:57:36 bp-01 lvm[8599]: raid1 array, my_vg-my_lv, is now in-sync.
因为已将 raid_fault_policy 字段设定为 allocate,因此会使用该卷组中的新设备替换失败的设备。
# lvs -a -o name,copy_percent,devices vg
Couldn't find device with uuid 3lugiV-3eSP-AFAR-sdrP-H20O-wM2M-qdMANy.
LV Copy% Devices
lv 100.00 lv_rimage_0(0),lv_rimage_1(0),lv_rimage_2(0)
[lv_rimage_0] /dev/sdh1(1)
[lv_rimage_1] /dev/sdf1(1)
[lv_rimage_2] /dev/sdg1(1)
[lv_rmeta_0] /dev/sdh1(0)
[lv_rmeta_1] /dev/sdf1(0)
[lv_rmeta_2] /dev/sdg1(0)
注:即使已替换设备的设备,但在显示中仍表示 LVM 无法找到失败的设备。这是因为虽然已从 RAID 逻辑卷中删除那个失败的设备,但尚未从该卷组中删除该设备。要从卷组中删除设备的设备,请运行 vgreduce --removemissing VG。
如果已将 raid_fault_policy 设定为 allocate,但没有剩余的设备,则分配会设备,并让该逻辑卷保持此状态。如果分配失败,则需要修复确定当前,然后停用并重新激活该逻辑卷,如 第 4.4.3.7.2 节 “警告 RAID 出错策略” 所述。另外,还可以替换设备的设备,如 第 4.4.3.7.3 节 “替换 RAID 设备” 所述。
4.4.3.7.2. 警告 RAID 出错策略
在下面的示例中,已将 lvm.conf 文件中的 raid_fault_policy 字段设定为 warn。该 RAID 逻辑卷的布局如下。
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sdh1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sdh1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
如果 /dev/sdh 设备失败,则系统日志中会显示出错信息。但在这种情况下,LVM 不会通过替换映象之一尝试自动修复该 RAID 设备。反之,如果该设备失败,则会使用 lvconvert 命令的 --repair 参数替换失败的设备,如下所示。
# lvconvert --repair my_vg/my_lv
/dev/sdh1: read failed after 0 of 2048 at 250994294784: Input/output error
/dev/sdh1: read failed after 0 of 2048 at 250994376704: Input/output error
/dev/sdh1: read failed after 0 of 2048 at 0: Input/output error
/dev/sdh1: read failed after 0 of 2048 at 4096: Input/output error
Couldn't find device with uuid fbI0YO-GX7x-firU-Vy5o-vzwx-vAKZ-feRxfF.
Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
# lvs -a -o name,copy_percent,devices my_vg
Couldn't find device with uuid fbI0YO-GX7x-firU-Vy5o-vzwx-vAKZ-feRxfF.
LV Copy% Devices
my_lv 64.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sde1(1)
[my_lv_rimage_1] /dev/sdf1(1)
[my_lv_rimage_2] /dev/sdg1(1)
[my_lv_rmeta_0] /dev/sde1(0)
[my_lv_rmeta_1] /dev/sdf1(0)
[my_lv_rmeta_2] /dev/sdg1(0)
注:即使已替换设备的设备,但在显示中仍表示 LVM 无法找到失败的设备。这是因为虽然已从 RAID 逻辑卷中删除那个失败的设备,但尚未从该卷组中删除该设备。要从卷组中删除设备的设备,请运行 vgreduce --removemissing VG。
如果该设备失败是一个瞬时失败,或者您可以修复失败的设备,则可以使用 lvchange 命令的 --refresh 选项开始修复失败的设备。以前是需要停用然后再重新激活该逻辑卷。
使用下面的命令刷新逻辑卷。
# lvchange --refresh my_vg/my_lv
4.4.3.7.3. 替换 RAID 设备
RAID 与传统的 LVM 镜像不同。LVM 镜像需要删除失败的设备,否则镜像逻辑卷会挂起。RAID 阵列可在有失败设备的情况下继续运行。事实上,在 RAID1 以外的 RAID 类型中,删除某个设备可能意味着转换为低级 RAID(例如:从 RAID6 转换为 RAID5,或者从 RAID4 或者 RAID5 转换为 RAID0)。因此,与其无条件删除失败的设备并可能会分配一个替换的设备,LVM 允许您使用 lvconvert 命令的 --replace 参数一步到位地替换 RAID 卷中的设备。
lvconvert --replace 命令的格式如下。
lvconvert --replace dev_to_remove vg/lv [possible_replacements]
下面的示例创建 RAID1 逻辑卷,然后替换那个卷中的一个设备。
# lvcreate --type raid1 -m 2 -L 1G -n my_lv my_vg
Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sdb1(1)
[my_lv_rimage_1] /dev/sdb2(1)
[my_lv_rimage_2] /dev/sdc1(1)
[my_lv_rmeta_0] /dev/sdb1(0)
[my_lv_rmeta_1] /dev/sdb2(0)
[my_lv_rmeta_2] /dev/sdc1(0)
# lvconvert --replace /dev/sdb2 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 37.50 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sdb1(1)
[my_lv_rimage_1] /dev/sdc2(1)
[my_lv_rimage_2] /dev/sdc1(1)
[my_lv_rmeta_0] /dev/sdb1(0)
[my_lv_rmeta_1] /dev/sdc2(0)
[my_lv_rmeta_2] /dev/sdc1(0)
下面的示例创建 RAID1 逻辑卷,然后替换那个卷中的设备,指定用来进行替换的物理卷。
# lvcreate --type raid1 -m 1 -L 100 -n my_lv my_vg
Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdb1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdb1(0)
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 my_vg lvm2 a-- 1020.00m 916.00m
/dev/sdb1 my_vg lvm2 a-- 1020.00m 916.00m
/dev/sdc1 my_vg lvm2 a-- 1020.00m 1020.00m
/dev/sdd1 my_vg lvm2 a-- 1020.00m 1020.00m
# lvconvert --replace /dev/sdb1 my_vg/my_lv /dev/sdd1
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 28.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdd1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdd1(0)
可指定多个 replace 参数一次替换多个 RAID 设备,如下所示。
# lvcreate --type raid1 -m 2 -L 100 -n my_lv my_vg
Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdb1(1)
[my_lv_rimage_2] /dev/sdc1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdb1(0)
[my_lv_rmeta_2] /dev/sdc1(0)
# lvconvert --replace /dev/sdb1 --replace /dev/sdc1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
LV Copy% Devices
my_lv 60.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
[my_lv_rimage_0] /dev/sda1(1)
[my_lv_rimage_1] /dev/sdd1(1)
[my_lv_rimage_2] /dev/sde1(1)
[my_lv_rmeta_0] /dev/sda1(0)
[my_lv_rmeta_1] /dev/sdd1(0)
[my_lv_rmeta_2] /dev/sde1(0)
注意
使用 lvconvert --replace 命令指定替换启动器时,永远不要使用阵列中已经使用的驱动器分配替换驱动器。例如:lv_rimage_0 和 lv_rimage_1 不应位于同一物理卷中。
4.4.3.7.4. 擦除 RAID 逻辑卷
LVM 为 RAID 逻辑卷提供擦除支持。RAID 擦除是读取某个阵列中的所有数据及奇偶校验块,检查其是否一致的过程。
使用 lvchange 命令的 --syncaction 选项启动 RAID 擦除操作。可指定 check 或者 repair 操作。check 操作针对该阵列,并记录阵列中的差异数字,但不会修复。repair 操作会修正发现的差异。
擦除 RAID 逻辑卷的命令格式如下:
lvchange --syncaction {check|repair} vg/raid_lv
注意
lvchange --syncaction repair vg/raid_lv 操作不执行与 lvconvert --repair vg/raid_lv 操作相同的功能。lvchange --syncaction repair 操作中该阵列中启动一个后台同步操作,同时 lvconvert --repair 操作旨在修复/替换镜像或 RAID 逻辑卷中失败的设备。
为支持新 RAID 擦除操作,lvs 命令现在支持两种新的可输出字段:raid_sync_action 和 raid_mismatch_count。默认不会输出这些字段。可在 lvs 命令中指定 -o 参数以显示这些字段,如下。
lvs -o +raid_sync_action,raid_mismatch_count vg/lv
raid_sync_action 字段显示该 RAID 卷目前正在进行的同步操作。它可以是以下值之一:
idle:已完成所有同步操作(什么也不做)
resync:初始化阵列或在机器失败后恢复
recover:替换阵列中的设备
check:查找阵列不一致的地方
repair:查找并修复阵列不一致的地方
raid_mismatch_count 字段显示 check 操作中找到的差异。
lvs 命令的 Cpy%Sync 字段现在输出 raid_sync_action 操作的过程,其中包括 check 和 repair。
lvs 命令的 lv_attr 字段显示目前可在 RAID 擦除操作支持中提供额外的识别符。这个字段的字节 9 显示逻辑卷是否正常工作,它现在支持以下识别符。
(m(不匹配)表示在 RAID 逻辑卷中存在差异。如果擦除操作探测到 RAID 的部分有不一致的情况后会显示这个字符。
(r(刷新))表示阵列中的设备已经失败,且内核将其视为失败,即使 LVM 可读取该设备标签,并将其视为可操作。该逻辑卷应该可以刷新以通知内核该设备现在可用;也可以在怀疑该设备失败后将其替换。
有关 lvs 命令的详情,请查看 第 4.8.2 节 “对象选择”。
执行 RAID 擦除操作时,sync(同步)操作要求的后台 I/O 会被 LVM 设备的其他操作挤掉,比如更新到卷组元数据。这样可能会造成其他 LVM 操作变慢。您可以通过设定恢复限制控制 RAID 逻辑卷的擦除比例。
可通过为 lvchange 命令的 --minrecoveryrate 或 --maxrecoveryrate 选项设定 sync 操作的最小和最大 I/O 比例,控制该操作比例。可按照以下方式指定这些选项。
--maxrecoveryrate Rate[bBsSkKmMgG]
为 RAID 逻辑卷设定最大恢复比例,以便其不会排挤正常 I/O 操作。将 Rate 指定为该阵列中每个设备的每秒恢复数量。如果没有给出后缀,则假设使用 kiB/sec/device。将恢复比例设定为 0 的含义是不绑定。
--minrecoveryrate Rate[bBsSkKmMgG]
设定 RAID 逻辑卷的最小恢复比例,保证 sync 操作取得最小吞吐量,即使有大量常规 I/O。以阵列中的每个设备的每秒数量为单位指定 Rate。如果没有给出后缀,则假设使用 kiB/sec/device。
4.4.3.7.5. 控制 RAID 逻辑卷中的 I/O 操作
可使用 lvchange 命令的 --writemostly 和 --writebehind 参数为 RAID1 逻辑卷中的设备控制 I/O 操作。
--[raid]writemostly PhysicalVolume[:{t|y|n}]
将 RAID1 逻辑卷中的设备标记为 write-mostly。除非必要,应避免读取这些驱动器。设定这个参数以保证该驱动器的最小 I/O 操作数。默认行为是为了解决在指定的物理卷设定 write-mostly 刷新。可在该物理卷中附加 :n 删除 write-mostly 标记。在单一命令中可多次指定 write-mostly 参数,使其可以一次为逻辑卷中的所有物理卷触发 write-mostly 属性。
--[raid]writebehind IOCount
指定 RAID1 逻辑卷中设备允许的最大未完成写入数,将其标记为 write-mostly。超过此数值后,写入变为同步,导致所有对组成设备的写入会在阵列发出完成写入信号前完成。将该值设定为 0 会清除该属性,并允许该系统随机选择该值。
4.4.4. 创建镜像卷
从 Red Hat Enterprise Linux 7.0 发行本开始,LVM 支持 RAID 1/4/5/6/10,如 第 4.4.3 节 “RAID 逻辑卷” 所述。集群无法识别 RAID 逻辑卷。虽然可只在一台机器中创建并激活 RAID 逻辑卷,也可以同时在一台以上机器中激活它们。如果需要非独占镜像卷,则必须使用 mirror 片段类型创建卷,如本小节所述。
注意
有关使用 mirror 片段类型将现有 LVM 设备转换为 RAID1 LVM 设备的详情,请查看 第 4.4.3.3 节 “将镜像 LVM 卷转换为 RAID1 设备”。
集群中的镜像 LVM 逻辑卷
在集群中创建镜像 LVM 逻辑卷的命令和步骤与在单一节点中使用 mirror 片段类型创建镜像 LVM 逻辑卷相同。但要在集群中创建镜像 LVM 卷,则必须运行该集群和集群镜像基础结构,该集群必须处于 quorate 状态,且必须在 lvm.conf 文件中正确设定锁定类型以便启用集群锁定。有关在集群中创建镜像卷的示例,请查看 第 5.5 节 “在集群中创建镜像 LVM 逻辑卷” 。
尝试在集群的多个节点中连续创建并转换多个 LVM 镜像可能会造成这些命令积压。这样会造成需要的操作超时,并进而失败。为避免这个问题,建议只在集群的一个节点中运行创建镜像的命令。
创建镜像卷时,可使用 lvcreate 命令的 -m 参数指定要生成的副本数。指定 -m1 则生成一个镜像,并产生两个文件系统副本:即一个线性逻辑卷外加一个副本。同样,指定 -m2 则生成两个镜像,并生成三个文件系统副本。
下面的命令使用单一镜像创建镜像逻辑卷。该卷大小为 50GB,名为 mirrorlv,是从卷组 vg0 中产生:
# lvcreate --type mirror -L 50G -m 1 -n mirrorlv vg0
LVM 将要复制的设备分成默认为 512KB 大小的区域。可使用 lvcreate 命令的 -R 参数以 MB 为单位指定区域大小。还可以通过编辑 lvm.conf 文件中的 mirror_region_size 设定编辑默认区域大小。
注意
由于集群架构的限制,无法使用默的 512KB 区域大小创建大于 1.5TB 的镜像。需要较大镜像的用户应将该区域大小从默认值调整为较大的值。无法增大区域大小将造成 LVM 创建操作停滞,同时还可能造成其他 LVM 命令挂起。
为超过 1.5TB 的镜像指定区域大小的一般方法是取镜像的 TB 数,并四舍五入到 2 的下一次幂,使用该数字作为 lvcreate 命令的 -R 参数值。例如:如果镜像大小为 1.5TB,则可以指定 -R 2。如果镜像大小为 3TB,则指定 -R 4。如果镜像大小为 5TB,则指定 -R 8。
下面的命令创建区域大小为 2MB 的镜像逻辑卷:
# lvcreate --type mirror -m 1 -L 2T -R 2 -n mirror vol_group
创建镜像后,则会同步镜像区域。对于较大的镜像组件,同步过程可能会较长。创建不需要恢复的新镜像时,可指定 --nosync 参数,表示不需要根据第一个设备初始化同步。
LVM 保留一个小日志以便用来记录那些区域与该镜像或多个镜像同步。默认情况下,这个日志是保存在磁盘中,以便其中重启后仍可用,并保证每次机器重启或崩溃后不需要重新同步该镜像。也可使用 --mirrorlog core 参数指定将该日志保存在内存中,这样就不需要额外的日志设备,但需要每次重启后重新同步整个镜像。
下面的命令在卷组 bigvg 中创建镜像逻辑卷。该逻辑卷名为 ondiskmirvol,有一个单一镜像。该卷大小为 12MB,在内存中保存镜像日志。
# lvcreate --type mirror -L 12MB -m 1 --mirrorlog core -n ondiskmirvol bigvg
Logical volume "ondiskmirvol" created
该镜像日志是在于创建该镜像分支设备不同的设备中创建。但也可以使用 vgcreate 命令的 --alloc anywhere 参数在创建该镜像分支设备的同一设备中创建该镜像日志。这样可能会降低性能,但可让您在只有两个底层设备的情况下创建镜像。
下面的命令在创建镜像分支的同一设备中为单一镜像创建镜像逻辑卷。在这个示例中,卷组 vg0 由两个设备组成。这个命令在卷组 vg0 中创建名为 mirrorlv,大小为 500MB 的卷。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv -alloc anywhere vg0
注意
在集群镜像中,镜像日志管理完全由目前集群 ID 最低的集群节点控制。因此,当存储集群镜像日志的设备在集群的某个子集中不可用时,只要 ID 数最小的集群节点可以访问该集群该日志,则该集群镜像可继续运行,不受任何影响。因为该镜像不会受到影响,因此也不会进行自动修正(修复)。但当 ID 数最低的集群节点无法访问该镜像日志后,则会执行自动操作(无论其他节点是否可以访问该日志)。
要创建自我对称的镜像日志,可指定 --mirrorlog mirrored 参数。下面的命令在卷组 bigvg 中创建镜像逻辑卷。该逻辑卷名为 twologvol,有一个镜像。该卷大小为 12MB,镜像日志为对称的。
# lvcreate --type mirror -L 12MB -m 1 --mirrorlog mirrored -n twologvol bigvg
Logical volume "twologvol" created
与标准镜像日志一样,可以使用 vgcreate 命令的 --alloc anywhere 参数在创建镜像分支的同一设备中创建冗余镜像日志。这样可能会降低性能,但可让您在没有足够底层设备以保证每个设备预期镜像分支处于不同设备的情况下创建冗余镜像日志。
创建镜像后,则会同步镜像区域。对于较大的镜像组件,同步过程可能会较长。创建不需要恢复的新镜像时,可指定 --nosync 参数,表示不需要根据第一个设备初始化同步。
可指定使用镜像分支及日志的设备以及该设备中要使用的扩展。要强制将日志记录在特定磁盘中,可指定保存日志的磁盘具体扩展。LVM 不需要遵守命令行中列出的顺序。如果列出任意物理卷,则只能在该设备中保存日志。列表中列出的已分配物理扩展将被忽略。
下面的命令创建使用单一镜像的镜像逻辑卷,且单一日志为不对称。该卷大小为 500MB,名为 mirrorlv,由卷组 vg0 生成。该镜像的第一个分支位于设备 /dev/sda1,第二个镜像位于设备 /dev/sdb1,而第三个镜像位于设备 /dev/sdc1。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1 /dev/sdb1 /dev/sdc1
下面的命令创建使用单一镜像的镜像逻辑卷。其大小为 500MB,名为 mirrorlv,由卷组 vg0 生成。该镜像的第一个分支位于设备 /dev/sda1 的第 0-499 扩展,第二个分支位于 /dev/sdb1 的第 0-499 扩展,镜像日志起始点为设备 /dev/sdc1 的扩展 0.这些是 1MB 扩展。如果任何指定的扩展已经被分配,则会将其忽略。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1:0-499 /dev/sdb1:0-499 /dev/sdc1:0
注意
可将条带和镜像卷合并为一个逻辑卷。创建逻辑卷的同时指定镜像数(--mirrors X)和条带数(--stripes Y)即可得到一个由条带连续设备组成的镜像设备。
4.4.4.1. 镜像逻辑卷失败策略
您可以使用 mirror_image_fault_policy 和 mirror_log_fault_policy 参数在 lvm.conf 文件的 activation 部分定义逻辑卷在设备失败事件中的行为。将这些参数设定为 activation 后,系统会尝试移除出错的设备,并在没有这些设备的情况下运行。将这些参数设定为 allocate 后,系统会尝试移除出错的设备,并尝试在新设备中分配空间替换失败的设备。如果没有合适的设备,且没有可为替换失败的设备分配的空间,则这个策略与 remove 策略的行为一致。
默认情况下,mirror_log_fault_policy 参数为 allocate。在日志中使用这个策略非常迅速,并可保证在崩溃及重启后可记住同步状态。如果将这个策略设定为 remove,则会在日志设备失败,镜像转而使用内存日志后,该镜像不会记住出现故障和重启后的同步状态,因而会重新同步整个镜像。
默认情况下,mirror_image_fault_policy 参数为 remove。使用这个策略后,如果镜像映象失败,且只还有一个工作的副本,则该镜像会转而使用非镜像设备。为镜像设备将这个策略设定为 allocate 后,则要求该镜像设备重新同步该设备。这样会让过程变缓,但会保留该设备的镜像特征。
注意
LVM 镜像卷有失败的设备时,会进行两个阶段的恢复。第一个阶段包括删除失败的设备。这样可得到成为线性设备的镜像。在第二个阶段中,如果将 mirror_log_fault_policy 参数设定为 allocate,则会尝试替换失败的设备。注:但不保证在第二阶段中会选取之前由该镜像使用,但不是失败设备一部分的设备可用。
从 LVM 镜像失败中手动恢复的详情请查看 第 6.3 节 “恢复 LVM 镜像错误”。
4.4.4.2. 拆分镜像逻辑卷的冗余映象
可拆分镜像逻辑卷的冗余映象以形成新逻辑卷。要拆分映象,可使用 lvconvert 命令的 --splitmirrors 参数,指定要拆分的冗余映象数。必须使用该命令的 --name 参数指定新拆分逻辑卷的名称。
下面的命令从镜像逻辑卷 vg/lv 中拆分名为 copy 的新逻辑卷。新逻辑卷包含两个镜像分支。在这个示例中,LVM 选择要拆分的设备。
# lvconvert --splitmirrors 2 --name copy vg/lv
可指定要拆分的设备。下面的命令从镜像逻辑卷 vg/lv 中拆分名为 copy 的新逻辑卷。这个新逻辑卷包含两个镜像分支,由设备 /dev/sdc1 和 /dev/sde1 组成。
# lvconvert --splitmirrors 2 --name copy vg/lv /dev/sd[ce]1
4.4.4.3. 修复镜像逻辑设备
可使用 lvconvert --repair 命令在磁盘失败后修复镜像。这样可让该镜像返回一致的状态。lvconvert --repair 命令是互动式命令,可提示您确定是否要让该系统尝试替换失败的设备。
可在命令行中指定 -y 选项跳过提示并替换所有失败的设备。
可在命令行中指定 -f 选项跳过提示且不替换任何失败的设备。
可指定 --use-policies 参数使用由 lvm.conf 文件中指定的 mirror_log_fault_policy 和 mirror_device_fault_policy 参数指定的替换策略,以便跳过提示,并仍然为镜像映象及镜像日志指定不同的替换策略。
4.4.4.4. 更改镜像卷配置
可使用 lvconvert 命令增加或减少逻辑卷包含的镜像数。这样可让您将逻辑卷从镜像卷转换为线性卷,或将其从线性卷转换为镜像卷。还可以使用这个命令重新配置现有逻辑卷的其他镜像参数,比如 corelog。
将线性卷转换为镜像卷时,基本上均可为现有卷创建镜像分支。这就是说您的卷组必须包含用于该镜像分支及镜像日志的设备和空间。
如果丢失镜像分支,则 LVM 会将该卷转换为线性卷,以便您可以在没有镜像冗余的情况下访问该卷。替换该分支后,可使用 lvconvert 命令恢复该镜像,如 第 6.3 节 “恢复 LVM 镜像错误” 所述。
下面的命令将线性逻辑卷 vg00/lvol1 转换为镜像逻辑卷。
# lvconvert -m1 vg00/lvol1
下面的命令将镜像逻辑卷 vg00/lvol1 转换为线性逻辑卷,并删除该镜像分支。
# lvconvert -m0 vg00/lvol1
下面的示例在现有逻辑卷 vg00/lvol1 中添加附加镜像分支。这个示例显示使用 lvconvert 命令将该卷改为有两个镜像分支的卷钱、后的卷配置。
# lvs -a -o name,copy_percent,devices vg00
LV Copy% Devices
lvol1 100.00 lvol1_mimage_0(0),lvol1_mimage_1(0)
[lvol1_mimage_0] /dev/sda1(0)
[lvol1_mimage_1] /dev/sdb1(0)
[lvol1_mlog] /dev/sdd1(0)
# lvconvert -m 2 vg00/lvol1
vg00/lvol1: Converted: 13.0%
vg00/lvol1: Converted: 100.0%
Logical volume lvol1 converted.
# lvs -a -o name,copy_percent,devices vg00
LV Copy% Devices
lvol1 100.00 lvol1_mimage_0(0),lvol1_mimage_1(0),lvol1_mimage_2(0)
[lvol1_mimage_0] /dev/sda1(0)
[lvol1_mimage_1] /dev/sdb1(0)
[lvol1_mimage_2] /dev/sdc1(0)
[lvol1_mlog] /dev/sdd1(0)
4.4.5. 创建精简配置逻辑卷
可对逻辑卷进行精简配置。这样就可以让您创建比可用扩展大的逻辑卷。可使用精简配置管理剩余空间的存储池,也称精简池,应用程序可使用该池根据需要分配随机数量的设备。然后可以创建绑定到精简池的设备,以便稍后应用程序实际写入该逻辑卷时分配。该精简池可在需要时动态扩展,以便进行符合成本效益的存储空间分配。
注意
本小节提供用来创建并增大精简配置逻辑卷的基本命令概述。有关 LVM 精简配置详情及使用 LVM 命令和利用精简配置逻辑卷的详情,请查看 lvmthin(7) man page。
注意
在集群的节点间不支持精简卷。该精简池及其所有精简卷必须只在一个集群节点中激活。
请执行以下任务创建精简卷:
使用 vgcreate 命令创建卷组。
使用 lvcreate 命令创建精简池。
使用 lvcreate 命令在精简池中创建精简卷。
可使用 lvcreate 命令的 -T(或者 --thin)选项创建精简池或精简卷。还可以使用 lvcreate 命令的 -T 选项使用单一命令同时在该池中创建精简池和精简卷。
下面的命令使用 lvcreate 命令的 -T 选项创建位于卷组 vg001,名为 mythinpool 的精简池中,大小为 100M。注:因为要创建占用物理空间的池,所以必须指定该池的大小。lvcreate 命令的 -T 选项不会使用参数,它会推理出该命令指定的其他选项所创建的设备类型。
# lvcreate -L 100M -T vg001/mythinpool
Rounding up size to full physical extent 4.00 MiB
Logical volume "mythinpool" created
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
my mythinpool vg001 twi-a-tz 100.00m 0.00
下面的命令使用 lvcreate 命令的 -T 选项在精简池 vg001/mythinpool 中创建名为 thinvolume 的精简卷。注:在这个示例中要指定虚拟卷大小,且为该卷指定的虚拟卷大小要比其所在池要大。
# lvcreate -V 1G -T vg001/mythinpool -n thinvolume
Logical volume "thinvolume" created
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
mythinpool vg001 twi-a-tz 100.00m 0.00
thinvolume vg001 Vwi-a-tz 1.00g mythinpool 0.00
下面的命令使用 lvcreate 命令的 -T 选项在该池中创建一个精简池和一个精简卷,方法是同时指定 lvcreate 的大小和虚拟卷大小参数。这个命令在卷组 vg001 中创建名为 mythinpool 的精简池,还会在该池中创建名为 thinvolume 的精简卷。
# lvcreate -L 100M -T vg001/mythinpool -V 1G -n thinvolume
Rounding up size to full physical extent 4.00 MiB
Logical volume "thinvolume" created
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
mythinpool vg001 twi-a-tz 100.00m 0.00
thinvolume vg001 Vwi-a-tz 1.00g mythinpool 0.00
还可使用 lvcreate 命令的 --thinpool 参数创建精简池。与 -T 选项不同,--thinpool 参数需要给出一个参数,即所要创建精简池逻辑卷的名称。下面的示例指定 lvcreate 命令的 --thinpool 选项创建位于卷组 vg001,大小为 100M,名为 mythinpool 的精简池。
# lvcreate -L 100M --thinpool mythinpool vg001
Rounding up size to full physical extent 4.00 MiB
Logical volume "mythinpool" created
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
mythinpool vg001 twi-a-tz 100.00m 0.00
创建池时支持条带。下面的命令在有两个 64kB 条带及一个 256kB 区块的卷组 vg001 中创建名为 pool,大小为 100M 的精简池。它还会创建一个 1T 精简卷 vg00/thin_lv。
# lvcreate -i 2 -I 64 -c 256 -L 100M -T vg00/pool -V 1T --name thin_lv
可使用 lvextend 命令扩展精简卷的大小。但不能将其减小。
下面的命令可为现有精简池扩充 100M 以重新定义其大小。
# lvextend -L+100M vg001/mythinpool
Extending logical volume mythinpool to 200.00 MiB
Logical volume mythinpool successfully resized
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
mythinpool vg001 twi-a-tz 200.00m 0.00
thinvolume vg001 Vwi-a-tz 1.00g mythinpool 0.00
与其他逻辑卷类型一样,可使用 lvrename 命令重命名该安,使用 lvremove 删除该卷,同时可使用 lvs 和 lvdisplay 命令显示该卷的信息。
默认情况下,lvcreate 根据方程式(Pool_LV_size / Pool_LV_chunk_size * 64)设定精简池元数据逻辑卷的大小。但如果要稍后大幅度增加精简池大小,则应该使用 lvcreate 命令的 --poolmetadatasize 参数增大这个值。精简池的元数据逻辑卷的支持值在 2MiB 到 16GiB 之间。
可使用 lvconvert 命令的 --thinpool 参数将现有逻辑卷转换为精简卷。将现有逻辑卷转换为精简池卷时,必须配合使用 lvconvert 命令的 --thinpool 参数将现有逻辑卷转换为精简池卷的元数据卷。
注意
将逻辑卷转换为精简池卷或精简池元数据卷会破坏该逻辑卷的内容,因为在这个实例中,lvconvert 不会保留设备的内容,而是会覆盖这些内容。
下面的命令将卷组 vg001 中的现有逻辑卷 lv1 转换为精简池卷,并将卷组 vg001 中的现有逻辑卷 lv2 转换为那个精简池卷的元数据卷。
# lvconvert --thinpool vg001/lv1 --poolmetadata vg001/lv2
Converted vg001/lv1 to thin pool.
4.4.6. 创建快照卷
注意
LVM 支持精简配置快照。有关创建精简配置快照卷的详情,请查看 第 4.4.7 节 “创建精简配置快照卷”。
使用 lvcreate 命令的 -s 参数创建快照卷。快照卷是可以写入的。
注意
不支持跨集群节点的 LVM 快照。不能在集群的卷组中创建快照卷。但如果需要在集群的逻辑卷中创建一致的数据备份,则可以独占方式激活该卷,然后创建快照。有关以独占方式在某个节点中激活逻辑卷的详情,请查看 第 4.7 节 “在集群的独立节点中激活逻辑卷”。
注意
镜像逻辑卷支持 LVM 快照。
RAID 逻辑卷支持快照。有关创建 RAID 逻辑卷的详情,请查看 第 4.4.3 节 “RAID 逻辑卷”。
LVM 不允许创建超过原始卷与该卷所需元数据大小之和的快照卷。如果指定的快照卷大小超过此数值,则系统会创建原始卷所需大小的快照卷。
默认情况下,正常激活命令会跳过快照卷。有关控制快照卷激活的详情,请查看 第 4.4.17 节 “控制逻辑卷激活”。
下面的命令创建大小为 100MB,名为 /dev/vg00/snap 的快照逻辑卷。这样会创建名为 /dev/vg00/lvol1 的原始卷的快照。如果原始逻辑卷中包含一个文件系统,则可以在任意目录中挂载该快照逻辑卷,以便访问该文件系统,让原始文件系统继续获得更新的同时运行备份。
# lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1
创建快照逻辑卷后,在 lvdisplay 命令中指定原始卷可生成包括所有快照逻辑卷机器状态(活跃或不活跃)的输出结果。
下面的示例显示逻辑卷 /dev/new_vg/lvol0 的状态,已为其创建快照卷 /dev/new_vg/newvgsnap。
# lvdisplay /dev/new_vg/lvol0
--- Logical volume ---
LV Name /dev/new_vg/lvol0
VG Name new_vg
LV UUID LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
LV Write Access read/write
LV snapshot status source of
/dev/new_vg/newvgsnap1 [active]
LV Status available
# open 0
LV Size 52.00 MB
Current LE 13
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:2
默认情况下,lvs 命令显示原始卷及每个快照卷目前使用的百分比。以下示例显示了系统 lvs 命令的默认输出结果,该系统中包括逻辑卷 /dev/new_vg/lvol0,为其创建的快照为 /dev/new_vg/newvgsnap。
。
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
lvol0 new_vg owi-a- 52.00M
newvgsnap1 new_vg swi-a- 8.00M lvol0 0.20
警告
因为快照的大小随原始卷的变化而变化,常规使用 lvs 命令监控快照卷的百分比,以保证不会满溢就变得很重要。如果快照 100% 填满则会丢失全部数据,因为写入原始卷的未更改部分一定会破坏快照。
除快照本身填满后会失效外,所有那个快照设备中挂载的文件系统都会被强制卸载,以避免访问挂载点时不可避免的文件系统错误。另外,可在 lvm.conf 文件中指定 snapshot_autoextend_threshold 选项。这个选项允许在剩余快照空间低于所设定阈值时可随时自动扩展快照。这个功能要求在卷组中包含尚未分配的空间。
LVM 不允许您创建超过原始元与该卷所需元数据大小总和的快照卷。同样,自动扩展快照也不会将快照卷大小增大为超过该快照所需最大计算大小。快照增长到足以覆盖原始卷后,则不会监控其自动扩展。
设定 lvm.conf 文件本身提供的 snapshot_autoextend_threshold 和 snapshot_autoextend_percent 的详情。有关 lvm.conf 文件的详情,请查看 附录 B, LVM 配置文件。
4.4.7. 创建精简配置快照卷
Red Hat Enterprise Linux 提供精简配置快照卷支持。有关精简快照卷的优点及局限,请参看 第 2.3.6 节 “精简配置快照卷”。
注意
本小节提供用来创建并增大精简配置快照据的基本命令概述。有关 LVM 精简配置的详情,以及在精简配置逻辑卷中使用 LVM 命令及程序的详情,请查看 lvmthin(7) man page。
重要
创建精简快照卷时,不能指定该卷的大小。如果指定 size 参数,所创建快照就不是精简快照卷,也不会使用精简池保存数据。例如:命令 lvcreate -s vg/thinvolume -L10M 不会创建精简快照,即使原始卷是精简卷也不行。
可为精简配置原始卷或非精简配置逻辑卷创建精简快照。
可使用 lvcreate 命令的 --name 选项指定快照卷名称。下面的命令为精简配置逻辑卷 vg001/thinvolume 创建名为 mysnapshot1 的精简配置快照卷。
# lvcreate -s --name mysnapshot1 vg001/thinvolume
Logical volume "mysnapshot1" created
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
mysnapshot1 vg001 Vwi-a-tz 1.00g mythinpool thinvolume 0.00
mythinpool vg001 twi-a-tz 100.00m 0.00
thinvolume vg001 Vwi-a-tz 1.00g mythinpool 0.00
精简快照卷与其他精简卷有同样的特征。您可以单独激活、扩展、重命名、删除该卷,甚至可以为该卷生成快照。
默认情况下,正常激活命令会跳过快照卷。有关控制快照卷激活的详情,请查看 第 4.4.17 节 “控制逻辑卷激活”。
还可以在非精简配置逻辑卷中创建精简配置快照。因为非精简配置逻辑卷不存在于精简池中,因此将其视为外部原始卷。外部原始卷可由很多精简配置快照卷使用并共享,即使这些快照卷来自不同的精简池。创建该精简配置快照时,外部原始卷必须为不活跃卷,且处于只读状态。
要创建外部原始卷的精简配置快照,则必须指定 --thinpool 选项。下面的命令创建只读、不活跃卷 origin_volume 的精简快照卷。该精简快照卷名为 mythinsnap。然后逻辑卷 origin_volume 会成为卷组 vg001 中精简快照卷 mythinsnap 的精简外部原始卷,使用现有精简池 vg001/pool。因为原始卷必须与该快照卷处于同一卷组,因此不需要在指定原始逻辑卷时指定该卷组。
# lvcreate -s --thinpool vg001/pool origin_volume --name mythinsnap
可使用下面的命令创建第一个快照卷的第二个精简配置快照卷。
# lvcreate -s vg001/mythinsnap --name my2ndthinsnap
4.4.8. 合并快照卷
可使用 lvconvert 命令的 --merge 选项将快照合并到其原始卷中。如果原始卷及快照卷都没有打开,则会立即开始合并。否则会在第一次激活原始卷或快照卷,且两者均为关闭状态时开始合并快照。将快照合并到无法关闭的原始卷时,比如 root 文件系统,会延迟到下次激活该原始卷时方才进行。合并开始时,得到的逻辑卷会有原始卷的名称、次要号码及 UUID。在合并过程中,对原始卷的读取或者写入直接指向要合并的快照。合并完成后,则会删除合并的快照。
下面的命令将快照卷 vg00/lvol1_snap 合并到期原始卷中。
# lvconvert --merge vg00/lvol1_snap
可在命令行中指定多个快照,或者使用 LVM 对象标签将多个快照合并到其各自的原始卷中。在下面的示例中,逻辑卷 vg00/lvol1、vg00/lvol2 和 vg00/lvol3 均使用 @some_tag 标记。下面的命令将该快照逻辑卷按顺序合并到所有三个卷中:即 vg00/lvol1,然后 vg00/lvol2,然后 vg00/lvol3。如果使用 --background 选项,所有快照逻辑卷合并操作都应同时开始。
# lvconvert --merge @some_tag
有关标记 LVM 对象的详情,请查看 附录 C, LVM 对象标签。有关 lvconvert --merge 命令的详情,请查看 lvconvert(8) man page。
4.4.9. 永久设备号
载入模块时会动态分配主要和次要设备号。有些应用程序在块设备永远使用同一设备(主要和次要)号激活状态时工作状态最佳。可使用下面的参数,通过 lvcreate 和 lvchange 命令的指定这些内容:
--persistent y --major major --minor minor
使用较大的次要号码以保证尚未将其动态分配给另一个设备。
如果要使用 NFS 导出文件系统,在导出文件中指定 fsid 参数可避免在 LVM 中设定持久设备号。
4.4.10. 重新定义逻辑卷大小
可使用 lvreduce 命令减小逻辑卷大小。如果该逻辑卷包含一个文件系统,请确定首先减小该文件系统(或使用 LVM GUI),以便逻辑卷总是可至少达到文件系统所需要的大小。
下面的命令将卷组 vg00 中逻辑卷 lvol1 大小减小 3 个逻辑扩展。
# lvreduce -l -3 vg00/lvol1
4.4.11. 更改逻辑卷组的参数
可使用 lvchange 命令更改逻辑卷的参数。有关可更改的参数列表,请查看 lvchange(8) man page。
可使用 lvchange 命令激活和停用逻辑卷。可使用 vgchange 命令同时激活和停用卷组中的所有逻辑卷,如 第 4.3.8 节 “更改卷组参数” 所述。
下面的命令将卷组 vg00 中卷 lvol1 的权限改为只读。
# lvchange -pr vg00/lvol1
4.4.12. 重命名逻辑卷
请使用 lvrename 命令重命名现有逻辑卷。
下面的命令将卷组 vg02 中的逻辑卷 lvold 重命名为 lvnew。
# lvrename /dev/vg02/lvold /dev/vg02/lvnew
# lvrename vg02 lvold lvnew
有关在集群的独立节点中激活逻辑卷的详情,请查看 第 4.7 节 “在集群的独立节点中激活逻辑卷”。
4.4.13. 删除逻辑卷
请使用 lvremove 命令删除不活跃的逻辑卷。如果目前未挂载该逻辑卷,请在将其删除前卸载该卷。另外,在集群的环境中必须在将其删除前停用逻辑卷。
下面的命令从卷组 testvg 中删除逻辑卷 /dev/testvg/testlv。注:在此情况下尚未停用该逻辑卷。
# lvremove /dev/testvg/testlv
Do you really want to remove active logical volume "testlv"? [y/n]: y
Logical volume "testlv" successfully removed
使用 lvchange -an 命令删除逻辑卷前,必须明确将其停用,但不会看到让您确定是否要删除某个活跃逻辑卷的提示。
4.4.14. 显示逻辑卷
有三个命令可用来显示 LVM 逻辑卷的属性:lvs、lvdisplay 和 lvscan。
命令 lvs 以可配置格式提供逻辑卷信息,每行显示一个逻辑卷。lvs 命令提供大量格式控制,并在编写脚本时使用。有关使用 lvs 自定义您的输出结果的详情,请查看 第 4.8 节 “LVM 的自定义报告”。
lvdisplay 命令以固定格式显示逻辑卷属性(比如大小、布局及映射)。
下面的命令显示 vg00 中 lvol2 的属性。如果已为这个原始逻辑卷创建快照逻辑卷,这个命令会显示所有快照逻辑卷及其状态(active 或者 inactive)列表。
# lvdisplay -v /dev/vg00/lvol2
lvscan 命令扫描该系统中的所有逻辑卷,并将其列出,如下所示。
# lvscan
ACTIVE '/dev/vg0/gfslv' [1.46 GB] inherit
4.4.15. 扩展逻辑卷
使用 lvextend 命令增加逻辑卷的大小。
扩展逻辑卷后,可指明该卷要扩展的大小,或者将其扩展后该卷应该有多大。
下面的命令将逻辑卷 /dev/myvg/homevol 扩展为 12GB。
# lvextend -L12G /dev/myvg/homevol
lvextend -- extending logical volume "/dev/myvg/homevol" to 12 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended
下面的命令在 /dev/myvg/homevol 逻辑卷中添加另一个 GB。
# lvextend -L+1G /dev/myvg/homevol
lvextend -- extending logical volume "/dev/myvg/homevol" to 13 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended
在 lvcreate 命令中,可使用 lvextend 命令的 -l 参数指定逻辑卷增加的扩展数。还可以使用这个参数指定卷组的百分比,或者卷组中剩余可用空间的百分比。下面的命令将名为 testlv 的逻辑卷扩展为填满卷组 myvg 中的未分配空间。
# lvextend -l +100%FREE /dev/myvg/testlv
Extending logical volume testlv to 68.59 GB
Logical volume testlv successfully resized
扩展逻辑卷后,需要增大文件系统大小以便与其匹配。
默认情况下,大多数文件系统重新定义大小的工具会将该文件系统的大小增加到底层逻辑卷的大小,这样就不需要考虑为每两个命令指定同样的大小。
4.4.15.1. 扩展条带卷
要增大条带逻辑卷的大小,则必须在底层物理卷中有足够的剩余空间,以便组成卷组支持该条带。例如:如果有一个使用整个卷组的双向条带,在该卷组中添加单一物理卷不会让您有扩展该条带的能力,而必须在该卷组中添加至少两个物理卷方可有此能力。
例如:可使用下面的 vgs 命令显示由两个底层物理卷组成的卷组 vg。
# vgs
VG #PV #LV #SN Attr VSize VFree
vg 2 0 0 wz--n- 271.31G 271.31G
使用该卷组中的整个空间数量创建条带。
# lvcreate -n stripe1 -L 271.31G -i 2 vg
Using default stripesize 64.00 KB
Rounding up size to full physical extent 271.31 GB
Logical volume "stripe1" created
# lvs -a -o +devices
LV VG Attr LSize Origin Snap% Move Log Copy% Devices
stripe1 vg -wi-a- 271.31G /dev/sda1(0),/dev/sdb1(0)
注:卷组目前没有剩余空间。
# vgs
VG #PV #LV #SN Attr VSize VFree
vg 2 1 0 wz--n- 271.31G 0
下面的命令在卷组中添加另一个物理卷,之后该卷组就有 135G 附加空间。
# vgextend vg /dev/sdc1
Volume group "vg" successfully extended
# vgs
VG #PV #LV #SN Attr VSize VFree
vg 3 1 0 wz--n- 406.97G 135.66G
此时无法将该条带逻辑卷扩展到卷组的最大大小,因为需要有两个底层设备方可将数据条带化。
# lvextend vg/stripe1 -L 406G
Using stripesize of last segment 64.00 KB
Extending logical volume stripe1 to 406.00 GB
Insufficient suitable allocatable extents for logical volume stripe1: 34480
more required
要扩展条带逻辑卷,需要添加量一个物理卷,然后再扩展该逻辑卷。在这个示例中,在该卷组中添加两个物理卷,即可将该逻辑卷扩展到该卷组的最大大小。
# vgextend vg /dev/sdd1
Volume group "vg" successfully extended
# vgs
VG #PV #LV #SN Attr VSize VFree
vg 4 1 0 wz--n- 542.62G 271.31G
# lvextend vg/stripe1 -L 542G
Using stripesize of last segment 64.00 KB
Extending logical volume stripe1 to 542.00 GB
Logical volume stripe1 successfully resized
如果没有足够的底层物理设备扩展该条带逻辑卷,且扩展不是条带化也没有关系,则也能够扩展该卷,结果是会得到不平衡的性能。在逻辑卷中添加空间时,默认操作是使用与现有逻辑卷最后片段相同的条带参数,但也可以覆盖那些参数。下面的示例扩展现有条带逻辑卷,使用启动 lvextend 命令失败后可用的剩余空间。
# lvextend vg/stripe1 -L 406G
Using stripesize of last segment 64.00 KB
Extending logical volume stripe1 to 406.00 GB
Insufficient suitable allocatable extents for logical volume stripe1: 34480
more required
# lvextend -i1 -l+100%FREE vg/stripe1
4.4.15.2. 扩展 RAID 卷
在不执行新 RAID 区域同步的情况下使用 lvextend 命令增大 RAID 逻辑卷。
使用 lvcreate 命令创建 RAID 逻辑卷时,如果指定 --nosync 选项,则在创建该逻辑卷后不会同步 RAID 区域。如果稍后使用 --nosync 选项扩展已创建的 RAID 逻辑卷,此时也不会同步该 RAID 扩展。
使用 lvs 命令的 --nosync 选项决定是否让已创建的现有逻辑卷显示该卷的属性。如果逻辑卷 attribute 字段第一个字符为“R”,则表示创建该 RAID 卷时没有启用初始同步;如果该字符为“r”,则表示创建时启动初始同步。
下面的命令显示名为 lv 的 RAID 逻辑卷的属性,创建该卷时没有启动同步,attribute 字段的第一个字符为 “R”。该字段的第七个字符为 “r”,代表 RAID 目标类型。有关 attribute 字段的含义,请查看 表 4.4 “lvs 显示字段”。
# lvs vg
LV VG Attr LSize Pool Origin Snap% Move Log Cpy%Sync Convert
lv vg Rwi-a-r- 5.00g 100.00
如果使用 lvextend 命令增大这个逻辑卷,则不会重新同步 RAID 扩展。
如果创建逻辑卷时没有指定 lvcreate 命令的 --nosync 选项,则可以使用 lvextend 命令的 --nosync 选项增大该逻辑卷,且无需重新同步该镜像。
下面的示例扩展了 RAID 逻辑卷,创建该卷时没有使用 --nosync 选项,表示在创建时同步该 RAID 卷。但这个示例中指定在扩展该卷时不要同步。注:该卷有属性 "r",但执行附带 --nosync 选项的 lvextend 命令后,该卷有一个属性 "R"。
# lvs vg
LV VG Attr LSize Pool Origin Snap% Move Log Cpy%Sync Convert
lv vg rwi-a-r- 20.00m 100.00
# lvextend -L +5G vg/lv --nosync
Extending 2 mirror images.
Extending logical volume lv to 5.02 GiB
Logical volume lv successfully resized
# lvs vg
LV VG Attr LSize Pool Origin Snap% Move Log Cpy%Sync Convert
lv vg Rwi-a-r- 5.02g 100.00
如果 RAID 卷为不活跃状态,即使创建该卷时指定了 --nosync 选项,也则不会在扩展该卷时自动跳过同步。反之,会提示您是否要全面创新同步该逻辑卷的扩展部分。
注意
如果 RAID 卷要执行恢复,则在使用 --nosync 选项创建或扩展该卷时不能扩展该逻辑卷。但如果未指定 --nosync 选项,就可以在恢复时扩展该 RAID 卷。
4.4.15.3. 使用 cling 分配策略扩展逻辑卷
可使用 lvextend 命令的 --alloc cling 选项指定 cling 分配策略扩展 LVM 卷。这个策略会在与现有逻辑卷的最后片段所在的同一物理卷中选择空间。如果在该物理卷中没有足够的空间,并在 lvm.conf 文件中定义了一组标签,则 LVM 会检查是否在该物理卷中附加任何标签,并在现有扩展和新扩展之间映射那些物理卷标签。
例如:如果您有逻辑卷是某个单一卷组中两个网站间的镜像,就可以使用 @site1 和 @site2 标签,根据其所在位置标记该物理卷,并在 lvm.conf 文件中指定以下行:
cling_tag_list = [ "@site1", "@site2" ]
有关物理卷标签的详情,请查看 附录 C, LVM 对象标签。
在下面的示例中修改了 lvm.conf 文件使其包含以下行:
cling_tag_list = [ "@A", "@B" ]
同样在此示例中,创建的卷组 taft 由物理卷 /dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1、/dev/sdf1、/dev/sdg1 和 /dev/sdh1 组成。该示例不使用 C 标签,但这样会显示该 LVM 使用标签选择用于镜像分支的物理卷。
# pvs -a -o +pv_tags /dev/sd[bcdefgh]
PV VG Fmt Attr PSize PFree PV Tags
/dev/sdb1 taft lvm2 a-- 15.00g 15.00g A
/dev/sdc1 taft lvm2 a-- 15.00g 15.00g B
/dev/sdd1 taft lvm2 a-- 15.00g 15.00g B
/dev/sde1 taft lvm2 a-- 15.00g 15.00g C
/dev/sdf1 taft lvm2 a-- 15.00g 15.00g C
/dev/sdg1 taft lvm2 a-- 15.00g 15.00g A
/dev/sdh1 taft lvm2 a-- 15.00g 15.00g A
下面的命令在卷组 taft 中创建一个大小为 100GB 的镜像卷。
# lvcreate --type raid1 -m 1 -n mirror --nosync -L 10G taft
WARNING: New raid1 won't be synchronised. Don't read what you didn't write!
Logical volume "mirror" created
下面的命令显示用于镜像分支及 RAID 元数据子卷的设备。
# lvs -a -o +devices
LV VG Attr LSize Log Cpy%Sync Devices
mirror taft Rwi-a-r--- 10.00g 100.00 mirror_rimage_0(0),mirror_rimage_1(0)
[mirror_rimage_0] taft iwi-aor--- 10.00g /dev/sdb1(1)
[mirror_rimage_1] taft iwi-aor--- 10.00g /dev/sdc1(1)
[mirror_rmeta_0] taft ewi-aor--- 4.00m /dev/sdb1(0)
[mirror_rmeta_1] taft ewi-aor--- 4.00m /dev/sdc1(0)
下面的命令扩展镜像卷的大小,使用 cling 分配策略表示需要使用有相同标签的物理卷扩展的镜像分支。
# lvextend --alloc cling -L +10G taft/mirror
Extending 2 mirror images.
Extending logical volume mirror to 20.00 GiB
Logical volume mirror successfully resized
下面的命令显示使用与该分支有相同标签的物理卷扩展的镜像卷。注:忽略使用标签 C 的物理卷。
# lvs -a -o +devices
LV VG Attr LSize Log Cpy%Sync Devices
mirror taft Rwi-a-r--- 20.00g 100.00 mirror_rimage_0(0),mirror_rimage_1(0)
[mirror_rimage_0] taft iwi-aor--- 20.00g /dev/sdb1(1)
[mirror_rimage_0] taft iwi-aor--- 20.00g /dev/sdg1(0)
[mirror_rimage_1] taft iwi-aor--- 20.00g /dev/sdc1(1)
[mirror_rimage_1] taft iwi-aor--- 20.00g /dev/sdd1(0)
[mirror_rmeta_0] taft ewi-aor--- 4.00m /dev/sdb1(0)
[mirror_rmeta_1] taft ewi-aor--- 4.00m /dev/sdc1(0)
4.4.16. 缩小逻辑卷
要缩小逻辑卷,首先请卸载该文件系统。然后可使用命令 lvreduce 缩小该卷。缩小该卷后,创新挂载该文件系统。
警告
关键是要在缩小该卷前,减小文件系统或者其在该卷中所在位置的大小,否则可能会有丢失数据的风险。
缩小逻辑卷可释放一些卷组空间,将其分配该该卷组中的其他逻辑卷。
下面的示例将卷组 vg00 中的逻辑卷 lvol1 减少 3 个逻辑扩展。
# lvreduce -l -3 vg00/lvol1
4.4.17. 控制逻辑卷激活
可使用 lvcreate 或者 lvchange 命令的 -k 或者 --setactivationskip {y|n} 选项在正常激活命令中跳过为逻辑卷添加标签。该标签不适用于停用命令。
可使用 lvs 命令确定是否要为逻辑卷设定标志,下面的示例中显示 k 属性。
# lvs vg/thin1s1
LV VG Attr LSize Pool Origin
thin1s1 vg Vwi---tz-k 1.00t pool0 thin1
默认情况下,将精简快照卷标记为跳过激活。除使用标准的 -ay 或者 --activate y 选项外,还可使用由 -K 或者 --ignoreactivationskip 设定的 k 属性激活逻辑卷。
下面的命令激活精简逻辑卷。
# lvchange -ay -K VG/SnapLV
使用 lvcreate 命令的 -kn 或者 --setactivationskip n 选项创建逻辑卷时可关闭持久 "activation skip" 标志。可使用 lvchange 命令的 -kn 或者 --setactivationskip n 选项关闭现有逻辑卷的标签。可使用 -ky 或者 --setactivationskip y 再打开该标志。
下面的命令创建没有 activation skip 标志的快照逻辑卷
# lvcreate --type thin -n SnapLV -kn -s ThinLV --thinpool VG/ThinPoolLV
下面的命令从快照逻辑卷中删除 activation skip 标签。
# lvchange -kn VG/SnapLV
可使用 /etc/lvm/lvm.conf 文件中的 auto_set_activation_skip 设置控制默认的跳过激活指定。
4.5. 使用过滤器控制 LVM 设备扫描
启动时,会运行 vgscan 命令,扫描系统中的块设备,查找 LVM 标签,以决定哪些是物理卷。同时还会读取元数据并建立卷组列表。物理卷的名称保存在系统中每个节点的缓存文件 /etc/lvm/cache/.cache 中。之后的命令可读取那个文件以避免重复扫描。
可通过在 lvm.conf 配置文件中设定过滤器控制设备 LVM 扫描。lvm.conf 文件中的过滤器由一系列简单正则表达式组成,应用于 /dev 目录中的设备名以决定接受或者拒绝每个找到的块设备。
下面的示例演示了使用过滤器控制 LVM 扫描的设备。注:这些示例不一定代表最佳实践,因为正则表达式与完整路径名完全匹配。例如:a/loop/ 等同与 a/.*loop.*/,并与 /dev/solooperation/lvol1 映射。
下面的过滤器添加所有找到的设备,这是默认行为,因为在配置文件中没有配置任何过滤器:
filter = [ "a/.*/" ]
下面的过滤器删除 cdrom 设备,以避免在该驱动器中不包含任何介质时会造成延迟:
filter = [ "r|/dev/cdrom|" ]
下面的过滤器添加所有回路并删除其他所有块设备:
filter = [ "a/loop.*/", "r/.*/" ]
下面的过滤器添加所有回路和 IDE,并删除其他所有块设备:
filter =[ "a|loop.*|", "a|/dev/hd.*|", "r|.*|" ]
下面的过滤器只在第一个 IDE 驱动器中添加分区 8 并删除其他所有块设备:
filter = [ "a|^/dev/hda8$|", "r/.*/" ]
注意
lvmetad 守护进程处于运行状态时,执行 pvscan --cache device 命令时不会应用 /etc/lvm/lvm.conf 文件中的 filter = 设置。要过滤设备,则需要使用 global_filter = 设定。LVM 不会打开无法进行全局过滤的设备,且再也不会对其进行扫描。可能会需要使用全局过滤器,例如:在 VM 中使用 LVM 设备,且不想让该物理主机扫描 VM 中设备的内容。
有关 lvm.conf 文件的详情,请查看 附录 B, LVM 配置文件 及 lvm.conf(5) man page。
4.6. 在线数据重新定位
可使用 pvmove 命令在系统处于使用状态时迁移数据。
pvmove 命令将要移动到扇区中的数据分散,并创建临时镜像以便移动每个扇区。有关 pvmove 命令操作的详情,请查看 pvmove(8) man page。
注意
要在集群中执行 pvmove 操作,应该确定已安装 cmirror 软件包,且 cmirrord 服务正在运行。
下面的命令将物理卷 /dev/sdc1 中所有已分配的空间移动到该卷组中可用的物理卷中:
# pvmove /dev/sdc1
下面的命令只移动逻辑卷 MyLV 的扩展。
# pvmove -n MyLV /dev/sdc1
因为执行 pvmove 命令需要较长时间,可以在后台运行该命令,以免在前台显示进程更新。下面的命令在后台将物理卷 /dev/sdc1 中所有分配的扩展移动到 /dev/sdf1。
# pvmove -b /dev/sdc1 /dev/sdf1
下面的命令以 5 秒为间隔报告该命令移动进程的百分比。
# pvmove -i5 /dev/sdd1
4.7. 在集群的独立节点中激活逻辑卷
如果在集群环境中安装了 LVM,则有时可能会需要以独占方式在一个节点中激活逻辑卷。
要以独占方式在一个节点中激活逻辑卷,可使用 lvchange -aey 命令。另外,可以使用 lvchange -aly 命令在一个本地节点中以非独占方式激活逻辑卷。可稍后在附加节点中同时将其激活。
还可以使用 LVM 标签中独立节点中激活逻辑卷,如 附录 C, LVM 对象标签 。还可以在该配置文件中指定节点激活,如 附录 B, LVM 配置文件 所述。
4.8. LVM 的自定义报告
可使用 pvs、lvs 和 vgs 命令生成简洁且可自定义的 LVM 对象报告。这些命令生成的报告包括每行一个对象的输出结果。每行包含与该对象有关的属性字段顺序列表。有五种方法可用来选择要报告的对象:即根据物理卷、卷组、逻辑卷、物理卷片段及逻辑卷片段报告。
以下小节提供:
用来控制所生成报告格式的命令参数概述。
可为每个 LVM 对象选择的字段列表。
可用来对生成的报告进行排序的命令参数概述。
指定报告输出结果单位简介。
4.8.1. 格式控制
是否使用 pvs、lvs 或者 vgs 命令可决定显示字段的默认设置及排序顺序。可使用下面的参数控制这些命令的输出结果:
可使用 -o 参数将显示的字段改为默认值以外的内容。例如:下面的输出结果是 pvs 命令的默认显示内容(即显示物理卷信息)。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G
/dev/sdd1 new_vg lvm2 a- 17.14G 17.14G
下面的命令只显示物理卷名称和大小。
# pvs -o pv_name,pv_size
PV PSize
/dev/sdb1 17.14G
/dev/sdc1 17.14G
/dev/sdd1 17.14G
可将加号(+)于 -o 参数合用,在输出结果中附加一个字段。
下面的示例除显示默认字段外还显示该物理卷的 UUID。
# pvs -o +pv_uuid
PV VG Fmt Attr PSize PFree PV UUID
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G Joqlch-yWSj-kuEn-IdwM-01S9-X08M-mcpsVe
/dev/sdd1 new_vg lvm2 a- 17.14G 17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-UqkCS
在命令中添加 -v 参数可显示额外的字段。例如:pvs -v 命令会在默认字段外显示 DevSize 和 PV UUID 字段。
# pvs -v
Scanning for physical volume names
PV VG Fmt Attr PSize PFree DevSize PV UUID
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G 17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G 17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
/dev/sdd1 new_vg lvm2 a- 17.14G 17.14G 17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS
--noheadings 参数会取消标题行。这在编写脚本时有用。
下面的示例将 --noheadings 参数与 pv_name 参数联合使用生成所有物理卷的列表:
# pvs --noheadings -o pv_name
/dev/sdb1
/dev/sdc1
/dev/sdd1
--separator separator 参数使用 separator 分离各个字段。
下面的示例使用等号(=)分离 pvs 命令的默认输出字段。
# pvs --separator =
PV=VG=Fmt=Attr=PSize=PFree
/dev/sdb1=new_vg=lvm2=a-=17.14G=17.14G
/dev/sdc1=new_vg=lvm2=a-=17.14G=17.09G
/dev/sdd1=new_vg=lvm2=a-=17.14G=17.14G
要在使用 separator 参数时保持字段对齐,请将 separator 参数与 --aligned 参数配合使用。
# pvs --separator = --aligned
PV =VG =Fmt =Attr=PSize =PFree
/dev/sdb1 =new_vg=lvm2=a- =17.14G=17.14G
/dev/sdc1 =new_vg=lvm2=a- =17.14G=17.09G
/dev/sdd1 =new_vg=lvm2=a- =17.14G=17.14G
可使用 lvs 或者 vgs 命令的 -P 参数显示有关失败卷的信息,否则该信息不会出现在输出结果中。有关这个参数字段的输出结果详情,请查看 第 6.2 节 “在失败的设备中显示信息。”。
有关完整显示参数列表,请查看 pvs(8)、vgs(8) 和 lvs(8) man page。
卷组字段可与物理卷(和物理卷片段)字段或者逻辑卷(和逻辑卷片段)字段混合,但物理卷和逻辑卷字段不能混合。例如:下面的命令会每行显示一个物理卷的输出结果。
# vgs -o +pv_name
VG #PV #LV #SN Attr VSize VFree PV
new_vg 3 1 0 wz--n- 51.42G 51.37G /dev/sdc1
new_vg 3 1 0 wz--n- 51.42G 51.37G /dev/sdd1
new_vg 3 1 0 wz--n- 51.42G 51.37G /dev/sdb1
4.8.2. 对象选择
本小节提供可用来使用 pvs、vgs 和 lvs 命令显示 LVM 对象信息的表格。
为方便起见,如果字段名称前缀与该命令的默认匹配,则可将其去掉。例如:在 pvs 命令中,name 的含义是 pv_name,但在 vgs 命令中,会将 name 解读为 vg_name。
执行下面的命令与执行 pvs -o pv_free 等同。
# pvs -o free
PFree
17.14G
17.09G
17.14G
注意
在之后的发行本中,pvs、vgs 和 lvs 输出结果中 attribute 字段中的字符数可能会增加。现有字符字段不会更改位置,但可在结尾处添加新字段。为具体属性字符编写脚本时应考虑这个因素,并根据字符与该字段起始位置的相对位置搜索字符,而不是根据其与该字段的截止位置的相对位置进行搜索。例如:要在 lv_attr 字段的第九个字节搜索字符 p,可搜索字符串 "^/........p/",但不应搜索字符串 "/*p$/"。
pvs 命令
表 4.2 “pvs Display 字段” 列出 pvs 目录的显示参数以及在标头显示中出现的字段名称及该字段的描述。
表 4.2. pvs Display 字段
参数 |
标头 |
描述 |
dev_size |
DevSize |
该物理卷所在底层设备的大小 |
pe_start |
1st PE |
底层设备中的第一个物理扩展偏差 |
pv_attr |
Attr |
物理卷状态:(a)可分配;或者(x)导出。 |
pv_fmt |
Fmt |
物理卷元数据格式(lvm2 或者 lvm1) |
pv_free |
PFree |
物理卷中的剩余空间 |
pv_name |
PV |
物理卷名称 |
pv_pe_alloc_count |
Alloc |
已使用物理扩展数 |
pv_pe_count |
PE |
物理扩展数 |
pvseg_size |
SSize |
物理卷的片段大小 |
pvseg_start |
起始 |
物理卷片段的起始物理扩展 |
pv_size |
PSize |
物理卷大小 |
pv_tags |
PV 标签 |
附加到物理卷的 LVM 标签 |
pv_used |
已使用 |
该物理卷中目前已使用的空间数量 |
pv_uuid |
PV UUID |
该物理卷的 UUID |
pvs 命令默认显示以下字段:pv_name, vg_name, pv_fmt, pv_attr, pv_size, pv_free。该显示结果按 pv_name 排序。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G
/dev/sdd1 new_vg lvm2 a- 17.14G 17.13G
使用 pvs 命令的 -v 参数值默认显示中添加以下字段:dev_size,pv_uuid。
# pvs -v
Scanning for physical volume names
PV VG Fmt Attr PSize PFree DevSize PV UUID
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G 17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G 17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
/dev/sdd1 new_vg lvm2 a- 17.14G 17.13G 17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS
可使用 pvs 命令的 --segments 参数显示每个物理卷片段的信息。一个片段就是一个扩展组。如果要了解逻辑卷是否碎片化,查看片段视图很有帮助。
pvs --segments 命令默认显示以下字段:pv_name, vg_name, pv_fmt, pv_attr, pv_size, pv_free, pvseg_start, pvseg_size。结果根据物理卷中的 pv_name 和 pvseg_size 排序。
# pvs --segments
PV VG Fmt Attr PSize PFree Start SSize
/dev/hda2 VolGroup00 lvm2 a- 37.16G 32.00M 0 1172
/dev/hda2 VolGroup00 lvm2 a- 37.16G 32.00M 1172 16
/dev/hda2 VolGroup00 lvm2 a- 37.16G 32.00M 1188 1
/dev/sda1 vg lvm2 a- 17.14G 16.75G 0 26
/dev/sda1 vg lvm2 a- 17.14G 16.75G 26 24
/dev/sda1 vg lvm2 a- 17.14G 16.75G 50 26
/dev/sda1 vg lvm2 a- 17.14G 16.75G 76 24
/dev/sda1 vg lvm2 a- 17.14G 16.75G 100 26
/dev/sda1 vg lvm2 a- 17.14G 16.75G 126 24
/dev/sda1 vg lvm2 a- 17.14G 16.75G 150 22
/dev/sda1 vg lvm2 a- 17.14G 16.75G 172 4217
/dev/sdb1 vg lvm2 a- 17.14G 17.14G 0 4389
/dev/sdc1 vg lvm2 a- 17.14G 17.14G 0 4389
/dev/sdd1 vg lvm2 a- 17.14G 17.14G 0 4389
/dev/sde1 vg lvm2 a- 17.14G 17.14G 0 4389
/dev/sdf1 vg lvm2 a- 17.14G 17.14G 0 4389
/dev/sdg1 vg lvm2 a- 17.14G 17.14G 0 4389
可使用 pvs -a 命令查看已被 LVM 探测到但尚未初始化为 LVM 物理卷的设备。
# pvs -a
PV VG Fmt Attr PSize PFree
/dev/VolGroup00/LogVol01 -- 0 0
/dev/new_vg/lvol0 -- 0 0
/dev/ram -- 0 0
/dev/ram0 -- 0 0
/dev/ram2 -- 0 0
/dev/ram3 -- 0 0
/dev/ram4 -- 0 0
/dev/ram5 -- 0 0
/dev/ram6 -- 0 0
/dev/root -- 0 0
/dev/sda -- 0 0
/dev/sdb -- 0 0
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G
/dev/sdc -- 0 0
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G
/dev/sdd -- 0 0
/dev/sdd1 new_vg lvm2 a- 17.14G 17.14G
vgs 命令
表 4.3 “vgs Display 字段” 列出 vgs 命令的显示参数以及在标头显示中出现的字段名称及该字段的描述。
表 4.3. vgs Display 字段
参数 |
标头 |
描述 |
lv_count |
#LV |
卷组所包含逻辑卷数 |
max_lv |
MaxLV |
卷组允许的最大逻辑卷数(0 表示无限大) |
max_pv |
MaxPV |
卷组允许的最大物理卷数(0 表示无限) |
pv_count |
#PV |
定义该卷组的物理卷数 |
snap_count |
#SN |
卷组包含的快照数 |
vg_attr |
Attr |
卷组状态:(w)可写入;(r)只读;(z)可重新定义大小;(x)可导出;(p)部分;以及(c)集群。 |
vg_extent_count |
#Ext |
卷组中的物理扩展数 |
vg_extent_size |
Ext |
卷组中的物理扩展大小 |
vg_fmt |
Fmt |
卷组的元数据格式(lvm2 或者 lvm1) |
vg_free |
VFree |
卷组中剩余的可用空间大小 |
vg_free_count |
可用 |
卷组中的可用物理扩展数 |
vg_name |
VG |
卷组名称 |
vg_seqno |
Seq |
代表卷组修改的次数 |
vg_size |
VSize |
卷组大小 |
vg_sysid |
SYS ID |
LVM1 System ID |
vg_tags |
VG 标签 |
附加到卷组的 LVM 标签 |
vg_uuid |
VG UUID |
卷组的 UUID |
vgs 命令默认显示以下字段:vg_name, pv_count, lv_count, snap_count, vg_attr, vg_size, vg_free. The display is sorted by vg_name。
# vgs
VG #PV #LV #SN Attr VSize VFree
new_vg 3 1 1 wz--n- 51.42G 51.36G
使用 vgs 命令的 -v 参数值默认显示着添加以下字段:vg_extent_size,vg_uuid。
# vgs -v
Finding all volume groups
Finding volume group "new_vg"
VG Attr Ext #PV #LV #SN VSize VFree VG UUID
new_vg wz--n- 4.00M 3 1 1 51.42G 51.36G jxQJ0a-ZKk0-OpMO-0118-nlwO-wwqd-fD5D32
lvs 命令
表 4.4 “lvs 显示字段” 列出了 lvs 命令的显示参数以及在标头显示中的字段名称以及该字段的描述。
表 4.4. lvs 显示字段
参数 |
标头 |
描述 |
||||||||||
|
区块 |
快照卷的单位大小 |
||||||||||
copy_percent |
Copy% |
镜像逻辑卷的同步百分比;也可在使用 pv_move 命令移动物理扩展时使用。 |
||||||||||
devices |
设备 |
组成逻辑卷的底层设备:即物理卷、逻辑卷及起始物理扩展和逻辑扩展 |
||||||||||
lv_attr |
Attr |
逻辑卷状态。逻辑卷的属性字节如下:
|
||||||||||
lv_kernel_major |
KMaj |
逻辑卷的实际主要设备数(若未激活则为 -1) |
||||||||||
lv_kernel_minor |
KMIN |
逻辑卷的实际次要设备数(若未激活则为 -1) |
||||||||||
lv_major |
Maj |
逻辑卷的持久主要设备数(若未指定则为 -1) |
||||||||||
lv_minor |
Min |
逻辑卷的持久次要设备数(若未指定则为 -1) |
||||||||||
lv_name |
LV |
逻辑卷名称 |
||||||||||
lv_size |
LSize |
逻辑卷大小 |
||||||||||
lv_tags |
LV 标签 |
附加到逻辑卷的 LVM 标签 |
||||||||||
lv_uuid |
LV UUID |
逻辑卷的 UUID |
||||||||||
mirror_log |
Log |
镜像日志所在设备 |
||||||||||
modules |
模块 |
需要使用这个逻辑卷的对应内核设备映射器目标 |
||||||||||
move_pv |
移动 |
使用 pvmove 命令创建的临时逻辑卷之源物理卷 |
||||||||||
origin |
Origin |
快照卷的原始设备 |
||||||||||
|
区域 |
镜像逻辑卷的单元大小 |
||||||||||
seg_count |
#Seg |
逻辑卷中的片段数 |
||||||||||
seg_size |
SSize |
逻辑卷的片段大小 |
||||||||||
seg_start |
起始 |
逻辑卷中的片段偏移 |
||||||||||
seg_tags |
Seg 标签 |
附加到逻辑卷片段的 LVM 标签 |
||||||||||
segtype |
类型 |
逻辑卷的片段类型(例如:镜像、条带、线性) |
||||||||||
snap_percent |
Snap% |
目前使用的快照卷百分比 |
||||||||||
stripes |
#Str |
逻辑卷中的条状卷或镜像卷数 |
||||||||||
|
条带 |
条带逻辑卷的单元大小 |
lvs 命令默认显示下面的字段:lv_name、vg_name、lv_attr、lv_size、origin、snap_percent、move_pv、mirror_log、copy_percent、convert_lv。默认根据卷组中的 vg_name 和 lv_name 排序。
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lvol0 new_vg owi-a- 52.00M
newvgsnap1 new_vg swi-a- 8.00M lvol0 0.20
使用 lvs 命令的 -v 参数将下面的字段添加到默认显示中:seg_count、lv_major、lv_minor、lv_kernel_major、lv_kernel_minor、lv_uuid。
# lvs -v
Finding all logical volumes
LV VG #Seg Attr LSize Maj Min KMaj KMin Origin Snap% Move Copy% Log Convert LV UUID
lvol0 new_vg 1 owi-a- 52.00M -1 -1 253 3 LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
newvgsnap1 new_vg 1 swi-a- 8.00M -1 -1 253 5 lvol0 0.20 1ye1OU-1cIu-o79k-20h2-ZGF0-qCJm-CfbsIx
可使用 lvs 命令的 --segments 参数显示默认栏信息,并强调片段信息。使用 segments 参数后,seg 前缀为自选项。lvs --segments 命令默认显示下面的字段:lv_name、vg_name、lv_attr、stripes、segtype、seg_size。默认显示是根据卷组的 vg_name 和 lv_name,以及该逻辑卷的 seg_start 排序。如果逻辑卷碎片化,这个命令的输出结果会体现此状态。
# lvs --segments
LV VG Attr #Str Type SSize
LogVol00 VolGroup00 -wi-ao 1 linear 36.62G
LogVol01 VolGroup00 -wi-ao 1 linear 512.00M
lv vg -wi-a- 1 linear 104.00M
lv vg -wi-a- 1 linear 104.00M
lv vg -wi-a- 1 linear 104.00M
lv vg -wi-a- 1 linear 88.00M
使用 lvs --segments 命令的 -v 参数在默认显示着添加以下字段:seg_start、stripesize、chunksize。
# lvs -v --segments
Finding all logical volumes
LV VG Attr Start SSize #Str Type Stripe Chunk
lvol0 new_vg owi-a- 0 52.00M 1 linear 0 0
newvgsnap1 new_vg swi-a- 0 8.00M 1 linear 0 8.00K
下面的示例演示了在已配置逻辑卷的系统中运行 lvs 命令的输出结果,以及运行附加 segments 参数的 lvs 命令的输出结果。
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
lvol0 new_vg -wi-a- 52.00M
# lvs --segments
LV VG Attr #Str Type SSize
lvol0 new_vg -wi-a- 1 linear 52.00M
4.8.3. 将 LVM 报告排序
通常必须生成 lvs、vgs 或者 pvs 命令的整个输出结果,并在可将其排序并正确对齐前保存。可指定 --unbuffered 参数在生成后即刻显示未排序的输出结果。
要制定可替换的列排序顺序,请使用任意报告命令的 -O 参数。不一定要在输出结果中包含这些字段。
以下示例显示 pvs 命令的输出结果,其中显示内容包括物理卷名称、大小及可用空间。
# pvs -o pv_name,pv_size,pv_free
PV PSize PFree
/dev/sdb1 17.14G 17.14G
/dev/sdc1 17.14G 17.09G
/dev/sdd1 17.14G 17.14G
以下示例显示同样的输出结果,但根据可用空间字段排序。
# pvs -o pv_name,pv_size,pv_free -O pv_free
PV PSize PFree
/dev/sdc1 17.14G 17.09G
/dev/sdd1 17.14G 17.14G
/dev/sdb1 17.14G 17.14G
以下示例表示不需要显示用来排序的字段内容。
# pvs -o pv_name,pv_size -O pv_free
PV PSize
/dev/sdc1 17.14G
/dev/sdd1 17.14G
/dev/sdb1 17.14G
要显示反向排序,请在 -O 参数前指定 的字段前添加 - 字符。
# pvs -o pv_name,pv_size,pv_free -O -pv_free
PV PSize PFree
/dev/sdd1 17.14G 17.14G
/dev/sdb1 17.14G 17.14G
/dev/sdc1 17.14G 17.09G
4.8.4. 指定单位
要指定 LVM 报告显示的单位,请使用该报告命令的 --units 参数。可指定 (b)、(k)、(m)、(g)、(t)、(e)xabytes、(p) 和 (h)。默认显示为 human-readable(用户可读)。可在 lvm.conf 文件的 global 部分设置 units 参数覆盖默认值。
以下示例采用 MB 指定 pvs 命令的输出结果,而不是默认的 GB。
# pvs --units m
PV VG Fmt Attr PSize PFree
/dev/sda1 lvm2 -- 17555.40M 17555.40M
/dev/sdb1 new_vg lvm2 a- 17552.00M 17552.00M
/dev/sdc1 new_vg lvm2 a- 17552.00M 17500.00M
/dev/sdd1 new_vg lvm2 a- 17552.00M 17552.00M
默认情况是以 2 的次方数(1024 的倍数)显示单位。可使用大写单位(B、K、M、G、T、H)以 1000 的倍数显示单位。
下面的命令采用 1024 的倍数(即默认行为)显示命令输出结果。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 17.14G 17.14G
/dev/sdc1 new_vg lvm2 a- 17.14G 17.09G
/dev/sdd1 new_vg lvm2 a- 17.14G 17.14G
下面的命令采用 1000 的倍数显示命令输出结果。
# pvs --units G
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 18.40G 18.40G
/dev/sdc1 new_vg lvm2 a- 18.40G 18.35G
/dev/sdd1 new_vg lvm2 a- 18.40G 18.40G
还可以指定 (s) 扇区(默认为 512 字节)或自定义单位。
下面的示例以扇区数显示 pvs 命令的输出结果。
# pvs --units s
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 35946496S 35946496S
/dev/sdc1 new_vg lvm2 a- 35946496S 35840000S
/dev/sdd1 new_vg lvm2 a- 35946496S 35946496S
下面的示例以 4MB 为单位显示 pvs 命令的输出结果。
# pvs --units 4m
PV VG Fmt Attr PSize PFree
/dev/sdb1 new_vg lvm2 a- 4388.00U 4388.00U
/dev/sdc1 new_vg lvm2 a- 4388.00U 4375.00U
/dev/sdd1 new_vg lvm2 a- 4388.00U 4388.00U