磁盘上的数据维护是任何系统管理员的常见任务。根据我的经验,数据移动就是一项频繁执行的任务。数据移动可能由您磁盘上的热点所导致,一种快速修复方法是将一些逻辑卷转移到另一个磁盘上,以缓解阻塞。在这种情况下,migratelp 命令是您最值得信赖的朋友。当遇到有故障的磁盘或者需要将数据从一个磁盘迁移到另一个磁盘时,可以使用 migratepv 令或创建一个镜像副本,并且您不会受限于一种方法。对于原始卷组 (VG),在向 VG 添加一个磁盘时,您可能遇到因数(factoring)问题。但是,通过理解 VG 的特征,可以更改因数。在本文中,我们将用一些示例讨论这些常见的磁盘维护任务。

David Tansley, 系统管理员, Ace Europe

//ibm.com/developerworks/i/p-dtansley.jpgDavid Tansley 是一位自由作家。他有 15 年 UNIX 系统管理经验,最近 8 年使用 AIX。他喜欢打羽毛球和观赏一级方程式赛车,但是最喜欢与妻子一起开着 GSA 摩托车旅行。


developerWorks 投稿作者

2013 年 4 月 15 日

在谈到磁盘维护时,熟悉磁盘相关属性的一些常见缩略语很有好处,因为它可让谈话变得更简练。

  • VG:卷组
  • LV:逻辑卷
  • LP:逻辑分区
  • PP:物理分区
  • PV:物理卷(磁盘)

许多时候,您刚到达办公室,就会听到所有用户和支持人员开始抱怨系统运行缓慢。常规的快速检查包括:

  • 处理器限制
  • 内存限制
  • 磁盘访问
  • 网络
  • 进程侵扰

执行一些性能测试后您可能得出结论,是磁盘访问、数据在磁盘上的分散性导致了访问阻塞。没有人喜欢这样。所以,让我们假设您已通过分析来自 filemontopasnmonlvmstat 等工具的输出,识别了磁盘上的热点。您需要将该数据移动到另一个磁盘,以缓解阻塞。另一个磁盘可能是一个新磁盘,更有可能是 VG 中一个未装满数据的现有磁盘。让我们通过两个场景,看看如何将数据从一个磁盘移动到另一个。但是,在此之前,最好了解一些命令,这样在查看 LV 和 PV 时就会很方便。

最重要的磁盘相关命令

以下是我认为您在执行数据迁移任务之前获取正确的信息,所需要知道的所有命令。

从一个 PV 获取信息

所关注磁盘的大小(以 MB 为单位)始终是需要知道的信息。假设磁盘名为 hdisk4,使用 getconf 命令查找大小:

# getconf DISK_SIZE /dev/hdisk4
9216

使用 lspv 命令提取磁盘信息。

lspv -l <hdiskx>

上面的命令列出 LV 和 LP,以及 PP 和文件系统的挂载点(如果适用)。

lspv -m <hdiskx>

上面的命令列出 PV、PP 编号、LV 和 LP 编号。

从一个 VG 获取信息

使用 lsvg 命令获取一个(或多个)PV 所在的 VG 的布局。

lsvg <vg_name>:

上面的命令列出了有关 VG 属性的一般信息,主要是 PP 大小、总空间、空闲空间和已用空间。

lsvg -l <vg_name>:

上面的命令列出了文件系统的类型、LP 和 PV,以及 LV 状态(打开还是关闭)和文件系统挂载点(如果适用)。

lsvg -p <vg_name>:

上面的命令列出了属于该 VG 的 PV,以及总 PP 空间和空闲 PP 空间。

从 LV 获取信息

可使用 lslv 命令获取有关 LV 的信息。

lslv -l <lv_name>:

上面的命令列出了 LV 所在的 PV。

lslv -m <lv_name>:

上面的命令列出了 LP、分区编号和 PV,这些信息适用于 LV 所在的所有 PV。

上述命令的输出为您提供了充分的信息来确定是否适合使用以下迁移技术执行数据迁移:

  • migratelp
  • migratepv
  • 磁盘镜像

