LVM指的是什么?有什么用?如何设置LVM等等。。。本着学习的目的,那么我们就这些问题来研究下到底什么是LVM,以及LVM的一系列的使用。

一、LVM是什么?


LVM(Logical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统大小。此外,LVM的快照功能可以帮助我们快速 备份数据。LVM为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。作用是使用纯软件的形式来组织一个或多个底层硬解设备组织成一个抽象的逻辑设备来使用的解决方案。当然我们这里说的可能都是逻辑概念,无法理解。Physical volume (PV)、Volume group (VG)、Logical volume(LV)、 Physical extent (PE),下面我们用一个简单的图来说明下物理卷、卷组、逻辑卷他们之间的关系(此图只是个人理解,仅供参考)
Linux学习之LVM文件系统_如何
如上图所示简而言之:  
逻辑卷的创建,就是将多块硬盘创建物理卷,而将这些物理卷以逻辑的形式总成一个容器,然后从这个容器里面创建大小不同的分区文件,而这个容器就是所谓的逻辑卷,而从这个容器里创建大小不同的分区文件,这个分区文件就叫做逻辑卷。我是这么理解的,不知道有没有问题。

二、一些概念的理解


    PE:Physical Ex
        LVM默认使用4MB的PE块,他是整个LVM最小的存储单元,也就是说,我们的文件数据都是由写入PE来处理的。简单的说,这个PE就是有点像文件系统里面的block大小。不过在LVM中把它叫做PE,在上图中我并没有标示出来,它是存储在PV中的块。

    PV:Physical Volume 物理卷
        物理卷是LVM的最底层概念,是LVM的逻辑存储块,物理卷与磁盘分区是逻辑的对应关系。LVM提供了命令工具可以将分区转换为物理卷,通过组合物理卷可以生成卷组。

    VG:Volume Group 卷组
        卷组是LVM逻辑概念上的磁盘设备,通过将单个或多个物理卷组合成后生成卷组。卷组的大小取决于物理卷的容量以及个数。

    LV:Logical Volume 逻辑卷
        逻辑卷就是LVM逻辑意义上的分区,我们可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用。

三、和LVM文件系统想关的一些使用命令的解释

     上面我们已经了解了PE、PV、VG、LV的一些关系和基本概念,下面我们来说下常用的一些命令及其所表示的意义,我这边只说下常用的:

PV常用命令:
pvcreate:   创建一个PV物理卷

pvchange: 修改PV的属性

pvresize  :  调整一个PV的大小

pvremove : 删除一个PV

pvs             显示PV的简要信息

pvdisplay:  显示PV的属性信息


VG常用的命令:

                       vgcreate: 创建卷组

                                常用选项:

                                                 -s:设置卷组PE大小,默认为4M

                        vgremove : 删除VG

                        vgextend:扩展VG大小

                        vgruduce:缩减VG大小

vgs          :显示VG的简要信息

vgdisplay:  显示VG的属性信息


LV常用命令:

                       lvcreate:创建LV

                                  常用选项:

                                            -L:设置LV大小

                                            -n:指定LV名字

                       lvremove:删除LV

                       lvextend:扩展LV大小

                       lvruduce:缩减LV大小

                       lvs          :显示LV的简要信息

                       lvdisplay:显示LV的属性信息



四、上面我们只是说了一些关于关于LVM的基本命令,下面我们将尝试创建一个LVM:


       如图我们使用cfdisk命令创建在sdb磁盘上面创建了三个分区,当然我们这边需要把分区的格式类型改成LinuxLVM的类型才可以,在之前的文章中我已经提到过分区类型的更改,这边就不做演示了。

Linux学习之LVM文件系统_用户_02

个人觉得cfdisk比fdisk命令好用所以就提下cfdisk O(∩_∩)O~

使用命令cfdisk -l 查看磁盘有没有分好:

[root@localhost ~]# fdisk -l

 

Disk /dev/sda: 128.8 GB, 128849018880 bytes

255 heads, 63 sectors/track, 15665 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00073570

 

Device Boot Start End Blocks Id System

/dev/sda1 * 1 26 204800 83 Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2 26 7859 62914560 8e Linux LVM

 

Disk /dev/sdb: 107.4 GB, 107374182400 bytes

255 heads, 63 sectors/track, 13054 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

 

Device Boot Start End Blocks Id System

/dev/sdb1 1 1245 10000431 8e Linux LVM <<=============这样我们的3个Linux LVM类型的分区就创建好了

/dev/sdb2 1246 2490 10000462+ 8e Linux LVM

/dev/sdb3 2491 3735 10000462+ 8e Linux LVM

1、下面我们就需要对刚创建的分区创建成pv

[root@localhost ~]# pv <<=============我们在命令行模式下输入pv,然后点击2下TAB键,就可以看到很多关于pv的命令,当然

pvchange pvcreate pvmove pvresize pvscan 上面所介绍的只是常用的命令而已

pvck pvdisplay pvremove pvs pv.sh

[root@localhost ~]# pvcreate /dev/sdb1 <<=============创建分区sdb1为pv

Physical volume "/dev/sdb1" successfully created

[root@localhost ~]# pvdisplay /dev/sdb1 <<=============查看刚创建pv的属性信息

"/dev/sdb1" is a new physical volume of "9.54 GiB"

--- NEW Physical volume ---

PV Name /dev/sdb1

VG Name

PV Size 9.54 GiB

Allocatable NO

PE Size 0

Total PE 0

Free PE 0

Allocated PE 0

PV UUID fqjlqY-0cEX-F2Pm-l2iN-S26j-TU8r-YRw21Q

[root@localhost ~]#

如上我们可以把sdb2和sdb3都创建成pv

2、创建vg

[root@localhost ~]# vgcreate -s 16m myvg /dev/sdb{1,2} <<=============将分区sdb1和sdb2创建为一个vg设置其块大小为16M 名称为myvg

Physical volume "/dev/sdb2" successfully created

Volume group "myvg" successfully created

[root@localhost ~]# vgdisplay <<==============查看vg信息

--- Volume group ---

VG Name myvg <<=============vg名称

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 19.06 GiB <<=============vg大小

PE Size 16.00 MiB <<=============块大小

Total PE 1220

Alloc PE / Size 0 / 0

Free PE / Size 1220 / 19.06 GiB

VG UUID AOgwbS-fZJ7-dmr2-CgYd-rVpr-m1PB-ZjAzyF

如上所示myvg就创建好了。如果我们需要把myvg的大小扩大,可以使用命令vgextent

[root@localhost ~]# vgextend myvg /dev/sdb3 <<=============将刚才我们创建的另外一个sdb3分区加到myvg中去

Physical volume "/dev/sdb3" successfully created

Volume group "myvg" successfully extended

[root@localhost ~]# vgdisplay myvg <<=============查看myvg的属性

--- Volume group ---

VG Name myvg

System ID

Format lvm2

Metadata Areas 3

Metadata Sequence No 2

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 28.59 GiB <<============= myvg的大小增加了

PE Size 16.00 MiB

Total PE 1830

Alloc PE / Size 0 / 0

Free PE / Size 1830 / 28.59 GiB

VG UUID AOgwbS-fZJ7-dmr2-CgYd-rVpr-m1PB-ZjAzyF

如上所示,缩小和扩大的方式类似,这边就不在做演示了。

3、创建lv

[root@localhost ~]# lvcreate -L +10G -n mylv myvg <<=============创建lv指明大小我10G名称为mylv的逻辑卷,卷组为myvg

Logical volume "mylv" created

[root@localhost ~]# lvdisplay <<============= 查看mylv的属性

--- Logical volume ---

LV Path /dev/myvg/mylv <<============= 逻辑卷mylv的路径

LV Name mylv <<============= 逻辑卷的名称

VG Name myvg <<============= 基于myvg卷组

LV UUID Oy1LMH-MqmN-pGfJ-Byfn-hVlW-lJZs-m7eXll

LV Write Access read/write

LV Creation host, time localhost, 2015-08-28 09:49:55 +0800

LV Status available

# open 0

LV Size 10.00 GiB <<============= 大小为10G

Current LE 640

Segments 2

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 253:4

4、挂载和使用逻辑卷

按照上面的步骤我们的逻辑卷就创建好了,下面演示下如何去挂载和使用逻辑卷,首先我们要先对创建的逻辑卷创建文件系统。

[root@localhost ~]# mke2fs -t ext4 /dev/mapper/myvg-mylv <<============= 创建mylv的文件系统为ext4

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 blocks

655360 inodes, 2621440 blocks

131072 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2684354560

80 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, 1605632

 

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 34 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@localhost ~]#

