Unix/Linux 系统自动化管理: 内存管理篇

developerWorks

IBM AIX V5.3 磁盘存储管理

LVM 使用的基本概念包括物理卷、卷组、物理分区、逻辑卷、逻辑分区、文件系统和原始设备。下面介绍它们的一些特征:

    • 每个单独的磁盘驱动器是一个命名的物理卷 (PV),并具有诸如 hdisk0 或 hdisk1 等名称。
    • 一个或多个 PV 可以构成一个卷组 (VG)。一个物理卷最多只能属于一个 VG。
    • 不能将某个 PV 的一部分分配到一个 VG。一个物理卷整体地分配到某个卷组。
    • 即使物理卷属于不同的类型,例如 SCSI 或 SSA,也可以将它们分配到同一个卷组。
    • 物理卷中的存储空间划分为物理分区 (PP)。在属于同一个 VG 的所有磁盘上,物理分区的大小完全相同。
    • 在每个卷组中,可以定义一个或多个逻辑卷 (LV)。从用户的角度看,逻辑卷上存储的数据似乎是连续的,但是可以分散在同一个卷组中的不同物理卷上。
    • 逻辑卷由一个或多个逻辑分区 (LP) 组成。每个逻辑分区至少有一个对应的物理分区。一个逻辑分区和一个物理分区始终具有相同的大小。最多可以将数据的三个副本定位在不同的物理分区上。通常,为了实现冗余,将存储相同数据的物理分区定位在不同的物理磁盘上。
    • 逻辑卷中的数据可以按有组织的方式进行存储,并具有位于有目录中的文件的形式。这种结构化和层次性的组织形式称为文件系统。
    • 还可以将逻辑卷中的数据视为一个连续的字节串。此类逻辑卷称为原始逻辑卷。使用该数据以正确地访问和解释它是应用程序的责任。
    • 卷组描述符区域 (VGDA) 是磁盘上的一个区域,其中包含有关该物理卷所在的卷组的信息。它还包括有关属于该卷组的所有物理和逻辑卷的属性和状态的信息。VGDA 中的信息由 LVM 命令使用和更新。每个物理卷至少有一个 VGDA。属于同一个卷组的所有磁盘的 VGDA 中的信息必须完全相同。VGDA 的内部体系结构及其在磁盘上的位置取决于卷组的类型(原始、大容量或可扩展)。
    • 卷组状态区域 (VGSA) 用于描述卷组中所有物理卷中的所有物理分区的状态。VGSA 指示某个物理分区是包含准确还是过时的信息。VGSA 用于监视和维护数据副本同步。VGSA 本质上是一个位图,其体系结构和在磁盘上的位置取决于卷组的类型。
    • 逻辑卷控制块 (LVCB) 包含有关逻辑卷的重要信息,例如逻辑分区数量或磁盘分配策略。其体系结构和在磁盘上的位置取决于它所在的卷组的类型。对于标准卷组,LVCB 驻留在 LV 中的第一个用户数据块上。对于大容量卷组,磁盘上的 VGDA 中存在额外的 LVCB 信息。对于可扩展卷组,所有的相关逻辑卷控制信息都作为 LVCB 信息区域和 LV 入口区域的一部分保留在 VGDA 中。

注意:硬盘驱动器的布局是由 /usr/include/sys/hd_psn.h 头文件定义的。LVM 记录从磁盘上的第 7 个扇区开始。所有 LVM 记录结构都是在 /usr/include/lvmrec.h 头文件中定义的。

逻辑卷存储的限制

AIX 5L Version 5.3 的 LVM 层提供了更高级别的磁盘管理灵活性。存在一些必须注意的限制,如表 1 所示。

表 1

VG 类型最大 PV 数量最大 LV 数量每个 VG 的最大 PP 数量最大 PP 大小
常规 VG3225632512 (1016*32)1 GB
大容量 VG128512130048 (1016*128)1 GB
可扩展 VG102440962097152128 GB

AIX 5L Version 5.3 的 LVM 限制

LVM 使用的基本概念包括物理卷、卷组、物理分区、逻辑卷、逻辑分区、文件系统和原始设备。下面介绍它们的一些特征:

    • 每个单独的磁盘驱动器是一个命名的物理卷 (PV),并具有诸如 hdisk0 或 hdisk1 等名称。
    • 一个或多个 PV 可以构成一个卷组 (VG)。一个物理卷最多只能属于一个 VG。
    • 不能将某个 PV 的一部分分配到一个 VG。一个物理卷整体地分配到某个卷组。
    • 即使物理卷属于不同的类型,例如 SCSI 或 SSA,也可以将它们分配到同一个卷组。
    • 物理卷中的存储空间划分为物理分区 (PP)。在属于同一个 VG 的所有磁盘上,物理分区的大小完全相同。
    • 在每个卷组中,可以定义一个或多个逻辑卷 (LV)。从用户的角度看,逻辑卷上存储的数据似乎是连续的,但是可以分散在同一个卷组中的不同物理卷上。
    • 逻辑卷由一个或多个逻辑分区 (LP) 组成。每个逻辑分区至少有一个对应的物理分区。一个逻辑分区和一个物理分区始终具有相同的大小。最多可以将数据的三个副本定位在不同的物理分区上。通常,为了实现冗余,将存储相同数据的物理分区定位在不同的物理磁盘上。
    • 逻辑卷中的数据可以按有组织的方式进行存储,并具有位于有目录中的文件的形式。这种结构化和层次性的组织形式称为文件系统。
    • 还可以将逻辑卷中的数据视为一个连续的字节串。此类逻辑卷称为原始逻辑卷。使用该数据以正确地访问和解释它是应用程序的责任。
    • 卷组描述符区域 (VGDA) 是磁盘上的一个区域,其中包含有关该物理卷所在的卷组的信息。它还包括有关属于该卷组的所有物理和逻辑卷的属性和状态的信息。VGDA 中的信息由 LVM 命令使用和更新。每个物理卷至少有一个 VGDA。属于同一个卷组的所有磁盘的 VGDA 中的信息必须完全相同。VGDA 的内部体系结构及其在磁盘上的位置取决于卷组的类型(原始、大容量或可扩展)。
    • 卷组状态区域 (VGSA) 用于描述卷组中所有物理卷中的所有物理分区的状态。VGSA 指示某个物理分区是包含准确还是过时的信息。VGSA 用于监视和维护数据副本同步。VGSA 本质上是一个位图,其体系结构和在磁盘上的位置取决于卷组的类型。
    • 逻辑卷控制块 (LVCB) 包含有关逻辑卷的重要信息,例如逻辑分区数量或磁盘分配策略。其体系结构和在磁盘上的位置取决于它所在的卷组的类型。对于标准卷组,LVCB 驻留在 LV 中的第一个用户数据块上。对于大容量卷组,磁盘上的 VGDA 中存在额外的 LVCB 信息。对于可扩展卷组,所有的相关逻辑卷控制信息都作为 LVCB 信息区域和 LV 入口区域的一部分保留在 VGDA 中。

注意:硬盘驱动器的布局是由 /usr/include/sys/hd_psn.h 头文件定义的。LVM 记录从磁盘上的第 7 个扇区开始。所有 LVM 记录结构都是在 /usr/include/lvmrec.h 头文件中定义的。

逻辑卷存储的限制

AIX 5L Version 5.3 的 LVM 层提供了更高级别的磁盘管理灵活性。存在一些必须注意的限制,如表 1 所示。

表 1

VG 类型最大 PV 数量最大 LV 数量每个 VG 的最大 PP 数量最大 PP 大小
常规 VG3225632512 (1016*32)1 GB
大容量 VG128512130048 (1016*128)1 GB
可扩展 VG102440962097152128 GB

 

AIX 5L Version 5.3 的 LVM 限制

 

物理卷

在最初将某个磁盘添加到系统时,系统将其视为一个简单设备。此时还不可以访问该磁盘以执行 LVM 操作。要使其可访问,必须将它分配到某个卷组,这意味着将其从磁盘更改为物理卷。对于每个磁盘,将会在 /dev 目录下创建两个设备驱动程序:一个块设备驱动程序和一个字符设备驱动程序。系统向磁盘驱动器分配一个 32 位唯一标识符,此标识符称为物理卷标识符 (PVID)。

