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.
|
* 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
|
* 1. use an idtype specific to a special/virtual device type
|
||||||
* e.g. loop, mpath, crypt, lvmlv, md, etc.
|
* e.g. loop, mpath, crypt, lvmlv, md, etc.
|
||||||
* 2. use an idtype specified by user option.
|
* 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.
|
* 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 (MAJOR(dev->dev) == cmd->dev_types->device_mapper_major) {
|
||||||
if (_dev_has_mpath_uuid(cmd, dev, &idname)) {
|
if (_dev_has_mpath_uuid(cmd, dev, &idname)) {
|
||||||
idtype = DEV_ID_TYPE_MPATH_UUID;
|
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");
|
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,
|
* No device-specific, existing, or user-specified idtypes,
|
||||||
* so use first available of sys_wwid / sys_serial / devname.
|
* 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,
|
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.
|
and updates the VG metadata to include device IDs of the PVs.
|
||||||
.P
|
.P
|
||||||
Commands adding new devices to the devices file necessarily look outside
|
Commands that add new devices to the devices file necessarily look outside
|
||||||
the existing devices file to find the devices to add. pvcreate, vgcreate,
|
the existing devices file to find the devices being added. pvcreate,
|
||||||
and vgextend also look outside the devices file to create new PVs and add
|
vgcreate, and vgextend also look outside the devices file to create new
|
||||||
them to the devices file.
|
PVs and add those PVs to the devices file.
|
||||||
.P
|
.P
|
||||||
LVM records devices in the devices file using hardware-specific IDs, such
|
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
|
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.)
|
types (which also aim to be as unique and stable as possible.) These
|
||||||
These device IDs are also written in the VG metadata. When no hardware or
|
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
|
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
|
the device ID. When devnames are used as IDs, lvm performs extra scanning
|
||||||
find devices if their devname changes, e.g. after reboot.
|
to find devices if their devname changes, e.g. after reboot.
|
||||||
.P
|
.P
|
||||||
When proper device IDs are used, an lvm command will not look at devices
|
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
|
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
|
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.
|
that are not listed will appear to be missing to the lvm command.
|
||||||
.P
|
.P
|
||||||
Multiple devices files can be kept in \fI#DEFAULT_SYS_DIR#/devices\fP, which allows lvm
|
Multiple devices files can be kept \fI#DEFAULT_SYS_DIR#/devices\fP, which
|
||||||
to be used with different sets of devices, e.g. system devices do not need
|
allows lvm to be used with different sets of devices. For example, system
|
||||||
to be exposed to a specific application, and the application can use lvm on
|
devices do not need to be exposed to a specific application, and the
|
||||||
its own devices that are not exposed to the system. The option
|
application can use lvm on its own devices that are not exposed to the
|
||||||
--devicesfile <filename> is used to select the devices file to use with the
|
system. The option --devicesfile <filename> is used to select the devices
|
||||||
command. Without the option set, the default system devices file is used.
|
file to use with the command. Without the option set, the default system
|
||||||
|
devices file is used.
|
||||||
.P
|
.P
|
||||||
Setting --devicesfile "" causes lvm to not use a devices file.
|
Setting --devicesfile "" causes lvm to not use a devices file.
|
||||||
.P
|
.P
|
||||||
@ -59,3 +60,42 @@ if it does not yet exist.
|
|||||||
.P
|
.P
|
||||||
It is recommended to use lvm commands to make changes to the devices file to
|
It is recommended to use lvm commands to make changes to the devices file to
|
||||||
ensure proper updates.
|
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"
|
"Detaches a metadata profile from a VG or LV.\n"
|
||||||
"See \\fBlvm.conf\\fP(5) for more information about profiles.\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,
|
arg(devices_ARG, '\0', "devices", pv_VAL, ARG_GROUPABLE, 0,
|
||||||
"Devices that the command can use. This option can be repeated\n"
|
"Devices that the command can use. This option can be repeated\n"
|
||||||
"or accepts a comma separated list of devices. This overrides\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.
|
DESC: Update the devices file to fix incorrect values.
|
||||||
|
|
||||||
lvmdevices --adddev PV
|
lvmdevices --adddev PV
|
||||||
|
OO: --deviceidtype String
|
||||||
ID: lvmdevices_edit
|
ID: lvmdevices_edit
|
||||||
DESC: Add a device to the devices file.
|
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)) {
|
if (arg_is_set(cmd, adddev_ARG)) {
|
||||||
const char *devname;
|
const char *devname;
|
||||||
|
const char *deviceidtype;
|
||||||
|
|
||||||
if (!(devname = arg_str_value(cmd, adddev_ARG, NULL)))
|
if (!(devname = arg_str_value(cmd, adddev_ARG, NULL)))
|
||||||
goto_bad;
|
goto_bad;
|
||||||
@ -311,8 +312,10 @@ int lvmdevices(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
dev_name(dev), dev_filtered_reason(dev));
|
dev_name(dev), dev_filtered_reason(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allow deviceidtype_ARG/deviceid_ARG ? */
|
/* also allow deviceid_ARG ? */
|
||||||
if (!device_id_add(cmd, dev, dev->pvid, NULL, NULL))
|
deviceidtype = arg_str_value(cmd, deviceidtype_ARG, NULL);
|
||||||
|
|
||||||
|
if (!device_id_add(cmd, dev, dev->pvid, deviceidtype, NULL))
|
||||||
goto_bad;
|
goto_bad;
|
||||||
if (!device_ids_write(cmd))
|
if (!device_ids_write(cmd))
|
||||||
goto_bad;
|
goto_bad;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user