在此演示中,我创建了小型文件系统,即小型 LV,因为我需要让输出尽可能的少。在现实中,正常应用程序的 LV 会很大。因此,LV 的 LP 清单会很长。一个技巧是打印出 LV 清单,然后使用一个标记笔确定要移动的 LP。


使用 migratelp 命令移动数据

如果需要移动 LP,也就是要将 LV 的一个部分从一个磁盘移动到另一个磁盘,那么可以使用 migratelp。您可指定一个或多个 LV 分段中您希望移动到另一个磁盘的部分。

LV 监视工具 lvmstat 的输出与您需要用于 migratelp 命令的输入格式很相似,这并不是巧合。

对于本演示,migratelp 命令的格式为:

migratelp <LV/LP> <destination_PV>

可能您希望移动的 LV 已建立镜像。这没有问题,只需选择您希望移动的副本即可。

假设我们拥有以下磁盘:

# lspv
hdisk1          00c23bed42b3afff                    None
hdisk2          00525c6a888e32cd                    vg00            active
hdisk3          00c23bed32883598                    None
hdisk0          00c23bed42b3aefe                    rootvg          active

我们认为 LV fslv00 的负担过重,这些负担可能源于磁盘读写。我们决定将另一个磁盘(也就是 VG vg00)放入该 LV 中,将 LV fslv00 的一部分迁移到新磁盘中,以缓解阻塞。首先,让我们看看磁盘 hdisk2fslv00 目前位于其中:

# lspv -l hdisk2
hdisk2:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                4       4       00..04..00..00..00    /devhold
loglv00               1       1       00..01..00..00..00    N/A
fslv01                4       4       00..04..00..00..00    /apps

现在,让我们看看实际的 VG, vg00

#  lsvg -l vg00
vg00:
LV NAME             TYPE       LPs     PPs     PVs  LV STATE      MOUNT POINT
loglv00             jfs2log    1       1       1    open/syncd    N/A
fslv00              jfs2       4       4       1    open/syncd    /devhold
fslv01              jfs2       4       4       1    open/syncd    /apps

我们现在可以看到,该 LV fslv00 位于一个磁盘上。现在将另一个磁盘 hdisk3 添加到 VG 上:

# extendvg vg00 hdisk3

确认该磁盘已添加,我们知道已经添加了该磁盘,因为我们在扩展 VG 时未遇到任何错误:

# lsvg -p vg00
vg00:
PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION
hdisk2            active            542         533         109..99..108..108..109
hdisk3            active            2187        2187        438..437..437..437..438

现在,让我们看看我们的 LV 布局。同样的,我们可以看到所有 LP 都在位于 hdisk2 上的 LV fslv00 之上:

#  lslv -m fslv00
fslv00:/devhold
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0111 hdisk2
0002  0112 hdisk2
0003  0113 hdisk2
0004  0114 hdisk2

现在将前两个 LP(即 00010002)从 fslv00 移动到新磁盘 hdisk3

# migratelp fslv00/1 hdisk3
migratelp: Mirror copy 1 of logical partition 1 of logical volume
        fslv00 migrated to physical partition 439 of hdisk3.
# migratelp fslv00/2 hdisk3
migratelp: Mirror copy 1 of logical partition 2 of logical volume
        fslv00 migrated to physical partition 440 of hdisk3.

上述两个 migratelp 命令的运行很正常。现在通过再次查询 fslv00 确认这些 LP 已在新磁盘上:

# lslv -m fslv00
fslv00:/devhold
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0439 hdisk3
0002  0440 hdisk3
0003  0113 hdisk2
0004  0114 hdisk2

和预期一样,该 LV 现在已分散在两个磁盘上:hdisk2hdisk3

可以通过列出两个 hdisk 的内容来进一步确认这一点,如下所示:

# lspv -l hdisk3
hdisk3:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                2       2       00..02..00..00..00    /devhold
# lspv -l hdisk2
hdisk2:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                2       2       00..02..00..00..00    /devhold
loglv00               1       1       00..01..00..00..00    N/A
fslv01                4       4       00..04..00..00..00    /apps

