Linux.NET

Linux.NET

上一回合中,我们牛刀小试的在Mono中部署了我们的第一个ASP.NET应用,此外我们还结合了PostgreSQL数据库实现了一个简单CRUD操作的小站点。它们的成功部署并正常运行很好的体现出.NET在Linux中运作的可行性。

同时,在上回合结尾部分中提到,这回合我们将一起讨论学习企业级开源框架“Spring.NET”在Mono中的部署使用。但是,最近由于个人的一些私事,一直都没有时间对Spring.NET作出系统的学习,在这里,我向各位读者表示歉意。因此,在本回合中,我们学习讨论的内容将发生一些变化,我们不再讨论“Srping.NET”如何在Mono中部署,我们转而讨论学习跟WebForm处于平行位置的“ASP.NET MVC”如何部署到我们的Mono中,示例代码可以点击这里下载(由于代码过大,无法上传到园子中,所以我放到了微盘,望各位读者见谅)。

本回合,我们将讨论学习:

1、部署前的准备工作

2、从零开始,把MVC3网站应用程序部署到Mono中

3、从部署MVC3中启发,把MVC4部署到Mono中

4、另外一种与前面部署方式“相逆”的MVC4部署方式


1、系统约定——部署前的准备工作

最近一段时间,许多朋友都纷纷发帖发博客表示已经成功的在Mono中成功的部署了最新版的MVC框架,相当的喜闻乐见。MVC是什么,我想各位读者一定知道,它作为微软推出的重要建站模式,其地位与WebForm相当,重要性也是不容忽视的。试想一下,如果MVC无法在Mono中部署,那我们的Linux.NET仿佛就是一只折翼了的小鸟——“想要飞也飞不高?“不对,直接是飞不起来了。因此,MVC能够正常的在Mono中运行似乎已经就是Linux.NET的一项”理所当然“的事情。

好的进入我们的正题,在部署MVC之前,我们需要新建一个Jexus的网站配置:

我们先在Linux中新建一个存放文件的文件夹,然后cd(进入)到Jexus存放网站配置文件的目录,再新建一个本次实验的网站配置文件”linux.net5“

添加上我们配置的内容

Linux.NET_第1张图片

最后保存退出,然后再重启我们的Jeuxs即可。

在这里,特别值得注意的地方:

那就是”NoFile“配置项,各位读者一定要把此功能关闭(添加后注释掉或直接就不添加进去,Jexus默认此功能是关闭的)。在MVC中我们的访问路径是经过路由重写的,当我们发起一个访问请求时,比如:localhost/Home/Index/,请求会经过路由的匹配并改写,最终把请求指派到Controller文件夹中的HomeController.cs文件中的Index方法,然后再由该方法对请求作出处理并发出应答。在整套的MVC”请求--应答“处理过程中,浏览器在地址栏发起的URl请求在网站中未必都是真实的文件物理地址访问请求。而这恰恰相反的,在Jexus的NoFile检测中,Jexus会对用户发起的访问请求(URL)进行文件物理地址的检测,检测不通过时就直接对用户应答一个预设的应答页面(比如这里的404页面),不再使用.NET的功能对URl作更多的处理,因此,请求将永远无法指派到正确的Action进行处理,整套的MVC网站也会因此而报废。

同样,对于一些在.NET中使用URlRewrite的站点,Jexus的”NoFile“功能也是需要关闭的,原因与MVC一样,将会被URL重写的请求还没有通过Jexus这一关就被拒绝了,无法继续的进入.NET进行处理,网站的访问也会因此而造成一定程度的影响(这里网站不会被报废,因为在浏览器中输入真实的物理地址,网站又可以正常的访问)。

 

 2、部署MVC3网站应用程序

Mono中部署MVC3应用程序,这不是我们本回合的终极目标,但是确实本回合最重要的内容,因为只要学会了在Mono中部署MVC3,部署MVC4也就是那么一回事了。其实,在Mono中成功部署MVC3也不是一件新鲜的事情,早前就已经有不少成功的案例,园子中也有一些关于如何在Mono中部署MVC3的文章,各位读者如有兴趣,可以自行查阅,当然,读者们也可以从本文中直接找到方法,我们在这里采用的是Step By Step的讨论学习方法,一步一步的说明白如何操作,并指出当中需要注意的地方和解析原因。

