LVM的基本概念和部署
本文是之前RHCE培训时整理的一篇文档,当时发布在一个开源网站上了,现在回收一下,作为个人原创的一篇文章,个人认为还是有一定参考价值的。
写在前面
最近开始Linux的培训,强度很大。虽然个人认为对Linux比较熟悉,但是对于系统的培训来说,对很多的知识点掌握的还是不够,希望借写BLOG的机会,能把自己学到的东西好好整理一下。
本部分是第一个重点内容:Linux Logical Volume Manager
基本概念
个人认为LVM是建立在硬盘和分区之上的一个逻辑层,可以用下面的图来理解:
上图右侧是LVM的基本组成结构。
LVM相关的概念罗列如下:
- 物理卷(Physical Volume):标记为LVM的可用空间的分区,在MBR磁盘上,用分区类型0x8e标记。
- 卷组(Volume Group):一个或者多个物理卷的集合。可以认为是一个虚拟的大硬盘。
- 逻辑卷(Logical Volume):可以认为是对于卷组的虚拟分区。逻辑卷在使用之前必须格式化为特定的文件系统。
部署LVM的步骤
概要图如下:
下面详细介绍每一步的操作。
实验环境:
- OS = Red Hat Enterprise Linux 6.2 x64
- Client = SSH from Mac OS X ML
安装时自动分区的分析
以我实验用的机器为例,首先查看现在的硬盘结构: (如果你分区的时候是选择自动分区,应该能看到和下面相同的分区结构)
其中,/dev/sda2 这个分区就是一个物理卷,用于存放 / 的各个文件。 接下来详细查看一下/dev/sda2这个物理卷的结构:
[root@localhost ~]# pvdisplay /dev/sda2
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID W1MfcE-0e6m-NZ79-YPRq-ZnTE-3169-6Hre0T
[root@localhost ~]#
可以看到,这个物理卷属于卷组VolGroup,看看VolGroup的结构:
[root@localhost ~]# lvscan
ACTIVE '/dev/VolGroup/lv_root' [17.54 GiB] inherit
ACTIVE '/dev/VolGroup/lv_swap' [1.97 GiB] inherit
[root@localhost ~]#
真像大白了,卷组VolGroup中有两个逻辑卷,那么这两个逻辑卷有对应了文件系统中的那个文件呢? 查看/etc/fstab可以看出各个文件挂载点详细信息:
从上面的图中可以看出,其实系统中
- / 使用了 lv_root这个逻辑卷
- swap(也就是常说的交换分区) 使用了lv_swap这个逻辑卷
- /boot 使用了UUID标识的一个东西(如果再追究会发现,这个UUID其实就是/dev/sda1这个分区了)
也就是说,现在系统中的 / 和 swap 都可以根据需要动态的调整大小,而 /boot 则不能。(其实,/boot 也不要调整大小,它的size基本上是固定的)
部署实例1 — 建立物理卷和卷组
需求
增加了一块硬盘/dev/sdb, 创建三个分区,并建立三个物理卷 ,三个物理卷中前两个属于一个卷组VolGroup_data,最后一个属于卷组VolGroup_log.
解决方案
1.创建分区
篇幅限制,具体的分区过程省略,详细参考fdisk的使用手册,注意点: 在分区结束之后,一定要执行下面的命令,告诉内核最新的分区信息
~$ partx -a /dev/sdb
如果忘记这步的话,在/dev下,是看不到/dev/sdb1,/dev/sdb2, /dev/sdb3等等的文件,只能重启系统。 分区结果如下:
2.物理卷的创建(pvcreate)
[root@localhost ~]# pvcreate /dev/sdb{1,2,3}
Writing physical volume data to disk "/dev/sdb1"
Physical volume "/dev/sdb1" successfully created
Writing physical volume data to disk "/dev/sdb2"
Physical volume "/dev/sdb2" successfully created
Writing physical volume data to disk "/dev/sdb3"
Physical volume "/dev/sdb3" successfully created
[root@localhost ~]#
至此,/dev/sdb1,/dev/sdb2, /dev/sdb3就由分区转换成了物理卷。 可以用下面的命令查看创建后的物理卷:
[root@localhost ~]# pvscan
PV /dev/sda2 VG VolGroup lvm2 [19.51 GiB / 0 free]
PV /dev/sdb1 lvm2 [512.00 MiB]
PV /dev/sdb2 lvm2 [1.00 GiB]
PV /dev/sdb3 lvm2 [511.00 MiB]
Total: 4 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [2.00 GiB]
[root@localhost ~]#
值得注意的是,sdb1,sdb2,sdb3之后都出现了lvm2这个标识,说明创建物理卷成功。
3.卷组的创建(vgcreate)
[root@localhost ~]# vgcreate VolGroup_data /dev/sdb1 /dev/sdb2
Volume group "VolGroup_data" successfully created
[root@localhost ~]# vgcreate VolGroup_log /dev/sdb3
Volume group "VolGroup_log" successfully created
[root@localhost ~]#
接下来看看刚刚创建好的卷组:
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup_log" using metadata type lvm2
Found volume group "VolGroup_data" using metadata type lvm2
Found volume group "VolGroup" using metadata type lvm2
[root@localhost ~]#
再次查看物理卷:
[root@localhost ~]# pvscan
PV /dev/sdb3 VG VolGroup_log lvm2 [508.00 MiB / 508.00 MiB free]
PV /dev/sdb1 VG VolGroup_data lvm2 [508.00 MiB / 508.00 MiB free]
PV /dev/sdb2 VG VolGroup_data lvm2 [1020.00 MiB / 1020.00 MiB free]
PV /dev/sda2 VG VolGroup lvm2 [19.51 GiB / 0 free]
Total: 4 [21.50 GiB] / in use: 4 [21.50 GiB] / in no VG: 0 [0 ]
[root@localhost ~]#
至此,物理卷和卷组已经关联好了。
部署实例2 — 建立逻辑卷并使用
需求
在上面建立好的卷组
- VolGroup_log 中建立一个逻辑分区lv_log,文件系统为Ext4,大小为300MB,挂载点为/da/log。
- VolGroup_data 中建立一个逻辑分区 lv_data,文件系统为Ext4,大小为1.2GB,挂载点为 /da/data。
解决方案
1.建立逻辑分区(lvcreate -L 逻辑分区大小 -n 逻辑分区名 卷组名)
[root@localhost ~]# lvcreate -L 300M -n lv_log VolGroup_log
Logical volume "lv_log" created
[root@localhost ~]# lvcreate -L 1.2G -n lv_data VolGroup_data
Rounding up size to full physical extent 1.20 GiB
Logical volume "lv_data" created
[root@localhost ~]#
2.格式化分区(mkfs.ext4 /dev/卷组名/逻辑分区)
[root@localhost ~]# mkfs.ext4 /dev/VolGroup_log/lv_log
...
此处省略N个字...
...
[root@localhost ~]# mkfs.ext4 /dev/VolGroup_data/lv_data
...
此处省略M个字...
...
[root@localhost ~]#
3.挂载分区(mount /dev/卷组名/逻辑分区 挂载点)
[root@localhost ~]# mkdir -p /da/log /da/data
[root@localhost ~]# mount /dev/VolGroup_log/lv_log /da/log
[root@localhost ~]# mount /dev/VolGroup_data/lv_data /da/data
4.结果(mount)
用mount命令查看整个系统的挂载情况。
[root@localhost ~]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /media/psf type prl_fs (rw,nosuid,nodev,sync,_netdev,noatime,share,context="system_u:object_r:removable_t:s0")
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/VolGroup_log-lv_log on /da/log type ext4 (rw)
/dev/mapper/VolGroup_data-lv_data on /da/data type ext4 (rw)
[root@localhost ~]#
经过上面的步骤,整个系统磁盘存储结构如下图所示:
部署实例3 — 调整逻辑卷的容量
需求
经过一段时间的运行,发现 /da/log 的容量不足了,需要从原来的300MB扩充到500MB,而 /da/data 的容量有浪费,需要从原来的1.2GB缩小到600MB。 并且,在分区容量调整的时候不能影响现在系统的运行。
解决方案
1.增加逻辑卷的容量
1.1 查看所属物理卷的总大小,确保卷组中有足够的空间(vgdisplay 卷组名)
[root@localhost ~]# vgdisplay VolGroup_log
--- Volume group ---
VG Name VolGroup_log
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1 **VG Size 508.00 MiB **PE Size 4.00 MiB
Total PE 127
Alloc PE / Size 75 / 300.00 MiB
Free PE / Size 52 / 208.00 MiB
VG UUID 4PCrgv-Xf2G-1lF3-g0Rc-aNHd-XmMw-8gtDRZ
[root@localhost ~]#
1.2 增加逻辑卷的大小( lvextend -L 增加到的大小 逻辑卷)
[root@localhost ~]# lvextend -L 500M /dev/VolGroup_log/lv_log
Extending logical volume lv_log to 500.00 MiB
Logical volume lv_log successfully resized
[root@localhost ~]#
1.3 调整文件系统以启动新空间( resize2fs 逻辑卷)
[root@localhost ~]# resize2fs /dev/mapper/VolGroup_log-lv_log
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/VolGroup_log-lv_log is mounted on /da/log;
on-line resizing requiredold desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/VolGroup_log-lv_log to 512000 (1k) blocks.
The filesystem on /dev/mapper/VolGroup_log-lv_log is now 512000 blocks long.
[root@localhost ~]#
【注意】上面的命令中,使用了/dev/mapper下面的一个符号链接VolGroup_log-lv_log。 通过整个符号链接的名字,可以猜出其命名方式:
卷组名-逻辑卷名。
当然,也可以使用真实的文件,在本例中,可以使用:
/dev/VolGroup_log/lv_log
1.4 检查扩容结果(df -h 目录名)
[root@localhost ~]# df -h /da/log
文件系统 容量 已用 可用 已用%% 挂载点
/dev/mapper/VolGroup_log-lv_log 485M 11M 450M 3% /da/log
[root@localhost ~]# ** **
2.减小逻辑卷的容量 – 针对 /da/data (注意:此操作不能Online执行,必须先卸载逻辑卷)
2.1 查看已经使用的空间,以确保缩小后不会破坏现有的数据(df -h 目录名)
[root@localhost ~]# df -h /da/data
文件系统 容量 已用 可用 已用%% 挂载点
/dev/mapper/VolGroup_data-lv_data 1.2G 34M 1.1G 3% /da/data
[root@localhost ~]#
2.2 检查逻辑卷的状态(e2fsck -f 逻辑卷)
在检查之前,请确保逻辑卷不在挂载状态,或者卸载逻辑卷。否则,e2fsck会有如下的警告
[root@localhost ~]# e2fsck /dev/mapper/VolGroup_data-lv_data
e2fsck 1.41.12 (17-May-2010)/dev/mapper/VolGroup_data-lv_data 已挂载.
WARNING!!! The filesystem is mounted.
If you continue you ***WILL***cause ***SEVERE*** filesystem damage.
你真的想要要继续 (y/n)? n
检查被中止
[root@localhost ~]#
为了安全起见,建议先卸载逻辑卷:
[root@localhost ~]# umount /da/data
然后开始检查文件系统
[root@localhost ~]# e2fsck -f /dev/mapper/VolGroup_data-lv_data
e2fsck 1.41.12 (17-May-2010)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/mapper/VolGroup_data-lv_data: 11/78880 files (0.0% non-contiguous), 13616/315392 blocks
[root@localhost ~]#
2.3 缩小文件系统以释放文件系统空间(resize2fs 逻辑卷 缩小后的大小)
[root@localhost ~]# resize2fs /dev/mapper/VolGroup_data-lv_data 600M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/VolGroup_data-lv_data to 153600 (4k) blocks.
The filesystem on /dev/mapper/VolGroup_data-lv_data is now 153600 blocks long.
[root@localhost ~]#
2.4 缩小物理卷(lvreduce -L 缩小后的大小 逻辑卷)
[root@localhost ~]# lvreduce -L 600M /dev/mapper/VolGroup_data-lv_data
WARNING: Reducing active logical volume to 600.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_data? [y/n]: y
Reducing logical volume lv_data to 600.00 MiB
Logical volume lv_data successfully resized
[root@localhost ~]#
2.5 查看缩小后的结果
[root@localhost ~]# lvdisplay /dev/mapper/VolGroup_data-lv_data
--- Logical volume ---
LV Path /dev/VolGroup_data/lv_data
LV Name lv_data
VG Name VolGroup_data
LV UUID LZEvpU-ZrM7-Ynua-0fRx-GvVB-o6Fs-RhoKXK
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2012-11-18 22:19:55 +0800
LV Status available
# open 0
LV Size 600.00 MiB
Current LE 150
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:3
挂载缩小后的逻辑卷,开始使用:
[root@localhost ~]# mount /dev/mapper/VolGroup_data-lv_data /da/data
3.最终结果
结果上面的步骤之后,整个系统的磁盘存储结构如下:
(完)