lvm_querypv 子例程

用途

查询物理卷并返回所有的相关信息。

逻辑卷管理器库 (liblvm.a)

语法

#include <lvm.h>
int lvm_querypv (VG_ID, PV_ID, QueryPV, PVName)
struct unique_id * VG_ID;
struct unique_id * PV_ID;
struct querypv ** QueryPV;
char * PVName;

描述

注: lvm_querypv 子例程使用 sysconfig 系统调用来查询和更新描述卷组的内核数据结构,该调用需要 root 用户权限。 您必须具有 root 用户权限才能使用 lvm_querypv 子例程。

lvm_querypv 子例程返回有关由 PV_ID 参数指定的物理卷的信息。

lvm.h 文件中定义的 querypv 结构包含以下字段:

struct querypv {
      long ppsize;
      long pv_state;
      long pp_count;
      long alloc_ppcount;  
      long pvnum_vgdas;  
      struct pp_map *pp_map;
      char hotspare;          
      struct unique_id  pv_id;
      long freespace;
 }
 struct pp_map {  
      long pp_state;
      struct lv_id lv_id;
      long lp_num;
      long copy;
      struct unique_id fst_alt_vol;
      long fst_alt_part;
      struct unique_id snd_alt_vol;
      long snd_alt_part;  
  }
字段 描述
ppsize 指定物理分区的大小,该大小对于卷组中的所有分区都是相同的。 物理分区的大小 (以字节为 2) 为 2。ppsize.
pv_state 包含该物理卷的当前状态。
pp_count 包含该物理卷上的物理分区总数。
alloc_ppcount 包含物理卷上已分配的物理分区数。
pp_map 指向具有该物理卷的每个物理分区的条目的阵列。 此数组中的每个条目都将包含pp_state它指定物理分区 (LVM_PPFREELVM_PPALLOCLVM_PPSTALE) 的状态,并lv_id,字段,这是它所属的逻辑卷的标识。 该pp_map阵列还包含物理卷标识 (fst_alt_volsnd_alt_vol) 和物理分区号 (fst_alt_partsnd_alt_part)对于物理分区的第一个和第二个备用副本,以及逻辑分区号 (lp_num)物理分区所对应。

如果物理分区可用 (即,未分配) ,那么其 pp_map 字段中的 全部 将为零。

fst_alt_vol
如果逻辑分区只有一个物理副本,那么包含零。
fst_alt_part
如果逻辑分区只有一个物理副本,那么包含零。
snd_alt_vol
如果逻辑分区只有一个或两个物理副本,那么包含零。
snd_alt_part
如果逻辑分区只有一个或两个物理副本,那么包含零。
copy
指定将此物理分区分配给逻辑分区的哪个副本。 此字段将包含下列其中一个值:
LVM_Primary
逻辑分区的主副本和唯一副本
LVM_PRIMOF2
具有两个物理副本的逻辑分区的主副本
LVM_PRIMOF3
具有三个物理副本的逻辑分区的主副本
LVM_SCNDOF2
具有两个物理副本的逻辑分区的辅助副本
LVM_SCNDOF3
具有三个物理副本的逻辑分区的辅助副本
LVM_TERTOF3
具有三个物理副本的逻辑分区的第三个副本。
 
pvnum_vgdas    包含位于指定物理卷上的卷组描述符区域 (0,1 0 2) 的数目。
hotspare    指定物理卷是一个 hotspare。
pv_id    指定物理卷标识。
freespace    指定卷组中的物理分区的数目。

PVName 参数使用户能够从特定物理卷上的卷组描述符区域进行查询,而不是从描述符区域的逻辑卷管理器 (LVM) 最新的内存副本中进行查询。 仅当卷组脱机时,才应使用此方法。 不保证返回的数据是最新的或正确的,并且它可以反映出一个后级描述符区域。

PVname 参数应指定包含要查询的描述符区域的物理卷的完整路径名,或者指定必须驻留在 /dev 目录中的单个文件名 (例如, rhdisk1)。 此字段必须是 1 到 LVM_NAMESIZ 个字节 (包括 1 字节) 的以 null 结束的字符串,并且表示原始设备或字符设备。 如果未对 PVName 参数指定原始设备或字符设备,那么 LVM 将向文件名添加 R ,以便具有原始设备名称。 如果不存在此名称的原始设备条目,那么 LVM 将返回 LVM_NOTCHARDEV 错误代码。 如果指定了 PVName ,那么表示卷组标识,VG_ID,将由 LVM 通过用户传递的 VG_ID 参数来返回。 如果用户希望从 LVM 内存中副本进行查询,那么应该将 PVName 参数设置为空。 使用此查询方法时,卷组必须已联机,否则将返回错误。

注: 只要 PVName 不为空, LVM 就会尝试从物理卷进行查询,并尝试从其数据的内存副本进行查询

除了 PVName 参数外,调用者还传递 VG_ID 参数,指示包含要查询的物理卷的卷组,要查询的物理卷的唯一标识, PV_ID 参数以及类型为 QueryPV的指针的地址。 LVM 将单独为 奎雷普夫 结构和 struct 分配足够的空间pp_map数组并返回传入的 QueryPV 指针中 querypv 结构的地址。 用户负责释放空间,方法是释放 struct pp_map 指针,然后释放 QueryPV 指针。

参数

描述
VG_ID 指向 unique_id 结构,该结构指定要查询的物理卷是其成员的卷组。
PV_ID 指向用于指定要查询的物理卷的 unique_id 结构。
QueryPV 指定指向 奎雷普夫 结构的指针所在的地址。
PVname 指定要从其中使用卷组描述符区域进行查询的物理卷。 此参数可以为空。

返回值

lvm_querypv 子例程在成功完成时返回值 0。

错误代码

如果 lvm_querypv 子例程失败,它将返回下列其中一个错误代码:

描述
LVM_ALLOCERR 例程无法为完整缓冲区分配足够的空间。
lvm_invalid_param 传递到例程中的参数无效。
LVM_INV_DEVENT 物理卷的设备项无效,无法进行检查以确定它是否为原始卷。
LVM_OFFLINE 指定的卷组处于脱机状态,并且应该处于联机状态。

如果查询源自联机卷组的当前卷组描述符区域,那么可能会返回下列其中一个错误代码:

描述
LVM_DALVOPN 无法打开该卷组保留的逻辑卷。
LVM_MAPFBSY 由于卷组上的系统管理正在由另一个进程执行,因此该卷组当前已锁定。
LVM_MAPFOPN 无法打开映射文件 (它包含用于对卷组进行更改的卷组描述符区域的副本)。
LVM_MAPFRDWR 无法读取映射的文件,或者无法写入该文件。

如果已传递物理卷名称,请求查询源自特定物理卷,那么可能会返回下列其中一个错误代码:

描述
LVM_BADBDIR 无法读取或写入坏块目录。
LVM_LVMRECERR 无法读取 LVM 记录 (其中包含有关卷组描述符区域的信息)。
LVM_NOPVVGDA 此物理卷上没有任何卷组描述符区域。
LVM_NOTCHARDEV 某个设备不是原始设备或字符设备。
LVM_NOTVGMEM 物理卷不是某个卷组的成员。
LVM_PVDAREAD 当尝试从指定的物理卷读取卷组描述符区域时发生错误。
LVM_PVOPNERR 未能打开该物理卷设备。
LVM_VGDA_BB 在位于为查询指定的物理卷上的卷组描述符区域中找到坏区。 因此,无法从指定的物理卷完成查询。