好的,我们先新建一个MVC3应用程序”MVC31“,并选择”空模板“和”Razor视图引擎“

Linux.NET_第2张图片

由于这个是一个空模板,里面没有任何现成的Controller,我们简单的新建一个HomeController,并添加上一个Index Action和相关的视图。然后在windows中运行:

那是没有问题的,但如果我们发布到Linux中,效果就不一样了:

Linux.NET_第3张图片

没错,正如所想的一样,无法正常运行,按照上面的提示,我们设置”CustomError“节点,把它设置为”OFF“,重新发布,看看那里出了问题:

Linux.NET_第4张图片

第一个问题出现了,很明显,是由于Entity Framework引起的。没错,如果有认真读过我前一篇文章《Linux.NET学习手记(4)》 的读者大概已经明白其中的原因和知道解决办法了。正如我上回合为什么没有使用EF(我最喜欢的ORM)而改为使用PetaPoco的原因一样,Mono中的EF版本已经是6.0并且还不支持低于此版本的EF框架,恰好微软正式发布的EF版本最高只有5.0,于是这就造成了我们这里的第一个错误。不过这里的问题也只是暂时性的,随着微软将来EF6.0的发布,这个问题,将会得到解决。

我们通过NuGet卸载所有的Entity Framework。

Linux.NET_第5张图片

然后再清除Web.Config和Global中的一些残留项,然后再次发布。

Linux.NET_第6张图片

然后顺利的进入到我们的第二个问题,这里我解释一下出现此问题的原因,由于mono 3.0.X对语言文化的支持暂时还没有对中文支持(2.X中则可以支持中文),因此系统默认所使用的”zh-CN“让Mono无法识别。此问题的解决办法就是:在WebConfig的”system.web“节点中添加上”globalization“节点,并把当中的”uiCulture“设置成”en-US“。在这里我们推荐的配置为”<globalization culture="zh-CN" uiCulture="en-US"/>“,这样就可以让我们的程序本身以”英语“语法来运行,但是显示时却能够以”中文“语法来显示。

我们添加上这个节点,并重新发布:

Linux.NET_第7张图片
非常不幸的,我们继续进入到了一个新的错误,到这里,各位读者有什么感觉了?抓狂了?想想放弃了?俗话说:”行百里者半九十“,这时千万别放弃,因为成功就在眼前了。通过从网上翻阅大量的资料,我们找到这这次问题的真凶,没错,作怪的就是”Microsoft.Web.Infrastructure.dll“,我们把Windows中”Microsoft.Web.Infrastructure.dll“和Mono中的”Microsoft.Web.Infrastructure.dll“反编译:

Linux.NET_第8张图片

Linux.NET_第9张图片

可以看出,Windows中的Infrastructure和Mono中的Infrastructure还不是同一回事,那这就好办了,我们把MVC3项目中的Infrastructure剔除,让程序使用Mono自带的动态库,或许就可以解决我们现有的问题。我们删除这个动态库后,再次发布:

Linux.NET_第10张图片

终于看到了我们一直努力想要看到的”Index“,MVC3成功的在Mono中跑起来了。

 趁热打铁,我们再结合上PostgreSQL数据库和PetaPoco快速的建立一个CRUD的小应用。

我们先新建一个商品表”Goods“,其表结构如下:

Linux.NET_第11张图片

然后在新建相关的Controller、Model、View等,这里就不再介绍当中的代码如何编写和实现,有兴趣的读者可以在代码演示中查看。

把做好的站点发布到Mono中:

Linux.NET_第12张图片

页面能够正常显示,没有问题,我们在试试添加一个新的商品:

Linux.NET_第13张图片

添加商品时报了一个错,同时在“Details”中提示有一个程序集找不到。

通过排错,我们发现了我们引用的一个DLL文件在Mono中是没有的:

Linux.NET_第14张图片

这样,我们只要在“C:/Windows/assembly”目录中找到“System.ComponentModel.DataAnnotations.dll”(注意版本),然后再手动的添加到我们发布的网站中的bin目录中即可。

