• 逻辑卷管理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

  • 相关阅读:
    java第十三周作业
    java第十三周随堂
    安卓作业
    5.29 第十三周作业
    5.28第十三周上机练习
    5.22第十二周作业
    5.21第十二章上机练习
    5.15 第十一周作业
    5.14 第十一周 上机练习
    5.7第十周上机练习
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247067.html
Copyright © 2020-2023  润新知