逻辑卷管理LVM

        LVM(Logical Volume Manager,逻辑卷管理),可以弹性调整分区大小。LVM将多个分区(或磁盘)整合在一起,让这些分区看起来就像是一个磁盘一样,将来可以新增或移除其他的分区到这个LVM 管理的“磁盘”当中。因此说LVM可以弹性调整分区的大小。

 

一:概念

        LVM可以将几个分区(或磁盘),通过软件组合成为一块独立的“磁盘”(VG),然后将这块“磁盘”再分割成为可使用的“分区”(LV),最终就能够挂载使用了。它主要涉及到的概念如下:

        1:物理卷(Physical Volume, PV)

        实际的分区需要通过fdisk命令调整系统识别码(system ID)为“8e”(LVM的识别码),然后再通过pvcreate命令,就可以将该分区转换成LVM最底层的物理卷了。

        2:卷组(Volume Group,VG)

        卷组就是所谓的LVM“磁盘”,就是将多个物理卷整合成一个卷组。

        3:物理块(Physical Extend, PE)

        物理块是LVM最小的储存单位,类似于磁盘的扇区的概念。默认情况下,物理块大小为4MB。

        4:逻辑卷(Logical Volume,LV)

        卷组会被切分成逻辑卷,它类似于原来分区的概念。为了方便使用者利用LVM 来管理其系统,因此LV的名字通常指定为“/dev/vgname/lvname”。

 

        PE是整个LVM的最小储存单位,因此LV的大小就与此LV内的PE数有关。LVM可弹性调整LV的容量,就是通过增加或减少PE实现的。将原本LV内的PE移转LV之外,就可以减少LV容量;将PE加到LV中,就可以增加LV容量。

        VG、LV与PE的关系如下图:

       如上图所示,VG将一定量的PE分配给LV。如果未来这个VG要扩充的话,加上其他的PV即可。而LV如果要扩充的话,是通过将VG内没有使用到的PE加入到LV来实现的。

        规划好LV之后,通过mkfs命令,就可以将LV格式化成可以利用的文件系统了,再通过mount命令挂载之后,就可以使用了。

        而且这个文件系统的容量在未来还能进行扩充或减少,且里面的数据还不会被影响。整个的操作流程如下:

 

        LV的数据写入有两种方式,分别是线性模式(linear)和交错模式(triped):

        线性模式(linear):若将/dev/hda1,/dev/hdb1这两个分区加入到VG中,并且整个VG只有一个LV时,那么所谓的线性模式就是,当/dev/hda1的容量用完之后,才会使用/dev/hdb1。推荐使用这种模式。

        交错模式(triped):将一笔数据拆成两部分,分别写入/dev/hda1和/dev/hdb1中。

        LVM最主要的用处是在实现一个可以弹性调整容量的文件系统上,而不是在创建一个效率为主的磁盘上,因此,LVM 默认的读写模式是线性模式。如果使用triped模式,则当任何一个分区挂掉时,所有的数据都会被破坏!

 

二:实操

        使用LVM需要安装Lvm2,在ubuntu下可以使用apt安装:

# apt-get install lvm2

        底下的操作,将4个物理分区整合成为一个VG,VG名为vbirdvg。PE大小为16MB,将全部的VG容量都分配给LV,LV的名称配置为vbirdlv。最终将这个LV格式化为ext3的文件系统,且挂载在/mnt/lvm 中。

 

        首先分割出4个分区,每个分区的容量均为 1.5GB 左右,且system ID需要为 8e:

# fdisk -l
Disk /dev/hda: 41.1 GB, 41174138880 bytes
255 heads, 63 sectors/track, 5005 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda3            1289        1925     5116702+  83  Linux
/dev/hda4            1926        5005    24740100    5  Extended
/dev/hda5            1926        2052     1020096   82  Linux swap / Solaris
/dev/hda6            2053        2235     1469916   8e  LinuxLVM
/dev/hda7            2236        2418     1469916   8e  LinuxLVM
/dev/hda8            2419        2601     1469916   8e  LinuxLVM
/dev/hda9            2602        2784     1469916   8e  LinuxLVM

        上面的/dev/hda{6,7,8,9}这四个分区,就是要用到的实体分区!ID通过fdisk命令(t:  change a partition's system id)配置为 8e后,会导致system变成“LinuxLVM”。


        1:PV阶段

        要创建PV,只要使用pvcreate即可。与PV有关的命令如下:

pvcreate:将实体分区创建成为PV;

pvscan:搜寻目前系统里面任何具有PV的磁盘;

pvdisplay:显示出目前系统上面的PV状态;

pvremove:将PV属性移除,使分区不再具有PV属性。

 

        首先用pvscan查看目前系统上具有PV属性的磁盘:

# pvscan
  No matching physical volumes found

        然后将 /dev/hda6 - /dev/hda9 创建成为PV格式,并在此调用pvscan查看:

# pvcreate /dev/hda{6,7,8,9}
  Physical volume "/dev/hda6" successfully created
  Physical volume "/dev/hda7" successfully created
  Physical volume "/dev/hda8" successfully created
  Physical volume "/dev/hda9" successfully created

# pvscan
  PV /dev/hda6         lvm2 [1.40 GB]
  PV /dev/hda7         lvm2 [1.40 GB]
  PV /dev/hda8         lvm2 [1.40 GB]
  PV /dev/hda9         lvm2 [1.40 GB]
  Total: 4 [5.61 GB] / in use: 0 [0   ] / in no VG: 4 [5.61 GB]  

        最后调用pvdisplay查看详细信息:

# pvdisplay
  "/dev/hda6" is a new physical volume of "1.40 GB"
  --- NEW Physical volume ---
  PV Name               /dev/hda6  <==实际的 partition 装置名称
  VG Name                          <==因为尚未分配出去,所以空白!
  PV Size               1.40 GB    <==就是容量说明
  Allocatable           NO         <==是否已被分配,结果是 NO
  PE Size (KByte)       0          <==在此 PV 内的 PE 大小
  Total PE              0          <==共分割出几个 PE
  Free PE               0          <==没被 LV 用掉的 PE
  Allocated PE          0          <==尚可分配出去的 PE 数量
  PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
  ...

        2:VG阶段

        创建VG及VG相关的命令如下:

vgcreate:创建VG;

vgscan:搜寻系统上面是否有VG存在;

vgdisplay:显示目前系统上面的VG状态;

vgextend:在VG内添加额外的PV;

vgreduce:在VG内移除PV;

vgchange:配置VG是否启动 (active);

vgremove:删除一个VG;

 

        PV的名称其实就是分区的名称,但是VG名称则可以自己取。下面的例子中,将VG名称取名为vbirdvg。

        首先将/dev/hda6-8创建成为一个名为vbirdvg的VG,且指定PE为16M,并调用pvscan查看:

# vgcreate -s 16M vbirdvg /dev/hda{6,7,8}
  Volume group "vbirdvg" successfully created

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vbirdvg" using metadata type lvm2

        在此调用pvscan查看当前的状态:

# pvscan
  PV /dev/hda6   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
  PV /dev/hda7   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
  PV /dev/hda8   VG vbirdvg   lvm2 [1.39 GB / 1.39 GB free]
  PV /dev/hda9                lvm2 [1.40 GB]
  Total: 4 [5.57 GB] / in use: 3 [4.17 GB] / in no VG: 1 [1.40 GB]

        可见,有三个PV被用去,剩下一个 /dev/hda9 的PV没被用掉。

        调用vgdisplay查看当前VG状态:

# vgdisplay
  --- Volume group ---
  VG Name               vbirdvg
  System ID
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               4.17 GB   <==整体的 VG 容量有这么大
  PE Size               16.00 MB  <==内部每个 PE 的大小
  Total PE              267       <==总共的 PE 数量共有这么多!
  Alloc PE / Size       0 / 0
  Free  PE / Size       267 / 4.17 GB
  VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO

        这样就创建好一个VG了!如果需要扩充这个VG的容量,也就是将/dev/hda9添加到VG中,可以这样:

# vgextend vbirdvg /dev/hda9
  Volume group "vbirdvg" successfully extended

# vgdisplay
...
  VG Size               5.56 GB
  PE Size               16.00 MB
  Total PE              356
  Alloc PE / Size       0 / 0
  Free  PE / Size       356 / 5.56 GB
  VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO

        3:LV阶段

        创建好VG这个“大磁盘”之后,接下来就是进行“分区”。这个分区就是创建所谓的LV。现在需要将刚创建好的vbirdvg,分割成为vbirdlv,将整个VG的容量都分配到vbirdlv中。LV相关的命令如下:

        lvcreate:创建LV;

        lvscan:查询系统上面的LV;

        lvdisplay:显示系统上面的LV状态;

        lvextend:在LV里面添加容量;

        lvreduce:在LV里面减少容量;

        lvremove:删除一个LV;

        lvresize:对LV进行容量大小的调整。

 

        lvcreate用法如下:

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

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

        选项与参数:

        -L  :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,这个数量必须要是PE大小的倍数,若不相符,系统会自行计算最相近的容量。

        -l  :后面可以接PE的个数。

        -n  :后面接的就是LV的名称。

 

        首先,将整个名为vbirdvg的VG都分配给 vbirdlv,注意,PE共有356 个:

# lvcreate -l 356 -n vbirdlv vbirdvg
  Logical volume "vbirdlv" created
 
# ll /dev/vbirdvg/vbirdlv
lrwxrwxrwx 1 root root 27 Mar 11 16:49 /dev/vbirdvg/vbirdlv -> /dev/mapper/vbirdvg-vbirdlv 

        由于本例中每个PE为16M,因此上述的命令也可以使用如下的方式来创建:lvcreate-L 5.56G -n vbirdlv vbirdvg

        使用lvdisplay查看状态:

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdlv  <==这个才是 LV 的全名!
  VG Name                vbirdvg
  LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                5.56 GB               <==这个 LV 的容量这么大!
  Current LE             356
  Segments               4
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

        准备好LV之后,剩下的就是格式化、挂载了。要注意的是,VG的名称为 vbirdvg,但LV的名称必须使用全名,也就是/dev/vbirdvg/vbirdlv。


        4:文件系统阶段

# mkfs -t ext3 /dev/vbirdvg/vbirdlv <==注意 LV 全名!
# mkdir /mnt/lvm
# mount /dev/vbirdvg/vbirdlv  /mnt/lvm
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda2              9920624   3858984   5549572  42% /
/dev/hda3              4956316   1056996   3643488  23% /home
/dev/hda1               101086     21408     74459  23% /boot
tmpfs                   371332         0    371332   0% /dev/shm
/dev/mapper/vbirdvg-vbirdlv
                       5741020    142592   5306796   3% /mnt/lvm

       

        5:放大LV容量

        要放大LV的容量, 只需要一下步骤:

a:用fdisk配置新的,system ID为8e的分区;

b:利用pvcreate创建PV

c:利用vgextend 将PV加入名为vbirdvg的VG;

d:利用lvresize,将新加入的PV内的PE加入到vbirdlv中;

e;通过resize2fs扩容文件系统。

        具体步骤如下,首先找出一个3GB的新分区,也就是/dev/hda10:

# fdisk -l
   Device Boot      Start         End      Blocks   Id  System
....(中间省略)....
/dev/hda10           2785        3150     2939863+  8e  Linux LVM

        然后,创建新的PV:

# pvcreate /dev/hda10
  Physical volume "/dev/hda10" successfully created
# pvscan
  PV /dev/hda6    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda10                lvm2 [2.80 GB]
  Total: 5 [8.37 GB] / in use: 4 [5.56 GB] / in no VG: 1 [2.80 GB]

        然后,利用vgextend扩容VG:

# vgextend vbirdvg /dev/hda10
  Volume group "vbirdvg" successfully extended
# vgdisplay
  --- Volume group ---
  VG Name               vbirdvg
  System ID
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               8.36 GB
  PE Size               16.00 MB
  Total PE              535
  Alloc PE / Size       356 / 5.56 GB
  Free  PE / Size       179 / 2.80 GB
  VG UUID               4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO

        然后,利用lvresize扩容LV:

# lvresize -l +179 /dev/vbirdvg/vbirdlv
  Extending logical volume vbirdlv to 8.36 GB
  Logical volume vbirdlv successfully resized

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdlv
  VG Name                vbirdvg
  LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                8.36 GB
  Current LE             535
  Segments               5
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

# df /mnt/lvm
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv
                       5741020    261212   5188176   5% /mnt/lvm

        最终的结果中,LV放大到了8.36GB,但是文件系统却没有相对添加。这就需要使用 resize2fs命令来处理,该命令的用法如下:resize2fs [-f] [device] [size]

        选项与参数:

        -f:强制进行 resize;

        [device]:分区的名称;

        [size]:可以加也可以不加。如果加上size的话,那么就必须要给予一个单位,如M,G 等。如果没有size的话,则默认使用整个分区的容量来处理。

        下面,将完整的将LV容量扩充到整个文件系统:

# resize2fs /dev/vbirdvg/vbirdlv
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vbirdvg/vbirdlv is mounted on /mnt/lvm; on-line resizing 
Performing an on-line resize of /dev/vbirdvg/vbirdlv to 2191360 (4k) blocks.
The filesystem on /dev/vbirdvg/vbirdlv is now 2191360 blocks long.

# df /mnt/lvm
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv
                       8628956    262632   7931368   4% /mnt/lvm

        可见,LV的容量确实增加了。所以LVM支持在线resize,而且不会丢失数据。


        6:缩小LV容量

        假设想将/dev/hda6从LV中抽离出来,也就是缩小LV的容量。步骤如下:

        首先得到/dev/hda6的容量,尝试计算文件系统需缩小到多少:

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/hda6
  VG Name               vbirdvg
  PV Size               1.40 GB / not usable 11.46 MB
  Allocatable           yes (but full)
  PE Size (KByte)       16384
  Total PE              89
  Free PE               0
  Allocated PE          89
  PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN

# pvscan
  PV /dev/hda6    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda10   VG vbirdvg   lvm2 [2.80 GB / 0    free]
  Total: 5 [8.36 GB] / in use: 5 [8.36 GB] / in no VG: 0 [0   ]

        从pvdisplay可以看出/dev/hda6的大小,它有89个PE,也就是共有1.40G。从pvscan可以发现如果扣除/dev/hda6,则剩余量有:1.39*3 + 2.8,也就是6.97G。

        接下来,要调用resize2fs缩小文件系统的空间。在使用resize2fs缩小空间是,需要先umount,然后才能resize2fs:

# umount /mnt/lvm

# resize2fs /dev/vbirdvg/vbirdlv 6900M
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vbirdvg/vbirdlv to 1766400 (4k) blocks.
The filesystem on /dev/vbirdvg/vbirdlv is now 1766400 blocks long.

        然后,重新挂载:

# mount /dev/vbirdvg/vbirdlv /mnt/lvm
[root@www ~]# df /mnt/lvm
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv
                       6955584    262632   6410328   4% /mnt/lvm

        接下来就是将LV的容量降低,要注意的是,我们想要抽离的是/dev/hda6,这个PV有89个 PE。所以要这样进行:

# lvresize -l -89 /dev/vbirdvg/vbirdlv
  WARNING: Reducing active and open logical volume to 6.97 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vbirdlv? [y/n]: y
  Reducing logical volume vbirdlv to 6.97 GB
  Logical volume vbirdlv successfully resized

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdlv
  VG Name                vbirdvg
  LV UUID                8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                6.97 GB
  Current LE             446
  Segments               5
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

        接下来就要将/dev/hda6移出vbirdvg这个VG之外。得要先确定/dev/hda6里面的PE完全不被使用后,才能够将/dev/hda6抽离,先通过pvdisplay查看:

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/hda6
  VG Name               vbirdvg
  PV Size               1.40 GB / not usable 11.46 MB
  Allocatable           yes (but full)
  PE Size (KByte)       16384
  Total PE              89
  Free PE               0
  Allocated PE          89
  PV UUID               Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
...
  --- Physical volume ---
  PV Name               /dev/hda10
  VG Name               vbirdvg
  PV Size               2.80 GB / not usable 6.96 MB
  Allocatable           yes
  PE Size (KByte)       16384
  Total PE              179
  Free PE               89
  Allocated PE          90
  PV UUID               7MfcG7-y9or-0Jmb-H7RO-5Pa5-D3qB-G426Vq

        可见/dev/hda6中的Free PE为0,而没有使用的PE都在/dev/hda10上,因此需要先通过pvmove,将/dev/hda6内的PE移动到/dev/hda10上,然后调用vgreduce,将/dev/hda6从VG中移出:

# pvmove /dev/hda6 /dev/hda10

# vgreduce vbirdvg /dev/hda6
  Removed "/dev/hda6" from volume group "vbirdvg"

        最后,将/dev/hda6这个PV“删除”:

# pvscan
  PV /dev/hda7    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda8    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda9    VG vbirdvg   lvm2 [1.39 GB / 0    free]
  PV /dev/hda10   VG vbirdvg   lvm2 [2.80 GB / 0    free]
  PV /dev/hda6                 lvm2 [1.40 GB]
  Total: 5 [8.37 GB] / in use: 4 [6.97 GB] / in no VG: 1 [1.40 GB]

# pvremove /dev/hda6
  Labels on physical volume "/dev/hda6" successfully wiped

        这样,就完成了缩小LV容量的工作。

 

三:LVM 的系统快照

        LVM除了可以动态改变分区大小之外,还具有系统快照(snapshot)的能力。系统快照就是将某一时刻的系统记录下来,未来若有任何数据变动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。如下图所示:

        上图中,短虚线为文件系统,长虚线为快照区。左图为最初建立系统快照区的状况,LVM 会预留一个区域(左图的左侧三个PE区块)作为快照数据存放处。

        开始时快照区与文件系统区共享所有的PE数据,因此快照区的内容与文件系统是一模一样的。等到系统运行一阵子后,假设A区域的数据变动了(右图所示),则变动前系统会将该区域的旧数据移动到快照区,所以在右图的快照区被占用了一块PE成为 A,而其他 B 到 I 的区块则还是与文件系统共享!

        因此,LVM的系统快照是很好的“备份工具”,因为他只有备份有变动的数据。

 

        1:快照区的创建

        在上面的例子中,因VG把/dev/hda6移出之后,剩余的PE为0,因此,首先再次将/dev/hda6添加到VG中:

# vgdisplay
  --- Volume group ---
  VG Name               vbirdvg
...
  VG Size               6.97 GB
  PE Size               16.00 MB
  Total PE              446
  Alloc PE / Size       446 / 6.97 GB
  Free  PE / Size       0 / 0  <==没有多余的 PE 可用!

# pvcreate /dev/hda6
  Physical volume "/dev/hda6" successfully created
# vgextend vbirdvg /dev/hda6
  Volume group "vbirdvg" successfully extended
# vgdisplay
  --- Volume group ---
  VG Name               vbirdvg
...
  VG Size               8.36 GB
  PE Size               16.00 MB
  Total PE              535
  Alloc PE / Size       446 / 6.97 GB
  Free  PE / Size       89 / 1.39 GB  <==多出了 89 个 PE 可用!

         然后,利用lvcreate –s针对/dev/vbirdvg/vbirdlv这个LV创建系统快照区,取名为 vbirdss,且给予60个PE:

# lvcreate -l 60 -s -n vbirdss /dev/vbirdvg/vbirdlv
  Logical volume "vbirdss" created

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdss
  VG Name                vbirdvg
  LV UUID                K2tJ5E-e9mI-89Gw-hKFd-4tRU-tRKF-oeB03a
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/vbirdvg/vbirdlv
  LV Status              available
  # open                 0
  LV Size                6.97 GB    <==被快照的原 LV 磁碟容量
  Current LE             446
  COW-table size         960.00 MB  <==快照区的实际容量
  COW-table LE           60         <==快照区占用的 PE 数量
  Allocated to snapshot  0.00%
  Snapshot chunk size    4.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

        通过将新建的快照进行挂载,可以看见快照/dev/mapper/vbirdvg-vbirdss与/dev/mapper/vbirdvg-vbirdlv是完全相同的:

# mkdir /mnt/snapshot
# mount /dev/vbirdvg/vbirdss /mnt/snapshot
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda2              9920624   3859032   5549524  42% /
/dev/hda3              4956316   1056996   3643488  23% /home
/dev/hda1               101086     21408     74459  23% /boot
tmpfs                   371332         0    371332   0% /dev/shm
/dev/mapper/vbirdvg-vbirdlv
                       6955584    262632   6410328   4% /mnt/lvm
/dev/mapper/vbirdvg-vbirdss
                       6955584    262632   6410328   4% /mnt/snapshot

        2:利用快照,进行备份和还原

        接下来,就利用快照做一下系统备份和复原,首先umount快照/dev/mapper/vbirdvg-vbirdss,然后改变一下/dev/mapper/vbirdvg-vbirdlv中的内容:

# umount /mnt/snapshot

# ll /mnt/lvm
drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
drwx------   2 root root 16384 Mar 11 16:59 lost+found

# rm -r /mnt/lvm/log
# cp -a /boot /lib /sbin /mnt/lvm
# ll /mnt/lvm
drwxr-xr-x   4 root root  4096 Dec 15 16:28 boot
drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
drwxr-xr-x  14 root root  4096 Sep  5  2008 lib
drwx------   2 root root 16384 Mar 11 16:59 lost+found
drwxr-xr-x   2 root root 12288 Sep  5  2008 sbin

# lvdisplay /dev/vbirdvg/vbirdss
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdss
  VG Name                vbirdvg
...
  Allocated to snapshot  12.22%
...

        可见,将/dev/mapper/vbirdvg-vbirdlv中内容改变之后,快照区的使用率到了12.22%,说明原数据已经被复制到快照区了,也就是那60个PE中了。因此,若改动的原始数据量过大,会使快照区容纳不了。

        接下来,将快照区进行备份,然后利用该备份,恢复/dev/mapper/vbirdvg-vbirdlv中的内容:

# mount /dev/vbirdvg/vbirdss /mnt/snapshot
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv
                       6955584    370472   6302488   6% /mnt/lvm
/dev/mapper/vbirdvg-vbirdss
                       6955584    262632   6410328   4% /mnt/snapshot
# mkdir -p /backups
# cd /mnt/snapshot
# tar -jcv -f /backups/lvm.tar.bz2 *

# umount /mnt/snapshot
# lvremove /dev/vbirdvg/vbirdss
Do you really want to remove active logical volume "vbirdss"? [y/n]: y
  Logical volume "vbirdss" successfully removed

# umount /mnt/lvm
# mkfs -t ext3 /dev/vbirdvg/vbirdlv
# mount /dev/vbirdvg/vbirdlv /mnt/lvm
# tar -jxv -f /backups/lvm.tar.bz2 -C /mnt/lvm
# ll /mnt/lvm
drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
drwx------   2 root root 16384 Mar 11 16:59 lost+found

        可见,利用快照的备份,已经将/dev/vbirdvg/vbirdlv中的内容,恢复如初了。

        这里之所以要备份,而不是直接格式化/dev/vbirdvg/vbirdlv,并将 /dev/vbirdvg/vbirdss直接复制给 vbirdlv。是因为vbirdss其实是vbirdlv的快照,如果格式化整个vbirdlv,则原本vbirdlv中的所有数据都会被搬移到vbirdss中,但是显然vbirdss是没有这么大空间的。

 

        3:使用原系统还原快照

        换个角度来想,还可以将原本的vbirdlv当作备份数据,然后将vbirdss当作实际在运行中的数据,任何测试的动作都在vbirdss这个快照区当中测试,那么当测试完毕后,只要将快照区删除,然后重新对vbirdlv作一个快照区即可。

        首先创建一个新的快照区vbirdss,这次分配89个PE:

# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv
  Logical volume "vbirdss" created

# lvdisplay /dev/vbirdvg/vbirdss
  --- Logical volume ---
  LV Name                /dev/vbirdvg/vbirdss
  VG Name                vbirdvg
  LV UUID                as0ocQ-KjRS-Bu7y-fYoD-1CHC-0V3Y-JYsjj1
  LV Write Access        read/write
  LV snapshot status     active destination for /dev/vbirdvg/vbirdlv
  LV Status              available
  # open                 0
  LV Size                6.97 GB
  Current LE             446
  COW-table size         1.39 GB
  COW-table LE           89
  Allocated to snapshot  0.00%
  Snapshot chunk size    4.00 KB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1  

        然后,将vbirdlv进行隐藏,而针对vbirdss做变动,然后,再利用vbirdlv做还原:

# umount /mnt/lvm
# mount /dev/vbirdvg/vbirdss /mnt/snapshot
# df /mnt/snapshot
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdss
                       7192504    265804   6561340   4% /mnt/snapshot

# rm -r /mnt/snapshot/etc /mnt/snapshot/log
# cp -a /boot /lib /sbin /mnt/snapshot/
# ll /mnt/snapshot
drwxr-xr-x  4 root root  4096 Dec 15 16:28 boot
drwxr-xr-x 14 root root  4096 Sep  5  2008 lib
drwx------  2 root root 16384 Mar 11 16:59 lost+found
drwxr-xr-x  2 root root 12288 Sep  5  2008 sbin  <==与原本数据有差异了

# mount /dev/vbirdvg/vbirdlv /mnt/lvm
# ll /mnt/lvm
drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
drwx------   2 root root 16384 Mar 11 16:59 lost+found

# umount /mnt/snapshot
# lvremove /dev/vbirdvg/vbirdss
Do you really want to remove active logical volume "vbirdss"? [y/n]: y
  Logical volume "vbirdss" successfully removed

# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv
# mount /dev/vbirdvg/vbirdss /mnt/snapshot
# ll /mnt/snapshot
drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc
drwxr-xr-x  17 root root  4096 Mar 11 14:17 log
drwx------   2 root root 16384 Mar 11 16:59 lost+found

四:关闭LVM

        因为你的实体分区已经被用到LVM去了,若在没有将LVM关闭的情况下,就直接将那些分区删除或转为其他用途的话,系统可能会发生错误。

        关闭LVM的步骤如下:

a:使用 lvremove移除 LV ;

b:使用 vgchange-a n VGname,让VGname 这个 VG 不具有 Active 的标志;

c:使用 vgremove移除 VG:

d:使用 pvremove移除 PV;

e:最后,使用 fdisk修改 ID。

        整个过程如下:

# umount /mnt/lvm
# umount /mnt/snapshot

# lvremove /dev/vbirdvg/vbirdss  <==先处理快照
Do you really want to remove active logical volume "vbirdss"? [y/n]: y
  Logical volume "vbirdss" successfully removed
# lvremove /dev/vbirdvg/vbirdlv  <==再处理原系统
Do you really want to remove active logical volume "vbirdlv"? [y/n]: y
  Logical volume "vbirdlv" successfully removed

# vgchange -a n vbirdvg
  0 logical volume(s) in volume group "vbirdvg" now active

# vgremove vbirdvg
  Volume group "vbirdvg" successfully removed

# pvremove /dev/hda{6,7,8,9,10}
  Labels on physical volume "/dev/hda6" successfully wiped
  Labels on physical volume "/dev/hda7" successfully wiped
  Labels on physical volume "/dev/hda8" successfully wiped
  Labels on physical volume "/dev/hda9" successfully wiped
  Labels on physical volume "/dev/hda10" successfully wiped

转自:http://vbird.dic.ksu.edu.tw/linux_basic/0420quota.php

原文地址:https://www.cnblogs.com/gqtcgq/p/7247067.html