再次添加数据,OK!成功添加!

Linux.NET_第15张图片

出现了“Linux.NET学习手记”这个商品。至此,MVC3的简单部署已经完成~!!

这里做一些小提示:

  (1)、由于我采用了的是虚拟机,因此我结合了一个Linux的Samba服务来直接发布,各位读者也可以采用Ftp或者发布到本地再上传的方式进行网站的发布,发布后记得重启一下Jexus。

  (2)、“Infrastructure”动态库除了可以采用发布会删除的方式进行处理,也可以采用“不复制”的属性才处理

  (3)、读者们也可以参考《在mono3.0.10+Jexus5.3上运行MVC4和WebApi的要点》这篇文章,上面的方法与这里有师出同门之道。

 

 3、Mono中部署MVC4

上一小节中,我们历尽艰辛“取得真经”,成功的把一个MVC3网站应用部署到了Mono中,在这取得重要的成功之后,我们向我们本回合的终极目标继续推进——在Mono中部署一个MVC4应用。其实,无论是MVC3还是MVC4,它们的部署方法都是类似的,我们在上小节中详讲了MVC3的部署就是为了能够在部署MVC4起到一定的参考作用。

 好的,心动不如行动,我们马上的新建一个MVC4的网站应用:

Linux.NET_第16张图片

然后再根据我们刚才部署MVC3的经验步骤,进行相关的修改:

  (1)、剔除所有Entity Framework的应用(使用NuGet卸载EF,并清除所有关于EF的残留)

  (2)、在Web.Conf配置文件中的“system.web”节点中加入“<globalization culture="zh-CN" uiCulture="en-US"/>”

  (3)、移除“Infrastructure”这个动态库文件

把这个MVC4应用程序发布到Mono中:

Linux.NET_第17张图片

可以正常的运行,同样的,我们在创建一个“商品”的增删查改,并把缺少的“System.ComponentModel.DataAnnotations.dll”补上:

Linux.NET_第18张图片

同样的实现了我们想要的功能。

通过“照葫芦画瓢”的方法,我们把一个MVC4的网站应用程序顺利的部署到Mono中了,其实也就差不多而已。

 

4、另一种版本的MVC4部署方法

从本回合开篇起,无论是部署MVC3还是部署MVC4,我们所采用的办法都是直接使用Visual Studio所提供的MVC模板,然后通过“哪里不行删哪里”的方法,把Mono中不支持或无法直接兼容的地方进行删除或修改。可以说,我们采用了一种“逆向”的方法来获得一个Mono支持的MVC应用。说到这里,各位读者可能猜到,“既然有这种逆向的方法,应该也会有一种正向的办法来部署”。近日我读到了一篇题目名为《尝试在 Mono 3.0 下运行 ASP.NET MVC 4》的文章,受到了一些启发,发现还真的有读者们所说的“正向”方法来获得Mono支持MVC4应用程序。那就是不使用Visual Studio所提供的MVC模板,通过为Web应用程序添加必要的MVC库文件的方式手动的搭建起一个MVC应用程序。

在本小节中,我们将尝试的通告手动的方法,获得一个Mono支持的MVC4网站应用程序。在参照那篇文章的同时,结合我们“逆向”部署的方法与经验,在Mono中部署我们想要的MVC4应用程序。

首先,我们新建一个空的Web应用程序(注意,不是MVC4应用程序):

Linux.NET_第19张图片

然后通过NuGet管理工具,安装上MVC4的库文件:

Linux.NET_第20张图片

然后在手动的创建相应的文件夹和文件:

Linux.NET_第21张图片

这里解析一下,有几个文件以及文件夹是必须创建的:

  (1)、Controller文件夹:用于存放控制器

  (2)、Views文件夹:用于存放模版

  (3)、Models文件夹:用于存放实体类文件

  (4)、Global.asax文件:用于应用程序启动时初始化(注册路由等)

在网站配置文件中添加上MVC4需要用到的一些配置:

