LVM精简配置
创建LV时,将分配标准逻辑卷中的块,但是在精简配置的逻辑卷中,将在写入时分配它们。因此,精简配置的LV具有虚拟大小,并且可能比物理可用存储大得多。以后可以根据需要增加为精简配置的LV提供的物理存储量。标准LV中的块是在VG中分配的(在创建过程中),而精简LV中的块是从特殊的“瘦池LV”分配的(使用过程中)的。精简池LV包含物理存储块,而精简LV中的块只是精简池LV中的参考块。 必须先创建精简池LV,然后才能在其中创建精简LV。精简池LV是通过组合两个标准LV来创建的:一个大数据LV,它将保存精简LV的块;一个元数据LV,它将保存元数据。元数据跟踪哪些数据块属于每个精简LV。 精简LV的快照非常有效,因为共享了精简LV通用的数据块及其快照。快照可以是精简LV或其他精简快照。递归快照共有的块也在瘦池中共享。快照序列没有限制或降级。写入精简LV或快照LV时,它们会消耗精简池中的数据块。随着池中可用数据块的减少,可能需要提供更多可用块。这是通过使用VG的额外物理空间扩展精简池数据LV来完成的。从精简池中删除精简LV或快照也可以释放精简池中的块。但是,删除LV并不总是一种释放精简池中空间的有效方法,因为该数量仅限于不与池中其他LV共享的块数。精简池的增量块分配可能导致精简LV变得碎片化。标准LV通常通过在创建过程中一次分配所有块来避免此问题。 瘦词
精简用法 使用LVM精简配置的主要方法是: 创建ThinDataLV 创建将保存精简池数据的LV。 命令:lvcreate -n ThinDataLV -L LargeSize VG 范例: 生的 # lvcreate -n poolA -L 100G vg 创建ThinMetaLV 创建一个将容纳精简池元数据的LV。 命令:lvcreate -n ThinMetaLV -L SmallSize VG 范例: 生的 # lvcreate -n poolA_meta -L 1G vg
# lvs poolA vg -wi-a----- 10.00g poolA_meta vg -wi-a----- 1.00g 创建ThinPoolLV 将数据和元数据LV合并到精简池LV中。ThinDataLV重命名为隐藏的ThinPoolLV_tdata。ThinMetaLV重命名为隐藏的ThinPoolLV_tmeta。新的ThinPoolLV采用ThinDataLV的旧名称。 命令:lvconvert --thinpool VG/ThinDataLV --poolmetadata VG/ThinMetaLV 范例: 生的 # lvconvert --thinpool vg/poolA --poolmetadata vg/poolA_meta
# lvs vg/poolA LV VG Attr LSize Pool Origin Data% poolA vg twi-a-tz-- 10.00g 0.00
# lvs -a LV VG Attr LSize Pool Origin Data% poolA vg twi-a-tz-- 10.00g [poolA_tdata] vg Twi-ao---- 10.00g [poolA_tmeta] vg ewi-ao---- 1.00g 创建ThinLV 从精简池LV创建新的精简LV。精简LV使用虚拟大小创建。可以在精简池中创建多个新的精简LV。瘦LV名称在VG中必须唯一。该--thinpool参数指定哪个精简池将包含ThinLV。 命令:lvcreate --type thin -n ThinLV -V VirtualSize --thinpool VG/ThinPoolLV 范例: 生的 Create a thin LV in a thin pool: # lvcreate --type thin -n thinX -V 1T --thinpool vg/poolA
Create another thin LV in the same thin pool: # lvcreate --type thin -n thinY -V 1T --thinpool vg/poolA
# lvs vg/thinX vg/thinY LV VG Attr LSize Pool Origin Data% thinX vg Vwi-a-tz-- 1.00t poolA 0.00 thinY vg Vwi-a-tz-- 1.00t poolA 0.00 创建SnapLV 创建现有ThinLV或SnapLV的快照。 命令: 生的 lvcreate --type thin -n SnapLV -s ThinLV --thinpool VG/ThinPoolLV lvcreate --type thin -n SnapLV -s PrevSnapLV --thinpool VG/ThinPoolLV 范例: 生的 Create the first snapshot of an existing ThinLV: # lvcreate --type thin -n snapX1 -s thinX --thinpool vg/poolA
Create the second snapshot of the same ThinLV: # lvcreate --type thin -n snapX2 -s thinX --thinpool vg/poolA
Create a snapshot of the first snapshot: # lvcreate --type thin -n snapsnapX1 -s snapX1 --thinpool vg/poolA
# lvs vg/snapX1 vg/snapX2 vg/snapsnapX1 LV VG Attr LSize Pool Origin snapX1 vg Vwi---tz-k 1.00t poolA thinX snapX2 vg Vwi---tz-k 1.00t poolA thinX snapsnapX1 vg Vwi---tz-k 1.00t poolA snapX1 激活SnapLV 使用k属性指示的持久性“激活跳过”标志创建精简快照。-K与lvchange或vgchange一起使用可激活带有k属性的精简快照。 命令:lvchange -ay -K VG/SnapLV 范例: 生的 # lvchange -ay -K vg/snapX1
# lvs vg/snapX1 snapX1 vg Vwi-a-tz-k 1.00t poolA thinX 细话题 指定用于数据和元数据LV的设备 精简池中的数据和元数据LV最好在单独的物理设备上创建。为此,请在行末指定设备名称lvcreate。将快速设备用于元数据LV尤其有用。 命令: 生的 lvcreate -n ThinDataLV -L LargeSize VG PV_Large lvcreate -n ThinMetaLV -L SmallSize VG PV_Small lvconvert --thinpool VG/ThinDataLV --poolmetadata VG/ThinMetaLV 范例: 生的 # lvcreate -n poolA -L 100G vg /dev/sdA # lvcreate -n poolA_meta -L 1G vg /dev/sdB # lvconvert --thinpool vg/poolA --poolmetadata vg/poolA_meta 参见/etc/lvm/lvm.conf配置文件参数thin_pool_metadata_require_separate_pvs设定为薄池创建默认PV使用。 使用RAID容忍设备故障 为了容忍设备故障,请对池数据LV和池元数据LV使用RAID。对于池元数据LV,特别推荐这样做。 命令: 生的 lvcreate --type raid1 -m 1 -n ThinMetaLV -L SmallSize VG PVA PVB lvcreate --type raid1 -m 1 -n ThinDataLV -L LargeSize VG PVC PVD lvconvert --thinpool VG/ThinDataLV --poolmetadata VG/ThinMetaLV 范例: 生的 # lvcreate --type raid1 -m 1 -n poolA -L 100G vg /dev/sdA /dev/sdB # lvcreate --type raid1 -m 1 -n poolA_meta -L 1G vg /dev/sdC /dev/sdD # lvconvert --thinpool vg/poolA --poolmetadata vg/poolA_meta 备用元数据LV 第一次创建精简池LV时,LVM将在VG中创建备用元数据LV。可以使用option控制此行为--poolmetadataspare y|n。如果不存在,将来的瘦池创建也将尝试创建pmspare LV。 要创建pmspare(“池元数据备用”)LV,LVM首先创建一个具有默认名称的LV,例如lvol0,然后将该LV转换为带有_pmspare后缀(例如lvol0_pmspare)的隐藏LV。 一个pmspare LV保留在VG中,可用于任何精简池。 pmspare LV不能显式创建,但可以显式删除。 范例: 生的 # lvcreate -n poolA -L 10G vg # lvcreate -n poolA_meta -L 10G vg # lvconvert --thinpool vg/poolA --poolmetadata vg/poolA_meta
# lvs -a [lvol0_pmspare] vg ewi------- 10.00g poolA vg twi---tz-- 10.00g [poolA_tdata] vg Twi------- 10.00g [poolA_tmeta] vg ewi------- 1.00g “ 元数据检查和修复”部分介绍了pmspare LV的用法。 元数据检查和修复 如果精简池元数据已损坏,则可以修复。检查和修复精简池元数据类似于在文件系统上运行fsck。 激活精简池LV后,LVM将运行thin_check命令以检查池元数据LV上元数据的正确性。 要禁用该thin_check步骤,请将/etc/lvm/lvm.confoption 设置thin_check_executable为空字符串(“”)。不建议这样做。 要设置thin_check命令的/etc/lvm/lvm.conf选项,请设置option thin_check_options。 如果thin_check命令发现元数据有问题,则不会激活精简池LV,并且应该修复精简池元数据。 修复精简池LV的命令:lvconvert --repair VG/ThinPoolLV 修复执行以下步骤: 1.创建一个新的,修复的元数据副本。
2.替换精简池元数据LV。
生的 lvconvert --thinpool VG/ThinPoolLV --poolmetadata VG/NewThinMetaLV 到路径thin_check,thin_dump和thin_repair命令可以在被设置/etc/lvm/lvm.conf。 自动池元数据LV 精简数据LV可以转换为精简池LV,而无需指定精简池元数据LV。LVM将自动从同一VG创建元数据LV。 命令: 生的 lvcreate -n ThinDataLV -L LargeSize VG* lvconvert --thinpool VG/ThinDataLV* 范例: 生的 # lvcreate -n poolC -L 10G vg # lvconvert --thinpool vg/poolC
# lvs -a poolC vg twi-a-tz-- 10.00g [poolC_tdata] vg Twi-ao---- 10.00g [poolC_tmeta] vg ewi-ao---- 16.00m 激活精简快照 创建精简快照LV时,默认情况下会为其指定“激活跳过”标志。该标志由显示的k属性指示lvs: 生的 # lvs vg/snapX1 LV VG Attr LSize Pool Origin snapX1 vg Vwi---tz-k 1.00t poolA thinX 该标志导致快照LV被普通激活命令跳过(即不激活)。跳过行为不适用于停用命令。 除标准(或)选项外,还可以使用(或)选项激活具有k属性的快照LV 。-K--ignoreactivationskip-ay--activate y 激活精简快照LV的命令:lvchange -ay -K VG/SnapLV 可以在lvcreate或以后lvchange使用-kn(或--setactivationskip n)选项关闭持久性“激活跳过”标志。可以使用-ky(或--setactivationskip y)再次将其打开。 删除“激活跳过”标志后,正常的激活命令将激活LV,并且-K不需要激活选项。 创建不带激活跳过标志的快照LV的命令:lvcreate --type thin -n SnapLV -kn -s ThinLV --thinpool VG/ThinPoolLV 从快照LV删除激活跳过标志的命令:lvchange -kn VG/SnapLV 请参阅/etc/lvm/lvm.conf选项auto_set_activation_skip以设置激活跳过的默认用法。 删除精简池LV,精简LV和快照 删除精简LV及其相关快照将其使用的块返回到精简池LV。这些块将重新用于其他精简LV和快照。 删除精简池LV会同时删除数据LV和元数据LV,并将空间返回给VG。 lvremove精简池LV,精简LV和快照的数量不能通过反转vgcfgrestore。 vgcfgbackup 不备份精简池元数据。 手动管理精简池LV的可用数据空间 可以使用以下lvs命令显示精简池LV中的可用空间。可以通过扩展精简池LV添加可用空间。 范例: 生的 1. A thin pool LV is using 26.96% of its data blocks. # lvs LV VG Attr LSize Pool Origin Data% poolA vg twi-a-tz-- 10.00g 26.96
2. Double the amount of physical space in the thin pool LV. # lvextend -L+10G vg/poolA
3. The percentage of used data blocks is half the previous value. # lvs LV VG Attr LSize Pool Origin Data% poolA vg twi-a-tz-- 20.00g 13.48 在精简池LV中增加可用数据空间的其他方法包括删除精简LV及其相关快照,或fstrim使用精简LV在文件系统上运行。 手动管理精简池LV的可用元数据空间 可以使用以下lvs -o+metadata_percent命令显示精简池LV中的可用元数据空间。 范例: 生的 1. A thin pool LV is using 12.40% of its metadata blocks.
# lvs -oname,size,data_percent,metadata_percent vg/poolA LV LSize Data% Meta% poolA 20.00g 13.48 12.40
2. Display a thin pool LV with its component thin data LV and thin metadata LV. # lvs -a -oname,attr,size vg LV Attr LSize poolA twi-a-tz-- 20.00g [poolA_tdata] Twi-ao---- 20.00g [poolA_tmeta] ewi-ao---- 12.00m
3. Double the amount of physical space in the thin metadata LV. # lvextend -L+12M vg/poolA_tmeta
4. The percentage of used metadata blocks is half the previous value. # lvs -a -oname,size,data_percent,metadata_percent vg LV LSize Data% Meta% poolA 20.00g 13.48 6.20 [poolA_tdata] 20.00g [poolA_tmeta] 24.00m 使用fstrim增加精简池LV中的可用空间 在精简LV顶部的文件系统中删除文件通常不会向精简池中添加可用空间。手动运行fstrim命令可以将空间返回到已删除文件已使用的精简池。fstrim使用丢弃,并且如果精简池LV将丢弃模式设置为忽略,则将不起作用。 范例: 精简池具有10G的物理数据空间,而精简LV具有100G的虚拟大小。将1G文件写入文件系统会将精简池中的可用空间减少10%,并将文件系统的虚拟使用量增加1%。删除1G文件会将虚拟1%还原到文件系统,但不会将物理10%还原到精简池。该fstrim命令将物理空间还原到精简池。 生的 # lvs -a -oname,attr,size,pool_lv,origin,data_percent,metadata_percent vg LV Attr LSize Pool Origin Data% Meta% poolA twi-a-tz-- 10.00g 47.01 21.03 thinX Vwi-aotz-- 100.00g poolA 2.70
# df -h /mnt/X Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg-thinX 99G 1.1G 93G 2% /mnt/X
# dd if=/dev/zero of=/mnt/X/1Gfile bs=4096 count=262144; sync
# lvs poolA vg twi-a-tz-- 10.00g 57.01 25.26 thinX vg Vwi-aotz-- 100.00g poolA 3.70
# df -h /mnt/X /dev/mapper/vg-thinX 99G 2.1G 92G 3% /mnt/X
# rm /mnt/X/1Gfile
# lvs poolA vg twi-a-tz-- 10.00g 57.01 25.26 thinX vg Vwi-aotz-- 100.00g poolA 3.70
# df -h /mnt/X /dev/mapper/vg-thinX 99G 1.1G 93G 2% /mnt/X
# fstrim -v /mnt/X
# lvs poolA vg twi-a-tz-- 10.00g 47.01 21.03 thinX vg Vwi-aotz-- 100.00g poolA 2.70 自动扩展瘦池LV dmeventd默认情况下,LVM守护程序()将监视精简池LV的数据使用情况,并在使用量达到一定水平时对其进行扩展。VG中必须存在必要的可用空间才能扩展精简池LV。 用于启用或禁用对现有精简池LV的监视和自动扩展的命令:lvchange --monitor {y|n} VG/ThinPoolLV 查看/etc/lvm/lvm.conf选项thin_pool_autoextend_threshold并thin_pool_autoextend_percent定义自动扩展行为。 该选项thin_pool_autoextend_threshold是一个百分比值,该值定义何时应扩展精简池LV。将此设置为100将禁用自动扩展。最小值是50。 该选项thin_pool_autoextend_percent以精简池当前大小的百分比定义应向精简池添加多少额外的数据空间。 当池的使用率达到80%,85%,90%和95%时,将通过syslog发出警告。 范例: 如果thin_pool_autoextend_threshold为70,thin_pool_autoextend_percent为20,则每当池使用量超过70%时,池的使用量将再增加20%。对于1G池,使用700M将触发将大小调整为1.2G。当使用量超过840M时,池将扩展到1.44G,依此类推。 调零 当精简池为精简LV配置新数据块时,新块首先被零覆盖。归零模式由所显示的z属性指示lvs。可以将选项-Z(或--zero)添加到命令中以指定清零模式。 创建精简池LV时设置清零模式的命令:lvconvert -Z{y|n} --thinpool VG/ThinDataLV --poolmetadata VG/ThinMetaLV 更改现有精简池LV的清零模式的命令:lvchange -Z{y|n} VG/ThinPoolLV 如果清零模式从“ n”更改为“ y”,则先前设置的块不会清零。 调配大零块会影响性能。 请参阅设置默认归零模式的/etc/lvm/lvm.conf选项thin_pool_zero。 丢弃
精简池LV的丢弃行为决定了如何处理丢弃请求。可能的丢弃行为: 显示精简池LV当前丢弃模式的命令:lvs -o+discards VG/ThinPoolLV 创建精简池LV时设置丢弃模式的命令:lvconvert --discards {ignore|nopassdown|passdown} --thinpool VG/ThinDataLV --poolmetadata VG/ThinMetaLV 更改现有瘦池LV的丢弃模式的命令:lvchange --discards {ignore|nopassdown|passdown} VG/ThinPoolLV 范例: 生的 # lvs -o name,discards vg/poolA poolA passdown
# lvchange --discards ignore vg/poolA 请参阅/etc/lvm/lvm.conf选项thin_pool_discards以设置默认的丢弃模式。 块大小 --chunksize创建精简池LV时,可以使用该选项指定由精简池管理的数据块的大小。默认单位为千字节,默认值为64KiB。该值必须是4KiB和1GiB之间的2的幂。 当精简池主要用于精简配置功能时,较大的值是最佳的。为了优化大量快照,较小的值可以减少复制时间并占用较少的空间。 显示精简池LV块大小的命令:lvs -o+chunksize VG/ThinPoolLV 范例: 生的 # lvs -o name,chunksize poolA 64.00k 请参阅/etc/lvm/lvm.conf选项thin_pool_chunk_size以设置默认块大小。 池元数据LV的大小 精简元数据的数量取决于精简LV之间(即通过快照)共享多少块。具有许多快照的精简池可能需要较大的元数据LV。 支持的元数据LV大小范围是2MiB至16GiB。
默认大小通过以下公式估算: 显式创建精简元数据LV时,在lvcreate命令中指定大小。当命令自动创建精简元数据LV时,--poolmetadatasize可以使用该选项指定非默认大小。默认单位是兆字节。 创建外部只读LV的精简快照 精简快照通常是从同一精简池中的其他精简LV或其他精简快照LV获取的。还可以对外部只读LV进行精简快照。对快照的写操作存储在精简池中,外部LV用于读取精简快照的未写部分。 命令:lvcreate --type thin -n SnapLV -s VG/ExternLV --thinpool VG/ThinPoolLV 范例: 生的 # lvchange -an vg/lve # lvchange --permission r vg/lve # lvcreate --type thin -n snaplve -s vg/lve --thinpool vg/poolA
# lvs vg/lve vg/snaplve LV VG Attr LSize Pool Origin Data% lve vg ori------- 10.00g snaplve vg Vwi-a-tz-- 10.00g poolA lve 0.00 使用外部原点将标准LV转换为精简LV 可以创建新的精简LV,并为其指定现有标准LV的名称。同时,现有LV将转换为具有新名称的只读外部LV。瘦LV的未写部分从外部LV读取。可以使用指定指定给现有LV的新名称--originname,否则,将为现有LV提供默认名称,例如lvol#。 将ExampleLV转换为具有新名称ExternalLV的只读外部LV,并创建一个新的精简LV,该新LV的名称与ExampleLV相同。 命令:lvconvert --type thin --thinpool VG/ThinPoolLV --originname ExternalLV --thin VG/ExampleLV 范例: 生的 # lvcreate -n lv_example -L 10G vg
# lvs lv_example vg -wi-a----- 10.00g
# lvconvert --type thin --thinpool vg/poolC --originname lv_external --thin vg/lv_example
# lvs LV VG Attr LSize Pool Origin lv_example vg Vwi-a-tz-- 10.00g poolC lv_external lv_external vg ori------- 10.00g 单步精简池LV创建 可以使用单个lvcreate命令创建精简池LV ,而不是lvconvert在现有LV上使用。此命令创建一个精简数据LV,一个精简元数据LV,并将两者组合成一个精简池LV。 命令: lvcreate -L LargeSize --thinpool VG/ThinPoolLV 范例: 生的 # lvcreate -l1 --thinpool vg/poolC
# lvs vg/poolC LV VG Attr LSize Pool Origin Data% poolC vg twi-a-tz-- 8.00m 0.00
# lvs -a poolC vg twi-a-tz-- 8.00m [poolC_tdata] vg Twi-ao---- 8.00m [poolC_tmeta] vg ewi-ao---- 8.00m 单步精简池LV和精简LV创建 可以使用单个lvcreate命令创建精简池LV和精简LV 。此命令创建一个精简数据LV,一个精简元数据LV,将两者组合成一个精简池LV,并在新池中创建一个精简LV。
命令:lvcreate -L LargeSize -V VirtualSize -n ThinLV --thinpool VG/ThinPoolLV 相当于: 生的 lvcreate -L LargeSize --thinpool VG/ThinPoolLV lvcreate --type thin -n ThinLV -V VirtualSize --thinpool VG/ThinPoolLV 范例: 生的 # lvcreate -L8M -V2G -n thinZ --thinpool vg/poolC
# lvs -a poolC vg twi-a-tz-- 8.00m [poolC_tdata] vg Twi-ao---- 8.00m [poolC_tmeta] vg ewi-ao---- 8.00m thinZ vg Vwi-a-tz-- 2.00g poolC
(责任编辑:IT) |