zoukankan      html  css  js  c++  java
  • LVM详解

    LVM相关概念和机制

    LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。

    lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。

    • PV(Physical Volume)即物理卷

      硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。

    • VG(Volume Group)即卷组

    将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。

    • PE(Physical Extend)

    PE是VG中的存储单元。实际存储的数据都是存储在这里面的。

    • LV(Logical Volume)

    VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。

    通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。

    • LE(logical extent)

    PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。

    LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。

    LVM的写入机制

    LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:

    • 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
    • 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。

    尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。

     LVM实现图解

    LVM常用命令汇总

    任务

    PV阶段

    VG阶段

    LV阶段

    查找(scan)

    pvscan

    vgscan

    lvscan

    新建(create)

    pvcreate

    vgcreate

    lvcreate

    显示(display)

    pvdisplay

    vgdisplay

    lvdisplay

    增加(extend)

    vgextend

    lvextend(lvresize)

    减少(reduce)

    vgreduce

    lvreduce(lvresize)

    删除(remove)

    pvremove

    vgremove

    lvremove

    改变容量(resize)

    lvresize

    改变属性(attribute)

    pvchange

    vgchange

    lvchange

    LVM的实现

    1、准备物理磁盘。

    [root@localhost ~]# fdisk -l
    
    磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x0005b35c
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      616447      307200   83  Linux
    /dev/sda2          616448    41943039    20663296   8e  Linux LVM
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    
    磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    
    磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    
    磁盘 /dev/mapper/cl-root:20.1 GB, 20107493376 字节,39272448 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    
    磁盘 /dev/mapper/cl-swap:1048 MB, 1048576000 字节,2048000 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节

    我们从空的硬盘sdb上创建两个分区sdb1 5G,sdb2 5G为接下来做LVM做准备,注意的是我们在创建分区是需要设定分区的类型Linux LVM的分区类型为8e,并且这些分区要被内核识别,通过cat /proc/partions进行查看,若没有显示,则需要让内核重新进行探测

    [root@localhost ~]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)。
    
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
    
    Device does not contain a recognized partition table
    使用磁盘标识符 0x4822aff9 创建新的 DOS 磁盘标签。
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p
    分区号 (1-4,默认 1):1
    起始 扇区 (2048-41943039,默认为 2048):
    将使用默认值 2048
    Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G
    分区 1 已设置为 Linux 类型,大小设为 5 GiB
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    10487807     5242880   83  Linux
    
    命令(输入 m 获取帮助):t
    已选择分区 1
    Hex 代码(输入 L 列出所有代码):8e
    已将分区“Linux”的类型更改为“Linux LVM”
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    10487807     5242880   8e  Linux LVM
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p
    分区号 (2-4,默认 2):2
    起始 扇区 (10487808-41943039,默认为 10487808):
    将使用默认值 10487808
    Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):+5G
    分区 2 已设置为 Linux 类型,大小设为 5 GiB
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    10487807     5242880   8e  Linux LVM
    /dev/sdb2        10487808    20973567     5242880   83  Linux
    
    命令(输入 m 获取帮助):t
    分区号 (1,2,默认 2):2
    Hex 代码(输入 L 列出所有代码):8e
    已将分区“Linux”的类型更改为“Linux LVM”
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    10487807     5242880   8e  Linux LVM
    /dev/sdb2        10487808    20973567     5242880   8e  Linux LVM

    命令(输入 m 获取帮助):w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    正在同步磁盘。

    [root@localhost ~]# fdisk -l /dev/sdb
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x4822aff9
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048    10487807     5242880   8e  Linux LVM
    /dev/sdb2        10487808    20973567     5242880   8e  Linux LVM
    [root@localhost ~]# cat /proc/pa
    pagetypeinfo  partitions    
    [root@localhost ~]# cat /proc/partitions 
    major minor  #blocks  name
    
       8        0   20971520 sda
       8        1     307200 sda1
       8        2   20663296 sda2
       8       16   20971520 sdb
       8       17    5242880 sdb1
       8       18    5242880 sdb2
       8       32   20971520 sdc
       8       48   20971520 sdd
      11        0    4277248 sr0
     253        0   19636224 dm-0
     253        1    1024000 dm-1

    创建物理卷

    将新创建的两个分区/dev/sdb1 /dev/sdb2创建成物理卷:所用的命令为pvcreate /dev/adb{1,2} 当然也可以分开进行设定

    [root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
      Physical volume "/dev/sdb1" successfully created.
      Physical volume "/dev/sdb2" successfully created.
    [root@localhost ~]# pvs
      PV         VG Fmt  Attr PSize  PFree 
      /dev/sda2  cl lvm2 a--  19.70g     0 
      /dev/sdb1     lvm2 ---   5.00g  5.00g
      /dev/sdb2     lvm2 ---   5.00g  5.00g
      /dev/sdc      lvm2 ---  20.00g 20.00g
      /dev/sdd      lvm2 ---  20.00g 20.00g

    通过pvs 和pvdisplay可以查看物理卷的信息,后面也可以指定特定的物理磁盘,查看某一个物理卷的信息

    [root@localhost ~]# pvdisplay 
      --- Physical volume ---
      PV Name               /dev/sda2
      VG Name               cl
      PV Size               19.71 GiB / not usable 3.00 MiB
      Allocatable           yes (but full)
      PE Size               4.00 MiB
      Total PE              5044
      Free PE               0
      Allocated PE          5044
      PV UUID               uTbh7P-pmtL-KRqx-uAys-fxUA-PdUa-LIpvOX
       
      "/dev/sdb1" is a new physical volume of "5.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb1
      VG Name               
      PV Size               5.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               UFLcKK-XrDv-1wZi-FYIL-FDSW-Bsn0-Xy1Era
       
      "/dev/sdc" is a new physical volume of "20.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdc
      VG Name               
      PV Size               20.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               gHJF8r-cqBO-EV3L-yxD9-3CaA-K3OR-jcFDtU
       
      "/dev/sdb2" is a new physical volume of "5.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb2
      VG Name               
      PV Size               5.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               9Y3f1L-3M35-lAHU-27xd-XpvI-ptOT-bRekUW
       
      "/dev/sdd" is a new physical volume of "20.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdd
      VG Name               
      PV Size               20.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               IKH97P-igyp-aaC7-bw2h-tQOF-gjXy-2pc9z0

    创建卷组

    物理卷pv创建好之后,才可以创建卷组,创建卷组则用命令vgcreate,并将刚才创建的两个物理卷加入该卷组,其中PE的默认大小为4MB,PE是卷组的最小存储单位,可以通过-s选项指定PE的大小,可以通过vgs或者vgdisplay来查看创建的卷组

    [root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
      Volume group "myvg" successfully created
    [root@localhost ~]# vgs
      VG   #PV #LV #SN Attr   VSize  VFree
      cl     1   2   0 wz--n- 19.70g    0 
      myvg   2   0   0 wz--n-  9.99g 9.99g
    [root@localhost ~]# vgdisplay 
      --- Volume group ---
      VG Name               cl
      System ID             
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  3
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               19.70 GiB
      PE Size               4.00 MiB
      Total PE              5044
      Alloc PE / Size       5044 / 19.70 GiB
      Free  PE / Size       0 / 0   
      VG UUID               AbayDZ-NRTB-EILO-IjLH-kHji-Ixek-LI1Kdx
       
      --- Volume group ---
      VG Name               myvg
      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
      Act PV                2
      VG Size               9.99 GiB
      PE Size               4.00 MiB
      Total PE              2558
      Alloc PE / Size       0 / 0   
      Free  PE / Size       2558 / 9.99 GiB
      VG UUID               bRctGj-xKXV-C2pw-hzqk-KSyI-h5mR-BATF9A

    创建逻辑卷

    卷组VG创建好之后,才可以创建逻辑卷LV,逻辑卷的创建命令为lvcreate,创建好之后可以通过lvs或者lvdisplay开查看创建的逻辑卷,需要说明的是在创建lv的时候需要指定其大小,选项为-L,逻辑卷的名字选项-n,也可以指定PE的个数选项-l

    [root@localhost ~]# lvcreate -L 5G -n textlv myvg
      Logical volume "textlv" created.
    [root@localhost ~]# lvs
      LV     VG   Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      root   cl   -wi-ao----   18.73g                                                    
      swap   cl   -wi-ao---- 1000.00m                                                    
      textlv myvg -wi-a-----    5.00g                                                    
    [root@localhost ~]# lvdisplay 
      --- Logical volume ---
      LV Path                /dev/cl/swap
      LV Name                swap
      VG Name                cl
      LV UUID                Y06H4S-vcF7-GIAf-AV1U-0TlK-yR39-FiR7bD
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2019-12-08 20:41:35 +0800
      LV Status              available
      # open                 2
      LV Size                1000.00 MiB
      Current LE             250
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:1
       
      --- Logical volume ---
      LV Path                /dev/cl/root
      LV Name                root
      VG Name                cl
      LV UUID                L9AAAm-gjjC-dF5S-fOyd-XOTG-fxBC-CI0j2Y
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2019-12-08 20:41:36 +0800
      LV Status              available
      # open                 1
      LV Size                18.73 GiB
      Current LE             4794
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:0
       
      --- Logical volume ---
      LV Path                /dev/myvg/textlv
      LV Name                textlv
      VG Name                myvg
      LV UUID                LhE6yQ-t3cn-BmwW-css0-dvua-CvCO-pSf2pe
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2019-12-26 21:41:01 +0800
      LV Status              available
      # open                 0
      LV Size                5.00 GiB
      Current LE             1280
      Segments               2
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:2
       

    创建文件系统

    逻辑卷textlv创建好之后,就可以在上面创建文件系统,以ext3文件系统为例,应该注意的是逻辑卷的引用需要逻辑卷的设备文件,逻辑卷的设备文件有两种书写方式

    /dev/VG_NAME/LV_NAME

    /dev/mapper/VG_NAME-LV_NAME

    以我们做的为例逻辑卷的设备文件为

    /dev/myvg/textlv或者是/dev/mapper/myvg-textlv

    [root@localhost ~]# mkfs -t ext4 /dev/myvg/textlv 
    mke2fs 1.42.9 (28-Dec-2013)
    文件系统标签=
    OS type: Linux
    块大小=4096 (log=2)
    分块大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    327680 inodes, 1310720 blocks
    65536 blocks (5.00%) reserved for the super user
    第一个数据块=0
    Maximum filesystem blocks=1342177280
    40 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376, 294912, 819200, 884736
    
    Allocating group tables: 完成                            
    正在写入inode表: 完成                            
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成 

    挂载

    将创建好的文件系统/dev/myvg/textlv挂载到/mnt上,若实现以后服务器重启自动挂载,需要将创建好的文件系统挂载到配置文件/etc/fstab里面

    [root@localhost ~]# mount /dev/myvg/textlv /mnt
    [root@localhost ~]# mount |tail -1
    /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
    [root@localhost ~]# vi /etc/fstab 
    
    #
    # /etc/fstab
    # Created by anaconda on Sun Dec  8 20:41:38 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/cl-root     /                       xfs     defaults        0 0
    UUID=d6e819c3-6d45-4b79-8179-746c005bf567 /boot                   xfs     defaults        0 0
    /dev/mapper/cl-swap     swap                    swap    defaults        0 0
    /dev/myvg/textlv        /mnt                    ext4    defaults        0 0

    为了查看/etc/fstab/是否正确,可以先卸载逻辑卷textlv,然后使用mount –a是内核重新读取/etc/fstab,看是否能够自动挂载

    [root@localhost ~]# umount /dev/myvg/textlv 
    [root@localhost ~]# mount -a
    [root@localhost ~]# mount |tail -1
    /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    hbase伪分布式安装
    按照《权威指南》的例子求最低温度并且修改默认调度器为FairScheduler
    利用hadoop1.x集群进行探索性实验(四)~(五)【重复格式化NN后,DN不能启动】【控制namenode检查点发生的频率】
    利用hadoop1.x集群进行探索性实验(三)【修改HDFS块大小】
    利用hadoop1.x集群进行探索性实验(二)【模拟namenode崩溃,通过secondary namenode恢复namenode】
    利用hadoop1.x集群进行探索性实验(一)【对WEB监控界面增加安全机制】
    本地编译64位hadoop并进行部署。
    hadoop完全分布式安装
    storm集群和zookeeper集群的部署过程
    查看电脑连接过的wifi密码
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12104720.html
Copyright © 2011-2022 走看看