文件系统创建好了,接下来就是挂载和使用了。

[root@localhost ~]# mount /dev/mapper/myvg-mylv /mnt <<============= 将mylv挂载到mnt目录下

[root@localhost ~]# cd /mnt

[root@localhost mnt]# ll <<============= 查看mnt目录下的文件

drwx------ 2 root root 16384 Aug 28 10:00 lost+found

[root@localhost mnt]# df -h <<============= 查看现系统中所有的挂载设备,我们刚才挂载的mylvy已经显示了

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg0-root 20G 287M 19G 2% /

tmpfs 238M 0 238M 0% /dev/shm

/dev/sda1 190M 28M 153M 16% /boot

/dev/mapper/vg0-usr 9.8G 1.9G 7.4G 21% /usr

/dev/mapper/vg0-var 20G 196M 19G 2% /var

/dev/mapper/myvg-mylv

9.8G 23M 9.2G 1% /mnt

[root@localhost mnt]#

注:当然我们这边只是临时的挂载好了可以使用,但是当我们重新启动机器的时候挂载就会消失了。如果我们要想使挂载不会消失,需要编辑/etc/fstab这个文件,在之前的磁盘中我已经提到过了,所以这边回不在演示了。

这样我们就成功的创建了我们的逻辑卷!可是随着业务的增加!mnt目录不够用了,我们就可以扩展mylv的大小,可在线扩展。

