前言 每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估 计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。 虽然有很多动态调整磁盘的工具可以使用,例如PartitionMagic等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要 重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的,而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解 决问题。 因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,LogicalVolumeManager)机制就是一个完美的解决方案。


基本术语 物理卷(Physical Volume,PV) 指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。 卷组(Volume Group,VG) 类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。 逻辑卷(Logical Volume,LV) 类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。


物理块(Physical Extent,PE) 每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。 逻辑块(Logical Extent,LE) 逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。


图所示LVM抽象模型,展示了PV、VG、LV三者之间关系:

和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中。VGDA包括以下内容:PV描述符、VG描述符、LV描述符、和一些PE描述符。 系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。


安装 首先确认系统有没有安装lvm工具和parted工具 [root@localhost ~]# rpm -qa |grep lvm lvm2-libs-2.02.100-8.el6.x86_64 lvm2-2.02.100-8.el6.x86_64 [root@localhost ~]# rpm -qa |grep parted parted-2.1-29.el6.x86_64


1、准备一块磁盘,通过parted命令进行分区 [root@localhost ~]# lsblk //这里查看到有一块5G的sdb空盘 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom
sda 8:0 0 10G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 9.5G 0 part ├─VolGroup-lv_root (dm-0) 253:0 0 8.5G 0 lvm / └─VolGroup-lv_swap (dm-1) 253:1 0 1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk


为磁盘创建lvm卷组: [root@localhost ~]# parted /dev/sdb GNU Parted 2.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print //打印分区表,没创建分区表输入此命令会报错
Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table:** msdos**

Number Start End Size Type File system Flags

(parted) mktable //划分新分区表 New disk label type? gpt //输入类型GPT
Warning: The existing disk label on /dev/sdb will be destroyed and all data on //提示销毁sdb磁盘现有标签和所有数据 this disk will be lost. Do you want to continue? Yes/No? yes //选择yes
(parted) p //在查看
Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt

Number Start End Size File system Name Flags (parted) mkpart //划分分区 Partition name? []? primary //主分区名字随意起 File system type? [ext2]? ext4 //类型ext4
Start? 0 //分区起始0
End? 2048 //结束2048
Warning: The resulting partition is not properly aligned for best performance. Ignore/Cancel? Ignore
(parted) p //查看
Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt

Number Start End Size File system Name Flags 1 17.4kB 2048MB 2048MB primary

(parted) set //修改分区标签
Partition number? 1 //输入编号
Flag to Invert? lvm //标签lvm
New state? [on]/off? on //应用
(parted) p Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt

Number Start End Size File system Name Flags 1 17.4kB 2048MB 2048MB primary lvm

(parted) #mkswap /dev/myvg/lvbox //可以将逻辑卷格式化swap分区 #swapon /dev/myvg/lvbox //执行使用 #swapoff /dev/myvg/lvbox //停止应用


2、创建lvm逻辑卷 首先查看一下刚才划分的LVM卷组 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom
sda 8:0 0 10G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 9.5G 0 part ├─VolGroup-lv_root (dm-0) 253:0 0 8.5G 0 lvm / └─VolGroup-lv_swap (dm-1) 253:1 0 1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 1.9G 0 part


[root@localhost ~]# pvcreate /dev/sdb1 //创建物理卷 Physical volume "/dev/sdb1" successfully created [root@localhost ~]# vgcreate vg01 /dev/sdb1 //创建卷组 Volume group "vg01" successfully created [root@localhost ~]# lvcreate -L 1024M -n lv01 vg01 //创建逻辑卷为1G Logical volume "lv01" created


[root@localhost ~]# lvscan //扫描逻辑卷,如下已看到创建成功 ACTIVE '/dev/vg01/lv01' [1.00 GiB] inherit ACTIVE '/dev/VolGroup/lv_root' [8.51 GiB] inherit ACTIVE '/dev/VolGroup/lv_swap' [1.00 GiB] inherit


[root@localhost ~]# lsblk //查看磁盘 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom
sda 8:0 0 10G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 9.5G 0 part ├─VolGroup-lv_root (dm-0) 253:0 0 8.5G 0 lvm / └─VolGroup-lv_swap (dm-1) 253:1 0 1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 1.9G 0 part **└─vg01-lv01 (dm-2) 253:2 0 1G 0 lvm **


[root@localhost ~]# mkfs.ext4 /dev/vg01/lv01 //格式化lv01逻辑卷 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 65536 inodes, 262144 blocks 13107 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=268435456 8 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.


[root@localhost ~]# mount /dev/vg01/lv01 /mnt/ [root@localhost ~]# cat /etc/fstabl //开机自动挂载 /dev/vg01/lv01 /mnt ext4 defaults,acl 0 0 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 8.4G 1.4G 6.7G 17% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 485M 33M 427M 8% /boot /dev/mapper/vg01-lv01 1008M 34M 924M 4% /mnt


3、扩展逻辑卷 [root@localhost ~]# lvextend -L +512M /dev/vg01/lv01 //扩展512M空间给lv01 Extending logical volume lv01 to 1.50 GiB Logical volume lv01 successfully resized


[root@localhost ~]# resize2fs /dev/vg01/lv01 //加载扩展逻辑卷组 resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/vg01/lv01 is mounted on /mnt; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/vg01/lv01 to 393216 (4k) blocks. The filesystem on /dev/vg01/lv01 is now 393216 blocks long.


[root@localhost ~]# partx -a /dev/sdb1 //刷新新建的分区,提前取消挂载 last arg is not the whole disk call: partx -opts device wholedisk


[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 8.4G 1.4G 6.7G 17% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 485M 33M 427M 8% /boot /dev/mapper/vg01-lv01 1.5G 34M 1.4G 3% /mnt


4、缩减逻辑卷 缩减前先取消挂载 [root@localhost ~]# resize2fs /dev/vg01/lv01 1G //缩减为1G resize2fs 1.41.12 (17-May-2010) Please run 'e2fsck -f /dev/vg01/lv01' first. //会提示你输入此命令进行检测

[root@localhost ~]# e2fsck -f /dev/vg01/lv01 //检测如下没有报错信息,接下来可以进行缩减了 e2fsck 1.41.12 (17-May-2010) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/vg01/lv01: 11/382016 files (0.0% non-contiguous), 59184/1536000 blocks


[root@localhost ~]# lvreduce -L 1G /dev/vg01/lv01 //执行缩减成功 WARNING: Reducing active logical volume to 1.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv01? [y/n]: y Reducing logical volume lv01 to 1.00 GiB Logical volume lv01 successfully resized


**LVM:缺点没有容错功能,卷组或逻辑卷坏了数据就读不出来优点提高了磁盘整合性,和动态的伸缩功能。**