LVMLogical Volume Manager逻辑磁区管理员



原先用于 IBM AIX 系统,后来移植到 Linux 系统,使 Linux 系统也具备了弹性分割磁碟的功能。

lvm
能够合并多个分割区或是实体磁碟(lvm 称其为 PV),成为一个大的磁区群组(lvm 称其为 VG)。此时这个磁区群组可视为一个虚拟磁碟,可以如同分割实体硬碟一样,将磁区群组分割为多个逻辑磁区(LVM 称其为 LV)。

PV
Physical Volume 实体磁区。不论是实体硬碟或是已经设定好的分割区,LVM 都会将其视为一个 PV
VG
Volume Group 磁区群组。一个以上的 PV 能够组成一个 VG,可将 VG 视为一个庞大的虚拟硬碟。
LV
Logical Volume 逻辑磁区。一个 VG 能分割为数 LV,可以将 LV 视为虚拟的分割区。

PE
Physical Extentlvm 在建立 VG 时,会将其中的 PV 切割为许多大小相等的区块,这些区块称为 PE,预设大小为 4 MB
LE
Logical Extentlvm 在建立 LV 时,会将其切割为许多大小相等的区块,这些区块称为 LELE 的大小必须是 PE 的倍数,不过一般都设定为两者大小相等。



检查安装 lvm

# rpm -qa|grep lvm
lvm2-2.02.56-8.el5
system-config-lvm-1.1.5-4.el5



启动与关闭 LVM
完成事先的准备工作后,便可以启动 lvm,第一次使用 lvm 时,请使用下面指令扫描并建立初始化环境:
# vgscan

如果之前会经使用 lvm 建立虚拟磁碟,执行下面指令便可以启动目前系统上的所有 VG
# vgchange –ay

若要关闭目前系统上所有 VG,请执行下面指令:
# vgchange –an

大多数发行版于开机时便会自动执行 vgscan vgchange -ay,所以通常不需要特别执行启动的指令。不过稍后建立虚拟磁区时,若是出现 lvm 未启动之类的讯息,请自行执行启动 LVM



~~~~~~~~~~~~~
新增与移除 PV
~~~~~~~~~~~~~
当启动 LVM 之后,便可以开始建立虚拟磁区。首先必须建立 PV,前面已经提到 PV 可以由分割区或是实体磁碟组成,如果想要将实体硬碟建立为 PV,请直接如下使用 pvcreate 指令即可:
# pvcreate /dev/hdd

若想要将分割区建立为 PV,必须多一个设定分割区的动作。例如想要将 /dev/hda7 建立为 PV则如下操作:
# fdisk /dev/had
Command (m for help): p ----->
列出硬碟的分割区状态
Command (m for help): t ----->
重新设定系统代号
Partition number (1-4): 7 ----->
选择第 7 分割区
Hex code (type L to list codes): 8e ----->
输入 8e 此为 LVM 的系统代号

# pvcreate /dev/hda7


PV
建立后,使用 pvdisplay 指令可观察系统上的 PV
# pvdisplay
"/dev/sdb" is a new physical volume of "20.00 GB"
--- NEW Physical volume ---
PV Name /dev/sdb ---------->PV
的名称
VG Name ---------->
隶属于哪一个 VG
PV Size 20.00 GB ---------->PV
的容量大小
Allocatable NO ---------->
PV 是否已经被系统使用
PE Size (KByte) 0 ---------->
每个 PE 的大小
Total PE 0 ---------->
总有多少 PE
Free PE 0 ---------->
可用的 PE 数量
Allocated PE 0 ---------->
已用的 PE 数量
PV UUID E783x2-1Xg0-p0tC-xAug-DgX8-wmq5-Hi1TQ2

若要移除 PV,则请如下使用 pvremove 指令:
# pvremove /dev/hda7



~~~~~~~~~~~~~~
新增与移除 VG
~~~~~~~~~~~~~~
例如,已经建立了 /dev/hda7 /dev/hdd5 两个 PV,想要将这两个 PV 合并为一个 VG,此时可以如下使用 vgcreate 指令建立 VG
# vgcreate home_vg /dev/hda7 /dev/hdd5

建立 VG 后,可以如下使用 vgdisplay 观察系统中的 VG
# vgdisplay -v home_vg
--- Volume group ---
VG Name home_vg ----->VG
的名称
System ID
Format lvm2 ----->VG
的格式
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 20.76 GB ----->VG
的容量大小
PE Size 4.00 MB ----->VG
内每个 PE 的大小
Total PE 5315 ----->VG
PE 总数量
Alloc PE / Size 0 / 0 ----->VG
内已用 PE 数量与已用的容量大小
Free PE / Size 5315 / 20.76 GB --->VG
内可用 PE 数量与可用的容量大小

注意:若不加 VG 名称,只执行 vgdisplay vgdisplay -v 的话,将显示系统上所有 VG 的资讯。

若要移除 VG请如下操作:
# vgchange -a n home_vg ----->
关闭名称为 home_vg VG
# vgremove home_vg



~~~~~~~~~~~~~~
新增与移除 LV
~~~~~~~~~~~~~~
使用 lvcreate 指令,在名称为 home_vg VG 上,建立两个 LV
# lvcreate -L5000 -n home1_lv home_vg

-L
参数指定 LV 的大小为 5000MB,也可以使用“2.5G”表示 2.5GB,或是“15000K”代表“15000KB”
-n
参数设定此 LV 的名称

如果没有使用“-n”参数指定 LV 名称,LVM 将自动依序使用 lvol0lvol2 等名称命名:
# lvcreate -L500 home_vg