不带任何参数使用的 lspv 命令将显示所有的物理卷、物理卷的 PVID、PV 所在的卷组,以及卷组的状态,如示例 1 所示。

示例 1 使用 lspv 命令显示物理卷

# lspv

hdisk0          00c478de09a40b16                    rootvg          active

hdisk1          00c478de09caf163                    rootvg          active

hdisk2          00c478de09caf37f                    None

hdisk3          00c478de49630c6a                    None

hdisk4          00c478de00655246                    None

hdisk5          00c478de008a399b                    None

hdisk6          00c478de008a3ba1                    None

hdisk7          00c478de6c9883b7                    None

 

PVID

在生成 PVID 时,系统使用自己的序列号和时间戳,以确保两个磁盘决不会具有相同的 PVID。

PVID 还存储在 ODM 中。它们由 LVM 命令使用,并且可能由诸如 HACMP 等外部应用程序引用。

下面的命令通过分配 PVID(如果还没有的话)将可用磁盘设备更改为物理卷:

chdev -l hdisk7 -a pv=yes

如果磁盘已经是物理卷,则此命令不起作用。

下面的命令从物理卷中清除 PVID:

chdev -l hdisk7 -a pv=clear

注意:可以使用诸如 lquerypv 等中间级别的命令列出磁盘的 PVID,如下所示:

# lquerypv -h /dev/hdisk2 80 10

00000080 00C478DE 09CAF37F 00000000 00000000 |..x.............|

列出有关物理卷的信息

可以使用 lspv 命令并作为参数传递物理卷的名称,以查找有关某个物理卷的更多详细信息,如示例 6-2 所示。

示例 2 使用 lspv 显示有关某个物理卷的详细信息

# lspv hdisk2

PHYSICAL VOLUME:hdisk2                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de09caf37f VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  1

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   2

FREE PPs:542 (69376 megabytes)    HOT SPARE:no

USED PPs:4 (512 megabytes)        MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..105..109..109..109

USED DISTRIBUTION:  00..04..00..00..00

 

示例 2 中的字段含义如下:

PHYSICAL VOLUME 物理卷的名称。

PV IDENTIFIER 物理卷的标识符。

PV STATE 物理卷的状态:激活、丢失或已删除。可以使用 chpv 命令更改状态。

STALE PARTITIONS 过时分区的数量。

PP SIZE 物理分区的大小。

TOTAL PPs 驻留在该磁盘上的物理分区总数(空闲或已使用)。

FREE PPs 物理卷上可用的空闲分区数量。

USED PPs 物理卷上的已使用分区数量。

FREE DISTRIBUTION

每个物理内 (intra-physical) 卷区域上可用的空闲物理分区数量。

USED DISTRIBUTION

位于每个物理内卷区域上的已使用物理分区数量。

VOLUME GROUP 物理卷所在的卷组的名称。

VG IDENTIFIER 物理卷所在的卷组的标识符。

ALLOCATABLE 物理卷的分配权限确定了是否可以将空闲 PP 分配到逻辑卷。

LOGICAL VOLUMES 至少有一个 LP 位于此物理卷上的逻辑卷数量。

VG DESCRIPTORS 位于此物理卷上的 VGDA 数量。

HOT SPARE 是否将该物理卷定义为热后备 (hot spare)。

MAX REQUEST 此物理卷的 LTG 大小。

可以将 lspv 命令与 -l 标志结合使用,以显示至少有一个分区位于该物理卷上的所有逻辑卷的名称、位于该物理卷上的分区总数、对应于 LP 的 PP 总数、对应于每个物理内 (intra-physical) 磁盘区域的 PP 分布、逻辑卷的安装点(如果存在的话)。 示例 6-3 显示了运行此命令时获得的输出的示例。

示例 3 使用 lspv -l 命令

# lspv -l hdisk0

hdisk0:

LV NAME               LPs   PPs   DISTRIBUTION          MOUNT POINT

hd3                   1     1     00..00..01..00..00    /tmp

hd10opt               1     1     00..00..01..00..00    /opt

hd5                   1     1     01..00..00..00..00    N/A

hd8                   1     1     00..00..01..00..00    N/A

hd6                   11    11    00..00..11..00..00    N/A

hd2                   8     8     00..00..08..00..00    /usr

hd9var                1     1     00..00..01..00..00    /var

hd1                   1     1     00..00..01..00..00    /home

hd4                   1     1     00..00..01..00..00    /

 

如果希望显示分区的数量、位置,以及它们对应的逻辑卷,可以使用 lspv –p 命令,如示例 4 所示。

示例 4 使用 lspv 来显示针对逻辑卷的 PP 分配

# lspv -p hdisk0

hdisk0:

PP RANGE  STATE   REGION        LV NAME             TYPE       MOUNT POINT

1-1     used    outer edge      hd5                 boot       N/A

2-110   free    outer edge

111-219   free    outer middle

220-220   used    center        hd8                 jfs2log    N/A

221-221   used    center        hd2                 jfs2       /usr

222-222   used    center        hd3                 jfs2       /tmp

223-223   used    center        hd10opt             jfs2       /opt

224-230   used    center        hd2                 jfs2       /usr

231-241   used    center        hd6                 paging     N/A

242-328   free    center

329-437   free    inner middle

438-546   free    inner edge

 

通过使用 lspv –M 命令,可以创建详细的磁盘布局图,并显示每个物理和逻辑分区之间的关系,如示例 5 所示。

示例 5 使用 lspv -M 命令显示物理卷的布局

# lspv -M hdisk0|more

hdisk0:1        hd5:1

hdisk0:2-110

hdisk0:111      lv1:1:1

hdisk0:112      lv1:2:1

hdisk0:113      lv1:3:1

hdisk0:114      lv1:4:1

hdisk0:115      lv1:5:1

hdisk0:116      lv1:6:1

hdisk0:117      lv1:7:1

hdisk0:118      lv1:8:1

hdisk0:119      lv1:9:1

hdisk0:120      lv1:10:1

hdisk0:121      lv1:11:1

hdisk0:122      lv1:12:1

hdisk0:123-219

hdisk0:220      hd8:1

hdisk0:221      hd2:1

hdisk0:222      hd3:1

hdisk0:223      hd10opt:1

hdisk0:224      hd2:2

hdisk0:225      hd2:3

hdisk0:226      hd2:4

hdisk0:227      hd2:5

hdisk0:228      hd2:6

hdisk0:229      hd2:7

hdisk0:230      hd2:8

hdisk0:231      hd6:1

hdisk0:232      hd6:2

hdisk0:233      hd6:3

hdisk0:234      hd6:4

hdisk0:235      hd6:5

hdisk0:236      hd6:6

hdisk0:237      hd6:7

hdisk0:238      hd6:8

hdisk0:239      hd6:9

hdisk0:240      hd6:10

hdisk0:241      hd6:11

hdisk0:242-546

 

更改物理卷的分配权限

物理卷的分配权限确定是否可以将位于该物理卷上还未分配到逻辑卷的物理分区分配到逻辑卷。驻留在该物理卷上的逻辑卷的操作不受影响。

在示例 6 中,我们禁用了将 hdisk2 中新的空闲物理分区分配到任何逻辑卷的能力。我们尝试创建一个将使用 hdisk2 中的 PP 的逻辑卷,并收到一条表明该物理卷中的分区不可分配的错误消息。

示例 6 禁用物理卷的分区分配

# chpv -an hdisk2

# lspv hdisk2

PHYSICAL VOLUME:hdisk2                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de09caf37f VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:no

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  1

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   2

FREE PPs:542 (69376 megabytes)    HOT SPARE:no

USED PPs:4 (512 megabytes)        MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..105..109..109..109

USED DISTRIBUTION:  00..04..00..00..00

# mklv -y test -t jfs2 testvg 10 hdisk2

0516-823 lquerypv:Physical Volume hdisk2 is not allocatable.

0516-848 lquerypv:Failure on physical volume hdisk2, it may be missing

or removed.

0516-822 mklv:Unable to create logical volume.

 

要启用分配权限,可以使用以下命令:

chpv -ay hdisk2

 

更改物理卷的可用性

物理卷的可用性定义了是否可以对指定的物理卷执行任何逻辑输入/输出操作。任何后续的 LVM 操作将不会考虑该物理卷上的 VGDA 和 VGSA 副本。而且,有关该物理卷的信息将从卷组中的其他物理卷的 VGDA 中删除。该物理卷将标记为“已删除”。

