Linux运维之lvm逻辑卷管理

一、lvm介绍

 

1、lvm的引入背景

        LVM的全名是Logical  Volume  Manager,中文翻译为逻辑卷管理器。LVM的做法是将几个物理的分区(或磁盘)通过软件组合成为一块看起来是独立的大磁盘(VG),然后将这块大磁盘再经过划分成为可使用的分区(LV),最终就能够挂载使用了。但是为什么这样的系统可以进行文件系统的扩充或缩小呢?其实与一个称为PE的东西有关。

         Linux用户安装Linux操作系统时 遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当 一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间 耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

 

2、lvm的术语

物理卷(Physical Volume,PV)

        我们实际的分区(或disk)需要调整系统标识符(system  ID)成为8e(LVM的标识符),然后再经过pvcreate的命令将它转成LVM最底层的物理卷(PV),之后才能够将这些PV加以利用。调整system  ID的方式就是通过fdisk。

物理卷组(Volume Group,VG)

        所谓LVM大磁盘就是将许多PV整合成这个VG,所以VG就是LVM组合起来的大磁盘,那么这么大磁盘最大可以到多少容量呢?这与下面要说明的PE以及LVM的格式版本有关。在默认的情况下,使用32位的Linux系统时,基本上LV最大仅能支持到65534个PE而已;若使用默认的PE为4MB的情况下,最大容量则仅能达到256GB而已。不过,这个问题在64位的Linux系统上面已经不存在了,LV几乎没有啥容量限制了。

物理块或者成为物理扩展单元(Physical Extent,PE)

        LVM默认使用4MB的PE数据块,而LVM的LV在32位系统上最多仅能支持到65534个PE(lvm1的格式),因此默认的LVM的LV会有4MB*65534/(1024M/G)=256GB。这个PE很有趣,。它是整个LVM最小的存储数据单位,也就是说。其实我们的文件数据都是借由写入PE来完成的。简单的说,这个PE有点像文件系统里面的block大小。所以调整PE会影响到LVM的最大容量。

逻辑卷(Logical Volume,LV)

        最终的VG还会被切成LV,这个LV就是最后可以被格式化使用的类似分区的东西。那么LV是否可以随意指定大小呢?当然不可以。既然PE是整个LVM的最小存储单位,那么LV的大小就与在此LV内的PE总数有关。为了方便用户利用LVM来管理其系统,LV的设备名通常为【/dev/vgname/lvname】的样式。

 

3、LVM可以弹性地修改文件系统的容量,是如何办到的?

        其实它就是通过【交换PE】来进行数据交换,将原本LV内的PE移转到其他设备中以降低LV容量,或是将其他设备的PE加到此LV中以加大容量。

 

4、数据写入LV时,它到底是怎么写入磁盘当中的呢?

其实写入机制,有两种方式:

  1. 线形模式(linear):假如我将/dev/vda1、/dev/vdb1这两个分区加入到VG当中,并且整个VG只有一个LV时。所谓的线性模式就是当/dev/vda1的容量用完之后,/dev/vdb1的硬盘才会被使用到,这也就是我们所建议的模式。
  2. 交错模式(triped):那什么是交错模式?很简单,就是我将一条数据拆成两部分,分别写入/dev/vda1与/dev/vdb1的意思,感觉上有点像RAID0,如此一来,一份数据用两块硬盘来写入,理论上,读写的性能会比较好。

基本上,LVM最主要的用处是在实现一个可以弹性调整容量的文件系统上,而不是建立在一个以性能为主的磁盘上LVM默认的读写模式是线性模式。

 

二、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名IP
server172.25.254.1

 

三、lvm的建立

 

1、分区并设定分区标签为8e

 

可以利用下面的命令来实施监控

watch -n 1 'pvs;echo===;vgs;echo===;lvs;echo===;df -h /mnt'

 

2、生成pv

下面,我们来谈谈与PV有关的命令

  • pvcreate:将物理分区建立称为PV。
  • pvscan:查看目前系统里面任何有PV的磁盘。
  • pvdisplay:显示出目前系统上的PV状态。
  • pvremove:将PV属性删除,让该分区不具有PV属性。

 

1、检查有无PV在系统上,然后将/dev/vdb1建立称为PV格式
[root@server ~]# pvscan 
  No matching physical volumes found

[root@server ~]# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created

