您的位置:首页 > 其它

lvm基本应用,扩展及缩减实现

2015-12-27 22:03 375 查看

lvm基本应用,扩展及缩减实现

lvm是什么?

LVM是LogicalVolumeManager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由HeinzMauelshagen在Linux2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版1.1.0-rc2,以及LVM2开发版。

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

在我们使用linux系统的过程中,有时会有这样的需求?某一目录如/home 目录在使用的过程当中由于用户众多,导致此目录越来越大,以至于不能满足存储需求,而另一些目录由于使用较少,而且在安装系统时错误的分配了大的分区,导致资源浪费,此时要怎么办呢?添加/删除硬盘,从新分区,格式化,将改变的目录的数据复制过来,然后将原本的分区卸载然后挂载新的分区嘛?当然不是,这时可以使用LVM来解决这些问题了。

LVM的重点在于可以弹性的调整文件系统的容量。LVM 可以整合多个物理分区或者磁盘在一起,让这些物理分区或者磁盘看起来就像是一个大磁盘(VG)一样!然后将这块大磁盘再经过分成可使用的分区(LV),最终就能挂载使用了。

PV、PE、VG、LV

上面我们提到LVM的重点在于可以弹性的调整文件系统的容量,那么LVM的这个特性是靠什么实现的呢?
这就需要了解PV、PE、VG、LV是什么了。

PV,物理卷

我们实际的分区需要调整系统标识符 (system ID) 成为 8e (LVM 的标识符) ,然后再经过pvcreate命令将他转成 LVM 最底层的实体滚动条 (PV) ,之后才能够将这些 PV 加以利用! 调整system ID 的方是就是透过 fdisk 的 t选项。

VG,卷用户组

所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西就是啦!所以 VG 就是 LVM 组合起来的磁
盘!这么想就好了。 那么这个大磁盘最大可以到多少容量呢?这与底下要说明的 PE 有关喔~因为每个
VG 最多仅能包含 65534 个 PE 而已。 如果使用 LVM 预设的参数,则一个 VG 最大可达 256GB 的容
量啊!(参考底下的 PE 说明) 。

PE,物理拓展块

LVM 预设使用 4MB 的 PE 区块,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此预设的 LVM VG
会有 4M*65534/(1024M/G)=256G。 这个 PE 很有趣喔!他是整个 LVM 最小的储存区块,也就是
说,其实我们的档案资料都是藉由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的
block 大小啦。 这样说应该就比较好理解了吧?所以调整 PE 会影响到 VG 的最大容量喔!

LV,逻辑卷

LV, 逻辑卷 最终的 VG 还会被切成 LV ,这个 LV 就是最后可以被格式化使用的类似分割槽的咚咚了!那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此LV 内的 PE 总数有关。 为了方便用户利用 LVM 来管理其系统,因此 LV 的装置文件名通常指定为/dev/vgname/lvname的样式!

此外,我们刚刚有谈到 LVM 可弹性的变更 filesystem 的容量,那是如何办到的?其实他就是透过交
换 PE 来进行数据转换, 将原本 LV 内的 PE 移转到其他装置中以降低 LV 容量,或将其他装置的 PE
加到此 LV 中以加大容量! VG、LV 与 PE 的关系有点像下图:


如上图所示,VG 内的 PE 会分给虚线部分的 LV ,如果未来这个 VG 要扩充的话,加上其他的 PV 即
可。 而最重要的 LV 如果要扩充的话,也是透过加入 VG 内没有使用到的 PE 来扩充的!

LVM的实现



NO.1 分区实现LVM的第一步自然是分区,假设我们有一块40G的分区,我们把它分成3个分区,System ID 为8e,全部的分区均给VG,VG名为tomvg,设置PE大小为16MB,全部VG都给LV,LV名为tomlv。将LV格式化为ext4文件系统,挂载在/mnt/tomlvm中。

此处代码省略。

这是我们分区后的成果:

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  8e  Linux LVM
/dev/sdb2            1307        2612    10490445   8e  Linux LVM
/dev/sdb3            2613        3918    10490445   8e  Linux LVM


NO.2 创建PV要建立 PV 其实很简单,只要直接使用 pvcreate 即可!我们来谈一谈与 PV 有关的指令吧!

pvcreate :将实体 partition 建立成为 PV ;

pvscan :搜寻目前系统里面任何具有 PV 的磁盘;

pvdisplay :显示出目前系统上面的 PV 状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。

[root@localhost ~]# pvcreate /dev/sdb{1,2,3}         #创建3个PV
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
[root@localhost ~]# pvdisplay                      #详细显示系统上的所有PV信息
"/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               gBFPYO-9uZd-3mOh-YqDz-dS2e-ajyS-PQlkY7

"/dev/sdb2" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb2
VG Name
PV Size               10.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               Q3xrtP-szdn-eBVg-1lsx-jrCu-3I1R-b3ua6e

"/dev/sdb3" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb3
VG Name
PV Size               10.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               k66htg-Azf7-6WdI-5fcR-wor7-uXRa-YATV1q

[root@localhost ~]#
三个PV创建成功。

NO.3 创建VGVG命令的用法与PV类似:
vgcreate :就是主要建立 VG 的指令啦!他的参数比较多,等一下介绍。
vgscan :搜寻系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内增加额外的 PV ;
vgreduce :在 VG 内移除 PV ;
vgchange :设定 VG 是否启动 (active) ;
vgremove :删除一个 VG 啊!

与 PV 不同的是, VG 的名称是自定义的!我们知道 PV 的名称其实就是分区设备的文件名,但是这个 VG 名称则可以随便你自己取啊!在底下的例子当中,我将 VG 名称取名为 tomvg 。

vgcreate详细用法:

vgcreate 创建vg [-s PE大小] VG名称 PV名称

[root@localhost ~]# vgcreate -s 16MB tomvg /dev/sdb{1,2,3}   #创建VG名为tomvg PE大小为16MB 由sdb1,sdb2,sdb3组成

Volume group "tomvg" successfully created                 #VG创建成功提示信息
[root@localhost ~]# vgscan                                  #查看VG信息
Reading all physical volumes.  This may take a while...
Found volume group "tomvg" using metadata type lvm2
[root@localhost ~]# pvscan                                  #查看PV信息已属tomvg
PV /dev/sdb1   VG tomvg   lvm2 [10.00 GiB / 10.00 GiB free]
PV /dev/sdb2   VG tomvg   lvm2 [10.00 GiB / 10.00 GiB free]
PV /dev/sdb3   VG tomvg   lvm2 [10.00 GiB / 10.00 GiB free]
Total: 3 [30.00 GiB] / in use: 3 [30.00 GiB] / in no VG: 0 [0   ]
[root@localhost ~]# vgdisplay                               #查看VG详细信息
--- Volume group ---
VG Name               tomvg
System ID
Format                lvm2
Metadata Areas        3
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                3
Act PV                3
VG Size               30.00 GiB                         #VG总量
PE Size               16.00 MiB                         #PE大小
Total PE              1920                              #PE个数
Alloc PE / Size       0 / 0
Free  PE / Size       1920 / 30.00 GiB
VG UUID               sjIxf0-6B16-eC9J-XK9c-jC4i-RIDy-lHAIIX

[root@localhost ~]#
VG创建成功。

NO.4 创建LVVG命令的用法也与PV类似:
lvcreate:建立 LV 啦!
lvscan:查询系统上面的 LV ;
lvdisplay:显示系统上面的 LV 状态啊!
lvextend:在 LV 里面增加容量!
lvreduce:在 LV 里面减少容量;
lvremove:删除一个 LV !
lvresize:对 LV 进行容量大小的调整!
lvcreate详细用法:lvcreate -L LV大小 -n lv名称 VG名称
-l PE个数
[root@localhost ~]# lvcreate -L 30G -n tomlv tomvg #创建大小为30G名称为tomlv的的LV
Logical volume "tomlv" created
[root@localhost ~]# lvscan
ACTIVE            '/dev/tomvg/tomlv' [30.00 GiB] inherit
[root@localhost ~]#
LV创建成功,接下来就是对LV进行格式化处理并且挂载了。

NO.5 格式化并挂载LV
[root@localhost ~]# mkfs.ext4 /dev/tomvg/tomlv
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
1966080 inodes, 7864320 blocks
393216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
240 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, 2654208,
4096000

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

This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mkdir -p /mnt/tomlvm
[root@localhost ~]# mount /dev/tomvg/tomlv /mnt/tomlvm
[root@localhost ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/sda2                18339256 2617600  14790072  16% /
tmpfs                      506176      72    506104   1% /dev/shm
/dev/sda1                  297485   34634    247491  13% /boot
/dev/mapper/tomvg-tomlv  30963708  176064  29214780   1% /mnt/tomlvm
[root@localhost ~]#


拓展与缩减LVM

既然我们一开始就提到LVM的重点在于可以弹性的调整文件系统的容量,那么这个弹性要怎么谈呢?

LVM拓展



既然要拓展LVM那么就要把VG变大才能进行LVM的拓展,而VG的大小取决于PV,我们在演示LVM的实现时已将PV全部使用完毕并都给了VG,故而我们现在拓展LVM的第一步就是新建一个PV。

NO.1新建一个PV

划分一个8G的分区/dev/sdb4 代码省略

[root@localhost ~]# pvcreate /dev/sdb4              #新建一个PV
dev_is_mpath: failed to get device for 8:20
Physical volume "/dev/sdb4" successfully created
[root@localhost ~]# pvscan
PV /dev/sdb1   VG tomvg           lvm2 [10.00 GiB / 0    free]
PV /dev/sdb2   VG tomvg           lvm2 [10.00 GiB / 0    free]
PV /dev/sdb3   VG tomvg           lvm2 [10.00 GiB / 0    free]
PV /dev/sdb4                      lvm2 [8.01 GiB]
Total: 4 [38.01 GiB] / in use: 3 [30.00 GiB] / in no VG: 1 [8.01 GiB]
You have new mail in /var/spool/mail/root
[root@localhost ~]#

NO.2变大VG

[root@localhost ~]# vgextend tomvg /dev/sdb4  #将LVsdb4新加入VG
Volume group "tomvg" successfully extended
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name               tomvg
System ID
Format                lvm2
Metadata Areas        4
Metadata Sequence No  3
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                1
Open LV               1
Max PV                0
Cur PV                4
Act PV                4
VG Size               38.00 GiB                     #VG大小变大至38G
PE Size               16.00 MiB
Total PE              2432
Alloc PE / Size       1920 / 30.00 GiB
Free  PE / Size       512 / 8.00 GiB
VG UUID               sjIxf0-6B16-eC9J-XK9c-jC4i-RIDy-lHAIIX

[root@localhost ~]#

NO.3放大LV

放大LV我们使用 lvextend这个命令。
lvextend -L +增加的LV量 LV全名
[root@localhost ~]# lvextend -L +8G /dev/tomvg/tomlv
Extending logical volume tomlv to 38.00 GiB
Logical volume tomlv successfully resized
[root@localhost ~]# lvscan
ACTIVE            '/dev/tomvg/tomlv' [38.00 GiB] inherit
[root@localhost ~]#

现在我们的LV变大至38G了,注意仅仅是LV的物理容量变大了。逻辑容量(既文件系统还)还没变大,接下来我们需要使用resize2fs来使逻辑容量变大。

resize2fs LV全名

[root@localhost ~]# resize2fs /dev/tomng/tomlv
resize2fs 1.41.12 (17-May-2010)
open: No such file or directory while opening /dev/tomng/tomlv
[root@localhost ~]# resize2fs /dev/tomvg/tomlv
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/tomvg/tomlv is mounted on /mnt/tomlvm; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 3
Performing an on-line resize of /dev/tomvg/tomlv to 9961472 (4k) blocks.
The filesystem on /dev/tomvg/tomlv is now 9961472 blocks long.

[root@localhost ~]#
既然是“弹性”的拓展,那么原先LV里的数据一定不会消失吧?

[root@localhost ~]# cd /mnt/tomlvm
[root@localhost tomlvm]# ls
fstab  lost+found
[root@localhost tomlvm]#
原先的文件一直存在没有丢失。

LVM缩减



既然可以弹性的扩大,那么要怎样弹性的缩减呢?

各位亲,在缩减时要注意,缩减LV是不能直接进行的,需要先卸载然后进行强制磁盘检查,才能缩减LV。

而且要提醒大家缩减有风险,缩减需注意。在拓展LV时我们是先拓展的物理容量后拓展的逻辑容量,而缩减LV时需要先缩减逻辑容量再缩减物理容量。
[root@localhost ~]# umount /dev/tomvg/tomlv               #卸载
[root@localhost ~]# e2fsck -f /dev/tomvg/tomlv            #强制检查
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/tomvg/tomlv: 12/2490368 files (0.0% non-contiguous), 201331/9961472 blocks
[root@localhost ~]# resize2fs /dev/tomvg/tomlv 11G       #逻辑容量减少11G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/tomvg/tomlv to 2883584 (4k) blocks.
The filesystem on /dev/tomvg/tomlv is now 2883584 blocks long.

[root@localhost ~]# lvreduce -L -11G /dev/tomvg/tomlv    #物理容量减少11G
WARNING: Reducing active logical volume to 27.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce tomlv? [y/n]: y
Reducing logical volume tomlv to 27.00 GiB
Logical volume tomlv successfully resized
[root@localhost ~]# lvs
LV    VG    Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
tomlv tomvg -wi-a----- 27.00g
[root@localhost ~]# mount /dev/tomvg/tomlv /mnt/tomlvm   #重新挂载
[root@localhost ~]# lvs
LV    VG    Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
tomlv tomvg -wi-ao---- 27.00g
[root@localhost ~]#


本博客内容整理至马哥笔记与鸟哥的linux私房菜,版权归原作者所有
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息