在示例 7 中,我们演示了“可用”的概念及其与 VGDA 的关系,如下所示:

lsvg testvg 命令显示 VG 是活动的,包含两个 PV,两个 PV 都是活动的,并且该 VG 有三个 VGDA。

lsvg -p testvg 命令显示 testvg 包含磁盘 hdisk2 和 hdisk3,并且两个磁盘都是活动的。

lspv hdisk3 显示 hdisk3 是活动的并具有两个 VGDA。

lspv hdisk2 显示 hdisk2 是活动的并具有一个 VGDA。

chpv -vr hdisk3 使 hdisk3 不可用。

lspv hdisk3 确认 hdisk3 已删除,并且其上没有任何 VGDA。

lspv hdisk2 确认 hdisk2 是活动的,并且现在包含两个 VGDA,因为任何卷组都必须至少包含一个 VGDA。

lsvg -p testvg 显示 hdisk3 已删除。

lsvg testvg 显示卷组仍然是活动的,两个 PV 中有一个是活动的,VGDA 总数已更改为两个。

chpv -va hdisk3 使 hdisk3 再次可用。

lspv hdisk3 显示 hdisk3 是活动的,并且仅包含一个 VGDA。

lsvg -p testvg 确认两个磁盘现在都是活动的。

示例 7 使用 chpv 命令更改物理卷的可用性

# lsvg testvg

VOLUME GROUP:testvg                   VG IDENTIFIER:00c478de00004c00000001078fc3497d

VG STATE:active                   PP SIZE:128 megabyte(s)

VG PERMISSION:read/write               TOTAL PPs:1092 (139776 megabytes)

MAX LVs:256                      FREE PPs:1092 (139776 megabytes)

LVs:0                        USED PPs:0 (0 megabytes)

OPEN LVs:0                        QUORUM:         2

TOTAL PVs:2                        VG DESCRIPTORS: 3

STALE PVs:0                        STALE PPs:      0

ACTIVE PVs:2                        AUTO ON:yes

MAX PPs per VG:     32512

MAX PPs per PV:1016                     MAX PVs:        32

LTG size (Dynamic):256 kilobyte(s)          AUTO SYNC:no

HOT SPARE:no                       BB POLICY:relocatable

# lsvg -p testvg

testvg:

PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION

hdisk2            active            546         546         110..109..109..109..109

hdisk3            active            546         546         110..109..109..109..109

# lspv hdisk3

PHYSICAL VOLUME:hdisk3                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de49630c6a VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  0

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   2

FREE PPs:546 (69888 megabytes)    HOT SPARE:no

USED PPs:0 (0 megabytes)          MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..109..109..109..109

USED DISTRIBUTION:  00..00..00..00..00

# lspv hdisk2

PHYSICAL VOLUME:hdisk2                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de09caf37f VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  0

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   1

FREE PPs:546 (69888 megabytes)    HOT SPARE:no

USED PPs:0 (0 megabytes)          MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..109..109..109..109

USED DISTRIBUTION:  00..00..00..00..00

# chpv -vr hdisk3

# lspv hdisk3

PHYSICAL VOLUME:hdisk3                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de49630c6a VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:removed

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  0

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   0

FREE PPs:546 (69888 megabytes)    HOT SPARE:no

USED PPs:0 (0 megabytes)          MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..109..109..109..109

USED DISTRIBUTION:  00..00..00..00..00

# lspv hdisk2

PHYSICAL VOLUME:hdisk2                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de09caf37f VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  0

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   2

FREE PPs:546 (69888 megabytes)    HOT SPARE:no

USED PPs:0 (0 megabytes)          MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..109..109..109..109

USED DISTRIBUTION:  00..00..00..00..00

# lsvg -p testvg

testvg:

PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION

hdisk2            active            546         546         110..109..109..109..109

hdisk3            removed           546         546         110..109..109..109..109

# lsvg testvg

VOLUME GROUP:testvg                   VG IDENTIFIER:00c478de00004c00000001078fc3497d

VG STATE:active                   PP SIZE:128 megabyte(s)

VG PERMISSION:read/write               TOTAL PPs:1092 (139776 megabytes)

MAX LVs:256                      FREE PPs:1092 (139776 megabytes)

LVs:0                        USED PPs:0 (0 megabytes)

OPEN LVs:0                        QUORUM:         2

TOTAL PVs:2                        VG DESCRIPTORS: 2

STALE PVs:0                        STALE PPs:      0

ACTIVE PVs:1                        AUTO ON:yes

MAX PPs per VG:     32512

MAX PPs per PV:1016                     MAX PVs:        32

LTG size (Dynamic):256 kilobyte(s)          AUTO SYNC:no

HOT SPARE:no                       BB POLICY:relocatable

# chpv -va hdisk3

# lspv hdisk3

PHYSICAL VOLUME:hdisk3                   VOLUME GROUP:testvg

PV IDENTIFIER:00c478de49630c6a VG IDENTIFIER     00c478de00004c00000001078fc3497d

PV STATE:active

STALE PARTITIONS:0                        ALLOCATABLE:yes

PP SIZE:128 megabyte(s)          LOGICAL VOLUMES:  0

TOTAL PPs:546 (69888 megabytes)    VG DESCRIPTORS:   1

FREE PPs:546 (69888 megabytes)    HOT SPARE:no

USED PPs:0 (0 megabytes)          MAX REQUEST:256 kilobytes

FREE DISTRIBUTION:  110..109..109..109..109

USED DISTRIBUTION:  00..00..00..00..00

# lsvg -p testvg

testvg:

PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION

hdisk2            active            546         546         110..109..109..109..109

hdisk3            active            546         546         110..109..109..109..109

 

在更改任何物理卷的可用性之前,必须关闭驻留在该磁盘上的任何逻辑卷,并确保卷组在删除该磁盘以后满足定额 (quorum) 要求。

清除物理卷中的引导记录

要清除位于物理卷 hdisk1 上的引导记录,可以使用以下命令:

chpv -c hdisk1

 

声明物理卷热后备

可以使用 chpv 命令将某个物理卷定义为热后备。此命令还禁用该物理卷的分配权限。该磁盘的大小必须至少等于卷组中已经存在的最小磁盘的大小。

要将 hdisk3 定义为热后备,可以使用以下命令:

chpv -hy hdisk3

 

要从 hdisk3 所在的卷组的热后备池中删除 hdisk3,可以使用以下命令:

chpv -hn hdisk3

 

迁移物理卷中的数据

可以将位于物理卷上的物理分区移动到同一个卷组中包含的一个或多个物理卷。

在示例 8 中,我们提供了迁移物理卷中的数据的示例,如下所示:

    • lsvg -p rootvg 显示 rootvg 中包含的所有 PV。
    • lsvg -M hdisk1 显示位于 hdisk1 上的所有物理分区的布局图。
    • lspv -M hdisk5 显示 hdisk5 的所有分区都未分配。
    • migratepv hdisk1 hdisk5 将数据从 hdisk1 迁移到 hdisk5。
    • lspv -M hdisk1 确认 hdisk1 的所有分区均为空闲。
    • chpv -c hdisk1 清除 hdisk1 中的引导记录。
    • lspv -M hdisk5 确认所有物理分区都已迁移到 hdisk5。

示例 8 将物理分区从一个磁盘迁移到另一个磁盘

# lsvg -p rootvg

rootvg:

PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION

hdisk0            active            546         523         109..109..87..109..109

hdisk1            active            546         538         109..105..106..109..109

hdisk5            active            546         546         110..109..109..109..109

# lspv -M hdisk1

hdisk1:1        hd5:1:2

hdisk1:2-122

hdisk1:123      fslv00:1

hdisk1:124      fslv00:2

hdisk1:125      fslv00:3

hdisk1:126      fslv00:4

hdisk1:127-219

hdisk1:220      hd4:1

hdisk1:221      hd9var:1

hdisk1:222      hd1:1

hdisk1:223-546

# lspv -M hdisk5

hdisk5:1-546

# migratepv hdisk1 hdisk5

0516-1011 migratepv:Logical volume hd5 is labeled as a boot logical volume.

0516-1246 migratepv:If hd5 is the boot logical volume, please run 'chpv -c hdisk1'

as root user to clear the boot record and avoid a potential boot

