我想每个人在初次安装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 命令来扫描你的磁盘。
[[email protected] 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
[[email protected] Packages]# echo " - - -" > /sys/class/scsi_host/host0/scan #扫描新加的磁盘 [[email protected] 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
[[email protected] 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. [[email protected] 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
[[email protected] Packages]# pvcreate /dev/sdb1 #创建物理卷 Physical volume "/dev/sdb1" successfully created [[email protected] 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] [[email protected] 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 [[email protected] Packages]# vgcreate testvg /dev/sdb1 Volume group "testvg" successfully created [[email protected] Packages]# vgscan Reading all physical volumes. This may take a while... Found volume group "testvg" using metadata type lvm2 [[email protected] 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 [[email protected] Packages]# lvcreate -l 2559 -n lvtest testvg Logical volume "lvtest" created. [[email protected] Packages]# [[email protected] Packages]# lvscan ACTIVE ‘/dev/testvg/lvtest‘ [10.00 GiB] inherit [[email protected] 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