复制代码
<configuration>

  <appSettings>
    <add key="webpages:Version" value="2.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="PreserveLoginUrl" value="true"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>
  
    <system.web>

      <globalization culture="zh-CN" uiCulture="en-US"/>
      
      <compilation debug="true" targetFramework="4.0" />
    </system.web>

</configuration>
复制代码

剔除会在Mono中“作怪”的“Infrastructure”动态库文件,然后在全局配置文件的“Application_Start ”方法中注册上路由:

复制代码
protected void Application_Start(object sender, EventArgs e)
{
   AreaRegistration.RegisterAllAreas();
   GlobalFilters.Filters.Add(new HandleErrorAttribute());
   RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   RouteTable.Routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
}
复制代码

 手动的在Controller和View中创建控制器和模板(这里不详讲,只需注意要继承相应MVC类),然后再发布到Mono中:

Linux.NET_第22张图片

Controller找不到页面了,我们打开发布后的目录:

Linux.NET_第23张图片

我们的Views文件夹不见了。其实,这是由于我们新建的是WebForm的应用程序,发布时,我们的页面会被嵌入到了bin目录的程序集中,所以MVC的模版解析引擎无法在根目录中找到VIews目录以及里面的所有模板。这个文件的解决办法也比较简单,只需把Visual Studio中的Views文件夹整个的拷贝到网站根目录中即可。

再次访问:

Linux.NET_第24张图片

OK~!!正常访问!

这里我有一点要声明一下,Mono的HttpRuntime是支持targetFramework的,因此我们这里并没有把“targetFramework”去除(跟参考文章有所不同),各位要多加留意~!!


本回合中,我们尝试性的并成功把MVC3网站应用程序部署到Mono中,并根据MVC3的部署方式推演出了MVC4的部署方式,同时还介绍了相对于我们现有部署方式的Web应用程序升级为MVC4应用程序的方式部署。希望各位读者在通读全文之后能够亲自的动手实现一遍,“世上无难事,只怕有心人”,只要有恒心,所有的困难最终都不是困难。同时,如果各位读者有一些更好的部署点子或对本文有任何的看法和建议,欢迎留言分享和指正。

好的,本回合暂时就到这里了,这里我就不作下回合的预告了,还没有想到下回合具体会写一些什么。OK,咱们下回见。

 

 
 
 
标签:  monoLinuxASP.NETjexusMVC

Linux磁盘管理:LVM逻辑卷的创建及使用

复制代码
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 

如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦   

如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: [email protected]  / [email protected]

如果需要转载,请注明出处,谢谢!!
复制代码

 

在上一篇随笔里面 Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理,包括LVM中最重要的四个基本点(PE、PV、VG以及LV),这篇随笔将会详细的讲解LVM逻辑卷的创建、使用以及删除.

一、创建LVM逻辑卷

Linux.NET_第25张图片

 

我们通过图文并茂的方式来看看如何创建我们的LVM,在上一篇随笔中,我们已经熟悉了LVM的工作原理,首先是要将我们的物理硬盘格式化成PV,然后将多个PV加入到创建好的VG中,最后通过VG创建我们的LV。所以我们第一步就是将我们的物理硬盘格式化成PV(物理卷)

①将物理硬盘格式化成PV(物理卷)  使用的是 pvcreate 命令

这里我已经事先虚拟化了3快物理硬盘,每块硬盘的大小为8G,通过 fdisk -l 命令可以查看