off an old boot p_w_picpath that may reside on the disk from which this

logical volume is moved/removed.

# lspv -M hdisk1

hdisk1:1-546

# chpv -c hdisk1

# lspv -M hdisk5

hdisk5:1        hd5:1:2

hdisk5:2-110

hdisk5:111      fslv00:1

hdisk5:112      fslv00:2

hdisk5:113      fslv00:3

hdisk5:114      fslv00:4

hdisk5:115-219

hdisk5:220      hd4:1

hdisk5:221      hd9var:1

hdisk5:222      hd1:1

hdisk5:223-546

 

如果迁移包含引导映像的物理卷中的数据,则还应该更新引导列表。

可以仅迁移属于某个特定逻辑卷的分区中的数据。要仅将属于逻辑卷 testlv 的物理分区从 hdisk1 迁移到 hdisk5,可以使用以下命令:

migratepv -l testlv hdisk1 hdisk5

 

迁移分区

可以将数据从位于一个物理磁盘上的一个分区迁移到不同磁盘上的另一个物理分区。

在示例 9 中,我们提供了将数据从一个物理分区迁移到另一个物理分区的示例,如下所示:

    • lspv -M hdisk1 显示位于 hdisk1 上的所有物理分区的布局图。请注意,逻辑卷 testlv 的逻辑分区号 1 的第二个副本驻留在物理分区 115 上。
    • lspv -M hdisk5 显示 hdisk5 的所有分区都未分配。
    • migratelp testlv/1/2 hdisk5/123 将逻辑卷的逻辑分区号 1 的第二个副本中的数据迁移到物理分区 123 上的 hdisk5。
    • lsvg -M hdisk1 显示位于 hdisk1 上的所有物理分区的布局图。请注意,物理分区 115 是空闲的。
    • lspv -M hdisk5 确认逻辑卷 testlv 的逻辑分区号 1 的第二个副本现在驻留在 hdisk5 的物理分区 123 上。

示例 9 将某个分区迁移到不同物理卷上的另一个分区

# lspv -M hdisk1

hdisk1:1        hd5:1:2

hdisk1:2-110

hdisk1:111      fslv00:1

hdisk1:112      fslv00:2

hdisk1:113      fslv00:3

hdisk1:114      fslv00:4

hdisk1:115      testlv:1:2

hdisk1:116-219

hdisk1:220      hd4:1

hdisk1:221      hd9var:1

hdisk1:222      hd1:1

hdisk1:223-546

# lspv -M hdisk5

hdisk5:1-546

# migratelp testlv/1/2 hdisk5/123

migratelp:Mirror copy 2 of logical partition 1 of logical volume

testlv migrated to physical partition 123 of hdisk5.

# lspv -M hdisk1

hdisk1:1        hd5:1:2

hdisk1:2-110

hdisk1:111      fslv00:1

hdisk1:112      fslv00:2

hdisk1:113      fslv00:3

hdisk1:114      fslv00:4

hdisk1:115-219

hdisk1:220      hd4:1

hdisk1:221      hd9var:1

hdisk1:222      hd1:1

hdisk1:223-546

# lspv -M hdisk5

hdisk5:1-122

hdisk5:123      testlv:1:2

hdisk5:124-546

 

确定 LTG 大小

逻辑磁道组 (LTG) 大小是 I/O 磁盘操作允许的最大传输大小。

可以使用 lquerypv 命令确定物理磁盘的 LTG 大小,如示例 6-10 所示。一个磁盘可以支持多种 LTG 大小,使用 ioctl 调用可以确定这些大小。

示例 10 使用 lquerypv 命令确定 LTG 大小

# lquerypv -M hdisk0

256

管理逻辑卷

逻辑卷使得应用程序在访问数据时能够将数据当作是连续存储的。逻辑卷由一个或多个带编号的逻辑分区的序列组成。每个逻辑分区至少有一个并且至多有三个对应的物理分区,这些物理分区可以定位在不同物理卷上。物理分区在磁盘上的位置由物理内和物理间分配策略确定。

对于每个逻辑卷,/dev 目录下存在两个对应的设备文件。第一个是字符设备,第二个是块设备。

创建逻辑卷

可以使用 mklv 命令创建逻辑卷。此命令允许指定逻辑卷的名称及其特征,例如逻辑分区的数量及其位置。

在示例 11 中,我们使用 mklv 命令在卷组 test1vg 中创建一个名为 lv3 的逻辑卷,其类型为 jfs2,并具有 10 个位于 hdisk5 上的逻辑分区。

示例 11 使用 mklv 命令

# mklv -y lv3 -t jfs2 -a im test1vg 10 hdisk5

lv3

# lslv lv3

LOGICAL VOLUME:lv3                    VOLUME GROUP:test1vg

LV IDENTIFIER:00c5e9de00004c0000000107a5b596ab.4 PERMISSION:read/write

VG STATE:active/complete        LV STATE:closed/syncd

TYPE:jfs2                   WRITE VERIFY:off

MAX LPs:512                    PP SIZE:512 megabyte(s)

COPIES:1                      SCHED POLICY:parallel

LPs:10                     PPs:            10

STALE PPs:0                      BB POLICY:relocatable

INTER-POLICY:minimum                RELOCATABLE:yes

INTRA-POLICY:inner middle           UPPER BOUND:    32

MOUNT POINT:N/A                    LABEL:无

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:NO

 

在示例 12 中,我们使用 mklv 命令在卷组 test1vg 中创建一个名为 lv4 的逻辑卷,其类型为 sysdump 并具有两个逻辑分区,每个逻辑分区分别有三个位于三个不同磁盘(hdisk5、hdisk6 和 hdisk7)中心的副本;此逻辑卷的标签为 demo-label,最多可以有五个逻辑分区。

示例 12 使用 mklv 命令

# mklv -y lv4 -t sysdump -a c -e x -c3 -L demo-label -x5 test1vg 2 hdisk5 hdisk6 hdisk7

lv4

# lslv lv4

LOGICAL VOLUME:lv4                    VOLUME GROUP:test1vg

LV IDENTIFIER:00c5e9de00004c0000000107a5b596ab.5 PERMISSION:read/write

VG STATE:active/complete        LV STATE:closed/syncd

TYPE:sysdump                WRITE VERIFY:off

MAX LPs:5                    PP SIZE:512 megabyte(s)

COPIES:3                      SCHED POLICY:parallel

LPs:2                     PPs:            6

STALE PPs:0                      BB POLICY:relocatable

INTER-POLICY:maximum                RELOCATABLE:yes

INTRA-POLICY:center                 UPPER BOUND:    32

MOUNT POINT:N/A                    LABEL:demo-label

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:NO

 

在示例 13 中,我们使用 mklv 命令在卷组 test1vg 中创建一个名为 lv5 的逻辑卷,其类型为 jfs2 并具有三个逻辑分区,每个分区分别有两个位于不同磁盘上的固定 (pinned) 副本,那两个磁盘上的读/写操作顺序地进行,启用了写校验,并将 I/O 操作序列化。

示例 13 使用 mklv 命令

# mklv -y lv5 -t jfs2 -c2 -rn -bn -ds -vy -oy test1vg 2 hdisk5 hdisk6

lv5

# lslv lv5

LOGICAL VOLUME:lv5                    VOLUME GROUP:test1vg

LV IDENTIFIER:00c5e9de00004c0000000107a5b596ab.6 PERMISSION:read/write

VG STATE:active/complete        LV STATE:closed/syncd

TYPE:jfs2                   WRITE VERIFY:on

MAX LPs:512                    PP SIZE:512 megabyte(s)

COPIES:2                      SCHED POLICY:sequential

LPs:3                     PPs:            6

STALE PPs:0                      BB POLICY:non-relocatable

INTER-POLICY:minimum                RELOCATABLE:no

INTRA-POLICY:middle                 UPPER BOUND:    32

MOUNT POINT:N/A                    LABEL:无

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:YES

 

删除逻辑卷

rmlv 命令用于删除逻辑卷。???ü??仅删除逻辑卷,但不删除其他实体,例如使用该逻辑卷的文件系统或分页空间。

