这次中规中矩的写一回LVM

LVM

lvm的英文全名是logical volume manager,顾名思义lvm就好像有逻辑的管理卷的管家一样,也叫做“逻辑卷管理”。是传统Unix下高级管理非常强大的磁盘管理工具,!而在linux系统下lvm也是对于磁盘分区的一种管理机制。

设想下面一个场景,当你最初规划主机的时候,给/home这个分出50GB,等到用户不断增加,然后你某天无意一个`df -h`,use%突破80%多了,怎么办?给它重新加一块新硬盘,再去做分区、格式化、挂载,然后再将以前即将满负荷的旧磁盘数据拷贝过来?若是服务器呢?假设是多人在线的服务器,你还要提前通知他们停止使用电脑,待我把数据拷贝过来么?这样一次可以,来回弄几次,我想回头老板就找你喝茶啦。

其实在linux系统下有个特别好用的磁盘管理机制就是lvm,它的弹性调整文件系统的容量使这个棘手的问题不再是难关,lvm可以根据需要扩充或者缩小磁盘容量,甚至可以在系统运行过程中把一个分区临时加进来当做扩充,真的是非常好用!说起lvm,就不得不谈谈组成它的各部分是什么。讲讲它是什么做的吧。

lvm的作法是:

1、可以使用虚拟机虚拟出几个分区。

2、或者是使用真实的物理磁盘或者是分区。

把以上的通过软件把它们组合成一块看起来像是一个独立的大容量的磁盘,再把这个大容量的磁盘通过分区的方法使它们变成一个个的逻辑卷分区,最后把这些逻辑卷通过格式化和挂载,就能为我们所用了!

这里其实有几个概念,希望朋友们牢记。

1、pv是什么?

pv在英文全称就是physical volume,翻译过来就是物理卷设备。pv是组成lv的根基,把它们通过pvcreate命令变成能被操作系统识别的vg,再由vgcreate的方法变成lv啦

2、vg是什么?

vg的英文全称就是volume group,即“卷组”。它就是上述所说的“大硬盘”,它最大的容量是多大呢?然而这要看pe的数量。

3、pe是什么?

physical extend,物理的拓展块。在lvm默认的情形下,pe的默认单位是4MB。它是整个lvm里面最小的存储块,而实际上我们写入文件数据都是由pe写入处理的。

4、lv是什么?

logical volume,逻辑卷。它就像磁盘的分区一样,你可以把它进行格式化挂载,方便我们弹性使用了!这里有个概念,实际上lv的容量是由pe的个数和每个pe的大小加起来决定的。

它的效果如下图

首先,我们展示一下如何创建LV       

   step1、先对已购买的物理磁盘或者是虚拟机划分的磁盘进行分区。

我这里使用fdisk命令对/dev/sdc下的设备分了三个分区,分别是

/dev/sdc1,

/dev/sdc2

/dev/sdc3。而且三个分区的文件系统格式都为8e      即linux LVM。

   step2、然后再创建pv即物理卷组。

命令:pvcreate [options] PhysicalVolume

PhysicalVolume就是你分区设备的名字,我这里就是上述的三个分区。 看,显示successfully created以成功建立。

step3、在pv基础上建立vg,即volume group 逻辑卷组

命令:vgcreate [options] VolumeGroupName PhysicalDevicePath... 注意这里volumegroupname是你要为你所创建的vg组起个名字,比如叫bill,而后面的PhysicalDevicePath则是你物理磁盘分区的路径,这里个人推荐用绝对路径,因为这样不容易产生歧义。

这里还有个选项-s,可以定义PE的大小,即为physcial Extend大小,因为PE是逻辑卷的直接存储单元,而LV只是含有多少PE的个数。这里PE的大小默认是4MB

如果创建成功,则会在屏幕显示volume group XXX successfully created创建成功。

而假设想看自己创建的vg设备,可以使用命令 vgs or vgdisplay,两个命令都可以把vg的信息输出到屏幕上,相比之下vgdisplay较为详细。

step4、very important的一步,创建逻辑卷 LV(这里LV不是那些奢侈的包包儿啊~~~)

让我们看下创建LV的命令格式

# lvcreate -n 这里键入你要为lv起什么名字 -L 这里键入逻辑卷的大小,如果不加+符号,后面跟数字,表示直接分配多少数量的容量给LV 后面支持的单位有bBsSkKmMgGtTpPeE。

这里我给LV起个名字叫billy,区别于vg的bill,看!效果下图:

这里我们可以使用命令lvs或者lvdisplay来查看lv的信息。

其次,创建完成了还没有办法立即使用,好比敲锣打鼓把花轿抬到洞房那,结果发现不知道在哪个单元的几楼而且也房子也没有装修,还是毛坯房,结果岂不是很糟。

于是乎我们执行下面两步:

step1、把创建好的逻辑卷给建立文件系统(又称格式化),但是先要找到它的位置不是?

一般来说刚创建好的LV的位置在/dev/mapper/vg的名字-lv的名字。

那好,我们来找找billy,并顺便把它给格式化喽

下面就是第二步了

step2、把建立好的lv进行最后一步,挂载到linux下的某个目录下,就可以做数据存储了。我们这里提前在tmp下建立好一个叫mountbilly的目录,用于挂载生产的LV

tara!

注意!

本文还没有结束,这里还是几个LV的命令,包括如何扩建和缩减LV的容量,以及给LV创建快照!

关于对LV的容量扩展

我们可以使用lvextend命令对LV进行扩展,这里需要注意,你要扩展的容量不能超过VG的容量,而且还要注意当你用lvextend扩展完以后还要使用resize2fs 命令对文件系统进行扩展!

#lvextend -L 扩展的大小 后面跟上数字n 如果想在原有的基础上再加上多少容量要用“+”号,如对LV billy在原来10G的容量上扩充到13G,看!

关于对LV的容量缩减

我们也可以使用lvreduce命令对LV进行缩减,注意!首先保证最好你进行的是离线操作

这里要缩减前,先要对LV进行umount卸载,把设备卸载掉,然后要使用命令e2fsck -f执行强制检查。

检查ok

然后先要对文件系统进行缩减,再对LV大小进行缩减,看!

缩减到11G了

关于给LV创建snapshot(快照)

在lvcreate中有这么一个选项 [-s|--snapshot [VolumeGroup{Name|Path}/] -s表示创建快照,这里可以配合使用其他选项譬如--size=-L 指定快照大小来进行对LV进行快照,而快照最好设定一下快照的权限,把它设成只读的吧~

ok,快照创建完成。

不过这里要注意的是,万一你创建快照的时候,别人有数据正在写入怎么办?所以一般来说为了不出错,可以采取下列三步,第一临时把LV挂载成只读挂载,然后再创建LV的快照,最后在把挂载改成读写挂载就ok啦

LVM是一个弹性很强的工具,而且方便伸缩容量,真是杀人越货,啊不,仓储数据的必备良品。

时间: 2024-10-13 15:35:55

这次中规中矩的写一回LVM的相关文章

oracle中的if || oracle中的loop循环怎么写? || while循环怎么写?

oracle中的if怎么写? if--then--end if; end if;很重要 oracle中的loop循环怎么写? exit when 退出循环 v_num:=v_num+1;oracle中没有+=:赋值是这么赋值的:= while循环怎么写?

Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式

Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 >> ios 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/ios/1010000008980619/MethodSwizzing中一般替换方法都写在Category类别里吗有没有别的实现方式.html

用C3中的animation和transform写的一个模仿加载的时动画效果

用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h2>用C3中的animation和transform写的一个模仿加载的时动画效果</h2> <div class="demo"> <div></div> <div></div> <div></d

java中文件的读与写

最近一直在学习java中如何读取和写出文件,看了java API之后,发现在java.io中有很多关于文件读与写的类,下面就介绍几个经常用到的. 首先是:InputStream和OutputStream,API中说它俩是所有抽象类表示字节输入输出流的超类,所以在它们下面派生了很多子类.例如:FileInputStream和OutputStream等等.这些类都是以单字节的形式读入数据的,所以如果读入的数据中有中文字符,那么就会出现中文乱码现象. 其次是:Reader和Writer,这两个类是用于

jsp中页面跳转form标签中的action属性怎么写?

<form method="post/get" action="url">如果下一个页面是一个jsp页面,又是在同一个目录下,就可以直接写名字.jsp.可以写绝对路径,也可以写相对路径.如果是一个servlet,在web.xml看看它的映射路径,写上去就行了(jsp的话肯定有用了servlet.那视图层文件中 form 标签中的action就应该写对应的servlet.)

分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短

原文:分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短 源代码下载地址:http://www.zuidaima.com/share/1550463702764544.htm package com.zuidaima.xs; /**************************************************************** * Version : 1.0 * Date : 02/03/2007 * Autho

Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕

Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕: //Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕 #include<iostream> #include<fstream> #include<cstdlib> int main() { using namespace std; ifstream fin; ofstream fout; int max,min,tem; fin.open("numbers.dat")

数据库中导出表中相应字段到指定文件中

数据库中导出某一个表中需要的字段到文件中是公司中经常要做到的事,那怎么实现呢? 比如你要查询enterpriseaics中的所有字段的值到d盘的aa.txt中去,注:aa.txt不能存在,否则会报错. <span style="font-size:18px;">select * from enterpriseaics into outfile 'd:\\aa.txt' ;</span> 当然如果你想规范一下格式,例如:每个字段的值之间以逗号分开,每一行换行,每个

Objective-C中把数组中字典中的数据转换成URL

可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是Map来存储键值对.下面我们将实现一个极为实用的小例子,网络请求有get和post方法,两种方法各有其优点.在表单提交时Post方法用的更多一些,URL传值则会用到Get方法.在用PHP编程的时候肯定会经常拼接url来传参或者请求,在IOS开发中会向服务器通过url请求一些数据,所以对url的拼接是少