Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397971
  • 博文数量: 92
  • 博客积分: 3153
  • 博客等级: 中校
  • 技术积分: 780
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-03 16:26
文章存档

2011年(21)

2010年(71)

分类: LINUX

2010-08-03 11:17:40

LVM == Logical Volume Manager 
参考:


摘要
Linux用户安装Linux操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具(比如Patition Magic等),但这都只是暂时解决办法,没有根本解决问题。随着Linux的逻辑盘卷管理功能的出现,这些问题都迎刃而解,本文就深入讨论LVM技术,使得用户在无需停机的情况下方便地调整各个分区大小。


一、 前言

每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。

虽然现在有很多动态调整磁盘的工具可以使用,例如Partation Magic等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的,而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解决问题。

因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,Logical Volume Manager)机制就是一个完美的解决方案。

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统
管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。


二、 LVM基本术语

前面谈到,LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。
其中, /dev/hd* 是指 IDE 硬盘,/dev/sd* 是指 SCSI 硬盘。

物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。 

卷组(Volume Group)
LVM卷组类似于 非LVM系统 中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。 

逻辑卷(logical volume)
LVM的逻辑卷类似于 非LVM系统 中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。 

PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。 

LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。 

参考下面的图加深理解:

首先可以看到,物理卷(PV)被由大小等同的基本单元PE组成(PE大小可以定义,默认为4M)。
 
一个卷组由一个或多个物理卷组成,PE和LE有着一一对应的关系。
逻辑卷建立在卷组上。逻辑卷就相当于非LVM系统的磁盘分区,可以在其上创建文件系统。
 
卷组(VG)可以理解为由几个物理卷(PV)形成的存储池;在存储池上可以划分出一定容量做逻辑卷(LV),只要存储池空间足够大,可以动态从存储池中划出空间给逻辑卷使用;而文件系统(FS)是创建在逻辑卷上的,由此可以实现动态调整文件系统的大小。

下图是磁盘分区、卷组、逻辑卷和文件系统之间的逻辑关系的示意图:
 
和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中。VGDA包括以下内容: PV描述符、VG描述符、LV描述符、和一些PE描述符 。

系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。


三、 安装LVM

首先确定系统中是否安装了lvm工具(以下是Redhat Linux AS3 U5下的结果):
# rpm -qa|grep lvm
lvm-1.0.8-12.2

如果命令结果输入类似于上例,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络下载或者从光盘装LVM rpm工具包。

安装了LVM的RPM软件包以后,要使用LVM还需要配置内核支持LVM。RedHat默认内核是支持LVM的,如果需要重新编译内核,则需要在配置内核时,进入Multi-device Support (RAID and LVM)子菜单,选中以下两个选项: 

Multiple devices driver support (RAID and LVM) 
<*> Logical volume manager (LVM) Support 

然后重新编译内核,即可将LVM的支持添加到新内核中。

为了使用LVM,要确保在系统启动时激活LVM,幸运的是在RedHat7.0以后的版本,系统启动脚本已经具有对激活LVM的支持,在/etc/rc.d/rc.sysinit中有以下内容:

# LVM initialization
if [ -f /etc/lvmtab ]; then
[ -e /proc/lvm ] || modprobe lvm-mod > /dev/null 2>&1
if [ -e /proc/lvm -a -x /sbin/vgchange ]; then
action $"Setting up Logical Volume Management:" /sbin/vgscan && /sbin/vgchange -a y
fi
fi