在示例 14 中,我们提供了使用 rmlv 删除逻辑卷的示例,如下所示:

    • lsvg -l test1vg 显示 test1vg 中包含的所有 LV。
    • rmlv lv7 提示用户确认,然后删除 lv7。
    • lslv -l lv1 显示 lv1 的位于 hdisk5、hdisk6 和 hdisk7 上的物理分区。
    • rmlv -p hdisk7 lv1 尝试删除 lv1 的位于 hdisk7 上的分区并提示用户确认。由于 lv1 已打开,该操作无法执行。
    • umount /fs1 关闭 lv1。
    • rmlv -p hdisk7 lv1 尝试删除 lv1 的位于 hdisk7 上的分区,提示用户确认,并成功完成。
    • lslv -l lv1 确认 lv1 的位于 hdisk7 上的物理分区已删除。

示例 14 删除逻辑卷

# lsvg -l test1vg

test1vg:

LV NAME             TYPE       LPs   PPs   PVs  LV STATE      MOUNT POINT

lv1                 jfs2       3     9     3    open/syncd    /fs1

lv2                 jfs2       2     4     2    closed/syncd  /fs2

logggg              jfs2log    2     2     1    open/syncd    N/A

lv3                 jfs2       10    10    1    closed/syncd  N/A

lv4                 sysdump    2     6     3    closed/syncd  N/A

lv5                 jfs2       3     6     2    closed/syncd  N/A

lv6                 jfs2       2     4     2    closed/syncd  N/A

lv7                 jfs2       2     4     2    closed/syncd  N/A

# rmlv lv7

Warning, all data contained on logical volume lv7 will be destroyed.

rmlv:Do you wish to continue? y(es) n(o)? y

rmlv:Logical volume lv7 is removed.

# lslv -l lv1

lv1:/fs1

PV                COPIES        IN BAND       DISTRIBUTION

hdisk5            003:000:000   100%          000:003:000:000:000

hdisk6            003:000:000   100%          000:003:000:000:000

hdisk7            003:000:000   100%          000:003:000:000:000

# rmlv -p hdisk7 lv1

0516-914 rmlv:Warning, all data belonging to logical volume

lv1 on physical volume hdisk7 will be destroyed.

rmlv:Do you wish to continue? y(es) n(o)? y

0516-1008 rmlv:Logical volume lv1 must be closed.If the logical

volume contains a filesystem, the umount command will close

the LV device.

# umount /fs1

# rmlv -p hdisk7 lv1

0516-914 rmlv:Warning, all data belonging to logical volume

lv1 on physical volume hdisk7 will be destroyed.

rmlv:Do you wish to continue? y(es) n(o)? y

# lslv -l lv1

lv1:/fs1

PV                COPIES        IN BAND       DISTRIBUTION

hdisk5            003:000:000   100%          000:003:000:000:000

hdisk6            003:000:000   100%          000:003:000:000:000

 

增加逻辑卷的大小

可以使用 extendlv 命令将额外的逻辑分区添加到已经存在的逻辑卷。缺省情况下,逻辑卷在扩展时将保留其特征。可以使用标志来仅更改要添加的分区的这些特征。整个卷组的初始特征将保留不变。可以指定一个或多个磁盘,这些磁盘将容纳新定义的分区。不能超出为该卷组定义的最大分区数量。还可以指定块,其大小以 KB、MB 或 GB 为单位。系统将自动确定满足请求所需要的最小分区数量。

在示例 15 中,我们使用 extendlv 命令,通过三个位于 hdisk5 和 hdisk6 内边缘的逻辑分区扩展逻辑卷 lv1。

示例 15 使用 extendlv 命令

# lslv -l lv1

lv1:/fs1

PV                COPIES        IN BAND       DISTRIBUTION

hdisk5            003:000:000   100%          000:003:000:000:000

hdisk6            003:000:000   100%          000:003:000:000:000

# extendlv -a ie -ex lv1 3 hdisk5 hdisk6

# lslv -l lv1

lv1:/fs1

PV                COPIES        IN BAND       DISTRIBUTION

hdisk5            006:000:000   50%           000:003:000:000:003

hdisk6            006:000:000   50%           000:003:000:000:003

 

复制逻辑卷

可以将逻辑卷的内容复制到新的或已经存在的逻辑卷。为了保留数据完整性,应该确保目标逻辑卷的大小至少等于源逻辑卷的大小。

下面的示例演示了如何使用 cplv 命令将逻辑卷 lv1 复制到 dumpvg 卷组中名为 lv8 的逻辑卷:

cplv -v dumpvg -y lv8 lv1 

 

创建逻辑卷的副本

可以使用 mklvcopy 命令增加逻辑分区的副本数量。逻辑卷将保留其特征。可以手动或自动对新副本进行同步。

在示例 16 中,我们使用 mklvcopy 命令创建并同步逻辑卷 lv1 的每个逻辑分区的一个额外副本。新创建的副本将位于 hdisk7 上。

示例 16 使用 mklvcopy 创建并同步逻辑分区的额外副本

# lslv -m lv1

lv1:/fs1

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0029 hdisk5            0029 hdisk6

0002  0030 hdisk5            0030 hdisk6

0003  0031 hdisk5            0031 hdisk6

0004  0110 hdisk5            0111 hdisk6

0005  0110 hdisk6            0112 hdisk5

0006  0111 hdisk5            0112 hdisk6

0007  0113 hdisk5            0113 hdisk6

0008  0114 hdisk5            0114 hdisk6

0009  0115 hdisk5            0115 hdisk6

# mklvcopy -k lv1 3 hdisk7 &

# lslv -m lv1

lv1:/fs1

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0029 hdisk5            0029 hdisk6            0110 hdisk7

0002  0030 hdisk5            0030 hdisk6            0111 hdisk7

0003  0031 hdisk5            0031 hdisk6            0112 hdisk7

0004  0110 hdisk5            0111 hdisk6            0113 hdisk7

0005  0110 hdisk6            0112 hdisk5            0114 hdisk7

0006  0111 hdisk5            0112 hdisk6            0115 hdisk7

0007  0113 hdisk5            0113 hdisk6            0116 hdisk7

0008  0114 hdisk5            0114 hdisk6            0117 hdisk7

0009  0115 hdisk5            0115 hdisk6            0118 hdisk7

 

更改逻辑卷的特征

可以使用 chlv 命令更改已经存在的逻辑卷的特征。如果更改了影响物理分区位置的属性,这些属性不会影响已经存在的分区,而是仅影响将在随后添加或删除的分区。如果所做的更改影响到驻留在该逻辑卷上的文件系统,则还必须更新文件系统特征。

在示例 17 中,我们使用 chlv 命令将逻辑卷 lv1 的最大逻辑分区数量更改为 1000,将 I/O 操作的调度策略更改为“并行/循环 (parallel /round-robin)”。

示例 17 更改逻辑卷特征

# lslv lv1

LOGICAL VOLUME:lv1                    VOLUME GROUP:test1vg

LV IDENTIFIER:00c5e9de00004c0000000107a5b596ab.1 PERMISSION:read/write

VG STATE:激活/complete        LV STATE:opened/syncd

TYPE:jfs2                   WRITE VERIFY:off

MAX LPs:512                    PP SIZE:512 megabyte(s)

COPIES:3                      SCHED POLICY:parallel

LPs:9                     PPs:            27

STALE PPs:0                      BB POLICY:relocatable

INTER-POLICY:minimum                RELOCATABLE:yes

INTRA-POLICY:inner edge             UPPER BOUND:    32

MOUNT POINT:/fs1                   LABEL:None

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:NO

# chlv -x 1000 -d pr lv1

# lslv lv1

LOGICAL VOLUME:lv1                    VOLUME GROUP:test1vg

LV IDENTIFIER:00c5e9de00004c0000000107a5b596ab.1 PERMISSION:read/write

VG STATE:active/complete        LV STATE:closed/syncd

TYPE:jfs2                   WRITE VERIFY:off

MAX LPs:1000                    PP SIZE:512 megabyte(s)

COPIES:3                      SCHED POLICY:parallel/round robin

LPs:9                     PPs:            27

STALE PPs:0                      BB POLICY:relocatable

INTER-POLICY:minimum                RELOCATABLE:yes

INTRA-POLICY:inner edge             UPPER BOUND:    32

MOUNT POINT:/fs1                   LABEL:None

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:NO

 

拆分逻辑卷