如果您在某一刻觉得迁移没有意义,不用担心,只需将它们迁移回来即可,如下所示:

# migratelp fslv00/1 hdisk2
migratelp: Mirror copy 1 of logical partition 1 of logical volume
        fslv00 migrated to physical partition 111 of hdisk2.
# migratelp fslv00/2 hdisk2
migratelp: Mirror copy 1 of logical partition 2 of logical volume
        fslv00 migrated to physical partition 112 of hdisk2.

现在,如果我们查询 hdisk3,就会发现 hdisk3 上的部分中应该没有 LV:

# lspv -l hdisk3

没有返回输出,这表明该磁盘上没有数据。

然而,对于 hdisk2,fslv00 的布局现在已完全还原到之前的状态:

# lspv -l hdisk2
hdisk2:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                4       4       00..04..00..00..00    /devhold
loglv00               1       1       00..01..00..00..00    N/A
fslv01                4       4       00..04..00..00..00    /apps

如果需要进一步确认,只需查询 LV 即可:

# lslv -m fslv00
fslv00:/devhold
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0111 hdisk2
0002  0112 hdisk2
0003  0113 hdisk2
0004  0114 hdisk2

镜像迁移

可通过许多方法移动数据。前面我们查看了 migratelp 命令。现在让我们看看磁盘镜像。在此演示中,想象我们有一个故障磁盘,需要将数据转移到新磁盘。我们装入了另一个磁盘,然后将 LV 镜像复制到新磁盘。完成镜像复制之后,将会删除原始副本。然后从 VG 中删除故障磁盘。我们假设已将一个磁盘装入 VG vg00 中。下一个任务是在新磁盘中创建这些 VG 的副本。

首先,让我们检查一下 VG vg00 的布局:

#  lsvg -l vg00
vg00:
LV NAME             TYPE       LPs     PPs     PVs  LV STATE      MOUNT POINT
loglv00             jfs2log    1       1       1    open/syncd    N/A
fslv00              jfs2       4       4       1    open/syncd    /devhold
fslv01              jfs2       4       4       1    open/syncd    /apps

假设新磁盘 hdisk3 已添加到 VG vg00 中。接下来,在新添加的磁盘上创建所有 LV 的副本。在本演示中,mklvcopy 命令的格式为:

mklvcopy <LV_name> <copy_number> <destination__PV>

其中 copy_number2,即 LV 的第二个(副本),destination_PV(在本演示中)为 hdisk3

# mklvcopy fslv00 2 hdisk3
# mklvcopy fslv01 2 hdisk3
# mklvcopy loglv00 2 hdisk3

现在我们在新磁盘上已经有了 LV 的副本。接下来,我们需要使用 syncvg 命令同步/镜像 LV:

# syncvg -l fslv00
# syncvg -l fslv01
# syncvg -l loglv00

我们现在已完成到新磁盘 hdisk3 的镜像。这可以通过列出 VG 中的 LV 来确认。请注意,PP 列是每个 LV 的 LP 的两倍。这意味着这些 LV 已完成镜像:

#  lsvg -l vg00
vg00:
LV NAME             TYPE       LPs     PPs     PVs  LV STATE      MOUNT POINT
loglv00             jfs2log    1       2       2    open/syncd    N/A
fslv00              jfs2       4       8       2    open/syncd    /devhold
fslv01              jfs2       4       8       2    open/syncd    /apps

现在我们的数据已放在一个好的磁盘上,可以删除原始副本,即故障磁盘 hdisk2 上的 LV。在本演示中,rmlvcopy 命令的格式为:

rmlvcopy <LV_name> <copy_number> <PV_to_remove_copy>

其中,在 LV 第一次出现时或者在您更喜欢原始 LV 的时候,copy_number 将为 1,在本演示中 PV_to_remove_copyhdisk2

现在将这些 LV 副本从故障磁盘 hdisk2 中删除:

# rmlvcopy fslv00 1 hdisk2
# rmlvcopy fslv01 1 hdisk2
# rmlvcopy loglv00 1 hdisk2

来自 hisk2 的所有副本现在已删除。hdisk2 不应再有任何数据,这可以通过查看 VG 来确认。在以下输出中,请注意,对于 hdisk2TOTAL PPFREE PP 值是相同的,这意味着该磁盘是空的:

# lsvg -p vg00
vg00:
PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION
hdisk2            active            542         542         109..108..108..108.. 109
hdisk3            active            2187        2178        438..428..437..437.. 438

可以通过列出两个磁盘进一步确认这一点。hdisk2 应该没有数据,但 hdisk3 上应有 LV。

# lspv -l hdisk2

没有返回任何输出,这表明该磁盘上没有数据。

# lspv -l hdisk3
hdisk3:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                4       4       00..04..00..00..00    /devhold
loglv00               1       1       00..01..00..00..00    N/A
fslv01                4       4       00..04..00..00..00    /apps

现在,剩下的任务是从 VG 删除故障磁盘 hdisk2

# reducevg vg00 hdisk2

要确认 VG 现在仅包含好的 hdisk3 磁盘,请执行以下命令:

# lsvg -p vg00
vg00:
PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION
hdisk3            active            2187        2178        438..428..437..437..438

数据已成功从一个故障磁盘移动到 VG vg00 中的一个新磁盘。在某一时刻,故障磁盘与 VG 是没有关联的,应该在此时物理更换它。


使用 migratepv 命令复制 LV 中的数据

当有一个内容非常稠密的磁盘包含许多要迁移的 LV 时,有时使用 migratepv 命令复制数据很有效。您还可以使用此命令复制单独的 LV。假设我们需要将数据从 hdisk2 迁移到 hdisk3

 目标磁盘的大小可能比来源磁盘更小,只要所有 LV 都能装入目标磁盘。

在本演示中,migratepv 命令的格式为:

migratepv < source_PV>  <destination_PV>
migratepv -l <LV> < source_PV>  <destination_PV>

其中 <LV> 是您希望迁移的 LV 的名称。

在 VG vg00 的以下输出中,可以注意到 hdisk3 是空的。这可以通过查看 TOTAL PPFREE PP 值来确认,这两个值是相同的。这意味着该磁盘上没有数据。

# lsvg -p vg00
vg00:
PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION
hdisk2            active            542         532         109..98..108..108..1 09
hdisk3            active            2187        2187        438..437..437..437.. 438

要进一步确认所有 LV 都在 hdisk2 上,可对每个 LV 运行 lslv 命令:

# lslv -m fslv00
fslv00:/apps
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0111 hdisk2
0002  0112 hdisk2
0003  0113 hdisk2
0004  0114 hdisk2
0005  0115 hdisk2
# lslv -m fslv01
fslv01:/devhold
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0116 hdisk2
0002  0117 hdisk2
0003  0118 hdisk2
0004  0119 hdisk2
# lslv -m loglv00
loglv00:N/A
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0110 hdisk2

现在,让我们使用以下 migratepv 命令将 LV fslv00hdisk2 迁移到 hdisk3

# migratepv -l fslv00 hdisk2 hdisk3

通过查看 LV,我们可以确定 LV fslv00 现在位于 hdisk3 上:

# lslv -m fslv00
fslv00:/apps
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0439 hdisk3
0002  0440 hdisk3
0003  0441 hdisk3
0004  0442 hdisk3
0005  0443 hdisk3

假设您现在需要将其他所有 LV(也就是来自 hdisk2 的所有数据)复制到 hdisk3 上,可运行以下命令:

# migratepv hdisk2 hdisk3

成功完成 migratepv 命令后,hdisk2 上将没有任何数据,所有数据现在都位于 hdisk3 上:

# lspv -l hdisk2

上面的命令不会返回任何输出,这表明该磁盘上没有任何数据。

