我们在使用Linux的时候,有的时候会发现系统盘不够用的情况。如果系统盘或者其它盘能够做到弹性就好了。也就是需要更多空间的时候可以动态扩容,而不需要的时候可以缩容。
有一种方法就是通过SAN存储,因为存储系统天然具有扩容和缩容的功能特性。但是SAN存储需要一个独立的设备,而且价格也很高,不太现实。其实在Linux中我们可以通过软件实现,这就是Linux强大的地方。今天我们就介绍一下这方面的内容。
在Linux实现动态扩容和缩容特性的软件称为LVM,其全称是Logical Volume Manager,也就是逻辑卷管理。LVM不仅仅可以实现动态扩容和缩容,还可以实现其它一些特性,比如条带化卷,镜像卷等等。LVM的整体架构如图所示。

通过上图可以看到,LVM包含3个基本的概念,分别是Physical Volume(PV),Volume Group(VG)和Logical Volume (LV)。我们分别介绍一下这个三个概念。
物理卷对应着一个块设备,可以是整个磁盘,或者是磁盘分区。物理卷通过pvcreate创建,本质上是想块设备写入一些元数据。
卷组是多个物理卷的集合,当我们创建一个卷组的时候需要指定包含的物理卷。此时,实际上是构建了一个物理卷的资源池。当后面创建逻辑卷的时候会从该资源池分配资源。
逻辑卷本身是一个块设备,是用户看到的部分,我们可以将逻辑卷理解为一个硬盘。但是逻辑卷实际上是由底层的若干个物理卷构成。但是一个逻辑卷并非使用物理卷的所有空间,通常是部分空间。
前文我们对LVM的基本概念和架构进行了介绍,接下来我们就实际操作一下。具体如下图所示,每个概念对应着一个操作命令,分别是pvcreate,vgcreate和lvcreate。这些是创建的命令,从名称上也可以很容易地明白其作用。

我们从下往上看看如何创建需要的资源,比如我们要创建一个1G的逻辑卷。
首先是要创建PV,也就是准备物理的资源。在本文中我们假设有两个物理磁盘,并且在整个磁盘上创建物理卷,而不是在分区上。

除了创建命令外,还有查询命令,具体包括pvdisplay和pvs,分别显示详细信息和概要信息。
完成PV的创建后,我们就可以创建卷组了。卷组的创建命令如下所示。
vgcreate vg-01 /dev/sdb /dev/sdc创建完成后可以看一下信息:

最后,我们就可以创建逻辑卷了。假设我们这里创建一个线性的逻辑卷,大小为1GB,具体命令如下所示。
lvcreate -L 1G -n lv_linear vg-01
Logical volume "lv_linear" created通过lvdispaly命令可以看一下详细信息。

除了线性卷之外,我们还可以创建条带卷。关于具体什么是线性卷,什么是条带卷,本文不做解释,我们后面在介绍LVM的原理的时候再详细介绍。
# lvcreate -L 1G -i2 -I64 -n lv_stripe vg-01
Logical volume "lv_stripe" created
创建完成后照例可以看一下详细的信息。

LV创建成功后,我们就可以当做硬盘来使用了,用法跟普通硬盘没有差别。
有了前面的知识,我们回归主题,如何进行扩容呢?其实就比较简单了。前文我们创建的VG的大小35G,而LV只用了1GB的空间。因此,我们可以直接对LV进行扩容,比如我们增加10GB的容量,可以执行如下命令。
lvextend -L+10G /dev/vg_01/lv_linear是不是很简单!
如果上面已经有文件系统了,只需要执行如下命令即可。
resize2fs /dev/vg_01/lv_linear还有一种情况是VG的容量使用完了。也没有关系,我们可以添加新的硬盘到VG,然后执行上面介绍的命令。
今天的内容就介绍到这里,相信大家对如何实现一个弹性容量的存储有了清晰的认识了。我们在后续会逐步深入,介绍LVM的实现原理,并结合内核代码介绍其代码实现。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer