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),最终就能挂载使用了。
上面我们提到LVM的重点在于可以弹性的调整文件系统的容量,那么LVM的这个特性是靠什么实现的呢?
这就需要了解PV、PE、VG、LV是什么了。
我们实际的分区需要调整系统标识符 (system ID) 成为 8e (LVM 的标识符) ,然后再经过pvcreate命令将他转成 LVM 最底层的实体滚动条 (PV) ,之后才能够将这些 PV 加以利用! 调整system ID 的方是就是透过 fdisk 的 t选项。
所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西就是啦!所以 VG 就是 LVM 组合起来的磁
盘!这么想就好了。 那么这个大磁盘最大可以到多少容量呢?这与底下要说明的 PE 有关喔~因为每个
VG 最多仅能包含 65534 个 PE 而已。 如果使用 LVM 预设的参数,则一个 VG 最大可达 256GB 的容
量啊!(参考底下的 PE 说明) 。
LVM 预设使用 4MB 的 PE 区块,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此预设的 LVM VG
会有 4M*65534/(1024M/G)=256G。 这个 PE 很有趣喔!他是整个 LVM 最小的储存区块,也就是
说,其实我们的档案资料都是藉由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的
block 大小啦。 这样说应该就比较好理解了吧?所以调整 PE 会影响到 VG 的最大容量喔!
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的第一步自然是分区,假设我们有一块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
要建立 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创建成功。
VG命令的用法与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创建成功。
VG命令的用法也与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进行格式化处理并且挂载了。
[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那么就要把VG变大才能进行LVM的拓展,而VG的大小取决于PV,我们在演示LVM的实现时已将PV全部使用完毕并都给了VG,故而我们现在拓展LVM的第一步就是新建一个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 ~]#
[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 ~]#
放大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]#
原先的文件一直存在没有丢失。
既然可以弹性的扩大,那么要怎样弹性的缩减呢?
各位亲,在缩减时要注意,缩减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 ~]#
原文地址:http://3037673.blog.51cto.com/3027673/1728911