# lspv -l hdisk3
hdisk3:
LV NAME               LPs     PPs     DISTRIBUTION          MOUNT POINT
fslv00                5       5       00..05..00..00..00    /apps
loglv00               1       1       00..01..00..00..00    N/A
fslv01                4       4       00..04..00..00..00    /devhold

接下来,运行以下命令,确认该 VG 打开了这些 LV,并且没有出现任何问题。

# lsvg -l vg00
vg00:
LV NAME             TYPE       LPs     PPs     PVs  LV STATE      MOUNT POINT
loglv00             jfs2log    1       1       1    open/syncd    N/A
fslv00              jfs2       5       5       1    open/syncd    /apps
fslv01              jfs2       4       4       1    open/syncd    /devhold

设置卷组的分解因数

当可伸缩的大型 VG 成为 IBM® AIX® 内的一个主要功能之前,VG 被创建为正常或原始的 VG。要识别您拥有的 VG 的类型,可以查询该 VG 并查找 MAX PV 值。作为一条经验规则,可以使用以下数据。

  • 如果有 32 个 PV,那么它是一个原始 VG。
  • 如果有 128 个 PV,那么它是一个大型 VG。
  • 如果有 1024 个 PV,那么它是一个可伸缩 VG。

但是,这里请注意,不是所有 VG 都返回了应有的值。这通常表明在创建原始 VG 后应该执行 VG 维护。

在过去,旧 VG 是原始 VG,分配了一组已定义的 PP。PP 和 PV 值具有直接关联。如果将一个磁盘(大得多)放入一个 VG(也就是一个原始 VG,其中的所有磁盘都具有较小的 PP 和 PV),您会遇到因数问题。其他一些情形也有可能遇到因数问题。因数问题不是真正的大问题。如果您更改了因数,那么您的 VG 支持的磁盘将会更少。这是因为,通过增加因数大小,可以增加 PP 大小,这会减少您可以包含在 VG 中的磁盘数量。这真的是个问题吗?在我看来不算。所以这里您有两个选择:

  • 当 VG 变化时,使用 chvg -B 命令转换为一个大 VG。
  • 当 VG 变化时,使用 chvg -G 命令转换为一个可伸缩 VG。

或者在未来,确保任何新 VG 创建为可伸缩的 VG,以防遇到因数问题。假设某种转换 VG 的情况并不可取,因为您不能让文件系统离线。要获得 VG 中的磁盘,则必须更改因数大小。以下是一个原始 VG 的一个因数错误的示例。假设我有一个名为 appsvg 的 VG,它有一个 17 GB 大的磁盘,我尝试向它添加一个 70 GB 的磁盘 (hdisk3),会获得以下错误:

# extendvg appsvg hdisk3
0516-1162 extendvg: Warning, The Physical Partition Size of 32 requires the
        creation of 2187 partitions for hdisk3.  The limitation for volume group
        appsvg is 1016 physical partitions per physical volume.  Use chvg command
        with -t option to attempt to change the maximum Physical Partitions per
        Physical volume for this volume group.
0516-792 extendvg: Unable to extend volume group.

上面的输出一定程度上指明了存在的问题。无论如何,都需要更改因数大小。在本演示中,我选择一个因数 3:

 # chvg -t3 appsvg
0516-1164 chvg: Volume group appsvg changed.  With given characteristics appsvg
        can include upto 10 physical volumes with 3048 physical partitions each.
# extendvg appsvg hdisk3

在更改因数后,现在我只能有 10 个磁盘,而不是最初的 32 个磁盘(原始 VG)。但是,这没有什么问题,因为至少我已经将我的大磁盘添加到了 VG 中。在此示例中,我需要更多磁盘空间并获得了这些空间。


结束语

在本文中,我演示了在遇到磁盘阻塞时移动 LV 或者从故障磁盘移动 LV 的不同方式。也可以使用其他工具来移动数据,但是,我重点介绍的是允许您在迁移数据时保持系统在线的数据迁移技术。

参考资料

学习

  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=870511
ArticleTitle=移动磁盘数据
publish-date=04152013