其中关键是两个命令,vgscan命令实现扫描所有磁盘得到卷组信息,并创建文件卷组数据文件/etc/lvmtab和/etc/lvmtab.d/*;vgchange -a y命令激活系统所有卷组


四、 创建和管理LVM

要创建一个LVM系统,一般需要经过以下步骤:

Step1: 创建分区(fdisk)
使用分区工具(如:fdisk,sfdisk等)创建LVM分区(LVM正规的的分区类型为8e)。

例如对某个磁盘进行分区:
fdisk -l /dev/sdc
进入fdisk交互界面,根据fdisk命令提示进行分区操作。注意将LVM的分区类型改为 8e 。
fdisk /dev/sdc

The number of cylinders for this disk is set to 4427.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): m
Command action
a   toggle a bootable flag
b   edit bsd disklabel
c   toggle the dos compatibility flag
d   delete a partition
l   list known partition types
m   print this menu
n   add a new partition
o   create a new empty DOS partition table
p   print the partition table
q   quit without saving changes
s   create a new empty Sun disklabel
t   change a partition's system id
u   change display/entry units
v   verify the partition table
w   write table to disk and exit
x   extra functionality (experts only)

输入m打印命令行帮助。
输入n增加一个新分区。
输入l查看分区类型列表(82 Linux swa ;83 Linux ;8e Linux LVM ;a5 FreeBSD )。
输入p打印分区信息。
输入t改变一个分区的分区类型
输入d删除一个分区。
输入w保存分区表并退出。
输入q放弃分区表修改并退出。

Step2: 创建物理卷(pvcreate)
创建物理卷的命令为 pvcreate ,利用该命令将希望添加到卷组的所有分区或者磁盘创建为物理卷。即将物理分区创建成LVM系统能识别的物理卷。

如果需要在创建物理卷前先清空磁盘分区上的数据,执行以下命令完成:
dd if=/dev/null of=/dev/sdc1
dd if=/dev/null of=/dev/sdc2

将整个磁盘创建为物理卷的命令为:
pvcreate /dev/sdc

将单个分区创建为物理卷的命令为:
pvcreate /dev/sdc1
pvcreate /dev/sdc2

创建完物理卷后,可以使用 pvscan 命令扫描查看当前系统的物理卷情况
pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/sdc1" is in no VG [7.64 GB]
pvscan -- total: 1 [7.64 GB] / in use: 0 [0] / in no VG: 1 [7.64 GB]


使用 pvdisplay 查看单个物理卷的信息
pvdisplay /dev/sdc1
pvdisplay -- "/dev/sdc1" is a new physical volume of 7.64 GB


Step3: 创建和管理卷组(VG)

3.1)创建卷组(vgcreate)

创建卷组的命令为 vgcreate 
。将使用pvcreate建立的物理卷(PV)创建为一个完整的卷组(VG):
# vgcreate vg_test /dev/sdc1 /dev/sdc2

vgcreate命令第一个参数是指定该卷组的逻辑名:vg_test ,可根据需要定义为任何名字。后面参数是指定希望添加到该卷组的所有分区和磁盘(这些分区或磁盘是经过pvcreate处理过的可识别的物理卷)

vgcreate在创建卷组 vg_test 以外,还设置使用大小为4 MB的PE(默认为4MB),这表示卷组上创建的所有逻辑卷都以 4 MB 为增量单位来进行扩充或缩减。由于内核原因,PE大小决定了逻辑卷的最大大小,4 MB 的PE决定了单个逻辑卷最大容量为 256 GB,若希望使用大于256G的逻辑卷则创建卷组时指定更大的PE。PE大小范围为 8KB 到 512MB,并且必须总是 2 的倍数(使用-s指定,具体请参考man vgcreate)

vgcreate -s 4M vg_test /dev/sdc1 /dev/sdc2

使用 vgscan 扫描系统中的卷组情况并创建其信息文件
vgscan

使用 vgdisplay 显示系统当前卷组情况
vgdisplay -v

一个一个的卷组(VG),形成了一个一个的存储池。可以从存储池中划分一定的容量来做逻辑卷。

3.2) 激活和停止卷组(vgchange)
为了立即使用卷组而不是重新启动系统,可以使用 vgchange 来激活卷组
vgchange -a y vg_test

停止卷组:
vgchange -a n vg_test
vgchange -- volume group "vg_test" successfully deactivated

3.3)添加新的物理卷到卷组中(vgextend)
系统安装了新的磁盘并创建了新的物理卷(PV),需要将其添加到已有卷组(VG)时,就需要使用 vgextend 命令
vgextend vg_test /dev/sdc3
这里 /dev/sdc3 是新的物理卷。

3.4)从卷组中删除一个物理卷(vgreduce)
要从一个卷组中删除一个物理卷,首先要确认要删除的物理卷没有被任何逻辑卷正在使用,就要使用 pvdisplay 命令察看该物理卷上是否有逻辑卷

pvdisplay -v /dev/sdc2 
--- Distribution of physical volume ---
LV Name                   LE of LV PE for LV
/dev/vg_test/lvtest1      4         4       
/dev/vg_test/lvtest2      4         4

如果某个物理卷正在被逻辑卷所使用,就需要将该物理卷的数据备份到其他地方,然后再删除。删除物理卷的命令为vgreduce

vgreduce vg_test /dev/sdc2

3.5)删除一个卷组(vgremove)
删除一个卷组 vgremove 
vgremove vg_test
vgremove -- volume group "vg_test" successfully removed


Step4: 创建和管理逻辑卷(LV)

4.1)创建逻辑卷(lvcreate 

创建逻辑卷的命令为 lvcreate
 :
lvcreate -L 8G -n lv_test vg_test

该命令就在卷组 vg_test 创建名字为 lv_test,大小为 8G 的逻辑卷,并且设备入口为 /dev/vg_test/lv_test(vg_test为卷组名,lv_test为逻辑卷名)。如果希望创建一个使用全部卷组的逻辑卷,则需要首先察看该卷组的PE数,然后在创建逻辑卷时指定:

# vgdisplay vg_test| grep "Total PE"
Total PE 45230
# lvcreate -l 45230 -n lv_test vg_test 

可以 man lvcreate 查看各个参数的使用。-L 后面直接跟空间大小;-l 后面跟PE数量(PE数量 X 每个PE大小=空间大小)

4.2)删除一个逻辑卷(lvremove)
删除逻辑卷以前首先需要将其上面的文件系统卸载,然后才能进行删除操作。命令为:lvremove 

umount /home/zjw/lvmtest
lvremove /dev/vg_test/lv_test
lvremove -- do you really want to remove "/dev/vg_test/lv_test"? [y/n]: y
lvremove -- doing automatic backup of volume group "vg_test"
lvremove -- logical volume "/dev/vg_test/lv_test" successfully removed

4.3)扩展逻辑卷大小(lvextend)

LVM提供了方便调整逻辑卷大小的能力,扩展逻辑卷大小的命令是 lvextend。

lvextend -L 12G /dev/vg_test/lv_test
lvextend -- extending logical volume "/dev/vg_test/lv_test" to 12 GB
lvextend -- doing automatic backup of volume group "vg_test"
lvextend -- logical volume "/dev/vg_test/lv_test" successfully extended

上面的命令就实现将逻辑卷lv_test的容量扩为总共12G。

# lvextend -L +1G /dev/vg_test/lv_test
lvextend -- extending logical volume "/dev/vg_test/lv_test" to 13 GB
lvextend -- doing automatic backup of volume group "vg_test"
lvextend -- logical volume "/dev/vg_test/lv_test" successfully extended

上面的命令就实现将逻辑卷lv_test的容量再增加1G。

lvextend 后面的 -L 参数直接跟容量大小,G/M为单位; -l 参数后面跟PE数量:
lvextend -l +100 /dev/vg_test/lv_test
即给逻辑卷 lv_test 增加100个PE的容量;如果每个PE大小为4M,则增加了 100*4M 的空间

4.4)减少逻辑卷大小(lvreduce)
使用 lvreduce 即可实现对逻辑卷的容量,需要首先将该逻辑卷上的文件系统卸载,然后借助resize2fs、resize_reiserfs 等工具先对文件系统进行缩减

umount /home/zjw/lvmtest
resize_reiserfs -s-2G /dev/vg_test/lv_test
lvreduce -L-2G /dev/vg_test/lv_test
mount -t reiserfs /dev/vg_test/lv_test /home/zjw/lvmtest

调整分区另一实例(用 resize2fs 来操作文件系统):
原 /home 文件系统有 870+G 左右,/var 文件系统有8G左右;
需要从 /home 中调出 320G到 /var。
# umount /home
# resize2fs /dev/sys/home 550G
lvreduce -L-320G /dev/sys/home
# mount /dev/sys/home /home

lvextend -L +320G /dev/sys/var
resize2fs -f /dev/sys/var


Step5: 创建和管理文件系统(FS)

5.1)创建文件系统
文件系统创建在逻辑卷上,Linux一般选用ext3类型的文件系统
mkfs -t ext3 -b 4096 /dev/vg_test/lv_test

创建了文件系统以后,就可以加载并使用它:
mkdir /home/zjw/lvmtest
mount /dev/vg_test/lv_test /home/zjw/lvmtest

如果希望系统启动时自动加载文件系统,则还需要在/etc/fstab中添加内容:
vi /etc/fstab
/dev/vg_test/lv_test /home/zjw/lvmtest ext3 defaults 1 2

5.2)调整文件系统的大小
文件系统是建立在逻辑卷上的,文件系统的容量调整同样涉及到逻辑卷大小的调整。请参考上面逻辑卷的相关操作。

调整文件系统大小前,需要先将它umount,否则会被提示不允许调整
umount /home/zjw/lvmtest

查看当前卷组的情况,注意看看卷组里还有多少空间可用(Free PE / Size       54 / 1.69 GB)

vgdisplay -v vg_test 

然后使用 lvextend 命令给逻辑卷扩容(或 lvreduce减少逻辑卷大小)
lvextend -L +100M 
/dev/vg_test/lv_test

逻辑卷扩容后,再使用 resize2fs 等工具重新对该逻辑卷上的文件系统进行扩容
resize2fs -f /dev/vg_test/lv_test
resize2fs 1.32 (09-Nov-2002)
The filesystem on /dev/vg_test/lv_test is now 262144 blocks long.

操作完后,重新mount上即可
mount /dev/vg_test/lv_test /home/zjw/lvmtest

如果是对 /home 这个文件系统做调整,有一定的特殊性。因为Linux 用户的根目录一般是放在 /home/ 下,当前你以你的个人帐号登入系统时,会登陆到你的根目录。因此会导致你无法卸载 /home 这个文件系统。

修改 /etc/ssh/sshd_config ,允许 root 帐号远程登陆: PermitRootLogin yes
vi /etc/ssh/sshd_config
PermitRootLogin yes
然后重启 sshd 服务。
/etc/init.d/sshd restart
以root帐号登陆,将 /home 目录卸载。


五、 总结

根据上面的讨论可以看到,LVM具有很好的可伸缩性,使用起来非常方便。可以方便地对卷组、逻辑卷的大小进行调整,更进一步调整文件系统的大小。如果希望了解更多信息,请参考LVM-HOWTO。

创建 LVM 的一般过程:
对磁盘分区(fdisk) --> 创建物理卷(pvcreate) --> 创建卷组(vgcreate) --> 创建逻辑卷(lvcreate) --> 创建文件系统(mkfs) --> 挂载文件系统(mount) --> 添加到文件系统列表(/etc/fstab)

删除 LVM卷组 的一般过程:
卸载文件系统(umount) --> 卸载逻辑卷(lvremove) --> 停止卷组活动(vgchange -an) --> 删除卷组(vgremove)
必要时还需清理一下文件系统列表(/etc/fstab)

重要提醒:在做相关文件系统调整前,请做好重要资料的备份,以防止丢失。


附:同事测试的,无需umount文件系统的扩展:

文档很详细呦。我这里补充一个,动态扩展分区,不需要umount分区。

建立分区

fdisk /dev/hdc
n; 建立分区
p;选择建立主分区
1;选择主分区为1
t,8e;修改分区为LVM分区

partprobe ;激活分区信息。
reboot

pvreate /dev/hdc1 ;创建
vgextend sys /dev/hdc1;向现有的lvm组中添加磁盘
lvextend -L+100M /dev/sys/home ; 动态扩展;lvm分区步骤1。
ext2online /dev/sys/home; 动态扩展lvm分区步骤2。
阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~