mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-30 17:18:21 +03:00
b48ff3b94e
about losing access to a VG if lvm is downgraded to an earlier version.
340 lines
11 KiB
Groff
340 lines
11 KiB
Groff
.TH "LVMSYSTEMID" "7" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
|
|
|
.SH NAME
|
|
lvmsystemid \(em LVM system ID
|
|
|
|
.SH DESCRIPTION
|
|
|
|
Local VGs may exist on shared storage where they are visible to multiple
|
|
hosts. These VGs are intended to be used by only a single machine, even
|
|
though they are visible to many. A system_id identifying a single host
|
|
can be assigned to a VG to indicate the VGs owner. The VG owner can use
|
|
the VG as usual, and all other hosts will ignore it. This protects the VG
|
|
from accidental use by other hosts.
|
|
|
|
The system_id is not a dynamic property, and can only be changed in very
|
|
limited circumstances (see vgexport and vgimport). Even limited changes
|
|
to the VG system_id are not perfectly reflected across hosts. A more
|
|
coherent view of shared storage requires using an inter-host locking
|
|
system to coordinate access and update caches.
|
|
|
|
The system_id is a string uniquely identifying a host. It can be manually
|
|
set to a custom value or it can be assigned automatically by lvm using a
|
|
unique identifier already available on the host, e.g. machine-id or uname.
|
|
|
|
In vgcreate, the local system_id is saved in the new VG metadata. The
|
|
local host owns the new VG, and other hosts cannot use it.
|
|
|
|
A VG without a system_id can be used by any host, and a VG with a
|
|
system_id can only be used by a host with a matching system_id. A
|
|
.B foreign VG
|
|
is a VG with a system_id as viewed by a host with a system_id
|
|
that does not match the VGs system_id. (Or from a host without a
|
|
system_id.)
|
|
|
|
Valid system_id characters are the same as valid VG name characters. If a
|
|
system_id contains invalid characters, those characters are omitted and
|
|
remaining characters are used. If a system_id is longer than the maximum
|
|
name length, the characters up to the maximum length are used. The
|
|
maximum length of a system_id is 128 characters.
|
|
|
|
.SS Limitations and warnings
|
|
|
|
To benefit fully from system_id, all hosts must have system_id set, and
|
|
VGs must have system_id set. A VG on shared storage can be damaged or
|
|
destroyed in some cases which the user must be careful to avoid.
|
|
|
|
.IP \[bu] 2
|
|
A VG without a system_id can be used without restriction from any host,
|
|
even from hosts that have a system_id. Many VGs will not have a system_id
|
|
and are unprotected. Verify that a VG has a system_id by running the
|
|
command 'vgs -o+systemid'
|
|
|
|
A VG will not have a system_id if it was created before this feature was
|
|
added to lvm, or if it was created by a host that did not have a system_id
|
|
defined. A system_id can be assigned to these VGs by using vgchange
|
|
--systemid (see below).
|
|
|
|
.IP \[bu] 2
|
|
Two hosts should not be assigned the same system_id. Doing so defeats
|
|
the purpose of the system_id which is to distinguish different hosts.
|
|
|
|
.IP \[bu] 2
|
|
Orphan PVs (or unused devices) on shared storage are completely
|
|
unprotected by the system_id feature. Commands that use these PVs, such
|
|
as vgcreate or vgextend, are not prevented from performing conflicting
|
|
operations and corrupting the PVs. See the
|
|
.B orphans
|
|
section for more information.
|
|
|
|
.IP \[bu] 2
|
|
A host using an old version of lvm without the system_id feature will not
|
|
recognize a new system_id in VGs from other hosts. Even though the old
|
|
version of lvm is not blocked from reading a VG with a system_id, it is
|
|
blocked from writing to the VG (or its LVs). The new system_id changes
|
|
the write mode of a VG, making it appear read-only to previous lvm
|
|
versions.
|
|
|
|
This also means that if a host downgrades its version of lvm, it would
|
|
lose access to any VGs it had created with a system_id. To avoid this,
|
|
the system_id should be removed from VGs before downgrading to an lvm
|
|
version without the system_id feature.
|
|
|
|
.P
|
|
|
|
.SS Types of VG access
|
|
A "local VG" is meant to be used by a single host.
|
|
.br
|
|
A "shared VG" is meant to be used by multiple hosts.
|
|
.br
|
|
These can be further distinguished as:
|
|
|
|
.B Unrestricted:
|
|
A local VG that has no system_id. This VG type is unprotected and
|
|
accessible to any host.
|
|
|
|
.B Owned:
|
|
A local VG that has a system_id set, as viewed from the one host with a
|
|
matching system_id (the owner). This VG type is by definition acessible.
|
|
|
|
.B Foreign:
|
|
A local VG that has a system_id set, as viewed from any host with an
|
|
unmatching system_id (or no system_id). It is owned by another host.
|
|
This VG type is by definition not accessible.
|
|
|
|
.B Exported:
|
|
A local VG that has been exported with vgexport and has no system_id.
|
|
This VG type can only be accessed by vgimport which will change it to
|
|
owned.
|
|
|
|
.B Clustered:
|
|
A shared VG with the clustered flag set, and no system_id. This VG type
|
|
is only accessible to hosts using clvmd.
|
|
|
|
.SS system_id_source
|
|
|
|
A host's own system_id can be defined in a number of ways. lvm.conf
|
|
global/system_id_source defines the method lvm will use to find the local
|
|
system_id:
|
|
|
|
.TP
|
|
.B none
|
|
.br
|
|
|
|
lvm will not use a system_id. lvm is allowed to access VGs without a
|
|
system_id, and will create new VGs without a system_id. An undefined
|
|
system_id_source is equivalent to none.
|
|
|
|
.I lvm.conf
|
|
.nf
|
|
global {
|
|
system_id_source = "none"
|
|
}
|
|
.fi
|
|
|
|
.TP
|
|
.B machineid
|
|
.br
|
|
|
|
The content of /etc/machine-id is used as the system_id if available.
|
|
See
|
|
.BR machine-id (5)
|
|
and
|
|
.BR systemd-machine-id-setup (1)
|
|
to check if machine-id is available on the host.
|
|
|
|
.I lvm.conf
|
|
.nf
|
|
global {
|
|
system_id_source = "machineid"
|
|
}
|
|
.fi
|
|
|
|
.TP
|
|
.B uname
|
|
.br
|
|
|
|
The string utsname.nodename from
|
|
.BR uname (2)
|
|
is used as the system_id. A uname beginning with "localhost"
|
|
is ignored and equivalent to none.
|
|
|
|
.I lvm.conf
|
|
.nf
|
|
global {
|
|
system_id_source = "uname"
|
|
}
|
|
.fi
|
|
|
|
.TP
|
|
.B lvmlocal
|
|
.br
|
|
|
|
The system_id is defined in lvmlocal.conf local/system_id.
|
|
|
|
.I lvm.conf
|
|
.nf
|
|
global {
|
|
system_id_source = "lvmlocal"
|
|
}
|
|
.fi
|
|
|
|
.I lvmlocal.conf
|
|
.nf
|
|
local {
|
|
system_id = "example_name"
|
|
}
|
|
.fi
|
|
|
|
.TP
|
|
.B file
|
|
.br
|
|
|
|
The system_id is defined in a file specified by lvm.conf
|
|
global/system_id_file.
|
|
|
|
.I lvm.conf
|
|
.nf
|
|
global {
|
|
system_id_source = "file"
|
|
system_id_file = "/path/to/file"
|
|
}
|
|
.fi
|
|
|
|
.LP
|
|
|
|
Changing system_id_source will often cause the system_id to change, which
|
|
may prevent the host from using VGs that it previously used (see
|
|
extra_system_ids below to handle this.)
|
|
|
|
If a system_id_source other than none fails to resolve a system_id, the
|
|
host will be allowed to access VGs with no system_id, but will not be
|
|
allowed to access VGs with a defined system_id.
|
|
|
|
.SS extra_system_ids
|
|
|
|
In some cases, it may be useful for a host to access VGs with different
|
|
system_id's, e.g. if a host's system_id changes, and it wants to use VGs
|
|
that it created with its old system_id. To allow a host to access VGs
|
|
with other system_id's, those other system_id's can be listed in
|
|
lvmlocal.conf local/extra_system_ids.
|
|
|
|
.I lvmlocal.conf
|
|
.nf
|
|
local {
|
|
extra_system_ids = [ "my_other_name" ]
|
|
}
|
|
.fi
|
|
|
|
.SS vgcreate
|
|
|
|
In vgcreate, the host running the command assigns its own system_id to the
|
|
new VG. To override this and set another system_id:
|
|
|
|
.B vgcreate --systemid
|
|
.I SystemID VG Devices
|
|
|
|
Overriding the system_id makes it possible for a host to create a VG that
|
|
it may not be able to use. Another host with a system_id matching the one
|
|
specified may not recognize the new VG without manually rescanning
|
|
devices.
|
|
|
|
If the --systemid argument is an empty string (""), the VG is created with
|
|
no system_id, making it accessible to other hosts (see warnings above.)
|
|
|
|
.SS report/display
|
|
|
|
The system_id of a VG is displayed with the "systemid" reporting option.
|
|
|
|
Report/display commands ignore foreign VGs by default. To report foreign
|
|
VGs, the --foreign option can be used. This causes the VGs to be read
|
|
from disk. Because lvmetad caching is not used, this option can cause
|
|
poor performance.
|
|
|
|
.B vgs --foreign -o+systemid
|
|
|
|
When a host with no system_id sees foreign VGs, it warns about them as
|
|
they are skipped. The host should be assigned a system_id, after which
|
|
standard reporting commands will silently ignore foreign VGs.
|
|
|
|
.SS vgexport/vgimport
|
|
|
|
vgexport clears the system_id.
|
|
|
|
Other hosts will continue to see a newly exported VG as foreign because of
|
|
local caching (when lvmetad is used). Manually updating the local lvmetad
|
|
cache with pvscan --cache will allow a host to recognize the newly
|
|
exported VG.
|
|
|
|
vgimport sets the VG system_id to the local system_id as determined by
|
|
lvm.conf system_id_sources. vgimport automatically scans storage for
|
|
newly exported VGs.
|
|
|
|
After vgimport, the exporting host will continue to see the VG as
|
|
exported, and not owned by the new host. Manually updating the local
|
|
cache with pvscan --cache will allow a host to recognize the newly
|
|
imported VG as foreign.
|
|
|
|
.SS vgchange
|
|
|
|
A host can change the system_id of its own VGs, but the command requires
|
|
confirmation because the host may lose access to the VG being changed:
|
|
|
|
.B vgchange --systemid
|
|
.I SystemID VG
|
|
|
|
The system_id can be removed from a VG by specifying an empty string ("")
|
|
as the new system_id. This makes the VG accessible to other hosts (see
|
|
warnings above.)
|
|
|
|
A host cannot directly change the system_id of a foreign VG.
|
|
|
|
To move a VG from one host to another, vgexport and vgimport should be
|
|
used.
|
|
|
|
To forcibly gain ownership of a foreign VG, a host can add the foreign
|
|
system_id to its allow_system_id list, change the system_id of the foreign
|
|
VG to its own, and remove the foreign system_id from its allow_system_id
|
|
list.
|
|
|
|
.SS clustered VGs
|
|
|
|
A "clustered" VG should have no system_id set, allowing multiple hosts to
|
|
use it via clvm. Changing a VG to clustered will clear the existing
|
|
system_id. Changing a VG to not clustered will set the system_id to the
|
|
host running the vgchange command.
|
|
|
|
.SS creation_host
|
|
|
|
In vgcreate, the VG metadata field creation_host is set by default to the
|
|
host's uname. The creation_host cannot be changed, and is not used to
|
|
control access. When system_id_source is "uname", the system_id and
|
|
creation_host will be the same.
|
|
|
|
.SS orphans
|
|
|
|
Orphan PVs are unused devices; they are not currently used in any VG.
|
|
Because of this, they are not protected by a system_id, and any host can
|
|
use them. Coodination of changes to orphan PVs is beyond the scope of
|
|
system_id. The same is true of any block device that is not a PV.
|
|
|
|
The effects of this are especially evident when lvm uses lvmetad caching.
|
|
For example, if multiple hosts see an orphan PV, and one host creates a VG
|
|
using the orphan, the other hosts will continue to report the PV as an
|
|
orphan. Nothing would automatically prevent the other hosts from using
|
|
the newly allocated PV and corrupting it. If the other hosts run a
|
|
command to rescan devices, and update lvmetad, they would then recognize
|
|
the PV has been used by another host. A command that rescans devices
|
|
could be pvscan --cache, or vgs --foreign.
|
|
|
|
.SH SEE ALSO
|
|
.BR vgcreate (8),
|
|
.BR vgchange (8),
|
|
.BR vgimport (8),
|
|
.BR vgexport (8),
|
|
.BR lvm.conf (5),
|
|
.BR machine-id (5),
|
|
.BR uname (2),
|
|
.BR vgs (8)
|
|
|