[root@localhost ~]# lvextend -L +2G -n /dev/mapper/myvg-mylv <<============= 将mylv扩大2G

Size of logical volume myvg/mylv changed from 10.00 GiB (640 extents) to 12.00 GiB (768 extents).

Logical volume mylv successfully resized

[root@localhost ~]# df -h <<============= 查看mylv的大小

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg0-root 20G 287M 19G 2% /

tmpfs 238M 0 238M 0% /dev/shm

/dev/sda1 190M 28M 153M 16% /boot

/dev/mapper/vg0-usr 9.8G 1.9G 7.4G 21% /usr

/dev/mapper/vg0-var 20G 196M 19G 2% /var

/dev/mapper/myvg-mylv

9.8G 23M 9.2G 1% /mnt <<============= 所示这边mulv的空间并没有扩大

[root@localhost ~]# resize2fs /dev/mapper/myvg-mylv <========扩展逻辑边界 (注:只对ext文件系统使用。这里也可以指定扩展逻辑边界大小,默认物理边界大小)

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/mapper/myvg-mylv is mounted on /mnt; on-line resizing required                    

old desc_blocks = 1, new_desc_blocks = 1

Performing an on-line resize of /dev/mapper/myvg-mylv to 3145728 (4k) blocks.

The filesystem on /dev/mapper/myvg-mylv is now 3145728 blocks long.

[root@localhost ~]# df -h <<============= 再次查看mylv这时空间就变大成了12G了

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg0-root 20G 287M 19G 2% /

tmpfs 238M 0 238M 0% /dev/shm

/dev/sda1 190M 28M 153M 16% /boot

/dev/mapper/vg0-usr 9.8G 1.9G 7.4G 21% /usr

/dev/mapper/vg0-var 20G 196M 19G 2% /var

/dev/mapper/myvg-mylv

12G 25M 12G 1% /mnt

注:主要我们扩大空间的时候-L后面跟的选项+2 和2的性质是不一样的,+2表示把在原有的基础上增加2G,2G则表示在将原有的空间扩展到2G。

上面说了扩展这边我们来说下缩减,不过缩减我们我们要按照以下的步骤下:
缩减的顺序应该与创建时的顺序相反,也就是卸载文件系统、删除逻辑卷、删除卷组、删除物理卷。缩减很危险,不到万不得已千万别缩减。缩减需离线。
缩减步骤:
(1)、先确定缩减后的目标大小;并确保对应的每一步逻辑卷大小中有足够的空间可容纳原有所有数据;
(2)、先制裁文件系统,并要执行强制检测
(3)、缩减逻辑边界
(4)、缩减物理边界

事列如下:

[root@localhost ~]# umount /mnt/ <<=========首先要先卸载mylv的挂载(注:卸载挂载的时候我们可以指定挂载的文件路径,也可以指定挂载文件系统的目录)

