全部博文(176)
分类: LINUX
2009-08-18 17:09:25
◆LVM有关概念
LVM(Logical Volume Manager)即逻辑卷管理器,它最先是在Linux 2.4内核中被集成到内核中去的,它的出现改变了传统的磁盘空间管理理念。以往在安装操作系统时需要规划好分区大小,即使利用了RAID技术也要规划好每 个分区的大小,因为一旦分好区后要改变其大小是非常困难的事情。在Windows下有大家熟悉的Partition Magic工具可以用来调整分区大小,但它有一个缺点是要么在调整前要关闭系统或调整后重启系统。
这在普通PC机上使用还行,要在提供不间断服务的服务器上使用就会造成服务中断,不过这个问题在Linux下随着LV技术的出现一切都得到解 决,LV可以在不用重启系统的情况动态增加可用空间大小,不过前提得是使用热插拔硬盘,或事先将硬盘装入而不使用。本文我将使用名词LV(可不是LV包) 而不是LVM,因为LV才是主角。
首先我们要弄清楚LV领取的几个关键名词概念:
物理介质:就是我们通常说的硬盘,简称pm
物理卷:就是我们通常说的硬盘分区,简称pv
物理分区:它是由LVM命令在物理卷上创建的最小LVM寻址单元,在创建物理卷时可以指定物理分区的大小,默认值是4M,简称pe
卷组:由一个多多个物理卷组成的逻辑单元,简称vg
逻辑分区:它与物理分区一一对应,大小相等,简称le
逻辑卷:从卷组中分配一定大小的空间创建的逻辑单元,也可以使用一个完整的卷组空间大小来创建一个逻辑卷,简称lv
上面这几个关键名词的关系可以用下图来解释:
图中没有给出le(逻辑分区),因为它对于描述整个概念来说不太重要。如何理解这个图呢?
首先pv1和pv2是物理卷,pv1对应的可能是一整块硬盘,也可能是硬盘中的一个分区,如/dev/hda1,pv2也应这样理解;pv1中包含 的pe1,pe2,pe3都是经过pvcreate命令在pv1上做的标记,可以理解为将pv1分解成3个小块,响应的pv2下的pe1,pe2,pe3 也做此理解;
vg1是卷组,它是由pv1下的pe1和pe2组成的,即从pv1的空间中分一部分(pe1和pe2)来组成卷组vg1,并且我给该卷组命名为 oracle,注意物理卷没有名字,直接用/dev/hda1或/dev/sda的形式来称呼它,vg2是跨了两个物理卷组成的,它是由pv1中的pe3 和pv2中的pe1,pe2组成,可以看出卷组可以跨我们通常所说的硬盘分区,也可以跨多个硬盘;
lv1是在卷组vg1上创建的逻辑卷,它使用了整个vg1的空间,而lv2和lv3都是从vg2空间创建的逻辑卷,可以看出一个卷组可以包括一个或 多个逻辑卷,注意逻辑卷不能跨卷组,也就是说如果要想在两块硬盘上创建一个逻辑卷,必须经过卷组的转换才能实现,因为卷组是可以跨多块硬盘的;
在逻辑卷的基础上我们可以创建文件系统,如ext3,jfs等,和在普通分区上创建文件系统没有什么区别,最后可以将逻辑卷挂载在某个挂载点上,如/oracle。
◆创建LV
我这里打算以Red Hat Enterprise Linux 5为系统环境,介绍一下在命令行的操作,不过其他发行版应该都适用,至于在图形界面下的操作我尝试了一下反而不习惯,所以本文就省略掉在图形界面的操作。
要创建一个lv,从上面的图中可以看出,首先得准备好一块硬盘或一个分区,注意分区还得是Linux LVM类型,下面我一步一步说明:
假设已经在系统中增加了3块硬盘,分别是/dev/hda,/dev/hdb,/dev/hdd,因为/dev/hdc被光驱占用了,每块硬盘大小假设是100M,以/dev/hda为例,其他类推
#fdisk /dev/hda |
回车,输入n(创建一个新分区),回车,输入p(创建一个主分区),回车,输入1(主分区号),回车,回车(输入分区起始地址,默认1),回车(输 入分区结束地址,默认是整块硬盘的最后一数据块),输入t(修改分区类型,默认是83),回车,输入8e(Linux LVM分区类型),输入w(保存并退出),这样会创建/dev/hda1分区,完全占用了硬盘/dev/hda的空间。同样对/dev/hdb和/dev /hdd做对应的操作。
前面的操作完成后,就可以开始创建pv了
#pvcreate /dev/hda1 #pvcreate /dev/hdb1 #pvcreate /dev/hdd1 |
物理卷pv创建成功会有类似【Physical volume "/dev/hdd1" successfully created】的提示。可以使用pvdisplay命令查看物理卷的详细信息。执行pvcreate命令后会向硬盘中写如pv信息,同时也会在/etc /lvm/backup目录下产生同样的pv信息文件。
接下来就可以创建卷组vg了
#vgcreate oracle /dev/hda1 #vgcreate src /dev/hdb1 #vgcreate ftp /dev/hdd1 |
注意:创建卷组时如果使用默认的参数,最后在此基础上创建逻辑卷时会有大小限制,默认最大不能超过256G,如果在生产系统中规划逻辑卷大小会超过256G时,那么在创建卷组时就要使用参数-s并指定一个分为大小,如32M,这样创建的卷组就可以容纳2T的逻辑卷了。如:
#vgcreate -s 32M /dev/hda1 |
创建卷组时要为卷组指定一个名字,如该卷组会用来存储oracle数据,就可以命名为oracle,如果是用来存储源代码,就可以命名为src,当 然随你喜欢了,执行vgcreate命令后会向硬盘中写入卷组信息,也会在/etc/lvm/backup目录下的对应文件中写入卷组信息。有兴趣的读者 可以打开看看,都是文本格式的文件。卷组创建好后可以使用命令vgdisplay命令查看其详细信息。
卷组创建好后,就可以开始创建主角逻辑卷了
#lvcreate -L10M -noracle oracle |
这里的-L参数后跟的是该逻辑卷的大小,它们之间没有空格,-n参数后跟的是该逻辑卷的名字,最后是卷组的名字。
创建好后可以使用命令lvdisplay命令查看其详细信息,执行lvcreate命令会向硬盘中写入逻辑卷信息,对应的/etc/lvm/backup下的文件也会得到更新。
接下来可以在逻辑卷上创建文件系统了
#mkfs.ext3 -j /dev/oracle/oracle # mkfs.ext3 -j /dev/src/src # mkfs.ext3 -j /dev/ftp/ftp |
创建挂载点
#cd / #mkdir oracle src ftp |
挂载逻辑卷
#mount /dev/oracle/oracle /oracle #mount /dev/src/src /src #mount /dev/ftp/ftp /ftp |
这里挂载时是不需要指定文件系统类型的。
#ls /oracle |
返回lost+found文件夹,说明挂载成功。
至此,我们已经可以正常使用逻辑卷了,如在挂载点下创建目录,创建文件,设置权限等。不过逻辑卷的使用远不止这么简单,下面就列举一些在实际工作中会遇到的问题及处理办法。
◆增加LV大小
在创建LV时指定的大小现在可能已经不够使用了,这与普通分区空间快要用完的情景非常类似,但使用LV时可以动态增加其大小,而要增加分区大小,事 情就麻烦多了。但不是说想使LV增大就能增大的,它还受限于卷组大小和物理卷大小,如果卷组空间已经完全分配,那么要增大LV就必须先增加可用物理卷。这 里以逻辑卷lv1(oracle)为例进行说明,增加逻辑卷大小要使用的命令是lvextent
#lvextent -L+10M /dev/oracle/oracle #lvdisplay |
这时看到逻辑卷大小已经变大了,但这并不意味着文件系统就随着一起变大了,此时mount上后,用df命令查看还是增大前的大小,这时需要用到另一个工具ext2resize,因国内被封,从下面的地址下载,ext2resize 是一款可以增大/减小ext2/ext3文件系统的工具,其实lvextent带有一个-r参数也是重设文件系统大小的,但我在系统中没有发现fsadm 这个命令,它应该是包括在lvm的软件包中,但不知何故我这里没有。安装ext2resize需要创建一个sct用户,安装后有2个命令 ext2resize和ext2online,ext2resize命令必须要在卸载文件系统的情况下才能使用,ext2online可以实现在线重设文 件系统大小。
#ext2online /dev/oracle/oracle 24M |
这里的24M即逻辑卷oracle新的大小,在创建逻辑卷时指定大小是10M,但时间创建后是12M,扩展了10M实际上也用掉了12M,所以这里应该就是24M。如果指定大于24的值会报错,而且ext2online命令只能在线增大,不能在线减小。
#df -lh |
这时就能看到文件系统变为24M了,与逻辑卷大小一致了。使用ext2online的一个好处是,如果你在该逻辑卷上有正在运行的程序,不能终止服务,但空间快用光了,这时可以透明地增加其大小,不影响服务。
◆减少LV大小
有时也需要减小LV大小,如减小其中一个LV大小,然后增加另一个LV大小。减小LV大小使用命令lvreduce,减少LV大小前先用ext2resize减少文件系统大小,这与增大的过程是相反的,然后再用lvreduce减少逻辑卷大小。
#umount /oracle #ext2resize /dev/oracle/oracle 10M #lvreduce -L-14M /dev/oracle/oracle #mount /dev/oracle/oracle /oracle #df -h |
这时看到/oracle文件系统大小只有9.5M了。
注意ext2resize后的10M是目标大小,即减小为多大,lvreduce命令-L参数后的-14是指减少多少,为了pe和le一一对应,这里就设为14M,其实真正减少不了14M,只能减小12M,这一点可以用lvdisplay命令查看。
注意:减小LV可能会造成数据丢失,所以先要做一次全备份,然后卸载掉文件系统,再进行操作。
◆利用LV快照备份数据
LVM提供了为逻辑卷作一个快照的功能,目的是想对逻辑卷进行一致性备份,由于它采用了写时复制技术,使得不用停止服务或将逻辑卷设为只读进行备 份,因为备份时文件可能正在被写入数据,如数据库文件,LVM提供的快照功能只是记录了文件系统的改变,它并不是对整个文件系统进行备份。
因此备份时要用的空间大小与备份逻辑卷大小不一定要相等,快照使用空间的大小取决于有多少数据正在写入逻辑卷,以及想要保存快照多长时间,快照指定 的空间用光时,快照就失效了,需要人工删除。实际上创建快照也是创建了一个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不一样。下面以为/dev /oracle/oracle创建一个大小为20M的快照为例,创建快照使用的命令还是lvcreate:
#lvcreate -L20M -s -n oracle_snap /dev/oracle/oracle |
该命令执行结束后,会在/dev/oracle目录下创建一个新的文件oracle_snap,可以使用lvdisplay命令来查看该快照逻辑卷的信息:
它与其他逻辑卷的信息不同,多了一项Allocated to snapshot,这是属性指出了快照空间的使用百分比,目前使用了0.12%,同时注意逻辑卷/dev/oracle/oracle也多了一个属性LV snapshot status,它指出了快照的路径和状态,图中是/dev/oracle/oracle_snap [active],意思是它的快照oracle_snap目前是活动状态。如果我们向/dev/oracle/oracle中填充1M大小的数据,那么快 照空间的百分比就会变化(增大)。创建快照后,可以象使用逻辑卷一样进行挂载,然后进行备份。最后不用快照了,使用lvremove /dev/oracle/oracle移除快照。
◆硬盘替换
以往如果硬盘坏掉,意味着数据丢失,于是人们发明了RAID技术,LVM本身不具备数据冗余功能,但它可以建立的RADI技术之上,即先用几块硬盘 组成RAID阵列,再在阵列上进行分区,然后在其上建立逻辑卷,如果是这种情况,其中一块硬盘坏掉,如果是RAID5,那么可以直接拔掉坏硬盘,插一块好 的即可。在使用LV的情况下,可以不用重启系统将一块硬盘中的数据转移到另一块上,实际上只需要一个命令pvmove就可以了。这里以移动/dev /oracle/oracle上的数据到/dev/src/src为例进行说明。
首先在/oracle上创建1个文件
#echo 1111>/oracle/1.txt |
将第二块硬盘加入同一卷组,这里假设将/dev/hdb加入到卷组oracle中
#lvremove src #vgremove src |
这两个命令是将卷组src占用的pv腾出来。
#vgextent oracle /dev/hdb1 |
将/dev/hdb1分区加入卷组oracle,这时可以移动分区了
#pvmove /dev/hda1 |
这样将原来的/dev/hda1是的数据全部转移到新的分区/dev/hdb1上了,现在可以将/dev/hda1从卷组oracle中移除。
#vgreduce oracle /dev/hda1 |
重新挂载
#mount /dev/oracle/oracle /oracle |
查看前面创建的文件1.txt是否还在
#ls /oracle |
可以看到文件还在,说明移动成功,这样也就完成了硬盘替换。可以看出替换硬盘没有重启系统,实现了在线替换。整个替换流程如下图所示:
◆将硬盘移到另一台计算机上
在使用普通分区的情况下,将硬盘挂接到其他机器上非常简单,拔下来插上去即可使用,在使用了LVM的情况下,要稍微多一点事情,因为LV的结构是同 时保存在硬盘中也保存在/etc/lvm/backup下,在将硬盘移动前,要将这里面的信息删除,这是通过LVM附带的一个命令vgexport实现 的,到了另一台机器上后,要创建这个信息,是通过vgimport来实现的,下面以/dev/hda为例进行说明。
首先在机器1上:
#vgchange -a n oracle |
这条命令是将卷组oracle设为不可用状态
#vgexport oracle |
注意这里不要理解为导出,实际上这个命令是从源系统中注销卷组。
在机器2上:
#vgimport oracle /dev/hda1 |
在机器2上注册卷组oracle
#vgchange -a y oracle |
激活卷组oracle,这样硬盘就从一台机器移动到另一台机器了。
注意:如果在你的发行版中运行vgimport命令没有在/etc/lvm/backup目录下创建LV信息备份文件,需要手动运行vgcfgbackup命令来备份。
整个流程如下图所示:
◆转移到LV
这里转移的意思是从现有的普通分区模式转移到用LV管理分区的模式,如我在安装系统时/home文件系统的大小我设为1G,现在发现空间快被填满 了,打算增加/home大小,按照以前的管理模式,实现起来非常麻烦,而且数据丢失风险较大,下面我就其转移为以LV管理模式进行举例说明。
首先要清楚一点,这个转移不是类似从ext2转换到ext3的过程,它需要几个步骤:
1、增加一个新分区,假设是/dev/hda6,大小2G
2、将该分区转为物理卷,通过命令pvcreate实现
#pvcreate /dev/hda6 |
3、创建卷组home_dir,并将hda6加入该卷组
#vgcreate home_dir /dev/hda6 |
4、创建逻辑卷home_dir
#lvcreate -L2G -nhome_dir home_dir |
5、创建挂载点
#mkdir /home_dir |
6、创建文件系
#mkfs.ext3 -j /dev/home_dir/home_dir |
7、挂载逻辑卷
#mount /dev/home_dir/home_dir /home_dir |
8、拷贝源/home目录下的所有内容
#cp -avx /home/* /home_dir |
9、重命名源/home名称
#mv /home /home_old |
10、卸载home_dir
#umount /home_dir |
11、重命名home_dir
#mv /home_dir /home |
12、挂载新的/home
#mount /dev/home_dir/home_dir /home |
13、如果不出现故障,可以将/home_old删除
#rm -Rf /home_old |
至此,就将原来固定分区大小管理的/home转移到用LV管理的/home了,以后再遇到空间不足的情况就可以使用动态增加空间的功能增加其大小了。
◆一些注意事项
1、/boot不能使用LV,系统启动时还来不及加载LV驱动,造成系统启动失败。
2、增加或减少LV空间大小时,保险起见要先umount文件系统,再执行增加或减少命令,那么根文件系统使用LV时就不应该做增大或变小操作,因为无法umount根文件系统,即使强制做了也可能会造成系统启动失败。
3、创建卷组时必须要指定名称,创建逻辑卷时可以不指定名称,默认以LogVol00开始命名。
4、创建逻辑卷时一定要指定空间大小,即-L参数,默认不是使用全部的vg空间。
5、如果mount逻辑卷时提示必须指定文件系统类型,多半是因为还没有创建文件系统,即还没有使用mkfs.ext3之类的命令。
6、在执行命令时多仔细看其返回的信息,LVM命令通常能够返回非常易懂的信息,在解决故障时非常有用。
【相关文章】