[root@server ~]# pvscan 
  PV /dev/vdb1                      lvm2 [100.00 MiB]
  Total: 1 [100.00 MiB] / in use: 0 [0   ] / in no VG: 1 [100.00 MiB]
#这就分别显示每个PV的信息与系统所有PV的信息,尤其最后一行,显示的是:
#整个PV的量/已经被使用到的VG的PV量/剩余的PV量

2、更详细地列出系统上面每个PV的个别信息
[root@server ~]# pvdisplay 
  "/dev/vdb1" is a new physical volume of "100.00 MiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb1   <==实际地分区设备名称
  VG Name                           <==因为尚未分配出去,所以空白
  PV Size               100.00 MiB   <==就是容量地说明
  Allocatable           NO           <==是否已经被分配,结果是NO
  PE Size               0            <==在此PV内的PE大小
  Total PE              0            <==共划分出几个PE
  Free PE               0            <==没被LV用掉地PE
  Allocated PE          0            <==尚未分配出去地PE数量
  PV UUID               YwsRpO-m7Px-YeW3-Y0AC-R09W-apAZ-IfkZAT     
#由于PE是在建立VG时才设置地参数,因此在这里看到地PV里面地PE都会是0
#而且也没有多余地PE可供分配(allocatable)

 

3、生成vg

建立VG及VG的相关命令也不少,我们来看看:

  • vgcreate:主要建立VG地命令,它的参数比较多,等一下介绍。
  • vgscan:查找系统上面是否有VG存在
  • vgdisplay:显示目前系统上面的VG状态
  • vgextend:在VG内增加额外的PV
  • vgreduce:在VG内删除PV
  • vgchange:设置VG是否启动(active)
  • vgremove:删除一个VG

 

vgcreate [-s N[mgt]] VG名称 LV名称

选项与参数:
-s:后面接PE的大小(size),单位可以是m、g、t(大小写均可)
 
1、将/dev/vdb1建立成为一个VG
[root@server ~]# vgscan 
  Reading all physical volumes.  This may take a while...
  No volume groups found
[root@server ~]# vgcreate vg0 /dev/vdb1
  Volume group "vg0" successfully created
[root@server ~]# vgscan 
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2   #我们手动制作的

[root@server ~]# pvscan 
  PV /dev/vdb1   VG vg0   lvm2 [96.00 MiB / 96.00 MiB free]
  Total: 1 [96.00 MiB] / in use: 1 [96.00 MiB] / in no VG: 0 [0   ]
#我们可以看到,有一个PV被用取,剩余0个PV没被用掉

[root@server ~]# vgdisplay 
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               96.00 MiB    <==整个VG的容量有这么大
  PE Size               4.00 MiB     <==内部每个PE的大小
  Total PE              24           <==PE数量共这么多
  Alloc PE / Size       0 / 0   
  Free  PE / Size       24 / 96.00 MiB
  VG UUID               Y7aOjO-cKR5-Aqn5-0AgQ-929U-usnK-tyd8nY
#最后三行指的就是PE能够使用的情况,由于尚未划分出LV,因此所有的PE均可自由使用

 

4、生成lv

创造出VG这个大磁盘之后,再来就是要建立分区,这个分区就是所谓的LV。先来看看能使用的命令吧。

  • lvcreate:建立LV。
  • lvscan:显示系统上面的LV。
  • lvdisplay:显示系统上面的LV状态。
  • lvextend:在LV里面增加容量。
  • lvreduce:在LV里面减少容量。
  • lvremove:删除一个LV。
  • lvresize:对LV进行容量大小的调整

 

lvcreate [-L N[mgt]] [-n LV名称] VG名称
lvcreate [-l N[mgt]] [-n LV名称] VG名称

选项与参数:
-L:后面接容量,容量单位可以是M、G、T等(大小写均可),要注意的是,最小单位为PE。
-l:后面接PE的【个数】,而不是数量。若要这么做,得要自性计算PE数
-n:后面接的就是LV的名称

 

1、建立一个大小为20M的LV(因为LV的最小单位是PE,而PE的默认大小是4M,当给定的大小不符合PE大小的整数倍时,系统会自行计算)
[root@server ~]# lvscan 
[root@server ~]# lvcreate -L 20M -n lv0 vg0 
  Logical volume "lv0" created
[root@server ~]# lvscan 
  ACTIVE            '/dev/vg0/lv0' [20.00 MiB] inherit


