首页 > 代码库 > Linux磁盘管理之LVM

Linux磁盘管理之LVM

    我想每个人在初次安装Linux系统都遇到过的情况,在当初规划磁盘空间的时候给/home 或者 / 分配很小的磁盘空间,等使用一段时间就发现,df 查看的时候磁盘的使用率已经超过80%以上了。现在你该怎么办呢? 可能再加一块磁盘,然后重新分割、格式化、挂载 ,复制文件到新分区,挂载在卸载! 整个过程太过繁琐。而且,若是第二次分割又不尽如意难道又要重新讲上述流程在来一遍吗?尤其是复制文件,非常的耗费文件哦。有别的办法吗? 有,就是LVM(Logical Volume Manager)


    LVM(Logical Volume Manager,逻辑卷管理)的实现是利用Linux的device-mapper模块来实现存储系统的虚拟化(系统分区独立于底层硬件)。通过lvm,你可以将现实的存储空间抽象化并在上面建立虚拟分区来以简化的方式进行磁盘的扩大和收缩分区操作,弹性的管理磁盘容量。


    LVM由物理卷(Physical Volume (PV))、卷组(Volume Group(VG))、逻辑卷(Logic Volume(LV))和物理区域(Physical extent(PE)等四个主要部分组成。


    物理卷:是指硬盘分区或逻辑卷上与磁盘分区具有同样功能的设备,也是lvm基本存储逻辑块。物理卷包括一个特殊的header,其余部分被切割成一块一块物理区域


    卷组:由一组的物理卷组成的一个大的管理单元,可以在卷组上创建一个或多个逻辑卷。


    逻辑卷:虚拟分区,类似于磁盘分区,可以创建文件系统,并挂载使用。

    

    物理区域:硬盘可供指派给逻辑卷的最小单位 类似于文件系统的block,默认大小为4M。


        它们的关系如图所示:

          技术分享


        将物理磁盘格式化成物理卷PV(Physical Volume),格式物理卷的过程中就将底层的硬盘划分为一个一个的物理扩展PE(Physical Extend),默认大小为4M,就可以创建卷组VG(Volume Group),卷组就是抽象化的空间池,它由一个或多个的PV组成。通常在创建的时候还要给它取一个名字。最后就是基于VG上创建逻辑卷LV(Logical Volume)。创建完成后就可以在LV上进行文件系统格式并挂载使用。


实现lvm的流程。

1. 先准备一快磁盘,用fdisk进行分区,做成lvm的分区格式。并partprobe重读分区表!!

2. 创建PV

        与PV相关的命令有:pvscan、pvdisplay、pvs、pvremove、pvmove、pvcreate

            pvcreate:将实体partition创建为PV

            pvscan:扫描系统内的PV磁盘

            pvdisplay:显示PV磁盘的详细信息

3、创建VG

        与VG相关的命令,vgcreate、vgscan、vgdisplay、vgreduce、vgextend、vgremove

            vgcreate:创建VG卷组

                语法为:vgcreate option VolumeGroupName device..device

                    常用的选项为 -s :指定PE大小,默认为4M

            ex:vgcreate -s 8M myvg /dev/sdb1 /dev/sdb2 


            vgreduce:移除VG中的PV,当VG中有多个PE

                语法: vgreduce option VolumenGroupName device..

            ex: vgreduce myvgdisk /dev/sdb3 :删除vg卷中的/dev/sdb3物理卷


            vgextend:扩展VG大小

                语法:vgextend:扩展VG大小,用法同vgreduce

            ex: vgextend myvgdisk /dev/sdb3  #把/dev/sdb3物理卷添加到myvgdisk卷组中


            vgdispaly、vgscan:扫描显示

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

            vgremove:删除VG        

                语法:vgremove option VolumeGroupName...

4、创建LV

        与LV相关的命令:lvscan、lvdisplay、lvremove、lvextend、lvcreate、lvresize、lvreduce

            lvcreate:创建逻辑卷

                语法:lvcreate option VolumeLogicalName VolumenGroupName

                    常用选项: -l:指定卷大小,PE数  -L指定卷大小,{k|M|G}  -n 逻辑卷名

                ex: lvcreate -L 10G mylvname myvgdisk

        

            lvresieze:LV卷的容量大小调整,调整完成后要使用resize2fs命令重读磁盘

                语法:lvresize option volumeLogicalNamePath

                        常用选项:-l/-L  [-|+] 调整大小时候注意,不加+/-时为指定为卷大小,-/+为在原有的size中更改多少

                

                ex: lvresize -L -1G /dev/vgtest/lvtest

                ex: resize2fs /dev/vgtest/lvtest 

                ex: xfs-grows /dev/vgtest/lvtest 可以重读正在使用的磁盘大小!!        

    

5、完成之后使用会生成一个/dev/VGname/LVname的设备文件路径,挂载使用杰克        

 

实验环境:VMware下的CentOS 7.2 

        有一个小技巧,当你在虚拟机中添加一块硬盘时,可以使用echo " - - -" > /sys/class/scsi_host/host{0,1,2}/scan 命令来扫描你的磁盘。

[root@localhost Packages]# lsblk  #已添加新磁盘查看磁盘列表
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   200G  0 disk 
├─sda1   8:1    0   500M  0 part /boot
├─sda2   8:2    0     2G  0 part [SWAP]
├─sda3   8:3    0    50G  0 part /
├─sda4   8:4    0     1K  0 part 
└─sda5   8:5    0 147.5G  0 part /home
sr0     11:0    1   7.1G  0 rom  /media
[root@localhost Packages]# echo " - - -" > /sys/class/scsi_host/host0/scan  #扫描新加的磁盘
[root@localhost Packages]# lsblk  
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   200G  0 disk 
├─sda1   8:1    0   500M  0 part /boot
├─sda2   8:2    0     2G  0 part [SWAP]
├─sda3   8:3    0    50G  0 part /
├─sda4   8:4    0     1K  0 part 
└─sda5   8:5    0 147.5G  0 part /home
sdb      8:16   0    20G  0 disk 
sr0     11:0    1   7.1G  0 rom  /media

            

        

[root@localhost Packages]# fdisk /dev/sdb  #磁盘分去命令
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x26c1804c.
Command (m for help): h  #帮助信息
h: unknown command
Command action   #常用的有注释
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition   #删除分区
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition  #新增新区
   o   create a new empty DOS partition table
   p   print the partition table #列出分区表
   q   quit without saving changes #退出
   s   create a new empty Sun disklabel
   t   change a partition‘s system id #2个16进制,8e为lvm
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit #保存并退出
   x   extra functionality (experts only)
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free) #主分区
   e   extended  #扩展分区
