您的位置:首页 > 其它

LVM详解

2015-07-24 15:17 288 查看
目录:
一、概述
二、LVM的相关概念
三、概念图
四、LVM基本操作
1.创建PV
2.查看PV信息
3.创建VG
4.查看VG信息
5.创建LV
6.查看LV信息
7.挂载LV
8.扩展卷组
9.缩减卷组
10.扩展逻辑卷
11.缩减逻辑卷
12.移除逻辑卷
13.移除卷组
14.移除物理卷
五、LVM快照实现
六、总结

—————————————————————————————————————————————————

一、概述

LVM全称是Logical Volume Manager,即逻辑卷管理器。它是Linux环境下对磁盘分区进行管理的一种机制;它可以将多个物理分区整合在一起,并且可以根据实际需要动态调整文件系统空间。另外,它还可以提供快照,快照在刚创建的时候,其内容是和原卷一模一样的,只有数据在原卷中发生变化的时候,快照会将被改动数据的原数据保存起来。

二、LVM的相关概念
1.物理卷(Physical Volume)
物理卷是组成LVM的最底层的元素,即Linux上的物理分区。
2.卷组(Volume Group)
将各个独立的PV组合起来形成的一个存储空间就称为VG,VG的大小就是整个LVM的大小。
3.逻辑卷(Logical Volume)
可以被用户格式化、挂载并提供数据存储的对象就是LV。
4.物理扩展块(Physical Extent)
PE相当于Linux分区中的block,它是LVM的最小存储单位,默认为4M。

三、概念图




四、LVM基本操作
1.创建PV
首先得先创建分区,并将分区的类型改为8e。在这里,我们可以按照以下方式分别创建/dev/sdb1、/dev/sdb2、/dev/sdc1、/dev/sdc2.
创建PV使用以下命令格式:
pvcreate device_name
例如: pvcreate /dev/sdb1
[root@localhost ~]# fdisk /dev/sdb

Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x05ff7b5d

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  8e  Linux LVM

[root@localhost ~]# pvcreate /dev/sdb{1,2} /dev/sdc{1,2}
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdc2" successfully created
2.查看PV信息
使用的命令:
(1)pvs 简要查看PV信息
(2)pvsdisplay 详细查看PV信息。
A.pvsdisplay 直接使用该命令,查看所有PV的信息。
B.pvsdisplay device_name 表示查看device_name这个PV的信息。
[root@localhost ~]# pvs
PV         VG   Fmt  Attr PSize PFree
/dev/sdb1       lvm2 ---  5.01g 5.01g
/dev/sdb2       lvm2 ---  5.01g 5.01g
/dev/sdc1       lvm2 ---  5.01g 5.01g
/dev/sdc2       lvm2 ---  5.01g 5.01g

[root@localhost ~]# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "5.01 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb1
VG Name
PV Size               5.01 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               rZsvZG-nMf0-To7I-3k2X-fzEL-jkvk-eNFd6h
3.创建VG
在有了PV之后,接下来我们要创建VG,创建VG使用以下命令:
vgcreate VG_NAME PV_NAME
-s PE:指定PE的大小
[root@localhost ~]# vgcreate testvg /dev/sd{b,c}1
Volume group "testvg" successfully created
4.查看VG信息
查看VG使用以下命令:
(1)vgs:简要查看VG信息。
(2)vgdisplay:详细查看VG信息。
A.vgdisplay: 直接使用该命令,查看所有VG的信息。
B.vgdisplay VG_NAME: 表示查看这个VG的信息。
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   2   0   0 wz--n- 10.02g 10.02g
[root@localhost ~]# vgdisplay testvg
--- Volume group ---
VG Name               testvg
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               10.02 GiB
PE Size               4.00 MiB
Total PE              2564
Alloc PE / Size       0 / 0
Free  PE / Size       2564 / 10.02 GiB
VG UUID               zmjsxc-4KPf-LEcC-96zL-BBDY-N0Cs-buSQ6n
5.创建LV

