文章目录
  1. 1. 写在前面
  2. 2. 基本概念
  3. 3. 部署LVM的步骤
    1. 3.1. 实验环境:
    2. 3.2. 安装时自动分区的分析
    3. 3.3. 部署实例1 — 建立物理卷和卷组
      1. 3.3.1. 需求
      2. 3.3.2. 解决方案
        1. 3.3.2.1. 1.创建分区
        2. 3.3.2.2. 2.物理卷的创建(pvcreate)
        3. 3.3.2.3. 3.卷组的创建(vgcreate)
    4. 3.4. 部署实例2 — 建立逻辑卷并使用
      1. 3.4.1. 需求
      2. 3.4.2. 解决方案
        1. 3.4.2.1. 1.建立逻辑分区(lvcreate -L 逻辑分区大小 -n 逻辑分区名 卷组名)
        2. 3.4.2.2. 2.格式化分区(mkfs.ext4 /dev/卷组名/逻辑分区)
        3. 3.4.2.3. 3.挂载分区(mount /dev/卷组名/逻辑分区 挂载点)
        4. 3.4.2.4. 4.结果(mount)
    5. 3.5. 部署实例3 — 调整逻辑卷的容量
      1. 3.5.1. 需求
      2. 3.5.2. 解决方案
        1. 3.5.2.1. 1.增加逻辑卷的容量
          1. 3.5.2.1.1. 1.1 查看所属物理卷的总大小,确保卷组中有足够的空间(vgdisplay 卷组名)
          2. 3.5.2.1.2. 1.2 增加逻辑卷的大小( lvextend -L 增加到的大小 逻辑卷)
          3. 3.5.2.1.3. 1.3 调整文件系统以启动新空间( resize2fs 逻辑卷)
          4. 3.5.2.1.4. 1.4 检查扩容结果(df -h 目录名)
        2. 3.5.2.2. 2.减小逻辑卷的容量 – 针对 /da/data (注意:此操作不能Online执行,必须先卸载逻辑卷)
          1. 3.5.2.2.1. 2.1 查看已经使用的空间,以确保缩小后不会破坏现有的数据(df -h 目录名)
          2. 3.5.2.2.2. 2.2 检查逻辑卷的状态(e2fsck -f 逻辑卷)
          3. 3.5.2.2.3. 2.3 缩小文件系统以释放文件系统空间(resize2fs 逻辑卷 缩小后的大小)
          4. 3.5.2.2.4. 2.4 缩小物理卷(lvreduce -L 缩小后的大小 逻辑卷)
          5. 3.5.2.2.5. 2.5 查看缩小后的结果
          6. 3.5.2.2.6. 3.最终结果

本文是之前RHCE培训时整理的一篇文档,当时发布在一个开源网站上了,现在回收一下,作为个人原创的一篇文章,个人认为还是有一定参考价值的。

写在前面

最近开始Linux的培训,强度很大。虽然个人认为对Linux比较熟悉,但是对于系统的培训来说,对很多的知识点掌握的还是不够,希望借写BLOG的机会,能把自己学到的东西好好整理一下。

本部分是第一个重点内容:Linux Logical Volume Manager

基本概念

个人认为LVM是建立在硬盘和分区之上的一个逻辑层,可以用下面的图来理解:

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.最终结果

结果上面的步骤之后,整个系统的磁盘存储结构如下:

系统的磁盘存储结构图

(完)

文章目录
  1. 1. 写在前面
  2. 2. 基本概念
  3. 3. 部署LVM的步骤
    1. 3.1. 实验环境:
    2. 3.2. 安装时自动分区的分析
    3. 3.3. 部署实例1 — 建立物理卷和卷组
      1. 3.3.1. 需求
      2. 3.3.2. 解决方案
        1. 3.3.2.1. 1.创建分区
        2. 3.3.2.2. 2.物理卷的创建(pvcreate)
        3. 3.3.2.3. 3.卷组的创建(vgcreate)
    4. 3.4. 部署实例2 — 建立逻辑卷并使用
      1. 3.4.1. 需求
      2. 3.4.2. 解决方案
        1. 3.4.2.1. 1.建立逻辑分区(lvcreate -L 逻辑分区大小 -n 逻辑分区名 卷组名)
        2. 3.4.2.2. 2.格式化分区(mkfs.ext4 /dev/卷组名/逻辑分区)
        3. 3.4.2.3. 3.挂载分区(mount /dev/卷组名/逻辑分区 挂载点)
        4. 3.4.2.4. 4.结果(mount)
    5. 3.5. 部署实例3 — 调整逻辑卷的容量
      1. 3.5.1. 需求
      2. 3.5.2. 解决方案
        1. 3.5.2.1. 1.增加逻辑卷的容量
          1. 3.5.2.1.1. 1.1 查看所属物理卷的总大小,确保卷组中有足够的空间(vgdisplay 卷组名)
          2. 3.5.2.1.2. 1.2 增加逻辑卷的大小( lvextend -L 增加到的大小 逻辑卷)
          3. 3.5.2.1.3. 1.3 调整文件系统以启动新空间( resize2fs 逻辑卷)
          4. 3.5.2.1.4. 1.4 检查扩容结果(df -h 目录名)
        2. 3.5.2.2. 2.减小逻辑卷的容量 – 针对 /da/data (注意:此操作不能Online执行,必须先卸载逻辑卷)
          1. 3.5.2.2.1. 2.1 查看已经使用的空间,以确保缩小后不会破坏现有的数据(df -h 目录名)
          2. 3.5.2.2.2. 2.2 检查逻辑卷的状态(e2fsck -f 逻辑卷)
          3. 3.5.2.2.3. 2.3 缩小文件系统以释放文件系统空间(resize2fs 逻辑卷 缩小后的大小)
          4. 3.5.2.2.4. 2.4 缩小物理卷(lvreduce -L 缩小后的大小 逻辑卷)
          5. 3.5.2.2.5. 2.5 查看缩小后的结果
          6. 3.5.2.2.6. 3.最终结果