复制代码
[root@xiaoluo ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00093d90

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         523     4194304   82  Linux swap / Solaris
Partition 1 does not end on cylinder boundary.
/dev/sda2   *         523        2611    16776192   83  Linux

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdd: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
复制代码

这里我们根据上面图所示,我们先将 /dev/sdb、 /dev/sdc 两块硬盘格式化成PV

[root@xiaoluo ~]# pvcreate /dev/sdb /dev/sdc 
Physical volume
"/dev/sdb" successfully created Physical volume "/dev/sdc" successfully created

创建完PV以后,我们可以使用pvdisplay(显示详细信息)、pvs命令来查看当前pv的信息

复制代码
[root@xiaoluo ~]# pvdisplay "/dev/sdb" is a new physical volume of "8.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name               
  PV Size               8.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               93UEEl-cxBU-A4HC-LNSh-jp9G-uU5Q-EG8LM9
   
  "/dev/sdc" is a new physical volume of "8.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               8.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               lH1vul-KBHx-H2C6-wbt1-8AdK-yHpr-bBIul5
   
[root@xiaoluo ~]# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb        lvm2 a--  8.00g 8.00g
  /dev/sdc        lvm2 a--  8.00g 8.00g
复制代码

通过这两个命令我们可以看到我们已经创建好的PV的信息,两个PV都是8G,目前还没有使用,PFree都是8G.

②创建卷组(VG),并将PV加入到卷组中  通过 vgcreate 命令

在创建完PV以后,这时候我们需要创建一个VG,然后将我们的PV都加入到这个卷组当中,在创建卷组时要给该卷组起一个名字

[root@xiaoluo ~]# vgcreate xiaoluo /dev/sdb /dev/sdc 
Volume group
"xiaoluo" successfully created

同样,在创建好VG以后,我们也可以使用 vgdisplay 或者 vgs 命来来查看VG的信息

复制代码
[root@xiaoluo ~]# vgdisplay --- Volume group ---
  VG Name               xiaoluo
  System ID             
  Format                lvm2
  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  // 当前这里有两个PV,分别是我们的 /dev/sdb 和 /dev/sdc
  Act PV                2
  VG Size               15.99 GiB  // 当前VG的大小
  PE Size               4.00 MiB  // 通过这个我们也可以看到我们LVM默认的PE大小就是4M
  Total PE              4094  // 因为VG里面存放的就是各个PV中的PE,所以PE的数量就是VG大小除以默认PE的大小
  Alloc PE / Size       0 / 0   
  Free  PE / Size       4094 / 15.99 GiB
  VG UUID               B8eavI-21kD-Phnm-F1t1-eo4K-wgvg-T5qUbt
   
[root@xiaoluo ~]# vgs
  VG      #PV #LV #SN Attr   VSize  VFree 
  xiaoluo   2   0   0 wz--n- 15.99g 15.99g
复制代码

③基于卷组(VG)创建逻辑卷(LV)  通过 lvcreate 命令

因为创建好的PV、VG都是底层的东西,我们上层使用的是逻辑卷,所以我们要基于VG创建我们的逻辑卷才行

[root@xiaoluo ~]# lvcreate -n mylv -L 2G xiaoluo
Logical volume
"mylv" created

通过 lvcreate 命令基于VG创建好我们的逻辑卷,名字为mylv,大小为2G,同样我们可以使用 lvdisplay 或者 lvs 命令来查看创建好的逻辑卷的信息

复制代码
[root@xiaoluo ~]# lvdisplay --- Logical volume ---
  LV Path                /dev/xiaoluo/mylv  // 逻辑卷的路径
  LV Name                mylv  // 逻辑卷的名字
  VG Name                xiaoluo  // 逻辑卷所属卷组的名字
  LV UUID                PYuiYy-WpI6-XZB8-IhnQ-ANjM-lcz0-dlk4LR
  LV Write Access        read/write
  LV Creation host, time xiaoluo, 2013-05-23 23:45:08 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB  // 逻辑卷的大小
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
[root@xiaoluo ~]# lvs
  LV   VG      Attr      LSize Pool Origin Data%  Move Log Cpy%Sync Convert
  mylv xiaoluo -wi-a---- 2.00g 
复制代码

这样子我们的逻辑卷也就已经创建好了,我们这个时候再通过 vgs 还有 pvs 命令查看一下我们的PV与VG的信息

复制代码
[root@xiaoluo mnt]# vgs
  VG      #PV #LV #SN Attr   VSize  VFree 
  xiaoluo   2   1   0 wz--n- 15.99g 13.99g  // 我们看到LV的数量此时变成了1,因为我们刚创建好了一个LV,LVFree还有14G
[root@xiaoluo mnt]# pvs PV VG Fmt Attr PSize PFree
/dev/sdb xiaoluo lvm2 a-- 8.00g 6.00g  // 刚创建好的LV用的是 /dev/sdb 这块硬盘的,所以这块硬盘的PFree还剩下6G /dev/sdc xiaoluo lvm2 a-- 8.00g 8.00g
复制代码

我们发现,当我们每创建完一个LV时,VG与PV的信息都是时时在变化的,并且我们创建LV的大小是根据当前VG的大小来决定的,不能超过当前VG的剩余大小!

我们在上一篇随笔里面有讲过,每创建好一个逻辑卷,都会在 /dev 目录下出现一个以该卷组命名的文件夹,基于该卷组创建的所有的逻辑卷都是存放在这个文件夹下面,我们可以查看一下

[root@xiaoluo ~]# ls /dev/xiaoluo/mylv 
/dev/xiaoluo/mylv

我们每创建一个新的逻辑卷,该VG目录下都会多出这么一个设备。

二、格式化并使用我们的逻辑卷

我们已经创建好了我们的PV、VG以及LV,这时候我们如果要使用逻辑卷,就必须将其格式化成我们需要用的文件系统,并将其挂载起来,然后就可以像使用分区一样去使用逻辑卷了

 

复制代码
[root@xiaoluo ~]# mkfs.ext4 /dev/xiaoluo/mylv 
mke2fs
1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=536870912 16 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 31 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
复制代码

 

格式化我们的逻辑卷以后,就可以使用 mount 命令将其进行挂载,我们将其挂载到 /mnt 目录下

复制代码
[root@xiaoluo ~]# mount /dev/xiaoluo/mylv /mnt
[root@xiaoluo
~]# mount /dev/sda2 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/mapper/xiaoluo-mylv on /mnt type ext4 (rw)
[root@xiaoluo
~]# cd /mnt/ [root@xiaoluo mnt]# ls lost+found [root@xiaoluo mnt]# touch xiaoluo.txt [root@xiaoluo mnt]# ls lost+found xiaoluo.txt
复制代码

我们看到,我们的卷组已经挂载好了,并且可以像使用分区一样来对其进行文件操作了。

三、删除逻辑卷

我们在创建好逻辑卷后可以通过创建文件系统,挂载逻辑卷来使用它,如果说我们不想用了也可以将其删除掉。

注意:】对于创建物理卷、创建卷组以及创建逻辑卷我们是有严格顺序的,同样,对于删除逻辑卷、删除卷组以及删除物理卷也是有严格顺序要求的

①首先将正在使用的逻辑卷卸载掉  通过 umount 命令

②将逻辑卷先删除  通过 lvremove 命令

③删除卷组  通过 vgremove 命令

④最后再来删除我们的物理卷  通过 pvremove 命令

复制代码
[root@xiaoluo /]# mount /dev/xiaoluo/mylv /mnt/
[root@xiaoluo /]# umount /mnt/ [root@xiaoluo /]# lvremove /dev/xiaoluo/mylv Do you really want to remove active logical volume mylv? [y/n]: y Logical volume "mylv" successfully removed [root@xiaoluo /]# vgremove xiaoluo Volume group "xiaoluo" successfully removed [root@xiaoluo /]# pvremove /dev/sdb Labels on physical volume "/dev/sdb" successfully wiped
复制代码

此时我们的刚创建的逻辑卷 mylv,卷组 xiaoluo以及物理卷 /dev/sdb 已经从我们当前操作系统上删除掉了,通过 lvs、vgs、pvs命令可以查看一下

复制代码
[root@xiaoluo /]# lvs
  No volume groups found  // 逻辑卷已经没有了
[root@xiaoluo
/]# vgs No volume groups found  // 卷组也没有了
[root@xiaoluo
/]# pvs PV VG Fmt Attr PSize PFree /dev/sdc lvm2 a-- 8.00g 8.00g  // sdb物理卷已经没有了,只剩下 sdc物理卷了
复制代码

本篇随笔详细讲解了LVM逻辑卷的创建、使用及删除,在下一篇随笔里我们将继续讲解LVM逻辑卷的知识,包括如何对逻辑卷进行动态的拉伸以及对其进行压缩!!!

 

 

 
 
分类:  Linux
标签:  linuxCentOS

你可能感兴趣的:(linux,mvc,linux,linux,centos,asp.net,Mono,Jexus)