使用的命令:
lvcreate -L SIZE -n LV_NAME VG_NAME
-L 指定逻辑卷的大小
-n 指定逻辑卷的名称
-l PE的个数
[root@localhost ~]# lvcreate -L 5G -n mylv testvg
Logical volume "mylv" created
6.查看LV信息
查看LV使用以下命令:
(1)lvs: 简要查看LV信息
(2)lvdisplay 逻辑卷的设备文件名称: 详细查看LV信息
逻辑卷的设备文件名称路径:/dev/VG_NAME/LV_NAME 或者 /dev/mapper/VG_NAME-LV_NAME
[root@localhost ~]# lvs
LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
mylv testvg -wi-a----- 5.00g

[root@localhost ~]# ll /dev/testvg/mylv
lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/testvg/mylv -> ../dm-0

[root@localhost ~]# ll /dev/mapper/testvg-mylv
lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/mapper/testvg-mylv -> ../dm-0

[root@localhost ~]# lvdisplay /dev/testvg/mylv
--- Logical volume ---
LV Path                /dev/testvg/mylv
LV Name                mylv
VG Name                testvg
LV UUID                cgrPIG-Zavs-GH9Z-55sR-MtSt-SFzg-SVETpG
LV Write Access        read/write
LV Creation host, time localhost.localdomain, 2015-07-24 01:19:20 +0800
LV Status              available
# open                 0
LV Size                5.00 GiB
Current LE             1280
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           253:0
7.挂载LV
在挂载LV之前,我们要对LV进行格式化后再挂载,然后存放文件看是否正常。
# 格式化LV
[root@localhost ~]# mke2fs -t ext4 /dev/testvg/mylv
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
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=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

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

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# 挂载LV
[root@localhost ~]# mount /dev/testvg/mylv /mnt
# 查看挂载的分区信息
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
5.0G  138M  4.6G   3% /mnt
# 测试存放文件
[root@localhost ~]# cp /etc/inittab /mnt/
[root@localhost mnt]# tail -4 /mnt/inittab
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
8.扩展卷组
步骤:
(1)准备好一个PV
(2)使用vgextend命令完成扩展,命令格式:vgextend VG_NAME /PATH/TO/PV
#查看使用和未使用的PV,其中/dev/sdb2和/dev/sdc2都还未使用
[root@localhost ~]# pvs
PV         VG     Fmt  Attr PSize PFree
/dev/sdb1  testvg lvm2 a--  5.01g 8.00m
/dev/sdb2         lvm2 ---  5.01g 5.01g
/dev/sdc1  testvg lvm2 a--  5.01g 5.01g
/dev/sdc2         lvm2 ---  5.01g 5.01g
#未扩展前的VG大小
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   2   1   0 wz--n- 10.02g 5.02g
#扩展VG
[root@localhost ~]# vgextend testvg /dev/sdb2
Volume group "testvg" successfully extended
#扩展后的VG大小
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   3   1   0 wz--n- 15.02g 10.02g
9.缩减卷组
步骤:
(1)确定要移除的PV
(2)将此PV上的数据转移至其他的PV
命令:pvmove PV_NAME
(3)从卷组中将此PV移除
命令:vgreduce /PATH/TO/PV
# 查看已经使用在卷组中的PV
[root@localhost ~]# pvs
PV         VG     Fmt  Attr PSize PFree
/dev/sdb1  testvg lvm2 a--  5.01g 8.00m
/dev/sdb2  testvg lvm2 a--  5.01g 5.01g
/dev/sdc1  testvg lvm2 a--  5.01g 5.01g
/dev/sdc2         lvm2 ---  5.01g 5.01g
# 现在确定要移除/dev/sdb1,在移除前需要将数据转移到其他PV
[root@localhost ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 100.0%
# 将PV从卷组中移除
[root@localhost ~]# vgreduce testvg /dev/sdb1
Removed "/dev/sdb1" from volume group "testvg"
# 查看移除后的VG大小
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   2   1   0 wz--n- 10.02g 5.02g
10.扩展逻辑卷
步骤:

(1)先确定扩展的LV大小,并确保对应卷组有足够的空间
(2)扩展物理边界
使用lvextend命令:lvextend -L [+]SIZE /PATH/TO/LV
参数说明:
-L [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE的容量;如果不带,表示扩展容量到SIZE,单位为"kKmMgGtT"
-l [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE个PE的容量;不带+号,表示扩展到SIZE个PE的容量
SIZE: 表示数字
(3)扩展逻辑边界
使用resize2fs /PATH/TO/DEVICE
# 确定VG的容量
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   2   1   0 wz--n- 10.02g 5.02g
# 未扩展前的LV容量
[root@localhost ~]# lvs
LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
mylv testvg -wi-ao---- 5.00g
# 扩展LV到8G,即物理边界
[root@localhost ~]# lvextend -L +3G /dev/testvg/mylv
Size of logical volume testvg/mylv changed from 5.00 GiB (1280 extents) to 8.00 GiB (2048 extents).
Logical volume mylv successfully resized
# 查看挂载的LV大小,发觉还是5G,因为还没扩展逻辑边界
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
5.0G  139M  4.6G   3% /mnt
# 扩展逻辑边界
[root@localhost ~]# resize2fs /dev/testvg/mylv
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/testvg/mylv is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/testvg/mylv to 2097152 (4k) blocks.
The filesystem on /dev/testvg/mylv is now 2097152 blocks long.
# 查看分区大小,文件系统大小也扩展了
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
7.9G  140M  7.4G   2% /mnt
11.缩减逻辑卷
步骤:
(1)确定缩减后的大小,至少确保缩减后能容纳原来的所有数据
(2)执行缩减:
A.因为缩减有风险,所以必须卸载并检测文件系统,使用e2fsck -f命令
B.缩减逻辑边界,使用resize2fs命令
resize2fs /path/to/device SIZE
C.缩减物理边界,使用lvreduce命令
lvreduce -L [-]SIZE /path/to/lv
# 卸载并强行检测
[root@localhost ~]# umount /mnt/
[root@localhost ~]# e2fsck -f /dev/testvg/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/testvg/mylv: 12/524288 files (0.0% non-contiguous), 68623/2097152 blocks
# 缩减LV至3G,即逻辑边界
[root@localhost ~]# resize2fs /dev/testvg/mylv 3G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/testvg/mylv to 786432 (4k) blocks.
The filesystem on /dev/testvg/mylv is now 786432 blocks long.
# 缩减物理边界
[root@localhost ~]# lvreduce -L 3G /dev/testvg/mylv
WARNING: Reducing active logical volume to 3.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y/n]: y
Size of logical volume testvg/mylv changed from 8.00 GiB (2048 extents) to 3.00 GiB (768 extents).
Logical volume mylv successfully resized
# 为确保安全,再次检测
[root@localhost ~]# e2fsck -f /dev/testvg/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/testvg/mylv: 12/196608 files (0.0% non-contiguous), 47100/786432 blocks
# 挂载,查看分区大小并查看分区里面的文件是否正常
[root@localhost ~]# mount /dev/testvg/mylv /mnt/
[root@localhost ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G  1.1G   17G   6% /
tmpfs                 242M     0  242M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
/dev/mapper/testvg-mylv
3.0G  136M  2.7G   5% /mnt
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# tail -4 /mnt/inittab
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
12.移除逻辑卷

移除逻辑卷之前,确保已经没有被挂载。此时使用lvremove /path/to/lv命令即可
# 查看逻辑卷
[root@localhost ~]# lvs
LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
hello_lv  testvg -wi-a-----  1.00g
mylv      testvg owi-aos---  3.00g
# 移除hello_lv
[root@localhost ~]# lvremove /dev/testvg/hello_lv
Do you really want to remove active logical volume hello_lv? [y/n]: y
Logical volume "hello_lv" successfully removed
# 再次查看逻辑卷信息
[root@localhost ~]# lvs
LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
mylv      testvg owi-aos---  3.00g
13.移除卷组
使用vgremove VG_NAME

# 查看卷组信息
[root@localhost ~]# vgs
VG     #PV #LV #SN Attr   VSize  VFree
testvg   2   0   0 wz--n- 10.02g 10.02g
# 移除testvg
[root@localhost ~]# vgremove testvg
Volume group "testvg" successfully removed
14.移除物理卷
使用pvremove PV_NAME命令
# 查看物理卷
[root@localhost ~]# pvs
PV         VG   Fmt  Attr PSize PFree
/dev/sdb2       lvm2 ---  5.01g 5.01g
/dev/sdc1       lvm2 ---  5.01g 5.01g
/dev/sdc2       lvm2 ---  5.01g 5.01g
# 移除物理卷
[root@localhost ~]# pvremove /dev/sdb2
Labels on physical volume "/dev/sdb2" successfully wiped
[root@localhost ~]# pvremove /dev/sdc1
Labels on physical volume "/dev/sdc1" successfully wiped
[root@localhost ~]# pvremove /dev/sdc2
Labels on physical volume "/dev/sdc2" successfully wiped


五、LVM快照实现
创建出来的快照卷是已经记录了原卷某个时刻所有文件的状态,在原卷没有做出修改之前,快照卷只是作为访问原卷的一个入口;一旦原卷中的文件发生改变的时候,系统会将原卷的文件复制一份到快照卷,这时的快照卷就不能作为访问原卷的入口了,快照卷里面只有原卷没有发生改变之前复制过来的文件。这时,我们就可以对快照卷里面的文件进行打包备份。
创建快照使用lvcreate命令,使用以下参数
-L SIZE: 指定快照卷的大小
-s: 表示创建快照卷
-p r: 限制快照卷为只读访问
-n LV_NAME: 指定快照卷的名称
示例:lvcreate -L SIZE -s -p r -n LV_NAME /path/to/lv
# 创建快照卷
[root@localhost mnt]# lvcreate -L 50M -s -p r -n mylv-snap /dev/testvg/mylv
Rounding up size to full physical extent 52.00 MiB
Logical volume "mylv-snap" created
[root@localhost mnt]# lvs
LV        VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
mylv      testvg owi-aos---  3.00g
mylv-snap testvg sri-a-s--- 52.00m      mylv   0.02
# 挂载快照卷
[root@localhost ~]# mount -o ro /dev/testvg/mylv-snap /media/
# 查看快照卷,此时的快照卷只是作为原卷的入口,所以内容和快照卷的是一样的
[root@localhost mnt]# cd /media/
[root@localhost media]# ls
inittab  lost+found
# 修改原卷的内容
[root@localhost mnt]# cp /etc/fstab /mnt/
[root@localhost mnt]# echo "Hello World" >> /mnt/inittab
# 查看快照卷及里面的内容,发现没有新增的文件fstab,而且inittab的文件内容是和创建快照时一样
[root@localhost ~]# cd /media/
[root@localhost media]# ls
inittab  lost+found
[root@localhost media]# tail -3 inittab
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
# 打包备份
[root@localhost media]# tar zcf /tmp/backup.tar.gz /media/inittab
tar: Removing leading `/' from member names
[root@localhost media]# ls /tmp/backup.tar.gz
/tmp/backup.tar.gz
# 卸载快照卷
[root@localhost ~]# umount /media/


六、总结
创建LV的过程:
创建PV --> 创建VG --> 创建LV --> 格式化 --> 挂载
扩展卷组的过程: 准备PV --> 完成扩展 缩减卷组的过程: 确定移除的PV --> 转移移除PV的数据到别的PV --> 从卷组中移除PV 扩展逻辑卷的过程:
确定扩展大小 --> 扩展物理边界 --> 扩展逻辑边界
缩减逻辑卷的过程:
确定缩减大小 --> 卸载逻辑卷 --> 缩减逻辑边界 --> 缩减物理边界

本文出自 “gzguitar” 博客,请务必保留此出处http://gzguitar.blog.51cto.com/5406286/1678026
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: