mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-13 00:58:47 +03:00
lvmdevices: add deviceidtype option
When adding a device to the devices file with --adddev, lvm by default chooses the best device ID type for the new device. The new --deviceidtype option allows the user to override the built in preference. This is useful if there's a problem with the default type, or if a secondary type is preferrable. If the specified deviceidtype does not produce a device ID, then lvm falls back to the preference it would otherwise use. (cherry picked from commit 440d6ae79fb4df92c7992d3c1689ba4f2d242d6a)
This commit is contained in:
parent
e9227b4bcc
commit
de8d6238df
@ -931,6 +931,7 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_
|
||||
/*
|
||||
* Choose the device_id type for the device being added.
|
||||
*
|
||||
* 0. use an idtype specified by the user
|
||||
* 1. use an idtype specific to a special/virtual device type
|
||||
* e.g. loop, mpath, crypt, lvmlv, md, etc.
|
||||
* 2. use an idtype specified by user option.
|
||||
@ -939,6 +940,24 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_
|
||||
* 5. use devname as the last resort.
|
||||
*/
|
||||
|
||||
if (idtype_arg) {
|
||||
if (!(idtype = idtype_from_str(idtype_arg)))
|
||||
log_warn("WARNING: ignoring unknown device_id type %s.", idtype_arg);
|
||||
else {
|
||||
if (id_arg) {
|
||||
if ((idname = strdup(id_arg)))
|
||||
goto id_done;
|
||||
log_warn("WARNING: ignoring device_id name %s.", id_arg);
|
||||
}
|
||||
|
||||
if ((idname = device_id_system_read(cmd, dev, idtype)))
|
||||
goto id_done;
|
||||
|
||||
log_warn("WARNING: ignoring deviceidtype %s which is not available for device.", idtype_arg);
|
||||
idtype = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (MAJOR(dev->dev) == cmd->dev_types->device_mapper_major) {
|
||||
if (_dev_has_mpath_uuid(cmd, dev, &idname)) {
|
||||
idtype = DEV_ID_TYPE_MPATH_UUID;
|
||||
@ -972,19 +991,6 @@ int device_id_add(struct cmd_context *cmd, struct device *dev, const char *pvid_
|
||||
log_warn("Missing support for DRBD idtype");
|
||||
}
|
||||
|
||||
if (idtype_arg) {
|
||||
if (!(idtype = idtype_from_str(idtype_arg)))
|
||||
log_warn("WARNING: ignoring unknown device_id type %s.", idtype_arg);
|
||||
else {
|
||||
if (id_arg) {
|
||||
if (!(idname = strdup(id_arg)))
|
||||
stack;
|
||||
goto id_done;
|
||||
}
|
||||
goto id_name;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* No device-specific, existing, or user-specified idtypes,
|
||||
* so use first available of sys_wwid / sys_serial / devname.
|
||||
|
@ -9,18 +9,18 @@ remove it from the devices file with lvmdevices --deldev. The
|
||||
vgimportdevices(8) command adds all PVs from a VG to the devices file,
|
||||
and updates the VG metadata to include device IDs of the PVs.
|
||||
.P
|
||||
Commands adding new devices to the devices file necessarily look outside
|
||||
the existing devices file to find the devices to add. pvcreate, vgcreate,
|
||||
and vgextend also look outside the devices file to create new PVs and add
|
||||
them to the devices file.
|
||||
Commands that add new devices to the devices file necessarily look outside
|
||||
the existing devices file to find the devices being added. pvcreate,
|
||||
vgcreate, and vgextend also look outside the devices file to create new
|
||||
PVs and add those PVs to the devices file.
|
||||
.P
|
||||
LVM records devices in the devices file using hardware-specific IDs, such
|
||||
as the WWID, and attempts to use subsystem-specific IDs for virtual device
|
||||
types (which also aim to be as unique and stable as possible.)
|
||||
These device IDs are also written in the VG metadata. When no hardware or
|
||||
types (which also aim to be as unique and stable as possible.) These
|
||||
device IDs are also written in the VG metadata. When no hardware or
|
||||
virtual ID is available, lvm falls back using the unstable device name as
|
||||
the device ID. When devnames are used, lvm performs extra scanning to
|
||||
find devices if their devname changes, e.g. after reboot.
|
||||
the device ID. When devnames are used as IDs, lvm performs extra scanning
|
||||
to find devices if their devname changes, e.g. after reboot.
|
||||
.P
|
||||
When proper device IDs are used, an lvm command will not look at devices
|
||||
outside the devices file, but when devnames are used as a fallback, lvm
|
||||
@ -34,12 +34,13 @@ overriding the devices file. The listed devices act as a sort of devices
|
||||
file in terms of limiting which devices lvm will see and use. Devices
|
||||
that are not listed will appear to be missing to the lvm command.
|
||||
.P
|
||||
Multiple devices files can be kept in \fI#DEFAULT_SYS_DIR#/devices\fP, which allows lvm
|
||||
to be used with different sets of devices, e.g. system devices do not need
|
||||
to be exposed to a specific application, and the application can use lvm on
|
||||
its own devices that are not exposed to the system. The option
|
||||
--devicesfile <filename> is used to select the devices file to use with the
|
||||
command. Without the option set, the default system devices file is used.
|
||||
Multiple devices files can be kept \fI#DEFAULT_SYS_DIR#/devices\fP, which
|
||||
allows lvm to be used with different sets of devices. For example, system
|
||||
devices do not need to be exposed to a specific application, and the
|
||||
application can use lvm on its own devices that are not exposed to the
|
||||
system. The option --devicesfile <filename> is used to select the devices
|
||||
file to use with the command. Without the option set, the default system
|
||||
devices file is used.
|
||||
.P
|
||||
Setting --devicesfile "" causes lvm to not use a devices file.
|
||||
.P
|
||||
@ -59,3 +60,42 @@ if it does not yet exist.
|
||||
.P
|
||||
It is recommended to use lvm commands to make changes to the devices file to
|
||||
ensure proper updates.
|
||||
.P
|
||||
The device ID and device ID type are included in the VG metadata and can
|
||||
be reported with pvs -o deviceid,deviceidtype. (Note that the lvmdevices
|
||||
command does not update VG metadata, but subsequent lvm commands modifying
|
||||
the metadata will include the device ID.)
|
||||
.P
|
||||
Possible device ID types are:
|
||||
.br
|
||||
.IP \[bu] 2
|
||||
.B sys_wwid
|
||||
uses the wwid reported by sysfs. This is the first choice for non-virtual
|
||||
devices.
|
||||
.IP \[bu] 2
|
||||
.B sys_serial
|
||||
uses the serial number reported by sysfs. This is the second choice for
|
||||
non-virtual devices.
|
||||
.IP \[bu] 2
|
||||
.B mpath_uuid
|
||||
is used for dm multipath devices, reported by sysfs.
|
||||
.IP \[bu] 2
|
||||
.B crypt_uuid
|
||||
is used for dm crypt devices, reported by sysfs.
|
||||
.IP \[bu] 2
|
||||
.B md_uuid
|
||||
is used for md devices, reported by sysfs.
|
||||
.B lvmlv_uuid
|
||||
is used if a PV is placed on top of an lvm LV, reported by sysfs.
|
||||
.IP \[bu] 2
|
||||
.B loop_file
|
||||
is used for loop devices, the backing file name repored by sysfs.
|
||||
.IP \[bu] 2
|
||||
.B devname
|
||||
the device name is used if no other type applies.
|
||||
.P
|
||||
|
||||
The default choice for device ID type can be overriden using lvmdevices
|
||||
--addev --deviceidtype <type>. If the specified type is available for the
|
||||
device it will be used, otherwise the device will be added using the type
|
||||
that would otherwise be chosen.
|
||||
|
@ -228,6 +228,11 @@ arg(detachprofile_ARG, '\0', "detachprofile", 0, 0, 0,
|
||||
"Detaches a metadata profile from a VG or LV.\n"
|
||||
"See \\fBlvm.conf\\fP(5) for more information about profiles.\n")
|
||||
|
||||
arg(deviceidtype_ARG, '\0', "deviceidtype", string_VAL, 0, 0,
|
||||
"The type of device ID to use for the device.\n"
|
||||
"If the specified type is available for the device,\n"
|
||||
"then it will override the default type that lvm would use.\n")
|
||||
|
||||
arg(devices_ARG, '\0', "devices", pv_VAL, ARG_GROUPABLE, 0,
|
||||
"Devices that the command can use. This option can be repeated\n"
|
||||
"or accepts a comma separated list of devices. This overrides\n"
|
||||
|
@ -1430,6 +1430,7 @@ ID: lvmdevices_update
|
||||
DESC: Update the devices file to fix incorrect values.
|
||||
|
||||
lvmdevices --adddev PV
|
||||
OO: --deviceidtype String
|
||||
ID: lvmdevices_edit
|
||||
DESC: Add a device to the devices file.
|
||||
|
||||
|
@ -265,6 +265,7 @@ int lvmdevices(struct cmd_context *cmd, int argc, char **argv)
|
||||
|
||||
if (arg_is_set(cmd, adddev_ARG)) {
|
||||
const char *devname;
|
||||
const char *deviceidtype;
|
||||
|
||||
if (!(devname = arg_str_value(cmd, adddev_ARG, NULL)))
|
||||
goto_bad;
|
||||
@ -311,8 +312,10 @@ int lvmdevices(struct cmd_context *cmd, int argc, char **argv)
|
||||
dev_name(dev), dev_filtered_reason(dev));
|
||||
}
|
||||
|
||||
/* allow deviceidtype_ARG/deviceid_ARG ? */
|
||||
if (!device_id_add(cmd, dev, dev->pvid, NULL, NULL))
|
||||
/* also allow deviceid_ARG ? */
|
||||
deviceidtype = arg_str_value(cmd, deviceidtype_ARG, NULL);
|
||||
|
||||
if (!device_id_add(cmd, dev, dev->pvid, deviceidtype, NULL))
|
||||
goto_bad;
|
||||
if (!device_ids_write(cmd))
|
||||
goto_bad;
|
||||
|
Loading…
x
Reference in New Issue
Block a user