Add pvck ability to scan for labels on any area of disk
PATCH 1/2 Add pvck ability to scan for labels on any area of disk
Update pvck to read labels on disk, with flexible --labelsector parameter.
lib/metadata/metadata.c +36 -0
@@ -1555,3 +1555,39 @@ int pv_write_orphan(struct cmd_context *return 1 ; } +/* +* Returns: +* 0 - fail +* 1 - success +*/ +int pv_analyze (struct cmd_context *cmd,const char *pv_name, +int64_t label_sector) +{ +struct label *label; +struct device *dev; + +/* +* Take the pv directly, and ignore any filters. We do this +* because we're often in recovery mode here, and side-effects +* with things like filters would probably be unexpected. +*/ + dev =dev_cache_get (pv_name,NULL ); +if (!dev) + goto error; + +/* +* First, scan for LVM labels. +*/ +if (label_read (dev, &label, label_sector)) { +log_print ("Found label on %s, sector %" PRIu64", type=%s" , + pv_name, label->sector, label->type); + }else { +log_error ("Could not find LVM label on %s - " +"try --labelsector option?" , pv_name); + goto error; + } + +return 1 ; + error: +return 0 ; +}
lib/metadata/metadata.h +2 -0
@@ -443,6 +443,8 @@ struct physical_volume *pv_create(const uint64_t pvmetadatasize, struct list *mdas);int pv_resize (struct physical_volume *pv,struct volume_group *vg,uint32_t new_pe_count); +int pv_analyze (struct cmd_context *cmd,const char *pv_name, +int64_t label_sector); struct volume_group *vg_create(struct cmd_context *cmd, const char *name, uint32_t extent_size, uint32_t max_pv,
man/pvck.8 +17 -1
@@ -3,11 +3,27 @@ pvck \- check physical volume metadata .SH SYNOPSIS .B pvck -[\-d/\-\-debug] [\-h/\-?/\-\-help] [\-v/\-\-verbose] [PhysicalVolume...] +.RB [ \-d | \-\-debug ] +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-verbose ] +.RB [ \-\-labelsector ] +.IR PhysicalVolume " [" PhysicalVolume ...] .SH DESCRIPTION pvck checks physical volume LVM metadata for consistency. .SH OPTIONS See \fBlvm\fP for common options. +.TP +.BR \-\-labelsector " sector" +By default the PV(s) are scanned for an LVM identifier (label) in its second +sector (sector 1). This lets you scan a different sector for an LVM label, +and is useful for recovery situations. For example, suppose the partition +table is corrupted or lost on /dev/sda, but you know there were LVM partitions +on it. You can guess at the location of the partition, and pass this sector +offset to pvck /dev/sda as the \fB--labelsector\fP parameter. (With a script, you +can automate this process if you are unsure about the location.) Note that +pvck scans a few sectors starting at labelsector (see LABEL_SCAN_SECTORS in +the source) so you don't need to specify the exact sector for the label. +For LVM1, you should use \fB--labelsector\fP 0. .SH SEE ALSO .BR lvm (8), .BR pvcreate (8),
tools/commands.h +4 -2
@@ -412,9 +412,11 @@ xx(pvck, "pvck " "\t[-d|--debug]\n" "\t[-h|--help]\n" -"\t[-v|--verbose]\n" + "\t[--labelsector sector] " "\n" + "\t[-v|--verbose]\n" "\t[--version]" "\n" - "\tPhysicalVolume [PhysicalVolume...]\n" ) + "\tPhysicalVolume [PhysicalVolume...]\n", + labelsector_ARG) xx(pvcreate, "Initialize physical volume(s) for use by LVM",
tools/pvck.c +23 -10
@@ -15,16 +15,29 @@#include "tools.h" -static int _pvck_single (struct cmd_context * cmd, -struct volume_group * vg, -struct physical_volume * pv, -void *handle) -{ -return ECMD_PROCESSED ; -} -int pvck (struct cmd_context *cmd,int argc,char **argv) { -/* FIXME: Correlate findings of each PV */ -return process_each_pv (cmd, argc, argv,NULL ,NULL , _pvck_single); +int i; + +/* FIXME: validate cmdline options */ +/* FIXME: what does the cmdline look like? */ +/* +* Use what's on the cmdline directly, and avoid calling into +* some of the other infrastructure functions, so as to avoid +* hitting some of the lvmcache behavior, scanning other devices, +* etc. +*/ +for (i =0 ; i < argc; i++) { +/* FIXME: warning and/or check if in use? */ +log_verbose ("Scanning %s" , argv[i]); + +if (!pv_analyze (cmd, argv[i], +arg_int64_value (cmd, labelsector_ARG, +DEFAULT_LABELSECTOR ))) + goto error; + } + +return ECMD_PROCESSED ; + error: +return ECMD_FAILED ; }
WHATS_NEW +1 -0
@@ -1,5 +1,6 @@ Version 2.02.25 - ================================= + Add ability for pvck to detect LVM2 and LVM1 labels. Add start_sector param to label_read and _find_labeller. Add lib/config support functions. Add count_chars_null and count_chars_len.
PATCH 1/2 Add pvck ability to scan for labels on any area of disk
I think all comments incorporated / addressed.
Update pvck to read labels on disk, with flexible --labelsector parameter.
lib/metadata/metadata.c +32 -0
@@ -1555,3 +1555,35 @@ int pv_write_orphan(struct cmd_context *return 1 ; } +/* +* Returns: +* 0 - fail +* 1 - success +*/ +int pv_analyze (struct cmd_context *cmd,const char *pv_name, +int64_t label_sector) +{ +struct label *label; +struct device *dev; + + dev =dev_cache_get (pv_name, cmd->filter); +if (!dev) { +log_error ("Device %s not found (or ignored by filtering)." , + pv_name); +return 0 ; + } + +/* +* First, scan for LVM labels. +*/ +if (!label_read (dev, &label, label_sector)) { +log_error ("Could not find LVM label on %s" , + pv_name); +return 0 ; + } + +log_print ("Found label on %s, sector %" PRIu64", type=%s" , + pv_name, label->sector, label->type); + +return 1 ; +}
lib/metadata/metadata.h +2 -0
@@ -443,6 +443,8 @@ struct physical_volume *pv_create(const uint64_t pvmetadatasize, struct list *mdas);int pv_resize (struct physical_volume *pv,struct volume_group *vg,uint32_t new_pe_count); +int pv_analyze (struct cmd_context *cmd,const char *pv_name, +int64_t label_sector); struct volume_group *vg_create(struct cmd_context *cmd, const char *name, uint32_t extent_size, uint32_t max_pv,
man/pvck.8 +19 -1
@@ -3,11 +3,29 @@ pvck \- check physical volume metadata .SH SYNOPSIS .B pvck -[\-d/\-\-debug] [\-h/\-?/\-\-help] [\-v/\-\-verbose] [PhysicalVolume...] +.RB [ \-d | \-\-debug ] +.RB [ \-h | \-\-help ] +.RB [ \-v | \-\-verbose ] +.RB [ \-\-labelsector ] +.IR PhysicalVolume " [" PhysicalVolume ...] .SH DESCRIPTION pvck checks physical volume LVM metadata for consistency. .SH OPTIONS See \fBlvm\fP for common options. +.TP +.BR \-\-labelsector " sector" +By default, 4 sectors of \fBPhysicalVolume\fP are scanned for an LVM label, +starting at sector 0. This parameter allows you to specify a different +starting sector for the scan and is useful for recovery situations. For +example, suppose the partition table is corrupted or lost on /dev/sda, +but you suspect there was an LVM partition at approximately 100 MB. This +area of the disk may be scanned by using the \fB--labelsector\fP parameter +with a value of 204800 (100 * 1024 * 1024 / 512 = 204800): +.sp +.BI "pvck --labelsector 204800 /dev/sda" +.sp +Note that a script can be used with \fB--labelsector\fP to automate the +process of finding LVM labels. .SH SEE ALSO .BR lvm (8), .BR pvcreate (8),
tools/commands.h +4 -1
@@ -412,9 +412,12 @@ xx(pvck, "pvck " "\t[-d|--debug]\n" "\t[-h|--help]\n" + "\t[--labelsector sector] " "\n" "\t[-v|--verbose]\n" "\t[--version]" "\n" - "\tPhysicalVolume [PhysicalVolume...]\n" ) + "\tPhysicalVolume [PhysicalVolume...]\n", + + labelsector_ARG) xx(pvcreate, "Initialize physical volume(s) for use by LVM",
tools/pvck.c +20 -10
@@ -15,16 +15,26 @@#include "tools.h" -static int _pvck_single (struct cmd_context * cmd, -struct volume_group * vg, -struct physical_volume * pv, -void *handle) -{ -return ECMD_PROCESSED ; -} -int pvck (struct cmd_context *cmd,int argc,char **argv) { -/* FIXME: Correlate findings of each PV */ -return process_each_pv (cmd, argc, argv,NULL ,NULL , _pvck_single); +int i; + +/* FIXME: validate cmdline options */ +/* FIXME: what does the cmdline look like? */ +/* +* Use what's on the cmdline directly, and avoid calling into +* some of the other infrastructure functions, so as to avoid +* hitting some of the lvmcache behavior, scanning other devices, +* etc. +*/ +for (i =0 ; i < argc; i++) { +/* FIXME: warning and/or check if in use? */ +log_verbose ("Scanning %s" , argv[i]); + +pv_analyze (cmd, argv[i], +arg_int64_value (cmd, labelsector_ARG, +UINT64_C (0 ))); + } + +return ECMD_PROCESSED ; }