lvm_querylv 子例程
用途
查询逻辑卷并返回所有的相关信息。
库
逻辑卷管理器库 (liblvm.a)
语法
描述
lvm_querylv 子例程返回由 LV_ID 参数指定的逻辑卷的信息。
在 lvm.h 文件中找到的 querylv 结构定义如下:
struct querylv {
char lvname[LVM_NAMESIZ];
struct unique_id vg_id;
long maxsize;
long mirror_policy;
long lv_state;
long currentsize;
long ppsize;
long permissions;
long bb_relocation;
long write_verify;
long mirwrt_consist;
long open_close;
struct pp *mirrors[LVM_NUMCOPIES];
unsigned int stripe_exp;
unsigned int striping_width;
}
struct pp {
struct unique_id pv_id;
long lp_num;
long pp_num;
long ppstate;
}
| 字段 | 描述 |
|---|---|
| lvname | 指定逻辑卷的特殊文件名,可以是完整路径名,也可以是必须位于 /dev 目录中的单个文件名 (例如, rhd1)。 所有名称字段必须是从 1 到 LVM_NAMESIZ 字节 (包括空字节) 的以 null 结束的字符串。 如果没有为 lvname 字段指定原始设备或字符设备,那么逻辑卷管理器 (LVM) 将向文件名添加 r 以具有原始设备名。 如果没有此名称的原始设备条目,那么 LVM 将返回 LVM_NOTCHARDEV 错误代码。 |
| vg_id | 指定包含逻辑卷的卷组的唯一标识。 |
| 最大大小 | 指示逻辑卷的逻辑分区中的最大大小,必须在 1 到 LVM_MAXLPS范围内。 |
| 镜像策略 | 指定物理副本的写入方式。 mirror_policy 字段应该为 LVM_SEQUENTIAL 或 LVM_PARALLEL ,以指示当存在多个副本时如何写入逻辑分区的物理副本。 |
| lv_state | 指定逻辑卷的当前状态,并且可以将下列任何特定于位的值一起 OR 运算:
|
| 当前大小 | 指示逻辑卷的逻辑分区中的当前大小。 每个物理分区的大小 (以字节计) 为 2 的 ppsize 字段的幂。 |
| ppsize | 指定卷组中所有物理卷的物理分区大小。 |
| 许可权 | 指定分配给逻辑卷的许可权,可以是下列其中一个值:
|
| bb_重定向 | 指定是否需要坏区重定位并且是下列其中一个值:
|
| 写入验证 | 指定是否需要逻辑卷的写验证,并返回下列其中一个值:
|
| mirwrt_组合体 | 指示是否将对此逻辑卷执行镜像写一致性恢复。 LVM 在处理正常 I/O 时总会确保逻辑卷镜像副本之间的数据一致性。 针对逻辑卷的每一次 写入操作,LVM 都会为其每个镜像副本生成一个写请求。 但如果在处理镜像写的过程中(在 所有的副本都被写入之前)系统崩溃,问题就产生了。 如果要为逻辑卷执行镜像写一致恢复, LVM 必须保存额外的信息以恢复那些不一致的镜像。 大多数拥有镜像的逻辑卷都应该执行 镜像写一致恢复。 在卷组重新联机时不使用现有数据的逻辑卷 (例如页空间) 不需要此保护。 mirwrt_组合体 字段的值为:
|
| 打开关闭 | 指定是打开还是关闭逻辑卷。 值包括:
|
| 镜像 | 指定指向分区映射列表的指针数组 (逻辑卷的每个逻辑分区副本的物理卷标识,逻辑分区号,物理分区号和物理分区状态)。 ppstate 字段可以是 LVM_PPFREE, LVM_PPALLOC或 LVM_PPSTALE。 如果逻辑分区不包含任何副本,那么其 pv_id, lp_num和 pp_num 字段将包含零。 |
| 删除线 (stripe_exp) | 指定逻辑卷条带大小的日志库 2 (条带大小乘以阵列中的磁盘数等于条带大小)。 例如, 2 ^ 20 是 1048576 (即, 1 MB)。 因此,如果条带大小为 1 MB ,那么 stripe_exp 字段为 20。 如果未对逻辑卷进行条带分割,那么 stripe_exp 字段为 0。 |
| 条带宽度 | 指定构成条带化逻辑卷的磁盘数。 如果未对逻辑卷进行条带分割,那么 striping_width 字段为 0。 |
PVName 参数使用户能够从特定物理卷上的卷组描述符区域进行查询,而不是从该描述符区域的逻辑卷管理器 (LVM) 的最新内存中副本进行查询。 仅当卷组脱机时,才应使用此方法。
PVName 参数应该指定包含要查询的描述符区域的物理卷的完整路径名,或者指定必须位于 /dev 目录中的单个文件名 (例如, rhdisk1)。 此参数必须是 1 和 LVM_NAMESIZ 字节 (包括空字节) 之间的以 null 结束的字符串,并且必须表示原始设备条目。 如果没有为 PVName 参数指定原始设备或字符设备,那么 LVM 会将 r 添加到文件名以具有原始设备名。 如果没有此名称的原始设备条目,那么 LVM 将返回 LVM_NOTCHARDEV 错误代码。
如果指定了 PVName 参数,那么仅需要提供 LV_ID 参数的 minor_num 字段。 LVM 填充 vg_id 字段并将其返回给用户。 如果用户希望从 LVM 的内存中副本进行查询,那么 PVName 参数应设置为 null。 使用此查询方法时,卷组必须联机,否则将返回错误。
除了 PVName 参数外,调用者还传递要查询的逻辑卷的标识 (LV_ID 参数) 以及指向 querylv 结构的指针地址 (由 QueryLV 参数指定)。 LVM 单独分配 querylv 结构和 struct pp 数组所需的空间,并在用户传入的指针变量中返回 querylv 结构的地址。 用户负责通过首先释放 镜像 数组中的结构 pp 指针,然后释放 querylv 结构来释放空间。
QueryLV->mirrors
k != NULL。参数
| 项 | 描述 |
|---|---|
| LV_ID | 指向指定要查询的逻辑卷的 lv_id 结构。 |
| QueryLV | 包含指向 querylv 结构的指针的地址。 |
| PVname | 指定要将卷组描述符用于查询的物理卷。 此参数也可以为空。 |
返回值
如果 lvm_querylv 子例程成功,那么它将返回值 0。
错误代码
如果 lvm_querylv 子例程未成功完成,那么它将返回下列其中一个值:
| 项 | 描述 |
|---|---|
| LVM_ALLOCERR | 子例程无法为完整缓冲区分配足够的空间。 |
| LVM_INVALID_MIN_NUM | 逻辑卷的次数无效。 |
| LVM_INVALID_PARAM | 传递到例程的参数无效。 |
| LVM_INV_DEVENT | Pvname 参数指定的物理卷的设备条目无效,无法检查以确定它是否为原始卷。 |
| LVM_NOTCHARDEV | 给定的物理卷名不代表原始设备或字符设备。 |
| LVM_OFFLINE | 包含要查询的逻辑卷的卷组处于脱机状态。 如果查询源自联机卷组的当前卷组描述符区域,那么将返回下列其中一个错误代码: |
| LVM_DALVOPN | 无法打开卷组保留的逻辑卷。 |
| LVM_MAPFBSY | 卷组当前已锁定,因为卷组上的系统管理正在由另一个进程完成。 |
| LVM_MAPFOPN | 无法打开包含用于对卷组进行更改的卷组描述符区域的副本的映射文件。 |
| LVM_MAPFRDWR | 无法读取或写入映射文件。 |
如果已传递物理卷名称,请求查询源自特定物理卷,那么将返回下列其中一个错误代码:
| 项 | 描述 |
|---|---|
| LVM_BADBBDIR | 无法读取或写入坏区目录。 |
| LVM_LVMRECERR | 无法读取包含有关卷组描述符区域的信息的 LVM 记录。 |
| LVM_NOPVVGDA | 指定的物理卷上没有卷组描述符区域。 |
| LVM_NOTVGMEM | 指定的物理卷不是卷组的成员。 |
| LVM_PVDAREAD | 尝试从指定的物理卷读取卷组描述符区域时发生错误。 |
| LVM_PVOPNERR | 无法打开物理卷设备。 |
| LVM_VGDA_BB | 在为查询指定的物理卷上的卷组描述符区域中找到坏区。 因此,无法从指定的物理卷执行查询。 |