mirror of
git://sourceware.org/git/lvm2.git
synced 2025-10-05 07:33:15 +03:00
Compare commits
13 Commits
dev-dct-cm
...
dev-dct-cm
Author | SHA1 | Date | |
---|---|---|---|
|
bfcc1f0ccc | ||
|
27e2902672 | ||
|
a8c3979252 | ||
|
94fab0ec87 | ||
|
de81dcabd0 | ||
|
6f37cba3e7 | ||
|
3b7a6d1c40 | ||
|
75732b65a4 | ||
|
a4d1ceb6d4 | ||
|
b5e373866d | ||
|
d81e37acf5 | ||
|
516068b8cc | ||
|
95e00d2043 |
@@ -1,11 +1,5 @@
|
||||
Version 2.02.169 -
|
||||
=====================================
|
||||
Add missing udev sync when flushing dirty cache content.
|
||||
vgchange -p accepts only uint32 numbers.
|
||||
Report thin LV date for merged LV when the merge is in progress.
|
||||
Detect if snapshot merge really started before polling for progress.
|
||||
Checking LV for merging origin requires also it has merged snapshot.
|
||||
Extend validation of metadata processing.
|
||||
Enable usage of cached volumes as snapshot origin LV.
|
||||
Fix displayed lv name when splitting snapshot (2.02.146).
|
||||
Warn about command not making metadata backup just once per command.
|
||||
|
@@ -1,6 +1,5 @@
|
||||
Version 1.02.138 -
|
||||
=====================================
|
||||
Thin dmeventd plugin reacts faster on lvextend failure path with umount.
|
||||
Add dm_stats_bind_from_fd() to bind a stats handle from a file descriptor.
|
||||
Do not try call callback when reverting activation on error path.
|
||||
Fix file mapping for extents with physically adjacent extents.
|
||||
|
@@ -328,7 +328,6 @@ void process_event(struct dm_task *dmt,
|
||||
char *params;
|
||||
int needs_policy = 0;
|
||||
int needs_umount = 0;
|
||||
struct dm_task *new_dmt = NULL;
|
||||
|
||||
#if THIN_DEBUG
|
||||
log_debug("Watch for tp-data:%.2f%% tp-metadata:%.2f%%.",
|
||||
@@ -347,28 +346,6 @@ void process_event(struct dm_task *dmt,
|
||||
goto out;
|
||||
|
||||
stack;
|
||||
|
||||
/*
|
||||
* Rather update oldish status
|
||||
* since after 'command' processing
|
||||
* percentage info could have changed a lot.
|
||||
* If we would get above UMOUNT_THRESH
|
||||
* we would wait for next sigalarm.
|
||||
*/
|
||||
if (!(new_dmt = dm_task_create(DM_DEVICE_STATUS)))
|
||||
goto_out;
|
||||
|
||||
if (!dm_task_set_uuid(new_dmt, dm_task_get_uuid(dmt)))
|
||||
goto_out;
|
||||
|
||||
/* Non-blocking status read */
|
||||
if (!dm_task_no_flush(new_dmt))
|
||||
log_warn("WARNING: Can't set no_flush for dm status.");
|
||||
|
||||
if (!dm_task_run(new_dmt))
|
||||
goto_out;
|
||||
|
||||
dmt = new_dmt;
|
||||
}
|
||||
|
||||
dm_get_next_target(dmt, next, &start, &length, &target_type, ¶ms);
|
||||
@@ -456,9 +433,6 @@ out:
|
||||
device, state->fails);
|
||||
pthread_kill(pthread_self(), SIGALRM);
|
||||
}
|
||||
|
||||
if (new_dmt)
|
||||
dm_task_destroy(new_dmt);
|
||||
}
|
||||
|
||||
int register_device(const char *device,
|
||||
|
@@ -618,7 +618,7 @@ class Lv(LvCommon):
|
||||
rc, out, err = cmdhandler.activate_deactivate(
|
||||
'lvchange', lv_name, activate, control_flags, options)
|
||||
if rc == 0:
|
||||
cfg.load()
|
||||
dbo.refresh()
|
||||
return '/'
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
@@ -667,7 +667,7 @@ class Lv(LvCommon):
|
||||
rc, out, err = cmdhandler.lv_tag(
|
||||
lv_name, tags_add, tags_del, tag_options)
|
||||
if rc == 0:
|
||||
cfg.load()
|
||||
dbo.refresh()
|
||||
return '/'
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
|
@@ -19,6 +19,7 @@ from .utils import log_error, mt_async_result
|
||||
class RequestEntry(object):
|
||||
def __init__(self, tmo, method, arguments, cb, cb_error,
|
||||
return_tuple=True, job_state=None):
|
||||
self.tmo = tmo
|
||||
self.method = method
|
||||
self.arguments = arguments
|
||||
self.cb = cb
|
||||
@@ -34,38 +35,31 @@ class RequestEntry(object):
|
||||
self._return_tuple = return_tuple
|
||||
self._job_state = job_state
|
||||
|
||||
if tmo < 0:
|
||||
if self.tmo < 0:
|
||||
# Client is willing to block forever
|
||||
pass
|
||||
elif tmo == 0:
|
||||
self._return_job()
|
||||
else:
|
||||
# Note: using 990 instead of 1000 for second to ms conversion to
|
||||
# account for overhead. Goal is to return just before the
|
||||
# timeout amount has expired. Better to be a little early than
|
||||
# late.
|
||||
self.timer_id = GLib.timeout_add(
|
||||
tmo * 990, RequestEntry._request_timeout, self)
|
||||
self.timer_id = GLib.timeout_add_seconds(
|
||||
tmo, RequestEntry._request_timeout, self)
|
||||
|
||||
@staticmethod
|
||||
def _request_timeout(r):
|
||||
"""
|
||||
Method which gets called when the timer runs out!
|
||||
:param r: RequestEntry which timed out
|
||||
:return: Result of timer_expired
|
||||
:return: Nothing
|
||||
"""
|
||||
return r.timer_expired()
|
||||
r.timer_expired()
|
||||
|
||||
def _return_job(self):
|
||||
# Return job is only called when we create a request object or when
|
||||
# we pop a timer. In both cases we are running in the correct context
|
||||
# and do not need to schedule the call back in main context.
|
||||
self._job = Job(self, self._job_state)
|
||||
cfg.om.register_object(self._job, True)
|
||||
if self._return_tuple:
|
||||
self.cb(('/', self._job.dbus_object_path()))
|
||||
mt_async_result(self.cb, ('/', self._job.dbus_object_path()))
|
||||
else:
|
||||
self.cb(self._job.dbus_object_path())
|
||||
mt_async_result(self.cb, self._job.dbus_object_path())
|
||||
|
||||
def run_cmd(self):
|
||||
try:
|
||||
|
@@ -727,7 +727,7 @@ class Vg(AutomatedProperties):
|
||||
rc, out, err = cmdhandler.vg_tag(
|
||||
vg_name, tags_add, tags_del, tag_options)
|
||||
if rc == 0:
|
||||
cfg.load()
|
||||
dbo.refresh()
|
||||
return '/'
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
@@ -780,7 +780,7 @@ class Vg(AutomatedProperties):
|
||||
if dbo:
|
||||
rc, out, err = method(vg_name, value, options)
|
||||
if rc == 0:
|
||||
cfg.load()
|
||||
dbo.refresh()
|
||||
return '/'
|
||||
else:
|
||||
raise dbus.exceptions.DBusException(
|
||||
|
@@ -358,10 +358,6 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int lv_deactivate_any_missing_subdevs(const struct logical_volume *lv)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int pv_uses_vg(struct physical_volume *pv,
|
||||
struct volume_group *vg)
|
||||
{
|
||||
@@ -1940,7 +1936,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
|
||||
/* FIXME specify events */
|
||||
if (!monitor_fn(seg, 0)) {
|
||||
log_error("%s: %s segment monitoring function failed.",
|
||||
display_lvname(lv), lvseg_name(seg));
|
||||
display_lvname(lv), seg->segtype->name);
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
@@ -2577,77 +2573,6 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Remove any existing, closed mapped device by @name */
|
||||
static int _remove_dm_dev_by_name(const char *name)
|
||||
{
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
struct dm_info info;
|
||||
|
||||
if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
|
||||
return_0;
|
||||
|
||||
/* Check, if the device exists. */
|
||||
if (dm_task_set_name(dmt, name) && dm_task_run(dmt) && dm_task_get_info(dmt, &info)) {
|
||||
dm_task_destroy(dmt);
|
||||
|
||||
/* Ignore non-existing or open dm devices */
|
||||
if (!info.exists || info.open_count)
|
||||
return 1;
|
||||
|
||||
if (!(dmt = dm_task_create(DM_DEVICE_REMOVE)))
|
||||
return_0;
|
||||
|
||||
if (dm_task_set_name(dmt, name))
|
||||
r = dm_task_run(dmt);
|
||||
}
|
||||
|
||||
dm_task_destroy(dmt);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Work all segments of @lv removing any existing, closed "*-missing_N_0" sub devices. */
|
||||
static int _lv_remove_any_missing_subdevs(struct logical_volume *lv)
|
||||
{
|
||||
if (lv) {
|
||||
uint32_t seg_no = 0;
|
||||
char name[257];
|
||||
struct lv_segment *seg;
|
||||
|
||||
dm_list_iterate_items(seg, &lv->segments) {
|
||||
if (seg->area_count != 1)
|
||||
return_0;
|
||||
if (dm_snprintf(name, sizeof(name), "%s-%s-missing_%u_0", seg->lv->vg->name, seg->lv->name, seg_no) < 0)
|
||||
return 0;
|
||||
if (!_remove_dm_dev_by_name(name))
|
||||
return 0;
|
||||
|
||||
seg_no++;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Remove any "*-missing_*" sub devices added by the activation layer for an rmate/rimage missing PV mapping */
|
||||
int lv_deactivate_any_missing_subdevs(const struct logical_volume *lv)
|
||||
{
|
||||
uint32_t s;
|
||||
struct lv_segment *seg = first_seg(lv);
|
||||
|
||||
for (s = 0; s < seg->area_count; s++) {
|
||||
if (seg_type(seg, s) == AREA_LV &&
|
||||
!_lv_remove_any_missing_subdevs(seg_lv(seg, s)))
|
||||
return 0;
|
||||
if (seg->meta_areas && seg_metatype(seg, s) == AREA_LV &&
|
||||
!_lv_remove_any_missing_subdevs(seg_metalv(seg, s)))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Does PV use VG somewhere in its construction?
|
||||
* Returns 1 on failure.
|
||||
|
@@ -124,8 +124,6 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, const struct logi
|
||||
|
||||
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv);
|
||||
|
||||
int lv_deactivate_any_missing_subdevs(const struct logical_volume *lv);
|
||||
|
||||
/*
|
||||
* Returns 1 if info structure has been populated, else 0 on failure.
|
||||
* When lvinfo* is NULL, it returns 1 if the device is locally active, 0 otherwise.
|
||||
|
@@ -2493,7 +2493,7 @@ static int _add_target_to_dtree(struct dev_manager *dm,
|
||||
|
||||
if (!seg->segtype->ops->add_target_line) {
|
||||
log_error(INTERNAL_ERROR "_emit_target cannot handle "
|
||||
"segment type %s.", lvseg_name(seg));
|
||||
"segment type %s.", seg->segtype->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -89,7 +89,6 @@ struct cmd_context {
|
||||
*/
|
||||
const char *cmd_line;
|
||||
const char *name; /* needed before cmd->command is set */
|
||||
struct command_name *cname;
|
||||
struct command *command;
|
||||
char **argv;
|
||||
struct arg_values *opt_arg_values;
|
||||
|
@@ -398,7 +398,7 @@ int export_extents(struct disk_list *dl, uint32_t lv_num,
|
||||
if (!(seg->segtype->flags & SEG_FORMAT1_SUPPORT)) {
|
||||
log_error("Segment type %s in LV %s: "
|
||||
"unsupported by format1",
|
||||
lvseg_name(seg), lv->name);
|
||||
seg->segtype->name, lv->name);
|
||||
return 0;
|
||||
}
|
||||
if (seg_type(seg, s) != AREA_PV) {
|
||||
|
@@ -326,7 +326,7 @@ int validate_lv_cache_create_origin(const struct logical_volume *origin_lv)
|
||||
lv_is_cow(origin_lv) || lv_is_merging_cow(origin_lv) ||
|
||||
lv_is_virtual(origin_lv)) {
|
||||
log_error("Cache is not supported with %s segment type of the original logical volume %s.",
|
||||
lvseg_name(first_seg(origin_lv)), display_lvname(origin_lv));
|
||||
first_seg(origin_lv)->segtype->name, display_lvname(origin_lv));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -424,15 +424,9 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
|
||||
|
||||
/* Switch to cleaner policy to flush the cache */
|
||||
cache_seg->cleaner_policy = 1;
|
||||
/* Reload cache volume with "cleaner" policy */
|
||||
/* Reaload kernel with "cleaner" policy */
|
||||
if (!lv_update_and_reload_origin(cache_lv))
|
||||
return_0;
|
||||
|
||||
if (!sync_local_dev_names(cache_lv->vg->cmd)) {
|
||||
log_error("Failed to sync local devices when clearing cache volume %s.",
|
||||
display_lvname(cache_lv));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -442,12 +436,6 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
|
||||
if (1) {
|
||||
if (!lv_refresh_suspend_resume(lock_lv))
|
||||
return_0;
|
||||
|
||||
if (!sync_local_dev_names(cache_lv->vg->cmd)) {
|
||||
log_error("Failed to sync local devices after final clearing of cache %s.",
|
||||
display_lvname(cache_lv));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cache_seg->cleaner_policy = 0;
|
||||
|
@@ -1418,19 +1418,35 @@ static int _lv_refresh_suspend_resume(const struct logical_volume *lv)
|
||||
|
||||
int lv_refresh_suspend_resume(const struct logical_volume *lv)
|
||||
{
|
||||
if (!_lv_refresh_suspend_resume(lv))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Remove any transiently activated error
|
||||
* devices which arean't used any more.
|
||||
* FIXME:
|
||||
*
|
||||
* in case of RAID, refresh the SubLVs before
|
||||
* refreshing the top-level one in order to cope
|
||||
* with transient failures of SubLVs.
|
||||
*/
|
||||
if (lv_is_raid(lv) && !lv_deactivate_any_missing_subdevs(lv)) {
|
||||
log_error("Failed to remove temporary SubLVs from %s", display_lvname(lv));
|
||||
return 0;
|
||||
if (lv_is_raid(lv)) {
|
||||
if (vg_is_clustered(lv->vg) &&
|
||||
lv_is_active_remotely(lv)) {
|
||||
if (!_lv_refresh_suspend_resume(lv))
|
||||
return 0;
|
||||
} else {
|
||||
uint32_t s;
|
||||
struct lv_segment *seg = first_seg(lv);
|
||||
|
||||
for (s = 0; s < seg->area_count; s++) {
|
||||
if (seg_type(seg, s) == AREA_LV &&
|
||||
!_lv_refresh_suspend_resume(seg_lv(seg, s)))
|
||||
return 0;
|
||||
if (seg->meta_areas &&
|
||||
seg_metatype(seg, s) == AREA_LV &&
|
||||
!_lv_refresh_suspend_resume(seg_metalv(seg, s)))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
return _lv_refresh_suspend_resume(lv);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3466,7 +3482,7 @@ int lv_add_segment(struct alloc_handle *ah,
|
||||
region_size))
|
||||
return_0;
|
||||
|
||||
if (segtype_can_split(segtype) && !lv_merge_segments(lv)) {
|
||||
if ((segtype->flags & SEG_CAN_SPLIT) && !lv_merge_segments(lv)) {
|
||||
log_error("Couldn't merge segments after extending "
|
||||
"logical volume.");
|
||||
return 0;
|
||||
@@ -4595,7 +4611,7 @@ static int _lvresize_adjust_policy(const struct logical_volume *lv,
|
||||
|
||||
if (!policy_amount) {
|
||||
log_error("Can't extend %s with %s autoextend percent set to 0%%.",
|
||||
display_lvname(lv), lvseg_name(first_seg(lv)));
|
||||
display_lvname(lv), first_seg(lv)->segtype->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -7047,7 +7063,7 @@ static int _should_wipe_lv(struct lvcreate_params *lp,
|
||||
struct logical_volume *lv, int warn)
|
||||
{
|
||||
/* Unzeroable segment */
|
||||
if (seg_cannot_be_zeroed(first_seg(lv)))
|
||||
if (first_seg(lv)->segtype->flags & SEG_CANNOT_BE_ZEROED)
|
||||
return 0;
|
||||
|
||||
/* Thin snapshot need not to be zeroed */
|
||||
|
@@ -71,13 +71,6 @@ int lv_merge_segments(struct logical_volume *lv)
|
||||
if (error_count++ > ERROR_MAX) \
|
||||
goto out
|
||||
|
||||
#define seg_error(msg) { \
|
||||
log_error("LV %s, segment %u invalid: %s for %s segment.", \
|
||||
seg->lv->name, seg_count, (msg), lvseg_name(seg)); \
|
||||
if ((*error_count)++ > ERROR_MAX) \
|
||||
return; \
|
||||
}
|
||||
|
||||
/*
|
||||
* RAID segment property checks.
|
||||
*
|
||||
@@ -195,10 +188,44 @@ static void _check_non_raid_seg_members(struct lv_segment *seg, int *error_count
|
||||
{
|
||||
if (seg->origin) /* snap and thin */
|
||||
raid_seg_error("non-zero origin LV");
|
||||
if (seg->indirect_origin) /* thin */
|
||||
raid_seg_error("non-zero indirect_origin LV");
|
||||
if (seg->merge_lv) /* thin */
|
||||
raid_seg_error("non-zero merge LV");
|
||||
if (seg->cow) /* snap */
|
||||
raid_seg_error("non-zero cow LV");
|
||||
if (!dm_list_empty(&seg->origin_list)) /* snap */
|
||||
raid_seg_error("non-zero origin_list");
|
||||
if (seg->log_lv)
|
||||
raid_seg_error("non-zero log LV");
|
||||
if (seg->segtype_private)
|
||||
raid_seg_error("non-zero segtype_private");
|
||||
/* thin members */
|
||||
if (seg->metadata_lv)
|
||||
raid_seg_error("non-zero metadata LV");
|
||||
if (seg->transaction_id)
|
||||
raid_seg_error("non-zero transaction_id");
|
||||
if (seg->zero_new_blocks)
|
||||
raid_seg_error("non-zero zero_new_blocks");
|
||||
if (seg->discards)
|
||||
raid_seg_error("non-zero discards");
|
||||
if (!dm_list_empty(&seg->thin_messages))
|
||||
raid_seg_error("non-zero thin_messages list");
|
||||
if (seg->external_lv)
|
||||
raid_seg_error("non-zero external LV");
|
||||
if (seg->pool_lv)
|
||||
raid_seg_error("non-zero pool LV");
|
||||
if (seg->device_id)
|
||||
raid_seg_error("non-zero device_id");
|
||||
/* cache members */
|
||||
if (seg->cache_mode)
|
||||
raid_seg_error("non-zero cache_mode");
|
||||
if (seg->policy_name)
|
||||
raid_seg_error("non-zero policy_name");
|
||||
if (seg->policy_settings)
|
||||
raid_seg_error("non-zero policy_settings");
|
||||
if (seg->cleaner_policy)
|
||||
raid_seg_error("non-zero cleaner_policy");
|
||||
/* replicator members (deprecated) */
|
||||
if (seg->replicator)
|
||||
raid_seg_error("non-zero replicator");
|
||||
@@ -222,6 +249,9 @@ static void _check_raid_seg(struct lv_segment *seg, int *error_count)
|
||||
uint32_t area_len, s;
|
||||
|
||||
/* General checks applying to all RAIDs */
|
||||
if (!seg_is_raid(seg))
|
||||
raid_seg_error("erroneous RAID check");
|
||||
|
||||
if (!seg->area_count)
|
||||
raid_seg_error("zero area count");
|
||||
|
||||
@@ -246,6 +276,9 @@ static void _check_raid_seg(struct lv_segment *seg, int *error_count)
|
||||
return;
|
||||
}
|
||||
|
||||
if (seg->chunk_size)
|
||||
raid_seg_error_val("non-zero chunk_size", seg->chunk_size);
|
||||
|
||||
/* FIXME: should we check any non-RAID segment struct members at all? */
|
||||
_check_non_raid_seg_members(seg, error_count);
|
||||
|
||||
@@ -296,169 +329,6 @@ static void _check_raid_seg(struct lv_segment *seg, int *error_count)
|
||||
}
|
||||
/* END: RAID segment property checks. */
|
||||
|
||||
static void _check_lv_segment(struct logical_volume *lv, struct lv_segment *seg,
|
||||
unsigned seg_count, int *error_count)
|
||||
{
|
||||
struct lv_segment *seg2;
|
||||
|
||||
if (lv_is_mirror_image(lv) &&
|
||||
(!(seg2 = find_mirror_seg(seg)) || !seg_is_mirrored(seg2)))
|
||||
seg_error("mirror image is not mirrored");
|
||||
|
||||
if (seg_is_cache(seg)) {
|
||||
if (!lv_is_cache(lv))
|
||||
seg_error("is not flagged as cache LV");
|
||||
|
||||
if (!seg->pool_lv) {
|
||||
seg_error("is missing cache pool LV");
|
||||
} else if (!lv_is_cache_pool(seg->pool_lv))
|
||||
seg_error("is not referencing cache pool LV");
|
||||
} else { /* !cache */
|
||||
if (seg->cleaner_policy)
|
||||
seg_error("sets cleaner_policy");
|
||||
}
|
||||
|
||||
if (seg_is_cache_pool(seg)) {
|
||||
if (!dm_list_empty(&seg->lv->segs_using_this_lv)) {
|
||||
switch (seg->cache_mode) {
|
||||
case CACHE_MODE_WRITETHROUGH:
|
||||
case CACHE_MODE_WRITEBACK:
|
||||
case CACHE_MODE_PASSTHROUGH:
|
||||
break;
|
||||
default:
|
||||
seg_error("has invalid cache's feature flag")
|
||||
}
|
||||
if (!seg->policy_name)
|
||||
seg_error("is missing cache policy name");
|
||||
}
|
||||
} else { /* !cache_pool */
|
||||
if (seg->cache_mode)
|
||||
seg_error("sets cache mode");
|
||||
if (seg->policy_name)
|
||||
seg_error("sets policy name");
|
||||
if (seg->policy_settings)
|
||||
seg_error("sets policy settings");
|
||||
}
|
||||
|
||||
if (!seg_can_error_when_full(seg) && lv_is_error_when_full(lv))
|
||||
seg_error("does not support flag ERROR_WHEN_FULL.");
|
||||
|
||||
if (seg_is_mirrored(seg)) {
|
||||
/* Check mirror log - which is attached to the mirrored seg */
|
||||
if (seg->log_lv) {
|
||||
if (!lv_is_mirror_log(seg->log_lv))
|
||||
seg_error("log LV is not a mirror log");
|
||||
|
||||
if (!(seg2 = first_seg(seg->log_lv)) || (find_mirror_seg(seg2) != seg))
|
||||
seg_error("log LV does not point back to mirror segment");
|
||||
}
|
||||
} else { /* !mirrored */
|
||||
if (seg->log_lv) {
|
||||
if (lv_is_raid_image(lv))
|
||||
seg_error("log LV is not a mirror log or a RAID image");
|
||||
}
|
||||
}
|
||||
|
||||
if (seg_is_raid(seg))
|
||||
_check_raid_seg(seg, error_count);
|
||||
|
||||
if (seg_is_pool(seg)) {
|
||||
if ((seg->area_count != 1) || (seg_type(seg, 0) != AREA_LV)) {
|
||||
seg_error("is missing a pool data LV");
|
||||
} else if (!(seg2 = first_seg(seg_lv(seg, 0))) || (find_pool_seg(seg2) != seg))
|
||||
seg_error("data LV does not refer back to pool LV");
|
||||
|
||||
if (!seg->metadata_lv) {
|
||||
seg_error("is missing a pool metadata LV");
|
||||
} else if (!(seg2 = first_seg(seg->metadata_lv)) || (find_pool_seg(seg2) != seg))
|
||||
seg_error("metadata LV does not refer back to pool LV");
|
||||
|
||||
if (!validate_pool_chunk_size(lv->vg->cmd, seg->segtype, seg->chunk_size))
|
||||
seg_error("has invalid chunk size.");
|
||||
} else { /* !thin_pool && !cache_pool */
|
||||
if (seg->metadata_lv)
|
||||
seg_error("must not have pool metadata LV set");
|
||||
}
|
||||
|
||||
if (seg_is_thin_pool(seg)) {
|
||||
if (!lv_is_thin_pool(lv))
|
||||
seg_error("is not flagged as thin pool LV");
|
||||
|
||||
if (lv_is_thin_volume(lv))
|
||||
seg_error("is a thin volume that must not contain thin pool segment");
|
||||
} else { /* !thin_pool */
|
||||
if (seg->zero_new_blocks)
|
||||
seg_error("sets zero_new_blocks");
|
||||
if (seg->discards)
|
||||
seg_error("sets discards");
|
||||
if (!dm_list_empty(&seg->thin_messages))
|
||||
seg_error("sets thin_messages list");
|
||||
}
|
||||
|
||||
if (seg_is_thin_volume(seg)) {
|
||||
if (!lv_is_thin_volume(lv))
|
||||
seg_error("is not flagged as thin volume LV");
|
||||
|
||||
if (lv_is_thin_pool(lv))
|
||||
seg_error("is a thin pool that must not contain thin volume segment");
|
||||
|
||||
if (!seg->pool_lv) {
|
||||
seg_error("is missing thin pool LV");
|
||||
} else if (!lv_is_thin_pool(seg->pool_lv))
|
||||
seg_error("is not referencing thin pool LV");
|
||||
|
||||
if (seg->device_id > DM_THIN_MAX_DEVICE_ID)
|
||||
seg_error("has too large device id");
|
||||
|
||||
if (seg->external_lv &&
|
||||
!lv_is_external_origin(seg->external_lv))
|
||||
seg_error("external LV is not flagged as a external origin LV");
|
||||
|
||||
if (seg->merge_lv) {
|
||||
if (!lv_is_thin_volume(seg->merge_lv))
|
||||
seg_error("merge LV is not flagged as a thin LV");
|
||||
|
||||
if (!lv_is_merging_origin(seg->merge_lv))
|
||||
seg_error("merge LV is not flagged as merging");
|
||||
}
|
||||
} else { /* !thin */
|
||||
if (seg->device_id)
|
||||
seg_error("sets device_id");
|
||||
if (seg->external_lv)
|
||||
seg_error("sets external LV");
|
||||
if (seg->merge_lv)
|
||||
seg_error("sets merge LV");
|
||||
if (seg->indirect_origin)
|
||||
seg_error("sets indirect_origin LV");
|
||||
}
|
||||
|
||||
/* Some multi-seg vars excluded here */
|
||||
if (!seg_is_cache(seg) &&
|
||||
!seg_is_thin_volume(seg)) {
|
||||
if (seg->pool_lv)
|
||||
seg_error("sets pool LV");
|
||||
}
|
||||
|
||||
if (!seg_is_pool(seg) &&
|
||||
/* FIXME: format_pool/import_export.c _add_linear_seg() sets chunk_size */
|
||||
!seg_is_linear(seg) &&
|
||||
!seg_is_snapshot(seg)) {
|
||||
if (seg->chunk_size)
|
||||
seg_error("sets chunk_size");
|
||||
}
|
||||
|
||||
if (!seg_is_thin_pool(seg) &&
|
||||
!seg_is_thin_volume(seg)) {
|
||||
if (seg->transaction_id)
|
||||
seg_error("sets transaction_id");
|
||||
}
|
||||
|
||||
if (!seg_unknown(seg)) {
|
||||
if (seg->segtype_private)
|
||||
seg_error("set segtype_private");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that an LV's segments are consecutive, complete and don't overlap.
|
||||
*/
|
||||
@@ -466,7 +336,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
{
|
||||
struct lv_segment *seg, *seg2;
|
||||
uint32_t le = 0;
|
||||
unsigned seg_count = 0, seg_found, external_lv_found = 0;
|
||||
unsigned seg_count = 0, seg_found;
|
||||
uint32_t area_multiplier, s;
|
||||
struct seg_list *sl;
|
||||
struct glv_list *glvl;
|
||||
@@ -474,15 +344,80 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
struct replicator_site *rsite;
|
||||
struct replicator_device *rdev;
|
||||
|
||||
dm_list_iterate_items(seg, &lv->segments) {
|
||||
seg_count++;
|
||||
/* Check LV flags match first segment type */
|
||||
if (complete_vg) {
|
||||
if (lv_is_thin_volume(lv)) {
|
||||
if (dm_list_size(&lv->segments) != 1) {
|
||||
log_error("LV %s is thin volume without exactly one segment.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
} else if (!seg_is_thin_volume(first_seg(lv))) {
|
||||
log_error("LV %s is thin volume without first thin volume segment.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
if (seg->lv != lv) {
|
||||
log_error("LV %s invalid: segment %u is referencing different LV.",
|
||||
lv->name, seg_count);
|
||||
if (lv_is_thin_pool(lv)) {
|
||||
if (dm_list_size(&lv->segments) != 1) {
|
||||
log_error("LV %s is thin pool volume without exactly one segment.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
} else if (!seg_is_thin_pool(first_seg(lv))) {
|
||||
log_error("LV %s is thin pool without first thin pool segment.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
if (lv_is_pool_data(lv) &&
|
||||
(!(seg2 = first_seg(lv)) || !(seg2 = find_pool_seg(seg2)) ||
|
||||
seg2->area_count != 1 || seg_type(seg2, 0) != AREA_LV ||
|
||||
seg_lv(seg2, 0) != lv)) {
|
||||
log_error("LV %s: segment 1 pool data LV does not point back to same LV",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_pool_metadata(lv)) {
|
||||
if (!(seg2 = first_seg(lv)) || !(seg2 = find_pool_seg(seg2)) ||
|
||||
seg2->metadata_lv != lv) {
|
||||
log_error("LV %s: segment 1 pool metadata LV does not point back to same LV",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
if (lv_is_thin_pool_metadata(lv) &&
|
||||
!strstr(lv->name, "_tmeta")) {
|
||||
log_error("LV %s: thin pool metadata LV does not use _tmeta",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
} else if (lv_is_cache_pool_metadata(lv) &&
|
||||
!strstr(lv->name, "_cmeta")) {
|
||||
log_error("LV %s: cache pool metadata LV does not use _cmeta",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
if (lv_is_external_origin(lv)) {
|
||||
seg_found = 0;
|
||||
dm_list_iterate_items(sl, &lv->segs_using_this_lv)
|
||||
if (sl->seg->external_lv == lv)
|
||||
seg_found++;
|
||||
if (seg_found != lv->external_count) {
|
||||
log_error("LV %s: external origin count does not match.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dm_list_iterate_items(seg, &lv->segments) {
|
||||
seg_count++;
|
||||
|
||||
if (complete_vg && seg_is_raid(seg))
|
||||
_check_raid_seg(seg, &error_count);
|
||||
|
||||
if (seg->le != le) {
|
||||
log_error("LV %s invalid: segment %u should begin at "
|
||||
"LE %" PRIu32 " (found %" PRIu32 ").",
|
||||
@@ -500,6 +435,186 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_error_when_full(lv) &&
|
||||
!seg_can_error_when_full(seg)) {
|
||||
log_error("LV %s: segment %u (%s) does not support flag "
|
||||
"ERROR_WHEN_FULL.", lv->name, seg_count, seg->segtype->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (complete_vg && seg->log_lv &&
|
||||
!seg_is_mirrored(seg) && lv_is_raid_image(lv)) {
|
||||
log_error("LV %s: segment %u log LV %s is not a "
|
||||
"mirror log or a RAID image",
|
||||
lv->name, seg_count, seg->log_lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check mirror log - which is attached to the mirrored seg
|
||||
*/
|
||||
if (complete_vg && seg->log_lv && seg_is_mirrored(seg)) {
|
||||
if (!lv_is_mirror_log(seg->log_lv)) {
|
||||
log_error("LV %s: segment %u log LV %s is not "
|
||||
"a mirror log",
|
||||
lv->name, seg_count, seg->log_lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (!(seg2 = first_seg(seg->log_lv)) ||
|
||||
find_mirror_seg(seg2) != seg) {
|
||||
log_error("LV %s: segment %u log LV does not "
|
||||
"point back to mirror segment",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
if (complete_vg && lv_is_mirror_image(lv)) {
|
||||
if (!(seg2 = find_mirror_seg(seg)) ||
|
||||
!seg_is_mirrored(seg2)) {
|
||||
log_error("LV %s: segment %u mirror image "
|
||||
"is not mirrored",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check the various thin segment types */
|
||||
if (complete_vg) {
|
||||
if (seg_is_thin_pool(seg)) {
|
||||
if (!lv_is_thin_pool(lv)) {
|
||||
log_error("LV %s is missing thin pool flag for segment %u",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_thin_volume(lv)) {
|
||||
log_error("LV %s is a thin volume that must not contain thin pool segment %u",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
}
|
||||
if (seg_is_cache_pool(seg) &&
|
||||
!dm_list_empty(&seg->lv->segs_using_this_lv)) {
|
||||
switch (seg->cache_mode) {
|
||||
case CACHE_MODE_WRITETHROUGH:
|
||||
case CACHE_MODE_WRITEBACK:
|
||||
case CACHE_MODE_PASSTHROUGH:
|
||||
break;
|
||||
default:
|
||||
log_error("LV %s has invalid cache's feature flag.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
if (!seg->policy_name) {
|
||||
log_error("LV %s is missing cache policy name.", lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
if (seg_is_pool(seg)) {
|
||||
if (seg->area_count != 1 ||
|
||||
seg_type(seg, 0) != AREA_LV) {
|
||||
log_error("LV %s: %s segment %u is missing a pool data LV",
|
||||
lv->name, seg->segtype->name, seg_count);
|
||||
inc_error_count;
|
||||
} else if (!(seg2 = first_seg(seg_lv(seg, 0))) || find_pool_seg(seg2) != seg) {
|
||||
log_error("LV %s: %s segment %u data LV does not refer back to pool LV",
|
||||
lv->name, seg->segtype->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (!seg->metadata_lv) {
|
||||
log_error("LV %s: %s segment %u is missing a pool metadata LV",
|
||||
lv->name, seg->segtype->name, seg_count);
|
||||
inc_error_count;
|
||||
} else if (!(seg2 = first_seg(seg->metadata_lv)) ||
|
||||
find_pool_seg(seg2) != seg) {
|
||||
log_error("LV %s: %s segment %u metadata LV does not refer back to pool LV",
|
||||
lv->name, seg->segtype->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (!validate_pool_chunk_size(lv->vg->cmd, seg->segtype, seg->chunk_size)) {
|
||||
log_error("LV %s: %s segment %u has invalid chunk size %u.",
|
||||
lv->name, seg->segtype->name, seg_count, seg->chunk_size);
|
||||
inc_error_count;
|
||||
}
|
||||
} else {
|
||||
if (seg->metadata_lv) {
|
||||
log_error("LV %s: segment %u must not have pool metadata LV set",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
|
||||
if (seg_is_thin_volume(seg)) {
|
||||
if (!lv_is_thin_volume(lv)) {
|
||||
log_error("LV %s is missing thin volume flag for segment %u",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_thin_pool(lv)) {
|
||||
log_error("LV %s is a thin pool that must not contain thin volume segment %u",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (!seg->pool_lv) {
|
||||
log_error("LV %s: segment %u is missing thin pool LV",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
} else if (!lv_is_thin_pool(seg->pool_lv)) {
|
||||
log_error("LV %s: thin volume segment %u pool LV is not flagged as a pool LV",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (seg->device_id > DM_THIN_MAX_DEVICE_ID) {
|
||||
log_error("LV %s: thin volume segment %u has too large device id %u",
|
||||
lv->name, seg_count, seg->device_id);
|
||||
inc_error_count;
|
||||
}
|
||||
if (seg->external_lv && (seg->external_lv->status & LVM_WRITE)) {
|
||||
log_error("LV %s: external origin %s is writable.",
|
||||
lv->name, seg->external_lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (seg->merge_lv) {
|
||||
if (!lv_is_thin_volume(seg->merge_lv)) {
|
||||
log_error("LV %s: thin volume segment %u merging LV %s is not flagged as a thin LV",
|
||||
lv->name, seg_count, seg->merge_lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
if (!lv_is_merging_origin(seg->merge_lv)) {
|
||||
log_error("LV %s: merging LV %s is not flagged as merging.",
|
||||
lv->name, seg->merge_lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
} else if (seg_is_cache(seg)) {
|
||||
if (!lv_is_cache(lv)) {
|
||||
log_error("LV %s is missing cache flag for segment %u",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
if (!seg->pool_lv) {
|
||||
log_error("LV %s: segment %u is missing cache_pool LV",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
} else {
|
||||
if (seg->pool_lv) {
|
||||
log_error("LV %s: segment %u must not have pool LV set",
|
||||
lv->name, seg_count);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (seg_is_snapshot(seg)) {
|
||||
if (seg->cow && seg->cow == seg->origin) {
|
||||
log_error("LV %s: segment %u has same LV %s for "
|
||||
@@ -512,9 +627,6 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
if (seg_is_replicator(seg) && !check_replicator_segment(seg))
|
||||
inc_error_count;
|
||||
|
||||
if (complete_vg)
|
||||
_check_lv_segment(lv, seg, seg_count, &error_count);
|
||||
|
||||
for (s = 0; s < seg->area_count; s++) {
|
||||
if (seg_type(seg, s) == AREA_UNASSIGNED) {
|
||||
log_error("LV %s: segment %u has unassigned "
|
||||
@@ -596,12 +708,6 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
le += seg->len;
|
||||
}
|
||||
|
||||
if (le != lv->le_count) {
|
||||
log_error("LV %s: inconsistent LE count %u != %u",
|
||||
lv->name, le, lv->le_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
dm_list_iterate_items(sl, &lv->segs_using_this_lv) {
|
||||
seg = sl->seg;
|
||||
seg_found = 0;
|
||||
@@ -662,10 +768,6 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
/* Validation of external origin counter */
|
||||
if (seg->external_lv == lv)
|
||||
external_lv_found++;
|
||||
}
|
||||
|
||||
dm_list_iterate_items(glvl, &lv->indirect_glvs) {
|
||||
@@ -687,51 +789,10 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
|
||||
}
|
||||
}
|
||||
|
||||
/* Check LV flags match first segment type */
|
||||
if (complete_vg) {
|
||||
if ((seg_count != 1) &&
|
||||
(lv_is_cache(lv) ||
|
||||
lv_is_cache_pool(lv) ||
|
||||
lv_is_raid(lv) ||
|
||||
lv_is_snapshot(lv) ||
|
||||
lv_is_thin_pool(lv) ||
|
||||
lv_is_thin_volume(lv))) {
|
||||
log_error("LV %s must have exactly one segment.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_pool_data(lv) &&
|
||||
(!(seg2 = first_seg(lv)) || !(seg2 = find_pool_seg(seg2)) ||
|
||||
seg2->area_count != 1 || seg_type(seg2, 0) != AREA_LV ||
|
||||
seg_lv(seg2, 0) != lv)) {
|
||||
log_error("LV %s: segment 1 pool data LV does not point back to same LV",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_thin_pool_metadata(lv) && !strstr(lv->name, "_tmeta")) {
|
||||
log_error("LV %s: thin pool metadata LV does not use _tmeta.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
} else if (lv_is_cache_pool_metadata(lv) && !strstr(lv->name, "_cmeta")) {
|
||||
log_error("LV %s: cache pool metadata LV does not use _cmeta.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
if (lv_is_external_origin(lv)) {
|
||||
if (lv->external_count != external_lv_found) {
|
||||
log_error("LV %s: external origin count does not match.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
if (lv->status & LVM_WRITE) {
|
||||
log_error("LV %s: external origin cant't be writable.",
|
||||
lv->name);
|
||||
inc_error_count;
|
||||
}
|
||||
}
|
||||
if (le != lv->le_count) {
|
||||
log_error("LV %s: inconsistent LE count %u != %u",
|
||||
lv->name, le, lv->le_count);
|
||||
inc_error_count;
|
||||
}
|
||||
|
||||
out:
|
||||
|
@@ -198,7 +198,7 @@
|
||||
#define lv_is_partial(lv) (((lv)->status & PARTIAL_LV) ? 1 : 0)
|
||||
#define lv_is_virtual(lv) (((lv)->status & VIRTUAL) ? 1 : 0)
|
||||
#define lv_is_merging(lv) (((lv)->status & MERGING) ? 1 : 0)
|
||||
#define lv_is_merging_origin(lv) (lv_is_merging(lv) && (lv)->snapshot)
|
||||
#define lv_is_merging_origin(lv) (lv_is_merging(lv))
|
||||
#define lv_is_snapshot(lv) (((lv)->status & SNAPSHOT) ? 1 : 0)
|
||||
#define lv_is_converting(lv) (((lv)->status & CONVERTING) ? 1 : 0)
|
||||
#define lv_is_external_origin(lv) (((lv)->external_count > 0) ? 1 : 0)
|
||||
|
@@ -5447,19 +5447,6 @@ int vg_flag_write_locked(struct volume_group *vg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _access_vg_clustered(struct cmd_context *cmd, const struct volume_group *vg)
|
||||
{
|
||||
if (vg_is_clustered(vg) && !locking_is_clustered()) {
|
||||
if (!cmd->ignore_clustered_vgs)
|
||||
log_error("Skipping clustered volume group %s", vg->name);
|
||||
else
|
||||
log_verbose("Skipping clustered volume group %s", vg->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs a set of checks against a VG according to bits set in status
|
||||
* and returns FAILED_* bits for those that aren't acceptable.
|
||||
@@ -5471,9 +5458,15 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
|
||||
{
|
||||
uint32_t failure = 0;
|
||||
|
||||
if ((status & CLUSTERED) && !_access_vg_clustered(vg->cmd, vg))
|
||||
if ((status & CLUSTERED) &&
|
||||
(vg_is_clustered(vg)) && !locking_is_clustered()) {
|
||||
if (!vg->cmd->ignore_clustered_vgs)
|
||||
log_error("Skipping clustered volume group %s", vg->name);
|
||||
else
|
||||
log_verbose("Skipping clustered volume group %s", vg->name);
|
||||
/* Return because other flags are considered undefined. */
|
||||
return FAILED_CLUSTERED;
|
||||
}
|
||||
|
||||
if ((status & EXPORTED_VG) &&
|
||||
vg_is_exported(vg)) {
|
||||
@@ -5562,6 +5555,19 @@ static int _allow_extra_system_id(struct cmd_context *cmd, const char *system_id
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _access_vg_clustered(struct cmd_context *cmd, struct volume_group *vg)
|
||||
{
|
||||
if (vg_is_clustered(vg) && !locking_is_clustered()) {
|
||||
if (!cmd->ignore_clustered_vgs)
|
||||
log_error("Skipping clustered volume group %s", vg->name);
|
||||
else
|
||||
log_verbose("Skipping clustered volume group %s", vg->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _access_vg_lock_type(struct cmd_context *cmd, struct volume_group *vg,
|
||||
uint32_t lockd_state, uint32_t *failure)
|
||||
{
|
||||
|
@@ -2724,6 +2724,15 @@ static const char *_get_segtype_alias(const struct segment_type *segtype)
|
||||
return "";
|
||||
}
|
||||
|
||||
/* Return "linear" for striped segtype with 1 area instead of "striped" */
|
||||
static const char *_get_segtype_name(const struct segment_type *segtype, unsigned new_image_count)
|
||||
{
|
||||
if (!segtype || (segtype_is_striped(segtype) && new_image_count == 1))
|
||||
return "linear";
|
||||
|
||||
return segtype->name;
|
||||
}
|
||||
|
||||
static int _log_possible_conversion_types(const struct logical_volume *lv, const struct segment_type *new_segtype)
|
||||
{
|
||||
unsigned possible_conversions = 0;
|
||||
@@ -2744,7 +2753,7 @@ static int _log_possible_conversion_types(const struct logical_volume *lv, const
|
||||
|
||||
log_error("Converting %s from %s%s%s%s is "
|
||||
"directly possible to the following layout%s:",
|
||||
display_lvname(lv), lvseg_name(seg),
|
||||
display_lvname(lv), _get_segtype_name(seg->segtype, seg->area_count),
|
||||
*alias ? " (same as " : "", alias, *alias ? ")" : "",
|
||||
possible_conversions > 1 ? "s" : "");
|
||||
|
||||
|
@@ -144,12 +144,6 @@ struct dev_manager;
|
||||
#define segtype_is_virtual(segtype) ((segtype)->flags & SEG_VIRTUAL ? 1 : 0)
|
||||
#define segtype_is_unknown(segtype) ((segtype)->flags & SEG_UNKNOWN ? 1 : 0)
|
||||
|
||||
#define segtype_can_split(segtype) ((segtype)->flags & SEG_CAN_SPLIT ? 1 : 0)
|
||||
#define segtype_cannot_be_zeroed(segtype) ((segtype)->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
|
||||
#define segtype_monitored(segtype) ((segtype)->flags & SEG_MONITORED ? 1 : 0)
|
||||
#define segtype_only_exclusive(segtype) ((segtype)->flags & SEG_ONLY_EXCLUSIVE ? 1 : 0)
|
||||
#define segtype_can_error_when_full(segtype) ((segtype)->flags & SEG_CAN_ERROR_WHEN_FULL ? 1 : 0)
|
||||
|
||||
#define segtype_supports_stripe_size(segtype) \
|
||||
((segtype_is_striped(segtype) || segtype_is_mirror(segtype) || \
|
||||
segtype_is_cache(segtype) || segtype_is_cache_pool(segtype) || \
|
||||
@@ -194,11 +188,11 @@ struct dev_manager;
|
||||
#define seg_is_thin_volume(seg) segtype_is_thin_volume((seg)->segtype)
|
||||
#define seg_is_virtual(seg) segtype_is_virtual((seg)->segtype)
|
||||
#define seg_unknown(seg) segtype_is_unknown((seg)->segtype)
|
||||
#define seg_can_split(seg) segtype_can_split((seg)->segtype)
|
||||
#define seg_cannot_be_zeroed(seg) segtype_cannot_be_zeroed((seg)->segtype)
|
||||
#define seg_monitored(seg) segtype_monitored((seg)->segtype)
|
||||
#define seg_only_exclusive(seg) segtype_only_exclusive((seg)->segtype)
|
||||
#define seg_can_error_when_full(seg) segtype_can_error_when_full((seg)->segtype)
|
||||
#define seg_can_split(seg) ((seg)->segtype->flags & SEG_CAN_SPLIT ? 1 : 0)
|
||||
#define seg_cannot_be_zeroed(seg) ((seg)->segtype->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
|
||||
#define seg_monitored(seg) ((seg)->segtype->flags & SEG_MONITORED ? 1 : 0)
|
||||
#define seg_only_exclusive(seg) ((seg)->segtype->flags & SEG_ONLY_EXCLUSIVE ? 1 : 0)
|
||||
#define seg_can_error_when_full(seg) ((seg)->segtype->flags & SEG_CAN_ERROR_WHEN_FULL ? 1 : 0)
|
||||
|
||||
struct segment_type {
|
||||
struct dm_list list; /* Internal */
|
||||
|
@@ -31,22 +31,18 @@ LVMRAIDMAN = lvmraid.7
|
||||
|
||||
MAN5=lvm.conf.5
|
||||
MAN7=lvmsystemid.7 lvmreport.7
|
||||
MAN8=lvm.8 lvmconf.8 lvmdump.8
|
||||
MAN8DM=dmsetup.8 dmstats.8
|
||||
MAN8CLUSTER=
|
||||
MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8
|
||||
|
||||
MAN8GEN=lvm-config.8 lvm-dumpconfig.8 lvm-fullreport.8 lvm-lvpoll.8 \
|
||||
lvcreate.8 lvchange.8 lvmconfig.8 lvconvert.8 lvdisplay.8 lvextend.8 \
|
||||
MAN8=lvm-config.8 lvm-dumpconfig.8 lvm-fullreport.8 lvm-lvpoll.8 \
|
||||
lvchange.8 lvmconfig.8 lvconvert.8 lvcreate.8 lvdisplay.8 lvextend.8 \
|
||||
lvm.8 lvmchange.8 lvmconf.8 lvmdiskscan.8 lvmdump.8 lvmsadc.8 lvmsar.8 \
|
||||
lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \
|
||||
lvscan.8 pvchange.8 pvck.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \
|
||||
pvresize.8 pvs.8 pvscan.8 vgcfgbackup.8 vgcfgrestore.8 vgchange.8 \
|
||||
vgck.8 vgcreate.8 vgconvert.8 vgdisplay.8 vgexport.8 vgextend.8 \
|
||||
vgimport.8 vgimportclone.8 vgmerge.8 vgmknodes.8 vgreduce.8 vgremove.8 \
|
||||
vgrename.8 vgs.8 vgscan.8 vgsplit.8 \
|
||||
lvmsar.8 lvmsadc.8 lvmdiskscan.8 lvmchange.8
|
||||
|
||||
MAN8+=$(MAN8GEN)
|
||||
vgrename.8 vgs.8 vgscan.8 vgsplit.8
|
||||
MAN8DM=dmsetup.8 dmstats.8
|
||||
MAN8CLUSTER=
|
||||
MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8
|
||||
|
||||
ifeq ($(MAKECMDGOALS),all_man)
|
||||
MAN_ALL="yes"
|
||||
@@ -144,12 +140,12 @@ Makefile: Makefile.in
|
||||
*) echo "Creating $@" ; $(SED) -e "s+#VERSION#+$(LVM_VERSION)+;s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+;s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+;s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+;s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+;s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+;s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+;s+#CLVMD_PATH#+@CLVMD_PATH@+;s+#LVM_PATH#+@LVM_PATH@+;s+#DEFAULT_RUN_DIR#+@DEFAULT_RUN_DIR@+;s+#DEFAULT_PID_DIR#+@DEFAULT_PID_DIR@+;s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+;s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+;" $< > $@ ;; \
|
||||
esac
|
||||
|
||||
$(MAN8GEN):
|
||||
$(CC) -DMAN_PAGE_GENERATOR $(top_builddir)/tools/command.c -o man-generator
|
||||
echo "Generating $@" ;
|
||||
./man-generator `basename -s .8 $@` > $@.in
|
||||
if [ -f $@.notes ]; then cat $@.notes >> $@.in; fi;
|
||||
$(SED) -e "s+#VERSION#+$(LVM_VERSION)+;s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+;s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+;s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+;s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+;s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+;s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+;s+#CLVMD_PATH#+@CLVMD_PATH@+;s+#LVM_PATH#+@LVM_PATH@+;s+#DEFAULT_RUN_DIR#+@DEFAULT_RUN_DIR@+;s+#DEFAULT_PID_DIR#+@DEFAULT_PID_DIR@+;s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+;s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+;" $@.in > $@
|
||||
ccmd: ../tools/create-commands.c
|
||||
$(CC) ../tools/create-commands.c -o ccmd
|
||||
|
||||
generate: ccmd
|
||||
./ccmd --output man -s 0 -p 1 -c lvcreate ../tools/command-lines.in > lvcreate.8.a
|
||||
cat lvcreate.8.a lvcreate.8.b > lvcreate.8.in
|
||||
|
||||
install_man5: $(MAN5)
|
||||
$(INSTALL) -d $(MAN5DIR)
|
||||
@@ -159,7 +155,7 @@ install_man7: $(MAN7)
|
||||
$(INSTALL) -d $(MAN7DIR)
|
||||
$(INSTALL_DATA) $(MAN7) $(MAN7DIR)/
|
||||
|
||||
install_man8: $(MAN8) $(MAN8GEN)
|
||||
install_man8: $(MAN8)
|
||||
$(INSTALL) -d $(MAN8DIR)
|
||||
$(INSTALL_DATA) $(MAN8) $(MAN8DIR)/
|
||||
|
||||
|
@@ -154,32 +154,6 @@ This timeout will be ignored if you start \fBclvmd\fP with the \fB\-d\fP.
|
||||
.br
|
||||
Display the version of the cluster LVM daemon.
|
||||
.
|
||||
.SH NOTES
|
||||
.
|
||||
.SS Activation
|
||||
.
|
||||
In a clustered VG, clvmd is used for activation, and the following values are
|
||||
possible with \fBlvchange/vgchange -a\fP:
|
||||
.IP \fBy\fP|\fBsy\fP
|
||||
clvmd activates the LV in shared mode (with a shared lock),
|
||||
allowing multiple nodes to activate the LV concurrently.
|
||||
If the LV type prohibits shared access, such as an LV with a snapshot,
|
||||
an exclusive lock is automatically used instead.
|
||||
clvmd attempts to activate the LV concurrently on all nodes.
|
||||
.IP \fBey\fP
|
||||
clvmd activates the LV in exclusive mode (with an exclusive lock),
|
||||
allowing a single node to activate the LV.
|
||||
clvmd attempts to activate the LV concurrently on all nodes, but only
|
||||
one will succeed.
|
||||
.IP \fBly\fP
|
||||
clvmd attempts to activate the LV only on the local node.
|
||||
If the LV type allows concurrent access, then shared mode is used,
|
||||
otherwise exclusive.
|
||||
.IP \fBn\fP
|
||||
clvmd deactivates the LV on all nodes.
|
||||
.IP \fBln\fP
|
||||
clvmd deactivates the LV on the local node.
|
||||
.
|
||||
.SH ENVIRONMENT VARIABLES
|
||||
.TP
|
||||
.B LVM_CLVMD_BINARY
|
||||
|
@@ -878,7 +878,7 @@ Count of writes merged this interval.
|
||||
.B write_sector_count
|
||||
Count of 512 byte sectors written this interval.
|
||||
.TP
|
||||
.B write_time
|
||||
.B write_nsecs
|
||||
Accumulated duration of all write requests (ns).
|
||||
.TP
|
||||
.B in_progress_count
|
||||
|
491
man/lvchange.8.in
Normal file
491
man/lvchange.8.in
Normal file
@@ -0,0 +1,491 @@
|
||||
.TH LVCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
|
||||
.de UNITS
|
||||
..
|
||||
|
||||
.
|
||||
.SH NAME
|
||||
.
|
||||
lvchange \(em change attributes of a logical volume
|
||||
.
|
||||
.SH SYNOPSIS
|
||||
.
|
||||
.ad l
|
||||
.B lvchange
|
||||
.RB [ \-a | \-\-activate
|
||||
.RB [ a ][ e | s | l ]{ y | n }]
|
||||
.RB [ \-\-activationmode
|
||||
.RB { complete | degraded | partial }]
|
||||
.RB [ \-\-addtag
|
||||
.IR Tag ]
|
||||
.RB [ \-K | \-\-ignoreactivationskip ]
|
||||
.RB [ \-k | \-\-setactivationskip
|
||||
.RB { y | n }]
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RB { y | n }]
|
||||
.RB [ \-\-rebuild
|
||||
.IR PhysicalVolume ]
|
||||
.RB [ \-\-cachemode
|
||||
.RB { passthrough | writeback | writethrough }]
|
||||
.RB [ \-\-cachepolicy
|
||||
.IR Policy ]
|
||||
.RB [ \-\-cachesettings
|
||||
.IR Key \fB= Value ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-C | \-\-contiguous
|
||||
.RB { y | n }]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-\-deltag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-detachprofile ]
|
||||
.RB [ \-\-discards
|
||||
.RB { ignore | nopassdown | passdown }]
|
||||
.RB [ \-\-errorwhenfull
|
||||
.RB { y | n }]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB \%[ \-\-ignorelockingfailure ]
|
||||
.RB \%[ \-\-ignoremonitoring ]
|
||||
.RB \%[ \-\-ignoreskippedcluster ]
|
||||
.RB \%[ \-\-metadataprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\-monitor
|
||||
.RB { y | n }]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-p | \-\-permission
|
||||
.RB { r | rw }]
|
||||
.RB [ \-M | \-\-persistent
|
||||
.RB { y | n }
|
||||
.RB [ \-\-major
|
||||
.IR Major ]
|
||||
.RB [ \-\-minor
|
||||
.IR Minor ]]
|
||||
.RB [ \-\-poll
|
||||
.RB { y | n }]
|
||||
.RB [ \-\- [ raid ] maxrecoveryrate
|
||||
.IR Rate ]
|
||||
.RB [ \-\- [ raid ] minrecoveryrate
|
||||
.IR Rate ]
|
||||
.RB [ \-\- [ raid ] syncaction
|
||||
.RB { check | repair }]
|
||||
.RB [ \-\- [ raid ] writebehind
|
||||
.IR IOCount ]
|
||||
.RB [ \-\- [ raid ] writemostly
|
||||
.BR \fIPhysicalVolume [ : { y | n | t }]]
|
||||
.RB [ \-r | \-\-readahead
|
||||
.RB { \fIReadAheadSectors | auto | none }]
|
||||
.RB [ \-\-refresh ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-resync ]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-\-sysinit ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-Z | \-\-zero
|
||||
.RB { y | n }]
|
||||
.RI [ LogicalVolumePath ...]
|
||||
.ad b
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
.
|
||||
lvchange allows you to change the attributes of a logical volume
|
||||
including making them known to the kernel ready for use.
|
||||
.
|
||||
.SH OPTIONS
|
||||
.
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.
|
||||
.HP
|
||||
.BR \-a | \-\-activate
|
||||
.RB [ a ][ e | s | l ]{ y | n }
|
||||
.br
|
||||
Controls the availability of the logical volumes for use.
|
||||
Communicates with the kernel device-mapper driver via
|
||||
libdevmapper to activate (\fB\-ay\fP) or deactivate (\fB\-an\fP) the
|
||||
logical volumes.
|
||||
.br
|
||||
Activation of a logical volume creates a symbolic link
|
||||
\fI/dev/VolumeGroupName/LogicalVolumeName\fP pointing to the device node.
|
||||
This link is removed on deactivation.
|
||||
All software and scripts should access the device through
|
||||
this symbolic link and present this as the name of the device.
|
||||
The location and name of the underlying device node may depend on
|
||||
the distribution and configuration (e.g. udev) and might change
|
||||
from release to release.
|
||||
.br
|
||||
If autoactivation option is used (\fB\-aay\fP),
|
||||
the logical volume is activated only if it matches an item in
|
||||
the \fBactivation/auto_activation_volume_list\fP
|
||||
set in \fBlvm.conf\fP(5).
|
||||
If this list is not set, then all volumes are considered for
|
||||
activation. The \fB\-aay\fP option should be also used during system
|
||||
boot so it's possible to select which volumes to activate using
|
||||
the \fBactivation/auto_activation_volume_list\fP setting.
|
||||
.br
|
||||
In a clustered VG, clvmd is used for activation, and the
|
||||
following options are possible:
|
||||
|
||||
With \fB\-aey\fP, clvmd activates the LV in exclusive mode
|
||||
(with an exclusive lock), allowing a single node to activate the LV.
|
||||
|
||||
With \fB\-asy\fP, clvmd activates the LV in shared mode
|
||||
(with a shared lock), allowing multiple nodes to activate the LV concurrently.
|
||||
If the LV type prohibits shared access, such as an LV with a snapshot,
|
||||
the '\fBs\fP' option is ignored and an exclusive lock is used.
|
||||
|
||||
With \fB\-ay\fP (no mode specified), clvmd activates the LV in shared mode
|
||||
if the LV type allows concurrent access, such as a linear LV.
|
||||
Otherwise, clvmd activates the LV in exclusive mode.
|
||||
|
||||
With \fB\-aey\fP, \fB\-asy\fP, and \fB\-ay\fP, clvmd attempts to activate the LV
|
||||
on all nodes. If exclusive mode is used, then only one of the
|
||||
nodes will be successful.
|
||||
|
||||
With \fB\-an\fP, clvmd attempts to deactivate the LV on all nodes.
|
||||
|
||||
With \fB\-aly\fP, clvmd activates the LV only on the local node, and \fB\-aln\fP
|
||||
deactivates only on the local node. If the LV type allows concurrent
|
||||
access, then shared mode is used, otherwise exclusive.
|
||||
|
||||
LVs with snapshots are always activated exclusively because they can only
|
||||
be used on one node at once.
|
||||
|
||||
For local VGs \fB\-ay\fP, \fB\-aey\fP, and \fB\-asy\fP are all equivalent.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-activationmode
|
||||
.RB { complete | degraded | partial }
|
||||
.br
|
||||
The activation mode determines whether logical volumes are allowed to
|
||||
activate when there are physical volumes missing (e.g. due to a device
|
||||
failure). \fBcomplete\fP is the most restrictive; allowing only those
|
||||
logical volumes to be activated that are not affected by the missing
|
||||
PVs. \fBdegraded\fP allows RAID logical volumes to be activated even if
|
||||
they have PVs missing. (Note that the "\fImirror\fP" segment type is not
|
||||
considered a RAID logical volume. The "\fIraid1\fP" segment type should
|
||||
be used instead.) Finally, \fBpartial\fP allows any logical volume to
|
||||
be activated even if portions are missing due to a missing or failed
|
||||
PV. This last option should only be used when performing recovery or
|
||||
repair operations. \fBdegraded\fP is the default mode. To change it,
|
||||
modify \fBactivation_mode\fP in \fBlvm.conf\fP(5).
|
||||
.
|
||||
.HP
|
||||
.BR \-K | \-\-ignoreactivationskip
|
||||
.br
|
||||
Ignore the flag to skip Logical Volumes during activation.
|
||||
.
|
||||
.HP
|
||||
.BR \-k | \-\-setactivationskip
|
||||
.RB { y | n }
|
||||
.br
|
||||
Controls whether Logical Volumes are persistently flagged to be
|
||||
skipped during activation. By default, thin snapshot volumes are
|
||||
flagged for activation skip. To activate such volumes,
|
||||
an extra \fB\-\-ignoreactivationskip\fP option must be used.
|
||||
The flag is not applied during deactivation. To see whether
|
||||
the flag is attached, use \fBlvs\fP(8) command where the state
|
||||
of the flag is reported within \fBlv_attr\fP bits.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachemode
|
||||
.RB { passthrough | writeback | writethrough }
|
||||
.br
|
||||
Specifying a cache mode determines when the writes to a cache LV
|
||||
are considered complete. When \fBwriteback\fP is specified, a write is
|
||||
considered complete as soon as it is stored in the cache pool LV.
|
||||
If \fBwritethough\fP is specified, a write is considered complete only
|
||||
when it has been stored in the cache pool LV and on the origin LV.
|
||||
While \fBwritethrough\fP may be slower for writes, it is more
|
||||
resilient if something should happen to a device associated with the
|
||||
cache pool LV. With \fBpassthrough\fP mode, all reads are served
|
||||
from origin LV (all reads miss the cache) and all writes are
|
||||
forwarded to the origin LV; additionally, write hits cause cache
|
||||
block invalidates. See \fBlvmcache(7)\fP for more details.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachepolicy
|
||||
.IR Policy ,
|
||||
.BR \-\-cachesettings
|
||||
.IR Key \fB= Value
|
||||
.br
|
||||
Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
|
||||
the cache policy and its associated tunable settings. In most use-cases,
|
||||
default values should be adequate.
|
||||
.
|
||||
.HP
|
||||
.BR \-C | \-\-contiguous
|
||||
.RB { y | n }
|
||||
.br
|
||||
Tries to set or reset the contiguous allocation policy for
|
||||
logical volumes. It's only possible to change a non-contiguous
|
||||
logical volume's allocation policy to contiguous, if all of the
|
||||
allocated physical extents are already contiguous.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-detachprofile
|
||||
.br
|
||||
Detach any metadata configuration profiles attached to given
|
||||
Logical Volumes. See \fBlvm.conf\fP(5) for more information
|
||||
about metadata profiles.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-discards
|
||||
.RB { ignore | nopassdown | passdown }
|
||||
.br
|
||||
Set this to \fBignore\fP to ignore any discards received by a
|
||||
thin pool Logical Volume. Set to \fBnopassdown\fP to process such
|
||||
discards within the thin pool itself and allow the no-longer-needed
|
||||
extents to be overwritten by new data. Set to \fBpassdown\fP (the
|
||||
default) to process them both within the thin pool itself and to
|
||||
pass them down the underlying device.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-errorwhenfull
|
||||
.RB { y | n }
|
||||
.br
|
||||
Sets thin pool behavior when data space is exhaused. See
|
||||
.BR lvcreate (8)
|
||||
for information.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-ignoremonitoring
|
||||
.br
|
||||
Make no attempt to interact with dmeventd unless \fB\-\-monitor\fP
|
||||
is specified.
|
||||
Do not use this if dmeventd is already monitoring a device.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-major
|
||||
.IR Major
|
||||
.br
|
||||
Sets the major number. This option is supported only on older systems
|
||||
(kernel version 2.4) and is ignored on modern Linux systems where major
|
||||
numbers are dynamically assigned.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-minor
|
||||
.IR Minor
|
||||
.br
|
||||
Set the minor number.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-metadataprofile
|
||||
.IR ProfileName
|
||||
.br
|
||||
Uses and attaches \fIProfileName\fP configuration profile to the logical
|
||||
volume metadata. Whenever the logical volume is processed next time,
|
||||
the profile is automatically applied. If the volume group has another
|
||||
profile attached, the logical volume profile is preferred.
|
||||
See \fBlvm.conf\fP(5) for more information about metadata profiles.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-monitor
|
||||
.RB { y | n }
|
||||
.br
|
||||
Start or stop monitoring a mirrored or snapshot logical volume with
|
||||
dmeventd, if it is installed.
|
||||
If a device used by a monitored mirror reports an I/O error,
|
||||
the failure is handled according to
|
||||
\%\fBmirror_image_fault_policy\fP and \fBmirror_log_fault_policy\fP
|
||||
set in \fBlvm.conf\fP(5).
|
||||
.
|
||||
.HP
|
||||
.BR \-\-noudevsync
|
||||
.br
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.
|
||||
.HP
|
||||
.BR \-p | \-\-permission
|
||||
.RB { r | rw }
|
||||
.br
|
||||
Change access permission to read-only or read/write.
|
||||
.
|
||||
.HP
|
||||
.BR \-M | \-\-persistent
|
||||
.RB { y | n }
|
||||
.br
|
||||
Set to \fBy\fP to make the minor number specified persistent.
|
||||
Change of persistent numbers is not supported for pool volumes.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-poll
|
||||
.RB { y | n }
|
||||
.br
|
||||
Without polling a logical volume's backgrounded transformation process
|
||||
will never complete. If there is an incomplete pvmove or lvconvert (for
|
||||
example, on rebooting after a crash), use \fB\-\-poll y\fP to restart the
|
||||
process from its last checkpoint. However, it may not be appropriate to
|
||||
immediately poll a logical volume when it is activated, use
|
||||
\fB\-\-poll n\fP to defer and then \fB\-\-poll y\fP to restart the process.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] rebuild
|
||||
.BR \fIPhysicalVolume
|
||||
.br
|
||||
Option can be repeated multiple times.
|
||||
Selects PhysicalVolume(s) to be rebuild in a RaidLV.
|
||||
Use this option instead of
|
||||
.BR \-\-resync
|
||||
or
|
||||
.BR \-\- [ raid ] syncaction
|
||||
\fBrepair\fP in case the PVs with corrupted data are known and their data
|
||||
should be reconstructed rather than reconstructing default (rotating) data.
|
||||
.br
|
||||
E.g. in a raid1 mirror, the master leg on /dev/sda may hold corrupt data due
|
||||
to a known transient disk error, thus
|
||||
.br
|
||||
\fBlvchange --rebuild /dev/sda LV\fP
|
||||
.br
|
||||
will request the master leg to be rebuild rather than rebuilding
|
||||
all other legs from the master.
|
||||
On a raid5 with rotating data and parity
|
||||
.br
|
||||
\fBlvchange --rebuild /dev/sda LV\fP
|
||||
.br
|
||||
will rebuild all data and parity blocks in the stripe on /dev/sda.
|
||||
.HP
|
||||
.BR \-\- [ raid ] maxrecoveryrate
|
||||
.BR \fIRate [ b | B | s | S | k | K | m | M | g | G ]
|
||||
.br
|
||||
Sets the maximum recovery rate for a RAID logical volume. \fIRate\fP
|
||||
is specified as an amount per second for each device in the array.
|
||||
If no suffix is given, then KiB/sec/device is assumed. Setting the
|
||||
recovery rate to \fB0\fP means it will be unbounded.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] minrecoveryrate
|
||||
.BR \fIRate [ b | B | s | S | k | K | m | M | g | G ]
|
||||
.br
|
||||
Sets the minimum recovery rate for a RAID logical volume. \fIRate\fP
|
||||
is specified as an amount per second for each device in the array.
|
||||
If no suffix is given, then KiB/sec/device is assumed. Setting the
|
||||
recovery rate to \fB0\fP means it will be unbounded.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] syncaction
|
||||
.RB { check | repair }
|
||||
.br
|
||||
This argument is used to initiate various RAID synchronization operations.
|
||||
The \fBcheck\fP and \fBrepair\fP options provide a way to check the
|
||||
integrity of a RAID logical volume (often referred to as "scrubbing").
|
||||
These options cause the RAID logical volume to
|
||||
read all of the data and parity blocks in the array and check for any
|
||||
discrepancies (e.g. mismatches between mirrors or incorrect parity values).
|
||||
If \fBcheck\fP is used, the discrepancies will be counted but not repaired.
|
||||
If \fBrepair\fP is used, the discrepancies will be corrected as they are
|
||||
encountered. The \fBlvs\fP(8) command can be used to show the number of
|
||||
discrepancies found or repaired.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] writebehind
|
||||
.IR IOCount
|
||||
.br
|
||||
Specify the maximum number of outstanding writes that are allowed to
|
||||
devices in a RAID1 logical volume that are marked as write-mostly.
|
||||
Once this value is exceeded, writes become synchronous (i.e. all writes
|
||||
to the constituent devices must complete before the array signals the
|
||||
write has completed). Setting the value to zero clears the preference
|
||||
and allows the system to choose the value arbitrarily.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] writemostly
|
||||
.BR \fIPhysicalVolume [ : { y | n | t }]
|
||||
.br
|
||||
Mark a device in a RAID1 logical volume as write-mostly. All reads
|
||||
to these drives will be avoided unless absolutely necessary. This keeps
|
||||
the number of I/Os to the drive to a minimum. The default behavior is to
|
||||
set the write-mostly attribute for the specified physical volume in the
|
||||
logical volume. It is possible to also remove the write-mostly flag by
|
||||
appending a "\fB:n\fP" to the physical volume or to toggle the value by specifying
|
||||
"\fB:t\fP". The \fB\-\-writemostly\fP argument can be specified more than one time
|
||||
in a single command; making it possible to toggle the write-mostly attributes
|
||||
for all the physical volumes in a logical volume at once.
|
||||
.
|
||||
.HP
|
||||
.BR \-r | \-\-readahead
|
||||
.RB { \fIReadAheadSectors | auto | none }
|
||||
.br
|
||||
Set read ahead sector count of this logical volume.
|
||||
For volume groups with metadata in lvm1 format, this must
|
||||
be a value between 2 and 120 sectors.
|
||||
The default value is "\fBauto\fP" which allows the kernel to choose
|
||||
a suitable value automatically.
|
||||
"\fBnone\fP" is equivalent to specifying zero.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-refresh
|
||||
.br
|
||||
If the logical volume is active, reload its metadata.
|
||||
This is not necessary in normal operation, but may be useful
|
||||
if something has gone wrong or if you're doing clustering
|
||||
manually without a clustered lock manager.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-resync
|
||||
.br
|
||||
Forces the complete resynchronization of a mirror. In normal
|
||||
circumstances you should not need this option because synchronization
|
||||
happens automatically. Data is read from the primary mirror device
|
||||
and copied to the others, so this can take a considerable amount of
|
||||
time - and during this time you are without a complete redundant copy
|
||||
of your data.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-sysinit
|
||||
.br
|
||||
Indicates that \fBlvchange\fP(8) is being invoked from early system
|
||||
initialisation scripts (e.g. rc.sysinit or an initrd),
|
||||
before writeable filesystems are available. As such,
|
||||
some functionality needs to be disabled and this option
|
||||
acts as a shortcut which selects an appropriate set of options. Currently
|
||||
this is equivalent to using \fB\-\-ignorelockingfailure\fP,
|
||||
\fB\-\-ignoremonitoring\fP, \fB\-\-poll n\fP and setting
|
||||
\fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
|
||||
environment variable.
|
||||
|
||||
If \fB\-\-sysinit\fP is used in conjunction with
|
||||
\fBlvmetad\fP(8) enabled and running,
|
||||
autoactivation is preferred over manual activation via direct lvchange call.
|
||||
Logical volumes are autoactivated according to
|
||||
\fBauto_activation_volume_list\fP set in \fBlvm.conf\fP(5).
|
||||
.
|
||||
.HP
|
||||
.BR \-Z | \-\-zero
|
||||
.RB { y | n }
|
||||
.br
|
||||
Set zeroing mode for thin pool. Note: already provisioned blocks from pool
|
||||
in non-zero mode are not cleared in unwritten parts when setting zero to
|
||||
\fBy\fP.
|
||||
.
|
||||
.SH ENVIRONMENT VARIABLES
|
||||
.
|
||||
.TP
|
||||
.B LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES
|
||||
Suppress locking failure messages.
|
||||
.
|
||||
.SH Examples
|
||||
.
|
||||
Changes the permission on volume lvol1 in volume group vg00 to be read-only:
|
||||
.sp
|
||||
.B lvchange \-pr vg00/lvol1
|
||||
.
|
||||
.SH SEE ALSO
|
||||
.
|
||||
.nh
|
||||
.BR lvm (8),
|
||||
.BR lvmetad (8),
|
||||
.BR lvs (8),
|
||||
.BR lvcreate (8),
|
||||
.BR vgchange (8),
|
||||
.BR lvmcache (7),
|
||||
.BR lvmthin (7),
|
||||
.BR lvm.conf (5)
|
1199
man/lvconvert.8.in
Normal file
1199
man/lvconvert.8.in
Normal file
File diff suppressed because it is too large
Load Diff
914
man/lvcreate.8.in
Normal file
914
man/lvcreate.8.in
Normal file
@@ -0,0 +1,914 @@
|
||||
.TH LVCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.
|
||||
.\" Use 1st. parameter with \% to fix 'man2html' rendeing on same line!
|
||||
.de SIZE_G
|
||||
. IR \\$1 \c
|
||||
. RB [ b | B | s | S | k | K | m | M | g | G ]
|
||||
..
|
||||
.de SIZE_E
|
||||
. IR \\$1 \c
|
||||
. RB [ b | B | s | S | k | K | m | M | \c
|
||||
. BR g | G | t | T | p | P | e | E ]
|
||||
..
|
||||
.
|
||||
.SH NAME
|
||||
.
|
||||
lvcreate \- create a logical volume in an existing volume group
|
||||
.
|
||||
.SH SYNOPSIS
|
||||
.
|
||||
.ad l
|
||||
.B lvcreate
|
||||
.RB [ \-a | \-\-activate
|
||||
.RB [ a ][ e | l | s ]{ y | n }]
|
||||
.RB [ \-\-addtag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-alloc
|
||||
.IR Allocation\%Policy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RB { y | n }]
|
||||
.RB [ \-H | \-\-cache ]
|
||||
.RB [ \-\-cachemode
|
||||
.RB { passthrough | writeback | writethrough }]
|
||||
.RB [ \-\-cachepolicy
|
||||
.IR Policy ]
|
||||
.RB \%[ \-\-cachepool
|
||||
.IR CachePoolLogicalVolume ]
|
||||
.RB [ \-\-cachesettings
|
||||
.IR Key \fB= Value ]
|
||||
.RB [ \-c | \-\-chunksize
|
||||
.IR ChunkSize ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB \%[ \-C | \-\-contiguous
|
||||
.RB { y | n }]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-\-discards
|
||||
.RB \%{ ignore | nopassdown | passdown }]
|
||||
.RB [ \-\-errorwhenfull
|
||||
.RB { y | n }]
|
||||
.RB [{ \-l | \-\-extents
|
||||
.BR \fILogicalExtents\%Number [ % { FREE | PVS | VG }]
|
||||
.RB |
|
||||
.BR \-L | \-\-size
|
||||
.BR \fILogicalVolumeSize }
|
||||
.RB [ \-i | \-\-stripes
|
||||
.IR Stripes
|
||||
.RB [ \-I | \-\-stripesize
|
||||
.IR StripeSize ]]]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-K | \-\-ignoreactivationskip ]
|
||||
.RB [ \-\-ignoremonitoring ]
|
||||
.RB [ \-\-minor
|
||||
.IR Minor
|
||||
.RB [ \-j | \-\-major
|
||||
.IR Major ]]
|
||||
.RB [ \-\-metadataprofile
|
||||
.IR Profile\%Name ]
|
||||
.RB [ \-m | \-\-mirrors
|
||||
.IR Mirrors
|
||||
.RB [ \-\-corelog | \-\-mirrorlog
|
||||
.RB { disk | core | mirrored }]
|
||||
.RB [ \-\-nosync ]
|
||||
.RB [ \-R | \-\-regionsize
|
||||
.BR \fIMirrorLogRegionSize ]]
|
||||
.RB [ \-\-monitor
|
||||
.RB { y | n }]
|
||||
.RB [ \-n | \-\-name
|
||||
.IR Logical\%Volume ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-p | \-\-permission
|
||||
.RB { r | rw }]
|
||||
.RB [ \-M | \-\-persistent
|
||||
.RB { y | n }]
|
||||
.\" .RB [ \-\-pooldatasize
|
||||
.\" .I DataVolumeSize
|
||||
.RB \%[ \-\-poolmetadatasize
|
||||
.IR MetadataVolumeSize ]
|
||||
.RB [ \-\-poolmetadataspare
|
||||
.RB { y | n }]
|
||||
.RB [ \-\- [ raid ] maxrecoveryrate
|
||||
.IR Rate ]
|
||||
.RB [ \-\- [ raid ] minrecoveryrate
|
||||
.IR Rate ]
|
||||
.RB [ \-r | \-\-readahead
|
||||
.RB { \fIReadAheadSectors | auto | none }]
|
||||
.RB [ \-\-reportformat
|
||||
.RB {basic | json}]
|
||||
.RB \%[ \-k | \-\-setactivationskip
|
||||
.RB { y | n }]
|
||||
.RB [ \-s | \-\-snapshot ]
|
||||
.RB [ \-V | \-\-virtualsize
|
||||
.IR VirtualSize ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-T | \-\-thin ]
|
||||
.RB [ \-\-thinpool
|
||||
.IR ThinPoolLogicalVolume ]
|
||||
.RB [ \-\-type
|
||||
.IR SegmentType ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-W | \-\-wipesignatures
|
||||
.RB { y | n }]
|
||||
.RB [ \-Z | \-\-zero
|
||||
.RB { y | n }]
|
||||
.RI [ VolumeGroup
|
||||
.RI |
|
||||
.RI \%{ ExternalOrigin | Origin | Pool } LogicalVolume
|
||||
.RI \%[ PhysicalVolumePath [ \fB: \fIPE \fR[ \fB\- PE ]]...]]
|
||||
.LP
|
||||
.B lvcreate
|
||||
.RB [ \-l | \-\-extents
|
||||
.BR \fILogicalExtentsNumber [ % { FREE | ORIGIN | PVS | VG }]
|
||||
|
|
||||
.BR \-L | \-\-size
|
||||
.\" | \-\-pooldatasize
|
||||
.IR LogicalVolumeSize ]
|
||||
.RB [ \-c | \-\-chunksize
|
||||
.IR ChunkSize ]
|
||||
.RB \%[ \-\-commandprofile
|
||||
.IR Profile\%Name ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-ignoremonitoring ]
|
||||
.RB [ \-\-metadataprofile
|
||||
.IR Profile\%Name ]
|
||||
.RB \%[ \-\-monitor
|
||||
.RB { y | n }]
|
||||
.RB [ \-n | \-\-name
|
||||
.IR SnapshotLogicalVolumeName ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB {basic | json}]
|
||||
.BR \-s | \-\-snapshot | \-H | \-\-cache
|
||||
.RI \%{[ VolumeGroup \fB/\fP] OriginalLogicalVolume
|
||||
.RB \%[ \-V | \-\-virtualsize
|
||||
.IR VirtualSize ]}
|
||||
.ad b
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
.
|
||||
lvcreate creates a new logical volume in a volume group (see
|
||||
.BR vgcreate "(8), " vgchange (8))
|
||||
by allocating logical extents from the free physical extent pool
|
||||
of that volume group. If there are not enough free physical extents then
|
||||
the volume group can be extended (see
|
||||
.BR vgextend (8))
|
||||
with other physical volumes or by reducing existing logical volumes
|
||||
of this volume group in size (see
|
||||
.BR lvreduce (8)).
|
||||
If you specify one or more PhysicalVolumes, allocation of physical
|
||||
extents will be restricted to these volumes.
|
||||
.br
|
||||
.br
|
||||
The second form supports the creation of snapshot logical volumes which
|
||||
keep the contents of the original logical volume for backup purposes.
|
||||
.
|
||||
.SH OPTIONS
|
||||
.
|
||||
See
|
||||
.BR lvm (8)
|
||||
for common options.
|
||||
.
|
||||
.HP
|
||||
.BR \-a | \-\-activate
|
||||
.RB [ a ][ l | e | s ]{ y | n }
|
||||
.br
|
||||
Controls the availability of the Logical Volumes for immediate use after
|
||||
the command finishes running.
|
||||
By default, new Logical Volumes are activated (\fB\-ay\fP).
|
||||
If it is possible technically, \fB\-an\fP will leave the new Logical
|
||||
Volume inactive. But for example, snapshots of active origin can only be
|
||||
created in the active state so \fB\-an\fP cannot be used with
|
||||
\fB-\-type snapshot\fP. This does not apply to thin volume snapshots,
|
||||
which are by default created with flag to skip their activation
|
||||
(\fB-ky\fP).
|
||||
Normally the \fB\-\-zero n\fP argument has to be supplied too because
|
||||
zeroing (the default behaviour) also requires activation.
|
||||
If autoactivation option is used (\fB\-aay\fP), the logical volume is
|
||||
activated only if it matches an item in the
|
||||
\fBactivation/auto_activation_volume_list\fP
|
||||
set in \fBlvm.conf\fP(5).
|
||||
For autoactivated logical volumes, \fB\-\-zero n\fP and
|
||||
\fB\-\-wipesignatures n\fP is always assumed and it can't
|
||||
be overridden. If the clustered locking is enabled,
|
||||
\fB\-aey\fP will activate exclusively on one node and
|
||||
.BR \-a { a | l } y
|
||||
will activate only on the local node.
|
||||
.
|
||||
.HP
|
||||
.BR \-H | \-\-cache
|
||||
.br
|
||||
Creates cache or cache pool logical volume.
|
||||
.\" or both.
|
||||
Specifying the optional argument \fB\-\-extents\fP or \fB\-\-size\fP
|
||||
will cause the creation of the cache logical volume.
|
||||
.\" Specifying the optional argument \fB\-\-pooldatasize\fP will cause
|
||||
.\" the creation of the cache pool logical volume.
|
||||
.\" Specifying both arguments will cause the creation of cache with its
|
||||
.\" cache pool volume.
|
||||
When the Volume group name is specified together with existing logical volume
|
||||
name which is NOT a cache pool name, such volume is treated
|
||||
as cache origin volume and cache pool is created. In this case the
|
||||
\fB\-\-extents\fP or \fB\-\-size\fP is used to specify size of cache pool volume.
|
||||
See \fBlvmcache\fP(7) for more info about caching support.
|
||||
Note that the cache segment type requires a dm-cache kernel module version
|
||||
1.3.0 or greater.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachemode
|
||||
.RB { passthrough | writeback | writethrough }
|
||||
.br
|
||||
Specifying a cache mode determines when the writes to a cache LV
|
||||
are considered complete. When \fBwriteback\fP is specified, a write is
|
||||
considered complete as soon as it is stored in the cache pool LV.
|
||||
If \fBwritethough\fP is specified, a write is considered complete only
|
||||
when it has been stored in the cache pool LV and on the origin LV.
|
||||
While \fBwritethrough\fP may be slower for writes, it is more
|
||||
resilient if something should happen to a device associated with the
|
||||
cache pool LV. With \fBpassthrough\fP mode, all reads are served
|
||||
from origin LV (all reads miss the cache) and all writes are
|
||||
forwarded to the origin LV; additionally, write hits cause cache
|
||||
block invalidates. See \fBlvmcache(7)\fP for more details.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachepolicy
|
||||
.IR Policy
|
||||
.br
|
||||
Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
|
||||
the cache policy. \fBmq\fP is the basic policy name. \fBsmq\fP is more advanced
|
||||
version available in newer kernels.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachepool
|
||||
.IR CachePoolLogicalVolume { Name | Path }
|
||||
.br
|
||||
Specifies the name of cache pool volume name. The other way to specify pool name
|
||||
is to append name to Volume group name argument.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-cachesettings
|
||||
.IB Key = Value
|
||||
.br
|
||||
Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
|
||||
the cache tunable settings. In most use-cases, default values should be adequate.
|
||||
Special string value \fBdefault\fP switches setting back to its default kernel value
|
||||
and removes it from the list of settings stored in lvm2 metadata.
|
||||
.
|
||||
.HP
|
||||
.BR \-c | \-\-chunksize
|
||||
.SIZE_G \%ChunkSize
|
||||
.br
|
||||
Gives the size of chunk for snapshot, cache pool and thin pool logical volumes.
|
||||
Default unit is in kilobytes.
|
||||
.br
|
||||
For snapshots the value must be power of 2 between 4KiB and 512KiB
|
||||
and the default value is 4KiB.
|
||||
.br
|
||||
For cache pools the value must a multiple of 32KiB
|
||||
between 32KiB and 1GiB. The default is 64KiB.
|
||||
When the size is specified with volume caching, it may not be smaller
|
||||
than cache pool creation chunk size was.
|
||||
.br
|
||||
For thin pools the value must be a multiple of 64KiB
|
||||
between 64KiB and 1GiB.
|
||||
Default value starts with 64KiB and grows up to
|
||||
fit the pool metadata size within 128MiB,
|
||||
if the pool metadata size is not specified.
|
||||
See
|
||||
.BR lvm.conf (5)
|
||||
setting \fBallocation/thin_pool_chunk_size_policy\fP
|
||||
to select different calculation policy.
|
||||
Thin pool target version <1.4 requires this value to be a power of 2.
|
||||
For target version <1.5 discard is not supported for non power of 2 values.
|
||||
.
|
||||
.HP
|
||||
.BR \-C | \-\-contiguous
|
||||
.RB { y | n }
|
||||
.br
|
||||
Sets or resets the contiguous allocation policy for
|
||||
logical volumes. Default is no contiguous allocation based
|
||||
on a next free principle.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-corelog
|
||||
.br
|
||||
This is shortcut for option \fB\-\-mirrorlog core\fP.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-discards
|
||||
.RB { ignore | nopassdown | passdown }
|
||||
.br
|
||||
Sets discards behavior for thin pool.
|
||||
Default is \fBpassdown\fP.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-errorwhenfull
|
||||
.RB { y | n }
|
||||
.br
|
||||
Configures thin pool behaviour when data space is exhausted.
|
||||
Default is \fBn\fPo.
|
||||
Device will queue I/O operations until target timeout
|
||||
(see dm-thin-pool kernel module option \fPno_space_timeout\fP)
|
||||
expires. Thus configured system has a time to i.e. extend
|
||||
the size of thin pool data device.
|
||||
When set to \fBy\fPes, the I/O operation is immeditelly errored.
|
||||
.
|
||||
.HP
|
||||
.BR \-K | \-\-ignoreactivationskip
|
||||
.br
|
||||
Ignore the flag to skip Logical Volumes during activation.
|
||||
Use \fB\-\-setactivationskip\fP option to set or reset
|
||||
activation skipping flag persistently for logical volume.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-ignoremonitoring
|
||||
.br
|
||||
Make no attempt to interact with dmeventd unless \fB\-\-monitor\fP
|
||||
is specified.
|
||||
.
|
||||
.HP
|
||||
.BR -l | \-\-extents
|
||||
.IR LogicalExtentsNumber \c
|
||||
.RB [ % { VG | PVS | FREE | ORIGIN }]
|
||||
.br
|
||||
Specifies the size of the new LV in logical extents. The number of
|
||||
physical extents allocated may be different, and depends on the LV type.
|
||||
Certain LV types require more physical extents for data redundancy or
|
||||
metadata. An alternate syntax allows the size to be determined indirectly
|
||||
as a percentage of the size of a related VG, LV, or set of PVs. The
|
||||
suffix \fB%VG\fP denotes the total size of the VG, the suffix \fB%FREE\fP
|
||||
the remaining free space in the VG, and the suffix \fB%PVS\fP the free
|
||||
space in the specified Physical Volumes. For a snapshot, the size
|
||||
can be expressed as a percentage of the total size of the Origin Logical
|
||||
Volume with the suffix \fB%ORIGIN\fP (\fB100%ORIGIN\fP provides space for
|
||||
the whole origin).
|
||||
When expressed as a percentage, the size defines an upper limit for the
|
||||
number of logical extents in the new LV. The precise number of logical
|
||||
extents in the new LV is not determined until the command has completed.
|
||||
.
|
||||
.HP
|
||||
.BR \-j | \-\-major
|
||||
.IR Major
|
||||
.br
|
||||
Sets the major number.
|
||||
Major numbers are not supported with pool volumes.
|
||||
This option is supported only on older systems
|
||||
(kernel version 2.4) and is ignored on modern Linux systems where major
|
||||
numbers are dynamically assigned.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-metadataprofile
|
||||
.IR ProfileName
|
||||
.br
|
||||
Uses and attaches the \fIProfileName\fP configuration profile to the logical
|
||||
volume metadata. Whenever the logical volume is processed next time,
|
||||
the profile is automatically applied. If the volume group has another
|
||||
profile attached, the logical volume profile is preferred.
|
||||
See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-minor
|
||||
.IR Minor
|
||||
.br
|
||||
Sets the minor number.
|
||||
Minor numbers are not supported with pool volumes.
|
||||
.
|
||||
.HP
|
||||
.BR \-m | \-\-mirrors
|
||||
.IR mirrors
|
||||
.br
|
||||
Creates a mirrored logical volume with \fImirrors\fP copies.
|
||||
For example, specifying \fB\-m 1\fP
|
||||
would result in a mirror with two-sides; that is,
|
||||
a linear volume plus one copy.
|
||||
|
||||
Specifying the optional argument \fB\-\-nosync\fP will cause the creation
|
||||
of the mirror LV to skip the initial resynchronization. Any data written
|
||||
afterwards will be mirrored, but the original contents will not be copied.
|
||||
|
||||
This is useful for skipping a potentially long and resource intensive initial
|
||||
sync of an empty mirrored RaidLV.
|
||||
|
||||
There are two implementations of mirroring which can be used and correspond
|
||||
to the "\fIraid1\fP" and "\fImirror\fP" segment types.
|
||||
The default is "\fIraid1\fP". See the
|
||||
\fB\-\-type\fP option for more information if you would like to use the
|
||||
legacy "\fImirror\fP" segment type. See
|
||||
.BR lvm.conf (5)
|
||||
settings \fB global/mirror_segtype_default\fP
|
||||
and \fBglobal/raid10_segtype_default\fP
|
||||
to configure default mirror segment type.
|
||||
The options
|
||||
\fB\-\-mirrorlog\fP and \fB\-\-corelog\fP apply
|
||||
to the legacy "\fImirror\fP" segment type only.
|
||||
|
||||
Note the current maxima for mirrors are 7 for "mirror" providing
|
||||
8 mirror legs and 9 for "raid1" providing 10 legs.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-mirrorlog
|
||||
.RB { disk | core | mirrored }
|
||||
.br
|
||||
Specifies the type of log to be used for logical volumes utilizing
|
||||
the legacy "\fImirror\fP" segment type.
|
||||
.br
|
||||
The default is \fBdisk\fP, which is persistent and requires
|
||||
a small amount of storage space, usually on a separate device from the
|
||||
data being mirrored.
|
||||
.br
|
||||
Using \fBcore\fP means the mirror is regenerated by copying the data
|
||||
from the first device each time the logical volume is activated,
|
||||
like after every reboot.
|
||||
.br
|
||||
Using \fBmirrored\fP will create a persistent log that is itself mirrored.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-monitor
|
||||
.RB { y | n }
|
||||
.br
|
||||
Starts or avoids monitoring a mirrored, snapshot or thin pool logical volume with
|
||||
dmeventd, if it is installed.
|
||||
If a device used by a monitored mirror reports an I/O error,
|
||||
the failure is handled according to
|
||||
\fBactivation/mirror_image_fault_policy\fP
|
||||
and \fBactivation/mirror_log_fault_policy\fP
|
||||
set in \fBlvm.conf\fP(5).
|
||||
.
|
||||
.HP
|
||||
.BR \-n | \-\-name
|
||||
.IR LogicalVolume { Name | Path }
|
||||
.br
|
||||
Sets the name for the new logical volume.
|
||||
.br
|
||||
Without this option a default name of "lvol#" will be generated where
|
||||
# is the LVM internal number of the logical volume.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-nosync
|
||||
.br
|
||||
Causes the creation of mirror, raid1, raid4, raid5 and raid10 to skip the
|
||||
initial resynchronization. In case of mirror, raid1 and raid10, any data
|
||||
written afterwards will be mirrored, but the original contents will not be
|
||||
copied. In case of raid4 and raid5, no parity blocks will be written,
|
||||
though any data written afterwards will cause parity blocks to be stored.
|
||||
.br
|
||||
This is useful for skipping a potentially long and resource intensive initial
|
||||
sync of an empty mirror/raid1/raid4/raid5 and raid10 LV.
|
||||
.br
|
||||
This option is not valid for raid6, because raid6 relies on proper parity
|
||||
(P and Q Syndromes) being created during initial synchronization in order
|
||||
to reconstruct proper user date in case of device failures.
|
||||
|
||||
raid0 and raid0_meta don't provide any data copies or parity support
|
||||
and thus don't support initial resynchronization.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-noudevsync
|
||||
.br
|
||||
Disables udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.
|
||||
.HP
|
||||
.BR \-p | \-\-permission
|
||||
.RB { r | rw }
|
||||
.br
|
||||
Sets access permissions to read only (\fBr\fP) or read and write (\fBrw\fP).
|
||||
.br
|
||||
Default is read and write.
|
||||
.
|
||||
.HP
|
||||
.BR \-M | \-\-persistent
|
||||
.RB { y | n }
|
||||
.br
|
||||
Set to \fBy\fP to make the minor number specified persistent.
|
||||
Pool volumes cannot have persistent major and minor numbers.
|
||||
Defaults to \fBy\fPes only when major or minor number is specified.
|
||||
Otherwise it is \fBn\fPo.
|
||||
.\" .HP
|
||||
.\" .IR \fB\-\-pooldatasize " " PoolDataVolumeSize [ bBsSkKmMgGtTpPeE ]
|
||||
.\" Sets the size of pool's data logical volume.
|
||||
.\" For thin pools you may also specify the size
|
||||
.\" with the option \fB\-\-size\fP.
|
||||
.\"
|
||||
.
|
||||
.HP
|
||||
.BR \-\-poolmetadatasize
|
||||
.SIZE_G \%MetadataVolumeSize
|
||||
.br
|
||||
Sets the size of pool's metadata logical volume.
|
||||
Supported values are in range between 2MiB and 16GiB for thin pool,
|
||||
and upto 16GiB for cache pool. The minimum value is computed from pool's
|
||||
data size.
|
||||
Default value for thin pool is (Pool_LV_size / Pool_LV_chunk_size * 64b).
|
||||
To work with a thin pool, there should be at least 25% of free space
|
||||
when the size of metadata is smaller then 16MiB,
|
||||
or at least 4MiB of free space otherwise.
|
||||
Default unit is megabytes.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-poolmetadataspare
|
||||
.RB { y | n }
|
||||
.br
|
||||
Controls creation and maintanence of pool metadata spare logical volume
|
||||
that will be used for automated pool recovery.
|
||||
Only one such volume is maintained within a volume group
|
||||
with the size of the biggest pool metadata volume.
|
||||
Default is \fBy\fPes.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] maxrecoveryrate
|
||||
.SIZE_G \%Rate
|
||||
.br
|
||||
Sets the maximum recovery rate for a RAID logical volume. \fIRate\fP
|
||||
is specified as an amount per second for each device in the array.
|
||||
If no suffix is given, then KiB/sec/device is assumed. Setting the
|
||||
recovery rate to 0 means it will be unbounded.
|
||||
.
|
||||
.HP
|
||||
.BR \-\- [ raid ] minrecoveryrate
|
||||
.SIZE_G \%Rate
|
||||
.br
|
||||
Sets the minimum recovery rate for a RAID logical volume. \fIRate\fP
|
||||
is specified as an amount per second for each device in the array.
|
||||
If no suffix is given, then KiB/sec/device is assumed. Setting the
|
||||
recovery rate to 0 means it will be unbounded.
|
||||
.
|
||||
.HP
|
||||
.BR \-r | \-\-readahead
|
||||
.RB { \fIReadAheadSectors | auto | none }
|
||||
.br
|
||||
Sets read ahead sector count of this logical volume.
|
||||
For volume groups with metadata in lvm1 format, this must
|
||||
be a value between 2 and 120.
|
||||
The default value is \fBauto\fP which allows the kernel to choose
|
||||
a suitable value automatically.
|
||||
\fBnone\fP is equivalent to specifying zero.
|
||||
.
|
||||
.HP
|
||||
.BR \-R | \-\-regionsize
|
||||
.SIZE_G \%MirrorLogRegionSize
|
||||
.br
|
||||
A mirror is divided into regions of this size (in MiB), and the mirror log
|
||||
uses this granularity to track which regions are in sync.
|
||||
.
|
||||
.HP
|
||||
.BR \-k | \-\-setactivationskip
|
||||
.RB { y | n }
|
||||
.br
|
||||
Controls whether Logical Volumes are persistently flagged to be skipped during
|
||||
activation. By default, thin snapshot volumes are flagged for activation skip.
|
||||
See
|
||||
.BR lvm.conf (5)
|
||||
\fBactivation/auto_set_activation_skip\fP
|
||||
how to change its default behaviour.
|
||||
To activate such volumes, an extra \fB\-\-ignoreactivationskip\fP
|
||||
option must be used. The flag is not applied during deactivation. Use
|
||||
\fBlvchange \-\-setactivationskip\fP
|
||||
command to change the skip flag for existing volumes.
|
||||
To see whether the flag is attached, use \fBlvs\fP command
|
||||
where the state of the flag is reported within \fBlv_attr\fP bits.
|
||||
.
|
||||
.HP
|
||||
.BR \-L | \-\-size
|
||||
.SIZE_E \%LogicalVolumeSize
|
||||
.br
|
||||
Gives the size to allocate for the new logical volume.
|
||||
A size suffix of \fBB\fP for bytes, \fBS\fP for sectors as 512 bytes,
|
||||
\fBK\fP for kilobytes, \fBM\fP for megabytes,
|
||||
\fBG\fP for gigabytes, \fBT\fP for terabytes, \fBP\fP for petabytes
|
||||
or \fBE\fP for exabytes is optional.
|
||||
.br
|
||||
Default unit is megabytes.
|
||||
.
|
||||
.HP
|
||||
.BR \-s | \fB\-\-snapshot
|
||||
.IR OriginalLogicalVolume { Name | Path }
|
||||
.br
|
||||
Creates a snapshot logical volume (or snapshot) for an existing, so called
|
||||
original logical volume (or origin).
|
||||
Snapshots provide a 'frozen image' of the contents of the origin
|
||||
while the origin can still be updated. They enable consistent
|
||||
backups and online recovery of removed/overwritten data/files.
|
||||
.br
|
||||
Thin snapshot is created when the origin is a thin volume and
|
||||
the size IS NOT specified. Thin snapshot shares same blocks within
|
||||
the thin pool volume.
|
||||
The non thin volume snapshot with the specified size does not need
|
||||
the same amount of storage the origin has. In a typical scenario,
|
||||
15-20% might be enough. In case the snapshot runs out of storage, use
|
||||
.BR lvextend (8)
|
||||
to grow it. Shrinking a snapshot is supported by
|
||||
.BR lvreduce (8)
|
||||
as well. Run
|
||||
.BR lvs (8)
|
||||
on the snapshot in order to check how much data is allocated to it.
|
||||
Note: a small amount of the space you allocate to the snapshot is
|
||||
used to track the locations of the chunks of data, so you should
|
||||
allocate slightly more space than you actually need and monitor
|
||||
(\fB\-\-monitor\fP) the rate at which the snapshot data is growing
|
||||
so you can \fBavoid\fP running out of space.
|
||||
If \fB\-\-thinpool\fP is specified, thin volume is created that will
|
||||
use given original logical volume as an external origin that
|
||||
serves unprovisioned blocks.
|
||||
Only read-only volumes can be used as external origins.
|
||||
To make the volume external origin, lvm expects the volume to be inactive.
|
||||
External origin volume can be used/shared for many thin volumes
|
||||
even from different thin pools. See
|
||||
.BR lvconvert (8)
|
||||
for online conversion to thin volumes with external origin.
|
||||
.
|
||||
.HP
|
||||
.BR \-i | \-\-stripes
|
||||
.IR Stripes
|
||||
.br
|
||||
Gives the number of stripes.
|
||||
This is equal to the number of physical volumes to scatter
|
||||
the logical volume data. When creating a RAID 4/5/6 logical volume,
|
||||
the extra devices which are necessary for parity are
|
||||
internally accounted for. Specifying \fB\-i 3\fP
|
||||
would cause 3 devices for striped and RAID 0 logical volumes,
|
||||
4 devices for RAID 4/5, 5 devices for RAID 6 and 6 devices for RAID 10.
|
||||
Alternatively, RAID 0 will stripe across 2 devices,
|
||||
RAID 4/5 across 3 PVs, RAID 6 across 5 PVs and RAID 10 across
|
||||
4 PVs in the volume group if the \fB\-i\fP argument is omitted.
|
||||
In order to stripe across all PVs of the VG if the \fB\-i\fP argument is
|
||||
omitted, set raid_stripe_all_devices=1 in the allocation
|
||||
section of \fBlvm.conf (5)\fP or add
|
||||
.br
|
||||
\fB\-\-config allocation/raid_stripe_all_devices=1\fP
|
||||
.br
|
||||
to the command.
|
||||
|
||||
Note the current maxima for stripes depend on the created RAID type.
|
||||
For raid10, the maximum of stripes is 32,
|
||||
for raid0, it is 64,
|
||||
for raid4/5, it is 63
|
||||
and for raid6 it is 62.
|
||||
|
||||
See the \fB\-\-nosync\fP option to optionally avoid initial syncrhonization of RaidLVs.
|
||||
|
||||
Two implementations of basic striping are available in the kernel.
|
||||
The original device-mapper implementation is the default and should
|
||||
normally be used. The alternative implementation using MD, available
|
||||
since version 1.7 of the RAID device-mapper kernel target (kernel
|
||||
version 4.2) is provided to facilitate the development of new RAID
|
||||
features. It may be accessed with \fB--type raid0[_meta]\fP, but is best
|
||||
avoided at present because of assorted restrictions on resizing and converting
|
||||
such devices.
|
||||
.HP
|
||||
.BR \-I | \-\-stripesize
|
||||
.IR StripeSize
|
||||
.br
|
||||
Gives the number of kilobytes for the granularity of the stripes.
|
||||
.br
|
||||
StripeSize must be 2^n (n = 2 to 9) for metadata in LVM1 format.
|
||||
For metadata in LVM2 format, the stripe size may be a larger
|
||||
power of 2 but must not exceed the physical extent size.
|
||||
.
|
||||
.HP
|
||||
.BR \-T | \-\-thin
|
||||
.br
|
||||
Creates thin pool or thin logical volume or both.
|
||||
Specifying the optional argument \fB\-\-size\fP or \fB\-\-extents\fP
|
||||
will cause the creation of the thin pool logical volume.
|
||||
Specifying the optional argument \fB\-\-virtualsize\fP will cause
|
||||
the creation of the thin logical volume from given thin pool volume.
|
||||
Specifying both arguments will cause the creation of both
|
||||
thin pool and thin volume using this pool.
|
||||
See \fBlvmthin\fP(7) for more info about thin provisioning support.
|
||||
Thin provisioning requires device mapper kernel driver
|
||||
from kernel 3.2 or greater.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-thinpool
|
||||
.IR ThinPoolLogicalVolume { Name | Path }
|
||||
.br
|
||||
Specifies the name of thin pool volume name. The other way to specify pool name
|
||||
is to append name to Volume group name argument.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-type
|
||||
.IR SegmentType
|
||||
.br
|
||||
Creates a logical volume with the specified segment type.
|
||||
Supported types are:
|
||||
.BR cache ,
|
||||
.BR cache-pool ,
|
||||
.BR error ,
|
||||
.BR linear ,
|
||||
.BR mirror,
|
||||
.BR raid0 ,
|
||||
.BR raid1 ,
|
||||
.BR raid4 ,
|
||||
.BR raid5_la ,
|
||||
.BR raid5_ls
|
||||
.RB (=
|
||||
.BR raid5 ),
|
||||
.BR raid5_ra ,
|
||||
.BR raid5_rs ,
|
||||
.BR raid6_nc ,
|
||||
.BR raid6_nr ,
|
||||
.BR raid6_zr
|
||||
.RB (=
|
||||
.BR raid6 ),
|
||||
.BR raid10 ,
|
||||
.BR snapshot ,
|
||||
.BR striped,
|
||||
.BR thin ,
|
||||
.BR thin-pool
|
||||
or
|
||||
.BR zero .
|
||||
Segment type may have a commandline switch alias that will
|
||||
enable its use.
|
||||
When the type is not explicitly specified an implicit type
|
||||
is selected from combination of options:
|
||||
.BR \-H | \-\-cache | \-\-cachepool
|
||||
(cache or cachepool),
|
||||
.BR \-T | \-\-thin | \-\-thinpool
|
||||
(thin or thinpool),
|
||||
.BR \-m | \-\-mirrors
|
||||
(raid1 or mirror),
|
||||
.BR \-s | \-\-snapshot | \-V | \-\-virtualsize
|
||||
(snapshot or thin),
|
||||
.BR \-i | \-\-stripes
|
||||
(striped).
|
||||
The default segment type is \fBlinear\fP.
|
||||
.
|
||||
.HP
|
||||
.BR \-V | \-\-virtualsize
|
||||
.SIZE_E \%VirtualSize
|
||||
.br
|
||||
Creates a thinly provisioned device or a sparse device of the given size (in MiB by default).
|
||||
See
|
||||
.BR lvm.conf (5)
|
||||
settings \fBglobal/sparse_segtype_default\fP
|
||||
to configure default sparse segment type.
|
||||
See \fBlvmthin\fP(7) for more info about thin provisioning support.
|
||||
Anything written to a sparse snapshot will be returned when reading from it.
|
||||
Reading from other areas of the device will return blocks of zeros.
|
||||
Virtual snapshot (sparse snapshot) is implemented by creating
|
||||
a hidden virtual device of the requested size using the zero target.
|
||||
A suffix of _vorigin is used for this device.
|
||||
Note: using sparse snapshots is not efficient for larger
|
||||
device sizes (GiB), thin provisioning should be used for this case.
|
||||
.
|
||||
.HP
|
||||
.BR \-W | \-\-wipesignatures
|
||||
.RB { y | n }
|
||||
.br
|
||||
Controls detection and subsequent wiping of signatures on newly created
|
||||
Logical Volume. There's a prompt for each signature detected to confirm
|
||||
its wiping (unless \fB--yes\fP is used where LVM assumes 'yes' answer
|
||||
for each prompt automatically). If this option is not specified, then by
|
||||
default \fB-W\fP | \fB--wipesignatures y\fP is assumed each time the
|
||||
zeroing is done (\fB\-Z\fP | \fB\-\-zero y\fP). This default behaviour
|
||||
can be controlled by \fB\%allocation/wipe_signatures_when_zeroing_new_lvs\fP
|
||||
setting found in
|
||||
.BR lvm.conf (5).
|
||||
.br
|
||||
If blkid wiping is used (\fBallocation/use_blkid_wiping\fP setting in
|
||||
.BR lvm.conf (5))
|
||||
and LVM2 is compiled with blkid wiping support, then \fBblkid\fP(8) library is used
|
||||
to detect the signatures (use \fBblkid \-k\fP command to list the signatures that are recognized).
|
||||
Otherwise, native LVM2 code is used to detect signatures (MD RAID, swap and LUKS
|
||||
signatures are detected only in this case).
|
||||
.br
|
||||
Logical volume is not wiped if the read only flag is set.
|
||||
.
|
||||
.HP
|
||||
.BR \-Z | \-\-zero
|
||||
.RB { y | n }
|
||||
.br
|
||||
Controls zeroing of the first 4KiB of data in the new logical volume.
|
||||
Default is \fBy\fPes.
|
||||
Snapshot COW volumes are always zeroed.
|
||||
Logical volume is not zeroed if the read only flag is set.
|
||||
.br
|
||||
Warning: trying to mount an unzeroed logical volume can cause the system to
|
||||
hang.
|
||||
.
|
||||
.SH Examples
|
||||
.
|
||||
Creates a striped logical volume with 3 stripes, a stripe size of 8KiB
|
||||
and a size of 100MiB in the volume group named vg00.
|
||||
The logical volume name will be chosen by lvcreate:
|
||||
.sp
|
||||
.B lvcreate \-i 3 \-I 8 \-L 100M vg00
|
||||
|
||||
Creates a mirror logical volume with 2 sides with a useable size of 500 MiB.
|
||||
This operation would require 3 devices (or option
|
||||
\fB\-\-alloc \%anywhere\fP) - two for the mirror
|
||||
devices and one for the disk log:
|
||||
.sp
|
||||
.B lvcreate \-m1 \-L 500M vg00
|
||||
|
||||
Creates a mirror logical volume with 2 sides with a useable size of 500 MiB.
|
||||
This operation would require 2 devices - the log is "in-memory":
|
||||
.sp
|
||||
.B lvcreate \-m1 \-\-mirrorlog core \-L 500M vg00
|
||||
|
||||
Creates a snapshot logical volume named "vg00/snap" which has access to the
|
||||
contents of the original logical volume named "vg00/lvol1"
|
||||
at snapshot logical volume creation time. If the original logical volume
|
||||
contains a file system, you can mount the snapshot logical volume on an
|
||||
arbitrary directory in order to access the contents of the filesystem to run
|
||||
a backup while the original filesystem continues to get updated:
|
||||
.sp
|
||||
.B lvcreate \-\-size 100m \-\-snapshot \-\-name snap /dev/vg00/lvol1
|
||||
|
||||
Creates a snapshot logical volume named "vg00/snap" with size
|
||||
for overwriting 20% of the original logical volume named "vg00/lvol1".:
|
||||
.sp
|
||||
.B lvcreate \-s \-l 20%ORIGIN \-\-name snap vg00/lvol1
|
||||
|
||||
Creates a sparse device named /dev/vg1/sparse of size 1TiB with space for just
|
||||
under 100MiB of actual data on it:
|
||||
.sp
|
||||
.B lvcreate \-\-virtualsize 1T \-\-size 100M \-\-snapshot \-\-name sparse vg1
|
||||
|
||||
Creates a linear logical volume "vg00/lvol1" using physical extents
|
||||
/dev/sda:0\-7 and /dev/sdb:0\-7 for allocation of extents:
|
||||
.sp
|
||||
.B lvcreate \-L 64M \-n lvol1 vg00 /dev/sda:0\-7 /dev/sdb:0\-7
|
||||
|
||||
Creates a 5GiB RAID5 logical volume "vg00/my_lv", with 3 stripes (plus
|
||||
a parity drive for a total of 4 devices) and a stripesize of 64KiB:
|
||||
.sp
|
||||
.B lvcreate \-\-type raid5 \-L 5G \-i 3 \-I 64 \-n my_lv vg00
|
||||
|
||||
Creates a RAID5 logical volume "vg00/my_lv", using all of the free
|
||||
space in the VG and spanning all the PVs in the VG (note that the command
|
||||
will fail if there's more than 8 PVs in the VG in which case \fB\-i 7\fP
|
||||
has to be used to get to the currently possible maximum of
|
||||
8 devices including parity for RaidLVs):
|
||||
.sp
|
||||
.B lvcreate \-\-config allocation/raid_stripe_all_devices=1 \-\-type raid5 \-l 100%FREE \-n my_lv vg00
|
||||
|
||||
Creates a 5GiB RAID10 logical volume "vg00/my_lv", with 2 stripes on
|
||||
2 2-way mirrors. Note that the \fB-i\fP and \fB-m\fP arguments behave
|
||||
differently.
|
||||
The \fB-i\fP specifies the number of stripes.
|
||||
The \fB-m\fP specifies the number of
|
||||
.B additional
|
||||
copies:
|
||||
.sp
|
||||
.B lvcreate \-\-type raid10 \-L 5G \-i 2 \-m 1 \-n my_lv vg00
|
||||
|
||||
Creates 100MiB pool logical volume for thin provisioning
|
||||
build with 2 stripes 64KiB and chunk size 256KiB together with
|
||||
1TiB thin provisioned logical volume "vg00/thin_lv":
|
||||
.sp
|
||||
.B lvcreate \-i 2 \-I 64 \-c 256 \-L100M \-T vg00/pool \-V 1T \-\-name thin_lv
|
||||
|
||||
Creates a thin snapshot volume "thinsnap" of thin volume "thinvol" that
|
||||
will share the same blocks within the thin pool.
|
||||
Note: the size MUST NOT be specified, otherwise the non-thin snapshot
|
||||
is created instead:
|
||||
.sp
|
||||
.B lvcreate \-s vg00/thinvol \-\-name thinsnap
|
||||
|
||||
Creates a thin snapshot volume of read-only inactive volume "origin"
|
||||
which then becomes the thin external origin for the thin snapshot volume
|
||||
in vg00 that will use an existing thin pool "vg00/pool":
|
||||
.sp
|
||||
.B lvcreate \-s \-\-thinpool vg00/pool origin
|
||||
|
||||
Create a cache pool LV that can later be used to cache one
|
||||
logical volume.
|
||||
.sp
|
||||
.B lvcreate \-\-type cache-pool \-L 1G \-n my_lv_cachepool vg /dev/fast1
|
||||
|
||||
If there is an existing cache pool LV, create the large slow
|
||||
device (i.e. the origin LV) and link it to the supplied cache pool LV,
|
||||
creating a cache LV.
|
||||
.sp
|
||||
.B lvcreate \-\-cache \-L 100G \-n my_lv vg/my_lv_cachepool /dev/slow1
|
||||
|
||||
If there is an existing logical volume, create the small and fast
|
||||
cache pool LV and link it to the supplied existing logical
|
||||
volume (i.e. the origin LV), creating a cache LV.
|
||||
.sp
|
||||
.B lvcreate \-\-type cache \-L 1G \-n my_lv_cachepool vg/my_lv /dev/fast1
|
||||
|
||||
.\" Create a 1G cached LV "lvol1" with 10M cache pool "vg00/pool".
|
||||
.\" .sp
|
||||
.\" .B lvcreate \-\-cache \-L 1G \-n lv \-\-pooldatasize 10M vg00/pool
|
||||
.
|
||||
.SH SEE ALSO
|
||||
.
|
||||
.nh
|
||||
.BR lvm (8),
|
||||
.BR lvm.conf (5),
|
||||
.BR lvmcache (7),
|
||||
.BR lvmthin (7),
|
||||
.BR lvconvert (8),
|
||||
.BR lvchange (8),
|
||||
.BR lvextend (8),
|
||||
.BR lvreduce (8),
|
||||
.BR lvremove (8),
|
||||
.BR lvrename (8)
|
||||
.BR lvs (8),
|
||||
.BR lvscan (8),
|
||||
.BR vgcreate (8),
|
||||
.BR blkid (8)
|
134
man/lvdisplay.8.in
Normal file
134
man/lvdisplay.8.in
Normal file
@@ -0,0 +1,134 @@
|
||||
.TH LVDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvdisplay \(em display attributes of a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvdisplay
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-c | \-\-colon ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-maps ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]
|
||||
.br
|
||||
|
||||
.B lvdisplay
|
||||
.BR \-C | \-\-columns
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-segments ]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]
|
||||
.SH DESCRIPTION
|
||||
lvdisplay allows you to see the attributes of a logical volume
|
||||
like size, read/write status, snapshot information etc.
|
||||
.P
|
||||
\fBlvs\fP(8) is an alternative that provides the same information
|
||||
in the style of \fBps\fP(1).
|
||||
\fBlvs\fP(8) is recommended over \fBlvdisplay\fP.
|
||||
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options and \fBlvs\fP for options given with
|
||||
\fB\-\-columns\fP.
|
||||
.TP
|
||||
.B \-\-all
|
||||
Include information in the output about internal Logical Volumes that
|
||||
are components of normally-accessible Logical Volumes, such as mirrors,
|
||||
but which are not independently accessible (e.g. not mountable).
|
||||
For example, after creating a mirror using
|
||||
\fBlvcreate \-m1 \-\-mirrorlog disk\fP,
|
||||
this option will reveal three internal Logical Volumes, with suffixes
|
||||
mimage_0, mimage_1, and mlog.
|
||||
.TP
|
||||
.BR \-C ", " \-\-columns
|
||||
Display output in columns, the equivalent of \fBlvs\fP(8).
|
||||
Options listed are the same as options given in \fBlvs\fP(8).
|
||||
.TP
|
||||
.BR \-c ", " \-\-colon
|
||||
Generate colon separated output for easier parsing in scripts or programs.
|
||||
N.B. \fBlvs\fP(8) provides considerably more control over the output.
|
||||
.nf
|
||||
|
||||
The values are:
|
||||
|
||||
\(bu logical volume name
|
||||
\(bu volume group name
|
||||
\(bu logical volume access
|
||||
\(bu logical volume status
|
||||
\(bu internal logical volume number
|
||||
\(bu open count of logical volume
|
||||
\(bu logical volume size in sectors
|
||||
\(bu current logical extents associated to logical volume
|
||||
\(bu allocated logical extents of logical volume
|
||||
\(bu allocation policy of logical volume
|
||||
\(bu read ahead sectors of logical volume
|
||||
\(bu major device number of logical volume
|
||||
\(bu minor device number of logical volume
|
||||
|
||||
.fi
|
||||
.TP
|
||||
.BR \-m ", " \-\-maps
|
||||
Display the mapping of logical extents to physical volumes and
|
||||
physical extents. To map physical extents
|
||||
to logical extents use:
|
||||
.B pvs \-\-segments \-o+lv_name,seg_start_pe,segtype
|
||||
.SH Examples
|
||||
Shows attributes of that logical volume. If snapshot
|
||||
logical volumes have been created for this original logical volume,
|
||||
this command shows a list of all snapshot logical volumes and their
|
||||
status (active or inactive) as well:
|
||||
.sp
|
||||
.B lvdisplay \-v vg00/lvol2
|
||||
|
||||
Shows the attributes of this snapshot logical volume and also which
|
||||
original logical volume it is associated with:
|
||||
.sp
|
||||
.B lvdisplay vg00/snapshot
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvcreate (8),
|
||||
.BR lvs (8),
|
||||
.BR lvscan (8),
|
||||
.BR pvs (8)
|
134
man/lvextend.8.in
Normal file
134
man/lvextend.8.in
Normal file
@@ -0,0 +1,134 @@
|
||||
.TH LVEXTEND 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvextend \(em extend the size of a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvextend
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-i | \-\-stripes
|
||||
.I Stripes
|
||||
.RB [ \-I | \-\-stripesize
|
||||
.IR StripeSize ]]
|
||||
.RB { \-l | \-\-extents
|
||||
.RI [ + ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
|
||||
|
|
||||
.BR \-L | \-\-size
|
||||
.RI [ + ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
|
||||
.RB [ \-n | \-\-nofsck ]
|
||||
.RB [ \-\-noudevsync]
|
||||
.RB [ \-r | \-\-resizefs ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-use\-policies ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.I LogicalVolumePath
|
||||
.RI [ PhysicalVolumePath [ :PE [ \-PE ]]...]
|
||||
.SH DESCRIPTION
|
||||
lvextend allows you to extend the size of a logical volume.
|
||||
Extension of snapshot logical volumes (see
|
||||
.BR lvcreate (8)
|
||||
for information to create snapshots) is supported as well.
|
||||
But to change the number of copies in a mirrored logical
|
||||
volume use
|
||||
.BR lvconvert (8).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Proceed with size extension without prompting.
|
||||
.TP
|
||||
.IR \fB\-l ", " \fB\-\-extents " [" + ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
|
||||
Extend or set the logical volume size in units of logical extents.
|
||||
With the '\fI+\fP' sign the value is added to the actual size
|
||||
of the logical volume and without it, the value is taken as an absolute one.
|
||||
The total number of physical extents allocated will be
|
||||
greater than this, for example, if the volume is mirrored.
|
||||
The number can also be expressed as a percentage of the total space
|
||||
in the Volume Group with the suffix \fI%VG\fP, relative to the existing
|
||||
size of the Logical Volume with the suffix \fI%LV\fP, of the remaining
|
||||
free space for the specified PhysicalVolume(s) with the suffix \fI%PVS\fP,
|
||||
as a percentage of the remaining free space in the Volume Group
|
||||
with the suffix \fI%FREE\fP, or (for a snapshot) as a percentage of the total
|
||||
space in the Origin Logical Volume with the suffix \fI%ORIGIN\fP.
|
||||
The resulting value is rounded upward.
|
||||
N.B. In a future release, when expressed as a percentage with PVS, VG or FREE,
|
||||
the number will be treated as an approximate upper limit for the total number
|
||||
of physical extents to be allocated (including extents used by any mirrors, for
|
||||
example). The code may currently allocate more space than you might otherwise
|
||||
expect.
|
||||
.TP
|
||||
.IR \fB\-L ", " \fB\-\-size " [" + ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
|
||||
Extend or set the logical volume size in units of megabytes.
|
||||
A size suffix of M for megabytes,
|
||||
G for gigabytes, T for terabytes, P for petabytes
|
||||
or E for exabytes is optional.
|
||||
With the + sign the value is added to the actual size
|
||||
of the logical volume and without it, the value is taken as an absolute one.
|
||||
.TP
|
||||
.BR \-i ", " \-\-stripes " " \fIStripes
|
||||
Gives the number of stripes for the extension.
|
||||
Not applicable to LVs using the original metadata LVM format, which must
|
||||
use a single value throughout.
|
||||
.TP
|
||||
.BR \-I ", " \-\-stripesize " " \fIStripeSize
|
||||
Gives the number of kilobytes for the granularity of the stripes.
|
||||
Not applicable to LVs using the original metadata LVM format, which must
|
||||
use a single value throughout.
|
||||
.br
|
||||
StripeSize must be 2^n (n = 2 to 9)
|
||||
.TP
|
||||
.BR \-n ", " \-\-nofsck
|
||||
Do not perform fsck before extending filesystem when filesystem
|
||||
requires it. You may need to use \fB\-\-force\fR to proceed with
|
||||
this option.
|
||||
.TP
|
||||
.B \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.TP
|
||||
.BR \-r ", " \-\-resizefs
|
||||
Resize underlying filesystem together with the logical volume using
|
||||
\fBfsadm\fR(8).
|
||||
.TP
|
||||
.B \-\-use\-policies
|
||||
Resizes the logical volume according to configured policy. See
|
||||
\fBlvm.conf\fR(5) for some details.
|
||||
|
||||
.SH Examples
|
||||
Extends the size of the logical volume "vg01/lvol10" by 54MiB on physical
|
||||
volume /dev/sdk3. This is only possible if /dev/sdk3 is a member of
|
||||
volume group vg01 and there are enough free physical extents in it:
|
||||
.sp
|
||||
.B lvextend \-L +54 /dev/vg01/lvol10 /dev/sdk3
|
||||
|
||||
Extends the size of logical volume "vg01/lvol01" by the amount of free
|
||||
space on physical volume /dev/sdk3. This is equivalent to specifying
|
||||
"\-l +100%PVS" on the command line:
|
||||
.sp
|
||||
.B lvextend /dev/vg01/lvol01 /dev/sdk3
|
||||
|
||||
Extends a logical volume "vg01/lvol01" by 16MiB using physical extents
|
||||
/dev/sda:8\-9 and /dev/sdb:8\-9 for allocation of extents:
|
||||
.sp
|
||||
.B lvextend -L+16M vg01/lvol01 /dev/sda:8\-9 /dev/sdb:8\-9
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR fsadm (8),
|
||||
.BR lvm (8),
|
||||
.BR lvm.conf (5),
|
||||
.BR lvcreate (8),
|
||||
.BR lvconvert (8),
|
||||
.BR lvreduce (8),
|
||||
.BR lvresize (8),
|
||||
.BR lvchange (8)
|
1
man/lvm-config.8.in
Normal file
1
man/lvm-config.8.in
Normal file
@@ -0,0 +1 @@
|
||||
.so man8/lvmconfig.8
|
1
man/lvm-dumpconfig.8.in
Normal file
1
man/lvm-dumpconfig.8.in
Normal file
@@ -0,0 +1 @@
|
||||
.so man8/lvmconfig.8
|
145
man/lvm-fullreport.8.in
Normal file
145
man/lvm-fullreport.8.in
Normal file
@@ -0,0 +1,145 @@
|
||||
.TH LVM-FULLREPORT 8 "LVM TOOLS #VERSION#" "Red Hat, Inc" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvm fullreport \(em Report information about PVs, PV segments, VGs, LVs and LV segments, all at once for each VG.
|
||||
.SH SYNOPSIS
|
||||
.B lvm fullreport
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-nameprefixes ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-rows ]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-\-unquoted ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName
|
||||
.RI [ VolumeGroupName ...]]
|
||||
.SH DESCRIPTION
|
||||
lvm fullreport produces formatted output about PVs, PV segments, VGs, LVs
|
||||
and LV segments, all at once for each VG and guarded by per-VG lock
|
||||
for consistency.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-all
|
||||
Include information in the output about internal Logical Volumes that
|
||||
are components of normally-accessible Logical Volumes, such as mirrors,
|
||||
but which are not independently accessible (e.g. not mountable).
|
||||
The names of such Logical Volumes are enclosed within square brackets
|
||||
in the output. For example, after creating a mirror using
|
||||
.B lvcreate -m1 \-\-mirrorlog disk
|
||||
, this option will reveal three internal Logical
|
||||
Volumes, with suffixes mimage_0, mimage_1, and mlog.
|
||||
.TP
|
||||
.B \-\-aligned
|
||||
Use with \fB\-\-separator\fP to align the output columns.
|
||||
.TP
|
||||
.B \-\-binary
|
||||
Use binary values "0" or "1" instead of descriptive literal values
|
||||
for columns that have exactly two valid values to report (not counting
|
||||
the "unknown" value which denotes that the value could not be determined).
|
||||
.TP
|
||||
.B \-\-configreport \fI ReportName
|
||||
Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
|
||||
\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
|
||||
is 'pv' for PV subreport, 'pvseg' for PV segment subreport, 'vg' for
|
||||
VG subreport, 'lv' for LV subreport, 'seg' for LV segment subreport or 'log'
|
||||
for log report. If \fB\-\-configreport\fP option is not used to identify a
|
||||
report, then all command's subreports are assumed except log report. The log
|
||||
report is available only if enabled by \fBlog/report_command_log\fP
|
||||
\fBlvm.conf\fP(5) setting or if \fB\-\-logonly\fP option is used.
|
||||
.TP
|
||||
.B \-\-logonly
|
||||
Suppress the main report itself and display only log report on output.
|
||||
.TP
|
||||
.B \-\-nameprefixes
|
||||
Add an "LVM2_" prefix plus the field name to the output. Useful
|
||||
with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
|
||||
be used to set environment variables (for example, in \fBudev\fP(7) rules).
|
||||
.TP
|
||||
.B \-\-noheadings
|
||||
Suppress the headings line that is normally the first line of output.
|
||||
Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-nosuffix
|
||||
Suppress the suffix on output sizes. Use with \fB\-\-units\fP
|
||||
(except h and H) if processing the output.
|
||||
.TP
|
||||
.BR \-o ", " \-\-options
|
||||
Comma-separated ordered list of columns.
|
||||
.IP
|
||||
Precede the list with '\fI+\fP' to append to the current list
|
||||
of columns, '\fI-\fP' to remove from the current list of columns
|
||||
or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
|
||||
be repeated, providing several lists. These lists are evaluated
|
||||
from left to right.
|
||||
.IP
|
||||
For the list of columns, see \fBpvs\fP(8), \fBvgs\fP(8),
|
||||
\fBlvs\fP(8) man page or check \fBpvs\fP, \fBvgs\fP, \fBlvs -o help\fP
|
||||
output.
|
||||
.TP
|
||||
.BR \-O ", " \-\-sort
|
||||
Comma-separated ordered list of columns to sort by. Replaces the default
|
||||
selection. Precede any column with '\fI\-\fP' for a reverse sort on that
|
||||
column.
|
||||
.TP
|
||||
.B \-\-rows
|
||||
Output columns as rows.
|
||||
.TP
|
||||
.BR \-S ", " \-\-select " " \fISelection
|
||||
Display only rows that match Selection criteria. All rows are displayed with
|
||||
the additional "selected" column (\fB-o selected\fP) showing 1 if the row
|
||||
matches the Selection and 0 otherwise. The Selection criteria are defined
|
||||
by specifying column names and their valid values (that can include reserved
|
||||
values) while making use of supported comparison operators. See \fBlvm\fP(8)
|
||||
and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
|
||||
about constructing the Selection criteria. As a quick help and to see full
|
||||
list of column names that can be used in Selection including the list of
|
||||
reserved values and the set of supported selection operators, check the
|
||||
output of \fBpvs\fP, \fBvgs\fP, \fBlvs -S help\fP command.
|
||||
.TP
|
||||
.B \-\-separator \fISeparator
|
||||
String to use to separate each column. Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-unbuffered
|
||||
Produce output immediately without sorting or aligning the columns properly.
|
||||
.TP
|
||||
.B \-\-units \fIhHbBsSkKmMgGtTpPeE
|
||||
All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
|
||||
(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
|
||||
Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
|
||||
custom units e.g. \-\-units 3M
|
||||
.TP
|
||||
.B \-\-unquoted
|
||||
When used with \fB\-\-nameprefixes\fP, output values in the field=value
|
||||
pairs are not quoted.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvs (8),
|
||||
.BR vgs (8),
|
||||
.BR lvs (8)
|
89
man/lvm-lvpoll.8.in
Normal file
89
man/lvm-lvpoll.8.in
Normal file
@@ -0,0 +1,89 @@
|
||||
.TH "LVPOLL" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvpoll \(em Internal command used by lvmpolld to complete some Logical Volume operations.
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B lvm lvpoll
|
||||
.BR \-\-polloperation
|
||||
.RI { pvmove | convert | merge | merge_thin }
|
||||
.RB [ \-\-abort ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-handlemissingpvs ]
|
||||
.RB [ \-i | \-\-interval
|
||||
.IR Seconds ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.IR LogicalVolume [ Path ]
|
||||
.SH DESCRIPTION
|
||||
\fBlvpoll\fP is an internal command used by \fBlvmpolld\fP(8) to monitor and
|
||||
complete \fBlvconvert\fP(8) and \fBpvmove\fP(8) operations.
|
||||
\fBlvpoll\fP itself does not initiate these operations and
|
||||
you should never normally need to invoke it directly.
|
||||
|
||||
.I LogicalVolume
|
||||
The Logical Volume undergoing conversion or, in the case of pvmove, the name of
|
||||
the internal pvmove Logical Volume (see \fBEXAMPLES\fP).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-\-polloperation " {" \fIconvert | \fImerge | \fImerge_thin | \fIpvmove }
|
||||
Mandatory option.
|
||||
\fIpvmove\fP refers to a pvmove operation that is moving data.
|
||||
\fIconvert\fP refers to an operation that is increasing the number of redundant copies of data maintained by a mirror.
|
||||
\fImerge\fP indicates a merge operation that doesn't involve thin volumes.
|
||||
\fImerge_thin\fP indicates a merge operation involving thin snapshots.
|
||||
\fBpvmove\fP(8) and \fBlvconvert\fP(8) describe how to initiate these operations.
|
||||
.TP
|
||||
.B \-\-abort
|
||||
Abort pvmove in progress. See \fBpvmove\fP(8).
|
||||
.TP
|
||||
.B \-\-handlemissingpvs
|
||||
Used when the polling operation needs to handle missing PVs to be able to
|
||||
continue. This can happen when \fBlvconvert\fP(8) is repairing a mirror
|
||||
with one or more faulty devices.
|
||||
.TP
|
||||
.BR \-i ", " \-\-interval " "\fISeconds
|
||||
Report progress at regular intervals
|
||||
|
||||
.SH EXAMPLES
|
||||
Resume polling of a pvmove operation identified by the Logical Volume vg00/pvmove0:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation pvmove vg00/pvmove0
|
||||
.P
|
||||
Abort the same pvmove operation:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation pvmove --abort vg00/pvmove0
|
||||
.P
|
||||
To find out the name of the pvmove Logical Volume resulting from an original
|
||||
\fBpvmove /dev/sda1\fP command you may use the following \fBlvs\fP command.
|
||||
(Remove the parentheses from the LV name.)
|
||||
.sp
|
||||
.B lvs -a -S move_pv=/dev/sda1
|
||||
.P
|
||||
Resume polling of mirror conversion vg00/lvmirror:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation convert vg00/lvmirror
|
||||
.P
|
||||
Complete mirror repair:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation convert vg/damaged_mirror --handlemissingpvs
|
||||
.P
|
||||
Process snapshot merge:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation merge vg/snapshot_old
|
||||
.P
|
||||
Finish thin snapshot merge:
|
||||
.sp
|
||||
.B lvm lvpoll --polloperation merge_thin vg/thin_snapshot
|
||||
.SH SEE ALSO
|
||||
.BR lvconvert (8),
|
||||
.BR lvm (8),
|
||||
.BR lvmpolld (8),
|
||||
.BR lvs (8),
|
||||
.BR pvmove (8)
|
258
man/lvm.8.in
258
man/lvm.8.in
@@ -45,9 +45,6 @@ A file containing a simple script with one command per line
|
||||
can also be given on the command line. The script can also be
|
||||
executed directly if the first line is #! followed by the absolute
|
||||
path of \fBlvm\fP.
|
||||
.P
|
||||
Additional hyphens within option names are ignored. For example,
|
||||
\fB\-\-readonly\fP and \fB\-\-read\-only\fP are both accepted.
|
||||
.
|
||||
.SH BUILT-IN COMMANDS
|
||||
.
|
||||
@@ -241,6 +238,261 @@ The following commands are not implemented in LVM2 but might be
|
||||
in the future:
|
||||
.BR lvmsadc ", " lvmsar ", " pvdata .
|
||||
.
|
||||
.SH OPTIONS
|
||||
.
|
||||
The following options are available for many of the commands.
|
||||
They are implemented generically and documented here rather
|
||||
than repeated on individual manual pages.
|
||||
.P
|
||||
Additional hyphens within option names are ignored. For example,
|
||||
\fB\-\-readonly\fP and \fB\-\-read\-only\fP are both accepted.
|
||||
.
|
||||
.HP
|
||||
.BR \-h | \-? | \-\-help
|
||||
.br
|
||||
Display the help text.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-version
|
||||
.br
|
||||
Display version information.
|
||||
.
|
||||
.HP
|
||||
.BR \-v | \-\-verbose
|
||||
.br
|
||||
Set verbose level. Repeat from 1 to 3 times to increase the detail
|
||||
of messages sent to stdout and stderr. Overrides config file setting.
|
||||
.
|
||||
.HP
|
||||
.BR \-d | \-\-debug
|
||||
.br
|
||||
Set debug level. Repeat from 1 to 6 times to increase the detail of
|
||||
messages sent to the log file and/or syslog (if configured).
|
||||
Overrides config file setting.
|
||||
.
|
||||
.HP
|
||||
.BR \-q | \-\-quiet
|
||||
.br
|
||||
Suppress output and log messages.
|
||||
Overrides \fB\-d\fP and \fB\-v\fP.
|
||||
Repeat once to also suppress any prompts with answer 'no'.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-yes
|
||||
.br
|
||||
Don't prompt for confirmation interactively but instead always assume the
|
||||
answer is 'yes'. Take great care if you use this!
|
||||
.
|
||||
.HP
|
||||
.BR \-t | \-\-test
|
||||
.br
|
||||
Run in test mode. Commands will not update metadata.
|
||||
This is implemented by disabling all metadata writing but nevertheless
|
||||
returning success to the calling function. This may lead to unusual
|
||||
error messages in multi-stage operations if a tool relies on reading
|
||||
back metadata it believes has changed but hasn't.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-driverloaded
|
||||
.RB { y | n }
|
||||
.br
|
||||
Whether or not the device-mapper kernel driver is loaded.
|
||||
If you set this to \fBn\fP, no attempt will be made to contact the driver.
|
||||
.
|
||||
.HP
|
||||
.BR \-A | \-\-autobackup
|
||||
.RB { y | n }
|
||||
.br
|
||||
Whether or not to metadata should be backed up automatically after a change.
|
||||
You are strongly advised not to disable this!
|
||||
See \fBvgcfgbackup\fP(8).
|
||||
.
|
||||
.HP
|
||||
.BR \-P | \-\-partial
|
||||
.br
|
||||
When set, the tools will do their best to provide access to Volume Groups
|
||||
that are only partially available (one or more Physical Volumes belonging
|
||||
to the Volume Group are missing from the system). Where part of a logical
|
||||
volume is missing, \fI\%/dev/ioerror\fP will be substituted, and you could use
|
||||
\fBdmsetup\fP(8) to set this up to return I/O errors when accessed,
|
||||
or create it as a large block device of nulls. Metadata may not be
|
||||
changed with this option. To insert a replacement Physical Volume
|
||||
of the same or large size use \fBpvcreate \-u\fP to set the uuid to
|
||||
match the original followed by \fBvgcfgrestore\fP(8).
|
||||
.
|
||||
.HP
|
||||
.BR \-S | \-\-select
|
||||
.IR Selection
|
||||
.br
|
||||
For reporting commands, display only rows that match \fISelection\fP criteria.
|
||||
All rows are displayed with the additional "selected" column (\fB-o selected\fP)
|
||||
showing 1 if the row matches the \fISelection\fP and 0 otherwise. For non-reporting
|
||||
commands which process LVM entities, the selection can be used to match items
|
||||
to process. See \fBSelection\fP section in \fBlvmreport\fP(7) man page for more
|
||||
information about the way the selection criteria are constructed.
|
||||
.
|
||||
.HP
|
||||
.BR \-M | \-\-metadatatype
|
||||
.IR Type
|
||||
.br
|
||||
Specifies which \fItype\fP of on-disk metadata to use, such as \fBlvm1\fP
|
||||
or \fBlvm2\fP, which can be abbreviated to \fB1\fP or \fB2\fP respectively.
|
||||
The default (\fBlvm2\fP) can be changed by setting \fBformat\fP
|
||||
in the \fBglobal\fP section of the config file \fBlvm.conf\fP(5).
|
||||
.
|
||||
.HP
|
||||
.BR \-\-ignorelockingfailure
|
||||
.br
|
||||
This lets you proceed with read-only metadata operations such as
|
||||
\fBlvchange \-ay\fP and \fBvgchange \-ay\fP even if the locking module fails.
|
||||
One use for this is in a system init script if the lock directory
|
||||
is mounted read-only when the script runs.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-ignoreskippedcluster
|
||||
.br
|
||||
Use to avoid exiting with an non-zero status code if the command is run
|
||||
without clustered locking and some clustered Volume Groups have to be
|
||||
skipped over.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-readonly
|
||||
.br
|
||||
Run the command in a special read-only mode which will read on-disk
|
||||
metadata without needing to take any locks. This can be used to peek
|
||||
inside metadata used by a virtual machine image while the virtual
|
||||
machine is running.
|
||||
It can also be used to peek inside the metadata of clustered Volume
|
||||
Groups when clustered locking is not configured or running. No attempt
|
||||
will be made to communicate with the device-mapper kernel driver, so
|
||||
this option is unable to report whether or not Logical Volumes are
|
||||
actually in use.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-foreign
|
||||
.br
|
||||
Cause the command to access foreign VGs, that would otherwise be skipped.
|
||||
It can be used to report or display a VG that is owned by another host.
|
||||
This option can cause a command to perform poorly because lvmetad caching
|
||||
is not used and metadata is read from disks.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-shared
|
||||
.br
|
||||
Cause the command to access shared VGs, that would otherwise be skipped
|
||||
when lvmlockd is not being used. It can be used to report or display a
|
||||
lockd VG without locking. Applicable only if LVM is compiled with lockd
|
||||
support.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-addtag
|
||||
.IR Tag
|
||||
.br
|
||||
Add the tag \fITag\fP to a PV, VG or LV.
|
||||
Supply this argument multiple times to add more than one tag at once.
|
||||
A tag is a word that can be used to group LVM2 objects of the same type
|
||||
together.
|
||||
Tags can be given on the command line in place of PV, VG or LV
|
||||
arguments. Tags should be prefixed with @ to avoid ambiguity.
|
||||
Each tag is expanded by replacing it with all objects possessing
|
||||
that tag which are of the type expected by its position on the command line.
|
||||
PVs can only possess tags while they are part of a Volume Group:
|
||||
PV tags are discarded if the PV is removed from the VG.
|
||||
As an example, you could tag some LVs as \fBdatabase\fP and others
|
||||
as \fBuserdata\fP and then activate the database ones
|
||||
with \fBlvchange \-ay @database\fP.
|
||||
Objects can possess multiple tags simultaneously.
|
||||
Only the new LVM2 metadata format supports tagging: objects using the
|
||||
LVM1 metadata format cannot be tagged because the on-disk format does not
|
||||
support it.
|
||||
Characters allowed in tags are:
|
||||
.BR A - Z
|
||||
.BR a - z
|
||||
.BR 0 - 9
|
||||
.BR "_ + . -"
|
||||
and as of version 2.02.78 the following characters are also accepted:
|
||||
.BR "/ = ! : # &" .
|
||||
.
|
||||
.HP
|
||||
.BR \-\-deltag
|
||||
.IR Tag
|
||||
.br
|
||||
Delete the tag \fITag\fP from a PV, VG or LV, if it's present.
|
||||
Supply this argument multiple times to remove more than one tag at once.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-alloc
|
||||
.RB { anywhere | contiguous | cling | inherit | normal }
|
||||
.br
|
||||
Selects the allocation policy when a command needs to allocate
|
||||
Physical Extents from the Volume Group.
|
||||
Each Volume Group and Logical Volume has an allocation policy defined.
|
||||
The default for a Volume Group is \fBnormal\fP which applies
|
||||
common-sense rules such as not placing parallel stripes on the same
|
||||
Physical Volume. The default for a Logical Volume is \fBinherit\fP
|
||||
which applies the same policy as for the Volume Group. These policies can
|
||||
be changed using \fBlvchange\fP(8) and \fBvgchange\fP(8) or overridden
|
||||
on the command line of any command that performs allocation.
|
||||
The \fBcontiguous\fP policy requires that new Physical Extents be placed adjacent
|
||||
to existing Physical Extents.
|
||||
The \fBcling\fP policy places new Physical Extents on the same Physical
|
||||
Volume as existing Physical Extents in the same stripe of the Logical Volume.
|
||||
If there are sufficient free Physical Extents to satisfy
|
||||
an allocation request but \fBnormal\fP doesn't use them,
|
||||
\fBanywhere\fP will - even if that reduces performance by
|
||||
placing two stripes on the same Physical Volume.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-commandprofile
|
||||
.IR ProfileName
|
||||
.br
|
||||
Selects the command configuration profile to use when processing an LVM command.
|
||||
See also \fBlvm.conf\fP(5) for more information about \fBcommand profile config\fP and
|
||||
the way it fits with other LVM configuration methods. Using \fB\-\-commandprofile\fP
|
||||
option overrides any command profile specified via \fBLVM_COMMAND_PROFILE\fP
|
||||
environment variable.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-metadataprofile
|
||||
.IR ProfileName
|
||||
.br
|
||||
Selects the metadata configuration profile to use when processing an LVM command.
|
||||
When using metadata profile during Volume Group or Logical Volume creation,
|
||||
the metadata profile name is saved in metadata. When such Volume Group or Logical
|
||||
Volume is processed next time, the metadata profile is automatically applied
|
||||
and the use of \fB\-\-metadataprofile\fP option is not necessary. See also
|
||||
\fBlvm.conf\fP(5) for more information about \fBmetadata profile config\fP and the
|
||||
way it fits with other LVM configuration methods.
|
||||
.
|
||||
.HP
|
||||
.BR \-\-profile
|
||||
.IR ProfileName
|
||||
.br
|
||||
A short form of \fB\-\-metadataprofile\fP for \fBvgcreate\fP, \fBlvcreate\fP,
|
||||
\fBvgchange\fP and \fBlvchange\fP command and a short form of \fB\-\-commandprofile\fP
|
||||
for any other command (with the exception of \fBlvmconfig\fP command where the
|
||||
\fB\-\-profile\fP has special meaning, see \fBlvmconfig\fP(8) for more information).
|
||||
.
|
||||
.HP
|
||||
.BR \-\-reportformat
|
||||
.IR {basic|json}
|
||||
.br
|
||||
Overrides current output format for reports which is defined globally by
|
||||
\fBreport/output_format\fP configuration setting in \fBlvm.conf\fP(5).
|
||||
The \fBbasic\fP format is the original format with columns and rows and
|
||||
if there is more than one report per command, each report is prefixed
|
||||
with report's name for identification. The \fBjson\fP stands for report
|
||||
output in JSON format.
|
||||
.HP
|
||||
.BR \-\-config
|
||||
.IR ConfigurationString
|
||||
.br
|
||||
Uses the ConfigurationString as direct string representation of the configuration
|
||||
to override the existing configuration. The ConfigurationString is of exactly
|
||||
the same format as used in any LVM configuration file. See \fBlvm.conf\fP(5)
|
||||
for more information about \fBdirect config override on command line\fP and the
|
||||
way it fits with other LVM configuration methods.
|
||||
.
|
||||
.SH VALID NAMES
|
||||
.
|
||||
The valid characters for VG and LV names are:
|
||||
|
10
man/lvmchange.8.in
Normal file
10
man/lvmchange.8.in
Normal file
@@ -0,0 +1,10 @@
|
||||
.TH LVMCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvmchange \(em change attributes of the logical volume manager
|
||||
.SH SYNOPSIS
|
||||
.B lvmchange
|
||||
.SH DESCRIPTION
|
||||
lvmchange is not currently supported under LVM2, although
|
||||
\fBdmsetup\fP(8) has a \fBremove_all\fP command.
|
||||
.SH SEE ALSO
|
||||
.BR dmsetup (8)
|
225
man/lvmconfig.8.in
Normal file
225
man/lvmconfig.8.in
Normal file
@@ -0,0 +1,225 @@
|
||||
.TH "LVMCONFIG" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
||||
.SH "NAME"
|
||||
lvmconfig, lvm dumpconfig, lvm config \(em Display LVM configuration
|
||||
.SH SYNOPSIS
|
||||
.
|
||||
.ad l
|
||||
.B lvmconfig
|
||||
.RB [ \-f | \-\-file
|
||||
.IR Filename ]
|
||||
.RB [ \-\-type
|
||||
.RB { current | default | diff | full |\: list | missing | new \c
|
||||
.RB | profilable | profilable-command | profilable-metadata }]
|
||||
.RB [ \-\-atversion
|
||||
.IR Version ]
|
||||
.RB [ \-\-sinceversion
|
||||
.IR Version ]
|
||||
.RB [ \-\-ignoreadvanced ]
|
||||
.RB [ \-\-ignoreunsupported ]
|
||||
.RB [ \-\-ignorelocal ]
|
||||
.RB [ \-l | \-\-list ]
|
||||
.RB [ \-\-config
|
||||
.IR ConfigurationString ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\-profile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\-metadataprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\-mergedconfig ]
|
||||
.RB [ \-\-showdeprecated ]
|
||||
.RB [ \-\-showunsupported ]
|
||||
.RB [ \-\-validate ]
|
||||
.RB [ \-\-withsummary ]
|
||||
.RB [ \-\-withcomments ]
|
||||
.RB [ \-\-withspaces ]
|
||||
.RB [ \-\-withversions ]
|
||||
.RB [ ConfigurationNode... ]
|
||||
.ad b
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
lvmconfig produces formatted output from the LVM configuration tree.
|
||||
The command was added in release 2.02.119 and has an identical longer form
|
||||
\fBlvm dumpconfig\fP.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BR \-f ", " \-\-file " \fIFilename"
|
||||
Send output to a file named 'filename'.
|
||||
|
||||
.TP
|
||||
.BR \-l ", " \-\-list
|
||||
List configuration settings with summarizing comment. This is the same as using
|
||||
\fBlvmconfig --type list --withsummary\fP.
|
||||
|
||||
.TP
|
||||
.BR \-\-type " {" current | default | diff | full | missing | new | profilable |\: profilable-command | profilable-metadata }
|
||||
Select the type of configuration to display. The configuration settings
|
||||
displayed have either default values or currently-used values assigned based on
|
||||
the type selected. If no type is selected, \fB\-\-type current\fP is used
|
||||
by default. Whenever a configuration setting with a default value is
|
||||
commented out, it means the setting does not have any concrete default
|
||||
value defined. Output can be saved and used as a proper \fBlvm.conf\fP(5)
|
||||
file.
|
||||
.RS
|
||||
.IP \fBcurrent\fP 3
|
||||
Display the current \fBlvm.conf\fP configuration merged with any \fBtag
|
||||
config\fP if used. See also \fBlvm.conf\fP(5) for more info about LVM
|
||||
configuration methods.
|
||||
.IP \fBdefault\fP 3
|
||||
Display all possible configuration settings with default values assigned.
|
||||
.IP \fBdiff\fP 3
|
||||
Display all configuration settings for which the values used differ from defaults.
|
||||
The value assigned for each configuration setting is the value currently used.
|
||||
Using this type also implies the use of \fB\-\-mergedconfig\fP option.
|
||||
This is actually minimal LVM configuration which can be used without
|
||||
a change to current configured behaviour.
|
||||
.IP \fBfull\fP 3
|
||||
Display full configuration tree - a combination of current configuration tree
|
||||
(\fB\-\-type current\fP) and tree of settings for which default values are
|
||||
used (\fB\-\-type missing\fP). This is exactly the configuration tree that
|
||||
LVM2 uses during command execution. Using this type also implies
|
||||
the use of \fB\-\-mergedconfig\fP option. If comments are displayed
|
||||
(see \fB\-\-withcomments\fP and \fB\-\-withsummary\fP options), then
|
||||
for each setting found in existing configuration and for which defaults
|
||||
are not used, there's an extra comment line printed to denote this.
|
||||
.IP \fBlist\fP 3
|
||||
Display plain list of configuration settings.
|
||||
.IP \fBmissing\fP 3
|
||||
Display all configuration settings with default values assigned which are
|
||||
missing in the configuration currently used and for which LVM automatically
|
||||
fallbacks to using these default values.
|
||||
.IP \fBnew\fP 3
|
||||
Display all new configuration settings introduced in current LVM version
|
||||
or specific version as defined by \fB\-\-atversion\fP option.
|
||||
.IP \fBprofilable\fP 3
|
||||
Display all profilable configuration settings with default values assigned.
|
||||
See \fBlvm.conf\fP(5) for more info about \fBprofile config\fP method.
|
||||
.IP \fBprofilable-command\fP 3
|
||||
Display all profilable configuration settings with default values assigned
|
||||
that can be used in command profile. This is a subset of settings displayed
|
||||
by \fB\-\-type profilable\fP.
|
||||
.IP \fBprofilable-metadata\fP 3
|
||||
Display all profilable configuration settings with default values assigned
|
||||
that can be used in metadata profile. This is a subset of settings displayed
|
||||
by \fB\-\-type profilable\fP.
|
||||
.RE
|
||||
|
||||
.TP
|
||||
.BI \-\-atversion " Version"
|
||||
Specify an LVM version in x.y.z format where x is the major version,
|
||||
the y is the minor version and z is the patchlevel (e.g. 2.2.106).
|
||||
When configuration is displayed, the configuration settings recognized
|
||||
at this LVM version will be considered only. This can be used
|
||||
to display a configuration that a certain LVM version understands and
|
||||
which does not contain any newer settings for which LVM would
|
||||
issue a warning message when checking the configuration.
|
||||
|
||||
.TP
|
||||
.BI \-\-sinceversion " Version"
|
||||
Specify an LVM version in x.y.z format where x is the major version,
|
||||
the y is the minor version and z is the patchlevel (e.g. 2.2.106).
|
||||
This option is currently applicable only with \fB\-\-type new\fP
|
||||
to display all configuration settings introduced since given version.
|
||||
|
||||
.TP
|
||||
.B \-\-ignoreadvanced
|
||||
Exclude advanced configuration settings from the output.
|
||||
|
||||
.TP
|
||||
.B \-\-ignoreunsupported
|
||||
Exclude unsupported configuration settings from the output. These settings are
|
||||
either used for debugging and development purposes only or their support is not
|
||||
yet complete and they are not meant to be used in production. The \fBcurrent\fP
|
||||
and \fBdiff\fP types include unsupported settings in their output by default,
|
||||
all the other types ignore unsupported settings.
|
||||
|
||||
.TP
|
||||
.B \-\-ignorelocal
|
||||
Ignore local section.
|
||||
|
||||
.TP
|
||||
.BI \-\-config " ConfigurationString"
|
||||
Use \fIConfigurationString\fP to override existing configuration.
|
||||
This configuration is then applied for the lvmconfig command itself.
|
||||
See also \fBlvm.conf\fP(5) for more info about \fBconfig cascade\fP.
|
||||
|
||||
.TP
|
||||
.BI \-\-commandprofile " ProfileName"
|
||||
Use \fIProfileName\fP to override existing configuration.
|
||||
This configuration is then applied for the lvmconfig command itself.
|
||||
See also \fB\-\-mergedconfig\fP option and \fBlvm.conf\fP(5) for
|
||||
more info about \fBconfig cascade\fP.
|
||||
|
||||
.TP
|
||||
.BI \-\-profile " ProfileName"
|
||||
The same as using \fB\-\-commandprofile\fP but the configuration is not
|
||||
applied for the lvmconfig command itself.
|
||||
|
||||
.TP
|
||||
.BI \-\-metadataprofile " ProfileName"
|
||||
Use \fIProfileName\fP to override existing configuration.
|
||||
The configuration defined in metadata profile has no effect for
|
||||
the lvmconfig command itself. lvmconfig displays the configuration only.
|
||||
See also \fB\-\-mergedconfig\fP option and \fBlvm.conf\fP(5) for more
|
||||
info about \fBconfig cascade\fP.
|
||||
|
||||
.TP
|
||||
.B \-\-mergedconfig
|
||||
When the lvmconfig command is run with the \fB\-\-config\fP option
|
||||
and/or \fB\-\-commandprofile\fP (or using \fBLVM_COMMAND_PROFILE\fP
|
||||
environment variable), \fB\-\-profile\fP, \fB\-\-metadataprofile\fP
|
||||
option, merge all the contents of the \fBconfig cascade\fP before displaying it.
|
||||
Without the \fB\-\-mergeconfig\fP option used, only the configuration at
|
||||
the front of the cascade is displayed. See also \fBlvm.conf\fP(5) for more
|
||||
info about \fBconfig cascade\fP.
|
||||
|
||||
.TP
|
||||
.B \-\-showdeprecated
|
||||
Include deprecated configuration settings in the output. These settings
|
||||
are always deprecated since certain version. If concrete version is specified
|
||||
with \fB--atversion\fP option, deprecated settings are automatically included
|
||||
if specified version is lower that the version in which the settings were
|
||||
deprecated. The \fBcurrent\fP and \fBdiff\fP types include deprecated settings
|
||||
int their output by default, all the other types ignore deprecated settings.
|
||||
|
||||
.TP
|
||||
.B \-\-showunsupported
|
||||
Include unsupported configuration settings in the output. These settings
|
||||
are either used for debugging or development purposes only or their support
|
||||
is not yet complete and they are not meant to be used in production. The
|
||||
\fBcurrent\fP and \fBdiff\fP types include unsupported settings in their
|
||||
output by default, all the other types ignore unsupported settings.
|
||||
|
||||
.TP
|
||||
.B \-\-validate
|
||||
Validate current configuration used and exit with appropriate
|
||||
return code. The validation is done only for the configuration
|
||||
at the front of the \fBconfig cascade\fP. To validate the whole
|
||||
merged configuration tree, use also the \fB\-\-mergedconfig\fP option.
|
||||
The validation is done even if \fBconfig/checks\fP \fBlvm.conf\fP(5)
|
||||
option is disabled.
|
||||
|
||||
.TP
|
||||
.B \-\-withsummary
|
||||
Display a one line comment for each configuration node.
|
||||
|
||||
.TP
|
||||
.B \-\-withcomments
|
||||
Display a full comment for each configuration node. For deprecated
|
||||
settings, also display comments about deprecation in addition.
|
||||
|
||||
.TP
|
||||
.B \-\-withspaces
|
||||
Where appropriate, add more spaces in output for better readability.
|
||||
|
||||
.TP
|
||||
.B \-\-withversions
|
||||
Also display a comment containing the version of introduction for
|
||||
each configuration node. If the setting is deprecated, also display
|
||||
the version since which it is deprecated.
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8)
|
||||
.BR lvmconf (8)
|
||||
.BR lvm.conf (5)
|
27
man/lvmdiskscan.8.in
Normal file
27
man/lvmdiskscan.8.in
Normal file
@@ -0,0 +1,27 @@
|
||||
.TH LVMDISKSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvmdiskscan \(em scan for all devices visible to LVM2
|
||||
.SH SYNOPSIS
|
||||
.B lvmdiskscan
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-l | \-\-lvmpartition ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.SH DESCRIPTION
|
||||
lvmdiskscan scans all SCSI, (E)IDE disks, multiple devices and a bunch
|
||||
of other block devices in the system looking for LVM physical volumes.
|
||||
The size reported is the real device size.
|
||||
Define a filter in \fBlvm.conf\fP(5) to restrict
|
||||
the scan to avoid a CD ROM, for example.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-l ", " \-\-lvmpartition
|
||||
Only reports Physical Volumes.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvm.conf (5),
|
||||
.BR pvscan (8),
|
||||
.BR vgscan (8)
|
@@ -573,37 +573,25 @@ To place the lvmlock LV on a specific device, create the VG with only that
|
||||
device, then use vgextend to add other devices.
|
||||
|
||||
|
||||
.SS LV activation
|
||||
.SS shared LVs
|
||||
|
||||
In a shared VG, activation changes involve locking through lvmlockd, and
|
||||
the following values are possible with lvchange/vgchange -a:
|
||||
When an LV is used concurrently from multiple hosts (e.g. by a
|
||||
multi\-host/cluster application or file system), the LV can be activated
|
||||
on multiple hosts concurrently using a shared lock.
|
||||
|
||||
.IP \fBy\fP|\fBey\fP
|
||||
The command activates the LV in exclusive mode, allowing a single host
|
||||
to activate the LV. Before activating the LV, the command uses lvmlockd
|
||||
to acquire an exclusive lock on the LV. If the lock cannot be acquired,
|
||||
the LV is not activated and an error is reported. This would happen if
|
||||
the LV is active on another host.
|
||||
To activate the LV with a shared lock: lvchange \-asy vg/lv.
|
||||
|
||||
.IP \fBsy\fP
|
||||
The command activates the LV in shared mode, allowing multiple hosts to
|
||||
activate the LV concurrently. Before activating the LV, the
|
||||
command uses lvmlockd to acquire a shared lock on the LV. If the lock
|
||||
cannot be acquired, the LV is not activated and an error is reported.
|
||||
This would happen if the LV is active exclusively on another host. If the
|
||||
LV type prohibits shared access, such as a snapshot, the command will
|
||||
report an error and fail.
|
||||
The shared mode is intended for a multi\-host/cluster application or
|
||||
file system.
|
||||
LV types that cannot be used concurrently
|
||||
With lvmlockd, an unspecified activation mode is always exclusive, i.e.
|
||||
\-ay defaults to \-aey.
|
||||
|
||||
If the LV type does not allow the LV to be used concurrently from multiple
|
||||
hosts, then a shared activation lock is not allowed and the lvchange
|
||||
command will report an error. LV types that cannot be used concurrently
|
||||
from multiple hosts include thin, cache, raid, mirror, and snapshot.
|
||||
|
||||
lvextend on LV with shared locks is not yet allowed. The LV must be
|
||||
deactivated, or activated exclusively to run lvextend.
|
||||
|
||||
.IP \fBn\fP
|
||||
The command deactivates the LV. After deactivating the LV, the command
|
||||
uses lvmlockd to release the current lock on the LV.
|
||||
|
||||
|
||||
.SS recover from lost PV holding sanlock locks
|
||||
|
||||
|
13
man/lvmsadc.8.in
Normal file
13
man/lvmsadc.8.in
Normal file
@@ -0,0 +1,13 @@
|
||||
.TH "LVMSADC" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
||||
|
||||
.SH "NAME"
|
||||
lvmsadc \(em LVM system activity data collector
|
||||
|
||||
.SH "SYNOPSIS"
|
||||
.B lvmsadc
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
lvmsadc is not currently supported under LVM2.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR lvm (8)
|
13
man/lvmsar.8.in
Normal file
13
man/lvmsar.8.in
Normal file
@@ -0,0 +1,13 @@
|
||||
.TH "LVMSAR" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
||||
|
||||
.SH "NAME"
|
||||
lvmsar \(em LVM system activity reporter
|
||||
|
||||
.SH "SYNOPSIS"
|
||||
.B lvmsar
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
lvmsar is not currently supported under LVM2.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR lvm (8)
|
@@ -157,17 +157,17 @@ The --thinpool argument specifies which thin pool will
|
||||
contain the ThinLV.
|
||||
.fi
|
||||
|
||||
.B lvcreate \-n ThinLV \-V VirtualSize \-\-thinpool ThinPoolLV VG
|
||||
.B lvcreate \-n ThinLV \-V VirtualSize \-\-thinpool VG/ThinPoolLV
|
||||
|
||||
.I Example
|
||||
.br
|
||||
Create a thin LV in a thin pool:
|
||||
.br
|
||||
# lvcreate \-n thin1 \-V 1T \-\-thinpool pool0 vg
|
||||
# lvcreate \-n thin1 \-V 1T \-\-thinpool vg/pool0
|
||||
|
||||
Create another thin LV in the same thin pool:
|
||||
.br
|
||||
# lvcreate \-n thin2 \-V 1T \-\-thinpool pool0 vg
|
||||
# lvcreate \-n thin2 \-V 1T \-\-thinpool vg/pool0
|
||||
|
||||
# lvs vg/thin1 vg/thin2
|
||||
LV VG Attr LSize Pool Origin Data%
|
||||
@@ -184,9 +184,9 @@ when creating a thin snapshot.
|
||||
.br
|
||||
A size argument will cause an old COW snapshot to be created.
|
||||
|
||||
.B lvcreate \-n SnapLV \-\-snapshot VG/ThinLV
|
||||
.B lvcreate \-n SnapLV \-s VG/ThinLV
|
||||
.br
|
||||
.B lvcreate \-n SnapLV \-\-snapshot VG/PrevSnapLV
|
||||
.B lvcreate \-n SnapLV \-s VG/PrevSnapLV
|
||||
|
||||
.I Example
|
||||
.br
|
||||
@@ -286,12 +286,15 @@ The fully specified syntax for creating a thin pool LV shown above is:
|
||||
|
||||
.B lvconvert \-\-type thin-pool \-\-poolmetadata VG/ThinMetaLV VG/ThinDataLV
|
||||
|
||||
An alternate syntax may be used for the same operation:
|
||||
An existing LV is converted to a thin pool by changing its type to
|
||||
thin-pool. An alternate syntax may be used for the same operation:
|
||||
|
||||
.B lvconvert \-\-thinpool VG/ThinDataLV \-\-poolmetadata VG/ThinMetaLV
|
||||
|
||||
The thin-pool type is inferred by lvm; the \-\-thinpool option is not an
|
||||
alias for \-\-type thin\-pool.
|
||||
The thin-pool type is inferred by lvm; the --thinpool option is not an
|
||||
alias for --type thin-pool. The use of the --thinpool option here is
|
||||
different from the use of the --thinpool option when creating a thin LV,
|
||||
where it specifies the pool in which the thin LV is created.
|
||||
|
||||
|
||||
.SS Automatic pool metadata LV
|
||||
@@ -1231,7 +1234,7 @@ and creates a thin LV in the new pool.
|
||||
.br
|
||||
\-V VirtualSize specifies the virtual size of the thin LV.
|
||||
|
||||
.B lvcreate \-\-type thin \-V VirtualSize \-L LargeSize
|
||||
.B lvcreate \-V VirtualSize \-L LargeSize
|
||||
.RS
|
||||
.B \-n ThinLV \-\-thinpool VG/ThinPoolLV
|
||||
.RE
|
||||
|
110
man/lvreduce.8.in
Normal file
110
man/lvreduce.8.in
Normal file
@@ -0,0 +1,110 @@
|
||||
.TH LVREDUCE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvreduce \(em reduce the size of a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvreduce
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB { \-l | \-\-extents
|
||||
.RI [ \- ] LogicalExtentsNumber [ % { VG | LV | FREE | ORIGIN }]
|
||||
.RB |
|
||||
.BR \-L | \-\-size
|
||||
.RI [ \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
|
||||
.RB [ \-n | \-\-nofsck ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-r | \-\-resizefs ]
|
||||
.IR LogicalVolume { Name | Path }
|
||||
.SH DESCRIPTION
|
||||
lvreduce allows you to reduce the size of a logical volume.
|
||||
Be careful when reducing a logical volume's size, because data in the
|
||||
reduced part is lost!!!
|
||||
.br
|
||||
You should therefore ensure that any filesystem on the volume is
|
||||
resized
|
||||
.I before
|
||||
running lvreduce so that the extents that are to be removed are not in use.
|
||||
.br
|
||||
Shrinking snapshot logical volumes (see
|
||||
.BR lvcreate (8)
|
||||
for information to create snapshots) is supported as well.
|
||||
But to change the number of copies in a mirrored logical
|
||||
volume use
|
||||
.BR lvconvert (8).
|
||||
.br
|
||||
Sizes will be rounded if necessary - for example, the volume size must
|
||||
be an exact number of extents and the size of a striped segment must
|
||||
be a multiple of the number of stripes.
|
||||
.br
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Force size reduction without prompting even when it may cause data loss.
|
||||
.TP
|
||||
.IR \fB\-l ", " \fB\-\-extents " [" \- ] LogicalExtentsNumber [ % { VG | LV | FREE | ORIGIN }]
|
||||
Reduce or set the logical volume size in units of logical extents.
|
||||
With the \fI-\fP sign the value will be subtracted from
|
||||
the logical volume's actual size and without it the value will be taken
|
||||
as an absolute size.
|
||||
The total number of physical extents freed will be greater than this logical
|
||||
value if, for example, the volume is mirrored.
|
||||
The number can also be expressed as a percentage of the total space
|
||||
in the Volume Group with the suffix \fI%VG\fP, relative to the existing
|
||||
size of the Logical Volume with the suffix \fI%LV\fP, as a percentage of the
|
||||
remaining free space in the Volume Group with the suffix \fI%FREE\fP, or (for
|
||||
a snapshot) as a percentage of the total space in the Origin Logical
|
||||
Volume with the suffix \fI%ORIGIN\fP.
|
||||
The resulting value for the subtraction is rounded downward, for the absolute
|
||||
size it is rounded upward.
|
||||
N.B. In a future release, when expressed as a percentage with VG or FREE, the
|
||||
number will be treated as an approximate total number of physical extents to be
|
||||
freed (including extents used by any mirrors, for example). The code may
|
||||
currently release more space than you might otherwise expect.
|
||||
.TP
|
||||
.IR \fB\-L ", " \fB\-\-size " [" \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
|
||||
Reduce or set the logical volume size in units of megabytes.
|
||||
A size suffix of \fIk\fP for kilobyte, \fIm\fP for megabyte,
|
||||
\fIg\fP for gigabytes, \fIt\fP for terabytes, \fIp\fP for petabytes
|
||||
or \fIe\fP for exabytes is optional.
|
||||
With the \fI\-\fP sign the value will be subtracted from
|
||||
the logical volume's actual size and without it it will be taken as
|
||||
an absolute size.
|
||||
.TP
|
||||
.BR \-n ", " \-\-nofsck
|
||||
Do not perform fsck before resizing filesystem when filesystem
|
||||
requires it. You may need to use \fB\-\-force\fR to proceed with
|
||||
this option.
|
||||
.TP
|
||||
.BR \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.TP
|
||||
.BR \-r ", " \-\-resizefs
|
||||
Resize underlying filesystem together with the logical volume using
|
||||
.BR fsadm (8).
|
||||
.SH Examples
|
||||
Reduce the size of logical volume lvol1 in volume group vg00 by 3 logical extents:
|
||||
.sp
|
||||
.B lvreduce \-l \-3 vg00/lvol1
|
||||
.SH SEE ALSO
|
||||
.BR fsadm (8),
|
||||
.BR lvchange (8),
|
||||
.BR lvconvert (8),
|
||||
.BR lvcreate (8),
|
||||
.BR lvextend (8),
|
||||
.BR lvm (8),
|
||||
.BR lvresize (8),
|
||||
.BR vgreduce (8)
|
80
man/lvremove.8.in
Normal file
80
man/lvremove.8.in
Normal file
@@ -0,0 +1,80 @@
|
||||
.TH LVREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvremove \(em remove a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvremove
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-nohistory ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RI [ LogicalVolume { Name | Path }...]
|
||||
.SH DESCRIPTION
|
||||
lvremove removes one or more logical volumes.
|
||||
Confirmation will be requested before deactivating any active logical
|
||||
volume prior to removal. Logical volumes cannot be deactivated
|
||||
or removed while they are open (e.g. if they contain a mounted filesystem).
|
||||
Removing an origin logical volume will also remove all dependent snapshots.
|
||||
.sp
|
||||
If the logical volume is clustered then it must be deactivated on all
|
||||
nodes in the cluster before it can be removed. A single lvchange command
|
||||
issued from one node can do this.
|
||||
.sp
|
||||
If the configuration setting \fBmetadata/record_lvs_history\fP is enabled
|
||||
and the logical volume being removed forms part of the history of at least
|
||||
one logical volume that is still present then a simplified representation of
|
||||
the logical volume will be retained. This includes the time of removal
|
||||
(\fBlv_time_removed\fP reporting field), creation time (\fBlv_time\fP), name
|
||||
(\fBlv_name\fP), LV uuid (\fBlv_uuid\fP) and VG name (\fBvg_name\fP) and
|
||||
allows you to see the ancestry chain of thin snapshot volumes even after
|
||||
some intermediate logical volumes have been removed.
|
||||
The names of such historical logical volumes acquire a hyphen as a prefix
|
||||
(e.g. '-lvol1') and cannot be reactivated. Use lvremove a second time,
|
||||
with the hyphen, to remove the record of the former logical volume completely.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Remove active logical volumes without confirmation.
|
||||
Tool will try to deactivate \fIunused\fP volume.
|
||||
To proceed with damaged pools use \-ff
|
||||
.TP
|
||||
.B \-\-nohistory
|
||||
Disable the recording of history of logical volumes which are being removed.
|
||||
(This has no effect unless the configuration setting
|
||||
\fBmetadata/record_lvs_history\fP is enabled.)
|
||||
.TP
|
||||
.B \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.SH Examples
|
||||
Remove the active logical volume lvol1 in volume group vg00
|
||||
without asking for confirmation:
|
||||
.sp
|
||||
.B lvremove \-f vg00/lvol1
|
||||
.sp
|
||||
Remove all logical volumes in volume group vg00:
|
||||
.sp
|
||||
.B lvremove vg00
|
||||
.SH SEE ALSO
|
||||
.BR lvcreate (8),
|
||||
.BR lvdisplay (8),
|
||||
.BR lvchange (8),
|
||||
.BR lvm (8),
|
||||
.BR lvs (8),
|
||||
.BR lvscan (8),
|
||||
.BR vgremove (8)
|
51
man/lvrename.8.in
Normal file
51
man/lvrename.8.in
Normal file
@@ -0,0 +1,51 @@
|
||||
.TH LVRENAME 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvrename \(em rename a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvrename
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RI { OldLogicalVolume { Name | Path }
|
||||
.IR NewLogicalVolume { Name | Path }
|
||||
|
|
||||
.I VolumeGroupName OldLogicalVolumeName NewLogicalVolumeName\fR}
|
||||
.SH DESCRIPTION
|
||||
lvrename renames an existing logical volume or an existing
|
||||
historical logical volume from
|
||||
.IR OldLogicalVolume { Name | Path }
|
||||
to
|
||||
.IR NewLogicalVolume { Name | Path }.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.SH EXAMPLE
|
||||
To rename lvold in volume group vg02 to lvnew:
|
||||
.sp
|
||||
.B lvrename /dev/vg02/lvold vg02/lvnew
|
||||
.sp
|
||||
An alternate syntax to rename this logical volume is:
|
||||
.sp
|
||||
.B lvrename vg02 lvold lvnew
|
||||
.sp
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvchange (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgrename (8)
|
124
man/lvresize.8.in
Normal file
124
man/lvresize.8.in
Normal file
@@ -0,0 +1,124 @@
|
||||
.TH LVRESIZE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvresize \(em resize a logical volume
|
||||
.SH SYNOPSIS
|
||||
.B lvresize
|
||||
.RB [ \-\-alloc " " \fIAllocationPolicy ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-i | \-\-stripes " " \fIStripes
|
||||
.RB [ \-I | \-\-stripesize " " \fIStripeSize ]]
|
||||
.RB { \-l | \-\-extents
|
||||
.RI [ + | \- ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN "}] |"
|
||||
.BR \-L | \-\-size
|
||||
.RI [ + | \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
|
||||
.RB [ \-\-poolmetadatasize
|
||||
.RI [ + ] MetadataVolumeSize [ bBsSkKmMgG ]]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-n | \-\-nofsck ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-r | \-\-resizefs ]
|
||||
.IR LogicalVolume { Name | Path }
|
||||
.RI [ PhysicalVolumePath [ :PE [ \-PE ]]...]
|
||||
.SH DESCRIPTION
|
||||
lvresize allows you to resize a logical volume.
|
||||
Be careful when reducing a logical volume's size, because data in the reduced
|
||||
part is lost!!!
|
||||
You should therefore ensure that any filesystem on the volume is
|
||||
shrunk first so that the extents that are to be removed are not in use.
|
||||
Resizing snapshot logical volumes (see
|
||||
.BR lvcreate (8)
|
||||
for information about creating snapshots) is supported as well.
|
||||
But to change the number of copies in a mirrored logical
|
||||
volume use
|
||||
.BR lvconvert (8).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Force resize without prompting even when it may cause data loss.
|
||||
.TP
|
||||
.BR \-n ", " \-\-nofsck
|
||||
Do not perform fsck before resizing filesystem when filesystem
|
||||
requires it. You may need to use \fB\-\-force\fR to proceed with
|
||||
this option.
|
||||
.TP
|
||||
.BR \-r ", " \-\-resizefs
|
||||
Resize underlying filesystem together with the logical volume using
|
||||
\fBfsadm\fR(8).
|
||||
.TP
|
||||
.IR \fB\-l ", " \fB\-\-extents " [" + | \- ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
|
||||
Change or set the logical volume size in units of logical extents.
|
||||
With the \fI+\fP or \fI\-\fP sign the value is added to or subtracted from the actual size
|
||||
of the logical volume and without it, the value is taken as an absolute one.
|
||||
The total number of physical extents affected will be
|
||||
greater than this if, for example, the volume is mirrored.
|
||||
The number can also be expressed as a percentage of the total space
|
||||
in the Volume Group with the suffix \fI%VG\fP, relative to the existing
|
||||
size of the Logical Volume with the suffix \fI%LV\fP, as a percentage of
|
||||
the remaining free space of the PhysicalVolumes on the command line with the
|
||||
suffix \fI%PVS\fP, as a percentage of the remaining free space in the
|
||||
Volume Group with the suffix \fI%FREE\fP, or (for a snapshot) as a percentage
|
||||
of the total space in the Origin Logical Volume with the suffix \fI%ORIGIN\fP.
|
||||
The resulting value is rounded downward for the subtraction otherwise
|
||||
it is rounded upward.
|
||||
N.B. In a future release, when expressed as a percentage with PVS, VG or FREE,
|
||||
the number will be treated as an approximate total number of physical extents
|
||||
to be allocated or freed (including extents used by any mirrors, for example).
|
||||
The code may currently allocate or remove more space than you might otherwise
|
||||
expect.
|
||||
.TP
|
||||
.IR \fB\-L ", " \fB\-\-size " [" + | \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
|
||||
Change or set the logical volume size in units of megabytes.
|
||||
A size suffix of \fIM\fP for megabytes,
|
||||
\fIG\fP for gigabytes, \fIT\fP for terabytes, \fIP\fP for petabytes
|
||||
or \fIE\fP for exabytes is optional.
|
||||
With the \fI+\fP or \fI\-\fP sign the value is added or subtracted
|
||||
from the actual size of the logical volume and rounded
|
||||
to the full extent size and without it,
|
||||
the value is taken as an absolute one.
|
||||
.TP
|
||||
.BR \-i ", " \-\-stripes " " \fIStripes
|
||||
Gives the number of stripes to use when extending a Logical Volume.
|
||||
Defaults to whatever the last segment of the Logical Volume uses.
|
||||
Not applicable to LVs using the original metadata LVM format, which must
|
||||
use a single value throughout.
|
||||
.TP
|
||||
.IR \fB\-\-poolmetadatasize " [" + ] MetadataVolumeSize [ bBsSkKmMgG ]
|
||||
Change or set the thin pool metadata logical volume size.
|
||||
With the \fI+\fP sign the value is added to the actual size
|
||||
of the metadata volume and rounded to the full extent size
|
||||
and without it, the value is taken as an absolute one.
|
||||
Maximal size is 16GiB. Default unit is megabytes.
|
||||
.TP
|
||||
.BR \-I ", " \-\-stripesize " " \fIStripeSize
|
||||
Gives the number of kilobytes for the granularity of the stripes.
|
||||
Defaults to whatever the last segment of the Logical Volume uses.
|
||||
Not applicable to LVs using the original metadata LVM format, which
|
||||
must use a single value throughout.
|
||||
.br
|
||||
StripeSize must be 2^n (n = 2 to 9) for metadata in LVM1 format.
|
||||
For metadata in LVM2 format, the stripe size may be a larger
|
||||
power of 2 but must not exceed the physical extent size.
|
||||
.TP
|
||||
.B \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.SH EXAMPLES
|
||||
.br
|
||||
Extend a logical volume vg1/lv1 by 16MB using physical extents
|
||||
/dev/sda:0\-1 and /dev/sdb:0\-1 for allocation of extents:
|
||||
.sp
|
||||
.B lvresize \-L+16M vg1/lv1 /dev/sda:0\-1 /dev/sdb:0\-1
|
||||
.SH SEE ALSO
|
||||
.BR fsadm (8),
|
||||
.BR lvm (8),
|
||||
.BR lvconvert (8),
|
||||
.BR lvcreate (8),
|
||||
.BR lvreduce (8),
|
||||
.BR lvchange (8)
|
290
man/lvs.8.in
Normal file
290
man/lvs.8.in
Normal file
@@ -0,0 +1,290 @@
|
||||
.TH LVS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvs \(em report information about logical volumes
|
||||
.SH SYNOPSIS
|
||||
.B lvs
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-H | \-\-history ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-nameprefixes ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RI [ + | \- ] Key1 [,[ + | \- ] Key2 [,...]]]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-rows ]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-segments ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-\-unquoted ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName | LogicalVolume { Name | Path }
|
||||
.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]]
|
||||
|
||||
.SH DESCRIPTION
|
||||
lvs produces formatted output about logical volumes.
|
||||
.SH OPTIONS
|
||||
See
|
||||
.BR lvm (8)
|
||||
for common options.
|
||||
.TP
|
||||
.B \-\-aligned
|
||||
Use with \fB\-\-separator\fP to align the output columns.
|
||||
.TP
|
||||
.B \-\-all
|
||||
Include information in the output about internal Logical Volumes that
|
||||
are components of normally-accessible Logical Volumes, such as mirrors,
|
||||
but which are not independently accessible (e.g. not mountable).
|
||||
The names of such Logical Volumes are enclosed within square brackets
|
||||
in the output. For example, after creating a mirror using
|
||||
.B lvcreate -m1 \-\-mirrorlog disk
|
||||
, this option will reveal three internal Logical
|
||||
Volumes, with suffixes mimage_0, mimage_1, and mlog.
|
||||
.TP
|
||||
.B \-\-binary
|
||||
Use binary values "0" or "1" instead of descriptive literal values
|
||||
for columns that have exactly two valid values to report (not counting
|
||||
the "unknown" value which denotes that the value could not be determined).
|
||||
.TP
|
||||
.B \-\-configreport \fI ReportName
|
||||
Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
|
||||
\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
|
||||
is either 'lv' for command's main report or 'log' for log report.
|
||||
If \fB\-\-configreport\fP option is not used to identify a report, then
|
||||
command's main report is assumed. The log report is available only if
|
||||
enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
|
||||
if \fB\-\-logonly\fP option is used.
|
||||
.TP
|
||||
.B \-H ", " \-\-history
|
||||
Include historical logical volumes in the output.
|
||||
(This has no effect unless logical volumes were removed while the configuration
|
||||
setting \fBmetadata/record_lvs_history\fP was enabled.)
|
||||
.TP
|
||||
.B \-\-logonly
|
||||
Suppress the lvs report itself and display only log report on output.
|
||||
.TP
|
||||
.B \-\-nameprefixes
|
||||
Add an "LVM2_" prefix plus the field name to the output. Useful
|
||||
with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
|
||||
be used to set environment variables (for example, in
|
||||
.BR udev (7)
|
||||
rules).
|
||||
.TP
|
||||
.B \-\-noheadings
|
||||
Suppress the headings line that is normally the first line of output.
|
||||
Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-nosuffix
|
||||
Suppress the suffix on output sizes. Use with \fB\-\-units\fP
|
||||
(except h and H) if processing the output.
|
||||
.TP
|
||||
.BR \-o ", " \-\-options
|
||||
Comma-separated ordered list of columns.
|
||||
.IP
|
||||
Precede the list with '\fI+\fP' to append to the current list
|
||||
of columns, '\fI-\fP' to remove from the current list of columns
|
||||
or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
|
||||
be repeated, providing several lists. These lists are evaluated
|
||||
from left to right.
|
||||
.IP
|
||||
Use \fB\-o lv_all\fP to select all logical volume columns,
|
||||
and \fB\-o seg_all\fP
|
||||
to select all logical volume segment columns.
|
||||
.IP
|
||||
Use \fB\-o help\fP to view the full list of columns available.
|
||||
.IP
|
||||
Column names include:
|
||||
chunk_size,
|
||||
convert_lv,
|
||||
copy_percent,
|
||||
data_lv,
|
||||
devices,
|
||||
discards,
|
||||
lv_attr,
|
||||
lv_host,
|
||||
lv_kernel_major,
|
||||
lv_kernel_minor,
|
||||
lv_kernel_read_ahead,
|
||||
lv_major,
|
||||
lv_minor,
|
||||
lv_name,
|
||||
lv_path,
|
||||
lv_profile,
|
||||
lv_read_ahead,
|
||||
lv_size,
|
||||
lv_tags,
|
||||
lv_time,
|
||||
lv_uuid,
|
||||
metadata_lv,
|
||||
mirror_log,
|
||||
modules,
|
||||
move_pv,
|
||||
origin,
|
||||
origin_size,
|
||||
pool_lv,
|
||||
raid_max_recovery_rate,
|
||||
raid_min_recovery_rate,
|
||||
raid_mismatch_count,
|
||||
raid_sync_action,
|
||||
raid_write_behind,
|
||||
region_size,
|
||||
segtype,
|
||||
seg_count,
|
||||
seg_pe_ranges,
|
||||
seg_size,
|
||||
seg_size_pe,
|
||||
seg_start,
|
||||
seg_start_pe,
|
||||
seg_tags,
|
||||
snap_percent,
|
||||
stripes,
|
||||
stripe_size,
|
||||
sync_percent,
|
||||
thin_count,
|
||||
transaction_id,
|
||||
zero.
|
||||
.IP
|
||||
With \fB\-\-segments\fP, any "seg_" prefixes are optional;
|
||||
otherwise any "lv_" prefixes are optional. Columns mentioned in
|
||||
.BR vgs (8)
|
||||
can also be chosen.
|
||||
.IP
|
||||
The lv_attr bits are:
|
||||
.RS
|
||||
.IP 1 3
|
||||
Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin,
|
||||
(O)rigin with merging snapshot, (r)aid, (R)aid without initial sync,
|
||||
(s)napshot, merging (S)napshot, (p)vmove, (v)irtual,
|
||||
mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device,
|
||||
under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or
|
||||
pool m(e)tadata or pool metadata spare.
|
||||
.IP 2 3
|
||||
Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only
|
||||
volume
|
||||
.IP 3 3
|
||||
Allocation policy: (a)nywhere, (c)ontiguous, (i)nherited, c(l)ing, (n)ormal
|
||||
This is capitalised if the volume is currently locked against allocation
|
||||
changes, for example during
|
||||
.BR pvmove (8).
|
||||
.IP 4 3
|
||||
fixed (m)inor
|
||||
.IP 5 3
|
||||
State: (a)ctive, (h)istorical, (s)uspended, (I)nvalid snapshot,
|
||||
invalid (S)uspended snapshot, snapshot (m)erge failed,
|
||||
suspended snapshot (M)erge failed, mapped (d)evice present without tables,
|
||||
mapped device present with (i)nactive table, thin-pool (c)heck needed,
|
||||
suspended thin-pool (C)heck needed, (X) unknown
|
||||
.IP 6 3
|
||||
device (o)pen, (X) unknown
|
||||
.IP 7 3
|
||||
Target type: (C)ache, (m)irror, (r)aid, (s)napshot, (t)hin, (u)nknown, (v)irtual.
|
||||
This groups logical volumes related to the same kernel target together. So,
|
||||
for example, mirror images, mirror logs as well as mirrors themselves appear as
|
||||
(m) if they use the original device-mapper mirror kernel driver; whereas the raid
|
||||
equivalents using the md raid kernel driver all appear as (r).
|
||||
Snapshots using the original device-mapper driver appear as (s); whereas
|
||||
snapshots of thin volumes using the new thin provisioning driver appear as (t).
|
||||
.IP 8 3
|
||||
Newly-allocated data blocks are overwritten with blocks of (z)eroes before use.
|
||||
.IP 9 3
|
||||
Volume Health, where there are currently three groups of attributes identified:
|
||||
.IP
|
||||
Common ones for all Logical Volumes: (p)artial, (X) unknown.
|
||||
.br
|
||||
(p)artial signifies that one or more of the Physical Volumes this Logical
|
||||
Volume uses is missing from the system. (X) unknown signifies the status
|
||||
is unknown.
|
||||
.IP
|
||||
Related to RAID Logical Volumes: (r)efresh needed, (m)ismatches exist, (w)ritemostly.
|
||||
.br
|
||||
(r)efresh signifies that one or more of the Physical Volumes this RAID Logical
|
||||
Volume uses had suffered a write error. The write error could be due to a
|
||||
temporary failure of that Physical Volume or an indication that it is failing.
|
||||
The device should be refreshed or replaced. (m)ismatches signifies that the
|
||||
RAID logical volume has portions of the array that are not coherent.
|
||||
Inconsistencies are detected by initiating a "check" on a RAID logical volume.
|
||||
(The scrubbing operations, "check" and "repair", can be performed on a RAID
|
||||
logical volume via the 'lvchange' command.) (w)ritemostly signifies the
|
||||
devices in a RAID 1 logical volume that have been marked write-mostly.
|
||||
.IP
|
||||
Related to Thin pool Logical Volumes: (F)ailed, out of (D)ata space,
|
||||
(M)etadata read only.
|
||||
.br
|
||||
(F)ailed is set if thin pool encounters serious failures and hence no further I/O
|
||||
is permitted at all. The out of (D)ata space is set if thin pool has run out of
|
||||
data space. (M)etadata read only signifies that thin pool encounters certain
|
||||
types of failures but it's still possible to do reads at least,
|
||||
but no metadata changes are allowed.
|
||||
.IP
|
||||
Related to Thin Logical Volumes: (F)ailed.
|
||||
.br
|
||||
(F)ailed is set when related thin pool enters Failed state and no further I/O
|
||||
is permitted at all.
|
||||
.IP 10 3
|
||||
s(k)ip activation: this volume is flagged to be skipped during activation.
|
||||
.RE
|
||||
.TP
|
||||
.BR \-O ", " \-\-sort
|
||||
Comma-separated ordered list of columns to sort by. Replaces the default
|
||||
selection. Precede any column with '\fI\-\fP' for a reverse sort on that column.
|
||||
.TP
|
||||
.B \-\-rows
|
||||
Output columns as rows.
|
||||
.TP
|
||||
.BR \-S ", " \-\-select " " \fISelection
|
||||
Display only rows that match Selection criteria. All rows are displayed with
|
||||
the additional "selected" column (\fB-o selected\fP) showing 1 if the row
|
||||
matches the Selection and 0 otherwise. The Selection criteria are defined
|
||||
by specifying column names and their valid values (that can include reserved
|
||||
values) while making use of supported comparison operators. See \fBlvm\fP(8)
|
||||
and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
|
||||
about constructing the Selection criteria. As a quick help and to see full
|
||||
list of column names that can be used in Selection including the list of
|
||||
reserved values and the set of supported selection operators, check the
|
||||
output of \fBlvs -S help\fP command.
|
||||
.TP
|
||||
.B \-\-segments
|
||||
Use default columns that emphasize segment information.
|
||||
.TP
|
||||
.B \-\-separator \fISeparator
|
||||
String to use to separate each column. Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-unbuffered
|
||||
Produce output immediately without sorting or aligning the columns properly.
|
||||
.TP
|
||||
.B \-\-units \fIhHbBsSkKmMgGtTpPeE
|
||||
All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
|
||||
(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
|
||||
Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
|
||||
custom units e.g. \fB\-\-units 3M\fP
|
||||
.TP
|
||||
.B \-\-unquoted
|
||||
When used with \fB\-\-nameprefixes\fP, output values in the field=value
|
||||
pairs are not quoted.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvdisplay (8),
|
||||
.BR pvs (8),
|
||||
.BR vgs (8)
|
@@ -1,75 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
The lv_attr bits are:
|
||||
.IP 1 3
|
||||
Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin,
|
||||
(O)rigin with merging snapshot, (r)aid, (R)aid without initial sync,
|
||||
(s)napshot, merging (S)napshot, (p)vmove, (v)irtual,
|
||||
mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device,
|
||||
under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or
|
||||
pool m(e)tadata or pool metadata spare.
|
||||
.IP 2 3
|
||||
Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only
|
||||
volume
|
||||
.IP 3 3
|
||||
Allocation policy: (a)nywhere, (c)ontiguous, (i)nherited, c(l)ing, (n)ormal
|
||||
This is capitalised if the volume is currently locked against allocation
|
||||
changes, for example during
|
||||
.BR pvmove (8).
|
||||
.IP 4 3
|
||||
fixed (m)inor
|
||||
.IP 5 3
|
||||
State: (a)ctive, (h)istorical, (s)uspended, (I)nvalid snapshot,
|
||||
invalid (S)uspended snapshot, snapshot (m)erge failed,
|
||||
suspended snapshot (M)erge failed, mapped (d)evice present without tables,
|
||||
mapped device present with (i)nactive table, thin-pool (c)heck needed,
|
||||
suspended thin-pool (C)heck needed, (X) unknown
|
||||
.IP 6 3
|
||||
device (o)pen, (X) unknown
|
||||
.IP 7 3
|
||||
Target type: (C)ache, (m)irror, (r)aid, (s)napshot, (t)hin, (u)nknown, (v)irtual.
|
||||
This groups logical volumes related to the same kernel target together. So,
|
||||
for example, mirror images, mirror logs as well as mirrors themselves appear as
|
||||
(m) if they use the original device-mapper mirror kernel driver; whereas the raid
|
||||
equivalents using the md raid kernel driver all appear as (r).
|
||||
Snapshots using the original device-mapper driver appear as (s); whereas
|
||||
snapshots of thin volumes using the new thin provisioning driver appear as (t).
|
||||
.IP 8 3
|
||||
Newly-allocated data blocks are overwritten with blocks of (z)eroes before use.
|
||||
.IP 9 3
|
||||
Volume Health, where there are currently three groups of attributes identified:
|
||||
.IP
|
||||
Common ones for all Logical Volumes: (p)artial, (X) unknown.
|
||||
.br
|
||||
(p)artial signifies that one or more of the Physical Volumes this Logical
|
||||
Volume uses is missing from the system. (X) unknown signifies the status
|
||||
is unknown.
|
||||
.IP
|
||||
Related to RAID Logical Volumes: (r)efresh needed, (m)ismatches exist, (w)ritemostly.
|
||||
.br
|
||||
(r)efresh signifies that one or more of the Physical Volumes this RAID Logical
|
||||
Volume uses had suffered a write error. The write error could be due to a
|
||||
temporary failure of that Physical Volume or an indication that it is failing.
|
||||
The device should be refreshed or replaced. (m)ismatches signifies that the
|
||||
RAID logical volume has portions of the array that are not coherent.
|
||||
Inconsistencies are detected by initiating a "check" on a RAID logical volume.
|
||||
(The scrubbing operations, "check" and "repair", can be performed on a RAID
|
||||
logical volume via the 'lvchange' command.) (w)ritemostly signifies the
|
||||
devices in a RAID 1 logical volume that have been marked write-mostly.
|
||||
.IP
|
||||
Related to Thin pool Logical Volumes: (F)ailed, out of (D)ata space,
|
||||
(M)etadata read only.
|
||||
.br
|
||||
(F)ailed is set if thin pool encounters serious failures and hence no further I/O
|
||||
is permitted at all. The out of (D)ata space is set if thin pool has run out of
|
||||
data space. (M)etadata read only signifies that thin pool encounters certain
|
||||
types of failures but it's still possible to do reads at least,
|
||||
but no metadata changes are allowed.
|
||||
.IP
|
||||
Related to Thin Logical Volumes: (F)ailed.
|
||||
.br
|
||||
(F)ailed is set when related thin pool enters Failed state and no further I/O
|
||||
is permitted at all.
|
||||
.IP 10 3
|
||||
s(k)ip activation: this volume is flagged to be skipped during activation.
|
||||
|
52
man/lvscan.8.in
Normal file
52
man/lvscan.8.in
Normal file
@@ -0,0 +1,52 @@
|
||||
.TH LVSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
lvscan \(em scan (all disks) for Logical Volumes
|
||||
.SH SYNOPSIS
|
||||
.B lvscan
|
||||
.RB [ \-a | \-\-all]
|
||||
.RB [ \-b | \-\-blockdevice ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.SH DESCRIPTION
|
||||
lvscan scans all known volume groups or all supported LVM block devices
|
||||
in the system for defined Logical Volumes. The output consists
|
||||
of one line for each Logical Volume indicating whether or not it is active,
|
||||
a snapshot or origin, the size of the device and its allocation policy.
|
||||
Use \fBlvs\fP(8) or \fBlvdisplay\fP(8) to obtain more-comprehensive
|
||||
information about the Logical Volumes.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-\-all
|
||||
Include information in the output about internal Logical Volumes that
|
||||
are components of normally-accessible Logical Volumes, such as mirrors,
|
||||
but which are not independently accessible (e.g. not mountable).
|
||||
For example, after creating a mirror using
|
||||
.B lvcreate \-m1 \-\-mirrorlog disk\fR,
|
||||
this option will reveal three internal Logical Volumes, with suffixes
|
||||
mimage_0, mimage_1, and mlog.
|
||||
.TP
|
||||
.BR \-b ", " \-\-blockdevice
|
||||
This option is now ignored. Instead, use \fBlvs\fP(8) or
|
||||
\fBlvdisplay\fP(8) to obtain the device number.
|
||||
.TP
|
||||
.IR \fB\-\-cache " " LogicalVolume
|
||||
Applicable only when \fBlvmetad\fP(8) is in use (see also \fBlvm.conf\fP(5),
|
||||
global/use_lvmetad). This command issues a rescan of physical volume labels and
|
||||
metadata areas of all PVs that the logical volume uses. In particular, this can
|
||||
be used when a RAID logical volume becomes degraded, to update information
|
||||
about physical volume availability. This is only necessary if the logical
|
||||
volume is \fBnot\fP being monitored by dmeventd (see \fBlvchange\fP(8), option
|
||||
\fB\-\-monitor\fP).
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvcreate (8),
|
||||
.BR lvdisplay (8)
|
||||
.BR lvs (8)
|
59
man/pvchange.8.in
Normal file
59
man/pvchange.8.in
Normal file
@@ -0,0 +1,59 @@
|
||||
.TH PVCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvchange \(em change attributes of a physical volume
|
||||
.SH SYNOPSIS
|
||||
.B pvchange
|
||||
.RB [ \-\-addtag
|
||||
.IR Tag ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-\-deltag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-metadataignore
|
||||
.RI { y | n }]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-x | \-\-allocatable
|
||||
.RI { y | n }]
|
||||
.RB [ \-u | \-\-uuid ]
|
||||
.RI [ PhysicalVolumePath ...]
|
||||
.SH DESCRIPTION
|
||||
pvchange allows you to change the allocation permissions of one or
|
||||
more physical volumes.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-a ", " \-\-all
|
||||
If PhysicalVolumePath is not specified on the command line all
|
||||
physical volumes are searched for and used.
|
||||
.TP
|
||||
.BR \-\-metadataignore " {" \fIy | \fIn }
|
||||
Ignore or un-ignore metadata areas on this physical volume.
|
||||
If metadata areas on a physical volume are ignored, LVM will
|
||||
not not store metadata in the metadata areas present on this Physical
|
||||
Volume.
|
||||
.TP
|
||||
.BR \-u ", " \-\-uuid
|
||||
Generate new random UUID for specified physical volumes.
|
||||
.TP
|
||||
.BR \-x ", " \-\-allocatable " {" \fIy | \fIn }
|
||||
Enable or disable allocation of physical extents on this physical volume.
|
||||
.SH Example
|
||||
Disallows the allocation of physical extents on this physical volume
|
||||
(possibly because of disk errors, or because it will be removed after
|
||||
freeing it:
|
||||
.sp
|
||||
.B pvchange \-x n /dev/sdk1
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvcreate (8)
|
37
man/pvck.8.in
Normal file
37
man/pvck.8.in
Normal file
@@ -0,0 +1,37 @@
|
||||
.TH PVCK 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvck \(em check physical volume metadata
|
||||
.SH SYNOPSIS
|
||||
.B pvck
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-labelsector
|
||||
.IR sector ]
|
||||
.I PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]
|
||||
.SH DESCRIPTION
|
||||
pvck checks physical volume LVM metadata for consistency.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-labelsector \fIsector
|
||||
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 MiB. 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
|
||||
.B 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),
|
||||
.BR pvscan (8)
|
||||
.BR vgck (8)
|
210
man/pvcreate.8.in
Normal file
210
man/pvcreate.8.in
Normal file
@@ -0,0 +1,210 @@
|
||||
.TH PVCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvcreate \(em initialize a disk or partition for use by LVM
|
||||
.SH SYNOPSIS
|
||||
.B pvcreate
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-f [ f ]| \-\-force
|
||||
.RB [ \-\-force ]]
|
||||
.RB [ \-y | \-\-yes ]
|
||||
.RB [ \-\-labelsector ]
|
||||
.RB [ \-\-bootloaderareasize
|
||||
.IR size ]
|
||||
.RB [ \-M | \-\-metadatatype
|
||||
.IR type ]
|
||||
.RB [ \-\- [ pv ] metadatacopies
|
||||
.IR NumberOfCopies ]
|
||||
.RB [ \-\-metadatasize
|
||||
.IR size ]
|
||||
.RB [ \-\-metadataignore
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-dataalignment
|
||||
.IR alignment ]
|
||||
.RB [ \-\-dataalignmentoffset
|
||||
.IR alignment_offset ]
|
||||
.RB [ \-\-restorefile
|
||||
.IR file ]
|
||||
.RB [ \-\-norestorefile ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-setphysicalvolumesize
|
||||
.IR size ]
|
||||
.RB [ \-u | \-\-uuid
|
||||
.IR uuid ]
|
||||
.RB [ \-Z | \-\-zero
|
||||
.RI { y | n }]
|
||||
.I PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]
|
||||
.SH DESCRIPTION
|
||||
pvcreate initializes
|
||||
.I PhysicalVolume
|
||||
for later use by the Logical Volume Manager (LVM). Each
|
||||
.I PhysicalVolume
|
||||
can be a disk partition, whole disk, meta device, or loopback file.
|
||||
For DOS disk partitions, the partition id should be set to 0x8e using
|
||||
.BR fdisk (8),
|
||||
.BR cfdisk (8),
|
||||
or a equivalent. For GUID Partition Table (GPT), the id is
|
||||
E6D6D379-F507-44C2-A23C-238F2A3DF928. For
|
||||
.B whole disk devices only
|
||||
the partition table must be erased, which will effectively destroy all
|
||||
data on that disk. This can be done by zeroing the first sector with:
|
||||
.sp
|
||||
.BI "dd if=/dev/zero of=" PhysicalVolume " bs=512 count=1"
|
||||
.sp
|
||||
Continue with
|
||||
.BR vgcreate (8)
|
||||
to create a new volume group on
|
||||
.IR PhysicalVolume ,
|
||||
or
|
||||
.BR vgextend (8)
|
||||
to add
|
||||
.I PhysicalVolume
|
||||
to an existing volume group.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Force the creation without any confirmation. You can not recreate
|
||||
(reinitialize) a physical volume belonging to an existing volume group.
|
||||
In an emergency you can override this behaviour with \fB-ff\fP.
|
||||
.TP
|
||||
.BR \-u ", " \-\-uuid " " \fIuuid
|
||||
Specify the uuid for the device.
|
||||
Without this option, \fBpvcreate\fP(8) generates a random uuid.
|
||||
All of your physical volumes must have unique uuids.
|
||||
You need to use this option before restoring a backup of LVM metadata
|
||||
onto a replacement device - see \fBvgcfgrestore\fP(8). As such, use of
|
||||
\fB\-\-restorefile\fP is compulsory unless the \fB\-\-norestorefile\fP is
|
||||
used.
|
||||
.TP
|
||||
.BR \-y ", " \-\-yes
|
||||
Answer yes to all questions.
|
||||
.TP
|
||||
.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
|
||||
Whether or not the first 4 sectors (2048 bytes) of the device should be
|
||||
wiped.
|
||||
If this option is not given, the
|
||||
default is to wipe these sectors unless either or both of the
|
||||
\fB\-\-restorefile\fP or \fB\-\-uuid\fP options were specified.
|
||||
.SH NEW METADATA OPTIONS
|
||||
LVM2 introduces a new format for storing metadata on disk.
|
||||
This new format is more efficient and resilient than the format the
|
||||
original version of LVM used and offers the advanced user greater
|
||||
flexibility and control.
|
||||
.P
|
||||
The new format may be selected on the command line with \fB\-M2\fP or by
|
||||
setting \fBformat = "lvm2"\fP in the \fBglobal\fP section of \fBlvm.conf\fP(5).
|
||||
Each physical volume in the same volume group must use the same format, but
|
||||
different volume groups on a machine may use different formats
|
||||
simultaneously: the tools can handle both formats.
|
||||
Additional formats can be added as shared libraries.
|
||||
.P
|
||||
Additional tools for manipulating the locations and sizes of metadata areas
|
||||
will be written in due course. Use the verbose/debug options on the tools
|
||||
to see where the metadata areas are placed.
|
||||
.TP
|
||||
.B \-\-metadatasize \fIsize
|
||||
The approximate amount of space to be set aside for each metadata area.
|
||||
(The size you specify may get rounded.)
|
||||
.TP
|
||||
.B \-\-dataalignment \fIalignment
|
||||
Align the start of the data to a multiple of this number.
|
||||
You should also specify an appropriate \fIPhysicalExtentSize\fP when creating
|
||||
the Volume Group with \fBvgcreate\fP.
|
||||
.sp
|
||||
To see the location of the first Physical Extent of an existing Physical Volume
|
||||
use \fBpvs \-o +pe_start\fP . It will be a multiple of the requested
|
||||
alignment. In addition it may be shifted by \fIalignment_offset\fP from
|
||||
\fIdata_alignment_offset_detection\fP (if enabled in \fBlvm.conf\fP(5)) or
|
||||
\fB\-\-dataalignmentoffset\fP.
|
||||
.TP
|
||||
.B \-\-dataalignmentoffset \fIalignment_offset
|
||||
Shift the start of the data area by this additional \fIalignment_offset\fP.
|
||||
.TP
|
||||
.BR \-\- [ pv ] metadatacopies " " \fINumberOfCopies
|
||||
The number of metadata areas to set aside on each PV. Currently
|
||||
this can be 0, 1 or 2.
|
||||
If set to 2, two copies of the volume group metadata
|
||||
are held on the PV, one at the front of the PV and one at the end.
|
||||
If set to 1 (the default), one copy is kept at the front of the PV
|
||||
(starting in the 5th sector).
|
||||
If set to 0, no copies are kept on this PV - you might wish to use this
|
||||
with VGs containing large numbers of PVs. But if you do this and
|
||||
then later use \fBvgsplit\fP(8) you must ensure that each VG is still going
|
||||
to have a suitable number of copies of the metadata after the split!
|
||||
.TP
|
||||
.BR \-\-metadataignore " {" \fIy | \fIn }
|
||||
Ignore or un-ignore metadata areas on this physical volume.
|
||||
The default is "n". This setting can be changed with \fBpvchange\fP.
|
||||
If metadata areas on a physical volume are ignored, LVM will
|
||||
not store metadata in the metadata areas present on this Physical
|
||||
Volume. Metadata areas cannot be created or extended after Logical
|
||||
Volumes have been allocated on the device. If you do not want to store
|
||||
metadata on this device, it is still wise always to allocate a metadata
|
||||
area in case you need it in the future and to use this option to instruct
|
||||
LVM2 to ignore it.
|
||||
.TP
|
||||
.B \-\-restorefile \fIfile
|
||||
In conjunction with \fB\-\-uuid\fP, this extracts the location and size
|
||||
of the data on the PV from the file (produced by \fBvgcfgbackup\fP)
|
||||
and ensures that the metadata that the program produces is consistent
|
||||
with the contents of the file i.e. the physical extents will be in
|
||||
the same place and not get overwritten by new metadata. This provides
|
||||
a mechanism to upgrade the metadata format or to add/remove metadata
|
||||
areas. Use with care. See also \fBvgconvert\fP(8).
|
||||
.TP
|
||||
.B \-\-norestorefile
|
||||
In conjunction with \fB\-\-uuid\fP, this allows a \fIuuid\fP to be specified
|
||||
without also requiring that a backup of the metadata be provided.
|
||||
.TP
|
||||
.B \-\-labelsector \fIsector
|
||||
By default the PV is labelled with an LVM2 identifier in its second
|
||||
sector (sector 1). This lets you use a different sector near the
|
||||
start of the disk (between 0 and 3 inclusive - see LABEL_SCAN_SECTORS
|
||||
in the source). Use with care.
|
||||
.TP
|
||||
.B \-\-bootloaderareasize \fIsize
|
||||
Create a separate bootloader area of specified size besides PV's data
|
||||
area. The bootloader area is an area of reserved space on the PV from
|
||||
which LVM2 will not allocate any extents and it's kept untouched. This is
|
||||
primarily aimed for use with bootloaders to embed their own data or metadata.
|
||||
The start of the bootloader area is always aligned, see also \fB\-\-dataalignment\fP
|
||||
and \fB\-\-dataalignmentoffset\fP. The bootloader area size may eventually
|
||||
end up increased due to the alignment, but it's never less than the
|
||||
size that is requested. To see the bootloader area start and size of
|
||||
an existing Physical Volume use \fBpvs \-o +pv_ba_start,pv_ba_size\fP.
|
||||
.TP
|
||||
.B \-\-setphysicalvolumesize \fIsize
|
||||
Overrides the automatically-detected size of the PV. Use with care.
|
||||
.SH Examples
|
||||
Initialize partition #4 on the third SCSI disk and the entire fifth
|
||||
SCSI disk for later use by LVM:
|
||||
.sp
|
||||
.B pvcreate /dev/sdc4 /dev/sde
|
||||
|
||||
If the 2nd SCSI disk is a 4KiB sector drive that compensates for windows
|
||||
partitioning (sector 7 is the lowest aligned logical block, the 4KiB
|
||||
sectors start at LBA -1, and consequently sector 63 is aligned on a 4KiB
|
||||
boundary) manually account for this when initializing for use by LVM:
|
||||
.sp
|
||||
.B pvcreate \-\-dataalignmentoffset 7s /dev/sdb
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm.conf (5),
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgextend (8),
|
||||
.BR lvcreate (8),
|
||||
.BR cfdisk (8),
|
||||
.BR fdisk (8),
|
||||
.BR losetup (8),
|
||||
.BR mdadm (8),
|
||||
.BR vgcfgrestore (8),
|
||||
.BR vgconvert (8)
|
109
man/pvdisplay.8.in
Normal file
109
man/pvdisplay.8.in
Normal file
@@ -0,0 +1,109 @@
|
||||
.TH PVDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvdisplay \- display attributes of a physical volume
|
||||
.SH SYNOPSIS
|
||||
.B pvdisplay
|
||||
.RB [ \-c | \-\-colon ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-maps ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-s | \-\-short ]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-\-units
|
||||
.IR hsbkmgtHKMGT ]
|
||||
.RB [ \-v [ v ]| \-\-verbose
|
||||
.RB [ \-\-verbose ]]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ PhysicalVolumePath ...]
|
||||
.br
|
||||
|
||||
.br
|
||||
.B pvdisplay
|
||||
.BR \-C | \-\-columns
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-commandprofile
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-v [ v ]| \-\-verbose
|
||||
.RB [ \-\-verbose ]]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ PhysicalVolumePath ...]
|
||||
.SH DESCRIPTION
|
||||
pvdisplay allows you to see the attributes of one or more physical volumes
|
||||
like size, physical extent size, space used for the volume group descriptor
|
||||
area and so on.
|
||||
.P
|
||||
\fBpvs\fP(8) is an alternative that provides the same information
|
||||
in the style of \fBps\fP(1).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-C ", " \-\-columns
|
||||
Display output in columns, the equivalent of \fBpvs\fP(8). See
|
||||
\fBpvs\fP(8) for a description of other options with this form of
|
||||
\fBpvdisplay\fP.
|
||||
.TP
|
||||
.BR \-c ", " \-\-colon
|
||||
Generate colon separated output for easier parsing in scripts or programs.
|
||||
N.B. \fBpvs\fP(8) provides considerably more control over the output.
|
||||
.nf
|
||||
|
||||
The values are:
|
||||
|
||||
\(bu physical volume device name
|
||||
\(bu volume group name
|
||||
\(bu physical volume size in sectors
|
||||
\(bu internal physical volume number (obsolete)
|
||||
\(bu physical volume status
|
||||
\(bu physical volume (not) allocatable
|
||||
\(bu current number of logical volumes on this physical volume
|
||||
\(bu physical extent size in kilobytes
|
||||
\(bu total number of physical extents
|
||||
\(bu free number of physical extents
|
||||
\(bu allocated number of physical extents
|
||||
|
||||
.fi
|
||||
.TP
|
||||
.BR \-s ", " \-\-short
|
||||
Only display the size of the given physical volumes.
|
||||
.TP
|
||||
.BR \-m ", " \-\-maps
|
||||
Display the mapping of physical extents to logical volumes and
|
||||
logical extents.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvs (8),
|
||||
.BR pvcreate (8),
|
||||
.BR lvcreate (8),
|
||||
.BR vgcreate (8)
|
187
man/pvmove.8.in
Normal file
187
man/pvmove.8.in
Normal file
@@ -0,0 +1,187 @@
|
||||
.TH PVMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvmove \(em move physical extents
|
||||
.SH SYNOPSIS
|
||||
.B pvmove
|
||||
.RB [ \-\-abort ]
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-\-atomic ]
|
||||
.RB [ \-b | \-\-background ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-i | \-\-interval
|
||||
.IR Seconds ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-n | \-\-name
|
||||
.IR LogicalVolume ]
|
||||
.RI [ SourcePhysicalVolume [ :PE [ \-PE ]...]
|
||||
.RI [ DestinationPhysicalVolume [ :PE [ \-PE ]...]...]]
|
||||
.SH DESCRIPTION
|
||||
pvmove allows you to move the allocated physical extents (PEs) on
|
||||
.I SourcePhysicalVolume
|
||||
to one or more other physical volumes (PVs).
|
||||
You can optionally specify a source
|
||||
.I LogicalVolume
|
||||
in which case only extents used by that LV will be moved to
|
||||
free (or specified) extents on
|
||||
.IR DestinationPhysicalVolume (s).
|
||||
If no
|
||||
.I DestinationPhysicalVolume
|
||||
is specified, the normal allocation rules for the Volume Group are used.
|
||||
|
||||
If pvmove gets interrupted for any reason (e.g. the machine crashes)
|
||||
then run pvmove again without any PhysicalVolume arguments to
|
||||
restart any moves that were in progress from the last checkpoint.
|
||||
Alternatively use \fBpvmove \-\-abort\fP at any time to abort. The
|
||||
resulting location of logical volumes after an abort is issued depends
|
||||
on whether the
|
||||
.B \-\-atomic
|
||||
option was used when starting the pvmove process.
|
||||
|
||||
You can run more than one pvmove at once provided they are moving data
|
||||
off different SourcePhysicalVolumes, but additional pvmoves will ignore
|
||||
any Logical Volumes already in the process of being changed, so some
|
||||
data might not get moved.
|
||||
|
||||
\fBpvmove\fP works as follows:
|
||||
|
||||
1. A temporary 'pvmove' Logical Volume is created to store
|
||||
details of all the data movements required.
|
||||
|
||||
2. Every Logical Volume in the Volume Group is searched
|
||||
for contiguous data that need moving
|
||||
according to the command line arguments.
|
||||
For each piece of data found, a new segment is added to the end of the
|
||||
pvmove LV.
|
||||
This segment takes the form of a temporary mirror to copy the data
|
||||
from the original location to a newly-allocated location.
|
||||
The original LV is updated to use the new temporary mirror segment
|
||||
in the pvmove LV instead of accessing the data directly.
|
||||
|
||||
3. The Volume Group metadata is updated on disk.
|
||||
|
||||
4. The first segment of the pvmove Logical Volume is activated and starts
|
||||
to mirror the first part of the data. Only one segment is mirrored at once
|
||||
as this is usually more efficient.
|
||||
|
||||
5. A daemon repeatedly checks progress at the specified time interval.
|
||||
When it detects that the first temporary mirror is in-sync,
|
||||
it breaks that mirror so that only the new location for that data gets used
|
||||
and writes a checkpoint into the Volume Group metadata on disk.
|
||||
Then it activates the mirror for the next segment of the pvmove LV.
|
||||
|
||||
6. When there are no more segments left to be mirrored,
|
||||
the temporary Logical Volume is removed and the Volume Group metadata
|
||||
is updated so that the Logical Volumes reflect the new data locations.
|
||||
|
||||
Note that this new process cannot support the original LVM1
|
||||
type of on-disk metadata. Metadata can be converted using \fBvgconvert\fP(8).
|
||||
|
||||
If the
|
||||
.B \-\-atomic
|
||||
option is used, a slightly different approach is used for the move. Again,
|
||||
a temporary 'pvmove' logical volume is created to store the details of all
|
||||
the data movements required. This temporary LV contains all the segments of
|
||||
the various LVs that need to be moved. However this time, an identical
|
||||
logical volume is allocated that contains the same number of segments and
|
||||
a mirror is created to copy the contents from the first temporary LV to the
|
||||
second. When a complete copy is accomplished, the temporary logical volumes
|
||||
are removed, leaving behind the segments on the destination physical volume.
|
||||
If an abort is issued during the move, all logical volumes being moved will
|
||||
remain on the source physical volume.
|
||||
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-abort
|
||||
Abort any moves in progress. If the
|
||||
.B \-\-atomic
|
||||
option was used to start the pvmove, all logical volumes will remain on
|
||||
the source physical volume. Otherwise, those segments that have completed
|
||||
the move will stay on the destination physical volume, while those that
|
||||
have not will remain on the source physical volume.
|
||||
.TP
|
||||
.B \-\-atomic
|
||||
Make the entire operation atomic. That is, ensure that all affected logical
|
||||
volumes are moved to the destination physical volume together; unless the move
|
||||
has been aborted. If the move has been aborted, all logical volumes will
|
||||
remain on the source physical volume.
|
||||
.TP
|
||||
.B \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.TP
|
||||
.BR \-b ", " \-\-background
|
||||
Run the daemon in the background.
|
||||
.TP
|
||||
.BR \-i ", " \-\-interval " " \fISeconds
|
||||
Report progress as a percentage at regular intervals.
|
||||
.TP
|
||||
.BR \-n ", " \-\-name " " \fILogicalVolume
|
||||
Move only the extents belonging to
|
||||
.I LogicalVolume
|
||||
from
|
||||
.I SourcePhysicalVolume
|
||||
instead of all allocated extents to the destination physical volume(s).
|
||||
|
||||
.SH Examples
|
||||
To move all Physical Extents that are used by simple Logical Volumes on
|
||||
/dev/sdb1 to free Physical Extents elsewhere in the Volume Group use:
|
||||
.sp
|
||||
.B pvmove /dev/sdb1
|
||||
.P
|
||||
Additionally, a specific destination device /dev/sdc1
|
||||
can be specified like this:
|
||||
.sp
|
||||
.B pvmove /dev/sdb1 /dev/sdc1
|
||||
.P
|
||||
To perform the action only on extents belonging to the single Logical Volume
|
||||
lvol1 do this:
|
||||
.sp
|
||||
.B pvmove \-n lvol1 /dev/sdb1 /dev/sdc1
|
||||
.P
|
||||
Rather than moving the contents of the entire device, it is possible to
|
||||
move a range of Physical Extents - for example numbers 1000 to 1999
|
||||
inclusive on /dev/sdb1 - like this:
|
||||
.sp
|
||||
.B pvmove /dev/sdb1:1000\-1999
|
||||
.P
|
||||
A range can also be specified as start+length, so
|
||||
.sp
|
||||
.B pvmove /dev/sdb1:1000+1000
|
||||
.P
|
||||
also refers to 1000 Physical Extents starting from Physical Extent number 1000.
|
||||
(Counting starts from 0, so this refers to the 1001st to the 2000th inclusive.)
|
||||
.P
|
||||
To move a range of Physical Extents to a specific location (which must have
|
||||
sufficient free extents) use the form:
|
||||
.sp
|
||||
.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1
|
||||
.sp
|
||||
or
|
||||
.sp
|
||||
.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1:0\-999
|
||||
.P
|
||||
If the source and destination are on the same disk, the
|
||||
.B anywhere
|
||||
allocation policy would be needed, like this:
|
||||
.sp
|
||||
.B pvmove \-\-alloc anywhere /dev/sdb1:1000\-1999 /dev/sdb1:0\-999
|
||||
.P
|
||||
The part of a specific Logical Volume present within in a range of Physical
|
||||
Extents can also be picked out and moved, like this:
|
||||
.sp
|
||||
.B pvmove \-n lvol1 /dev/sdb1:1000\-1999 /dev/sdc1
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgconvert (8)
|
||||
.BR pvs (8)
|
@@ -1,47 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
\fBpvmove\fP works as follows:
|
||||
|
||||
1. A temporary 'pvmove' LV is created to store details of all the data
|
||||
movements required.
|
||||
|
||||
2. Every LV in the VG is searched for contiguous data that need moving
|
||||
according to the command line arguments.
|
||||
For each piece of data found, a new segment is added to the end of the
|
||||
pvmove LV.
|
||||
This segment takes the form of a temporary mirror to copy the data
|
||||
from the original location to a newly allocated location.
|
||||
The original LV is updated to use the new temporary mirror segment
|
||||
in the pvmove LV instead of accessing the data directly.
|
||||
|
||||
3. The VG metadata is updated on disk.
|
||||
|
||||
4. The first segment of the pvmove LV is activated and starts to mirror
|
||||
the first part of the data. Only one segment is mirrored at once as this
|
||||
is usually more efficient.
|
||||
|
||||
5. A daemon repeatedly checks progress at the specified time interval.
|
||||
When it detects that the first temporary mirror is in sync, it breaks that
|
||||
mirror so that only the new location for that data gets used and writes a
|
||||
checkpoint into the VG metadata on disk. Then it activates the mirror for
|
||||
the next segment of the pvmove LV.
|
||||
|
||||
6. When there are no more segments left to be mirrored, the temporary LV
|
||||
is removed and the VG metadata is updated so that the LVs reflect the new
|
||||
data locations.
|
||||
|
||||
Note that this new process cannot support the original LVM1
|
||||
type of on-disk metadata. Metadata can be converted using
|
||||
\fBvgconvert\fP(8).
|
||||
|
||||
If the \fB\-\-atomic\fP option is used, a slightly different approach is
|
||||
used for the move. Again, a temporary 'pvmove' LV is created to store the
|
||||
details of all the data movements required. This temporary LV contains
|
||||
all the segments of the various LVs that need to be moved. However, in
|
||||
this case, an identical LV is allocated that contains the same number of
|
||||
segments and a mirror is created to copy the contents from the first
|
||||
temporary LV to the second. After a complete copy is made, the temporary
|
||||
LVs are removed, leaving behind the segments on the destination PV. If an
|
||||
abort is issued during the move, all LVs being moved will remain on the
|
||||
source PV.
|
||||
|
37
man/pvremove.8.in
Normal file
37
man/pvremove.8.in
Normal file
@@ -0,0 +1,37 @@
|
||||
.TH PVREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvremove \(em remove a physical volume
|
||||
.SH SYNOPSIS
|
||||
.B pvremove
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-f [ f ]| \-\-force
|
||||
.RB [ \-\-force ]]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-y | \-\-yes ]
|
||||
.I PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]
|
||||
.SH DESCRIPTION
|
||||
pvremove wipes the label on a device so that LVM will no longer
|
||||
recognise it as a physical volume.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-ff ", " \-\-force " " \-\-force
|
||||
Force the removal of a physical volume belonging to an existing volume group.
|
||||
Normally \fBvgreduce\fP(8) should be used instead of this command.
|
||||
You cannot remove a physical volume which in use by some active logical volume.
|
||||
.TP
|
||||
.BR \-y ", " \-\-yes
|
||||
Answer yes to all questions.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvcreate (8),
|
||||
.BR pvdisplay (8),
|
||||
.BR vgreduce (8)
|
56
man/pvresize.8.in
Normal file
56
man/pvresize.8.in
Normal file
@@ -0,0 +1,56 @@
|
||||
.TH PVRESIZE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvresize \(em resize a disk or partition in use by LVM2
|
||||
.SH SYNOPSIS
|
||||
.B pvresize
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-setphysicalvolumesize
|
||||
.IR size ]
|
||||
.I PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]
|
||||
.SH DESCRIPTION
|
||||
pvresize resizes
|
||||
.I PhysicalVolume
|
||||
which may already be in a volume group and have active logical volumes
|
||||
allocated on it.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BI \-\-setphysicalvolumesize " size"
|
||||
Overrides the automatically-detected size of the PV. Use with care, or
|
||||
prior to reducing the physical size of the device.
|
||||
.SH EXAMPLES
|
||||
Expand the PV on /dev/sda1 after enlarging the partition with fdisk:
|
||||
.sp
|
||||
.B pvresize /dev/sda1
|
||||
.sp
|
||||
Shrink the PV on /dev/sda1 prior to shrinking the partition with fdisk
|
||||
(ensure that the PV size is appropriate for your intended new partition
|
||||
size):
|
||||
.sp
|
||||
.B pvresize \-\-setphysicalvolumesize 40G /dev/sda1
|
||||
.sp
|
||||
.SH RESTRICTIONS
|
||||
pvresize will refuse to shrink
|
||||
.I PhysicalVolume
|
||||
if it has allocated extents after where its new end would be. In the future,
|
||||
it should relocate these elsewhere in the volume group if there is sufficient
|
||||
free space, like
|
||||
.B pvmove
|
||||
does.
|
||||
.sp
|
||||
.B pvresize
|
||||
won't currently work correctly on LVM1 volumes.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvmove (8),
|
||||
.BR lvresize (8),
|
||||
.BR fdisk (8)
|
153
man/pvs.8.in
Normal file
153
man/pvs.8.in
Normal file
@@ -0,0 +1,153 @@
|
||||
.TH PVS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvs \(em report information about physical volumes
|
||||
.SH SYNOPSIS
|
||||
.B pvs
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-nameprefixes ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-rows ]
|
||||
.RB [ \-\-segments ]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-\-unquoted ]
|
||||
.RB [ \-v|\-\-verbose ]
|
||||
.RB [ \-\-version]
|
||||
.RI [ PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]]
|
||||
.SH DESCRIPTION
|
||||
pvs produces formatted output about physical volumes.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-all
|
||||
Include information in the output about devices that have not been
|
||||
initialized with \fBpvcreate\fP(8).
|
||||
.TP
|
||||
.B \-\-aligned
|
||||
Use with \fB\-\-separator\fP to align the output columns.
|
||||
.TP
|
||||
.B \-\-binary
|
||||
Use binary values "0" or "1" instead of descriptive literal values
|
||||
for columns that have exactly two valid values to report (not counting
|
||||
the "unknown" value which denotes that the value could not be determined).
|
||||
.TP
|
||||
.B \-\-configreport \fI ReportName
|
||||
Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
|
||||
\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
|
||||
is either 'pv' for command's main report or 'log' for log report.
|
||||
If \fB\-\-configreport\fP option is not used to identify a report, then
|
||||
command's main report is assumed. The log report is available only if
|
||||
enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
|
||||
if \fB\-\-logonly\fP option is used.
|
||||
.TP
|
||||
.B \-\-logonly
|
||||
Suppress the pvs report itself and display only log report on output.
|
||||
.TP
|
||||
.B \-\-nameprefixes
|
||||
Add an "LVM2_" prefix plus the field name to the output. Useful
|
||||
with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
|
||||
be used to set environment variables (for example, in \fBudev\fP(7) rules).
|
||||
.TP
|
||||
.B \-\-noheadings
|
||||
Suppress the headings line that is normally the first line of output.
|
||||
Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-nosuffix
|
||||
Suppress the suffix on output sizes. Use with \fB\-\-units\fP
|
||||
(except h and H) if processing the output.
|
||||
.TP
|
||||
.BR \-o ", " \-\-options
|
||||
Comma-separated ordered list of columns.
|
||||
.IP
|
||||
Precede the list with '\fI+\fP' to append to the current list
|
||||
of columns, '\fI-\fP' to remove from the current list of columns
|
||||
or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
|
||||
be repeated, providing several lists. These lists are evaluated
|
||||
from left to right.
|
||||
.IP
|
||||
Use \fB-o pv_all\fP to select all physical volume columns,
|
||||
and \fB-o pvseg_all\fP to select all Physical Volume segment columns.
|
||||
.IP
|
||||
Use \fB-o help\fP to view the full list of columns available.
|
||||
.IP
|
||||
Column names include: pv_fmt, pv_uuid, dev_size, pv_name, pv_mda_free,
|
||||
pv_mda_size, pv_ba_start, pv_ba_size, pe_start, pv_size, pv_free, pv_used,
|
||||
pv_attr, pv_pe_count, pv_pe_alloc_count, pv_tags, pv_mda_count,
|
||||
pv_mda_used_count, pvseg_start, and pvseg_size
|
||||
.IP
|
||||
With \fB\-\-segments\fP, any "pvseg_" prefixes are optional; otherwise any
|
||||
"pv_" prefixes are optional. Columns mentioned in \fBvgs\fP(8) can also
|
||||
be chosen. The pv_attr bits are: (a)llocatable, e(x)ported, (m)issing,
|
||||
(u)sed (but not allocatable), (d)uplicate.
|
||||
.TP
|
||||
.B \-\-segments
|
||||
Produces one line of output for each contiguous allocation of space on each
|
||||
Physical Volume, showing the start (pvseg_start) and length (pvseg_size) in
|
||||
units of physical extents.
|
||||
.TP
|
||||
.BR \-S ", " \-\-select " " \fISelection
|
||||
Display only rows that match Selection criteria. All rows are displayed with
|
||||
the additional "selected" column (\fB-o selected\fP) showing 1 if the row
|
||||
matches the Selection and 0 otherwise. The Selection criteria are defined
|
||||
by specifying column names and their valid values (that can include reserved
|
||||
values) while making use of supported comparison operators. See \fBlvm\fP(8)
|
||||
and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
|
||||
about constructing the Selection criteria. As a quick help and to see full
|
||||
list of column names that can be used in Selection including the list of
|
||||
reserved values and the set of supported selection operators, check the
|
||||
output of \fBpvs -S help\fP command.
|
||||
.TP
|
||||
.BR \-O ", " \-\-sort
|
||||
Comma-separated ordered list of columns to sort by. Replaces the default
|
||||
selection. Precede any column with '\fI\-\fP' for a reverse sort on that
|
||||
column.
|
||||
.TP
|
||||
.B \-\-rows
|
||||
Output columns as rows.
|
||||
.TP
|
||||
.B \-\-separator \fISeparator
|
||||
String to use to separate each column. Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-unbuffered
|
||||
Produce output immediately without sorting or aligning the columns properly.
|
||||
.TP
|
||||
.B \-\-units \fIhHbBsSkKmMgGtTpPeE
|
||||
All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
|
||||
(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
|
||||
Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
|
||||
custom units e.g. \-\-units 3M
|
||||
.TP
|
||||
.B \-\-unquoted
|
||||
When used with \fB\-\-nameprefixes\fP, output values in the field=value
|
||||
pairs are not quoted.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvdisplay (8),
|
||||
.BR lvs (8),
|
||||
.BR vgs (8)
|
@@ -1,11 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
The pv_attr bits are:
|
||||
.IP 1 3
|
||||
(d)uplicate, (a)llocatable, (u)sed
|
||||
.IP 2 3
|
||||
e(x)ported
|
||||
.IP 3 3
|
||||
(m)issing
|
||||
|
||||
|
@@ -1,4 +1,44 @@
|
||||
.SH NOTES
|
||||
.TH PVSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
pvscan \(em scan all disks for physical volumes
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B pvscan
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-e | \-\-exported ]
|
||||
.RB [ \-n | \-\-novolumegroup ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-s | \-\-short ]
|
||||
.RB [ \-u | \-\-uuid ]
|
||||
.BR
|
||||
|
||||
.B pvscan
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.B \-\-cache
|
||||
.RB [ \-a | \-\-activate " " \fIay ]
|
||||
.RB [ \-b | \-\-background ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-major
|
||||
.I major
|
||||
.B \-\-minor
|
||||
.I minor
|
||||
|
|
||||
.IR DevicePath
|
||||
|
|
||||
.IR major:minor ]...
|
||||
|
||||
.SH DESCRIPTION
|
||||
pvscan scans all supported LVM block devices in the system for physical
|
||||
volumes.
|
||||
|
||||
.SS Scanning with lvmetad
|
||||
|
||||
@@ -32,6 +72,8 @@ scanning, an ordinary pvscan (without \-\-cache) will simply read metadata
|
||||
from lvmetad like other LVM commands. It does not do anything beyond
|
||||
displaying the current state of the cache.
|
||||
|
||||
.I Notes
|
||||
|
||||
.IP \[bu] 2
|
||||
When given specific device name arguments, pvscan \-\-cache will only
|
||||
read the named devices.
|
||||
@@ -88,6 +130,8 @@ fully integrated with the event-driven system services.)
|
||||
When a VG or LV is not auto-activated, traditional activation using
|
||||
vgchange or lvchange -a|--activate is needed.
|
||||
|
||||
.I Notes
|
||||
|
||||
.IP \[bu] 2
|
||||
pvscan auto-activation can be only done in combination with \-\-cache.
|
||||
|
||||
@@ -101,3 +145,34 @@ is used, the auto_activation_volume_list is applied.
|
||||
Auto-activation is not yet supported for LVs that are part of partial or
|
||||
clustered volume groups.
|
||||
|
||||
.P
|
||||
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-e ", " \-\-exported
|
||||
Only show physical volumes belonging to exported volume groups.
|
||||
.TP
|
||||
.BR \-n ", " \-\-novolumegroup
|
||||
Only show physical volumes not belonging to any volume group.
|
||||
.TP
|
||||
.BR \-s ", " \-\-short
|
||||
Short listing format.
|
||||
.TP
|
||||
.BR \-u ", " \-\-uuid
|
||||
Show UUIDs in addition to device names.
|
||||
.TP
|
||||
.BR \-a ", " \-\-activate " " \fIay
|
||||
Automatically activate any logical volumes that are possible to activate
|
||||
with the addition of the new devices.
|
||||
.TP
|
||||
.BR \-b ", " \-\-background
|
||||
Run the command in the background.
|
||||
.TP
|
||||
.BR \-\-cache " [" \-\-major " " \fImajor " " \-\-minor " " \fIminor " | " \fIDevicePath " | " \fImajor:minor " ]..."
|
||||
Scan one or more devices and send the metadata to lvmetad.
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvmconfig (8),
|
||||
.BR lvmetad (8)
|
36
man/vgcfgbackup.8.in
Normal file
36
man/vgcfgbackup.8.in
Normal file
@@ -0,0 +1,36 @@
|
||||
.TH VGCFGBACKUP 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgcfgbackup \(em backup volume group descriptor area
|
||||
.SH SYNOPSIS
|
||||
.B vgcfgbackup
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-f | \-\-file
|
||||
.IR Filename ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgcfgbackup allows you to backup the metadata of your volume groups.
|
||||
If you don't name any volume groups on the command line, all of them
|
||||
will be backed up.
|
||||
.sp
|
||||
In a default installation, each volume group gets backed up into a separate
|
||||
file bearing the name of the volume group in the directory
|
||||
\fI#DEFAULT_BACKUP_DIR#\fP.
|
||||
You can write the backup to an alternative file using \fB\-f\fP. In this case
|
||||
if you are backing up more than one volume group the filename is
|
||||
treated as a template, and %s gets replaced by the volume group name.
|
||||
.sp
|
||||
NB. This DOESN'T backup user/system data in logical
|
||||
volume(s)! Backup \fI#DEFAULT_SYS_DIR#\fP regularly too.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcfgrestore (8)
|
58
man/vgcfgrestore.8.in
Normal file
58
man/vgcfgrestore.8.in
Normal file
@@ -0,0 +1,58 @@
|
||||
.TH VGCFGRESTORE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgcfgrestore \(em restore volume group descriptor area
|
||||
.SH SYNOPSIS
|
||||
.B vgcfgrestore
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-f | \-\-file
|
||||
.RI < filename >]
|
||||
.RB [ \-\-force ]
|
||||
.RB [ \-l [ l ]| \-\-list ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-M | \-\-metadatatype
|
||||
.IR 1 | 2 ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI \fIVolumeGroupName\fP
|
||||
.SH DESCRIPTION
|
||||
vgcfgrestore allows you to restore the metadata of \fIVolumeGroupName\fP
|
||||
from a text backup file produced by \fBvgcfgbackup\fP.
|
||||
You can specify a backup file with \fB\-\-file\fP.
|
||||
If no backup file is specified, the most recent
|
||||
one is used. Use \fB\-\-list\fP for a list of the available
|
||||
backup and archive files of \fIVolumeGroupName\fP.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-l ", " \-\-list\fP
|
||||
List files pertaining to \fIVolumeGroupName\fP
|
||||
List metadata backup and archive files pertaining to \fIVolumeGroupName\fP.
|
||||
May be used with the \fB\-f\fP option. Does not restore \fIVolumeGroupName\fP.
|
||||
.TP
|
||||
.BR \-f ", " \-\-file " " \fIfilename
|
||||
Name of LVM metadata backup file
|
||||
Specifies a metadata backup or archive file to be used for restoring
|
||||
VolumeGroupName. Often this file has been created with \fBvgcfgbackup\fP.
|
||||
.TP
|
||||
.B \-\-force
|
||||
Necessary to restore metadata with thin pool volumes.
|
||||
.br
|
||||
\fBWARNING: Use with extreme caution.
|
||||
Most changes to thin metadata cannot be reverted.
|
||||
You may lose data if you restore metadata that does not match the thin pool
|
||||
kernel metadata precisely.\fP
|
||||
.SH REPLACING PHYSICAL VOLUMES
|
||||
\fBvgdisplay \-\-partial \-\-verbose\fP will show you the UUIDs and sizes of
|
||||
any PVs that are no longer present.
|
||||
If a PV in the VG is lost and you wish to substitute
|
||||
another of the same size, use
|
||||
\fBpvcreate \-\-restorefile filename \-\-uuid uuid\fP (plus additional
|
||||
arguments as appropriate) to initialise it with the same UUID as
|
||||
the missing PV. Repeat for all other missing PVs in the VG.
|
||||
Then use \fBvgcfgrestore \-\-file filename\fP to restore the volume
|
||||
group's metadata.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8)
|
346
man/vgchange.8.in
Normal file
346
man/vgchange.8.in
Normal file
@@ -0,0 +1,346 @@
|
||||
.TH VGCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgchange \(em change attributes of a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgchange
|
||||
.RB [ \-\-addtag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-a | \-\-activate
|
||||
.RI [ a | e | s | l ]
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-activationmode
|
||||
.IB { complete | degraded | partial } ]
|
||||
.RB [ \-K | \-\-ignoreactivationskip ]
|
||||
.RB [ \-\-monitor
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-poll
|
||||
.RI { y | n }]
|
||||
.RB [ \-c | \-\-clustered
|
||||
.RI { y | n }]
|
||||
.RB [ \-u | \-\-uuid ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-\-deltag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-detachprofile ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoremonitoring ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-sysinit ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-lock\-start ]
|
||||
.RB [ \-\-lock\-stop ]
|
||||
.RB [ \-\-lock\-type
|
||||
.IR LockType ]
|
||||
.RB [ \-l | \-\-logicalvolume
|
||||
.IR MaxLogicalVolumes ]
|
||||
.RB [ \-p | \-\-maxphysicalvolumes
|
||||
.IR MaxPhysicalVolumes ]
|
||||
.RB [ \-\-metadataprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\- [ vg ] metadatacopies
|
||||
.IR NumberOfCopies | unmanaged | all ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-s | \-\-physicalextentsize
|
||||
.IR PhysicalExtentSize [ bBsSkKmMgGtTpPeE ]]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-\-systemid
|
||||
.IR SystemID ]
|
||||
.RB [ \-\-refresh ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ \-x | \-\-resizeable
|
||||
.RI { y | n }]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgchange allows you to change the attributes of one or more
|
||||
volume groups. Its main purpose is to activate and deactivate
|
||||
.IR VolumeGroupName ,
|
||||
or all volume groups if none is specified. Only active volume groups
|
||||
are subject to changes and allow access to their logical volumes.
|
||||
[Not yet implemented: During volume group activation, if
|
||||
.B vgchange
|
||||
recognizes snapshot logical volumes which were dropped because they ran
|
||||
out of space, it displays a message informing the administrator that such
|
||||
snapshots should be removed (see
|
||||
.BR lvremove (8)).
|
||||
]
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-A ", " \-\-autobackup " {" \fIy | \fIn }
|
||||
Controls automatic backup of metadata after the change. See
|
||||
.BR vgcfgbackup (8).
|
||||
Default is yes.
|
||||
.TP
|
||||
.BR \-a ", " \-\-activate " [" \fIa | \fIe | \fIs | \fIl ]{ \fIy | \fIn }
|
||||
Controls the availability of the logical volumes in the volume
|
||||
group for input/output.
|
||||
In other words, makes the logical volumes known/unknown to the kernel.
|
||||
If autoactivation option is used (\-aay), each logical volume in
|
||||
the volume group is activated only if it matches an item in the
|
||||
activation/auto_activation_volume_list set in lvm.conf. If this
|
||||
list is not set, then all volumes are considered for activation.
|
||||
The \-aay option should be also used during system boot so it's
|
||||
possible to select which volumes to activate using the
|
||||
activation/auto_activation_volume_list settting.
|
||||
.IP
|
||||
Activation of a logical volume creates a symbolic link
|
||||
/dev/VolumeGroupName/LogicalVolumeName pointing to the device node.
|
||||
This link is removed on deactivation.
|
||||
All software and scripts should access the device through
|
||||
this symbolic link and present this as the name of the device.
|
||||
The location and name of the underlying device node may depend on
|
||||
the distribution and configuration (e.g. udev) and might change
|
||||
from release to release.
|
||||
.IP
|
||||
In a clustered VG, clvmd is used for activation, and the
|
||||
following options are possible:
|
||||
|
||||
With \-aey, clvmd activates the LV in exclusive mode
|
||||
(with an exclusive lock), allowing a single node to activate the LV.
|
||||
|
||||
With \-asy, clvmd activates the LV in shared mode
|
||||
(with a shared lock), allowing multiple nodes to activate the LV concurrently.
|
||||
If the LV type prohibits shared access, such as an LV with a snapshot,
|
||||
the 's' option is ignored and an exclusive lock is used.
|
||||
|
||||
With \-ay (no mode specified), clvmd activates the LV in shared mode
|
||||
if the LV type allows concurrent access, such as a linear LV.
|
||||
Otherwise, clvmd activates the LV in exclusive mode.
|
||||
|
||||
With \-aey, \-asy, and \-ay, clvmd attempts to activate the LV
|
||||
on all nodes. If exclusive mode is used, then only one of the
|
||||
nodes will be successful.
|
||||
|
||||
With \-an, clvmd attempts to deactivate the LV on all nodes.
|
||||
|
||||
With \-aly, clvmd activates the LV only on the local node, and \-aln
|
||||
deactivates only on the local node. If the LV type allows concurrent
|
||||
access, then shared mode is used, otherwise exclusive.
|
||||
|
||||
LVs with snapshots are always activated exclusively because they can only
|
||||
be used on one node at once.
|
||||
|
||||
For local VGs, \-ay, \-aey, and \-asy are all equivalent.
|
||||
.IP
|
||||
In a shared VG, lvmlockd is used for locking if LVM is compiled with lockd
|
||||
support, and the following options are possible:
|
||||
|
||||
With \-aey, the command activates the LV in exclusive mode, allowing a
|
||||
single host to activate the LV (the host running the command). Before
|
||||
activating the LV, the command uses lvmlockd to acquire an exclusive lock
|
||||
on the LV. If the lock cannot be acquired, the LV is not activated and an
|
||||
error is reported. This would happen if the LV is active on another host.
|
||||
|
||||
With \-asy, the command activates the LV in shared mode, allowing multiple
|
||||
hosts to activate the LV concurrently. Before activating the LV, the
|
||||
command uses lvmlockd to acquire a shared lock on the LV. If the lock
|
||||
cannot be acquired, the LV is not activated and an error is reported.
|
||||
This would happen if the LV is active exclusively on another host. If the
|
||||
LV type prohibits shared access, such as a snapshot, the command will
|
||||
report an error and fail.
|
||||
|
||||
With \-an, the command deactivates the LV on the host running the command.
|
||||
After deactivating the LV, the command uses lvmlockd to release the
|
||||
current lock on the LV.
|
||||
|
||||
With lvmlockd, an unspecified mode is always exclusive, \-ay defaults to
|
||||
\-aey.
|
||||
|
||||
.TP
|
||||
.BR \-\-activationmode " {" \fIcomplete | \fIdegraded | \fIpartial }
|
||||
The activation mode determines whether logical volumes are allowed to
|
||||
activate when there are physical volumes missing (e.g. due to a device
|
||||
failure). \fIcomplete\fP is the most restrictive; allowing only those
|
||||
logical volumes to be activated that are not affected by the missing
|
||||
PVs. \fIdegraded\fP allows RAID logical volumes to be activated even if
|
||||
they have PVs missing. (Note that the "mirror" segment type is not
|
||||
considered a RAID logical volume. The "raid1" segment type should
|
||||
be used instead.) Finally, \fIpartial\fP allows any logical volume to
|
||||
be activated even if portions are missing due to a missing or failed
|
||||
PV. This last option should only be used when performing recovery or
|
||||
repair operations. \fIdegraded\fP is the default mode. To change it, modify
|
||||
.B activation_mode
|
||||
in
|
||||
.BR lvm.conf (5).
|
||||
.TP
|
||||
.BR \-K ", " \-\-ignoreactivationskip
|
||||
Ignore the flag to skip Logical Volumes during activation.
|
||||
.TP
|
||||
.BR \-c ", " \-\-clustered " {" \fIy | \fIn }
|
||||
If clustered locking is enabled, this indicates whether this
|
||||
Volume Group is shared with other nodes in the cluster or whether
|
||||
it contains only local disks that are not visible on the other nodes.
|
||||
If the cluster infrastructure is unavailable on a particular node at a
|
||||
particular time, you may still be able to use Volume Groups that
|
||||
are not marked as clustered.
|
||||
.TP
|
||||
.BR \-\-detachprofile
|
||||
Detach any metadata configuration profiles attached to given
|
||||
Volume Groups. See \fBlvm.conf\fP(5) for more information
|
||||
about \fBmetadata profiles\fP.
|
||||
.TP
|
||||
.BR \-u ", " \-\-uuid
|
||||
Generate new random UUID for specified Volume Groups.
|
||||
.TP
|
||||
.BR \-\-monitor " {" \fIy | \fIn }
|
||||
Start or stop monitoring a mirrored or snapshot logical volume with
|
||||
dmeventd, if it is installed.
|
||||
If a device used by a monitored mirror reports an I/O error,
|
||||
the failure is handled according to
|
||||
.B mirror_image_fault_policy
|
||||
and
|
||||
.B mirror_log_fault_policy
|
||||
set in
|
||||
.BR lvm.conf (5).
|
||||
.TP
|
||||
.BR \-\-poll " {" \fIy | \fIn }
|
||||
Without polling a logical volume's backgrounded transformation process
|
||||
will never complete. If there is an incomplete pvmove or lvconvert (for
|
||||
example, on rebooting after a crash), use \fB\-\-poll y\fP to restart the
|
||||
process from its last checkpoint. However, it may not be appropriate to
|
||||
immediately poll a logical volume when it is activated, use
|
||||
\fB\-\-poll n\fP to defer and then \fB\-\-poll y\fP to restart the process.
|
||||
.TP
|
||||
.BR \-\-sysinit
|
||||
Indicates that vgchange(8) is being invoked from early system initialisation
|
||||
scripts (e.g. rc.sysinit or an initrd), before writeable filesystems are
|
||||
available. As such, some functionality needs to be disabled and this option
|
||||
acts as a shortcut which selects an appropriate set of options. Currently
|
||||
this is equivalent to using
|
||||
.BR \-\-ignorelockingfailure ,
|
||||
.BR \-\-ignoremonitoring ,
|
||||
.B \-\-poll n
|
||||
and setting \fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
|
||||
environment variable.
|
||||
|
||||
If \fB\-\-sysinit\fP is used in conjunction with lvmetad(8) enabled and running,
|
||||
autoactivation is preferred over manual activation via direct vgchange call.
|
||||
Logical volumes are autoactivated according to auto_activation_volume_list
|
||||
set in lvm.conf(5).
|
||||
.TP
|
||||
.BR \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.TP
|
||||
.BR \-\-ignoremonitoring
|
||||
Make no attempt to interact with dmeventd unless
|
||||
.BR \-\-monitor
|
||||
is specified.
|
||||
Do not use this if dmeventd is already monitoring a device.
|
||||
.TP
|
||||
.BR \-\-lock\-start
|
||||
Start the lockspace of a shared VG in lvmlockd. lvmlockd locks becomes
|
||||
available for the VG, allowing LVM to use the VG. See
|
||||
.BR lvmlockd (8).
|
||||
.TP
|
||||
.BR \-\-lock\-stop
|
||||
Stop the lockspace of a shared VG in lvmlockd. lvmlockd locks become
|
||||
unavailable for the VG, preventing LVM from using the VG. See
|
||||
.BR lvmlockd (8).
|
||||
.TP
|
||||
.BR \-\-lock\-type " " \fILockType
|
||||
Change the VG lock type to or from a shared lock type used with lvmlockd. See
|
||||
.BR lvmlockd (8).
|
||||
.TP
|
||||
.BR \-l ", " \-\-logicalvolume " " \fIMaxLogicalVolumes
|
||||
Changes the maximum logical volume number of an existing inactive
|
||||
volume group.
|
||||
.TP
|
||||
.BR \-p ", " \-\-maxphysicalvolumes " " \fIMaxPhysicalVolumes
|
||||
Changes the maximum number of physical volumes that can belong
|
||||
to this volume group.
|
||||
For volume groups with metadata in lvm1 format, the limit is 255.
|
||||
If the metadata uses lvm2 format, the value 0 removes this restriction:
|
||||
there is then no limit. If you have a large number of physical volumes in
|
||||
a volume group with metadata in lvm2 format, for tool performance reasons,
|
||||
you should consider some use of \fB\-\-pvmetadatacopies 0\fP as described in
|
||||
\fBpvcreate(8)\fP, and/or use \fB\-\-vgmetadatacopies\fP.
|
||||
.TP
|
||||
.BR \-\-metadataprofile " " \fIProfileName
|
||||
Uses and attaches ProfileName configuration profile to the volume group
|
||||
metadata. Whenever the volume group is processed next time, the profile
|
||||
is automatically applied. The profile is inherited by all logical volumes
|
||||
in the volume group unless the logical volume itself has its own profile
|
||||
attached. See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
|
||||
.TP
|
||||
.BR \-\- [ vg ] metadatacopies " " \fINumberOfCopies | \fIunmanaged | \fIall
|
||||
Sets the desired number of metadata copies in the volume group. If set to
|
||||
a non-zero value, LVM will automatically manage the 'metadataignore'
|
||||
flags on the physical volumes (see \fBpvchange\fP or \fBpvcreate \-\-metadataignore\fP) in order
|
||||
to achieve \fINumberOfCopies\fP copies of metadata. If set to \fIunmanaged\fP,
|
||||
LVM will not automatically manage the 'metadataignore' flags. If set to
|
||||
\fIall\fP, LVM will first clear all of the 'metadataignore' flags on all
|
||||
metadata areas in the volume group, then set the value to \fIunmanaged\fP.
|
||||
The \fBvgmetadatacopies\fP option is useful for volume groups containing
|
||||
large numbers of physical volumes with metadata as it may be used to
|
||||
minimize metadata read and write overhead.
|
||||
.TP
|
||||
.BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize [ \fIBbBsSkKmMgGtTpPeE ]
|
||||
Changes the physical extent size on physical volumes of this volume group.
|
||||
A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes
|
||||
is the default if no suffix is present. For LVM2 format, the value must be a
|
||||
power of 2 of at least 1 sector (where the sector size is the largest sector
|
||||
size of the PVs currently used in the VG) or, if not a power of 2, at least
|
||||
128KiB. For the older LVM1 format, it must be a power of 2 of at least 8KiB.
|
||||
The default is 4 MiB.
|
||||
|
||||
Before increasing the physical extent size, you might need to use lvresize,
|
||||
pvresize and/or pvmove so that everything fits. For example, every
|
||||
contiguous range of extents used in a logical volume must start and
|
||||
end on an extent boundary.
|
||||
|
||||
If the volume group metadata uses lvm1 format, extents can vary in size from
|
||||
8KiB to 16GiB and there is a limit of 65534 extents in each logical volume.
|
||||
The default of 4 MiB leads to a maximum logical volume size of around 256GiB.
|
||||
|
||||
If the volume group metadata uses lvm2 format those restrictions do not apply,
|
||||
but having a large number of extents will slow down the tools but have no
|
||||
impact on I/O performance to the logical volume. The smallest PE is 1KiB.
|
||||
|
||||
The 2.4 kernel has a limitation of 2TiB per block device.
|
||||
.TP
|
||||
.BR \-\-systemid " " \fISystemID
|
||||
Changes the system ID of the VG. Using this option requires caution
|
||||
because the VG may become foreign to the host running the command,
|
||||
leaving the host unable to access it. See
|
||||
.BR lvmsystemid (7).
|
||||
.TP
|
||||
.BR \-\-refresh
|
||||
If any logical volume in the volume group is active, reload its metadata.
|
||||
This is not necessary in normal operation, but may be useful
|
||||
if something has gone wrong or if you're doing clustering
|
||||
manually without a clustered lock manager.
|
||||
.TP
|
||||
.BR \-x ", " \-\-resizeable " {" \fIy | \fIn }
|
||||
Enables or disables the extension/reduction of this volume group
|
||||
with/by physical volumes.
|
||||
.SH Examples
|
||||
To activate all known volume groups in the system:
|
||||
.sp
|
||||
.B vgchange \-a y
|
||||
|
||||
To change the maximum number of logical volumes of inactive volume group
|
||||
vg00 to 128.
|
||||
.sp
|
||||
.B vgchange \-l 128 /dev/vg00
|
||||
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvchange (8),
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8)
|
22
man/vgck.8.in
Normal file
22
man/vgck.8.in
Normal file
@@ -0,0 +1,22 @@
|
||||
.TH VGCK 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgck \(em check volume group metadata
|
||||
.SH SYNOPSIS
|
||||
.B vgck
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgck checks LVM metadata for each named volume group for consistency.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgchange (8),
|
||||
.BR vgscan (8)
|
48
man/vgconvert.8.in
Normal file
48
man/vgconvert.8.in
Normal file
@@ -0,0 +1,48 @@
|
||||
.TH VGCONVERT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgconvert \- convert volume group metadata format
|
||||
.SH SYNOPSIS
|
||||
.B vgconvert
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-labelsector ]
|
||||
.RB [ \-\-bootloaderareasize
|
||||
.IR size ]
|
||||
.RB [ \-M | \-\-metadatatype
|
||||
.IR type ]
|
||||
.RB [ \-\-pvmetadatacopies
|
||||
.IR NumberOfCopies ]
|
||||
.RB [ \-\-metadatasize
|
||||
.IR size ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-version ]
|
||||
.I VolumeGroupName
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgconvert converts
|
||||
.I VolumeGroupName
|
||||
metadata from one format to another provided that the metadata
|
||||
fits into the same space.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) and \fBpvcreate\fP(8) for options.
|
||||
.SH Examples
|
||||
Convert volume group vg1 from LVM1 metadata format to the new LVM2
|
||||
metadata format.
|
||||
.sp
|
||||
.B vgconvert \-M2 vg1
|
||||
.SH RECOVERY
|
||||
Use \fBpvscan\fP(8) to see which PVs lost their metadata.
|
||||
Run \fBpvcreate\fP(8) with the \fB\-\-uuid\fP and \fB\-\-restorefile\fP
|
||||
options on each such PV to reformat it as it was, using the archive
|
||||
file that \fBvgconvert\fP(8) created at the start of the procedure.
|
||||
Finally run \fBvgcfgrestore\fP(8) with that archive file to restore
|
||||
the original metadata.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvcreate (8),
|
||||
.BR vgcfgrestore (8)
|
187
man/vgcreate.8.in
Normal file
187
man/vgcreate.8.in
Normal file
@@ -0,0 +1,187 @@
|
||||
.TH VGCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgcreate \(em create a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgcreate
|
||||
.RB [ \-\-addtag
|
||||
.IR Tag ]
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-c | \-\-clustered
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-l | \-\-maxlogicalvolumes
|
||||
.IR MaxLogicalVolumes ]
|
||||
.RB [ \-M | \-\-metadatatype
|
||||
.IR type ]
|
||||
.RB [ \-\-metadataprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-p | \-\-maxphysicalvolumes
|
||||
.IR MaxPhysicalVolumes ]
|
||||
.RB [ \-\- [ vg ] metadatacopies
|
||||
.IR NumberOfCopies | unmanaged | all ]
|
||||
.RB [ \-s | \-\-physicalextentsize
|
||||
.IR PhysicalExtentSize [ bBsSkKmMgGtTpPeE ]]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-shared ]
|
||||
.RB [ \-\-systemid
|
||||
.IR SystemID ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RB [ "PHYSICAL DEVICE OPTIONS" ]
|
||||
.I VolumeGroupName PhysicalDevicePath
|
||||
.RI [ PhysicalDevicePath ...]
|
||||
.SH DESCRIPTION
|
||||
vgcreate creates a new volume group called
|
||||
.I VolumeGroupName
|
||||
using the block special device \fIPhysicalDevicePath\fP.
|
||||
.sp
|
||||
If \fIPhysicalDevicePath\fP was not previously configured for LVM with
|
||||
\fBpvcreate\fP(8), the device will be initialized with the same
|
||||
default values used with \fBpvcreate\fP(8). If non-default
|
||||
\fPpvcreate\fP values are desired, they may be given on the
|
||||
commandline with the same options as \fBpvcreate\fP(8). See
|
||||
.B PHYSICAL DEVICE OPTIONS
|
||||
for available options. Note that the restore-related options such as
|
||||
.BR \-\-restorefile ", " \-\-uuid " and " \-\-physicalvolumesize
|
||||
are not available. If a restore operation is needed, use
|
||||
\fBpvcreate\fP(8) and \fBvgcfgrestore\fP(8).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-c ", " \-\-clustered " {" \fIy | \fIn }
|
||||
If clustered locking is enabled, this defaults to \fBy\fP indicating that
|
||||
this Volume Group is shared with other nodes in the cluster.
|
||||
|
||||
If the new Volume Group contains only local disks that are not visible
|
||||
on the other nodes, you must specify \fB\-\-clustered\ n\fP.
|
||||
If the cluster infrastructure is unavailable on a particular node at a
|
||||
particular time, you may still be able to use such Volume Groups.
|
||||
.TP
|
||||
.BR \-l ", " \-\-maxlogicalvolumes " " \fIMaxLogicalVolumes
|
||||
Sets the maximum number of logical volumes allowed in this
|
||||
volume group.
|
||||
The setting can be changed with \fBvgchange\fP(8).
|
||||
For volume groups with metadata in lvm1 format, the limit
|
||||
and default value is 255.
|
||||
If the metadata uses lvm2 format, the default value is 0
|
||||
which removes this restriction: there is then no limit.
|
||||
.TP
|
||||
.BR \-p ", " \-\-maxphysicalvolumes " " \fIMaxPhysicalVolumes
|
||||
Sets the maximum number of physical volumes that can belong
|
||||
to this volume group.
|
||||
The setting can be changed with \fBvgchange\fP.
|
||||
For volume groups with metadata in lvm1 format, the limit
|
||||
and default value is 255.
|
||||
If the metadata uses lvm2 format, the value 0 removes this restriction:
|
||||
there is then no limit. If you have a large number of physical volumes in
|
||||
a volume group with metadata in lvm2 format, for tool performance reasons,
|
||||
you should consider some use of \fB\-\-pvmetadatacopies 0\fP as described in
|
||||
\fBpvcreate\fP(8), and/or use \fB\-\-vgmetadatacopies\fP.
|
||||
.TP
|
||||
.BR \-\- [ vg ] metadatacopies " " \fINumberOfCopies | \fIunmanaged | \fIall
|
||||
Sets the desired number of metadata copies in the volume group. If set to
|
||||
a non-zero value, LVM will automatically manage the 'metadataignore'
|
||||
flags on the physical volumes (see \fBpvcreate\fP(8) or
|
||||
\fBpvchange \-\-metadataignore\fP) in order
|
||||
to achieve \fINumberOfCopies\fP copies of metadata. If set to \fIunmanaged\fP,
|
||||
LVM will not automatically manage the 'metadataignore' flags. If set to
|
||||
\fIall\fP, LVM will first clear all of the 'metadataignore' flags on all
|
||||
metadata areas in the volume group, then set the value to \fIunmanaged\fP.
|
||||
The \fBvgmetadatacopies\fP option is useful for volume groups containing
|
||||
large numbers of physical volumes with metadata as it may be used to
|
||||
minimize metadata read and write overhead.
|
||||
The default value is \fIunmanaged\fP.
|
||||
.TP
|
||||
.BR \-\-metadataprofile " " \fIProfileName
|
||||
Uses and attaches the ProfileName configuration profile to the volume group
|
||||
metadata. Whenever the volume group is processed next time, the profile is
|
||||
automatically applied. The profile is inherited by all logical volumes in
|
||||
the volume group unless the logical volume itself has its own profile attached.
|
||||
See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
|
||||
.TP
|
||||
.BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize [ \fIbBsSkKmMgGtTpPeE ]
|
||||
Sets the physical extent size on physical volumes of this volume group.
|
||||
A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes
|
||||
is the default if no suffix is present. For LVM2 format, the value must be a
|
||||
power of 2 of at least 1 sector (where the sector size is the largest sector
|
||||
size of the PVs currently used in the VG) or, if not a power of 2, at least
|
||||
128KiB. For the older LVM1 format, it must be a power of 2 of at least 8KiB.
|
||||
The default is 4 MiB.
|
||||
Once this value has been set, it is difficult to change it without recreating
|
||||
the volume group which would involve backing up and restoring data on any
|
||||
logical volumes. However, if no extents need moving for the new
|
||||
value to apply, it can be altered using \fBvgchange \-s\fP.
|
||||
|
||||
If the volume group metadata uses lvm1 format, extents can vary in size from
|
||||
8KiB to 16GiB and there is a limit of 65534 extents in each logical volume. The
|
||||
default of 4 MiB leads to a maximum logical volume size of around 256GiB.
|
||||
|
||||
If the volume group metadata uses lvm2 format those restrictions do not apply,
|
||||
but having a large number of extents will slow down the tools but have no
|
||||
impact on I/O performance to the logical volume. The smallest PE is 1KiB
|
||||
|
||||
The 2.4 kernel has a limitation of 2TiB per block device.
|
||||
|
||||
.TP
|
||||
.B \-\-shared
|
||||
Create a shared VG using lvmlockd if LVM is compiled with lockd support.
|
||||
lvmlockd will select lock type sanlock or dlm depending on which lock
|
||||
manager is running. This allows multiple hosts to share a VG on shared
|
||||
devices. lvmlockd and a lock manager must be configured and running. See
|
||||
.BR lvmlockd (8).
|
||||
|
||||
.TP
|
||||
.BR \-\-systemid " " \fISystemID
|
||||
Specifies the system ID that will be given to the new VG, overriding the
|
||||
system ID of the host running the command. A VG is normally created
|
||||
without this option, in which case the new VG is given the system ID of
|
||||
the host creating it. Using this option requires caution because the
|
||||
system ID of the new VG may not match the system ID of the host running
|
||||
the command, leaving the VG inaccessible to the host. See
|
||||
.BR lvmsystemid (7).
|
||||
|
||||
.SH PHYSICAL DEVICE OPTIONS
|
||||
The following options are available for initializing physical devices in the
|
||||
volume group. These options are further described in the \fBpvcreate\fP(8)
|
||||
man page.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
.TP
|
||||
.BR \-y ", " \-\-yes
|
||||
.TP
|
||||
.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
|
||||
.TP
|
||||
.B \-\-labelsector \fIsector
|
||||
.TP
|
||||
.B \-\-metadatasize \fIsize
|
||||
.TP
|
||||
.B \-\-pvmetadatacopies \fIcopies
|
||||
.TP
|
||||
.B \-\-dataalignment \fIalignment
|
||||
.TP
|
||||
.B \-\-dataalignmentoffset \fIalignment_offset
|
||||
.SH Examples
|
||||
Creates a volume group named "test_vg" using physical volumes "/dev/sdk1"
|
||||
and "/dev/sdl1" with default physical extent size of 4MiB:
|
||||
.sp
|
||||
.B vgcreate test_vg /dev/sdk1 /dev/sdl1
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvdisplay (8),
|
||||
.BR pvcreate (8),
|
||||
.BR vgdisplay (8),
|
||||
.BR vgextend (8),
|
||||
.BR vgreduce (8),
|
||||
.BR lvcreate (8),
|
||||
.BR lvdisplay (8),
|
||||
.BR lvextend (8),
|
||||
.BR lvreduce (8)
|
123
man/vgdisplay.8.in
Normal file
123
man/vgdisplay.8.in
Normal file
@@ -0,0 +1,123 @@
|
||||
.TH VGDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgdisplay \(em display attributes of volume groups
|
||||
.SH SYNOPSIS
|
||||
.B vgdisplay
|
||||
.RB [ \-A | \-\-activevolumegroups ]
|
||||
.RB [ \-c | \-\-colon ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-s | \-\-short ]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.br
|
||||
|
||||
.br
|
||||
.B vgdisplay
|
||||
.BR \-C | \-\-columns
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgdisplay allows you to see the attributes of
|
||||
.I VolumeGroupName
|
||||
(or all volume groups if none is given) with it's physical and logical
|
||||
volumes and their sizes etc.
|
||||
.P
|
||||
\fBvgs\fP(8) is an alternative that provides the same information
|
||||
in the style of \fBps\fP(1).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-A ", " \-\-activevolumegroups
|
||||
Only select the active volume groups. The volume group is considered active
|
||||
if at least one of its logical volumes is active.
|
||||
.TP
|
||||
.BR \-C ", " \-\-columns
|
||||
Display output in columns, the equivalent of \fBvgs\fP(8).
|
||||
Options listed are the same as options given in \fPvgs\fP(8).
|
||||
.TP
|
||||
.BR \-c ", " \-\-colon
|
||||
Generate colon separated output for easier parsing in scripts or programs.
|
||||
N.B. \fBvgs\fP(8) provides considerably more control over the output.
|
||||
.nf
|
||||
|
||||
The values are:
|
||||
|
||||
1 volume group name
|
||||
2 volume group access
|
||||
3 volume group status
|
||||
4 internal volume group number
|
||||
5 maximum number of logical volumes
|
||||
6 current number of logical volumes
|
||||
7 open count of all logical volumes in this volume group
|
||||
8 maximum logical volume size
|
||||
9 maximum number of physical volumes
|
||||
10 current number of physical volumes
|
||||
11 actual number of physical volumes
|
||||
12 size of volume group in kilobytes
|
||||
13 physical extent size
|
||||
14 total number of physical extents for this volume group
|
||||
15 allocated number of physical extents for this volume group
|
||||
16 free number of physical extents for this volume group
|
||||
17 uuid of volume group
|
||||
|
||||
.fi
|
||||
.TP
|
||||
.BR \-s ", " \-\-short
|
||||
Give a short listing showing the existence of volume groups.
|
||||
.TP
|
||||
.BR \-v ", " \-\-verbose
|
||||
Display verbose information containing long listings of physical
|
||||
and logical volumes. If given twice, also display verbose runtime
|
||||
information of vgdisplay's activities.
|
||||
.TP
|
||||
.B \-\-version
|
||||
Display version and exit successfully.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgs (8),
|
||||
.BR pvcreate (8),
|
||||
.BR vgcreate (8),
|
||||
.BR lvcreate (8)
|
37
man/vgexport.8.in
Normal file
37
man/vgexport.8.in
Normal file
@@ -0,0 +1,37 @@
|
||||
.TH VGEXPORT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgexport \- make volume groups unknown to the system
|
||||
.SH SYNOPSIS
|
||||
.B vgexport
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgexport allows you to make the inactive
|
||||
.IR VolumeGroupName (s)
|
||||
unknown to the system.
|
||||
You can then move all the Physical Volumes in that Volume Group to
|
||||
a different system for later
|
||||
.BR vgimport (8).
|
||||
Most LVM2 tools ignore exported Volume Groups.
|
||||
vgexport clears the VG system ID, and vgimport sets the VG system ID
|
||||
to match the host running vgimport (if the host has a system ID).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-a ", " \-\-all
|
||||
Export all inactive Volume Groups.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvscan (8),
|
||||
.BR vgimport (8),
|
||||
.BR vgscan (8),
|
||||
.BR lvmsystemid (7)
|
@@ -1,14 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
.IP \[bu] 3
|
||||
vgexport can make inactive VG(s) unknown to the system. In this state,
|
||||
all the PVs in the VG can be moved to a different system, from which
|
||||
\fBvgimport\fP can then be run.
|
||||
|
||||
.IP \[bu] 3
|
||||
Most LVM tools ignore exported VGs.
|
||||
|
||||
.IP \[bu] 3
|
||||
vgexport clears the VG system ID, and vgimport sets the VG system ID to
|
||||
match the host running vgimport (if the host has a system ID).
|
||||
|
71
man/vgextend.8.in
Normal file
71
man/vgextend.8.in
Normal file
@@ -0,0 +1,71 @@
|
||||
.TH VGEXTEND 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgextend \(em add physical volumes to a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgextend
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-restoremissing ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ "PHYSICAL DEVICE OPTIONS" ]
|
||||
.I VolumeGroupName PhysicalDevicePath
|
||||
.RI [ PhysicalDevicePath ...]
|
||||
.SH DESCRIPTION
|
||||
vgextend allows you to add one or more initialized physical volumes
|
||||
(see \fBpvcreate\fP(8)) to an existing volume group to extend it in size. Moreover, it allows you to
|
||||
re-add a physical volume that has gone missing previously, due to a transient
|
||||
device failure, without re-initialising it. Use
|
||||
\fBvgextend \-\-restoremissing\fP to that effect.
|
||||
.sp
|
||||
If \fIPhysicalDevicePath\fP was not previously configured for LVM with
|
||||
\fBpvcreate\fP(8), the device will be initialized with the same
|
||||
default values used with \fBpvcreate\fP(8). If non-default
|
||||
\fPpvcreate\fP(8) values are desired, they may be given on the
|
||||
commandline with the same options as \fPpvcreate\fP(8). See
|
||||
.B PHYSICAL DEVICE OPTIONS
|
||||
for available options. Note that the restore-related options such as
|
||||
.BR \-\-restorefile ", " \-\-uuid " and " \-\-physicalvolumesize
|
||||
are not available. If a restore operation
|
||||
is needed, use \fBpvcreate\fP(8) and \fBvgcfgrestore\fP(8).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.SH PHYSICAL DEVICE OPTIONS
|
||||
The following options are available for initializing physical devices in the
|
||||
volume group. These options are further described in the
|
||||
\fBpvcreate\fP(8) man page.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
.TP
|
||||
.BR \-y ", " \-\-yes
|
||||
.TP
|
||||
.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
|
||||
.TP
|
||||
.B \-\-labelsector \fIsector
|
||||
.TP
|
||||
.B \-\-metadatasize \fIsize
|
||||
.TP
|
||||
.BR \-\-metadataignore " {" \fIy | \fIn }
|
||||
.TP
|
||||
.B \-\-pvmetadatacopies \fIcopies
|
||||
.TP
|
||||
.B \-\-dataalignment \fIalignment
|
||||
.TP
|
||||
.B \-\-dataalignmentoffset \fIalignment_offset
|
||||
.SH Examples
|
||||
Extends the existing volume group "vg00" by the new physical volumes
|
||||
(see \fBpvcreate\fP(8)) "/dev/sda4" and "/dev/sdn1".
|
||||
.sp
|
||||
.B vgextend vg00 /dev/sda4 /dev/sdn1
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgreduce (8),
|
||||
.BR pvcreate (8)
|
38
man/vgimport.8.in
Normal file
38
man/vgimport.8.in
Normal file
@@ -0,0 +1,38 @@
|
||||
.TH VGIMPORT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgimport \(em make exported volume groups known to the system
|
||||
.SH SYNOPSIS
|
||||
.B vgimport
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgimport allows you to make a Volume Group that was previously
|
||||
exported using
|
||||
.BR vgexport (8)
|
||||
known to the system again, perhaps after moving its Physical Volumes
|
||||
from a different machine.
|
||||
vgexport clears the VG system ID, and vgimport sets the VG system ID
|
||||
to match the host running vgimport (if the host has a system ID).
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-a ", " \-\-all
|
||||
Import all exported Volume Groups.
|
||||
.TP
|
||||
.BR \-\-force
|
||||
Import exported Volume Groups even if there are missing Physical Volumes.
|
||||
This option should only be used if the missing devices are known to have
|
||||
failed and they cannot be restored.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR pvscan (8),
|
||||
.BR vgexport (8),
|
||||
.BR vgscan (8),
|
||||
.BR lvmsystemid (7)
|
@@ -1,9 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
.IP \[bu] 3
|
||||
vgimport makes exported VG(s) known to the system again, perhaps
|
||||
after moving the PVs from a different system.
|
||||
|
||||
.IP \[bu] 3
|
||||
vgexport clears the VG system ID, and vgimport sets the VG system ID
|
||||
to match the host running vgimport (if the host has a system ID).
|
46
man/vgimportclone.8.in
Normal file
46
man/vgimportclone.8.in
Normal file
@@ -0,0 +1,46 @@
|
||||
.TH VGIMPORTCLONE 8 "LVM TOOLS #VERSION#" "Red Hat, Inc." \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgimportclone \(em import and rename duplicated volume group (e.g. a hardware snapshot)
|
||||
.SH SYNOPSIS
|
||||
.B vgimportclone
|
||||
.RB [ \-n | \-\-basevgname
|
||||
.IR VolumeGroupName ]
|
||||
.RB [ \-i | \-\-import ]
|
||||
.I PhysicalVolume
|
||||
.RI [ PhysicalVolume ...]
|
||||
.SH DESCRIPTION
|
||||
vgimportclone is used to import a duplicated VG (e.g. hardware snapshot).
|
||||
Duplicate VG(s) and PV(s) are not able to be used until they are made
|
||||
to coexist with the origin VG(s) and PV(s).
|
||||
vgimportclone renames the VG associated with the specified PV(s) and
|
||||
changes the associated VG and PV UUIDs.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-n ", " \-\-basevgname " " \fIVolumeGroupName
|
||||
By default the snapshot VG will be renamed to the original name plus a
|
||||
numeric suffix to avoid duplicate naming (e.g. 'test_vg' would be renamed
|
||||
to 'test_vg1'). This option will override the base VG name that is
|
||||
used for all VG renames. If a VG already exists with the specified name
|
||||
a numeric suffix will be added (like the previous example) to make it unique.
|
||||
.TP
|
||||
.BR \-i ", " \-\-import
|
||||
Import exported Volume Groups. Otherwise VGs that have been exported
|
||||
will not be changed (nor will their associated PVs).
|
||||
.SH ENVIRONMENT VARIABLES
|
||||
.TP
|
||||
.B LVM_BINARY
|
||||
The LVM2 binary to use. Defaults to "lvm".
|
||||
.SH Examples
|
||||
The origin VG "vg00" has origin PVs "/dev/sda" and "/dev/sdb"
|
||||
and the respective snapshot PVs are "/dev/sdc" and "/dev/sdd".
|
||||
To rename the VG associated with "/dev/sdc" and "/dev/sdd"
|
||||
from "vg00" to "vg00_snap"
|
||||
(and to change associated VG and PV UUIDs) do:
|
||||
.sp
|
||||
.B vgimportclone \-\-basevgname vg00_snap /dev/sdc /dev/sdd
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgrename (8)
|
||||
|
@@ -1,9 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
vgimportclone can be used to import a VG from duplicated PVs (e.g. created
|
||||
by a hardware snapshot of the PV devices).
|
||||
|
||||
A duplicated VG cannot used until it is made to coexist with the original
|
||||
VG. vgimportclone renames the VG associated with the specified PVs and
|
||||
changes the associated VG and PV UUIDs.
|
||||
|
41
man/vgmerge.8.in
Normal file
41
man/vgmerge.8.in
Normal file
@@ -0,0 +1,41 @@
|
||||
.TH VGMERGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgmerge \(em merge two volume groups
|
||||
.SH SYNOPSIS
|
||||
.B vgmerge
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-l | \-\-list ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.I DestinationVolumeGroupName
|
||||
.I SourceVolumeGroupName
|
||||
.SH DESCRIPTION
|
||||
vgmerge merges two existing volume groups. The inactive
|
||||
\fISourceVolumeGroupName\fP will be merged into
|
||||
the \fIDestinationVolumeGroupName\fP if physical extent sizes
|
||||
are equal and physical and logical volume summaries of both volume groups
|
||||
fit into \fIDestinationVolumeGroupName\fP's limits.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-l ", " \-\-list
|
||||
Display merged \fIDestinationVolumeGroupName\fP like \fBvgdisplay \-v\fP.
|
||||
.TP
|
||||
.BR \-t ", " \-\-test
|
||||
Do a test run WITHOUT making any real changes.
|
||||
.SH Examples
|
||||
Merge the inactive volume group named "my_vg"
|
||||
into the active or inactive volume group named "databases" giving verbose
|
||||
runtime information:
|
||||
.sp
|
||||
.B vgmerge \-v databases my_vg
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgextend (8),
|
||||
.BR vgreduce (8)
|
30
man/vgmknodes.8.in
Normal file
30
man/vgmknodes.8.in
Normal file
@@ -0,0 +1,30 @@
|
||||
.TH VGMKNODES 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgmknodes \(em recreate volume group directory and logical volume special files
|
||||
.SH SYNOPSIS
|
||||
.B vgmknodes
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-\-refresh ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [[ VolumeGroupName | LogicalVolumePath ]...]
|
||||
.SH DESCRIPTION
|
||||
Checks the LVM2 special files in /dev that are needed for active
|
||||
logical volumes and creates any missing ones and removes unused ones.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-\-refresh
|
||||
If any logical volume in the volume group is active, reload its metadata.
|
||||
This is not necessary in normal operation, but may be useful
|
||||
if something has gone wrong or if you're doing clustering
|
||||
manually without a clustered lock manager.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgscan (8),
|
||||
.BR dmsetup (8)
|
49
man/vgreduce.8.in
Normal file
49
man/vgreduce.8.in
Normal file
@@ -0,0 +1,49 @@
|
||||
.TH VGREDUCE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgreduce \(em reduce a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgreduce
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-removemissing ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.I VolumeGroupName
|
||||
.RI [ PhysicalVolumePath ...]
|
||||
.SH DESCRIPTION
|
||||
vgreduce allows you to remove one or more unused physical volumes
|
||||
from a volume group.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-a ", " \-\-all
|
||||
Removes all empty physical volumes if none are given on command line.
|
||||
.TP
|
||||
.B \-\-removemissing
|
||||
Removes all missing physical volumes from the volume group, if there are no
|
||||
logical volumes allocated on those. This resumes normal operation of the volume
|
||||
group (new logical volumes may again be created, changed and so on).
|
||||
|
||||
If this is not possible (there are logical volumes referencing the missing
|
||||
physical volumes) and you cannot or do not want to remove them manually, you
|
||||
can run this option with \fB\-\-force\fP to have \fBvgreduce\fP
|
||||
remove any partial LVs.
|
||||
|
||||
Any logical volumes and dependent snapshots that were partly on the
|
||||
missing disks get removed completely. This includes those parts
|
||||
that lie on disks that are still present.
|
||||
|
||||
If your logical volumes spanned several disks including the ones that are
|
||||
lost, you might want to try to salvage data first by activating your
|
||||
logical volumes with \fB\-\-partial\fP as described in \fBlvm\fP(8).
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgextend (8)
|
46
man/vgremove.8.in
Normal file
46
man/vgremove.8.in
Normal file
@@ -0,0 +1,46 @@
|
||||
.TH VGREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgremove \(em remove a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgremove
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-f | \-\-force ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-noudevsync ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RI [ VolumeGroupName ...]
|
||||
.SH DESCRIPTION
|
||||
vgremove allows you to remove one or more volume groups.
|
||||
If one or more physical volumes in the volume group are lost,
|
||||
consider \fBvgreduce \-\-removemissing\fP to make the volume group
|
||||
metadata consistent again.
|
||||
.sp
|
||||
If there are logical volumes that exist in the volume group,
|
||||
a prompt will be given to confirm removal. You can override
|
||||
the prompt with \fB\-f\fP.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Force the removal of any logical volumes on the volume group
|
||||
without confirmation.
|
||||
To remove also damaged pool volumes use \-ff.
|
||||
.TP
|
||||
.BR \-\-noudevsync
|
||||
Disable udev synchronisation. The
|
||||
process will not wait for notification from udev.
|
||||
It will continue irrespective of any possible udev processing
|
||||
in the background. You should only use this if udev is not running
|
||||
or has rules that ignore the devices LVM2 creates.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvremove (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgreduce (8)
|
58
man/vgrename.8.in
Normal file
58
man/vgrename.8.in
Normal file
@@ -0,0 +1,58 @@
|
||||
.TH VGRENAME 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgrename \(em rename a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgrename
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.IR OldVolumeGroup { Path | Name | UUID }
|
||||
.IR NewVolumeGroup { Path | Name }
|
||||
.SH DESCRIPTION
|
||||
vgrename renames an existing (see
|
||||
.BR vgcreate (8))
|
||||
volume group from
|
||||
.IR OldVolumeGroup { Name | Path | UUID }
|
||||
to
|
||||
.IR NewVolumeGroup { Name | Path }.
|
||||
|
||||
All the Volume Groups visible to a system need to have different
|
||||
names. Otherwise many LVM2 commands will refuse to run or give
|
||||
warning messages.
|
||||
|
||||
This situation could arise when disks are moved between machines. If
|
||||
a disk is connected and it contains a Volume Group with the same name
|
||||
as the Volume Group containing your root filesystem the machine might
|
||||
not even boot correctly. However, the two Volume Groups should have
|
||||
different UUIDs (unless the disk was cloned) so you can rename
|
||||
one of the conflicting Volume Groups with
|
||||
\fBvgrename\fP.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.SH Examples
|
||||
Renames existing volume group vg02 to my_volume_group:
|
||||
.sp
|
||||
.B vgrename /dev/vg02 /dev/my_volume_group
|
||||
|
||||
or
|
||||
.sp
|
||||
.B vgrename vg02 my_volume_group
|
||||
|
||||
Changes the name of the Volume Group with UUID
|
||||
.br
|
||||
Zvlifi-Ep3t-e0Ng-U42h-o0ye-KHu1-nl7Ns4 to VolGroup00_tmp:
|
||||
.sp
|
||||
.B vgrename Zvlifi\-Ep3t\-e0Ng\-U42h\-o0ye\-KHu1\-nl7Ns4 VolGroup00_tmp
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgchange (8),
|
||||
.BR vgcreate (8),
|
||||
.BR lvrename (8)
|
161
man/vgs.8.in
Normal file
161
man/vgs.8.in
Normal file
@@ -0,0 +1,161 @@
|
||||
.TH VGS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgs \(em report information about volume groups
|
||||
.SH SYNOPSIS
|
||||
.B vgs
|
||||
.RB [ \-a | \-\-all ]
|
||||
.RB [ \-\-aligned ]
|
||||
.RB [ \-\-binary ]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [[ \-\-configreport
|
||||
.IR ReportName ]
|
||||
.RB [ \-o | \-\-options
|
||||
.RI [ + | \- | # ] Field1 [, Field2 ...]
|
||||
.RB [ \-O | \-\-sort
|
||||
.RI [ + | \- ] Key1 [, Key2 ...]]
|
||||
.RB [ \-S | \-\-select
|
||||
.IR Selection ]
|
||||
.RB ...]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-ignoreskippedcluster ]
|
||||
.RB [ \-\-logonly ]
|
||||
.RB [ \-\-nameprefixes ]
|
||||
.RB [ \-\-noheadings ]
|
||||
.RB [ \-\-nosuffix ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-\-rows ]
|
||||
.RB [ \-\-separator
|
||||
.IR Separator ]
|
||||
.RB [ \-\-unbuffered ]
|
||||
.RB [ \-\-units
|
||||
.IR hHbBsSkKmMgGtTpPeE ]
|
||||
.RB [ \-\-unquoted ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.RB [ \-\-version ]
|
||||
.RI [ VolumeGroupName
|
||||
.RI [ VolumeGroupName ...]]
|
||||
.SH DESCRIPTION
|
||||
vgs produces formatted output about volume groups.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-all
|
||||
List all volume groups. Equivalent to not specifying any volume groups.
|
||||
.TP
|
||||
.B \-\-aligned
|
||||
Use with \fB\-\-separator\fP to align the output columns.
|
||||
.TP
|
||||
.B \-\-binary
|
||||
Use binary values "0" or "1" instead of descriptive literal values
|
||||
for columns that have exactly two valid values to report (not counting
|
||||
the "unknown" value which denotes that the value could not be determined).
|
||||
.TP
|
||||
.B \-\-configreport \fI ReportName
|
||||
Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
|
||||
\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
|
||||
is either 'vg' for command's main report or 'log' for log report.
|
||||
If \fB\-\-configreport\fP option is not used to identify a report, then
|
||||
command's main report is assumed. The log report is available only if
|
||||
enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
|
||||
if \fB\-\-logonly\fP option is used.
|
||||
.TP
|
||||
.B \-\-logonly
|
||||
Suppress the vgs report itself and display only log report on output.
|
||||
.TP
|
||||
.B \-\-nameprefixes
|
||||
Add an "LVM2_" prefix plus the field name to the output. Useful
|
||||
with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
|
||||
be used to set environment variables (for example, in \fBudev\fP(7) rules).
|
||||
.TP
|
||||
.B \-\-noheadings
|
||||
Suppress the headings line that is normally the first line of output.
|
||||
Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-nosuffix
|
||||
Suppress the suffix on output sizes. Use with \fB\-\-units\fP
|
||||
(except h and H) if processing the output.
|
||||
.TP
|
||||
.BR \-o ", " \-\-options
|
||||
Comma-separated ordered list of columns.
|
||||
.IP
|
||||
Precede the list with '\fI+\fP' to append to the current list
|
||||
of columns, '\fI-\fP' to remove from the current list of columns
|
||||
or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
|
||||
be repeated, providing several lists. These lists are evaluated
|
||||
from left to right.
|
||||
.IP
|
||||
Use \fB\-o vg_all\fP to select all volume group columns.
|
||||
.IP
|
||||
Use \fB\-o help\fP to view the full list of columns available.
|
||||
.IP
|
||||
Column names include: vg_fmt, vg_uuid, vg_name, vg_attr, vg_size, vg_free,
|
||||
vg_sysid, vg_extent_size, vg_extent_count, vg_free_count, vg_profile, max_lv,
|
||||
max_pv, pv_count, lv_count, snap_count, vg_seqno, vg_tags, vg_mda_count,
|
||||
vg_mda_free, and vg_mda_size, vg_mda_used_count.
|
||||
.IP
|
||||
Any "vg_" prefixes are optional. Columns mentioned in either \fBpvs\fP(8)
|
||||
or \fBlvs\fP(8) can also be chosen, but columns cannot be taken from both
|
||||
at the same time.
|
||||
.IP
|
||||
The vg_attr bits are:
|
||||
.RS
|
||||
.IP 1 3
|
||||
Permissions: (w)riteable, (r)ead-only
|
||||
.IP 2 3
|
||||
Resi(z)eable
|
||||
.IP 3 3
|
||||
E(x)ported
|
||||
.IP 4 3
|
||||
(p)artial: one or more physical volumes belonging to the volume group
|
||||
are missing from the system
|
||||
.IP 5 3
|
||||
Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere
|
||||
.IP 6 3
|
||||
(c)lustered, (s)hared
|
||||
.RE
|
||||
.TP
|
||||
.BR \-O ", " \-\-sort
|
||||
Comma-separated ordered list of columns to sort by. Replaces the default
|
||||
selection. Precede any column with '\fI\-\fP' for a reverse sort on that
|
||||
column.
|
||||
.TP
|
||||
.B \-\-rows
|
||||
Output columns as rows.
|
||||
.TP
|
||||
.BR \-S ", " \-\-select " " \fISelection
|
||||
Display only rows that match Selection criteria. All rows are displayed with
|
||||
the additional "selected" column (\fB-o selected\fP) showing 1 if the row
|
||||
matches the Selection and 0 otherwise. The Selection criteria are defined
|
||||
by specifying column names and their valid values (that can include reserved
|
||||
values) while making use of supported comparison operators. See \fBlvm\fP(8)
|
||||
and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
|
||||
about constructing the Selection criteria. As a quick help and to see full
|
||||
list of column names that can be used in Selection including the list of
|
||||
reserved values and the set of supported selection operators, check the
|
||||
output of \fBvgs -S help\fP command.
|
||||
.TP
|
||||
.B \-\-separator \fISeparator
|
||||
String to use to separate each column. Useful if grepping the output.
|
||||
.TP
|
||||
.B \-\-unbuffered
|
||||
Produce output immediately without sorting or aligning the columns properly.
|
||||
.TP
|
||||
.B \-\-units \fIhHbBsSkKmMgGtTpPeE
|
||||
All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
|
||||
(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
|
||||
Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
|
||||
custom units e.g. \-\-units 3M
|
||||
.TP
|
||||
.B \-\-unquoted
|
||||
When used with \fB\-\-nameprefixes\fP, output values in the field=value
|
||||
pairs are not quoted.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgdisplay (8),
|
||||
.BR pvs (8),
|
||||
.BR lvs (8)
|
@@ -1,17 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
The vg_attr bits are:
|
||||
.IP 1 3
|
||||
Permissions: (w)riteable, (r)ead-only
|
||||
.IP 2 3
|
||||
Resi(z)eable
|
||||
.IP 3 3
|
||||
E(x)ported
|
||||
.IP 4 3
|
||||
(p)artial: one or more physical volumes belonging to the volume group
|
||||
are missing from the system
|
||||
.IP 5 3
|
||||
Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere
|
||||
.IP 6 3
|
||||
(c)lustered, (s)hared
|
||||
|
43
man/vgscan.8.in
Normal file
43
man/vgscan.8.in
Normal file
@@ -0,0 +1,43 @@
|
||||
.TH VGSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgscan \(em scan all disks for volume groups and rebuild caches
|
||||
.SH SYNOPSIS
|
||||
.B vgscan
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-? | \-\-help ]
|
||||
.RB [ \-\-ignorelockingfailure ]
|
||||
.RB [ \-\-mknodes ]
|
||||
.RB [ \-\-notifydbus ]
|
||||
.RB [ \-P | \-\-partial ]
|
||||
.RB [ \-\-reportformat
|
||||
.RB { basic | json }]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.SH DESCRIPTION
|
||||
vgscan scans all SCSI, (E)IDE disks, multiple devices and a bunch
|
||||
of other disk devices in the system looking for LVM physical volumes
|
||||
and volume groups. Define a filter in \fBlvm.conf\fP(5) to restrict
|
||||
the scan to avoid a CD ROM, for example.
|
||||
.LP
|
||||
In LVM2, vgscans take place automatically; but you might still need to
|
||||
run one explicitly after changing hardware.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.TP
|
||||
.B \-\-mknodes
|
||||
Also checks the LVM special files in /dev that are needed for active
|
||||
logical volumes and creates any missing ones and removes unused ones.
|
||||
.TP
|
||||
.B \-\-notifydbus
|
||||
Send a notification to D-Bus. The command will exit with an error
|
||||
if LVM is not built with support for D-Bus notification, or if the
|
||||
notify_dbus config setting is disabled.
|
||||
.TP
|
||||
.B \-\-cache
|
||||
Scan devices for LVM physical volumes and volume groups and instruct
|
||||
the lvmetad daemon to update its cached state accordingly.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgchange (8)
|
80
man/vgsplit.8.in
Normal file
80
man/vgsplit.8.in
Normal file
@@ -0,0 +1,80 @@
|
||||
.TH VGSPLIT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
|
||||
.SH NAME
|
||||
vgsplit \(em split a volume group into two
|
||||
.SH SYNOPSIS
|
||||
.B vgsplit
|
||||
.RB [ \-\-alloc
|
||||
.IR AllocationPolicy ]
|
||||
.RB [ \-A | \-\-autobackup
|
||||
.RI { y | n }]
|
||||
.RB [ \-c | \-\-clustered
|
||||
.RI { y | n }]
|
||||
.RB [ \-\-commandprofile
|
||||
.IR ProfileName ]
|
||||
.RB [ \-d | \-\-debug ]
|
||||
.RB [ \-h | \-\-help ]
|
||||
.RB [ \-l | \-\-maxlogicalvolumes
|
||||
.IR MaxLogicalVolumes ]
|
||||
.RB [ \-M | \-\-metadatatype
|
||||
.IR type ]
|
||||
.RB [ \-p | \-\-maxphysicalvolumes
|
||||
.IR MaxPhysicalVolumes ]
|
||||
.RB [ \-\- [ vg ] metadatacopies
|
||||
.IR NumberOfCopies | unmanaged | all ]
|
||||
.RB [ \-n | \-\-name
|
||||
.IR LogicalVolumeName ]
|
||||
.RB [ \-t | \-\-test ]
|
||||
.RB [ \-v | \-\-verbose ]
|
||||
.I SourceVolumeGroupName DestinationVolumeGroupName
|
||||
.RI [ PhysicalVolumePath ...]
|
||||
.SH DESCRIPTION
|
||||
vgsplit moves one or more physical volumes from
|
||||
\fISourceVolumeGroupName\fP into \fIDestinationVolumeGroupName\fP.
|
||||
The physical volumes moved can be specified either explicitly via
|
||||
\fIPhysicalVolumePath\fP, or implicitly by \fB\-n\fP
|
||||
\fILogicalVolumeName\fP, in which case only physical volumes
|
||||
underlying the specified logical volume will be moved.
|
||||
|
||||
If \fIDestinationVolumeGroupName\fP does not exist, a new volume
|
||||
group will be created. The default attributes
|
||||
for the new volume group can be specified with
|
||||
.BR \-\-alloc ,
|
||||
.BR \-\-clustered ,
|
||||
.BR \-\-maxlogicalvolumes ,
|
||||
.BR \-\-metadatatype ,
|
||||
.B \-\-maxphysicalvolumes \fRand
|
||||
.BR \-\- [ vg ] metadatacopies
|
||||
(see \fBvgcreate\fP(8) for a description of these options). If any
|
||||
of these options are not given, default attribute(s) are taken from
|
||||
\fISourceVolumeGroupName\fP. If a non-LVM2 metadata type (e.g. lvm1) is
|
||||
being used, you should use the \fB\-M\fP option to specify the metadata
|
||||
type directly.
|
||||
|
||||
If
|
||||
.I DestinationVolumeGroupName
|
||||
does exist, it will be checked for compatibility with
|
||||
.I SourceVolumeGroupName
|
||||
before the physical volumes are moved. Specifying any of the above default
|
||||
volume group attributes with an existing destination volume group is an error,
|
||||
and no split will occur.
|
||||
|
||||
Logical volumes cannot be split between volume groups. \fBvgsplit\fP(8) only
|
||||
moves complete physical volumes: To move part of a physical volume, use
|
||||
\fBpvmove\fP(8). Each existing logical volume must be entirely on the physical
|
||||
volumes forming either the source or the destination volume group. For this
|
||||
reason, \fBvgsplit\fP(8) may fail with an error if a split would result in a
|
||||
logical volume being split across volume groups.
|
||||
|
||||
A vgsplit into an existing volume group retains the existing volume group's
|
||||
value of \fPvgmetadatacopies\fP (see \fBvgcreate\fP(8) and \fBlvm.conf\fP(5) for further
|
||||
explanation of \fPvgmetadatacopies\fP). To change the value of
|
||||
\fBvgmetadatacopies\fP, use \fBvgchange\fP(8).
|
||||
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP(8) for common options.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR vgcreate (8),
|
||||
.BR vgextend (8),
|
||||
.BR vgreduce (8),
|
||||
.BR vgmerge (8)
|
@@ -1,18 +0,0 @@
|
||||
.SH NOTES
|
||||
.
|
||||
.IP \[bu] 3
|
||||
vgsplit moves one or more PVs from a source VG to a destination VG. The
|
||||
PVs can be specified explicitly or implicitly by naming an LV, in which
|
||||
case on PVs underlying the LV are moved.
|
||||
|
||||
.IP \[bu] 3
|
||||
If the destination VG does not exist, a new VG is created (command options
|
||||
can be used to specify properties of the new VG.)
|
||||
|
||||
.IP \[bu] 3
|
||||
LVs cannot be split between VGs; each LV must be entirely on the PVs in
|
||||
the source or destination VG.
|
||||
|
||||
.IP \[bu] 3
|
||||
vgsplit can only move complete PVs. (See pvmove for moving part of a PV.)
|
||||
|
@@ -16,7 +16,6 @@ from collections import OrderedDict
|
||||
import dbus
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
BUS_NAME = os.getenv('LVM_DBUS_NAME', 'com.redhat.lvmdbus1')
|
||||
BASE_INTERFACE = 'com.redhat.lvmdbus1'
|
||||
@@ -189,15 +188,10 @@ class RemoteInterface(object):
|
||||
|
||||
def __init__(
|
||||
self, dbus_object, interface, introspect,
|
||||
properties=None, timelimit=-1):
|
||||
properties=None):
|
||||
self.dbus_object = dbus_object
|
||||
self.interface = interface
|
||||
self.introspect = introspect
|
||||
self.tmo = 0
|
||||
|
||||
if timelimit >= 0:
|
||||
self.tmo = float(timelimit)
|
||||
self.tmo *= 1.10
|
||||
|
||||
self.dbus_interface = dbus.Interface(self.dbus_object, self.interface)
|
||||
self._set_props(properties)
|
||||
@@ -209,19 +203,7 @@ class RemoteInterface(object):
|
||||
return functools.partial(self, item)
|
||||
|
||||
def _wrapper(self, _method_name, *args, **kwargs):
|
||||
|
||||
# Lets see how long a method takes to execute, in call cases we should
|
||||
# return something when the time limit has been reached.
|
||||
start = time.time()
|
||||
result = getattr(self.dbus_interface, _method_name)(*args, **kwargs)
|
||||
end = time.time()
|
||||
|
||||
diff = end - start
|
||||
|
||||
if self.tmo > 0.0:
|
||||
if diff > self.tmo:
|
||||
std_err_print("\n Time exceeded: %f > %f %s" %
|
||||
(diff, self.tmo, _method_name))
|
||||
|
||||
if self.introspect:
|
||||
if 'RETURN_VALUE' in self.introspect[
|
||||
@@ -254,14 +236,13 @@ class ClientProxy(object):
|
||||
short_name = ClientProxy._intf_short_name(interface)
|
||||
self.short_interface_names.append(short_name)
|
||||
ro = RemoteInterface(self.dbus_object, interface, introspect,
|
||||
properties, timelimit=self.tmo)
|
||||
properties)
|
||||
setattr(self, short_name, ro)
|
||||
|
||||
def __init__(self, bus, object_path, interface_prop_hash=None,
|
||||
interfaces=None, timelimit=-1):
|
||||
interfaces=None):
|
||||
self.object_path = object_path
|
||||
self.short_interface_names = []
|
||||
self.tmo = timelimit
|
||||
self.dbus_object = bus.get_object(
|
||||
BUS_NAME, self.object_path, introspect=False)
|
||||
|
||||
|
@@ -1491,27 +1491,6 @@ wait_pvmove_lv_ready() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Holds device open with sleep which automatically expires after given timeout
|
||||
# Prints PID of running holding sleep process in background
|
||||
hold_device_open() {
|
||||
local vgname=$1
|
||||
local lvname=$2
|
||||
local sec=${3:-20} # default 20sec
|
||||
|
||||
sleep $sec < "$DM_DEV_DIR/$vgname/$lvname" >/dev/null 2>&1 &
|
||||
SLEEP_PID=$!
|
||||
# wait till device is openned
|
||||
for i in $(seq 1 50) ; do
|
||||
if test "$(dmsetup info --noheadings -c -o open $vgname-$lvname)" -ne 0 ; then
|
||||
echo "$SLEEP_PID"
|
||||
return
|
||||
fi
|
||||
sleep .1
|
||||
done
|
||||
|
||||
die "$vgname-$lvname expected to be openned, but it's not!"
|
||||
}
|
||||
|
||||
# return total memory size in kB units
|
||||
total_mem() {
|
||||
while IFS=":" read -r a b ; do
|
||||
|
@@ -1,69 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2016 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing to use,
|
||||
# modify, copy, or redistribute it subject to the terms and conditions
|
||||
# of the GNU General Public License v.2.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
SKIP_WITH_LVMLOCKD=1
|
||||
SKIP_WITH_LVMPOLLD=1
|
||||
|
||||
. lib/inittest
|
||||
|
||||
aux have_raid 1 10 1 || skip
|
||||
aux prepare_vg 6
|
||||
|
||||
#
|
||||
# FIXME: add multi-segment leg tests
|
||||
#
|
||||
|
||||
function _check_raid
|
||||
{
|
||||
local vg=$1
|
||||
shift
|
||||
local lv=$1
|
||||
shift
|
||||
local fail=$1
|
||||
shift
|
||||
local good=$1
|
||||
shift
|
||||
local devs=$*
|
||||
|
||||
aux wait_for_sync $vg $lv
|
||||
aux disable_dev --error --silent $devs
|
||||
mkfs.ext4 "$DM_DEV_DIR/$vg/$lv"
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv"
|
||||
check raid_leg_status $vg $lv "$fail"
|
||||
aux enable_dev --silent $devs
|
||||
lvs -a -o +devices $vg | tee out
|
||||
not grep unknown out
|
||||
lvchange --refresh $vg/$lv
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv"
|
||||
aux wait_for_sync $vg $lv
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv"
|
||||
check raid_leg_status $vg $lv "$good"
|
||||
}
|
||||
|
||||
# raid1 with transiently failing devices
|
||||
lv=4way
|
||||
lvcreate -aey --type raid1 -m 3 --ignoremonitoring -L 1 -n $lv $vg
|
||||
_check_raid $vg $lv "ADAD" "AAAA" $dev2 $dev4
|
||||
lvremove -y $vg/$lv
|
||||
|
||||
# raid6 with transiently failing devices
|
||||
lv=6way
|
||||
lvcreate -aey --type raid6 -i 4 --ignoremonitoring -L 1 -n $lv $vg
|
||||
_check_raid $vg $lv "ADADAA" "AAAAAA" $dev2 $dev4
|
||||
lvremove -y $vg/$lv
|
||||
|
||||
# raid10 with transiently failing devices
|
||||
lv=6way
|
||||
lvcreate -aey --type raid10 -i 3 -m 1 --ignoremonitoring -L 1 -n $lv $vg
|
||||
_check_raid $vg $lv "ADADDA" "AAAAAA" $dev2 $dev4 $dev5
|
||||
lvremove -y $vg/$lv
|
||||
|
||||
vgremove -f $vg
|
@@ -33,7 +33,7 @@ lvcreate -L3 -n cow $vg
|
||||
not lvconvert -s cow $vg/$lv1
|
||||
|
||||
# Use cached LV with 'striped' cow volume
|
||||
lvconvert -y -s $vg/$lv1 $vg/cow
|
||||
lvconvert -y -s $vg/$lv1 cow
|
||||
check lv_field $vg/cow segtype linear
|
||||
check lv_field $vg/$lv1 segtype cache
|
||||
|
||||
|
@@ -32,8 +32,7 @@ get_image_pvs() {
|
||||
aux have_raid 1 3 0 || skip
|
||||
|
||||
aux prepare_pvs 9
|
||||
# vgcreate -s 256k $vg $(cat DEVICES)
|
||||
vgcreate -s 2m $vg $(cat DEVICES)
|
||||
vgcreate -s 256k $vg $(cat DEVICES)
|
||||
|
||||
###########################################
|
||||
# RAID1 convert tests
|
||||
@@ -136,27 +135,15 @@ lvconvert --yes --splitmirrors 1 --name $lv2 $vg/$lv1 "$dev2"
|
||||
lvremove -ff $vg
|
||||
|
||||
###########################################
|
||||
# RAID1 split + trackchanges / merge with content check
|
||||
# RAID1 split + trackchanges / merge
|
||||
###########################################
|
||||
# 3-way to 2-way/linear
|
||||
lvcreate --type raid1 -m 2 -l 1 -n $lv1 $vg
|
||||
mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv1"
|
||||
lvcreate --type raid1 -m 2 -l 2 -n $lv1 $vg
|
||||
aux wait_for_sync $vg $lv1
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv1"
|
||||
lvconvert --splitmirrors 1 --trackchanges $vg/$lv1
|
||||
check lv_exists $vg $lv1
|
||||
check linear $vg ${lv1}_rimage_2
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/mapper/$vg-${lv1}_rimage_2"
|
||||
dd of="$DM_DEV_DIR/$vg/$lv1" if=/dev/zero bs=512 oflag=direct count=`blockdev --getsz "$DM_DEV_DIR/$vg/$lv1"`
|
||||
not fsck.ext4 -fn "$DM_DEV_DIR/$vg/$lv1"
|
||||
fsck.ext4 -fn "$DM_DEV_DIR/mapper/$vg-${lv1}_rimage_2"
|
||||
# FIXME: needed on tiny loop but not on real block backend ?
|
||||
lvchange --refresh $vg/$lv1
|
||||
lvconvert --merge $vg/${lv1}_rimage_2
|
||||
aux wait_for_sync $vg $lv1
|
||||
lvconvert --splitmirrors 1 --trackchanges $vg/$lv1
|
||||
not fsck.ext4 -fn "$DM_DEV_DIR/mapper/$vg-${lv1}_rimage_2"
|
||||
# FIXME: ensure no residual devices
|
||||
lvremove -ff $vg
|
||||
|
||||
|
@@ -50,12 +50,6 @@ not lvconvert --thin --thinpool $vg/tpool $vg/$lv1
|
||||
# Switch to 'writethrough' - this should be supported
|
||||
lvchange --cachemode writethrough $vg/$lv1
|
||||
|
||||
# FIXME
|
||||
# systemd on fc23 'strikes-in' and unmounts mnt
|
||||
# ATM the reason is unclear (bug in systemd, bad udev rules?)
|
||||
# as a workaround mount again and 'WARN' test
|
||||
should not mount "$DM_DEV_DIR/$vg/$lv1" mnt
|
||||
|
||||
lvconvert --thin $vg/$lv1 --originname extorg --thinpool $vg/tpool
|
||||
|
||||
# check cache exist as extorg-real
|
||||
|
@@ -29,7 +29,9 @@ snap_and_merge() {
|
||||
sync
|
||||
lvs -a $vg
|
||||
|
||||
SLEEP_PID=$(aux hold_device_open $vg $lv1 20)
|
||||
# keep device open to prevent instant merge
|
||||
sleep 20 < "$DM_DEV_DIR/$vg/$lv1" &
|
||||
SLEEP_PID=$!
|
||||
|
||||
# initiate background merge
|
||||
lvconvert -b --mergesnapshot $vg/$lv2
|
||||
|
@@ -24,6 +24,16 @@ fill() {
|
||||
die "Snapshot does not fit $1"
|
||||
}
|
||||
|
||||
# Wait until device is opened
|
||||
wait_for_open_() {
|
||||
for i in $(seq 1 50) ; do
|
||||
test $(dmsetup info --noheadings -c -o open $1) -ne 0 && return
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
die "$1 expected to be openned, but it's not!"
|
||||
}
|
||||
|
||||
cleanup_tail()
|
||||
{
|
||||
test -z "$SLEEP_PID" || kill $SLEEP_PID || true
|
||||
@@ -115,7 +125,10 @@ lvchange -ay $vg1
|
||||
check lv_field $vg1/$lv1 lv_active "$CHECK_ACTIVE"
|
||||
|
||||
# Test removal of opened (but unmounted) snapshot (device busy) for a while
|
||||
SLEEP_PID=$(aux hold_device_open $vg1 $lv1 60)
|
||||
sleep 120 < "$DM_DEV_DIR/$vg1/$lv1" &
|
||||
SLEEP_PID=$!
|
||||
|
||||
wait_for_open_ "$vg1-$lv1"
|
||||
|
||||
# Opened virtual snapshot device is not removable
|
||||
# it should retry device removal for a few seconds
|
||||
|
@@ -72,18 +72,18 @@ touch "$mntusedir/file$$"
|
||||
sync
|
||||
|
||||
# Running 'keeper' process sleep holds the block device still in use
|
||||
sleep 60 < "$mntusedir/file$$" >/dev/null 2>&1 &
|
||||
sleep 60 < "$mntusedir/file$$" &
|
||||
PID_SLEEP=$!
|
||||
|
||||
lvs -a $vg
|
||||
# Fill pool above 95% (to cause 'forced lazy umount)
|
||||
dd if=/dev/zero of="$mntdir/file$$" bs=256K count=20 conv=fdatasync
|
||||
|
||||
sync
|
||||
lvs -a $vg
|
||||
|
||||
# Could loop here for a few secs so dmeventd can do some work
|
||||
# In the worst case check only happens every 10 seconds :(
|
||||
# With low water mark it quickly discovers overflow and umounts $vg/$lv1
|
||||
# With low water mark it should react way faster
|
||||
for i in $(seq 1 12) ; do
|
||||
is_lv_opened_ "$vg/$lv1" || break
|
||||
test $i -lt 12 || die "$mntdir should have been unmounted by dmeventd!"
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) 2014-2016 Red Hat, Inc. All rights reserved.
|
||||
# Copyright (C) 2014 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing to use,
|
||||
# modify, copy, or redistribute it subject to the terms and conditions
|
||||
@@ -37,24 +37,15 @@ check lv_field $vg/snap thin_id "3"
|
||||
lvconvert --mergethin $vg/snap
|
||||
|
||||
umount mnt
|
||||
|
||||
check lv_field $vg/$lv1 thin_id "1"
|
||||
check lv_field $vg/pool transaction_id "3"
|
||||
|
||||
vgchange -an $vg
|
||||
|
||||
# Check reboot case
|
||||
vgchange -ay --sysinit $vg
|
||||
|
||||
# Check correct thin_id is shown after activation
|
||||
# even when metadata were not yet physically modified.
|
||||
# Merge take its place during activation,
|
||||
# but pool transaction_id still needs metadata update.
|
||||
check lv_field $vg/$lv1 thin_id "3"
|
||||
# Metadata are still not updated (--poll n)
|
||||
check lv_field $vg/$lv1 thin_id "1"
|
||||
check lv_field $vg/pool transaction_id "3"
|
||||
|
||||
# Check the metadata are updated after refresh
|
||||
#
|
||||
vgchange --refresh $vg
|
||||
check lv_field $vg/$lv1 thin_id "3"
|
||||
check lv_field $vg/pool transaction_id "4"
|
||||
|
@@ -53,13 +53,6 @@ not vgchange -p 2 $vg 2>err
|
||||
grep "MaxPhysicalVolumes is less than the current number $pv_count of PVs for" err
|
||||
check vg_field $vg max_pv 128
|
||||
|
||||
# try some numbers around MAX limit (uint32)
|
||||
vgchange -p 4294967295 $vg
|
||||
invalid vgchange -p 4294967296 $vg
|
||||
invalid vgchange -p 18446744073709551615 $vg
|
||||
invalid vgchange -p 18446744073709551616 $vg
|
||||
check vg_field $vg max_pv 4294967295
|
||||
|
||||
# vgchange -l MaxLogicalVolumes
|
||||
check vg_field $vg max_lv 0
|
||||
invalid vgchange -l -128 $vg
|
||||
|
@@ -1,4 +1,3 @@
|
||||
|
||||
#
|
||||
# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
|
||||
# Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
|
||||
@@ -18,7 +17,6 @@ top_srcdir = @top_srcdir@
|
||||
top_builddir = @top_builddir@
|
||||
|
||||
SOURCES =\
|
||||
command.c \
|
||||
dumpconfig.c \
|
||||
formats.c \
|
||||
lvchange.c \
|
||||
@@ -78,9 +76,7 @@ SOURCES2 =\
|
||||
|
||||
TARGETS =\
|
||||
.commands \
|
||||
cmds.h \
|
||||
command-count.h \
|
||||
command-lines-input.h \
|
||||
command-lines.h \
|
||||
liblvm2cmd.a \
|
||||
lvm
|
||||
|
||||
@@ -105,7 +101,7 @@ CLEAN_TARGETS = liblvm2cmd.$(LIB_SUFFIX) $(TARGETS_DM) \
|
||||
liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION) lvm-static.o \
|
||||
liblvm2cmd-static.a dmsetup.static lvm.static \
|
||||
$(LDDEPS) .exported_symbols_generated \
|
||||
command-lines-input.h command-lines-count.h
|
||||
ccmd command-lines.h command-lines-count.h
|
||||
|
||||
ifeq ("@CMDLIB@", "yes")
|
||||
TARGETS += liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION)
|
||||
@@ -144,8 +140,6 @@ all: device-mapper
|
||||
CFLAGS_lvm.o += $(EXTRA_EXEC_CFLAGS)
|
||||
CFLAGS_lvmcmdline.o += $(VALGRIND_CFLAGS)
|
||||
|
||||
INCLUDES += -I$(top_builddir)/tools
|
||||
|
||||
lvm: $(OBJECTS) lvm.o $(top_builddir)/lib/liblvm-internal.a
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) -o $@ $(OBJECTS) lvm.o \
|
||||
$(LVMLIBS) $(READLINE_LIBS) $(LIBS) -rdynamic
|
||||
@@ -179,32 +173,12 @@ liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION): liblvm2cmd.$(LIB_SUFFIX)
|
||||
$(CC) -E -P $(srcdir)/cmdnames.h 2> /dev/null | \
|
||||
egrep -v '^ *(|#.*|config|devtypes|dumpconfig|formats|fullreport|help|lastlog|lvpoll|pvdata|segtypes|systemid|tags|version) *$$' > .commands
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
ccmd: create-commands.c
|
||||
$(CC) create-commands.c -o ccmd
|
||||
|
||||
# move properly to configure
|
||||
WC = /usr/bin/wc
|
||||
GREP = /bin/grep
|
||||
SORT = /bin/sort
|
||||
CUT = /bin/cut
|
||||
SED = /bin/sed
|
||||
|
||||
# FIXME Add licence text from template file
|
||||
|
||||
command-count.h: $(srcdir)/command-lines.in Makefile
|
||||
set -o pipefail && \
|
||||
(echo -n "#define COMMAND_COUNT " && \
|
||||
$(GREP) '^ID:' $(srcdir)/command-lines.in | $(WC) -l \
|
||||
) > $@
|
||||
|
||||
cmds.h: $(srcdir)/command-lines.in Makefile
|
||||
echo "cmd(CMD_NONE, none)" > cmds.h
|
||||
cat command-lines.in | grep '^ID:' | sort | uniq | awk '{print "cmd(" $$2 "_CMD, " $$2 ")"}' >> cmds.h
|
||||
echo "cmd(CMD_COUNT, count)" >> cmds.h
|
||||
|
||||
command-lines-input.h: $(srcdir)/command-lines.in Makefile
|
||||
$(srcdir)/command-lines-input.sh
|
||||
|
||||
$(SOURCES:%.c=%.d): command-lines-input.h command-count.h cmds.h
|
||||
command-lines.h: ccmd
|
||||
./ccmd --output struct command-lines.in > command-lines.h
|
||||
./ccmd --output count command-lines.in > command-lines-count.h
|
||||
|
||||
ifneq ("$(CFLOW_CMD)", "")
|
||||
CFLOW_SOURCES = $(addprefix $(srcdir)/, $(SOURCES))
|
||||
|
1579
tools/args.h
1579
tools/args.h
File diff suppressed because it is too large
Load Diff
997
tools/ccmd-man.c
997
tools/ccmd-man.c
@@ -1,997 +0,0 @@
|
||||
#include <asm/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include <sched.h>
|
||||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "ccmd.h"
|
||||
|
||||
char *split_line(char *buf, int *argc, char **argv, char sep);
|
||||
struct cmd_name *find_command_name(const char *str);
|
||||
int is_lvm_all_opt(int opt);
|
||||
const char *lvt_enum_to_name(int lvt_enum);
|
||||
|
||||
extern struct val_name val_names[VAL_COUNT + 1];
|
||||
extern struct opt_name opt_names[ARG_COUNT + 1];
|
||||
extern struct lvp_name lvp_names[LVP_COUNT + 1];
|
||||
extern struct lvt_name lvt_names[LVT_COUNT + 1];
|
||||
extern struct cmd_name cmd_names[MAX_CMD_NAMES];
|
||||
extern struct opt_name *opt_names_alpha[ARG_COUNT + 1];
|
||||
extern struct command lvm_all;
|
||||
|
||||
static const char *cmd_name_desc(const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_CMD_NAMES; i++) {
|
||||
if (!cmd_names[i].name)
|
||||
break;
|
||||
if (!strcmp(cmd_names[i].name, name))
|
||||
return cmd_names[i].desc;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void print_val_man(const char *str)
|
||||
{
|
||||
char *line;
|
||||
char *line_argv[MAX_LINE_ARGC];
|
||||
int line_argc;
|
||||
int i;
|
||||
|
||||
if (!strcmp(str, "Number") ||
|
||||
!strcmp(str, "String") ||
|
||||
!strncmp(str, "VG", 2) ||
|
||||
!strncmp(str, "LV", 2) ||
|
||||
!strncmp(str, "PV", 2) ||
|
||||
!strcmp(str, "Tag")) {
|
||||
printf("\\fI%s\\fP", str);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strstr(str, "Number[") || strstr(str, "]Number")) {
|
||||
for (i = 0; i < strlen(str); i++) {
|
||||
if (str[i] == 'N')
|
||||
printf("\\fI");
|
||||
if (str[i] == 'r') {
|
||||
printf("%c", str[i]);
|
||||
printf("\\fP");
|
||||
continue;
|
||||
}
|
||||
printf("%c", str[i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (strstr(str, "|")) {
|
||||
int len = strlen(str);
|
||||
line = strdup(str);
|
||||
split_line(line, &line_argc, line_argv, '|');
|
||||
for (i = 0; i < line_argc; i++) {
|
||||
if (i) {
|
||||
printf("|");
|
||||
|
||||
/* this is a hack to add a line break for
|
||||
a long string of opt values */
|
||||
if ((len > 40) && (i >= (line_argc / 2) + 1)) {
|
||||
printf("\n");
|
||||
printf(" ");
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
if (strstr(line_argv[i], "Number"))
|
||||
printf("\\fI%s\\fP", line_argv[i]);
|
||||
else
|
||||
printf("\\fB%s\\fP", line_argv[i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\\fB%s\\fP", str);
|
||||
}
|
||||
|
||||
static void print_def_man(struct arg_def *def, int usage)
|
||||
{
|
||||
int val_enum;
|
||||
int lvt_enum;
|
||||
int sep = 0;
|
||||
int i;
|
||||
|
||||
for (val_enum = 0; val_enum < VAL_COUNT; val_enum++) {
|
||||
if (def->val_bits & val_enum_to_bit(val_enum)) {
|
||||
|
||||
if (val_enum == conststr_VAL) {
|
||||
printf("\\fB");
|
||||
printf("%s", def->str);
|
||||
printf("\\fP");
|
||||
}
|
||||
|
||||
else if (val_enum == constnum_VAL) {
|
||||
printf("\\fB");
|
||||
printf("%llu", (unsigned long long)def->num);
|
||||
printf("\\fP");
|
||||
}
|
||||
|
||||
else {
|
||||
if (sep) printf("|");
|
||||
|
||||
if (!usage || !val_names[val_enum].usage) {
|
||||
printf("\\fI");
|
||||
printf("%s", val_names[val_enum].name);
|
||||
printf("\\fP");
|
||||
} else {
|
||||
print_val_man(val_names[val_enum].usage);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
if (val_enum == lv_VAL && def->lvt_bits) {
|
||||
printf("\\fI");
|
||||
for (lvt_enum = 1; lvt_enum < LVT_COUNT; lvt_enum++) {
|
||||
if (lvt_bit_is_set(def->lvt_bits, lvt_enum))
|
||||
printf("_%s", lvt_enum_to_name(lvt_enum));
|
||||
}
|
||||
printf("\\fP");
|
||||
}
|
||||
|
||||
if ((val_enum == vg_VAL) && (def->flags & ARG_DEF_FLAG_NEW_VG)) {
|
||||
printf("\\fI");
|
||||
printf("_new");
|
||||
printf("\\fP");
|
||||
}
|
||||
if ((val_enum == lv_VAL) && (def->flags & ARG_DEF_FLAG_NEW_LV)) {
|
||||
printf("\\fI");
|
||||
printf("_new");
|
||||
printf("\\fP");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (def->flags & ARG_DEF_FLAG_MAY_REPEAT)
|
||||
printf(" ...");
|
||||
}
|
||||
|
||||
static char *man_long_opt_name(const char *cmdname, int opt_enum)
|
||||
{
|
||||
static char long_opt_name[64];
|
||||
|
||||
memset(&long_opt_name, 0, sizeof(long_opt_name));
|
||||
|
||||
switch (opt_enum) {
|
||||
case syncaction_ARG:
|
||||
strncpy(long_opt_name, "--[raid]syncaction", 63);
|
||||
break;
|
||||
case writemostly_ARG:
|
||||
strncpy(long_opt_name, "--[raid]writemostly", 63);
|
||||
break;
|
||||
case minrecoveryrate_ARG:
|
||||
strncpy(long_opt_name, "--[raid]minrecoveryrate", 63);
|
||||
break;
|
||||
case maxrecoveryrate_ARG:
|
||||
strncpy(long_opt_name, "--[raid]maxrecoveryrate", 63);
|
||||
break;
|
||||
case writebehind_ARG:
|
||||
strncpy(long_opt_name, "--[raid]writebehind", 63);
|
||||
break;
|
||||
case vgmetadatacopies_ARG:
|
||||
if (!strncmp(cmdname, "vg", 2))
|
||||
strncpy(long_opt_name, "--[vg]metadatacopies", 63);
|
||||
else
|
||||
strncpy(long_opt_name, "--vgmetadatacopies", 63);
|
||||
break;
|
||||
case pvmetadatacopies_ARG:
|
||||
if (!strncmp(cmdname, "pv", 2))
|
||||
strncpy(long_opt_name, "--[pv]metadatacopies", 63);
|
||||
else
|
||||
strncpy(long_opt_name, "--pvmetadatacopies", 63);
|
||||
break;
|
||||
default:
|
||||
strncpy(long_opt_name, opt_names[opt_enum].long_opt, 63);
|
||||
break;
|
||||
}
|
||||
|
||||
return long_opt_name;
|
||||
}
|
||||
|
||||
void print_man_usage(struct command *cmd)
|
||||
{
|
||||
struct cmd_name *cname;
|
||||
int onereq = (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT) ? 1 : 0;
|
||||
int i, sep, ro, rp, oo, op, opt_enum;
|
||||
|
||||
if (!(cname = find_command_name(cmd->name)))
|
||||
return;
|
||||
|
||||
printf("\\fB%s\\fP", cmd->name);
|
||||
|
||||
if (!onereq)
|
||||
goto ro_normal;
|
||||
|
||||
/*
|
||||
* one required option in a set, print as:
|
||||
* ( -a|--a,
|
||||
* -b|--b,
|
||||
* --c,
|
||||
* --d )
|
||||
*
|
||||
* First loop through ro prints those with short opts,
|
||||
* and the second loop prints those without short opts.
|
||||
*/
|
||||
|
||||
if (cmd->ro_count) {
|
||||
printf("\n");
|
||||
printf(".RS 4\n");
|
||||
printf("(");
|
||||
|
||||
sep = 0;
|
||||
|
||||
/* print required options with a short opt */
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (!opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
if (opt_names[opt_enum].short_opt) {
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd->name, opt_enum));
|
||||
} else {
|
||||
printf(" ");
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
|
||||
}
|
||||
|
||||
if (cmd->required_opt_args[ro].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->required_opt_args[ro].def, 1);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
/* print required options without a short opt */
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
printf(" ");
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
|
||||
|
||||
if (cmd->required_opt_args[ro].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->required_opt_args[ro].def, 1);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
printf(" )\n");
|
||||
printf(".RE\n");
|
||||
}
|
||||
|
||||
/* print required position args on a new line after the onereq set */
|
||||
if (cmd->rp_count) {
|
||||
printf(".RS 4\n");
|
||||
for (rp = 0; rp < cmd->rp_count; rp++) {
|
||||
if (cmd->required_pos_args[rp].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->required_pos_args[rp].def, 1);
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
printf(".RE\n");
|
||||
} else {
|
||||
/* printf("\n"); */
|
||||
}
|
||||
|
||||
printf(".br\n");
|
||||
goto oo_count;
|
||||
|
||||
ro_normal:
|
||||
|
||||
/*
|
||||
* all are required options, print as:
|
||||
* -a|--aaa <val> -b|--bbb <val>
|
||||
*/
|
||||
|
||||
if (cmd->ro_count) {
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (opt_names[opt_enum].short_opt) {
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd->name, opt_enum));
|
||||
} else {
|
||||
printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
}
|
||||
|
||||
if (cmd->required_opt_args[ro].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->required_opt_args[ro].def, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* print required position args on the same line as the required options */
|
||||
if (cmd->rp_count) {
|
||||
for (rp = 0; rp < cmd->rp_count; rp++) {
|
||||
if (cmd->required_pos_args[rp].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->required_pos_args[rp].def, 1);
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf(".br\n");
|
||||
|
||||
oo_count:
|
||||
if (!cmd->oo_count)
|
||||
goto op_count;
|
||||
|
||||
sep = 0;
|
||||
|
||||
if (cmd->oo_count) {
|
||||
printf(".RS 4\n");
|
||||
printf("[");
|
||||
|
||||
/* print optional options with short opts */
|
||||
|
||||
for (oo = 0; oo < cmd->oo_count; oo++) {
|
||||
opt_enum = cmd->optional_opt_args[oo].opt;
|
||||
|
||||
if (!opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Skip common opts which are in the usage_common string.
|
||||
* The common opts are those in lvm_all and in
|
||||
* cname->common_options.
|
||||
*/
|
||||
|
||||
if (is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if ((cname->variants > 1) && cname->common_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd->name, opt_enum));
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->optional_opt_args[oo].def, 1);
|
||||
}
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
/* print optional options without short opts */
|
||||
|
||||
for (oo = 0; oo < cmd->oo_count; oo++) {
|
||||
opt_enum = cmd->optional_opt_args[oo].opt;
|
||||
|
||||
if (opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Skip common opts which are in the usage_common string.
|
||||
* The common opts are those in lvm_all and in
|
||||
* cname->common_options.
|
||||
*/
|
||||
|
||||
if (is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if ((cname->variants > 1) && cname->common_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->optional_opt_args[oo].def, 1);
|
||||
}
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
}
|
||||
printf(" COMMON_OPTIONS");
|
||||
printf(" ]\n");
|
||||
printf(".RE\n");
|
||||
printf(".br\n");
|
||||
}
|
||||
|
||||
op_count:
|
||||
if (!cmd->op_count)
|
||||
goto done;
|
||||
|
||||
printf(".RS 4\n");
|
||||
printf("[");
|
||||
|
||||
if (cmd->op_count) {
|
||||
for (op = 0; op < cmd->op_count; op++) {
|
||||
if (cmd->optional_pos_args[op].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->optional_pos_args[op].def, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf(" ]\n");
|
||||
printf(".RE\n");
|
||||
|
||||
done:
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* common options listed in the usage section.
|
||||
*
|
||||
* For commands with only one variant, this is only
|
||||
* the options which are common to all lvm commands
|
||||
* (in lvm_all, see is_lvm_all_opt).
|
||||
*
|
||||
* For commands with more than one variant, this
|
||||
* is the set of options common to all variants
|
||||
* (in cname->common_options), (which obviously
|
||||
* includes the options common to all lvm commands.)
|
||||
*
|
||||
* List ordering:
|
||||
* options with short+long names, alphabetically,
|
||||
* then options with only long names, alphabetically
|
||||
*/
|
||||
|
||||
void print_man_usage_common(struct command *cmd)
|
||||
{
|
||||
struct cmd_name *cname;
|
||||
int i, sep, ro, rp, oo, op, opt_enum;
|
||||
|
||||
if (!(cname = find_command_name(cmd->name)))
|
||||
return;
|
||||
|
||||
sep = 0;
|
||||
|
||||
printf(".RS 4\n");
|
||||
printf("[");
|
||||
|
||||
/* print those with short opts */
|
||||
for (i = 0; i < ARG_COUNT; i++) {
|
||||
opt_enum = opt_names_alpha[i]->opt_enum;
|
||||
|
||||
if (!cname->common_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (!opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
for (oo = 0; oo < cmd->oo_count; oo++) {
|
||||
if (cmd->optional_opt_args[oo].opt != opt_enum)
|
||||
continue;
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd->name, opt_enum));
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->optional_opt_args[oo].def, 1);
|
||||
}
|
||||
sep = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* print those without short opts */
|
||||
for (i = 0; i < ARG_COUNT; i++) {
|
||||
opt_enum = opt_names_alpha[i]->opt_enum;
|
||||
|
||||
if (!cname->common_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
printf(",");
|
||||
printf("\n.br\n");
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
for (oo = 0; oo < cmd->oo_count; oo++) {
|
||||
if (cmd->optional_opt_args[oo].opt != opt_enum)
|
||||
continue;
|
||||
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
print_def_man(&cmd->optional_opt_args[oo].def, 1);
|
||||
}
|
||||
sep = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf(" ]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Format of description, when different command names have
|
||||
* different descriptions:
|
||||
*
|
||||
* "#cmdname1"
|
||||
* "text foo goes here"
|
||||
* "a second line of text."
|
||||
* "#cmdname2"
|
||||
* "text bar goes here"
|
||||
* "another line of text."
|
||||
*
|
||||
* When called for cmdname2, this function should just print:
|
||||
*
|
||||
* "text bar goes here"
|
||||
* "another line of text."
|
||||
*/
|
||||
|
||||
static void print_man_option_desc(struct cmd_name *cname, int opt_enum)
|
||||
{
|
||||
const char *desc = opt_names[opt_enum].desc;
|
||||
char buf[DESC_LINE];
|
||||
int started_cname = 0;
|
||||
int line_count = 0;
|
||||
int di, bi = 0;
|
||||
|
||||
if (desc[0] != '#') {
|
||||
printf("%s", desc);
|
||||
return;
|
||||
}
|
||||
|
||||
for (di = 0; di < strlen(desc); di++) {
|
||||
buf[bi++] = desc[di];
|
||||
|
||||
if (bi == DESC_LINE) {
|
||||
printf("print_man_option_desc line too long\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (buf[bi-1] != '\n')
|
||||
continue;
|
||||
|
||||
if (buf[0] != '#') {
|
||||
if (started_cname) {
|
||||
printf("%s", buf);
|
||||
line_count++;
|
||||
}
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
bi = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Line starting with #cmdname */
|
||||
|
||||
/*
|
||||
* Must be starting a new command name.
|
||||
* If no lines have been printed, multiple command names
|
||||
* are using the same text. If lines have been printed,
|
||||
* then the start of a new command name means the end
|
||||
* of text for the current command name.
|
||||
*/
|
||||
if (line_count && started_cname)
|
||||
return;
|
||||
|
||||
if (!strncmp(buf + 1, cname->name, strlen(cname->name))) {
|
||||
/* The start of our command name. */
|
||||
started_cname = 1;
|
||||
memset(buf, 0, sizeof(buf));
|
||||
bi = 0;
|
||||
} else {
|
||||
/* The start of another command name. */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
bi = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (bi && started_cname)
|
||||
printf("%s", buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a list of all options names for a given
|
||||
* command name, listed by:
|
||||
* options with short+long names, alphabetically,
|
||||
* then options with only long names, alphabetically
|
||||
*/
|
||||
|
||||
void print_man_all_options_list(struct cmd_name *cname)
|
||||
{
|
||||
int opt_enum, val_enum;
|
||||
int sep = 0;
|
||||
int i;
|
||||
|
||||
/* print those with both short and long opts */
|
||||
for (i = 0; i < ARG_COUNT; i++) {
|
||||
opt_enum = opt_names_alpha[i]->opt_enum;
|
||||
|
||||
|
||||
if (!cname->all_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (!opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep)
|
||||
printf("\n.br\n");
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cname->name, opt_enum));
|
||||
|
||||
val_enum = opt_names[opt_enum].val_enum;
|
||||
|
||||
if (!val_names[val_enum].fn) {
|
||||
/* takes no arg */
|
||||
} else if (!val_names[val_enum].usage) {
|
||||
printf(" ");
|
||||
printf("\\fI");
|
||||
printf("%s", val_names[val_enum].name);
|
||||
printf("\\fP");
|
||||
} else {
|
||||
printf(" ");
|
||||
print_val_man(val_names[val_enum].usage);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
/* print those without short opts */
|
||||
for (i = 0; i < ARG_COUNT; i++) {
|
||||
opt_enum = opt_names_alpha[i]->opt_enum;
|
||||
|
||||
if (!cname->all_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (opt_names[opt_enum].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep)
|
||||
printf("\n.br\n");
|
||||
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
|
||||
|
||||
val_enum = opt_names[opt_enum].val_enum;
|
||||
|
||||
if (!val_names[val_enum].fn) {
|
||||
/* takes no arg */
|
||||
} else if (!val_names[val_enum].usage) {
|
||||
printf(" ");
|
||||
printf("\\fI");
|
||||
printf("%s", val_names[val_enum].name);
|
||||
printf("\\fP");
|
||||
} else {
|
||||
printf(" ");
|
||||
print_val_man(val_names[val_enum].usage);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* All options used for a given command name, along with descriptions.
|
||||
* listed in order of:
|
||||
* 1. options that are not common to all lvm commands, alphabetically
|
||||
* 2. options common to all lvm commands, alphabetically
|
||||
*/
|
||||
|
||||
void print_man_all_options_desc(struct cmd_name *cname)
|
||||
{
|
||||
int opt_enum, val_enum;
|
||||
int print_common = 0;
|
||||
int sep = 0;
|
||||
int i;
|
||||
|
||||
again:
|
||||
/*
|
||||
* Loop 1: print options that are not common to all lvm commands.
|
||||
* Loop 2: print options common to all lvm commands (lvm_all)
|
||||
*/
|
||||
|
||||
for (i = 0; i < ARG_COUNT; i++) {
|
||||
opt_enum = opt_names_alpha[i]->opt_enum;
|
||||
|
||||
if (!cname->all_options[opt_enum])
|
||||
continue;
|
||||
|
||||
if (!print_common && is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if (print_common && !is_lvm_all_opt(opt_enum))
|
||||
continue;
|
||||
|
||||
if (sep)
|
||||
printf("\n.br\n");
|
||||
|
||||
printf("\n.TP\n");
|
||||
|
||||
if (opt_names[opt_enum].short_opt) {
|
||||
printf("\\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cname->name, opt_enum));
|
||||
} else {
|
||||
printf("\\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
|
||||
}
|
||||
|
||||
val_enum = opt_names[opt_enum].val_enum;
|
||||
|
||||
if (!val_names[val_enum].fn) {
|
||||
/* takes no arg */
|
||||
} else if (!val_names[val_enum].usage) {
|
||||
printf(" ");
|
||||
printf("\\fI");
|
||||
printf("%s", val_names[val_enum].name);
|
||||
printf("\\fP");
|
||||
} else {
|
||||
printf(" ");
|
||||
print_val_man(val_names[val_enum].usage);
|
||||
}
|
||||
|
||||
if (opt_names[opt_enum].desc) {
|
||||
printf("\n");
|
||||
printf(".br\n");
|
||||
print_man_option_desc(cname, opt_enum);
|
||||
}
|
||||
|
||||
sep = 1;
|
||||
}
|
||||
|
||||
if (!print_common) {
|
||||
print_common = 1;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
void print_desc_man(const char *desc)
|
||||
{
|
||||
char buf[DESC_LINE] = {0};
|
||||
int di = 0;
|
||||
int bi = 0;
|
||||
|
||||
for (di = 0; di < strlen(desc); di++) {
|
||||
if (desc[di] == '\0')
|
||||
break;
|
||||
if (desc[di] == '\n')
|
||||
continue;
|
||||
|
||||
if (!strncmp(&desc[di], "DESC:", 5)) {
|
||||
if (bi) {
|
||||
printf("%s\n", buf);
|
||||
printf(".br\n");
|
||||
memset(buf, 0, sizeof(buf));
|
||||
bi = 0;
|
||||
}
|
||||
di += 5;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!bi && desc[di] == ' ')
|
||||
continue;
|
||||
|
||||
buf[bi++] = desc[di];
|
||||
|
||||
if (bi == (DESC_LINE - 1))
|
||||
break;
|
||||
}
|
||||
|
||||
if (bi) {
|
||||
printf("%s\n", buf);
|
||||
printf(".br\n");
|
||||
}
|
||||
}
|
||||
|
||||
static char *upper_command_name(char *str)
|
||||
{
|
||||
static char str_upper[32];
|
||||
int i = 0;
|
||||
|
||||
while (*str) {
|
||||
str_upper[i++] = toupper(*str);
|
||||
str++;
|
||||
}
|
||||
str_upper[i] = '\0';
|
||||
return str_upper;
|
||||
}
|
||||
|
||||
void print_man(char *man_command_name, int include_primary, int include_secondary)
|
||||
{
|
||||
struct cmd_name *cname;
|
||||
struct command *cmd, *prev_cmd = NULL;
|
||||
const char *desc;
|
||||
int i, j, ro, rp, oo, op;
|
||||
|
||||
printf(".TH %s 8 \"LVM TOOLS #VERSION#\" \"Sistina Software UK\"\n",
|
||||
man_command_name ? upper_command_name(man_command_name) : "LVM_COMMANDS");
|
||||
|
||||
for (i = 0; i < cmd_count; i++) {
|
||||
|
||||
cmd = &cmd_array[i];
|
||||
|
||||
if (prev_cmd && strcmp(prev_cmd->name, cmd->name)) {
|
||||
printf("Common options:\n");
|
||||
printf(".\n");
|
||||
print_man_usage_common(prev_cmd);
|
||||
|
||||
printf("\n");
|
||||
printf(".SH OPTIONS\n");
|
||||
printf(".br\n");
|
||||
print_man_all_options_desc(cname);
|
||||
|
||||
prev_cmd = NULL;
|
||||
}
|
||||
|
||||
if ((cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_secondary)
|
||||
continue;
|
||||
|
||||
if (!(cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_primary)
|
||||
continue;
|
||||
|
||||
if (man_command_name && strcmp(man_command_name, cmd->name))
|
||||
continue;
|
||||
|
||||
if (!prev_cmd || strcmp(prev_cmd->name, cmd->name)) {
|
||||
printf(".SH NAME\n");
|
||||
printf(".\n");
|
||||
if ((desc = cmd_name_desc(cmd->name)))
|
||||
printf("%s \\- %s\n", cmd->name, desc);
|
||||
else
|
||||
printf("%s\n", cmd->name);
|
||||
printf(".br\n");
|
||||
printf(".P\n");
|
||||
printf(".\n");
|
||||
printf(".SH SYNOPSIS\n");
|
||||
printf(".br\n");
|
||||
printf(".P\n");
|
||||
printf(".\n");
|
||||
prev_cmd = cmd;
|
||||
|
||||
if (!(cname = find_command_name(cmd->name)))
|
||||
return;
|
||||
|
||||
if (cname->variant_has_ro && cname->variant_has_rp)
|
||||
printf("\\fB%s\\fP \\fIrequired_option_args\\fP \\fIrequired_position_args\\fP\n", cmd->name);
|
||||
else if (cname->variant_has_ro && !cname->variant_has_rp)
|
||||
printf("\\fB%s\\fP \\fIrequired_option_args\\fP\n", cmd->name);
|
||||
else if (!cname->variant_has_ro && cname->variant_has_rp)
|
||||
printf("\\fB%s\\fP \\fIrequired_position_args\\fP\n", cmd->name);
|
||||
else if (!cname->variant_has_ro && !cname->variant_has_rp)
|
||||
printf("\\fB%s\\fP\n", cmd->name);
|
||||
|
||||
printf(".br\n");
|
||||
|
||||
if (cname->variant_has_oo) {
|
||||
printf(" [ \\fIoptional_option_args\\fP ]\n");
|
||||
printf(".br\n");
|
||||
}
|
||||
|
||||
if (cname->variant_has_op) {
|
||||
printf(" [ \\fIoptional_position_args\\fP ]\n");
|
||||
printf(".br\n");
|
||||
}
|
||||
|
||||
printf(".P\n");
|
||||
printf("\n");
|
||||
|
||||
/* listing them all when there's only 1 or 2 is just repetative */
|
||||
if (cname->variants > 2) {
|
||||
printf(".P\n");
|
||||
print_man_all_options_list(cname);
|
||||
printf("\n");
|
||||
printf(".P\n");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf(".SH USAGE\n");
|
||||
printf(".br\n");
|
||||
printf(".P\n");
|
||||
printf(".\n");
|
||||
}
|
||||
|
||||
if (cmd->desc) {
|
||||
print_desc_man(cmd->desc);
|
||||
printf(".P\n");
|
||||
}
|
||||
|
||||
print_man_usage(cmd);
|
||||
|
||||
if (i == (cmd_count - 1)) {
|
||||
printf("Common options:\n");
|
||||
printf(".\n");
|
||||
print_man_usage_common(cmd);
|
||||
|
||||
printf("\n");
|
||||
printf(".SH OPTIONS\n");
|
||||
printf(".br\n");
|
||||
print_man_all_options_desc(cname);
|
||||
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@@ -1,11 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cat command-lines.in | grep -v '^#' | grep -v '\-\-\-' | grep -v '^$' > command-lines.tmp
|
||||
echo "" >> command-lines.tmp
|
||||
echo "const char _command_input[] =" > command-lines-input.h
|
||||
while read -r line; do
|
||||
echo "" >> command-lines-input.h
|
||||
printf '\"%s\\n\"' "$line" >> command-lines-input.h
|
||||
done < command-lines.tmp
|
||||
echo ";" >> command-lines-input.h
|
||||
|
@@ -106,7 +106,6 @@
|
||||
# maxrecoveryrate (raidmaxrecoveryrate)
|
||||
# writebehind (raidwritebehind)
|
||||
# virtualsize (virtualoriginsize)
|
||||
# splitcache (split)
|
||||
# vgmetadatacopies (metadatacopies)
|
||||
# pvmetadatacopies (metadatacopies)
|
||||
#
|
||||
@@ -265,7 +264,7 @@ RULE: --alloc --discards --zero --cachemode --cachepolicy --cachesettings not lv
|
||||
# like above, it was previouly allowed in combination.
|
||||
|
||||
lvchange --resync VG|LV_raid_mirror|Tag|Select ...
|
||||
OO: --activate Active, OO_LVCHANGE
|
||||
OO: --activate Activate, OO_LVCHANGE
|
||||
ID: lvchange_resync
|
||||
DESC: Resyncronize a mirror or raid LV.
|
||||
RULE: all not lv_is_pvmove lv_is_locked
|
||||
@@ -398,18 +397,18 @@ RULE: all not lv_is_locked lv_is_pvmove
|
||||
# lvconvert utilities for creating/maintaining thin and cache objects.
|
||||
# Create a new command set for these and migrate them out of lvconvert?
|
||||
|
||||
lvconvert --type thin --thinpool LV LV_linear_striped_raid_cache
|
||||
lvconvert --type thin --thinpool LV LV_linear_striped_raid
|
||||
OO: --thin, --originname LV_new, --zero Bool, OO_LVCONVERT_POOL, OO_LVCONVERT
|
||||
ID: lvconvert_to_thin_with_external
|
||||
DESC: Convert LV to a thin LV, using the original LV as an external origin.
|
||||
DESC: Convert LV to type thin with an external origin.
|
||||
RULE: all and lv_is_visible
|
||||
RULE: all not lv_is_locked
|
||||
|
||||
# alternate form of lvconvert --type thin
|
||||
lvconvert --thin --thinpool LV LV_linear_striped_raid_cache
|
||||
lvconvert --thin --thinpool LV LV_linear_striped_raid
|
||||
OO: --type thin, --originname LV_new, --zero Bool, OO_LVCONVERT_POOL, OO_LVCONVERT
|
||||
ID: lvconvert_to_thin_with_external
|
||||
DESC: Convert LV to a thin LV, using the original LV as an external origin.
|
||||
DESC: Convert LV to type thin with an external origin
|
||||
DESC: (variant, infers --type thin).
|
||||
FLAGS: SECONDARY_SYNTAX
|
||||
RULE: all and lv_is_visible
|
||||
@@ -518,15 +517,6 @@ FLAGS: SECONDARY_SYNTAX
|
||||
|
||||
---
|
||||
|
||||
lvconvert --mergethin LV_thin ...
|
||||
OO: OO_LVCONVERT
|
||||
ID: lvconvert_merge_thin
|
||||
DESC: Merge thin LV into its origin LV.
|
||||
RULE: all not lv_is_locked lv_is_pvmove lv_is_merging_origin lv_is_virtual_origin lv_is_external_origin lv_is_merging_cow
|
||||
RULE: all and lv_is_visible
|
||||
|
||||
---
|
||||
|
||||
# lvconvert snapshot-related utilities
|
||||
# Create a new command set for these and migrate them out of lvconvert?
|
||||
|
||||
@@ -642,7 +632,12 @@ OO_LVCREATE_CACHE: --cachemode CacheMode, --cachepolicy String, --cachesettings
|
||||
|
||||
OO_LVCREATE_POOL: --poolmetadatasize SizeMB, --poolmetadataspare Bool, --chunksize SizeKB
|
||||
|
||||
OO_LVCREATE_THIN: --discards Discards, --errorwhenfull Bool
|
||||
# FIXME: it's silly to include --mirrors 0 here. Fix the tests to not use
|
||||
# --mirrors 0 in commands that do not accept any non-zero --mirrors
|
||||
# option, and then remove this. Accepting an option, only so that the
|
||||
# option's value can invalidate the use of the option is not advisable.
|
||||
|
||||
OO_LVCREATE_THIN: --discards Discards, --errorwhenfull Bool, --mirrors 0
|
||||
|
||||
OO_LVCREATE_RAID: --mirrors SNumber, --stripes Number, --stripesize SizeKB,
|
||||
--regionsize SizeMB, --minrecoveryrate SizeKB, --maxrecoveryrate SizeKB
|
||||
@@ -665,10 +660,15 @@ FLAGS: SECONDARY_SYNTAX
|
||||
|
||||
---
|
||||
|
||||
# FIXME: consider removing the --mirrors 0, --stripes 1 options
|
||||
# and just reporting an error (or ignoring) if mirrors or stripes
|
||||
# options are given. Same reasoning as above: it's confusing to
|
||||
# advertise an option when the only value accepted for the option
|
||||
# makes the option do nothing.
|
||||
|
||||
lvcreate --type linear --size SizeMB VG
|
||||
OO: OO_LVCREATE
|
||||
OO: --mirrors 0, --stripes 1, OO_LVCREATE
|
||||
OP: PV ...
|
||||
IO: --mirrors 0, --stripes 1
|
||||
ID: lvcreate_linear
|
||||
DESC: Create a linear LV.
|
||||
FLAGS: SECONDARY_SYNTAX
|
||||
@@ -678,9 +678,8 @@ FLAGS: SECONDARY_SYNTAX
|
||||
# to people to not see the name parameter.
|
||||
|
||||
lvcreate --size SizeMB VG
|
||||
OO: --type linear, OO_LVCREATE
|
||||
OO: --type linear, --mirrors 0, --stripes 1, OO_LVCREATE
|
||||
OP: PV ...
|
||||
IO: --mirrors 0, --stripes 1
|
||||
ID: lvcreate_linear
|
||||
DESC: Create a linear LV (default --type linear).
|
||||
DESC: When --name is omitted, the name is generated.
|
||||
@@ -770,7 +769,6 @@ lvcreate --type thin-pool --size SizeMB VG
|
||||
OO: --thinpool LV_new, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thinpool
|
||||
DESC: Create a thin pool.
|
||||
|
||||
@@ -779,7 +777,6 @@ lvcreate --thin --size SizeMB VG
|
||||
OO: --type thin-pool, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thinpool
|
||||
DESC: Create a thin pool (variant, infers --type thin-pool).
|
||||
FLAGS: SECONDARY_SYNTAX
|
||||
@@ -789,7 +786,6 @@ lvcreate --size SizeMB --thinpool LV_new VG
|
||||
OO: --thin, --type thin-pool, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thinpool
|
||||
DESC: Create a thin pool named by the --thinpool arg
|
||||
DESC: (variant, infers --type thin-pool).
|
||||
@@ -821,14 +817,12 @@ FLAGS: SECONDARY_SYNTAX
|
||||
|
||||
lvcreate --type thin --virtualsize SizeMB --thinpool LV_thinpool VG
|
||||
OO: --thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol
|
||||
DESC: Create a thin LV in a thin pool.
|
||||
|
||||
# alternate form of lvcreate --type thin
|
||||
lvcreate --type thin --virtualsize SizeMB LV_thinpool
|
||||
OO: --thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol
|
||||
DESC: Create a thin LV in a thin pool named in the first arg
|
||||
DESC: (variant, also see --thinpool for naming pool).
|
||||
@@ -840,7 +834,6 @@ FLAGS: SECONDARY_SYNTAX
|
||||
# alternate form of lvcreate --type thin
|
||||
lvcreate --virtualsize SizeMB --thinpool LV_thinpool VG
|
||||
OO: --type thin, --thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol
|
||||
DESC: Create a thin LV in a thin pool (variant, infers --type thin).
|
||||
FLAGS: SECONDARY_SYNTAX
|
||||
@@ -848,7 +841,6 @@ FLAGS: SECONDARY_SYNTAX
|
||||
# alternate form of lvcreate --type thin
|
||||
lvcreate --virtualsize SizeMB LV_thinpool
|
||||
OO: --type thin, --thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol
|
||||
DESC: Create a thin LV in the thin pool named in the first arg
|
||||
DESC: (variant, infers --type thin, also see --thinpool for
|
||||
@@ -859,14 +851,12 @@ FLAGS: SECONDARY_SYNTAX
|
||||
|
||||
lvcreate --type thin LV_thin
|
||||
OO: --thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_snapshot
|
||||
DESC: Create a thin LV that is a snapshot of an existing thin LV.
|
||||
|
||||
# alternate form of lvcreate --type thin
|
||||
lvcreate --thin LV_thin
|
||||
OO: --type thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_snapshot
|
||||
DESC: Create a thin LV that is a snapshot of an existing thin LV
|
||||
DESC: (infers --type thin).
|
||||
@@ -875,27 +865,33 @@ FLAGS: SECONDARY_SYNTAX
|
||||
# alternate form of lvcreate --type thin
|
||||
lvcreate --snapshot LV_thin
|
||||
OO: --type thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_snapshot
|
||||
DESC: Create a thin LV that is a snapshot of an existing thin LV
|
||||
DESC: (infers --type thin).
|
||||
|
||||
lvcreate --type thin --thinpool LV_thinpool LV
|
||||
OO: --thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_snapshot_of_external
|
||||
DESC: Create a thin LV that is a snapshot of an external origin LV.
|
||||
|
||||
# alternate form of lvcreate --type thin --thinpool LV_thinpool LV
|
||||
lvcreate --snapshot --thinpool LV_thinpool LV
|
||||
OO: --type thin, OO_LVCREATE_THIN, OO_LVCREATE
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_snapshot_of_external
|
||||
DESC: Create a thin LV that is a snapshot of an external origin LV
|
||||
DESC: (infers --type thin).
|
||||
|
||||
---
|
||||
|
||||
lvconvert --mergethin LV_thin ...
|
||||
OO: OO_LVCONVERT
|
||||
ID: lvconvert_merge_thin
|
||||
DESC: Merge thin LV into its origin LV.
|
||||
RULE: all not lv_is_locked lv_is_pvmove lv_is_merging_origin lv_is_virtual_origin lv_is_external_origin lv_is_merging_cow
|
||||
RULE: all and lv_is_visible
|
||||
|
||||
---
|
||||
|
||||
# stripes option is not intuitive when creating a thin LV,
|
||||
# but here it applies to creating the new thin pool that
|
||||
# is used for the thin LV
|
||||
@@ -916,7 +912,6 @@ lvcreate --type thin --virtualsize SizeMB --size SizeMB --thinpool LV_new
|
||||
OO: --thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol_and_thinpool
|
||||
DESC: Create a thin LV, first creating a thin pool for it,
|
||||
DESC: where the new thin pool is named by the --thinpool arg.
|
||||
@@ -926,7 +921,6 @@ lvcreate --thin --virtualsize SizeMB --size SizeMB --thinpool LV_new
|
||||
OO: --type thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol_and_thinpool
|
||||
DESC: Create a thin LV, first creating a thin pool for it,
|
||||
DESC: where the new thin pool is named by the --thinpool arg
|
||||
@@ -938,7 +932,6 @@ lvcreate --type thin --virtualsize SizeMB --size SizeMB LV_new|VG
|
||||
OO: --thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol_and_thinpool
|
||||
DESC: Create a thin LV, first creating a thin pool for it,
|
||||
DESC: where the new thin pool is named in the first arg,
|
||||
@@ -951,7 +944,6 @@ lvcreate --thin --virtualsize SizeMB --size SizeMB LV_new|VG
|
||||
OO: --type thin, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol_and_thinpool
|
||||
DESC: Create a thin LV, first creating a thin pool for it,
|
||||
DESC: where the new thin pool is named in the first arg,
|
||||
@@ -965,7 +957,6 @@ lvcreate --size SizeMB --virtualsize SizeMB VG
|
||||
OO: --type thin, --type snapshot, --thin, --snapshot, OO_LVCREATE_POOL, OO_LVCREATE_THIN, OO_LVCREATE,
|
||||
--stripes Number, --stripesize SizeKB
|
||||
OP: PV ...
|
||||
IO: --mirrors 0
|
||||
ID: lvcreate_thin_vol_with_thinpool_or_sparse_snapshot
|
||||
DESC: Create a thin LV, first creating a thin pool for it
|
||||
DESC: (infers --type thin).
|
||||
@@ -1336,7 +1327,7 @@ OO_VGCHANGE: --autobackup Bool, --ignoremonitoring, --ignoreskippedcluster,
|
||||
# because it can function as a required opt.
|
||||
|
||||
OO_VGCHANGE_META: --addtag Tag, --deltag Tag,
|
||||
--logicalvolume Number, --maxphysicalvolumes Uint32, --alloc Alloc, --uuid,
|
||||
--logicalvolume Number, --maxphysicalvolumes Number, --alloc Alloc, --uuid,
|
||||
--clustered Bool, --pvmetadatacopies MetadataCopiesPV, --vgmetadatacopies MetadataCopiesVG,
|
||||
--physicalextentsize SizeMB, --resizeable Bool, --systemid String, --locktype LockType,
|
||||
--profile String, --detachprofile, --metadataprofile String
|
||||
@@ -1403,7 +1394,7 @@ ID: vgconvert_general
|
||||
|
||||
vgcreate VG_new PV ...
|
||||
OO: --addtag Tag, --alloc Alloc, --autobackup Bool, --clustered Bool, --maxlogicalvolumes Number,
|
||||
--maxphysicalvolumes Uint32, --metadataprofile String, --metadatatype MetadataType,
|
||||
--maxphysicalvolumes Number, --metadataprofile String, --metadatatype MetadataType,
|
||||
--physicalextentsize SizeMB, --force, --zero Bool, --labelsector Number,
|
||||
--metadatasize SizeMB, --pvmetadatacopies MetadataCopiesPV, --vgmetadatacopies MetadataCopiesVG,
|
||||
--reportformat ReportFmt, --dataalignment SizeKB, --dataalignmentoffset SizeKB,
|
||||
@@ -1536,7 +1527,7 @@ OO_VGSPLIT: --autobackup Bool
|
||||
|
||||
# used only when the destination VG is new
|
||||
OO_VGSPLIT_NEW: --alloc Alloc, --clustered Bool,
|
||||
--maxlogicalvolumes Number, --maxphysicalvolumes Uint32,
|
||||
--maxlogicalvolumes Number, --maxphysicalvolumes Number,
|
||||
--metadatatype MetadataType, --vgmetadatacopies MetadataCopiesVG
|
||||
|
||||
vgsplit VG VG PV ...
|
||||
@@ -1590,7 +1581,6 @@ formats
|
||||
ID: formats_general
|
||||
|
||||
help
|
||||
OP: String ...
|
||||
ID: help_general
|
||||
|
||||
version
|
||||
|
@@ -29,26 +29,14 @@ struct command_function {
|
||||
command_line_fn fn;
|
||||
};
|
||||
|
||||
#define MAX_COMMAND_NAMES 64
|
||||
|
||||
struct command_name {
|
||||
const char *name;
|
||||
const char *desc; /* general command description from commands.h */
|
||||
unsigned int flags;
|
||||
command_fn fn; /* old style */
|
||||
|
||||
/* union of {required,optional}_opt_args for all commands with this name */
|
||||
int valid_args[ARG_COUNT]; /* used for getopt */
|
||||
int valid_args[ARG_COUNT];
|
||||
int num_args;
|
||||
|
||||
/* the following are for generating help and man page output */
|
||||
int common_options[ARG_COUNT]; /* options common to all defs */
|
||||
int all_options[ARG_COUNT]; /* union of options from all defs */
|
||||
int variants; /* number of command defs with this command name */
|
||||
int variant_has_ro; /* do variants use required_opt_args ? */
|
||||
int variant_has_rp; /* do variants use required_pos_args ? */
|
||||
int variant_has_oo; /* do variants use optional_opt_args ? */
|
||||
int variant_has_op; /* do variants use optional_pos_args ? */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -63,9 +51,8 @@ struct command_name {
|
||||
*/
|
||||
|
||||
/* arg_def flags */
|
||||
#define ARG_DEF_FLAG_NEW_VG 1 << 0
|
||||
#define ARG_DEF_FLAG_NEW_LV 1 << 1
|
||||
#define ARG_DEF_FLAG_MAY_REPEAT 1 << 2
|
||||
#define ARG_DEF_FLAG_NEW 1 << 0
|
||||
#define ARG_DEF_FLAG_MAY_REPEAT 1 << 1
|
||||
|
||||
static inline int val_bit_is_set(uint64_t val_bits, int val_enum)
|
||||
{
|
||||
@@ -122,6 +109,7 @@ struct pos_arg {
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* Commands using a given command definition must follow a set
|
||||
* of rules. If a given command+LV matches the conditions in
|
||||
* opts/lvt_bits/lvp_bits, then the checks are applied.
|
||||
@@ -144,11 +132,10 @@ struct cmd_rule {
|
||||
uint32_t rule; /* RULE_INVALID, RULE_REQUIRE: check values must [not] be true */
|
||||
int opts_count; /* entries in opts[] */
|
||||
int check_opts_count; /* entries in check_opts[] */
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Array sizes
|
||||
*
|
||||
* CMD_RO_ARGS needs to accomodate a list of options,
|
||||
* of which one is required after which the rest are
|
||||
* optional.
|
||||
@@ -157,15 +144,14 @@ struct cmd_rule {
|
||||
#define CMD_OO_ARGS 150 /* optional opt args */
|
||||
#define CMD_RP_ARGS 8 /* required positional args */
|
||||
#define CMD_OP_ARGS 8 /* optional positional args */
|
||||
#define CMD_IO_ARGS 8 /* ignore opt args */
|
||||
#define CMD_MAX_RULES 32 /* max number of rules per command def */
|
||||
|
||||
/*
|
||||
* one or more from required_opt_args is required,
|
||||
* then the rest are optional.
|
||||
*/
|
||||
#define CMD_FLAG_ONE_REQUIRED_OPT 1 /* lvchange/vgchage require one item from required_opt_args */
|
||||
#define CMD_FLAG_SECONDARY_SYNTAX 2 /* allows syntax variants to be suppressed in certain output */
|
||||
#define CMD_FLAG_ONE_REQUIRED_OPT 1
|
||||
#define CMD_FLAG_SECONDARY_SYNTAX 2
|
||||
|
||||
/* a register of the lvm commands */
|
||||
struct command {
|
||||
@@ -173,11 +159,15 @@ struct command {
|
||||
const char *desc; /* specific command description from command-lines.h */
|
||||
const char *usage; /* excludes common options like --help, --debug */
|
||||
const char *usage_common; /* includes commmon options like --help, --debug */
|
||||
const char *command_line_id; /* ID string in command-lines.in */
|
||||
const char *command_line_id;
|
||||
int command_line_enum; /* <command_line_id>_CMD */
|
||||
|
||||
struct command_function *functions; /* new style */
|
||||
struct command_name *cname;
|
||||
|
||||
command_fn fn; /* old style */
|
||||
struct command_function *functions; /* new style */
|
||||
|
||||
unsigned int flags; /* copied from command_name.flags from commands.h */
|
||||
|
||||
unsigned int cmd_flags; /* CMD_FLAG_ */
|
||||
|
||||
@@ -195,24 +185,17 @@ struct command {
|
||||
/* optional positional args */
|
||||
struct pos_arg optional_pos_args[CMD_OP_ARGS];
|
||||
|
||||
/* unused opt args, are ignored instead of causing an error */
|
||||
struct opt_arg ignore_opt_args[CMD_IO_ARGS];
|
||||
|
||||
struct cmd_rule rules[CMD_MAX_RULES];
|
||||
|
||||
int ro_count;
|
||||
int oo_count;
|
||||
int rp_count;
|
||||
int op_count;
|
||||
int io_count;
|
||||
int rule_count;
|
||||
|
||||
int pos_count; /* temp counter used by create-command */
|
||||
/* used for processing current position */
|
||||
int pos_count;
|
||||
|
||||
int rule_count;
|
||||
};
|
||||
|
||||
int define_commands(void);
|
||||
int command_id_to_enum(const char *str);
|
||||
void print_usage(struct command *cmd);
|
||||
void print_usage_common(struct command_name *cname, struct command *cmd);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -370,7 +370,7 @@ static int _lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
/* Separate mirror log or metadata devices so we can clear them */
|
||||
if (!detach_metadata_devices(seg, &device_list)) {
|
||||
log_error("Failed to clear %s %s for %s.",
|
||||
lvseg_name(seg), seg_is_raid(seg) ?
|
||||
seg->segtype->name, seg_is_raid(seg) ?
|
||||
"metadata area" : "mirror log", display_lvname(lv));
|
||||
return 0;
|
||||
}
|
||||
@@ -1022,12 +1022,6 @@ static int _lvchange_properties_check(struct cmd_context *cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (vg_is_clustered(lv->vg) && lv_is_cache_origin(lv) && lv_is_raid(lv)) {
|
||||
log_error("Unable to change internal LV %s directly in a cluster.",
|
||||
display_lvname(lv));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
2142
tools/lvconvert.c
2142
tools/lvconvert.c
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user