Select (default p): p 
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G
Partition 1 of type Linux and of size 10 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition ‘Linux‘ to ‘Linux LVM‘
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x26c1804c
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   8e  Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost Packages]# fdisk -l /dev/sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x26c1804c
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   8e  Linux LVM




[root@localhost Packages]# pvcreate /dev/sdb1 #创建物理卷
  Physical volume "/dev/sdb1" successfully created 
[root@localhost Packages]# pvscan #显示物理卷
  PV /dev/sdb1         lvm2 [10.00 GiB]
  Total: 1 [10.00 GiB] / in use: 0 [0   ] / in no VG: 1 [10.00 GiB]
[root@localhost Packages]# pvdisplay  #详细显示
  "/dev/sdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               ojzo7g-BC7O-H3Xj-eDlo-ur83-QHbw-nLZ5K8
[root@localhost Packages]# vgcreate  testvg /dev/sdb1
  Volume group "testvg" successfully created
[root@localhost Packages]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "testvg" using metadata type lvm2
[root@localhost Packages]# vgdisplay 
  --- Volume group ---
  VG Name               testvg
  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               10.00 GiB
  PE Size               4.00 MiB
  Total PE              2559
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2559 / 10.00 GiB
  VG UUID               xqSpwz-1fPo-7FAh-0pyD-e2dK-RO4O-zxma0c
[root@localhost Packages]# lvcreate -l 2559 -n lvtest testvg 
  Logical volume "lvtest" created.
[root@localhost Packages]# 
[root@localhost Packages]# lvscan
  ACTIVE            ‘/dev/testvg/lvtest‘ [10.00 GiB] inherit
[root@localhost Packages]# lvdisplay  
  --- Logical volume ---
  LV Path                /dev/testvg/lvtest
  LV Name                lvtest
  VG Name                testvg
  LV UUID                bkh09J-hzzV-MQnT-sN41-Tub2-ImM3-6RPrhn
  LV Write Access        read/write
  LV Creation host, time localhost, 2017-04-03 16:08:30 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2559
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

   


本文出自 “琦世” 博客,请务必保留此出处http://nieqi.blog.51cto.com/10974793/1912702

Linux磁盘管理之LVM