可以使用 lvrename 指令,更改现有 LV 的名称:
# umount /dev/home_vg/lvol0
# lvrename /dev/home_vg/lvol0 var_lv

建立了 LV 后,可以如下使用 lvdisplay 观察系统中的 LV
# lvdisplay

--- Logical volume ---
LV Name /dev/home_vg/home1_lv ----->LV
的名称
VG Name home_vg ----->
所属的 VG 名称
LV Size 1.00 GB ----->LV
的容量大小
Current LE 256 ----->LV
LE 个数
Segments 2 ----->
LV 共跨越两个 PV

LV
建立之后,便可以当成一般分割区使用:
# mkfs.ext3 /dev/home_vg/home1_lv
或者 # mke2fs -j /dev/home_vg/home2_lv

# mount /dev/home_vg/home1_lv /home

# df –h
/dev/mapper/home_vg-home1_lv
1008M 34M 924M 4% /home

若想移除 LV请如下使用 lvremove 指令:
# umount /dev/home_vg/home1_lv

# lvremove /dev/home_vg/home1_lv



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正在运作的 VG 中新增或移除 PV
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VG 容量不够时,可以添加一颗硬碟,或是从现有的硬碟中寻找可用的分割区,然后将其建立 PV,接着将此新 PV 加入 VG 中,便可以立刻增加 VG 的容量。
例如:想要将 /dev/hda8 加入名称为 home_vg VG,则先使用 fdisk 更改 /dev/hda8 分割区的系统代码,然后执行如下:
# pvcreate /dev/hda8
# vgextend home_vg /dev/hda8
# vgdisplay -v home_vg



~~~~~~~~~~~~~~~~~~~~~~~~~~
正在运作的 VG 中移除 PV
~~~~~~~~~~~~~~~~~~~~~~~~~~
当硬碟使用已久需要更换,或是想要将某一个分割区移作他用,此时便必须将 PV 正运作 VG 中移除。
# pvdisplay

--- Physical volume ---
PV Name /dev/sdb
VG Name home_vg
PV Size 20.00 GB / not usable 4.00 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 5119
Free PE 4482 ----->
可用的 PE 数量
Allocated PE 637 ----->
已用的 PE 数量为 637

--- Physical volume ---
PV Name /dev/sdc1
VG Name home_vg
PV Size 784.39 MB / not usable 402.50 KB
Allocatable yes
PE Size (KByte) 4096
Total PE 196
Free PE 196
Allocated PE 0 ----->
已用 PE 0

如果想要移除 /dev/sdc1,因为其已用 PE 0,也就是其空间没有尚未被任何档案所使用,则可以如下直接使用 vgreduce 指令将其移除:
# vgreduce home_vg /dev/sdc1

若需要移除的是 /dev/hdd5,由于其空间已经被档案所使用,所以会得到下面的错误讯息
# vgreduce home_vg /dev/hdd5
Physical volume "/dev/hdd5" still in use -->
正在使用中,无法直接移除

此时必须先将 /dev/hdd5 内的档案搬移到其他 PV 后,才能将其移除。

如果 /dev/hdd5 所属的 VGhome_vg)仍有足够的可用空间,便可以使用 pvmove 指令搬移 /dev/hdd5 内的档案至其他 PV
# vgdisplay -v home_vg
......
Free PE / Size 9600 / 37.50 GB
......

# pvmove -v /dev/hdd5 --->
搬移 /dev/hdd5 内的档案

pvmove
指令会自动寻找 VG 中可用的 PV,然后将档案搬移过去。也可以如下指定将 /dev/hdd5 搬移到 /dev/hda8
# pvmove -v /dev/hdd5 /dev/hda8



~~~~~~~~~~~~~~~~~~~~~~~~
扩大与缩小 LV 的容量
~~~~~~~~~~~~~~~~~~~~~~~~
VG 中加入新的 PV,扩充 VG 总容量后,可能会想要将新增的容量加入现有的 LV,此时可以如下使用 lvextend 指令扩大 LV 容量:
# lvextend -L+1G /dev/home_vg/home1_lv
Extending logical volume home1_lv to 2.00 GB
Logical volume home1_lv successfully resized

# lvextend -L2G /dev/home_vg/home2_lv
Extending logical volume home2_lv to 20.00 GB
Logical volume home2_lv successfully resized

-L2G
/dev/home_vg/home2_lv 的容量调整为 2GB,也可以使用“M”表示 MB“K”代表“KB”,或是“-L+1G”表示增加 1 GB

注意:

虽然 LV 的空间已经扩大了,但是 LV 内的档案系统仍然需要调整,依照档案系统不同,使用修改程序将档案系统扩大。(查看扩大与缩小 Linux 分割区)

如果需要缩小 LV 的容量,先将 LV 内的档案系统缩小,然后才能调整 LV。下面以简要说明步骤,例如想要缩小 /dev/home_vg/home1_lv,而目前其所使用的档案系统为 ext3,所以先如下操作缩小档案系统:
# umount /dev/home_vg/home1_lv
# e2fsck -f /dev/home_vg/home1_lv
# resize2fs /dev/home_vg/home1_lv 3G

缩小档案系统后,便可以如下使用 lvreduce 指令调整 LV 的容量:
# lvreduce -L3G /dev/home_vg/home1_lv
/dev/home_vg/home1_lv 的容量调整为 3GB,也可以使用“M”表示 MB“K”代表“KB”,或是“-s-500M”代表减少 500MB

缩小 LV 时,LV 变更后的容量务必大于或等于其档案系统容量,否则将造成档案系统的错误。