可以使用 splitlvcopy 命令将至少有每个逻辑分区的两个副本的逻辑卷拆分为两个不同的逻辑卷。新创建的逻辑卷将具有与原始逻辑卷相同的特征。建议关闭要拆分的逻辑卷。如果原始逻辑卷包含文件系统,则必须将新创建的逻辑卷中的数据作为不同的文件系统进行访问。

在示例 18 中,我们使用 splitlvcopy 命令将一个逻辑卷拆分为两个副本,如下所示(不保留文件系统数据):

  • lsvg -l testvg 显示 testvg 包含逻辑卷 testlv,其类型为 jfs2 并将 /test 作为安装点。
  • lslv -m testlv 显示 testlv 具有三个分别位于 hdisk5、hdisk6 和 hdisk7 上的镜像副本。
  • splitlvcopy -y copylv testlv 2 尝试拆分该逻辑卷并提示用户确认,因为 testlv 是打开的,数据可能被破坏。
  • umount /test 关闭逻辑卷 testlv。
  • splitlvcopy -y copylv testlv 2 拆分该逻辑卷。
  • lsvg -l testvg 显示新的逻辑卷 copylv 已创建完成。
  • lslv -m testlv 显示 testlv 现在只有两个镜像副本,分别位于 hdisk5 和 hdisk6 上。
  • lslv -m copylv 显示 copylv 包含 hdisk7 中的分区。
  • lslv copylv 显示了新创建的逻辑卷 copylv 的特征。请注意,该逻辑卷没有安装点。
  • crfs -v jfs2 -d /dev/copylv -m /copy 为 copylv 创建文件系统结构。请注意,此命令不会破坏任何文件系统数据。

如果希望保留原始逻辑卷上的文件系统数据,则不应该在上一步中运行 crfs 命令,而是执行下列命令:

    • mkdir /copy 创建副本目录。
    • mount /dev/copylv /copy 安装复制的文件系统。
    • 手动编辑 /etc/filesystems 文件,并为 /copy 安装点添加一个条目。

示例 18 使用 splitlvcopy

 
# lsvg -l testvg

testvg:

LV NAME             TYPE       LPs   PPs   PVs  LV STATE      MOUNT POINT

testlv              jfs2       3     9     3    open/syncd    /test

loglv00             jfs2log    1     1     1    open/syncd    N/A

# lslv -m testlv

testlv:/test

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0056 hdisk5            0056 hdisk6            0056 hdisk7

0002  0057 hdisk5            0057 hdisk6            0057 hdisk7

0003  0058 hdisk5            0058 hdisk6            0058 hdisk7

# splitlvcopy -y copylv testlv 2

splitlvcopy:WARNING!The logical volume being split, testlv, is open.

Splitting an open logical volume may cause data loss or corruption

and is not supported by IBM.IBM will not be held responsible for

data loss or corruption caused by splitting an open logical volume.

Do you wish to continue? y(es) n(o)? n

# umount /test

# splitlvcopy -y copylv testlv 2

copylv

# lsvg -l testvg

testvg:

LV NAME             TYPE       LPs   PPs   PVs  LV STATE      MOUNT POINT

testlv              jfs2       3     6     2    closed/syncd  /test

loglv00             jfs2log    1     1     1    closed/syncd  N/A

copylv              jfs2       3     3     1    closed/syncd  N/A

# lslv -m testlv

testlv:/test

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0056 hdisk5            0056 hdisk6

0002  0057 hdisk5            0057 hdisk6

0003  0058 hdisk5            0058 hdisk6

# lslv -m copylv

copylv:N/A

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0056 hdisk7

0002  0057 hdisk7

0003  0058 hdisk7

# lslv copylv

LOGICAL VOLUME:copylv                 VOLUME GROUP:testvg

LV IDENTIFIER:00c478de00004c0000000107c4419ccf.3 PERMISSION:read/write

VG STATE:active/complete        LV STATE:closed/syncd

TYPE:jfs2                   WRITE VERIFY:off

MAX LPs:512                    PP SIZE:256 megabyte(s)

COPIES:1                      SCHED POLICY:parallel

LPs:3                     PPs:            3

STALE PPs:0                      BB POLICY:relocatable

INTER-POLICY:minimum                RELOCATABLE:yes

INTRA-POLICY:middle                 UPPER BOUND:    32

MOUNT POINT:N/A                    LABEL:/test

MIRROR WRITE CONSISTENCY:on/ACTIVE

EACH LP COPY ON A SEPARATE PV ?:yes

Serialize IO ?:NO

# crfs -v jfs2 -d /dev/copylv -m /copy

File system created successfully.

786204 kilobytes total disk space.

New File System size is 1572864


 

删除逻辑卷的副本

可以使用 rmlvcopy 命令删除逻辑卷的逻辑分区副本。

在示例 19 中,我们使用 rmlvcopy 命令删除逻辑分区 testlv 的一组副本,如下所示:

lslv -m testlv 显示 testlv 具有三个分别位于 hdisk5、hdisk6 和 hdisk7 上的镜像副本。

rmlvcopy testlv 2 hdisk6 删除位于 hdisk6 上的副本并保留两个镜像副本。

lslv -m testlv 显示 testlv 现在有两个位于 hdisk5 和 hdisk7 上的镜像副本。

示例 19 使用 rmlvcopy

# lslv -m testlv

testlv:/test

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0056 hdisk5            0056 hdisk6            0059 hdisk7

0002  0057 hdisk5            0057 hdisk6            0060 hdisk7

0003  0058 hdisk5            0058 hdisk6            0061 hdisk7

# rmlvcopy testlv 2 hdisk6

# lslv -m testlv

testlv:/test

LP    PP1  PV1               PP2  PV2               PP3  PV3

0001  0056 hdisk5            0059 hdisk7

0002  0057 hdisk5            0060 hdisk7

0003  0058 hdisk5            0061 hdisk7

 

LVM 命令总结

所有 LVM 命令在 SMIT 中都有对应的菜单。

表 2 提供了 LVM 命令的摘要、它们的对应 SMIT 快速路经和每个命令的简要描述。

表 2 LVM 命令摘要

命令SMIT 快速路经> 简要说明
chpvsmit chpv更改物理卷的特征。
lspvsmit lspv列出有关物理卷的信息。
migratepvsmit migratepv将物理分区从一个物理卷迁移到其他物理卷。
mkvgsmit mkvg创建卷组。
lsvgsmit lsvg列出有关卷组的信息。
reducevgsmit reducevg从卷组中删除某个物理卷。
chvgsmit chvg更改卷组的特征。
importvgsmit importvg将卷组的定义导入系统。
exportvgsmit exportvg从系统中删除某个卷组的定义。
varyonvgsmit varyonvg激活某个卷组。
varyoffvgsmit varyoffvg禁用某个卷组。
mklvsmit mklv创建逻辑卷。
lslvsmit lslv列出有关某个逻辑卷的信息。
chlvsmit chlv更改逻辑卷的特征。
rmlvsmit rmlv删除逻辑卷。
extendlvsmit extendlv扩展逻辑卷。
mklvcopysmit mklvcopy创建逻辑卷的副本。
rmlvcopysmit rmlvcopy删除逻辑卷的副本。
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送


 

级别: 初级

王 华忠, 软件工程师, IBM
杨 国梁, 软件工程师, IBM
 

2009 年 10 月 29 日

本文是 Unix/Linux 系统管理自动化系列中的一篇文章,主要介绍了内存管理所涉及的命令,并通过编写自动化脚本实现了内存管理与监控的自动化

内存是 Unix/Linux 内核所管理的最为重要的资源之一,内存管理是系统管理中非常重要也是最复杂的的部分。系统管理员需要掌握内存管理的基本工作原理以及使用合适的工具与策略监控内存的工作状态。 本文将分别阐述 AIX 和 Linux 系统中所涉及到的内存监控的方法,并对其中涉及到的内核内存管理的原理做初步的说明。

AIX 内存管理与监控

内存管理概述

内存管理在不同的操作系统中会有不同的实现。AIX 系统使用 VMM(Virtual Memory Manager) 实现物理内存的管理,处理应用程序的内存分配请求与内存回收。

内存和交换空间一般都是通过页面来进行分配和管理,VMM 将所有的内存段划分为若干个页面,Power4 芯片支持 4K,64K,和 16M 大小的虚拟内存页, Power5 芯片支持 4K,64K,16M,16G 大小的虚拟内存页,每个页面的缺省大小是 4KB。虚拟内存页面越大,对需要大内存块的应用程序可以起到优化作用,主要是提高 TLB 的命中率。

当我们执行应用程序的时候,内存中的页面会被逐渐的占用,这里我们设计两个重要的参数: Minfree( 最小空闲页面的大小 ) 和 Maxfree( 最大空闲页面的大小 )。当空闲的内存达到 Minfree 大小的时候, VMM 的调页算法将被唤醒,将内存中的页面转移到交换空间中, 知道空闲内存达到 Maxfree,才停止调页。

上面主要是对 AIX 内存管理中所涉及到的的基本概念做了简单的介绍说明,对于任何与内存相关的操作,了解这些概念都是非常必要的。

系统管理员在进行正确的优化或者问题发生之前,必须首先监视系统,使用合适的工具捕获基准数据,并且知道如何进行分析工作。下面笔者将介绍 AIX 系统所提供的工具来监控系统内存的使用情况。

内存调整命令

与其他的子系统相比,内存调整更为困难,但同时收到的效果往往更加显著,特别是在那些尚未对各种内存参数进行优化的运行环境中。系统管理员可以通过 vmo 命令动态的调整内存参数,进行内存性能优化方面的各种实践。

vmo

Vmo 命令用来管理虚拟内存可调试的参数。例如如果我们发现空闲内存不足, 可以使用下面的命令增加 Minfree 和 Maxfree 参数:


清单 1. 使用 vmo 命令调整空闲的虚拟内存最小和最大值
				
 # vmo – o minfree=1024 – o maxfree=30070 
 Setting maxfree to 30070 
 Setting minfree to 1024 

注:-p 参数能够使修改永久生效,而且立即生效,不需要重启,下次重启设置仍然有效。例如 vmo -p – o minfree=1024 命令能够永久设置空闲的虚拟内存值为 1024

一般情况下,minfree 和 maxfree 的设定值可以通过下面的公式计算得到:

maxfree=minnum(memory/128,128)

minfree=maxfree/8

-a 参数能够显示当前所有的内存参数设置,之后系统管理员可以对其中的任何参数进行调整,在此必须说明的是:对内存参数的任何微小改动都有可能造成系统运行的不稳定,所以系统管理员做的任何修改,都必须非常慎重并且对可能造成的影响有所了解。 上文提到的两个关键参数 minfree 和 maxfree 也包含于下面的列表中。


清单 2. vmo 命令所能调整的内存参数
				
 # vmo -a 
       ams_loan_policy = n/a 
   force_relalias_lite = 0 
     kernel_heap_psize = 65536 
          lgpg_regions = 0 
             lgpg_size = 0 
       low_ps_handling = 1 
               maxfree = 30070 
               maxperm = 902102 
                maxpin = 845450 
               maxpin% = 80 
         memory_frames = 1048576 
         memplace_data = 2 
  memplace_mapped_file = 2 
 memplace_shm_anonymous = 2 
    memplace_shm_named = 2 
        memplace_stack = 2 
         memplace_text = 2 
 memplace_unmapped_file = 2 
               minfree = 1024 
               minperm = 30070 
              minperm% = 3 
             nokilluid = 0 
               npskill = 1024 
               npswarn = 4096 
             numpsblks = 131072 
       pinnable_frames = 868968 
   relalias_percentage = 0 
                 scrub = 0 
              v_pinshm = 0 
      vmm_default_pspa = 0 
 wlm_memlimit_nonpg = 1 

其中 maxperm, maxpin%, minperm, minpin% 值得我们特别的注意。 AIX 中, 文件型内存一般占用系统内存很少的一部分,大部分的内存被用来做计算型内存,其中一个主要的应用为 oracle SGA,所使用的内存为 pinned memory. 我们通常希望把 oracle SGA 保持在内存内,同时需要将文件系统缓存比例控制到一定范围内。 这时我们根据系统内存的大小,调整 maxpin%,maxperm,minpin%,minperm 的值。 minperm – 文件型内存最小值 minpin - 计算型内存最小值 minpin% - 计算型内存占总的系统内存百分比的最小值 maxperm – 文件型内存最大值 maxpin - 计算型内存最大值 maxpin% - 计算型内存占总的系统内存百分比的最大值

计算型内存和文件型内存的调整需要遵循下面的一些简单原则:

  1. 计算型内存和文件型内存所占系统内存百分比之和要小于 100%。
  2. 计算型内存的设置要合理,留出足够的空间给操作系统。 原因在于操作系统同样会占用一部分计算型内存,系统资源紧张时,操作系统会抢占应用程序所占计算型内存,影响程序的正确运行。
  3. 数据库服务器上,文件型内存不需要太多的空间。 通常我们会遇到的 paging space 占用率过高就有可能设置了过高的文件型内存。

进程空间内存监控命令

系统管理员有时需要对某个特定的进程进行跟踪调试,这时就需要一些命令能够动态的显示每个进程内存占用情况的实时信息。ps 是我们经常使用到的能够解决这方面问题的命令。事实上,这个命令的使用非常简单,但是得到的数据非常有效。

ps

几乎所有的 Unix/Linux 分发版都包含了这一工具,ps 提供的简洁而有效的信息能够允许系统管理员快速地对性能问题进行故障排除,不足之处就是其并不适合用于进行历史趋势研究与分析。 ps 一般用来查看系统中运行的进程,事实上,ps 命令同样可以帮助管理员对可能的内存瓶颈进行故障排除。

下面我们使用 ps 显示系统中每个活动进程的内存使用情况


清单 3. ps 命令输出当前内存状况
				
 # ps aux 
 USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND 
 root      53274 10.7  0.0  384  384      - A    03:17:33 453:29 wait 
 root       8196 10.7  0.0  384  384      - A    03:17:33 453:28 wait 
 root      49176 10.7  0.0  384  384      - A    03:17:33 453:20 wait 
 root      57372 10.7  0.0  384  384      - A    03:17:33 453:06 wait 

其中 rss 标示每个进程的实际内存使用量,这是我们需要重点查看的属性,代表着这个进程真正占用内存的多少。通过观察 rss 的数据信息,我们能够清楚的获得此进程的内存使用变化情况。

在极端情况下,系统管理员可以通过 kill 命令关闭某些内存占用率过高的进程来确保系统的正常运行。

同时我们也可以通过观察 rss 段的数据信息来检查进程存不存在内存泄漏现象。

系统内存监控命令

系统管理员除了需要对特定的进程内存占用情况跟踪观察外,更多的时候需要监控整个系统的内存使用信息。 Vmstat 和 svmon 能够帮助我们轻易的获得这方面的数据。

vmstat

vmstat(Virtual Memory Statistics) 命令能够帮助我们监控内核进程,虚拟内存,磁盘和处理器统计信息。 它是对系统的整体情况进行统计,不足之处就是无法对某个特定进程做分析。 Vmstat 的输出可以是以百分比表示的平均值,也可以是其统计的总和。

如果没有指定任何的参数,vmstat 将会输出系统从开机启动之后所有的虚拟内存活动。

我们经常使用类似 vmstat 5 5 的命令参数,代表着表示在 5 秒时间做 5 次采样。


清单 4. vmstat5 5 命令监控内存资源使用状况
				
 System Configuration: lcpu=4 mem=1024MB 

 kthr    memory              page              faults        cpu 
 ----- ----------- ------------------------ ------------ ----------- 
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa 
 0  0 208817 44828   0   0   0   0    0   0   3   60 220  0  0 99  0 
 0  0 208817 44828   0   0   0   0    0   0   2   27 225  0  0 99  0 
 0  0 208817 44828   0   0   0   0    0   0   4   29 219  0  0 99  0 

下面将对输出的结果中涉及到的内存管理相关字段进行说明:

memory:物理内存和虚拟内存的使用信息。如果虚拟内存被访问,那么将被认为是活动的。.

  • avm 活动的虚拟内存页面
  • fre 空闲内存列表的大小。注:很大一部分的实际内存都被用来作为文件系统的缓存用来加快应用程序的运行速度,所以空闲内存大小一般保持在很小的数值。

page:缺页异常和分页活动信息。此数值是间隔时间内的平均值,以秒为单位。

  • re 页面调度输入 / 输出列表
  • pi 从页面空间输入的页面
  • po 写入页面空间的页面
  • fr 释放的页面
  • sr 通过页面替换算法扫描页面的频率
  • cy 页面替换算法运行的时钟周期

内存的瓶颈问题我们可以通过 sr( 页面扫描频率 ) 来观察,如果扫描频率过高,始终维持高于 200 页说明存在内存瓶颈,同样的道理如果 page 项中的 pi( 调入的页面数 ) 和 po( 调出的页面数 ) 不为 0,说明系统必须经常性被动的通过页面的调入调出程序来维持系统的稳定运行,表明也有可能存在内存瓶颈。解决的方法可以通过简单的增加内存或者优化设计应用程序来减少对内存的使用率。

svmon

svmon 命令提供了一个更加深入的内存使用情况的分析,比起 vmstat 和 ps 命令,它带有更多的信息量。-i 选项能够间隔性的捕获一个内存状态的快照。

svmon 命令可以生成 9 种不同的报告结果,这里我们选用比较有代表性的带 -G 标志来监视内存全局使用情况。


清单 5. svmon 命令显示当前内存全局使用状况
				
 # svmon -G 
               size       inuse        free         pin     virtual 
 memory       262144      208128       54016       72891      163644 
 pg space     131072        1912 

               work        pers        clnt       other 
 pin           62497           0           0       10394 
 in use       163644           0       44484 

 PageSize   PoolSize       inuse        pgsp         pin     virtual 
 s    4 KB         -      128032        1912       24667       83548 
 m   64 KB         -        5006           0        3014        5006 

  • size 标示了实际内存的页面数
  • inuse 正在使用中的页面数
  • free 空闲的页面数
  • pin 物理内存中固定的页面数
  • virtual 虚拟内存使用的页面数

这里 svmon 只是提供了更加精确的结果,具体的内存调试优化可以参照以上 vmo, ps 和 svmstat 命令中所涉及到的方法。





 
回页首


Linux 内存管理与监控

Linux 系统内存监控命令

Linux 同样具有众多与内存管理相关的命令,可以帮助我们快速获得内存使用信息。 如 vmstat,ps,AIX 中我们已经做了介绍,在此不再赘述。 free 是 Linux 系统所具有的十分小巧简介的命令,这也是 Linux 上常用的查看内存的方式。

Free

与 AIX 系统中的 svnmon 命令类似,free 提供了内存全局使用情况。


清单 6. free 命令显示当前内存使用信息
				
 # free 
             total       used       free     shared    buffers     cached 
 Mem:       4166976    4063552     103424          0     875712    2694592 
 -/+ buffers/cache:     493248    3673728 
 Swap:      1052096        768    1051328 

下面是对各个输出字段的详细说明

  • total 总计物理内存的大小
  • used 已经使用的内存大小
  • free 空闲的内存大小
  • shared 多个进程共享的内存大小
  • buffers 块设备缓存的大小
  • cached 页面缓存的大小

free 命令所提供的数据不如 vmstat 所得到的详细,但是能够提供给我们最初和最直接的参考,指明我们需要仔细检查的方向,比如如果 shared memory 数据过大,我们就能很容易发现有些程序请求分配了过多的共享内存池,配合其他的管理命令,找到具体的某个进程消耗了过多的共享内存,从而解决问题。





 
回页首


内存监控自动化实现

合理的利用以上介绍的众多内存管理工具,系统管理员可以自己编写一些脚本自动化的监控内存使用情况,记录内存使用信息,设置警戒点,甚至阻止异常程序的内存申请行为,将系统从灾难中恢复过来。

下面是一个内存监控自动化脚本实现的例子 MemMonitor.perl。 这个脚本在使用内存达到或超过实际内存的 75% 的时候会打印出内存不足的警告。 在使用内存达到或超过实际内存的 90% 的时候,将打印出内存即将用尽的警告,并且关掉当前占用内存最高的进程。

同时我们通过将此脚本添加到 cron 服务中来实现内存的监控自动化。

脚本在 AIX5.3 和 SLES11 上测试通过。


清单 7. MemMonitor.perl
				
 #!/usr/bin/perl 
 use strict; 

 # 打印此脚本使用信息和输出说明。

 ################################################################ 
 # Output the usage of this perl script 
 ################################################################ 
 sub usage 
 { 
    print "memmonitor: Monitor system memory usage\n"; 
    print "1. if used memory is more than 75% of total memory, memmonitor\n"; 
    print "will output one warning message per minites.\n"; 
    print "2. if used memory is more than 90% of total momory, memmonitor\n"; 
    print "will kill the processes that occupied the most memory untill\n"; 
    print "used memory is less than 75% of total memory.\n\n"; 

    return 0; 
 } 

 usage 

 my $total_mem; 
 my $used_mem; 
 my $next_line = 0; 
 my @rc; 
 my $rate; 

 # $total_mem 和 $used_mem 变量分别代表了总计实际内存大小和已经使用的内存大小
 rc = `vmstat`; 
 foreach ( @rc ) { 
    if ( $next_line ) { 
      my @value = split /\s+/, $_; 
         $used_mem = @value[3] * 4; 
         $next_line = 0; 
         last; 
     } elsif ( /^.*mem=(\d+)MB$/ ) { 
         $total_mem = $1 * 1024; 
     } elsif ( /^.*avm.*$/ ) { 
         $next_line = 1; 
     } 
 } 

 # 这段代码使用了 vmstat 命令得到系统内存状态信息,并对结果进行逐行解析,得到各个字段的数据。

 if ( $total_mem ) { 
    $rate = $used_mem / $total_mem; 
 } 

 # 计算得到了当前全局内存使用率

 if ( $rate > 0.75 ) { 
    print "Warning: Memory is not enough\n"; 
 } 

 # 如果内存使用率大于 0.75, 将打印出警告信息。

 if ( $rate > 0.9 ) { 
    my $line_count = 0; 
    my @output = `ps aux | head -1;ps aux | sort -rn +5`; 
    foreach ( @output ) { 
        if ( $line_count ) { 
            my @killed_process = split /\s+/,$_; 
            print "Warning: Out of memory. Kill process: @killed_process[1]\n"; 
            # 发送警告信息给 root 用户,保存程序运行记录。
`echo "Process @killed_process[1] has been killed because of unlimited memory \
allocation" | mail -s "Out of memory" root` 

            `kill -11 @killed_process[1]`; 
            last; 
        } 
        $line_count = $line_count + 1; 
    } 

 # 如果内存使用率大于 0.9,脚本将调用 ps 命令并且找出内存使用率最高的进程,打印出将要杀掉进程的警告信息,
 #杀掉内存使用率最高的进程。 此过程将循环进行知道内存占用率低于 0.9 
 } 


清单 8. root 用户警告邮件内容
				
 From test@test.ibm.com  Tue July 31 13:01:12 2009 
 X-Original-To: root 
 Delivered-To: root@test.ibm.com 
 Date: Tue, 31 July 2009 13:01:11 -0400 
 To: root@test.ibm.com 
 Subject: Out of memory 
 User-Agent: Heirloom mailx 12.2 01/07/07 
 MIME-Version: 1.0 
 Content-Type: text/plain; charset=us-ascii 
 Content-Transfer-Encoding: 7bit 
 From: test@test.ibm.com

 ------------------------------------------------------------ 

 Process 10482 has been killed because of unlimited memory allocation 

上面的脚本 MemMonitor.perl 实现了自动监控内存使用率,并对内存占用率比较高的时候分别作了处理,能够保障内存子系统的稳定运行。 下面我们将借助系统的 cron 服务每间隔设定的一段时间自动调用上面的脚本,实现内存监控管理的完全自动化。

使用命令“crontab – e”编辑 crontab,添加一条自动运行脚本 MemMonitor.perl 的项目:


清单 9. 添加为 cron 服务
				
 */2 * * * *  /tmp/MemMonitor.perl 2>&1 >> /tmp/memmonitor.log 

此时 MemMonitor.per 将被每两分钟自动执行一次,并将输出结果保存在 /tmp/memmonitor.log 中。





 
回页首


总结

本文详细介绍了 Unix/Linux 上常用的内存管理与监控的命令,并通过编写脚本实例应用内存管理的命令,实现了内存管理的自动化,当内存使用率过高的时候,给出警告信息,通过关闭内存占用率高的进程来确保了系统全局的稳定运行,并对其中所做的操作做了日志记录,方便了系统管理员监测并调试系统内存故障。