[root@localhost ~]# e2fsck -f /dev/mapper/myvg-mylv <<============= 强行对myvg-mylv检测

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/mapper/myvg-mylv: 11/786432 files (0.0% non-contiguous), 88528/3145728 blocks

[root@localhost ~]# resize2fs /dev/mapper/myvg-mylv 5G <<============= 将myvg-mylv逻辑边界缩减至5G

resize2fs 1.41.12 (17-May-2010)

Resizing the filesystem on /dev/mapper/myvg-mylv to 1310720 (4k) blocks.

The filesystem on /dev/mapper/myvg-mylv is now 1310720 blocks long.


[root@localhost ~]# lvreduce -L 5G /dev/mapper/myvg-mylv <<============= 将myvg-mylv物理边界缩减至5G

WARNING: Reducing active logical volume to 5.00 GiB

THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce mylv? [y/n]: y <<============= 确认

Size of logical volume myvg/mylv changed from 12.00 GiB (768 extents) to 5.00 GiB (320 extents).

Logical volume mylv successfully resized

[root@localhost ~]# mount /dev/mapper/myvg-mylv /mnt/ <<============= 从新挂载

[root@localhost ~]# df -h <<============= 显示现在的挂载空间

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg0-root 20G 287M 19G 2% /

tmpfs 238M 0 238M 0% /dev/shm

/dev/sda1 190M 28M 153M 16% /boot

/dev/mapper/vg0-usr 9.8G 1.9G 7.4G 21% /usr

/dev/mapper/vg0-var 20G 196M 19G 2% /var

/dev/mapper/myvg-mylv

4.8G 20M 4.6G 1% /mnt <<============= 大小就变成了4.8G(注:这里显示的大小和实际的大小是有差距的)

如上我们对LVM的的实验基本上就完成的差不多了,也掌握了LVM的创建,挂载和使用。当然LVM还有一个重要的属性我们没有说到,那就是可以对我们所创的逻辑卷做快照卷。

5、创建快照卷

            这里我们要使用的命令是lvcreate -s命令。当然它也可以与之前我们提到的一些参数一起使用。

[root@localhost ~]# lvcreate -L 2G -n mylv-snap -s /dev/mapper/myvg-mylv <<============= 对myvg-myvl创建一个大小为2G名称为mylv-snap的快照

Logical volume "mylv-snap" created

[root@localhost ~]# mkdir /snap <<============= 创建目录snap

[root@localhost ~]# mount /dev/myvg/mylv-snap /snap/ <<============= 将mylv-snap挂载到snap目录下

[root@localhost ~]# df <<============= 查看挂载是否完成,我们的一个快照就创建好了

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/vg0-root 20511356 296960 19165820 2% /

tmpfs 243112 0 243112 0% /dev/shm

/dev/sda1 194241 27917 156084 16% /boot

/dev/mapper/vg0-usr 10190136 2017768 7648080 21% /usr

/dev/mapper/vg0-var 20511356 287984 19174796 2% /var

/dev/sr0 4523182 4523182 0 100% /media

/dev/mapper/myvg-mylv

5029504 20472 4746900 1% /mnt

/dev/mapper/myvg-mylv--snap

5029504 20472 4746900 1% /snap

注:快照的大小会随着我们文件的变化而变化,建议不要保留时间太长,因为我们给它分配的空间有限。如果要长时间保留建议快照的在创建的时候分配的空间大点

如何移除快照。

[root@localhost ~]# umount /snap/ <<============= 卸载挂载

[root@localhost ~]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/vg0-root 20511356 296960 19165820 2% /

tmpfs 243112 0 243112 0% /dev/shm

/dev/sda1 194241 27917 156084 16% /boot

/dev/mapper/vg0-usr 10190136 2017768 7648080 21% /usr

/dev/mapper/vg0-var 20511356 287988 19174792 2% /var

/dev/sr0 4523182 4523182 0 100% /media

/dev/mapper/myvg-mylv

5029504 20472 4746900 1% /mnt

[root@localhost ~]# lvremove /dev/myvg/mylv-snap <<=============删除快照

Do you really want to remove active logical volume mylv-snap? [y/n]: y <<============= 选择yes这样我们的快照就被移除了

Logical volume "mylv-snap" successfully removed

[root@localhost ~]#

五、小结


       关于LVM逻辑卷的命令和使用方法还有很多没有说到,以上提到的一些命令和用法都是本人学习的总结,只做参考而用,如有错误还请指出。谢谢!