[root@server ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg0/lv0   <==这个是LV的全名
  LV Name                lv0
  VG Name                vg0
  LV UUID                s3Osqk-oT33-VB7Q-kCsY-Ird9-gA8A-0c08Yv
  LV Write Access        read/write
  LV Creation host, time server, 2019-05-23 21:08:31 +0800
  LV Status              available
  # open                 0
  LV Size                20.00 MiB   <==容量就这么大
  Current LE             5
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           252:0

 

5、为dev/vg0/lv0铺设文件系统

 

[root@server ~]# mkfs.xfs /dev/vg0/lv0   注意全名

[root@server ~]# blkid   查看系统能够使用的设备

变成了一种虚拟设备

 

6、挂载/dev/vg0/lv0

[root@server ~]# mount /dev/vg0/lv0 /mnt/

 

7、查看挂载点的信息

[root@server ~]# df -Th -t xfs   查看文件系统是xfs的设备的挂载信息
Filesystem          Type  Size  Used Avail Use% Mounted on
/dev/vda3           xfs   8.4G  3.1G  5.3G  37% /
/dev/vda1           xfs   197M  102M   95M  52% /boot
/dev/mapper/vg0-lv0 xfs    17M  1.1M   16M   7% /mnt

 

可以使用,表示已经挂载好。

 

监控结果

 

8、如何实现开机自动挂载呢?

[root@server mnt]# vim /etc/fstab   #在该文件的最后添加下面的内容
/dev/vg0/lv0    /mnt    xfs     defaults        0 0

[root@server mnt]# cd
[root@server ~]# umount /mnt/
[root@server ~]# mount -a   
[root@server ~]# df -Th -t xfs
Filesystem          Type  Size  Used Avail Use% Mounted on
/dev/vda3           xfs   8.4G  3.1G  5.3G  37% /
/dev/vda1           xfs   197M  102M   95M  52% /boot
/dev/mapper/vg0-lv0 xfs    17M  1.1M   16M   7% /mnt

 

四、lvm的拉伸和缩减

 

lvm支持热拉伸(即不用卸载,直接拉伸),不支持热缩减

 

1、xfs文件系统的拉伸

xfs文件系统只有拉伸(热拉伸),没有缩减。

xfs文件系统支持热拉伸。

 

(1)当vg的剩余容量足够时

 

【1】、lvextend -L 80M /dev/vg0/lv0       拉伸设备至80M
或者lvresize -L +60M /dev/vg0/lv0   增加60M给/dev/vg0/lv0设备(因为/dev/vg0/lv0这个设备原来的大小是20M,+60M之后就是80M。因此效果同"lvextend -L 80M /dev/vg0/lv0"这个命令)

 

【2】、xfs_growfs /dev/vg0/lv0       拉伸文件系统,不用指定拉伸的大小,系统自动补全(大小和设备大小一样)

 

【3】、ls /mnt      #查看/mnt目录下的内容,以确保之前写入的数据file没有丢失

 

监控结果:

 

(2)当vg的剩余容量不足时

 

【1】、再次建立分区并修改标签为8e

 

【2】、pvcreate /dev/vdb2          生成pv       

 

【3】、vgextend vg0 /dev/vdb2      将生成的物理卷放到物理卷组vg0中

 

【4】、lvextend -L 200M /dev/vg0/lv0      拉伸设备至200M
或者lvresize -L +120M /dev/vg0/lv0    /dev/vg0/lv0这个设备原来的大小为80M

 

【5】、xfs_growfs /dev/vg0/lv0        拉伸文件系统,不用指定拉伸的大小,系统自动补全(大小和设备大小一样)

 

【6】、ls /mnt      #查看/mnt目录下的内容,以确保之前写入的数据file没有丢失

 

监控结果

 

2、ext文件系统的拉伸和缩减

 

ext文件系统既有拉伸又有缩减

 

(1)ext文件系统的拉伸

ext支持热拉伸(即不用卸载,直接拉伸)

 

【1】、当vg的剩余容量足够时

 

因为/dev/vg0/lv0已经挂载,现在要对其修改文件系统,所以要先卸载

 

<1>、umount /mnt   或者umount /dev/vg0/lv0  或者umount /dev/mapper/vg0-lv0

即/dev/vg0/lv0与/dev/mapper/vg0-lv0是一个东西

 

<2>、mkfs.ext4 /dev/vg0/lv0       将/dev/vg0/lv0的文件系统设置为ext类型的文件系统

 

文件系统类型已经变为ext文件系统,操作成功

 

<3>、mkdir /mnt/test        在/mnt目录下创建文件夹test,以便后续的测试,测试文件不丢失

其中/mnt目录下的lost+found目录是因为之前更改了/dev/vg0/lv0这个设备的文件系统导致之前的file文件丢失,所生成的目录。

 

<4>、mount /dev/vg0/lv0  /mnt      挂载/dev/vg0/lv0,挂载之后显示的时/dev/mapper/vg0-lv0(即虚拟设备)

 

<5>、lvextend -L 250M /dev/cg0/lv0      拉伸设备,至250M
或者lvresize +50M /dev/vg0/lv0   (/dev/vg0/lv0这个设备原来的大小是200M)

 

<6>、resize2fs /dev/vg0/lv0        拉伸文件系统,不用指定拉伸的大小,系统自动补全(大小和设备大小一样)

 

<7>、ls /mnt      #查看/mnt目录下的内容,以确保之前写入的数据file没有丢失

 

监控结果:

 

【2】、当vg的剩余容量不足时

 

<1>、再次建立分区并修改标签为8e


 

<2>、pvcreate /dev/vdb3          生成pv       

 

<3>、vgextend vg0 /dev/vdb3      将生成的物理卷放到物理卷组vg0中

 

<4>、lvextend -L 350M /dev/vg0/lv0      拉伸设备至350M
或lvresize -L +100M /dev/vg0/lv0    /dev/vg0/lv0中这个设备原来的大小为250M

 

<5>、resize2fs /dev/vg0/lv0        拉伸文件系统,不用指定拉伸的大小,系统自动补全(大小和设备大小一样)

 

【6】、ls /mnt      #查看/mnt目录下的内容,以确保之前写入的数据file没有丢失

 

监控结果

 

(2)ext文件系统的缩减(缩减和拉伸正好相反:拉伸先拉伸设备,再拉伸文件系统;缩减先缩减文件系统,再缩减设备)

ext不支持热缩减(即要先卸载,再缩减)

 

【1】、umount /mnt  或者umount /dev/vg0/lv0 或者umount /dev/mapper/vg0-lv0

即/dev/vg0/lv0与/dev/mapper/vg0-lv0是同一个设备

 

【2】、e2fsck -f /dev/vg0/lv0       扫描并强制检查

 

【3】、resize2fs /dev/vg0/lv0 80M      缩减文件系统至80M

 

【4】、lvreduce -L 80M /dev/vg0/lv0          缩减设备至80M(这里要指定缩减以后的大小)
lvresize -L -170M /dev/vg0/lv0     (/dev/vg0/lv0这个设备原来的大小是250M)

 

【5】、monut /dev/vg0/lv0 /mnt           挂载来查看文件系统的大小是否缩减成功


 

【6】、ls /mnt      #查看/mnt目录下的内容,以确保之前写入的数据file没有丢失

 

监测结果:

 

五、vg的缩减

 

1、当vg没有人在用时

 

【1】、vgreduce vg0 /dev/vdb2           将/dev/vdb2从vg0中移出(缩减vg)

 

【2】、pvremove /dev/vdb2     从PV中删除/dev/vdb2

 

监测结果:

 

为了完成下面的测试,需要将vg再添加进来

pvcreate /dev/vdb2
vgextend vg0 /dev/vdb2

 

监测结果:

 

2、当vg有人在使用时,要进行数据的迁移

 

【1】、pvmove /dev/vdb1 /dev/vdb2        将/dev/vdb1中的数据迁移到/dev/vdb2

 

【2】、vgreduce vg0 /dev/vdb1                       将/dev/vdb1从vg0中移出(缩减vg)

 

【3】、pvremove /dev/vdb1                  移出/dev/vdb1对应的pv

 

监测结果:

 

六、LVM的LV磁盘快照(快照的损坏不影响原设备)

 

1、LV磁盘快照的概念

        什么是LV磁盘快照?快照就是将当时的系统信息记录下来,就好像照相记录一般。未来若有任何数据修改,则原始数据会被办到移到快照区,没有被修改的区域则由快照区与文件系统共享。

        LVM的磁盘快照是非常棒的,【备份工具】,因为它只有备份有被修改到的数据,文件系统内没有被修改的数据依旧保持在原本的数据块内,但是LVM快照功能会知道哪些数据放置在哪里,因此【快照】当时的文件系统就得以【备份】下来,且快照所占用的容量又非常小。所以说,LV磁盘快照是非常棒的【备份工具】。

       由于快照区与原本的LV共享很多PE数据块,因此快照区与被快照的LV必须要在同一个VG上面。

 

2、LV磁盘快照的原理

 

        左边的图表示,LVM会在VG上预留一定的区域作为快照区,原本lv中存放着数 据,同时快照区存放着lv中元数据,因此快照区大小不需要和原始lv一样的大小。在刚创建snapshot的时候,快照区中并不会真实地拷贝原始lv中的 数据,只是记录了整个原始lv中的元数据,所以这个时间点快照区和原始lv共享文件系统的数据,即两边的数据一样。

         右边的图表示,当原始lv中的数据发生改变的时候,原始lv中的发生变化的PE的数据更新之前,会将数据真实地备份至快照区的一个PE中,如图中,A->new A之前,先将A备份至快照区的一个PE,然后lv中A才更新为new A,这样快照区会保存lv中PE发生变化之前的数据,这时候我们再访问快照区的内容仍然为创建snapshot那个时间点的时候lv中的数据,因此我们可以利用快照区进行备份和恢复。

        需要注意的是,由于快照区也有容量的限制,所以呢,当原始lv中发生变化的PE的数量超过快照区的PE的数量的时候,该快照就会立即失效。

        我 们在创建快照区的时候,要考虑将来lv数据的变化量,以此来指定快照区的大小,一种解决办法是刚创建完快照之后,立即把快照区中的内容进行备份,这样就不 用时刻考虑快照区会失效了,因为我们已经把他的数据备份走了。还有一种简单粗暴的方法就是创建一个和原始lv一样大小的快照区,这样就不用担心数据变化量 的因素了。

 

3、传统快照区的建立

 

(1)生成lvm快照,大小为40M

1、利用lvcreate建立lv0的快照区,快照被取名为lv0-backup,且给予大小为40M
[root@server ~]# lvcreate -s -L 40M -n lv0-backup /dev/vg0/lv0
  Logical volume "lv0-backup" created
#上面命令中的-s选项代表的是snapshot快照功能

[root@server ~]# lvdisplay /dev/vg0/lv0-backup 
  --- Logical volume ---
  LV Path                /dev/vg0/lv0-backup
  LV Name                lv0-backup
  VG Name                vg0
  LV UUID                lU9dmN-UsCE-MK8Y-CfOq-iQKC-Hjsk-LGPIiz
  LV Write Access        read/write
  LV Creation host, time server, 2019-05-24 11:25:23 +0800
  LV snapshot status     active destination for lv0
  LV Status              available
  # open                 0
  LV Size                80.00 MiB        #原始盘,就是lv0的原始容量
  Current LE             20
  COW-table size         40.00 MiB        #这个快照能记录的最大容量
  COW-table LE           10
  Allocated to snapshot  0.03%            #目前已经用掉的容量
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           252:1

我们可以看到,这个/dev/vg0/lv0-backup快照区就被建立起来了,而且它的VG量竟然与原本的/dev/vg0/lv0相同。也就是说,如果你真的挂载这个设备时,看到的数据跟原本的lv0相同。下面,我们就来试试吧

 

(2)挂载lvm快照

[root@server ~]# blkid 
/dev/vda1: UUID="96d4a822-5cd8-48b8-a353-91305bc9672e" TYPE="xfs" 
/dev/vda2: UUID="b3937a5a-4586-4eae-8c77-ad18526fb1d4" TYPE="swap" 
/dev/vda3: UUID="128c866d-892b-4384-bc8b-6491715d969b" TYPE="xfs" 
/dev/vdb2: UUID="qDdtMA-14VZ-osGt-ibzn-l8es-OxAz-USDrq2" TYPE="LVM2_member" 
/dev/vdb3: UUID="laba8B-Ot5c-GxeG-Ve9R-Zlzp-CdQO-LOXFPM" TYPE="LVM2_member" 
/dev/mapper/vg0-lv0: UUID="0426d74b-3f40-45f7-a8f5-93c2d76bdcc2" TYPE="ext4" 
/dev/mapper/vg0-lv0--backup: UUID="0426d74b-3f40-45f7-a8f5-93c2d76bdcc2" TYPE="ext4" 
/dev/mapper/vg0-lv0-real: UUID="0426d74b-3f40-45f7-a8f5-93c2d76bdcc2" TYPE="ext4" 
/dev/mapper/vg0-lv0--backup-cow: TYPE="DM_snapshot_cow" 
#从上面命令的输出结果中,我们可以看到/dev/vg0/lv0与/dev/vg0/lv0-backup这两个设备的UUID是一模一样的。
#ext文件系统允许相同的UUID文件系统的挂载,所以这里不会出现任何问题。
#但若是xfs文件系统,因为xfs文件系统不允许相同的UUID文件系统的挂载,所以直接挂载会有问题。
#因此若是xfs文件系统,则需要添加参数nouuid来忽略相同的UUID所造成的问题。
#即若是xfs文件系统,使用“mount -o nouuid /dev/vg0/lv0-backup /opt“来进行挂载。

[root@server ~]# mount /dev/vg0/lv0-backup /opt/
[root@server ~]# df
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/vda3                     8709120 3217836   5491284  37% /
devtmpfs                       500508       0    500508   0% /dev
tmpfs                          508976     140    508836   1% /dev/shm
tmpfs                          508976    7172    501804   2% /run
tmpfs                          508976       0    508976   0% /sys/fs/cgroup
/dev/vda1                      201388  104364     97024  52% /boot
/dev/mapper/vg0-lv0             75231    1552     68646   3% /mnt
/dev/mapper/vg0-lv0--backup     75231    1552     68646   3% /opt
[root@server ~]# ls /opt/      #在快照挂载的目录下,我们可以看到/dev/vg0/lv0这个设备中的内容
lost+found  test

 

(3)如果截取的数据大于40M,就会损坏快照

dd if=/dev/zero of=/mnt/file bs=1M count=50

此时,/dev/vg0/lv0-backup会自动卸载

 

(4)再次挂载会报错

mount /dev/vg0/lv0-backup /mnt

 

(5)重新生成快照,并进行挂载

lvremove /dev/vg0/lv0-backup         移除快照

 

lvcreate -s -L 40M -n lv0-backup /dev/vg0/lv0    重新生成快照

 

mount /dev/vg0/lv0-backup /opt

 

3、利用快照区恢复系统(针对xfs文件系统)

 

(1)修改/dev/vg0/lv0的文件系统类型为xfs文件系统,进行挂载,写入数据。删除原来的快照/dev/vg0/lv0-backup并重新生成新的快照/dev/vg0/lv0-backup666,并挂载新的快照

[root@server ~]# umount /dev/vg0/lv0
[root@server ~]# umount /dev/vg0/lv0-backup 
[root@server ~]# mkfs.xfs -f /dev/vg0/lv0
[root@server ~]# mount /dev/vg0/lv0 /mnt/
[root@server ~]# ls /mnt/      #因为修改了/dev/vg0/lv0这个设备的文件系统类型,所以原来的test目录已经丢失
[root@server ~]# 
[root@server ~]# touch /mnt/file
[root@server ~]# mkdir /mnt/test
[root@server ~]# ls /mnt/
file  test

[root@server ~]# lvremove /dev/vg0/lv0-backup 
[root@server ~]# lvcreate -s -L 40M -n lv0-backup666 /dev/vg0/lv0


[root@server ~]# blkid 
/dev/mapper/vg0-lv0: UUID="afb9431e-14b3-43ad-9a90-e7d037400329" TYPE="xfs" 
/dev/mapper/vg0-lv0--backup666: UUID="afb9431e-14b3-43ad-9a90-e7d037400329" TYPE="xfs" 
/dev/mapper/vg0-lv0-real: UUID="afb9431e-14b3-43ad-9a90-e7d037400329" TYPE="xfs" 
/dev/mapper/vg0-lv0--backup666-cow: TYPE="DM_snapshot_cow" 
#我们可以看到/dev/vg0/lv0和/dev/vg0/lv0-backup的文件系统类型已经变为了xfs类型


[root@server ~]# mount -o nouuid /dev/vg0/lv0-backup666 /opt/   #使用nouuid参数忽略UUID号(因为/dev/vg0/lv0和/dev/vg0/lv0-backup666)
[root@server ~]# ls /opt/
file  test

 

(2)先将原本的/dev/vg0/lv0内容做些修改,增增减减一些文件和目录

[root@server ~]# rm -rf /mnt/file 
[root@server ~]# rm -rf /mnt/test
[root@server ~]# cp /etc/passwd /mnt/
[root@server ~]# ls /mnt/
passwd
[root@server ~]# ls /opt/
file  test
#两个目录的内容看起来已经不太一样了,检测一下快照LV
[root@server ~]# lvdisplay /dev/vg0/lv0-backup 
...
  Allocated to snapshot  5.06%
...
#上面仅列出了最主要的部分,就是全部容量已经被用掉了5.06%

 

(3)利用快照区将原本的文件系统备份,我们使用xfsdump来处理

[root@server ~]# xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /opt   
#值的注意的是:要写成/opt,不要写成/opt/,否则会报错【ERROR: /opt/ does not identify a file system】

#此时就会有一个备份文件,即/home/lvm.dump文件
[root@server ~]# ll /home/lvm.dump 
-rw-r--r--. 1 root root 22288 May 24 13:54 /home/lvm.dump

 

(4)将lv0-backup666卸载并删除(因为里面的内容已经备份起来了)

[root@server ~]# umount /dev/vg0/lv0-backup666 
[root@server ~]# lvremove /dev/vg0/lv0-backup666


[root@server ~]# umount /dev/vg0/lv0 
[root@server ~]# mkfs.xfs -f /dev/vg0/lv0 


[root@server ~]# xfsrestore -f /home/lvm.dump -L lvm1 /mnt/
[root@server ~]# ls /mnt/
file  test
#我们可以看到,与最初的内容相同,这就是通过快照来还原的一个简单方法


七、LVM相关命令

 

任务PV阶段VG阶段LV阶段文件系统(XFS/ext4)
查找(scan)pvscanvgscanlvscnblkid

建立(create)

pvcreatevgcreatelvcreatemkfs.xfs  |  mkfs.ext4
列出(display)pvdisplayvgdisplaylvdisplaydf、mount
增加(extend) vgextendlvextend(lvresize)

xfs_growfs |

resize2fs

减少(reduce) vgreducelvreduce(lvresize)

不支持  |

resize2fs

删除(remove)pvremovevgremovelvremoveumount、重新格式化
修改容量(resize)pvresize lvresize

xfs_growfs  |

resize2fs

修改属性(attribute)pvchangevgchangelvchange/etc/fstab、remount

 

八、LVM的关闭

 

会玩LVM还不行,你必须要会删除系统内的LVM。因为你的物理分区已经被LVM使用,如果没有关闭LVM就直接将那些分区删除或转为其他用途的话,系统是会发生很大的问题的。所以你必须要知道如何将LVM的设备关闭并删除才行。其实不难,根据以下的流程来处理即可:

  1. 先卸载系统上面的LVM文件系统(包括快照和所由LV)
  2. 使用lvremove删除LV
  3. 使用vgchange  -a  n  VGname 让 VGname这个VG不具有Active的标志(这步可做,也可不做)
  4. 使用vgremove删除VG
  5. 使用pvremove删除PV
  6. 最后,使用fdisk修改ID回来,或者删除分区,重新建立分区

 

1、先卸载系统上面的LVM文件系统(包括快照和所由LV)

上面的实验已经做过了,这里不必重复做

 

2、使用lvremove删除LV

lvremove /dev/vg0/lv0-backup666        移除快照/dev/vg0/lv0-backup666(上面实验已经做过,这里不必重复做)
lvremove /dev/vg0/lv0     移除/dev/vg0/lv0

 

3、使用vgchange  -a  n  VGname 让 VGname这个VG不具有Active的标志(这步可做,也可不做)

vgchange -a n vg0

 

4、使用vgremove删除VG

vgremove vg0                       移除vg0

 

5、使用pvremove删除PV

pvremove /dev/vdb1        移除/dev/vdb1生成的快照(前面的实验已经做过,这里不需要重复做)
pvremove /dev/vdb2        移除/dev/vdb2生成的快照
pvremove /dev/vdb3        移除/dev/vdb3生成的快照

监测结果:

 

6、最后,使用fdisk修改ID回来,或者删除分区,重新建立分区(这里以改ID为例)

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值