Руководство по lvm

Related articles

  • Install Arch Linux on LVM
  • LVM on software RAID
  • dm-crypt/Encrypting an entire system#LVM on LUKS
  • dm-crypt/Encrypting an entire system#LUKS on LVM
  • Resizing LVM-on-LUKS
  • Create root filesystem snapshots with LVM

From Wikipedia:Logical Volume Manager (Linux):

Logical Volume Manager (LVM) is a device mapper framework that provides logical volume management for the Linux kernel.

Background

LVM building blocks

Logical Volume Management utilizes the kernel’s device-mapper feature to provide a system of partitions independent of underlying disk layout. With LVM you abstract your storage and have «virtual partitions», making extending/shrinking easier (subject to potential filesystem limitations).

Virtual partitions allow addition and removal without worry of whether you have enough contiguous space on a particular disk, getting caught up fdisking a disk in use (and wondering whether the kernel is using the old or new partition table), or, having to move other partitions out of the way.

Basic building blocks of LVM:

Physical volume (PV)
Unix block device node, usable for storage by LVM. Examples: a hard disk, an MBR or GPT partition, a loopback file, a device mapper device (e.g. dm-crypt). It hosts an LVM header.
Volume group (VG)
Group of PVs that serves as a container for LVs. PEs are allocated from a VG for a LV.
Logical volume (LV)
«Virtual/logical partition» that resides in a VG and is composed of PEs. LVs are Unix block devices analogous to physical partitions, e.g. they can be directly formatted with a file system.
Physical extent (PE)
The smallest contiguous extent (default 4 MiB) in the PV that can be assigned to a LV. Think of PEs as parts of PVs that can be allocated to any LV.

Example:

Physical disks

  Disk1 (/dev/sda):
    ┌──────────────────────────────────────┬─────────────────────────────────────┐
    │ Partition1  50 GiB (Physical volume) │ Partition2 80 GiB (Physical volume) │
    │ /dev/sda1                            │ /dev/sda2                           │
    └──────────────────────────────────────┴─────────────────────────────────────┘

  Disk2 (/dev/sdb):
    ┌──────────────────────────────────────┐
    │ Partition1 120 GiB (Physical volume) │
    │ /dev/sdb1                            │
    └──────────────────────────────────────┘
LVM logical volumes

  Volume Group1 (/dev/MyVolGroup/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
    ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐
    │ Logical volume1 15 GiB  │ Logical volume2 35 GiB  │ Logical volume3 200 GiB  │
    │ /dev/MyVolGroup/rootvol │ /dev/MyVolGroup/homevol │ /dev/MyVolGroup/mediavol │
    └─────────────────────────┴─────────────────────────┴──────────────────────────┘

Note: Logical volumes are accessible at both /dev/VolumeGroupName/LogicalVolumeName and /dev/mapper/VolumeGroupName-LogicalVolumeName. However, lvm(8) § VALID NAMES recommends the former format for «software and scripts» (e.g. fstab) since the latter is intended for «internal use» and subject to possible «change between releases and distributions».

Advantages

LVM gives you more flexibility than just using normal hard drive partitions:

  • Use any number of disks as one big disk.
  • Have logical volumes stretched over several disks.
  • Create small logical volumes and resize them «dynamically» as they get filled up.
  • Resize logical volumes regardless of their order on disk. It does not depend on the position of the LV within VG, there is no need to ensure surrounding available space.
  • Resize/create/delete logical and physical volumes online. File systems on them still need to be resized, but some (such as ext4) support online resizing.
  • Online/live migration of LV being used by services to different disks without having to restart services.
  • Snapshots allow you to backup a frozen copy of the file system, while keeping service downtime to a minimum.
  • Support for unlocking separate volumes without having to enter a key multiple times on boot (make LVM on top of LUKS).
  • Built-in support for caching of frequently used data (lvmcache(7)).

Disadvantages

  • Additional steps in setting up the system, more complicated. Requires (multiple) daemons to constantly run.
  • If dual-booting, note that Windows does not support LVM; you will be unable to access any LVM partitions from Windows. 3rd Party software may allow to mount certain kinds of LVM setups. [1]
  • If your physical volumes are not on a RAID-1, RAID-5 or RAID-6 losing one disk can lose one or more logical volumes if you span (or extend) your logical volumes across multiple non-redundant disks.
  • You cannot (easily) shrink the space used by the logical volume manager, meaning the physical volumes used for the logical volumes. If the physical extents are scattered across the physical volume until the end, it is not possible to shrink the physical volume with the scripts provided on the Arch Wiki. If you want to dual-boot with other operating systems (e.g. with Microsoft Windows), the only space left on the device for Microsoft Windows is the space not used by LVM / not used as physical volume.

Installation

Make sure the lvm2 package is installed.

If you have LVM volumes not activated via the initramfs, enable lvm2-monitor.service, which is provided by the lvm2 package.

Volume operations

Physical volumes

Creating

To create a PV on /dev/sda1, run:

# pvcreate /dev/sda1

You can check the PV is created using the following command:

# pvs

Growing

After extending or prior to reducing the size of a device that has a physical volume on it, you need to grow or shrink the PV using pvresize(8).

To expand the PV on /dev/sda1 after enlarging the partition, run:

# pvresize /dev/sda1

This will automatically detect the new size of the device and extend the PV to its maximum.

Note: This command can be done while the volume is online.

Shrinking

To shrink a physical volume prior to reducing its underlying device, add the --setphysicalvolumesize size parameters to the command, e.g.:

# pvresize --setphysicalvolumesize 40G /dev/sda1

The above command may leave you with this error:

/dev/sda1: cannot resize to 25599 extents as later ones are allocated.
0 physical volume(s) resized / 1 physical volume(s) not resized

Indeed pvresize will refuse to shrink a PV if it has allocated extents after where its new end would be. One needs to run pvmove beforehand to relocate these elsewhere in the volume group if there is sufficient free space.

Move physical extents

Before moving free extents to the end of the volume, one must run pvdisplay -v -m to see physical segments. In the below example, there is one physical volume on /dev/sdd1, one volume group vg1 and one logical volume backup.

# pvdisplay -v -m
    Finding all volume groups.
    Using physical volume(s) on command line.
  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               vg1
  PV Size               1.52 TiB / not usable 1.97 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              399669
  Free PE               153600
  Allocated PE          246069
  PV UUID               MR9J0X-zQB4-wi3k-EnaV-5ksf-hN1P-Jkm5mW
   
  --- Physical Segments ---
  Physical extent 0 to 153600:
    FREE
  Physical extent 153601 to 307199:
    Logical volume	/dev/vg1/backup
    Logical extents	1 to 153599
  Physical extent 307200 to 307200:
    FREE
  Physical extent 307201 to 399668:
    Logical volume	/dev/vg1/backup
    Logical extents	153601 to 246068

One can observe FREE space are split across the volume. To shrink the physical volume, we must first move all used segments to the beginning.

Here, the first free segment is from 0 to 153600 and leaves us with 153601 free extents. We can now move this segment number from the last physical extent to the first extent. The command will thus be:

# pvmove --alloc anywhere /dev/sdd1:307201-399668 /dev/sdd1:0-92467
/dev/sdd1: Moved: 0.1 %
/dev/sdd1: Moved: 0.2 %
...
/dev/sdd1: Moved: 99.9 %
/dev/sdd1: Moved: 100.0 %

Note:

  • This command moves 399668 — 307201 + 1 = 92468 PEs from the last segment to the first segment. This is possible as the first segment encloses 153600 free PEs, which can contain the 92467 — 0 + 1 = 92468 moved PEs.
  • The --alloc anywhere option is used as we move PEs inside the same partition. In case of different partitions, the command would look something like this:
    # pvmove /dev/sdb1:1000-1999 /dev/sdc1:0-999
  • This command may take a long time (one to two hours) in case of large volumes. It might be a good idea to run this command in a tmux or GNU Screen session. Any unwanted stop of the process could be fatal.
  • Once the operation is complete, run fsck to make sure your file system is valid.
Resize physical volume

Once all your free physical segments are on the last physical extents, run vgdisplay with root privileges and see your free PE.

Then you can now run again the command:

# pvresize --setphysicalvolumesize size PhysicalVolume

See the result:

# pvs
  PV         VG   Fmt  Attr PSize    PFree 
  /dev/sdd1  vg1  lvm2 a--     1t     500g
Resize partition

Last, you need to shrink the partition with your favorite partitioning tool.

Volume groups

Creating a volume group

To create a VG MyVolGroup with an associated PV /dev/sdb1, run:

# vgcreate MyVolGroup /dev/sdb1

You can check the VG MyVolGroup is created using the following command:

# vgs

You can bind multiple PVs when creating a VG like this:

# vgcreate MyVolGroup /dev/sdb1 /dev/sdb2

Activating a volume group

Note: You can restrict the volumes that are activated automatically by setting the auto_activation_volume_list in /etc/lvm/lvm.conf. If in doubt, leave this option commented out.

# vgchange -a y MyVolGroup

By default, this will reactivate the volume group when applicable. For example, if you had a drive failure in a mirror and you swapped the drive; and ran (1) pvcreate, (2) vgextend and (3) vgreduce --removemissing --force.

Repairing a volume group

To start the rebuilding process of the degraded mirror array in this example, you would run:

# lvconvert --repair /dev/MyVolGroup/mirror

You can monitor the rebuilding process (Cpy%Sync Column output) with:

# lvs -a -o +devices

Deactivating a volume group

Just invoke

# vgchange -a n MyVolGroup

This will deactivate the volume group and allow you to unmount the container it is stored in.

Renaming a volume group

Use the vgrename(8) command to rename an existing volume group.

Either of the following commands renames the existing volume group MyVolGroup to my_volume_group

# vgrename /dev/MyVolGroup /dev/my_volume_group
# vgrename MyVolGroup my_volume_group

Make sure to update all configuration files (e.g. /etc/fstab or /etc/crypttab) that reference the renamed volume group.

Add physical volume to a volume group

You first create a new physical volume on the block device you wish to use, then extend your volume group

# pvcreate /dev/sdb1
# vgextend MyVolGroup /dev/sdb1

This of course will increase the total number of physical extents on your volume group, which can be allocated by logical volumes as you see fit.

Note: It is considered good form to have a partition table on your storage medium below LVM. Use the appropriate partition type: 8e for MBR, and E6D6D379-F507-44C2-A23C-238F2A3DF928 for GPT partitions.

Remove partition from a volume group

If you created a logical volume on the partition, remove it first.

All of the data on that partition needs to be moved to another partition. Fortunately, LVM makes this easy:

# pvmove /dev/sdb1

If you want to have the data on a specific physical volume, specify that as the second argument to pvmove:

# pvmove /dev/sdb1 /dev/sdf1

Then the physical volume needs to be removed from the volume group:

# vgreduce MyVolGroup /dev/sdb1

Or remove all empty physical volumes:

# vgreduce --all MyVolGroup

For example: if you have a bad disk in a group that cannot be found because it has been removed or failed:

# vgreduce --removemissing --force MyVolGroup

And lastly, if you want to use the partition for something else, and want to avoid LVM thinking that the partition is a physical volume:

# pvremove /dev/sdb1

Logical volumes

Note: lvresize(8) provides more or less the same options as the specialized lvextend(8) and lvreduce(8) commands, while allowing to do both types of operation. Notwithstanding this, all those utilities offer a -r/--resizefs option which allows to resize the file system together with the LV using fsadm(8) (ext2, ext3, ext4, ReiserFS and XFS supported). Therefore it may be easier to simply use lvresize for both operations and use --resizefs to simplify things a bit, except if you have specific needs or want full control over the process.

Warning: While enlarging a file system can often be done on-line (i.e. while it is mounted), even for the root partition, shrinking will nearly always require to first unmount the file system so as to prevent data loss. Make sure your file system supports what you are trying to do.

Tip: If a logical volume will be formatted with ext4, leave at least 256 MiB free space in the volume group to allow using e2scrub(8). After creating the last volume with -l 100%FREE, this can be accomplished by reducing its size with lvreduce -L -256M volume_group/logical_volume.

Creating a logical volume

To create a LV homevol in a VG MyVolGroup with 300 GiB of capacity, run:

# lvcreate -L 300G MyVolGroup -n homevol

or, to create a LV homevol in a VG MyVolGroup with the rest of capacity, run:

# lvcreate -l 100%FREE MyVolGroup -n homevol

The new LV will appear as /dev/MyVolGroup/homevol. Now you can format the LV with an appropriate file system.

You can check the LV is created using the following command:

# lvs

Renaming a logical volume

To rename an existing logical volume, use the lvrename(8) command.

Either of the following commands renames logical volume old_vol in volume group MyVolGroup to new_vol.

# lvrename /dev/MyVolGroup/old_vol /dev/MyVolGroup/new_vol
# lvrename MyVolGroup old_vol new_vol

Make sure to update all configuration files (e.g. /etc/fstab or /etc/crypttab) that reference the renamed logical volume.

Resizing the logical volume and file system in one go

Note: Only ext2, ext3, ext4, ReiserFS and XFS file systems are supported. For a different type of file system see #Resizing the logical volume and file system separately.

Extend the logical volume mediavol in MyVolGroup by 10 GiB and resize its file system all at once:

# lvresize -L +10G --resizefs MyVolGroup/mediavol

Set the size of logical volume mediavol in MyVolGroup to 15 GiB and resize its file system all at once:

# lvresize -L 15G --resizefs MyVolGroup/mediavol

If you want to fill all the free space on a volume group, use the following command:

# lvresize -l +100%FREE --resizefs MyVolGroup/mediavol

See lvresize(8) for more detailed options.

Resizing the logical volume and file system separately

For file systems not supported by fsadm(8) will need to use the appropriate utility to resize the file system before shrinking the logical volume or after expanding it.

To extend logical volume mediavol within volume group MyVolGroup by 2 GiB without touching its file system:

# lvresize -L +2G MyVolGroup/mediavol

Now expand the file system (ext4 in this example) to the maximum size of the underlying logical volume:

# resize2fs /dev/MyVolGroup/mediavol

To reduce the size of logical volume mediavol in MyVolGroup by 500 MiB, first calculate the resulting file system size and shrink the file system (ext4 in this example) to the new size:

# resize2fs /dev/MyVolGroup/mediavol NewSize

When the file system is shrunk, reduce the size of logical volume:

# lvresize -L -500M MyVolGroup/mediavol

To calculate the exact logical volume size for ext2, ext3, ext4 file systems, use a simple formula: LVM_EXTENTS = FS_BLOCKS × FS_BLOCKSIZE ÷ LVM_EXTENTSIZE.

# tune2fs -l /dev/MyVolGroup/mediavol | grep Block
Block count:              102400000
Block size:               4096
Blocks per group:         32768
# vgdisplay MyVolGroup | grep "PE Size"
PE Size               4.00 MiB

Note: The file system block size is in bytes. Make sure to use the same units for both block and extent size.

102400000 blocks × 4096 bytes/block ÷ 4 MiB/extent = 100000 extents

Passing --resizefs will confirm that the correctness.

# lvreduce -l 100000 --resizefs /dev/MyVolGroup/mediavol
...
The filesystem is already 102400000 (4k) blocks long.  Nothing to do!
...
Logical volume sysvg/root successfully resized.

See lvresize(8) for more detailed options.

Removing a logical volume

Warning: Before you remove a logical volume, make sure to move all data that you want to keep somewhere else; otherwise, it will be lost!

First, find out the name of the logical volume you want to remove. You can get a list of all logical volumes with:

# lvs

Next, look up the mountpoint of the chosen logical volume:

$ lsblk

Then unmount the filesystem on the logical volume:

# umount /mountpoint

Finally, remove the logical volume:

# lvremove volume_group/logical_volume

For example:

# lvremove MyVolGroup/homevol

Confirm by typing in y.

Make sure to update all configuration files (e.g. /etc/fstab or /etc/crypttab) that reference the removed logical volume.

You can verify the removal of the logical volume by typing lvs as root again (see first step of this section).

Snapshots

LVM supports CoW (Copy-on-Write) snapshots. A CoW snapshot initially points to the original data. When data blocks are overwritten, the original copy is left intact and the new blocks are written elsewhere on-disk. This has several desirable properties:

  • Creating snapshots is fast, because it does not copy data (just the much shorter list of pointers to the on-disk locations).
  • Snapshots require just enough free space to hold the new data blocks (plus a negligible amount for the pointers to the new blocks). For example, a snapshot of 35 GiB of data, where you write only 2 GiB (on both the original and snapshot), only requires 2 GiB of free space.

LVM snapshots are at the block level. They make a new block device, with no apparent relationship to the original except when dealing with the LVM tools. Therefore, deleting files in the original copy does not free space in the snapshots. If you need filesystem-level snapshots, you rather need btrfs, ZFS or bcache.

Warning:

  • A CoW snapshot is not a backup, because it does not make a second copy of the original data. For example, a damaged disk sector that affects original data also affects the snapshots. That said, a snapshot can be helpful while using other tools to make backups, as outlined below.
  • Btrfs expects different filesystems to have different UUIDs. If you snapshot a LVM volume that contains a btrfs filesystem, make sure to change the UUID of the original or the copy, before both are mounted (or made visible to the kernel, for example if an unrelated daemon triggers a btrfs device scan). For details see btrfs wiki Gotcha’s.

Configuration

You create snapshot logical volumes just like normal ones.

# lvcreate --size 100M --snapshot --name snap01vol /dev/MyVolGroup/lvol

With that volume, you may modify less than 100 MiB of data, before the snapshot volume fills up.

Reverting the modified lvol logical volume to the state when the snap01vol snapshot was taken can be done with

# lvconvert --merge /dev/MyVolGroup/snap01vol

In case the origin logical volume is active, merging will occur on the next reboot (merging can be done even from a LiveCD).

Note: The snapshot will no longer exist after merging.

Also multiple snapshots can be taken and each one can be merged with the origin logical volume at will.

Backups

A snapshot provides a frozen copy of a file system to make backups. For example, a backup taking two hours provides a more consistent image of the file system than directly backing up the partition.

The snapshot can be mounted and backed up with dd or tar. The size of the backup file done with dd will be the size of the files residing on the snapshot volume.
To restore just create a snapshot, mount it, and write or extract the backup to it. And then merge it with the origin.

See Create root filesystem snapshots with LVM for automating the creation of clean root file system snapshots during system startup for backup and rollback.

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Show scripts to automate snapshots of root before updates, to rollback… updating menu.lst to boot snapshots (maybe in a separate article?) (Discuss in Talk:LVM)

Encryption

See dm-crypt/Encrypting an entire system#LUKS on LVM and dm-crypt/Encrypting an entire system#LVM on LUKS for the possible schemes of combining LUKS with LVM.

Cache

From lvmcache(7):

The cache logical volume type uses a small and fast LV to improve the performance of a large and slow LV. It does this by storing the frequently used blocks on the faster LV. LVM refers to the small fast LV as a cache pool LV. The large slow LV is called the origin LV. Due to requirements from dm-cache (the kernel driver), LVM further splits the cache pool LV into two devices — the cache data LV and cache metadata LV. The cache data LV is where copies of data blocks are kept from the origin LV to increase speed. The cache metadata LV holds the accounting information that specifies where data blocks are stored (e.g. on the origin LV or on the cache data LV). Users should be familiar with these LVs if they wish to create the best and most robust cached logical volumes. All of these associated LVs must be in the same VG.

Create cache

Convert your fast disk (/dev/fastdisk) to PV and add to your existing VG (MyVolGroup):

# vgextend MyVolGroup /dev/fastdisk

Create a cache pool with automatic meta data on /dev/fastdisk and convert the existing LV MyVolGroup/rootvol to a cached volume, all in one step:

# lvcreate --type cache --cachemode writethrough -l 100%FREE -n root_cachepool MyVolGroup/rootvol /dev/fastdisk

Tip: Instead of using -l 100%FREE to allocate 100% of available space from PV /dev/fastdisk, you can use -L 20G instead to allocate only 20 GiB for cachepool.

Cachemode has two possible options:

  • writethrough ensures that any data written will be stored both in the cache pool LV and on the origin LV. The loss of a device associated with the cache pool LV in this case would not mean the loss of any data;
  • writeback ensures better performance, but at the cost of a higher risk of data loss in case the drive used for cache fails.

If a specific --cachemode is not indicated, the system will assume writethrough as default.

Remove cache

If you ever need to undo the one step creation operation above:

# lvconvert --uncache MyVolGroup/rootvol

This commits any pending writes still in the cache back to the origin LV, then deletes the cache. Other options are available and described in lvmcache(7).

RAID

LVM may be used to create a software RAID. It is a good choice if the user does not have hardware RAID and was planning on using LVM anyway. From lvmraid(7):

lvm(8) RAID is a way to create a Logical Volume (LV) that uses multiple physical devices to improve performance or tolerate device failures. In LVM, the physical devices are Physical Volumes (PVs) in a single Volume Group (VG).

LVM RAID supports RAID 0, RAID 1, RAID 4, RAID 5, RAID 6 and RAID 10. See Wikipedia:Standard RAID levels for details on each level.

Warning: When using the lvm2 mkinitcpio hook, make sure to include the RAID kernel modules in the initramfs. This must be done regardless whether the root volume is on LVM RAID or not, as after boot pvscan will not retry activating devices it could not activate in the initramfs phase. See FS#71385.

Tip: mdadm may also be used to create a software RAID. It is arguably simpler, more popular, and easier to setup.

Setup RAID

Create physical volumes:

# pvcreate /dev/sda2 /dev/sdb2

Create volume group on the physical volumes:

# vgcreate MyVolGroup /dev/sda2 /dev/sdb2

Create logical volumes using lvcreate --type raidlevel, see lvmraid(7) and lvcreate(8) for more options.

# lvcreate --type RaidLevel [OPTIONS] -n Name -L Size VG [PVs]

For example:

# lvcreate --type raid1 --mirrors 1 -L 20G -n myraid1vol MyVolGroup /dev/sda2 /dev/sdb2

will create a 20 GiB mirrored logical volume named «myraid1vol» in VolGroup00 on /dev/sda2 and /dev/sdb2.

Thin provisioning

Note: When mounting a thin LV file system, always remember to use the discard option or to use fstrim regularly, to allow the thin LV to shrink as files are deleted.

From lvmthin(7):

Blocks in a standard lvm(8) Logical Volume (LV) are allocated when the LV is created, but blocks in a thin provisioned LV are allocated as they are written. Because of this, a thin provisioned LV is given a virtual size, and can then be much larger than physically available storage. The amount of physical storage provided for thin provisioned LVs can be increased later as the need arises.

Example: implementing virtual private servers

Here is the classic use case. Suppose you want to start your own VPS service, initially hosting about 100 VPSes on a single PC with a 930 GiB hard drive. Hardly any of the VPSes will actually use all of the storage they are allotted, so rather than allocate 9 GiB to each VPS, you could allow each VPS a maximum of 30 GiB and use thin provisioning to only allocate as much hard drive space to each VPS as they are actually using. Suppose the 930 GiB hard drive is /dev/sdb. Here is the setup.

Prepare the volume group, MyVolGroup.

# vgcreate MyVolGroup /dev/sdb

Create the thin pool LV, MyThinPool. This LV provides the blocks for storage.

# lvcreate --type thin-pool -n MyThinPool -l 95%FREE MyVolGroup

The thin pool is composed of two sub-volumes, the data LV and the metadata LV. This command creates both automatically. But the thin pool stops working if either fills completely, and LVM currently does not support the shrinking of either of these volumes. This is why the above command allows for 5% of extra space, in case you ever need to expand the data or metadata sub-volumes of the thin pool.

For each VPS, create a thin LV. This is the block device exposed to the user for their root partition.

# lvcreate -n SomeClientsRoot -V 30G --thinpool MyThinPool MyVolGroup

The block device /dev/MyVolGroup/SomeClientsRoot may then be used by a VirtualBox instance as the root partition.

Use thin snapshots to save more space

Thin snapshots are much more powerful than regular snapshots, because they are themselves thin LVs. See Red Hat’s guide [2] for a complete list of advantages thin snapshots have.

Instead of installing Linux from scratch every time a VPS is created, it is more space-efficient to start with just one thin LV containing a basic installation of Linux:

# lvcreate -n GenericRoot -V 30G --thinpool MyThinPool MyVolGroup
*** install Linux at /dev/MyVolGroup/GenericRoot ***

Then create snapshots of it for each VPS:

# lvcreate -s MyVolGroup/GenericRoot -n SomeClientsRoot

This way, in the thin pool there is only one copy the data common to all VPSes, at least initially. As an added bonus, the creation of a new VPS is instantaneous.

Since these are thin snapshots, a write operation to GenericRoot only causes one COW operation in total, instead of one COW operation per snapshot. This allows you to update GenericRoot more efficiently than if each VPS were a regular snapshot.

Example: zero-downtime storage upgrade

There are applications of thin provisioning outside of VPS hosting. Here is how you may use it to grow the effective capacity of an already-mounted file system without having to unmount it. Suppose, again, that the server has a single 930 GiB hard drive. The setup is the same as for VPS hosting, only there is only one thin LV and the LV’s size is far larger than the thin pool’s size.

# lvcreate -n MyThinLV -V 16T --thinpool MyThinPool MyVolGroup

This extra virtual space can be filled in with actual storage at a later time by extending the thin pool.

Suppose some time later, a storage upgrade is needed, and a new hard drive, /dev/sdc, is plugged into the server. To upgrade the thin pool’s capacity, add the new hard drive to the VG:

# vgextend MyVolGroup /dev/sdc

Now, extend the thin pool:

# lvextend -l +95%FREE MyVolGroup/MyThinPool

Since this thin LV’s size is 16 TiB, you could add another 15.09 TiB of hard drive space before finally having to unmount and resize the file system.

Note: You will probably want to use reserved blocks or a disk quota to prevent applications from attempting to use more physical storage than there actually is.

Troubleshooting

LVM commands do not work

  • Load proper module:
# modprobe dm_mod

The dm_mod module should be automatically loaded. In case it does not, explicitly load the module at boot.

  • Try preceding commands with lvm like this:
# lvm pvdisplay

Logical Volumes do not show up

If you are trying to mount existing logical volumes, but they do not show up in lvscan, you can use the following commands to activate them:

# vgscan
# vgchange -ay

LVM on removable media

Symptoms:

# vgscan
  Reading all physical volumes.  This may take a while...
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error
  Found volume group "backupdrive1" using metadata type lvm2
  Found volume group "networkdrive" using metadata type lvm2

Cause: removing an external LVM drive without deactivating the volume group(s) first. Before you disconnect, make sure to:

# vgchange -an volume group name

Fix: assuming you already tried to activate the volume group with vgchange -ay vg, and are receiving the Input/output errors:

# vgchange -an volume group name

Unplug the external drive and wait a few minutes:

# vgscan
# vgchange -ay volume group name

Suspend/resume with LVM and removable media

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Provided solution will not work in more complex setups like LUKS on LVM. (Discuss in Talk:LVM#LVM on removable media)

In order for LVM to work properly with removable media – like an external USB drive – the volume group of the external drive needs to be deactivated before suspend. If this is not done, you may get buffer I/O errors on the dm device (after resume). For this reason, it is not recommended to mix external and internal drives in the same volume group.

To automatically deactivate the volume groups with external USB drives, tag each volume group with the sleep_umount tag in this way:

# vgchange --addtag sleep_umount vg_external

Once the tag is set, use the following unit file for systemd to properly deactivate the volumes before suspend. On resume, they will be automatically activated by LVM.

/etc/systemd/system/ext_usb_vg_deactivate.service
[Unit]
Description=Deactivate external USB volume groups on suspend
Before=sleep.target

[Service]
Type=oneshot
ExecStart=-/etc/systemd/system/deactivate_sleep_vgs.sh

[Install]
WantedBy=sleep.target

and this script:

/etc/systemd/system/deactivate_sleep_vgs.sh
#!/bin/sh

TAG=@sleep_umount
vgs=$(vgs --noheadings -o vg_name $TAG)

echo "Deactivating volume groups with $TAG tag: $vgs"

# Unmount logical volumes belonging to all the volume groups with tag $TAG
for vg in $vgs; do
    for lv_dev_path in $(lvs --noheadings  -o lv_path -S lv_active=active,vg_name=$vg); do
        echo "Unmounting logical volume $lv_dev_path"
        umount $lv_dev_path
    done
done

# Deactivate volume groups tagged with sleep_umount
for vg in $vgs; do
    echo "Deactivating volume group $vg"
    vgchange -an $vg
done

Finally, enable the unit.

Resizing a contiguous logical volume fails

If trying to extend a logical volume errors with:

" Insufficient suitable contiguous allocatable extents for logical volume "

The reason is that the logical volume was created with an explicit contiguous allocation policy (options -C y or --alloc contiguous) and no further adjacent contiguous extents are available.[3]

To fix this, prior to extending the logical volume, change its allocation policy with lvchange --alloc inherit logical_volume. If you need to keep the contiguous allocation policy, an alternative approach is to move the volume to a disk area with sufficient free extents. See [4].

Command «grub-mkconfig» reports «unknown filesystem» errors

Make sure to remove snapshot volumes before generating grub.cfg.

Thinly-provisioned root volume device times out

With a large number of snapshots, thin_check runs for a long enough time so that waiting for the root device times out. To compensate, add the rootdelay=60 kernel boot parameter to your boot loader configuration. Or, make thin_check skip checking block mappings (see [5]) and regenerate the initramfs:

/etc/lvm/lvm.conf
thin_check_options = [ "-q", "--clear-needs-check-flag", "--skip-mappings" ]

Delay on shutdown

If you use RAID, snapshots or thin provisioning and experience a delay on shutdown, make sure lvm2-monitor.service is started. See FS#50420.

Hibernating into a thinly-provisioned swap volume

See Power management/Suspend and hibernate#Hibernation into a thinly-provisioned LVM volume.

See also

  • LVM2 Resource Page on SourceWare.org
  • Gentoo:LVM
  • Red Hat Enterprise 9: Configuring and managing logical volumes
  • Ubuntu LVM Guide Part 1Part 2 details snapshots

Обновлено Обновлено: 29.04.2021
Опубликовано Опубликовано: 23.03.2019

Тематические термины: LVM, Linux.

В статье описаны основные моменты использования LVM для организации дисковой системы в Linux. Она поможет как чайникам разобраться с принципами ее работы, так и уже знающим LVM в качестве шпаргалки.

Используемые команды одинаково подойдут как для систем Red Hat / CentOS, так и Debian / Ubuntu.

Уровни абстракции
Установка LVM
Создание разделов
    Инициализация (pvcreate)
    Создание групп (vgcreate)
    Создание логического тома (lvcreate)
Файловая система и монтирование
    Создание файловой системы
    Монтирование тома
Просмотр информации об LVM
Увеличение томов
    Расширение физического раздела
    Добавление диска к группе
    Увеличение логического тома
    Изменение размера файловой системы
Уменьшение томов
Удаление томов
Зеркалирование
Снапшоты
Импорт диска из другой системы
Работа с LVM в Windows
Возможные ошибки

Уровни абстракции

Работа с томами с помощью LVM происходит на 3-х уровнях абстракции:

  1. Физический уровень (PV). Сначала диск инициализируется командой pvcreate — в начале диска создается дескриптор группы томов. При этом важно заметить, что диск не обязательно должен быть физическим — мы можно отметить на использование обычный раздел диска.
  2. Группа томов (VG). С помощью команды vgcreate создается группа томов из инициализированных на предыдущем этапе дисков.
  3. Логический том (LV). Группы томов нарезаются на логические тома командой lvcreate.

Схематично, уровни можно представить так:

Схематичное представление уровней абстракции LVM

Установка

Для работы с LVM необходима установка одноименной утилиты. В системе Linux  она может быть установлена по умолчанию. Но если ее нет, выполняем инструкцию ниже.

Если используем системы на безе deb (Ubuntu, Debian, Mint):

apt-get install lvm2

Если используем системы на безе RPM (Red Hat, CentOS, Fedora):

yum install lvm2

Создание разделов

Рассмотрим пример создания томов из дисков sdb и sdc с помощью LVM.

1. Инициализация

Помечаем диски, что они будут использоваться для LVM:

pvcreate /dev/sdb /dev/sdc

* напомним, что в качестве примера нами используются диски sdb и sdc.

Посмотреть, что диск может использоваться LMV можно командой:

pvdisplay

В нашем случае мы должны увидеть что-то на подобие:

  «/dev/sdb» is a new physical volume of «1,00 GiB»
  — NEW Physical volume —
  PV Name               /dev/sdb
  VG Name               
  PV Size               1,00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               rR8qya-eJes-7AC5-wuxv-CT7a-o30m-bnUrWa

   
  «/dev/sdc» is a new physical volume of «1,00 GiB»
  — NEW Physical volume —
  PV Name               /dev/sdc
  VG Name               
  PV Size               1,00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               2jIgFd-gQvH-cYkf-9K7N-M7cB-WWGE-9dzHIY

* где 

  • PV Name — имя диска. 
  • VG Name — группа томов, в которую входит данный диск (в нашем случае пусто, так как мы еще не добавили его в группу).
  • PV Size — размер диска.
  • Allocatable — распределение по группам. Если NO, то диск еще не задействован и его необходимо для использования включить в группу.
  • PE Size — размер физического фрагмента (экстента). Пока диск не добавлен в группу, значение будет 0.
  • Total PE — количество физических экстентов.
  • Free PE — количество свободных физических экстентов.
  • Allocated PE — распределенные экстенты.
  • PV UUID — идентификатор физического раздела.

2. Создание групп томов

Инициализированные на первом этапе диски должны быть объединены в группы.

Группа может быть создана:

vgcreate vg01 /dev/sdb /dev/sdc

* где vg01 — произвольное имя создаваемой группы; /dev/sdb, /dev/sdc — наши диски.

Просмотреть информацию о созданных группах можно командой:

vgdisplay

На что мы получим, примерно, следующее:

  — Volume group —
  VG Name               vg01
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1,99 GiB
  PE Size               4,00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1,99 GiB
  VG UUID               b0FAUz-wlXt-Hzqz-Sxs4-oEgZ-aquZ-jLzfKz

* где:

  • VG Name — имя группы.
  • Format — версия подсистемы, используемая для создания группы.
  • Metadata Areas — область размещения метаданных. Увеличивается на единицу с созданием каждой группы.
  • VG Access — уровень доступа к группе томов.
  • VG Size — суммарный объем всех дисков, которые входят в группу.
  • PE Size — размер физического фрагмента (экстента).
  • Total PE — количество физических экстентов.
  • Alloc PE / Size — распределенное пространство: колическтво экстентов / объем.
  • Free  PE / Size — свободное пространство: колическтво экстентов / объем.
  • VG UUID — идентификатор группы.

3. Создание логических томов

Последний этап — создание логического раздела их группы томов командой lvcreate. Ее синтаксис:

lvcreate [опции] <имя группы томов>

Примеры создания логических томов:

lvcreate -L 1G vg01

* создание тома на 1 Гб из группы vg01.

lvcreate -L50 -n lv01 vg01

* создание тома с именем lv01 на 50 Мб из группы vg01.

lvcreate -l 40%VG vg01

* при создании тома используется 40% от дискового пространства группы vg01.

lvcreate -l 100%FREE -n lv01 vg01

* использовать все свободное пространство группы vg01 при создании логического тома.
* также можно использовать %PVS — процент места от физического тома (PV); %ORIGIN — размер оригинального тома (применяется для снапшотов).

Посмотрим информацию о созданном томе:

lvdisplay

  — Logical volume —
  LV Path                /dev/vg01/lv01
  LV Name                lv01
  VG Name                vg01
  LV UUID                4nQ2rp-7AcZ-ePEQ-AdUr-qcR7-i4rq-vDISfD
  LV Write Access        read/write
  LV Creation host, time vln.dmosk.local, 2019-03-18 20:01:14 +0300
  LV Status              available
  # open                 0
  LV Size                52,00 MiB
  Current LE             13
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  — currently set to     8192
  Block device           253:2

* где:

  • LV Path — путь к устройству логического тома.
  • LV Name — имя логического тома.
  • VG Name — имя группы томов.
  • LV UUID — идентификатор.
  • LV Write Access — уровень доступа.
  • LV Creation host, time — имя компьютера и дата, когда был создан том.
  • LV Size — объем дискового пространства, доступный для использования.
  • Current LE — количество логических экстентов.

Создание файловой системы и монтирование тома

Чтобы начать использовать созданный том, необходимо его отформатировать, создав файловую систему и примонтировать раздел в каталог.

Файловая система

Процесс создания файловой системы на томах LVM ничем не отличается от работы с любыми другими разделами.

Например, для создания файловой системы ext4 вводим:

mkfs.ext4 /dev/vg01/lv01

vg01 — наша группа томов; lv01 — логический том.

Для создания, например, файловой системы xfs вводим:

mkfs.xfs /dev/vg01/lv01

Монтирование

Как и в случае с файловой системой, процесс монтирования не сильно отличается от разделов, созданных другими методами.

Для разового монтирования пользуемся командой:

mount /dev/vg01/lv01 /mnt

* где /dev/vg01/lv01 — созданный нами логический том, /mnt — раздел, в который мы хотим примонтировать раздел.

Для постоянного монтирования раздела добавляем строку в fstab:

vi /etc/fstab

/dev/vg01/lv01  /mnt    ext4    defaults        1 2

* в данном примере мы монтируем при загрузке системы том /dev/vg01/lv01 в каталог /mnt; используется файловая система ext4.

Проверяем настройку fstab, смонтировав раздел:

mount -a

Проверяем, что диск примонтирован:

df -hT

Просмотр информации

Разберемся, как получить информацию о дисковых накопителях в системе.

1. Для общего представления дисков, разделов и томов вводим:

lsblk

Мы получим что-то на подобие:

NAME             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                8:0    0   30G  0 disk 
  sda1             8:1    0    1G  0 part /boot
  sda2             8:2    0   29G  0 part 
    sys-root     253:0    0   27G  0 lvm  /
    sys-swap     253:1    0    2G  0 lvm  [SWAP]
sdb                8:16   0    1G  0 disk 
  vg01-lv01-real 253:3    0    1G  0 lvm  
    vg01-lv01    253:2    0    1G  0 lvm  /mnt
    vg01-sn01    253:5    0    1G  0 lvm  
sdc                8:32   0    1G  0 disk 
  vg01-lv01-real 253:3    0    1G  0 lvm  
    vg01-lv01    253:2    0    1G  0 lvm  /mnt
    vg01-sn01    253:5    0    1G  0 lvm  
  vg01-sn01-cow  253:4    0  500M  0 lvm  
    vg01-sn01    253:5    0    1G  0 lvm  
sdd                8:48   0    1G  0 disk

* как видим, команда отображает корневое блочное устройство, какие разделы из него сделаны и в какие логические тома организованы из некоторых из разделов.

2. Получить информацию о проинициализированных для LVM дисков:

Кратко:

pvs

Подробно:

pvdisplay

pvdisplay /dev/sdb

3. Посмотреть информацию о группах LVM.

Кратко:

vgs

Подробно:

vgdisplay

vgdisplay vg01

4. Посмотреть информацию о логических томах можно также двумя способами — краткая информация:

lvs

* команда покажет все логические разделы.

Для более подробной информации о логических томах вводим:

lvdisplay

lvdisplay /dev/vg01/lv01

5. Для поиска всех устройств, имеющих отношение к LVM, вводим:

lvmdiskscan

Увеличение томов

Увеличение размера тома может выполняться с помощью добавления еще одного диска или при увеличении имеющихся дисков (например, увеличение диска виртуальной машины). Итак, процедура выполняется в 4 этапа:

1. Расширение физического тома

Расширение физического раздела можно сделать за счет добавление нового диска или увеличение дискового пространства имеющегося (например, если диск виртуальный).

а) Если добавляем еще один диск.

Инициализируем новый диск:

pvcreate /dev/sdd

* в данном примере мы инициализировали диск sdd.

Проверяем объем физического тома:

pvdisplay

б) Если увеличиваем дисковое пространство имеющегося диска.

Увеличиваем размер физического диска командой:

pvresize /dev/sda

* где /dev/sda — диск, который был увеличен.

Проверяем объем физического тома:

pvdisplay

2. Добавление нового диска к группе томов

Независимо от способа увеличения физического тома, расширяем группу томов командой:

vgextend vg01 /dev/sdd

* данная команда расширит группу vg01 за счет добавленого или расширенного диска sdd.

Результат можно увидеть командой:

vgdisplay

3. Увеличение логического раздела

Выполняется одной командой.

а) все свободное пространство:

lvextend -l +100%FREE /dev/vg01/lv01

* данной командой мы выделяем все свободное пространство группы томов vg01 разделу lv01.

б) определенный объем:

lvextend -L+30G /dev/vg01/lv01

* данной командой мы добавляем 30 Гб от группы томов vg01 разделу lv01.

в) до нужного объема:

lvextend -L500G /dev/vg01/lv01

* данной командой мы доводим наш раздел до объема в 500 Гб.

Результат можно увидеть командой:

lvdisplay

Обратить внимание нужно на опцию LV Size:

  …
  LV Status              available
  # open                 1
  LV Size                <2,99 GiB
  Current LE             765
  …

4. Увеличение размера файловой системы

Чтобы сама система увидела больший объем дискового пространства, необходимо увеличить размер файловой системы.

Посмотреть используемую файловую систему:

df -T

Для каждой файловой системы существуют свои инструменты.

ext2/ext3/ext4:

resize2fs /dev/vg01/lv01

XFS:

xfs_growfs /dev/vg01/lv01

Reiserfs:

resize_reiserfs /dev/vg01/lv01

Уменьшение томов

Размер некоторый файловых систем, например, XFS уменьшить нельзя. Из положения можно выйти, создав новый уменьшенный том с переносом на него данных и последующим удалением.

LVM также позволяет уменьшить размер тома. Для этого необходимо выполнить его отмонтирование, поэтому для уменьшения системного раздела безопаснее всего загрузиться с Linux LiveCD. Далее выполняем инструкцию ниже.

Отмонтируем раздел, который нужно уменьшить:

umount /mnt

Выполняем проверку диска:

e2fsck -fy /dev/vg01/lv01

Уменьшаем размер файловой системы:

resize2fs /dev/vg01/lv01 500M

Уменьшаем размер тома:

lvreduce -L-500 /dev/vg01/lv01

На предупреждение системы отвечаем y:

  WARNING: Reducing active logical volume to 524,00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y

Готово.

Очень важно, чтобы сначала был уменьшен размер файловой системы, затем тома. Также важно не уменьшить размер тома больше, чем файловой системы. В противном случае данные могут быть уничтожены. Перед выполнением операции, обязательно создаем копию важных данных.

Удаление томов

Если необходимо полностью разобрать LVM тома, выполняем следующие действия.

Отмонтируем разделы:

umount /mnt

* где /mnt — точка монтирования для раздела.

Удаляем соответствующую запись из fstab (в противном случае наша система может не загрузиться после перезагрузки):

vi /etc/fstab

#/dev/vg01/lv01  /mnt    ext4    defaults        1 2

* в данном примере мы не удалили, а закомментировали строку монтирования диска.

Смотрим информацию о логичеких томах:

lvdisplay

Теперь удаляем логический том:

lvremove /dev/vg01/lv01

На вопрос системы, действительно ли мы хотим удалить логических том, отвечаем да (y):

Do you really want to remove active logical volume vg01/lv01? [y/n]: y

* если система вернет ошибку Logical volume contains a filesystem in use, необходимо убедиться, что мы отмонтировали том.

Смотрим информацию о группах томов:

vgdisplay

Удаляем группу томов:

vgremove vg01

Убираем пометку с дисков на использование их для LVM:

pvremove /dev/sd{b,c,d}

* в данном примере мы деинициализируем диски /dev/sdb, /dev/sdc, /dev/sdd.

В итоге мы получим:

  Labels on physical volume «/dev/sdb» successfully wiped.
  Labels on physical volume «/dev/sdc» successfully wiped.
  Labels on physical volume «/dev/sdd» successfully wiped.

Создание зеркала

С помощью LVM мы может создать зеркальный том — данные, которые мы будем на нем сохранять, будут отправляться на 2 диска. Таким образом, если один из дисков выходит из строя, мы не потеряем свои данные.

Зеркалирование томов выполняется из группы, где есть, минимум, 2 диска.

1. Сначала инициализируем диски:

pvcreate /dev/sd{d,e}

* в данном примере sdd и sde.

2. Создаем группу:

vgcreate vg02 /dev/sd{d,e}

3. Создаем зеркальный том: 

lvcreate -L200 -m1 -n lv-mir vg02

* мы создали том lv-mir на 200 Мб из группы vg02.

В итоге:

lsblk

… мы увидим что-то на подобие:

sdd                       8:16   0    1G  0 disk
  vg02-lv—mir_rmeta_0  253:2    0    4M  0 lvm
    vg02-lv—mir        253:6    0  200M  0 lvm
  vg02-lv—mir_rimage_0 253:3    0  200M  0 lvm
    vg02-lv—mir        253:6    0  200M  0 lvm
sde                       8:32   0    1G  0 disk
  vg02-lv—mir_rmeta_1  253:4    0    4M  0 lvm
    vg02-lv—mir        253:6    0  200M  0 lvm
  vg02-lv—mir_rimage_1 253:5    0  200M  0 lvm
    vg02-lv—mir        253:6    0  200M  0 lvm

* как видим, на двух дисках у нас появились разделы по 200 Мб.

Работа со снапшотами

Снимки диска позволят нам откатить состояние на определенный момент. Это может послужить быстрым вариантом резервного копирования. Однако нужно понимать, что данные хранятся на одном и том же физическом носителе, а значит, данный способ не является полноценным резервным копированием.

Создание снапшотов для тома, где уже используется файловая система XFS, имеет некоторые нюансы, поэтому разберем разные примеры.

Создание для не XFS:

lvcreate -L500 -s -n sn01 /dev/vg01/lv01

* данная команда помечает, что 500 Мб дискового пространства устройства /dev/vg01/lv01 (тома lv01 группы vg01) будет использоваться для snapshot (опция -s).

Создание для XFS:

xfs_freeze -f /mnt; lvcreate -L500 -s -n sn01 /dev/vg01/lv01; xfs_freeze -u /mnt

* команда xfs_freeze замораживает операции в файловой системе XFS.

Посмотрим список логических томов:

lvs

Получим что-то на подобие:

LV   VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
lv01 vg01 owi-aos—   1,00g
sn01 vg01 swi-a-s— 500,00m      lv01   2,07

* поле Origin показывает, к какому оригинальному логическому тому относится LV, например, в данной ситуации наш раздел для снапшотов относится к lv01.

Также можно посмотреть изменения в томах командой:

lsblk

Мы должны увидеть что-то подобное:

sdc                8:32   0    1G  0 disk 
  vg01-lv01-real 253:3    0    1G  0 lvm  
    vg01-lv01    253:2    0    1G  0 lvm  /mnt
    vg01-sn01    253:5    0    1G  0 lvm  
  vg01-sn01-cow  253:4    0  500M  0 lvm  
    vg01-sn01    253:5    0    1G  0 lvm 

С этого момента все изменения пишутся в vg01-sn01-cow, а vg01-lv01-real фиксируется только для чтения и мы может откатиться к данному состоянию диска в любой момент.

Содержимое снапшота можно смонтировать и посмотреть, как обычный раздел:

mkdir /tmp/snp

Монтирование не XFS:

mount /dev/vg01/sn01 /tmp/snp

Монтирование XFS:

mount -o nouuid,ro /dev/vg01/sn01 /tmp/snp

Для выполнения отката до снапшота, выполняем команду:

lvconvert —merge /dev/vg01/sn01

Импорт диска из другой системы

Если мы перенесли LVM-диск с другого компьютера или виртуальной машины и хотим подключить его без потери данных, то нужно импортировать том.

Если есть возможность, сначала нужно на старом компьютере отмонтировать том и сделать его экспорт:

umount /mnt

* предположим, что диск примонтирован в /mnt.

Деактивируем группу томов:

vgchange -an vg_test

* в данном примере наша группа называется vg_test.

Делаем экспорт:

vgexport vg_test

После переносим диск на новый компьютер.

На новой системе сканируем группы LVM следующей командой:

pvscan

… система отобразит все LVM-тома (подключенные и нет), например:

  PV /dev/sdb    VG vg_test         lvm2 [1020,00 MiB / 0    free]
  PV /dev/sda5   VG ubuntu-vg       lvm2 [11,52 GiB / 0    free]
  Total: 2 [12,52 GiB] / in use: 2 [12,52 GiB] / in no VG: 0 [0   ]

* в данном примере найдено два диска с томами LVM — /dev/sdb (группа vg_test) и /dev/sda5 (группа ubuntu-vg).

В моем примере новый диск с группой vg_test — будум импортировать его. Вводим команду:

vgimport vg_test

Возможны два варианта ответа:

1) если мы экспортировали том:

Volume group «vg_test» successfully imported

2) если не экспортировали:

Volume group «vg_test» is not exported

Так или иначе, группа томов должна появиться в нашей системе — проверяем командой:

vgdisplay

… мы должны увидеть что-то на подобие:

  — Volume group —
  VG Name               vg_test
  System ID             
  Format                lvm2
  …

Активируем его:

vgchange -ay vg_test

Готово. Для монтирования раздела, смотрим его командой:

lvdisplay

… и монтируем в нужный каталог, например:

mount /dev/vg_test/lvol0 /mnt

* в данном примере мы примонтируем раздел lvol0 в группе томов vg_test к каталогу /mnt.

Работа с LVM из под Windows

По умолчанию, система Windows не умеет работать с томами LVM. Для реализации такой возможности, необходимо установить утилиту Virtual Volumes.

На данный момент на сайте разработчика имеется предупреждение, что программное обеспечение на тестировании и его не следует применять для разделов, где есть важные данные без резервных копий. В противном случае, данные можно потерять.

Возможные ошибки

Рассмотрим ошибки, с которыми можно столкнуться при работе с LVM.

Device /dev/sdX excluded by a filter 

Данную ошибку можно встретить при попытке инициализировать диск командой pvcreate.

Причина: либо диск не полностью чист, либо раздел не имеет нужный тип.

Решение: в зависимости от типа проблемы, рассмотрим 2 варианта.

а) если добавляем целый диск.

Удаляем все метаданные с диска командой:

wipefs -a /dev/sdX

* где вместо X (или sdX) подсталвляем имя диска.

б) если добавляем раздел.

Открываем диск с помощью команды fdisk:

fdisk /dev/sdX

* где вместо X (или sdX) подсталвляем имя диска.

Смотрим список созданных на диске разделов:

: p

Задаем тип раздела:

: t

Выбираем номер раздела (например, раздел номер 3):

: 3

Командой L можно посмотреть список всех типов, но нас интересует конкретный — LVM (8e):

: 8e

Сохраняем настройки:

: w

Материал из Xgu.ru

Перейти к: навигация, поиск

Повесть о Linux и LVM (Logical Volume Manager).
+ дополнения

Автор: Иван Песин
Автор: Игорь Чубин (автор дополнений)

В основу этой страницы положена работа «Повесть о Linux и LVM» Ивана Песина, которая, в свою очередь, написана на основе Linux LVM HOWTO.
Она дополнена новыми ссылками и небольшими уточнениями, а также углублённым рассмотрением нескольких дополнительных вопросов.

Один из вопросов это использование kpartx из пакета multipath-tools для построения карты устройства (device map) и рекурсивного доступа к томам LVM (когда LVM развёрнут на разделах, созданных внутри логического тома LVM более низкого уровня). Это может быть полезно при использовании LVM совместно с системами виртуализации.

Второй вопрос — это использование постоянных снимков (persistent snapshot) для быстрого клонирования разделов. Эта возможность может быть полезна как при выполнении резервного копирования, так и при быстром создании виртуальных машин в системах виртуализации (вопрос создания снимков затрагивался и в повести, но здесь он рассмотрен более детально).

Третий вопрос — это сравнение LVM и файловой системой ZFS, набирающей в последнее время большую популярность. На первый взгляд такое сравнение может показаться странным, ведь ZFS — это файловая система, а LVM — система управления томами, то есть нечто, что находится на уровень ниже файловой системы. В действительности, сравнение вполне имеет право на существование, поскольку ZFS это не просто файловая система, а нечто большее. В ней присутствует уровень «storage pool», который берёт на себя те же задачи, что и LVM.

Содержание

  • 1 Введение
    • 1.1 Терминология
    • 1.2 Работа с LVM
    • 1.3 Инициализация дисков и разделов
    • 1.4 Создание группы томов
    • 1.5 Активация группы томов
    • 1.6 Удаление группы томов
    • 1.7 Добавление физических томов в группу томов
    • 1.8 Удаление физических томов из группы томов
    • 1.9 Создание логического тома
    • 1.10 Удаление логических томов
    • 1.11 Увеличение логических томов
      • 1.11.1 ext2/ext3/ext4
      • 1.11.2 jfs
      • 1.11.3 reiserfs
      • 1.11.4 xfs
    • 1.12 Уменьшение размера логического тома
      • 1.12.1 ext2
      • 1.12.2 ext2/ext3/ext4
      • 1.12.3 reiserfs
      • 1.12.4 xfs
    • 1.13 Перенос данных с физического тома
  • 2 Примеры
    • 2.1 Настройка LVM на трех SCSI дисках
    • 2.2 Создание логического тома
    • 2.3 Создание файловой системы
    • 2.4 Тестирование файловой системы
    • 2.5 Создание логического тома с «расслоением»
    • 2.6 Добавление нового диска
    • 2.7 Резервное копирование при помощи «снапшотов»
    • 2.8 Удаление диска из группы томов
    • 2.9 Перенос группы томов на другую систему
    • 2.10 Конвертация корневой файловой системы в LVM
    • 2.11 Организация корневой файловой системы в LVM для дистрибутива ALT Master 2.2
  • 3 Заключение
  • 4 Дополнительные вопросы по LVM
    • 4.1 Дисковые разделы и LVM внутри LVM
    • 4.2 Создание зашифрованных томов LVM
    • 4.3 Сравнение LVM и ZFS
    • 4.4 Восстановления LVM после сбоя
    • 4.5 Слияние LVM
    • 4.6 Thin Provisioning
    • 4.7 Поддержка LVM в NetBSD
    • 4.8 Работа с LVM в FreeBSD
    • 4.9 Работа с LVM в Windows
    • 4.10 Альтернативы LVM
    • 4.11 Графические инструменты администрирования LVM
    • 4.12 Ограничение скорости доступа к LVM-томам
  • 5 Приложения
    • 5.1 Список команд для работы с LVM
  • 6 Дополнительная информация
  • 7 Примечания

[править] Введение

Цель статьи — описать процесс установки и использования менеджера логических томов на Linux-системе. LVM (Logical Volume Manager), менеджер логических томов — это система управления дисковым пространством, абстрагирующаяся от физических устройств. Она позволяет эффективно использовать и легко управлять дисковым пространством. LVM обладает хорошей масштабируемостью, уменьшает общую сложность системы. У логических томов, созданных с помощью LVM, можно легко изменить размер, а их названия могут нести большую смысловую нагрузку, в отличие от традиционных /dev/sda, /dev/hda …

Реализации менеджеров логических томов существуют практически во всех UNIX-подобных операционных системах. Зачастую они сильно отличаются в реализации, но все они основаны на одинаковой идее и преследуют аналогичные цели. Одна из основных реализаций была выполнена Open Software Foundation (OSF) и сейчас входит в состав многих систем, например IBM AIX, DEC Tru64, HP/UX. Она же послужила и основой для Linux-реализации LVM.

Данная статья является переработкой и дополнением LVM-HOWTO.

[править] Терминология

Поскольку система управления логическими томами использует собственную модель представления дискового пространства, нам необходимо определиться с терминами и взаимосвязями понятий. Рассмотрим схему, основанную на диаграмме Эрика Бегфорса (Erik Bеgfors), приведенную им в списке рассылки linux-lvm. Она демонстрирует взаимосвязь понятий системы LVM:

sda1     sda2     sdb     sdc       <-- PV
 |        |        |       |
 |        |        |       |
 +--------+- VG00 -+-------+        <-- VG
              |
 +-------+-------+---------+
 |       |       |         |
root    usr     home      var       <-- LV
 |       |       |         | 
ext3 reiserfs reiserfs    xfs       <-- Файловые системы

Обозначения и понятия:

  • PV, Physical volume, физический том. Обычно это раздел на диске или весь диск. В том числе, устройства программного и аппаратного RAID (которые уже могут включать в себя несколько физических дисков). Физические тома входят в состав группы томов.
  • VG, Volume group, группа томов. Это самый верхний уровень абстрактной модели, используемой системой LVM. С одной стороны группа томов состоит из физических томов, с другой — из логических и представляет собой единую административную единицу.
  • LV, Logical volume, логический том. Раздел группы томов, эквивалентен разделу диска в не-LVM системе. Представляет собой блочное устройство и, как следствие, может содержать файловую систему.
  • PE, Physical extent, физический экстент. Каждый физический том делится на порции данных, называющиеся физическими экстентами. Их размеры те же, что и у логических экстентов.
  • LE, Logical extent, логический экстент. Каждый логический том делится на порции данных, называющиеся логическими экстентами. Размер логических экстентов не меняется в пределах группы томов.

Давайте теперь соединим все эти понятия в общую картину. Пусть у нас имеется группа томов VG00 с размером физического экстента 4Мб. В эту группу мы добавляем два раздела, /dev/hda1 и /dev/hdb1. Эти разделы становятся физическими томами, например PV1 и PV2 (символьные имена присваивает администратор, так что они могут быть более осмысленными). Физические тома делятся на 4-х мегабайтные порции данных, т.к. это размер физического экстента. Диски имеют разный размер: PV1 получается размером в 99 экстентов, а PV2 — размером в 248 экстентов. Теперь можно приступать к созданию логических томов, размером от 1 до 347 (248+99) экстентов. При создании логического тома, определяется отображение между логическими и физическими экстентами. Например, логический экстент 1 может отображаться в физический экстент 51 тома PV1. В этом случае, данные, записанные в первые 4Мб логического экстента 1, будут в действительности записаны в 51-й экстент тома PV1.

Администратор может выбрать алгоритм отображения логических экстентов в физические. На данный момент доступны два алгоритма:

1. Линейное отображение последовательно назначает набор физических экстентов области логического тома, т.е. LE 1 — 99 отображаются на PV1, а LE 100 — 347 — на PV2.

2. «Расслоенное» (striped) отображение разделяет порции данных логических экстентов на определенное количество физических томов. То есть:

     1-я порция данных LE[1] -> PV1[1],
     2-я порция данных LE[1] -> PV2[1],
     3-я порция данных LE[1] -> PV3[1],
     4-я порция данных LE[1] -> PV1[2], и т.д.

Похожая схема используется в работе RAID нулевого уровня. В некоторых ситуациях этот алгоритм отображения позволяет увеличить производительность логического тома. Однако он имеет значительное ограничение: логический том с данным отображением не может быть расширен за пределы физических томов, на которых он изначально и создавался.

Великолепная возможность, предоставляемая системой LVM — это «снапшоты». Они позволяют администратору создавать новые блочные устройства с точной копией логического тома, «замороженного» в какой-то момент времени. Обычно это используется в пакетных режимах. Например, при создании резервной копии системы. Однако при этом вам не будет нужно останавливать работающие задачи, меняющие данные на файловой системе. Когда необходимые процедуры будут выполнены, системный администратор может просто удалить устройство-«снапшот». Ниже мы рассмотрим работу с таким устройством.

[править] Работа с LVM

Давайте теперь рассмотрим задачи, стоящие перед администратором LVM системы. Помните, что для работы с системой LVM ее нужно инициализировать командами:

%# vgscan
%# vgchange -ay

Первая команда сканирует диски на предмет наличия групп томов, вторая активирует все найденные группы томов. Аналогично для завершения всех работ, связанных с LVM, нужно выполнить деактивацию групп:

%# vgchange -an

Первые две строки нужно будет поместить в скрипты автозагрузки (если их там нет), а последнюю можно дописать в скрипт shutdown.

[править] Инициализация дисков и разделов

Перед использованием диска или раздела в качестве физического тома необходимо его инициализировать:

Для целого диска:

%# pvcreate /dev/hdb

Эта команда создает в начале диска дескриптор группы томов.

Если вы получили ошибку инициализации диска с таблицей разделов — проверьте, что работаете именно с нужным диском, и когда полностью будете уверены в том, что делаете, выполните следующие команды

%# dd if=/dev/zero of=/dev/diskname bs=1k count=1
%# blockdev --rereadpt /dev/diskname

Эти команды уничтожат таблицу разделов на целевом диске.

Для разделов:

Установите программой fdisk тип раздела в 0x8e.

%# pvcreate /dev/hdb1

Команда создаст в начале раздела /dev/hdb1 дескриптор группы томов.

[править] Создание группы томов

Для создания группы томов используется команда ‘vgcreate’

%# vgcreate vg00  /dev/hda1 /dev/hdb1 

Note-icon.gif

Если вы используете devfs важно указывать полное имя в devfs, а не ссылку в каталоге /dev. Таким образом приведенная команда должна выглядеть в системе с devfs так:

# vgcreate vg00  /dev/ide/host0/bus0/target0/lun0/part1 /dev/ide/host0/bus0/target1/lun0/part1

Кроме того, вы можете задать размер экстента при помощи ключа «-s», если значение по умолчанию в 4Мб вас не устраивает. Можно, также, указать ограничения возможного количества физических и логических томов.

[править] Активация группы томов

После перезагрузки системы или выполнения команды vgchange -an, ваши группы томов и логические тома находятся в неактивном состоянии. Для их активации необходимо выполнить команду

%# vgchange -a y vg00

[править] Удаление группы томов

Убедитесь, что группа томов не содержит логических томов. Как это сделать, показано в следующих разделах.

Деактивируйте группу томов:

%# vgchange -a n vg00

Теперь можно удалить группу томов командой:

%# vgremove vg00

[править] Добавление физических томов в группу томов

Для добавления предварительно инициализированного физического тома в существующую группу томов используется команда ‘vgextend’:

%# vgextend vg00 /dev/hdc1
                 ^^^^^^^^^ новый физический том

[править] Удаление физических томов из группы томов

Убедитесь, что физический том не используется никакими логическими томами. Для этого используйте команду ‘pvdisplay’:

%# pvdisplay /dev/hda1

--- Physical volume ---
   PV Name            /dev/hda1
   VG Name            vg00
   PV Size            1.95 GB / NOT usable 4 MB [LVM: 122 KB]
   PV#                1
   PV Status          available
   Allocatable        yes (but full)
   Cur LV             1
   PE Size (KByte)    4096
   Total PE           499
   Free PE            0
   Allocated PE       499
   PV UUID            Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

Если же физический том используется, вам нужно будет перенести данные на другой физический том при помощи команды pvmove.

%# pvmove /dev/hda1

Затем можно использовать ‘vgreduce’ для удаления физических томов:

%# vgreduce vg00 /dev/hda1

После этого используя pvremove можно удалить устройство, в котором больше нет необходимости, заполняя его метаданные нулями.

Эта процедура будет описана в следующих разделах.

[править] Создание логического тома

Для того, чтобы создать логический том «lv00», размером 1500Мб, выполните команду:

 %# lvcreate -L1500 -n lv00 vg00

Без указания суффикса размеру раздела используется множитель «мегабайт» (в системе СИ равный 106 байт), что и продемонстрировано в примере выше. Суффиксы в верхнем регистре (KMGTPE) соответствуют единицам в системе СИ (с основанием 10), например, G — гигабайт равен 109 байт, а суффиксы в нижнем регистре (kmgtpe) соответствуют единицам в системе IEC (с основанием 2), например g — гибибайт равен 230 байт.

Для создания логического тома размером в 100 логических экстентов с расслоением по двум физическим томам и размером блока данных 4 KB:

 %# lvcreate -i2 -I4 -l100 -n lv01 vg00

Если вы хотите создать логический том, полностью занимающий группу томов, выполните команду vgdisplay, чтобы узнать полный размер группы томов, после чего используйте команду lvcreate.

 %# vgdisplay vg00 | grep "Total PE"
 Total PE        10230
 %# lvcreate -l 10230 vg00 -n lv02

Эти команды создают логический том lv02, полностью заполняющий группу томов.
Тоже самое можно реализовать командой

 %# lvcreate -l100%FREE vg00 -n lv02

[править] Удаление логических томов

Логический том должен быть размонтирован перед удалением:

%# umount /dev/vg00/home
%# lvremove /dev/vg00/home
lvremove -- do you really want to remove "/dev/vg00/home"? [y/n]:    y
lvremove -- doing automatic backup of volume group "vg00"
lvremove -- logical volume "/dev/vg00/home" successfully removed

[править] Увеличение логических томов

Для увеличения логического тома вам нужно просто указать команде lvextend до какого размера вы хотите увеличить том:

%# lvextend -L12G /dev/vg00/home
lvextend -- extending logical volume "/dev/vg00/home" to 12 GB
lvextend -- doing automatic backup of volume group "vg00"
lvextend -- logical volume "/dev/vg00/home" successfully extended

В результате /dev/vg00/home увеличится до 12Гбайт.

%# lvextend -L+1G /dev/vg00/home
lvextend -- extending logical volume "/dev/vg00/home" to 13 GB
lvextend -- doing automatic backup of volume group "vg00"
lvextend -- logical volume "/dev/vg00/home" successfully extended

Эта команда увеличивает размер логического тома на 1Гб.

%# lvextend -l +100%FREE /dev/vg00/home
lvextend -- extending logical volume "/dev/vg00/home" to 68.59 GB
lvextend -- doing automatic backup of volume group "vg00"
lvextend -- logical volume "/dev/vg00/home" successfully extended

А эта команда увеличивает размер логического тома до максимально доступного.

После того как вы увеличили логический том, необходимо соответственно увеличить размер файловой системы. Как это сделать зависит от типа используемой файловой системы.

По умолчанию большинство утилит изменения размера файловой системы увеличивают ее размер до размера соответствующего логического тома. Так что вам не нужно беспокоится об указании одинаковых размеров для всех команд.

[править] ext2/ext3/ext4

Если вы не пропатчили ваше ядро патчем ext2online, вам будет необходимо размонтировать файловую систему перед изменением размера:

    %# umount /dev/vg00/home
    %# resize2fs /dev/vg00/home
    %# mount /dev/vg00/home /home

Если у вас нет пакета e2fsprogs 1.19 его можно загрузить с сайта ext2resize.sourceforge.net.

Для файловой системы ext2 есть и другой путь. В состав LVM входит утилита e2fsadm, которая выполняет и lvextend, и resize2fs (она также выполняет и уменьшение размера файловой системы, это описано в следующем разделе). Так что можно использовать одну команду:

    %# e2fsadm -L+1G /dev/vg00/home

что эквивалентно двум следующим:

    %# lvextend -L+1G /dev/vg00/home
    %# resize2fs /dev/vg00/home

Note-icon.gif

вам все равно нужно будет размонтировать файловую систему перед выполнением e2fsadm.

[править] jfs

mount -o remount,resize /home

[править] reiserfs

Увеличивать размер файловых систем Reiserfs можно как в смонтированном, так и в размонтированном состоянии.

Увеличить размер смонтированной файловой системы:

    %# resize_reiserfs -f /dev/vg00/home

Увеличить размер размонтированной файловой системы:

    %# umount /dev/vg00/homevol
    %# resize_reiserfs /dev/vg00/homevol
    %# mount -treiserfs /dev/vg00/homevol /home

[править] xfs

Размер файловой системы XFS можно увеличить только в смонтированном состоянии. Кроме того, утилите в качестве параметра нужно передать точку монтирования, а не имя устройства:

    %# xfs_growfs /home

[править] Уменьшение размера логического тома

Логические тома могут быть уменьшены в размере, точно также как и увеличены. Однако очень важно помнить, что нужно в первую очередь уменьшить размер файловой системы, и только после этого уменьшать размер логического тома. Если вы нарушите последовательность, вы можете потерять данные.

[править] ext2

При использовании файловой системы ext2, как уже указывалось ранее, можно использовать команду e2fsadm:

   # umount /home
   # e2fsadm -L-1G /dev/vg00/home
   # mount /home

Если вы хотите выполнить операцию по уменьшению логического тома вручную, вам нужно знать размер тома в блоках:

   # umount /home
   # resize2fs /dev/vg00/home 524288
   # lvreduce -L-1G /dev/vg00/home
   # mount /home

[править] ext2/ext3/ext4

Способ применимый в более современных системах.

   $ sudo umount /home
   $ sudo e2fsck -f /dev/vg00/home
   $ sudo resize2fs /dev/vg00/home 11G

Указываем размер явно и с некоторым с запасом:

   $ sudo lvreduce -L 12G /dev/vg00/home
   $ sudo e2fsck -f /dev/vg00/home
   $ sudo mount /home

[править] reiserfs

При уменьшении размера файловой системы Reiserfs, ее нужно размонтировать:

   # umount /home
   # resize_reiserfs -s-1G /dev/vg00/home
   # lvreduce -L-1G /dev/vg00/home
   # mount -treiserfs /dev/vg00/home /home

[править] xfs

Уменьшить размер файловой системы XFS нельзя.

Примечание: обратите внимание на то, что для уменьшения размера файловых систем, необходимо их размонтировать. Это вносит определенные трудности, если вы желаете уменьшить размер корневой файловой системы. В этом случае можно применить следующий метод: загрузится с CD дистрибутива, поддерживающего LVM. Перейти в командный режим (обычно это делается нажатием клавиш Alt+F2) и выполнить команды сканирования и активации группы томов:

%# vgscan
%# vgchange -a y

Теперь вы имеете доступ к логическим томам и можете изменять их размеры:

%# resize_reiserfs -s-500M /dev/vg00/root
%# lvreduce -L-500M /dev/vg00/root
%# reboot

[править] Перенос данных с физического тома

Для того, чтобы можно было удалить физический том из группы томов, необходимо освободить все занятые на нем физические экстенты. Это делается путем перераспределения занятых физических экстентов на другие физические тома. Следовательно, в группе томов должно быть достаточно свободных физических экстентов. Описание операции удаления физического тома приведено в разделе примеров.

[править] Примеры

[править] Настройка LVM на трех SCSI дисках

В первом примере мы настроим логический том из трех SCSI дисков. Устройства дисков: /dev/sda, /dev/sdb и /dev/sdc.

Перед добавлением в группу томов диски нужно инициализировать:

%# pvcreate /dev/sda
%# pvcreate /dev/sdb
%# pvcreate /dev/sdc

После выполнения этих команд в начале каждого диска создастся область дескрипторов группы томов.

Теперь создадим группу томов vg01, состоящую из этих дисков:

%# vgcreate vg01 /dev/sda /dev/sdb /dev/sdc

Проверим статус группы томов командой vgdisplay:

%# vgdisplay
--- Volume Group ---
VG Name            vg01
VG Access          read/write
VG Status          available/resizable
VG #               1
MAX LV             256
Cur LV             0
Open LV            0
MAX LV Size        255.99 GB
Max PV             256
Cur PV             3
Act PV             3
VG Size            1.45 GB
PE Size            4 MB
Total PE           372
Alloc PE / Size    0 / 0
Free PE / Size     372/ 1.45 GB
VG UUID            nP2PY5-5TOS-hLx0-FDu0-2a6N-f37x-0BME0Y

Обратите внимание на первые три строки и строку с общим размером группы томов. Она должна соответствовать сумме всех трех дисков. Если всё в порядке, можно переходить к следующей задаче.

[править] Создание логического тома

После успешного создания группы томов, можно начать создавать логические тома в этой группе. Размер тома может быть любым, но, естественно, не более всего размера группы томов. В этом примере мы создадим один логический том размером 1 Гб. Мы не будем использовать «расслоение», поскольку при этом невозможно добавить диск в группу томов после создания логического тома, использующего данный алгоритм.

%# lvcreate -L1G -nusrlv vg01
lvcreate -- doing automatic backup of "vg01"
lvcreate -- logical volume "/dev/vg01/usrlv" successfully created

[править] Создание файловой системы

Создадим на логическом томе файловую систему ext2:

%# mke2fs /dev/vg01/usrlv
mke2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
9 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

[править] Тестирование файловой системы

Смонтируйте логический том и проверьте все ли в порядке:

%# mount /dev/vg01/usrlv /mnt
%# df
Filesystem       1k-blocks   Used Available Use% Mounted on
/dev/hda1          1311552 628824    616104  51% /
/dev/vg01/usrlv    1040132     20    987276   0% /mnt

Если вы все сделали правильно, у вас должен появиться логический том с файловой системой ext2, смонтированный в точке /mnt.

[править] Создание логического тома с «расслоением»

Рассмотрим теперь вариант логического тома, использующего алгоритм «расслоения». Как уже указывалось выше, минусом этого решения является невозможность добавления дополнительного диска.

Процедура создания данного типа логического тома также требует инициализации устройств и добавления их в группу томов, как это уже было показано.

Для создания логического тома с «расслоением» на три физических тома с блоком данных 4Кб выполните команду:

%# lvcreate -i3 -I4 -L1G -nvarlv vg01
lvcreate -- rounding 1048576 KB to stripe boundary size 1056768 KB / 258 PE
lvcreate -- doing automatic backup of "vg01"
lvcreate -- logical volume "/dev/vg01/varlv"    successfully created

После чего можно создавать файловую систему на логическом томе.

[править] Добавление нового диска

Рассмотрим систему со следующей конфигурацией:

%# pvscan
pvscan -- ACTIVE   PV "/dev/sda"  of VG "dev"   [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdb"  of VG "sales" [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdc"  of VG "ops"   [1.95 GB / 44 MB free]
pvscan -- ACTIVE   PV "/dev/sdd"  of VG "dev"   [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sde1" of VG "ops"   [996 MB / 52 MB free]
pvscan -- ACTIVE   PV "/dev/sde2" of VG "sales" [996 MB / 944 MB free]
pvscan -- ACTIVE   PV "/dev/sdf1" of VG "ops"   [996 MB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdf2" of VG "dev"   [996 MB / 72 MB free]
pvscan -- total: 8 [11.72 GB] / in use: 8 [11.72 GB] / in no VG: 0 [0]

%# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/dev/cvs           1342492    516468    757828  41% /mnt/dev/cvs
/dev/dev/users         2064208   2060036      4172 100% /mnt/dev/users
/dev/dev/build         1548144   1023041    525103  66% /mnt/dev/build
/dev/ops/databases     2890692   2302417    588275  79% /mnt/ops/databases
/dev/sales/users       2064208    871214   1192994  42% /mnt/sales/users
/dev/ops/batch         1032088    897122    134966  86% /mnt/ops/batch

Как видно из листинга, группы томов «dev» и «ops» практически заполнены. В систему добавили новый диск /dev/sdg. Его необходимо разделить между группами «ops» и «dev», поэтому разобьем его на разделы:

%# fdisk /dev/sdg
Device contains neither a valid DOS partition table, nor Sun or SGI
disklabel Building a new DOS disklabel. Changes will remain in memory
only, until you decide to write them. After that, of course, the
previous content won't be recoverable.

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1000, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1000, default 1000): 500

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (501-1000, default 501): 
Using default value 501
Last cylinder or +size or +sizeM or +sizeK (501-1000, default 1000): 
Using default value 1000

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Unknown)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Unknown)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x partitions,
please see the fdisk manual page for additional information.

Перед тем как добавить разделы в группу томов, их необходимо инициализировать:

%# pvcreate /dev/sdg1
pvcreate -- physical volume "/dev/sdg1" successfully created

# pvcreate /dev/sdg2
pvcreate -- physical volume "/dev/sdg2" successfully created

Теперь можно добавлять физические тома в группы томов:

%# vgextend ops /dev/sdg1
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "ops"
vgextend -- volume group "ops" successfully extended

# vgextend dev /dev/sdg2
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "dev"
vgextend -- volume group "dev" successfully extended

# pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- ACTIVE   PV "/dev/sda"  of VG "dev"   [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdb"  of VG "sales" [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdc"  of VG "ops"   [1.95 GB / 44 MB free]
pvscan -- ACTIVE   PV "/dev/sdd"  of VG "dev"   [1.95 GB / 0 free]
pvscan -- ACTIVE   PV "/dev/sde1" of VG "ops"   [996 MB / 52 MB free]
pvscan -- ACTIVE   PV "/dev/sde2" of VG "sales" [996 MB / 944 MB free]
pvscan -- ACTIVE   PV "/dev/sdf1" of VG "ops"   [996 MB / 0 free]
pvscan -- ACTIVE   PV "/dev/sdf2" of VG "dev"   [996 MB / 72 MB free]
pvscan -- ACTIVE   PV "/dev/sdg1" of VG "ops"   [996 MB / 996 MB free]
pvscan -- ACTIVE   PV "/dev/sdg2" of VG "dev"   [996 MB / 996 MB free]
pvscan -- total: 10 [13.67 GB] / in use: 10 [13.67 GB] / in no VG: 0 [0]

Наконец, увеличим размеры логических томов и расширим файловые системы до размеров логических томов:

%# umount /mnt/ops/batch
%# umount /mnt/dev/users

# export E2FSADM_RESIZE_CMD=ext2resize
# e2fsadm /dev/ops/batch -L+500M
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/ops/batch: 11/131072 files (0.0<!--  non-contiguous), 4127/262144 blocks
lvextend -- extending logical volume "/dev/ops/batch" to 1.49 GB
lvextend -- doing automatic backup of volume group "ops"
lvextend -- logical volume "/dev/ops/batch" successfully extended

ext2resize v1.1.15 - 2000/08/08 for EXT2FS 0.5b
e2fsadm -- ext2fs in logical volume "/dev/ops/batch" successfully extended to 1.49 GB


# e2fsadm /dev/dev/users -L+900M
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/dev/users: 12/262144 files (0.0% non-contiguous), 275245/524288 blocks
lvextend -- extending logical volume "/dev/dev/users" to 2.88 GB
lvextend -- doing automatic backup of volume group "dev"
lvextend -- logical volume "/dev/dev/users" successfully extended

ext2resize v1.1.15 - 2000/08/08 for EXT2FS 0.5b
e2fsadm -- ext2fs in logical volume "/dev/dev/users" successfully extended to 2.88 GB

Нам осталось смонтировать системы и посмотреть их размеры:

%# mount /dev/ops/batch
%# mount /dev/dev/users
%# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/dev/cvs           1342492    516468    757828  41% /mnt/dev/cvs
/dev/dev/users         2969360   2060036    909324  69% /mnt/dev/users
/dev/dev/build         1548144   1023041    525103  66% /mnt/dev/build
/dev/ops/databases     2890692   2302417    588275  79% /mnt/ops/databases
/dev/sales/users       2064208    871214   1192994  42% /mnt/sales/users
/dev/ops/batch         1535856    897122    638734  58% /mnt/ops/batch

[править] Резервное копирование при помощи «снапшотов»

Развивая приведенный пример, предположим, что нам нужно выполнить резервирование базы данных. Для этой задачи мы будем использовать устройство-«снапшот».

Этот тип устройства представляет собой доступную только на чтение (при использовании опции —permission r) копию другого тома на момент выполнения процедуры «снапшот». Это дает возможность продолжать работу не заботясь о том, что данные могут измениться в момент резервного копирования. Следовательно, нам не нужно останавливать работу базы данных на время выполнения резервного копирования. Остановка нужна только на момент создания устройства-«снапшот», который значительно короче самого копирования.

В группе томов ops у нас осталось около 600Мб свободного места, его мы и задействуем для «снапшот»-устройства. Размер «снапшот»-устройства не регламентируется, но должен быть достаточен для сохранения всех изменений, которые могут произойти с томом, с которого он сделан, за время жизни снапшота. 600Мб должно хватить для наших целей:

%# lvcreate -L592M -s -n dbbackup -p r /dev/ops/databases 
lvcreate -- WARNING: the snapshot must be disabled if it gets full
lvcreate -- INFO: using default snapshot chunk size of 64 KB for "/dev/ops/dbbackup"
lvcreate -- doing automatic backup of "ops"
lvcreate -- logical volume "/dev/ops/dbbackup" successfully create

Если вы делаете «снапшот» файловой системы XFS, нужно выполнить на смонтированной файловой системе команду xfs_freeze, и лишь после этого создавать «снапшот»:

%# xfs_freeze -f /mnt/point; lvcreate -L592M -s -n dbbackup /dev/ops/databases; xfs_freeze -u /mnt/point

Icon-caution.gif

Если устройство-«снапшот» полностью заполняется, оно автоматически деактивируется. В этом случае «снапшот» не может более использоваться, потому крайне важно выделять достаточное пространство для него.

После того как мы создали «снапшот», его нужно смонтировать:

%# mkdir /mnt/ops/dbbackup
%# mount /dev/ops/dbbackup /mnt/ops/dbbackup
mount: block device /dev/ops/dbbackup is write-protected, mounting read-only

Если вы работаете с файловой системой XFS, вам будет нужно при монтировании указать опцию nouuid:

%# mount -o nouuid,ro /dev/ops/dbbackup /mnt/ops/dbbackup

Выполним резервное копирование раздела:

%# tar -cf /dev/rmt0 /mnt/ops/dbbackup
tar: Removing leading `/' from member names

После выполнения необходимых процедур, нужно удалить устройство-«снапшот»:

%# umount /mnt/ops/dbbackup
%# lvremove /dev/ops/dbbackup 
lvremove -- do you really want to remove "/dev/ops/dbbackup"? [y/n]: y
lvremove -- doing automatic backup of volume group "ops"
lvremove -- logical volume "/dev/ops/dbbackup" successfully removed

Icon-caution.gif

Запись данных на том, с которого сделан снимок, очень сильно замедлена
по сравнению с обычной работой!

Элементарное сравнение производительности, наглядно демонстрирующее разницу
между скоростью работы с томом, у которого нет снапшотов (смонтирован в /data/lv3/xxxx),
и с томом, на котором есть снапшот (смонтирован в /data/lv4/qqqq).

%# dd if=/dev/zero of=/data/lv3/xxxx count=100 bs=1024k
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.827104 s, 127 MB/s

%# dd if=/dev/zero of=/data/lv4/qqqq count=100 bs=1024k
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 5.77779 s, 18.1 MB/s

Подробнее о снапшотах:

  • Consistent backup with Linux Logical Volume Manager (LVM) snapshots (англ.)
  • Back Up (And Restore) LVM Partitions With LVM Snapshots (англ.)
  • Linux Kernel Documentation: device-mapper/snapshot.txt (англ.)

Резервное копирование MySQL и LVM:

  • Using LVM for MySQL Backup and Replication Setup (англ.)
  • MySQL Backups using LVM Snapshots (англ.)
  • mylvmbackup (англ.)

[править] Удаление диска из группы томов

Скажем, вы хотите освободить один диск из группы томов. Для этого необходимо выполнить процедуру переноса использующихся физических экстентов. Естественно, что на других физических томах должно быть достаточно свободных физических экстентов.

Выполните команду:

%# pvmove /dev/hdb
pvmove -- moving physical extents in active volume group "vg00"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? [y/n] y
pvmove -- 249 extents of physical volume "/dev/hdb" successfully moved

Учтите, что операция переноса физических экстентов занимает много времени. Если вы хотите наблюдать за процессом переноса экстентов, укажите в команде ключ -v .

После окончания процедуры переноса, удалите физический том из группы томов:

%# vgreduce vg00 /dev/hdb
vgreduce -- doing automatic backup of volume group "vg00"
vgreduce -- volume group "vg00" successfully reduced by physical volume:
vgreduce -- /dev/hdb

Теперь данный диск может быть физически удален из системы или использован в других целях. Например, добавлен в другую группу томов.

[править] Перенос группы томов на другую систему

Физический перенос группы томов на другую систему организовывается при помощи команд vgexport и vgimport.

Сперва необходимо размонтировать все логические тома группы томов и деактивировать группу:

%# unmount /mnt/design/users
%# vgchange -an design
vgchange -- volume group "design" successfully deactivated

После этого экспортируем группу томов. Процедура экспорта запрещает доступ к группе на данной системе и готовит ее к удалению:

%# vgexport design
vgexport -- volume group "design" sucessfully exported

Теперь можно выключить машину, отсоединить диски, составляющие группу томов и подключить их к новой системе. Остается импортировать группу томов на новой машине и смонтировать логические тома:

%# pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/sdb1"  is in EXPORTED VG "design" [996 MB / 996 MB free]
pvscan -- inactive PV "/dev/sdb2"  is in EXPORTED VG "design" [996 MB / 244 MB free]
pvscan -- total: 2 [1.95 GB] / in use: 2 [1.95 GB] / in no VG: 0 [0]
# vgimport design /dev/sdb1 /dev/sdb2
vgimport -- doing automatic backup of volume group "design"
vgimport -- volume group "design" successfully imported and activated

%# mkdir -p /mnt/design/users
%# mount /dev/design/users /mnt/design/users

Все! Группа томов готова к использованию на новой системе.

[править] Конвертация корневой файловой системы в LVM

В данном примере имеется установленная система на двух разделах: корневом и /boot. Диск размером 2Гб разбит на разделы следующим образом:

/dev/hda1  /boot 
/dev/hda2  swap
/dev/hda3  /

Корневой раздел занимает все пространство, оставшееся после выделения swap и /boot разделов. Главное требование, предъявляемое к корневому разделу в нашем примере: он должен быть более чем на половину пуст. Это нужно, чтобы мы могли создать его копию. Если это не так, нужно будет использовать дополнительный диск. Процесс при этом останется тот же, но уменьшать корневой раздел будет не нужно.

Для изменения размера файловой системы мы будем использовать утилиту GNU parted.

Загрузитесь в однопользовательском режиме, это важно. Запустите программу parted для уменьшения размера корневого раздела. Ниже приведен пример диалога с утилитой parted:

# parted /dev/hda
(parted) p
.
.
.

Изменим размер раздела:

(parted) resize 3 145 999

Первое число — это номер раздела (hda3), второе — начало раздела hda3, не меняйте его. Последнее число — это конец раздела. Укажите приблизительно половину текущего размера раздела.

Создадим новый раздел:

(parted) mkpart primary ext2 1000 1999

Этот раздел будет содержать LVM. Он должен начинаться после раздела hda3 и заканчиваться в конце диска.

Выйдите из утилиты parted:

(parted) q

Перезагрузите систему. Убедитесь, что ваше ядро содержит необходимые установки. Для поддержки LVM должны быть включены параметры CONFIG_BLK_DEV_RAM и CONFIG_BLK_DEV_INITRD.

Для созданного раздела необходимо изменить тип на LVM (8e). Поскольку parted не знает такого типа, воспользуемся утилитой fdisk:

%# fdisk /dev/hda
Command (m for help): t
Partition number (1-4): 4
Hex code (type L to list codes): 8e
Changed system type of partition 4 to 8e (Unknown)
Command (m for help): w

Инициализируем LVM, физический том; создаем группу томов и логический том для корневого раздела:

%# vgscan
%# pvcreate /dev/hda4
%# vgcreate vg /dev/hda4
%# lvcreate -L250M -n root vg

Создадим теперь файловую систему на логическом томе и перенесем туда содержимое корневого каталога:

%# mke2fs /dev/vg/root
%# mount /dev/vg/root /mnt/
%# find / -xdev | cpio -pvmd /mnt

Отредактируйте файл /mnt/etc/fstab на логическом томе соответствующем образом. Например, строку:

/dev/hda3       /    ext2       defaults 1 1

замените на:

/dev/vg/root    /    ext2       defaults 1 1

Создаем образ initrd, поддерживающий LVM:

%# lvmcreate_initrd
Logical Volume Manager 1.0.6 by Heinz Mauelshagen  25/10/2002
lvmcreate_initrd -- make LVM initial ram disk /boot/initrd-lvm-2.4.20-inp1-up-rootlvm.gz

lvmcreate_initrd -- finding required shared libraries
lvmcreate_initrd -- stripping shared libraries
lvmcreate_initrd -- calculating initrd filesystem parameters
lvmcreate_initrd -- calculating loopback file size
lvmcreate_initrd -- making loopback file (6491 kB)
lvmcreate_initrd -- making ram disk filesystem (19125 inodes)
lvmcreate_initrd -- mounting ram disk filesystem
lvmcreate_initrd -- creating new /etc/modules.conf
lvmcreate_initrd -- creating new modules.dep
lvmcreate_initrd -- copying device files to ram disk
lvmcreate_initrd -- copying initrd files to ram disk
lvmcreate_initrd -- copying shared libraries to ram disk
lvmcreate_initrd -- creating new /linuxrc
lvmcreate_initrd -- creating new /etc/fstab
lvmcreate_initrd -- ummounting ram disk
lvmcreate_initrd -- creating compressed initrd /boot/initrd-lvm-2.4.20-inp1-up-rootlvm.gz

Внимательно изучите вывод команды. Обратите внимание на имя
нового образа и его размер. Отредактируйте файл /etc/lilo.conf. Он
должен выглядеть приблизительно следующим образом:

image   = /boot/KERNEL_IMAGE_NAME
label   = lvm
root    = /dev/vg/root
initrd  = /boot/INITRD_IMAGE_NAME
ramdisk = 8192

KERNEL_IMAGE_NAME — имя ядра, поддерживающего LVM. INITRD_IMAGE_NAME — имя образа initrd, созданного командой lvmcreate_initrd. Возможно, вам будет нужно увеличить значение ramdisk, если у вас достаточно большая конфигурация LVM, но значения 8192 должно хватить в большинстве случаев. Значение по умолчанию параметра ramdisk равно 4096. Если сомневаетесь, проверьте вывод команды lvmcreate_initrd в строке lvmcreate_initrd — making loopback file (6189 kB).

После этого файл lilo.conf нужно скопировать и на логический том:

%# cp /etc/lilo.conf /mnt/etc/

Выполните команду lilo:

%# lilo

Перезагрузитесь и выберите образ lvm. Для этого введите «lvm» в ответ на приглашение LILO. Система должна загрузится, а корневой раздел будет находиться на логическом томе.

После того как вы убедитесь, что все работает нормально, образ lvm нужно сделать загружаемым по умолчанию. Для этого укажите в конфигурационном файле LILO строку default=lvm, и выполните команду lilo.

Наконец, добавьте оставшийся старый корневой раздел в группу томов. Для этого измените тип раздела утилитой fdisk на 8е, и выполните команды:

%# pvcreate /dev/hda3
%# vgextend vg /dev/hda3

[править] Организация корневой файловой системы в LVM для дистрибутива ALT Master 2.2

При установке данного дистрибутива оказалось невозможным разместить корневой раздел в системе LVM. Связано это с тем, как выяснилось позже, что в ядре, поставляемом с данным дистрибутивом, поддержка файловой системы ext2 организована в виде загружаемого модуля. Образ же initrd использует файловую систему romfs, поддержка которой вкомпилирована в ядро. При выполнении команды lvmcreate_initrd генерируется файл-образ initrd с системой ext2. Если после этого вы попытаетесь загрузиться, то получите примерно следующее:

Kernel panic: VFS: Unable to mount root fs on 3a:00

Первое, что вам нужно будет сделать — это скомпилировать ядро со встроенной поддержкой файловой системы ext2, установить его и проверить. После этого снова выполните команду lvmcreate_initrd. Дальнейшие действия зависят от вашей конфигурации. Смонтируйте созданный образ:

%# gzip -d /boot/initrd-lvm-2.4.20-inp1-up-rootlvm.gz
%# mount -o loop /boot/initrd-lvm-2.4.20-inp1-up-rootlvm /mnt/initrd

И копируйте туда модули, необходимые для работы с вашими дисковыми накопителями и файловыми системами (если они не вкомпилированы в ядро). Так, для системы с RAID-контроллером ICP-Vortex и корневой файловой системой reiserfs нужны модули: gdth.o mod_scsi.o sd_mod.o reiserfs.o. Добавьте их загрузку в файл /mnt/initrd/linuxrc.

Обратите внимание на оставшееся свободное место на образе:

Filesystem Size Used Avail Use% Mounted on

/boot/initrd-lvm-2.4.20-inp1-up-rootlvm

                     4.0M  3.9M  0.1M  100% /mnt/initrd

В файловой системе должно быть свободно еще 200-300Кб, в зависимости от вашей LVM-конфигурации. Если же у вас ситуация похожа на приведенную в листинге, будет необходимо создать новый образ, с большим размером файловой системы и повторить операции добавления модулей.

Наконец, отмонтируйте образ, сожмите его, запустите программу lilo и перезагрузитесь:

%# umount /mnt/initrd
%# gzip /boot/initrd-lvm-2.4.20-inp1-up-rootlvm
%# lilo
%# reboot

[править] Заключение

Система управления логическими томами особенно полезна в работе с серверами, поскольку обеспечивает масштабируемость и удобное управление дисковым пространством. Она упрощает планирование дискового пространства и предотвращает проблемы, возникающие при неожиданно быстром росте занятого места в разделах. LVM не предназначен для обеспечения отказоустойчивости или высокой производительности. Потому он часто используется в сочетании с системами RAID.

Использованные источники:

  1. LVM-HOWTO
  2. http://www.gweep.net/~sfoskett/linux/lvmlinux.html

[править] Дополнительные вопросы по LVM

[править] Дисковые разделы и LVM внутри LVM

LVM может находиться рекурсивно внутри логического
тома LVM.

Например, пусть есть три логических тома: LV1, LV2 и LV3.
Один из которых, LV2 разбит на разделы,
каждый из которых является физическим томом LVM,
который в свою очередь объединены в группу томов,
на которых созданы логические тома и так далее.

  LV1                LV2                LV3
 ...--++----------------------------+ +--....
      ||+-------------------------+ | |
      |||            LVM          | | |
      ||+-------------------------+ | |
 ...--++----------------------------+ +--.....

Такая ситуация очень легко может возникнуть
при использовании виртуальных машин,
например в том случае, если том LV2
выдан как диск виртуальной машине Xen или эмулятору QEMU.

Может возникнуть необходимость залезть
внутрь системы томов, которые установлены внутрь логического тома.
Например, это может произойти в случае, когда
виртуальная машина (в результате сбоя или по какой-то другой причине),
не загружается, а нужно добраться до её данных
(напомним, что всё это при условии, что LVM используется не только
снаружи, то есть в домене 0, но и внутри, то есть в домене U).

Решение, если говорить кратко, заключается в том,
чтобы использовать kpartx из пакета multipath-tools,
которая даёт возможность строить карты устройств
(device maps) для разделов.

Далее процедура использования kpartx
описывается подробно.

Блочное устройство, внутри которого находятся
тома LVM может быть любым, в частности,
это может быть том LVM, том EVMS, простой дисковый раздел или физическое устройство.

Убедитесь что пакет multipath-tools установлен:

%# apt-get install multipath-tools 

Посмотрите как выполнено разбинение на разделы:

dom0:~ # fdisk -l /dev/evms/san2/vm3
Disk /dev/evms/san2/vm3: 5368 MB, 5368708096 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

              Device Boot      Start         End      Blocks   Id  System
/dev/evms/san2/vm3p1   *           1           9       72261   83  Linux
/dev/evms/san2/vm3p2              10         652     5164897+   f  W95 Ext'd (LBA)
/dev/evms/san2/vm3p5              10          75      530113+  82  Linux swap / Solaris
/dev/evms/san2/vm3p6              76         493     3357553+  83  Linux
/dev/evms/san2/vm3p7             494         652     1277136   83  Linux

Создайте карту устройств для блочного устройства:

dom0:~ # kpartx -a /dev/evms/san2/vm3 

Карты находятся здесь:

%# ls -l /dev/mapper
total 0
lrwxrwxrwx 1 root root      16 Aug 26 16:28 control -> ../device-mapper
brw------- 1 root root 253,  1 Aug 26 16:28 mpath1
brw------- 1 root root 253,  0 Aug 26 16:28 mpath2
brw------- 1 root root 253, 13 Aug 29 08:55 san2|vm3p1
brw------- 1 root root 253, 14 Aug 29 08:55 san2|vm3p2
brw------- 1 root root 253, 15 Aug 29 08:55 san2|vm3p5
brw------- 1 root root 253, 16 Aug 29 08:55 san2|vm3p6
brw------- 1 root root 253, 17 Aug 29 08:55 san2|vm3p7

Имена выглядят несколько странно, но вообще это нормально.

Можно попробовать смонтировать раздел:

%# mount -o rw /dev/mapper/san2|vm3p6 /mnt

В данном случае была смонтирована корневая файловая система
виртуальной машины:

%# ls -l /mnt
total 96
dr-xr-xr-x  3 root root  4096 Aug 28 10:12 automount
drwxr-xr-x  2 root root  4096 Aug 25 16:51 bin
drwxr-xr-x  2 root root  4096 Aug 25 16:45 boot
drwxr-xr-x  5 root root  4096 Aug 25 16:45 dev
drwxr-xr-x 69 root root  8192 Aug 29 08:53 etc
drwxr-xr-x  2 root root  4096 May  4 01:43 home
drwxr-xr-x 11 root root  4096 Aug 25 17:10 lib
drwx------  2 root root 16384 Aug 25 16:45 lost+found
drwxr-xr-x  2 root root  4096 May  4 01:43 media
drwxr-xr-x  3 root root  4096 Aug 28 15:08 mnt
drwxr-xr-x  4 root root  4096 Aug 25 16:49 opt
drwxr-xr-x  2 root root  4096 Aug 25 16:45 proc
drwx------ 10 root root  4096 Aug 28 14:56 root
drwxr-xr-x  3 root root  8192 Aug 25 16:52 sbin
drwxr-xr-x  4 root root  4096 Aug 25 16:45 srv
-rw-r--r--  1 root root     0 Aug 29 08:53 success
drwxr-xr-x  3 root root  4096 Aug 25 16:45 sys
drwxrwxrwt  6 root root  4096 Aug 29 08:49 tmp
drwxr-xr-x 12 root root  4096 Aug 25 16:50 usr
drwxr-xr-x  3 root root  4096 Aug 25 16:54 var

Аналогичным образом монтируем остальные разделы:

%# mount -o rw /dev/mapper/san2|vm3p1 /mnt/boot
%# mount -o rw /dev/mapper/san2|vm3p7 /mnt/var

С разделами можно работать как обычно.

По завершению работы нужно

  • размонтировать разделы;
  • удалить карты устройств.

Note-icon.gif

Размонтировать разделы и удалить карту устройств
особенно важно, если эти разделы принадлежат какой-либо виртуальной
машине, которую вы собираетесь запускать.

%# umount /mnt/var
%# umount /mnt/boot
%# umount /mnt
%# kpartx -d /dev/evms/san2/vm3 

%# ls -l /dev/mapper
total 0
lrwxrwxrwx 1 root root     16 Aug 26 16:28 control > ../device-mapper
brw------- 1 root root 253, 1 Aug 26 16:28 mpath1
brw------- 1 root root 253, 0 Aug 26 16:28 mpath2

При условии что разделы находятся не на блочном устройстве,
а в обычно файле, сначала нужно воспользоваться
программой losetup.

В данном примере loop0 это первое свободное loopback-устройство,
но возможно, что оно будет занято, и тогда вместо loop0 нужно будет использовать loopX с более выскоим номерм X:

%# cd /etc/xen/images
%# losetup /dev/loop0 /xen/images/vm1.img 
%# losetup -a
/dev/loop0: [6806]:318859 (vm1.img)

%# fdisk -l /dev/loop0 
Disk /dev/loop0: 1638 MB, 1638400000 bytes 
255 heads, 63 sectors/track, 199 cylinders 
Units = cylinders of 16065 * 512 = 8225280 bytes 
      Device Boot      Start         End      Blocks   Id  System 
/dev/loop0p1   *           1           9       72261   83  Linux 
/dev/loop0p2              10         199     1526175    5  Extended 
/dev/loop0p5              10          26      136521   82  Linux swap / Solaris 
/dev/loop0p6              27         151     1004031   83  Linux 
/dev/loop0p7             152         199      385528+  83  Linux 

%# kpartx -a /dev/loop0 
%# ls -l /dev/mapper/ 
total 0 
lrwxrwxrwx 1 root root      16 Sep 12 15:38 control -> ../device-mapper 
brw------- 1 root root 253, 15 Sep 30 13:19 loop0p1 
brw------- 1 root root 253, 16 Sep 30 13:19 loop0p2 
brw------- 1 root root 253, 17 Sep 30 13:19 loop0p5 
brw------- 1 root root 253, 18 Sep 30 13:19 loop0p6 
brw------- 1 root root 253, 19 Sep 30 13:19 loop0p7 

Можно монтировать, копировать, восстанавливать, форматировать
эти разделы, короче, делать с ними всё, что делается с обычными дисковыми разделами.

%# mount /dev/mapper/loop0p6 /mnt
%# mount /dev/mapper/loop0p1 /mnt/boot
%# mount /dev/mapper/loop0p7 /mnt/var
%# mount 
-snip-
/dev/mapper/loop0p6 on /mnt type ext3 (rw) 
/dev/mapper/loop0p1 on /mnt/boot type ext2 (rw) 
/dev/mapper/loop0p7 on /mnt/var type ext3 (rw) 

Другое решение:

%# lomount -diskimage vm1.img -partition 1  /mnt
%# mount 
-snip-
/xen/images/vm1.img on /mnt type ext2 (rw,loop=/dev/loop0,offset=32256) 

С одной стороны при таком подходе:

  • не нужно вручную подключать loopback-устройства;
  • не нужно использовать kpartx;

Но с другой стороны:

  • это решение позволяет смонтировать только простые разделы, размещённые внутри тома LVM.

Если внутри логического тома выполнено другое разбиение,
такой подход не поможет.

Если внутри тома находится расширенный раздел, подход работает,
но требует дополнительных манипуляций:

%# fdisk -l -u /xen/images/vm1.img 
You must set cylinders. 
You can do this from the extra functions menu. 
Disk vm1.img: 0 MB, 0 bytes 
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors 
Units = sectors of 1 * 512 = 512 bytes 
  Device Boot      Start         End      Blocks   Id  System 
vm1.img1   *          63      144584       72261   83  Linux 
vm1.img2          144585     3196934     1526175    5  Extended 
vm1.img5          144648      417689      136521   83  Linux 
vm1.img6          417753     2425814     1004031   83  Linux 
vm1.img7         2425878     3196934      385528+  83  Linux 

Найти начало интересующего раздела можно путём
умножения значения поля Start (показанного fdiks) на 512.

417753*512=213889536

Если мы хотим смонтировать корневой раздел:

%# mount -o loop,offset=213889536 /xen/images/vm1.img /mnt
%# mount 
-snip-
/xen/images/vm1.img on /mnt type ext3 (rw,loop=/dev/loop0,offset=213889536) 

[править] Создание зашифрованных томов LVM

Пример создания зашифрованного тома:

%# cryptsetup -y -s 256 -c aes-cbc-essiv:sha256 luksFormat /dev/hda3
%# cryptsetup luksOpen /dev/hda3 lukspace
%# pvcreate /dev/mapper/lukspace
%# vgcreate vg /dev/mapper/lukspace
%# lvcreate -L10G -n root vg
%# lvcreate -l 100%FREE -n myspace vg

Подробнее:

  • How to set up an encrypted filesystem in several easy steps (англ.)
  • Resizing Encrypted Filesystems (англ.)
  • How To Migrate to a full encrypted LVM system (англ.)

[править] Сравнение LVM и ZFS

Основная страница: ZFSvsLVM

На первый взгляд такое сравнение может показаться странным,
ведь ZFS ­— это файловая система, а LVM ­— система для управления томами,
то есть нечто, что находится на уровень ниже файловой системы.

В действительности, сравнение вполне имеет право на существование,
поскольку ZFS это не просто файловая система, а нечто большее.
В ней присутствует уровень «storage pool»,
который берёт на себя те же задачи, что и LVM.

В таком случае возникает вопрос,
а какую функциональность ZFS может дать сама,
без применения LVM, и если что-то она делает лучше,
то что именно?

[править] Восстановления LVM после сбоя

  • Recover Data From RAID1 LVM Partitions With Knoppix Linux LiveCD (англ.)
  • LVM Recovery Tale (англ.)
  • Recovery of RAID and LVM2 Volumes (англ.)

[править] Слияние LVM

В августе 2008 появился патч для ядра Linux,
который позволяет делать слияние снимка и тома:
изменения, которые делаются на снимке,
при желании можно перенести на том.
Снимок при этом перестаёт существовать.

Начиная с ядра 2.6.33 [1]
необходимый код присутствует в составе ядра Linux. Для того чтобы использовать его, необходим пакет LVM версии не менее
2.02.58 [2].

Пример использования:

 %# lvconvert --merge /dev/VG0/lv1_snap

После выполнения этой команды изменения, сделанные в снимке lv1_snap будут перенесены в родительский том
/dev/VG0/lv1, а снимок перестанет существовать.

Подробнее:

  • http://kerneltrap.org/Linux/LVM_Snapshot_Merging
  • Merging Snapshot Volumes (англ.)

[править] Thin Provisioning

Начиная с 2012 года (полноценно с ядра Linux 3.4; май 2012)
LVM поддерживает такую возможность как thin provisioning. Это возможность использовать какое-либо внешнее блочное устройство в режиме только для чтения как основу для создания новых логических томов LVM.
Такие разделы при создании уже будут выглядеть так будто они
заполнены данными исходного блочного устройства. Операции с томами изменяются налету таким образом, что чтение данных выполняется с исходного блочного устройства (или с тома если данные уже отличаются), а запись — на том.

Такая возможность может быть полезна, например, при создании множества однотипых виртуальных машин или для решения других аналогичных задач, т.е. задач где нужно получить несколько изменяемых копий одних и тех же исходных данных.

Подробнее:

  • New LVM2 release 2.02.89: Thinly-provisioned logical volumes (англ.)
  • https://github.com/jthornber/linux-2.6/blob/thin-stable/Documentation/device-mapper/thin-provisioning.txt (англ.)

[править] Поддержка LVM в NetBSD

В 2008 году в NetBSD появилась[1] начальная поддержка LVM.

Та часть, которая интегрируется в ядро,
была написана с нуля и распространяется по лицензии BSD.
Другая (большая) часть, которая работает в пространстве пользователя (userland),
взята из Linux и осталась под лицензией GPL.

Пока что не работают такие вещи как создание снимков (snapshots),
не работает pvmove и нет возможности совместной работы с LVM
в кластере, как это можно делать с помощью CLVM (однако, использовать независимые логические тома в кластере, конечно же, можно).

Подробнее:

  • How to use lvm on NetBSD (англ.)
  • The NetBSD Logical Volume Manager (англ.)
  • LVM Volume Manager on NetBSD (англ.) — пример использования LVM в NetBSD

[править] Работа с LVM в FreeBSD

Автор: Владимир Чижиков (Skif), [3]

Для монтирования LVM с EXT2/EXT3 файловой системой необходимо скомпилировать
ядро с поддержкой EXT2FS:

  options EXT2FS

либо добавить /boot/loader.conf строку:

  ext2fs_load="YES"

Если после перезагрузки сервера необходимости в подключении данного диска не
будет, тогда достаточно просто подгрузить модуль ядра
kldload ext2fs

Для подключения LVM разделов необходимо перекомпилировать ядро с опцией:

  option GEOM_LINUX_LVM

либо добавить /boot/loader.conf

  geom_linux_lvm_load="YES"

вручную можно произвести загрузку следующим образом

  geom linux_lvm load

посмотреть результат (пример):

  # geom linux_lvm list
  Geom name: skdeb5-home.bsd
  Providers:
  1. Name: linux_lvm/skdeb5-home.bsd-swap_1
     Mediasize: 1551892480 (1.4G)
     Sectorsize: 512
     Mode: r0w0e0
  2. Name: linux_lvm/skdeb5-home.bsd-root
     Mediasize: 38205915136 (36G)
     Sectorsize: 512
     Mode: r1w1e1
  Consumers:
  1. Name: ad2s2
     Mediasize: 39761003520 (37G)
     Sectorsize: 512
     Mode: r1w1e2

в /etc/fstab прописать следующим образом:

  cat /etc/fstab | grep linux_lvm
  /dev/linux_lvm/skdeb5-home.bsd-root /mnt/ad2s2.ext2 ext2fs rw   0       0

PS: Для монтирования LVM-раздела с другой FS, отличной от EXT2/EXT3 необходимо
перекомпилировать ядро или загрузить соответствующие данной ФС модули ядра.

[править] Работа с LVM в Windows

LVM это чуждая для Windows система, и её поддержка в Windows отсутствует.
Не предполагается, что вы будете работать с LVM из-под Windows.
Однако, в некоторых случаях такая потребность всё же может возникнуть:

  • В случае, когда у вас на компьютере установлено две системы (dual boot), одна из которых Linux, а вторая Windows;
  • В случае, когда на переносном диске у вас LVM, внутри ценные файлы, а рядом только Windows-машины.

Программа Virtual Volumes
позволяет обращаться к логическому тому LVM изнутри Windows-машины.
Программа находится в процессе разработки. Пока она имеет некоторые ограничения.

Подробнее:

  • http://www.chrysocome.net/virtualvolumes (англ.)

[править] Альтернативы LVM

LVM сегодня — это главная система управления томами, существующая в Linux.
Раньше главным её конкурентом считалась система EVMS,
но затем, после того как LVM была включена в ядро, а EVMS нет,
конкуренция закончилась в пользу LVM.

Сейчас главными конкурентами LVM можно считать файловые системы с возможностями
систем управления томами, такие как btrfs и ZFS[2].

Кроме этого существует система Zumastor, которая отличается от LVM
лучшей поддержкой управления снимками (snapshotting) и удалённой репликацией.
Особенно печальным для LVM создатели Zumastor считают следующий факт:
если в LVM сделать много снимков с одного тома, а потом в оригинальном томе изменить какой-то блок,
то оригинальная информация будет копироваться теперь для каждого снимка[3].
Можно представить, какая будет производительность и расточительность при записи в оригинальный том,
особенно в случае большого количества снимков с него. Большим недостатком Zumastor является то, что его развитие приостановлено несколько лет назад[4].

Проблема неэффективных снапшотов в LVM считается одной из важнейших проблем LVM на сегодняшний день
и работа по её устранению относится к одной из наиболее приоритетных[5]. Другой приоритетной задачей является поддержка снапшотов бесконечной глубины, то есть, возможность создания снапшотов со снапшотов[6].
Другие попытки решить эту задачу: [4], [5].

[править] Графические инструменты администрирования LVM

system-config-lvm в действии

Есть несколько графических инструментов, помогающих использовать LVM.
В частности:

  1. LVM GUI Project[7];
  2. system-config-lvm.

Первый уже давно не развивается.
Второй является основным графическим инструментом для администрирования LVM в Redhat-подобных дистрибутивах.
Он может быть установлен и в других.
Например, в Debian[8]:

%# apt-get install system-config-lvm

Вызвать его можно командой:

%# system-config-lvm

Дополнительная информация:

  • Using the LVM utility system-config-lvm (англ.) — подробно об использовании system-config-lvm

[править] Ограничение скорости доступа к LVM-томам

Ограничение делается на уровне cgroup:

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

После этого:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

В качестве X:Y используются мажорный и минорный номер соответствующего тома.

Подробнее:

  • How to Throttle per process I/O to a max limit? (англ.)
  • Throttling IO with Linux (англ.)
  • Which I/O controller is the fairest of them all? (англ.) — немного о blkio-cgroup, io-band и других механизмах регулирования скорости доступа к дисковой подсистеме
  • blkio-cgroup: Introduction (англ.)

[править] Приложения

[править] Список команд для работы с LVM

lvchange
Изменить атрибуты логического тома
lvcreate
Создать логический том
lvdisplay
Показать информацию о логическом томе
lvextend
Добавить места в логический том
lvmchange
(команда устарела, её лучше не использовать)
lvmdiskscan
Показать список устройств, которые могут быть использованы как физический том
lvmsadc
Собрать данные об активности использования LVM
lvmsar
Создать отчёт об активности использования LVM
lvreduce
Уменьшить размер логического тома
lvremove
Удалить логический том из системы
lvrename
Переименовать логический том
 lvrename vg00 lv_old lv_new
lvresize
Изменить размер логического тома
lvs
Показать информацию о логическом томе
lvscan
Показать список логических томов во всех группах томов
pvchange
Изменить атрибуты физического тома
pvcreate
Инициализировать физический том для использования в LVM
pvdata
Показать информацию (из метаданных на диске) о физическом томе
pvdisplay
Показать информацию о физическом томе
pvmove
Переместить эстенты с одного физического тома на другой.
1. Переместить все эстенты находящиеся на устройстве /dev/hd_source:
 pvmove /dev/hd_source 
2. Переместить эстенты тома lv_name находящиеся на устройстве /dev/hd_source на /dev/hd_target:
 pvmove -n lv_name /dev/hd_source /dev/hd_target
pvremove
Удалить метку LVM с физического тома
pvresize
Изменить размер физического тома, использующегося в группе томов
pvs
Показать информацию о физическом томе
pvscan
Показать список всех физических томов
vgcfgbackup
Сделать резервную копию конфигурации группы томов
vgcfgrestore
Восстановить из резервной копии конфигурацию группы томов
vgchange
Изменить атрибуты группы томов
vgck
Проверить целостность группы томов
vgconvert
Изменить формат метаданных группы томов
vgcreate
Создать группу томов
vgdisplay
Показать информацию о группе томов
vgexport
Разрегистрировать группу томов в системе
vgextend
Добавить физический том в группу томов
vgimport
Зарегистрировать эскпортированную группу томов в системе
vgmerge
Объединить группы томов
 vgmerge -v vg_target vg_source
vgmknodes
Создать файлы устройств для групп томов в каталоге /dev/
vgreduce
Удалить физический том из группы томов
vgremove
Удалить группу томов
vgrename
Переименовать группу томов
vgs
Показать информацию о группах томов
vgscan
Выполнить поиск групп томов
vgsplit
Переместить физический том в новую группу томов

[править] Дополнительная информация

  • LVM-HOWTO (англ.)
  • LVM2 Resource Page (англ.)
  • Повесть о Linux и LVM (Logical Volume Manager), Иван Песин
  • LVM в Википедии
  • LVM в Wikipedia (англ.)
  • «Руководство администратора LVM» на docs.redhat.com

Xen и LVM:

  • (Xen-users) Xen with LVM (англ.)
  • Mount/access Files Residing on Xen Virtual Machines (англ.)

[править] Примечания

  1. ↑ http://mail-index.netbsd.org/tech-kern/2008/08/28/msg002554.html
  2. ↑ Только вот btrfs пока находится в процессе разработки, а ZFS не поддерживается толком в Linux, поэтому конкуренция здесь
    получается не более чем умозрительная
  3. ↑ Zumastor HOWTO, Snapshots
  4. ↑ http://groups.google.com/group/zumastor/browse_thread/thread/72846703af4ef5d3
  5. ↑ http://www.redhat.com/archives/linux-lvm/2010-January/msg00012.html
  6. ↑ http://osdir.com/ml/linux-lvm/2011-01/msg00010.html
  7. ↑ http://www.xs4all.nl/~mmj/lvm/
  8. ↑ Или в Ubuntu: http://ubuntuforums.org/showthread.php?t=216117
Xentaur
Дисковая подсистема
Linux | FreeBSD
Диски и разделы
Файлы устройств: Блочное устройство | Символьное устройство | Raw-устройство | loop-устройство
Диски: IDE | SATA (SATA hotplug) | SCSI | USB
RAID-массивы: Аппаратный RAID | Linux RAID | FreeBSD RAID
Дисковые разделы: Раздел | MBR | fdisk | parted | disklabel | GPT
Управление томами
Логический том | Физический том | Группа томов | Снимок | Клон
device-mapper | dm-ioband | dm-crypt | dm-userspace | multipath
Системы управления томами: LVM | CLVM | EVMS | Btrfs* | ZFS* | AdvFS* | Zumastor
Сетевые хранилища и репликация
Отказоустойчивость: DRBD | Xen + DRBD | ggate + gmirror | HAST
Сетевые хранилища: AoE | iSCSI | FCoE | GNBD
Файловые системы
Монтирование | Проверка целостности | Дефрагментация | Суперблок | inode | Журнал | Кэш | VFS | UUID | FUSE
Локальные: ext3 | ext3cow | ext4 | JFS | Reiser4 | XFS | ZFS | Btrfs | AdvFS | ISO | aufs
Сетевые: NFS | CIFS | AFS | POHMELFS
Кластерные: GFS | OCFS2 | CXFS | VMFS | GPFS
Распределенные: Lustre | PVFS | Ceph | Coda
* Btrfs, ZFS и AdvFS — это файловые системы с возможностями управления томами

e

Что такое диспетчер логических томов LVM?

LVM аккумулирует пространство, взятое из разделов или целых дисков, чтобы сформировать логический контейнер (Группа томов). Группа томов далее делится на логические разделы, называемые логическими томами.

Проще говоря, LVM группирует все ваше пространство хранения в пул и позволяет вам создавать тома (логические тома) из этого пула.

Преимущество использования LVM перед стандартным разделом заключается в том, что LVM предлагает вам больше гибкости и возможностей. Он позволяет онлайн изменять размеры логических групп и логических томов. Поэтому, если в каком-либо из ваших логических разделов закончилось место, вы можете легко увеличить размер раздела, используя свободное место в пуле.

Вы также можете экспортировать и импортировать разделы. LVM также поддерживает зеркалирование и создание моментальных снимков логических томов.

Слои абстракции в LVM

LVM обеспечивает абстракцию между физическим хранилищем и файловой системой, позволяя изменять размер файловой системы, охватывать несколько физических дисков и использовать произвольное дисковое пространство.

LVM использует три уровня абстракции для создания разделов.

  • Физический том,
  • Группа томов,
  • Логический том.

Физический том

Все начинается с физического диска. Физический том – это первый уровень абстракции, который LVM использует для идентификации диска, помеченного для операций LVM. Проще говоря, если вы хотите работать с LVM, ваш диск должен быть инициализирован как физический том. Это может быть целый диск или стандартные разделы, созданные на этом диске.

Группа томов

Группа томов – это комбинация всех физических томов. Допустим, у вас есть пять отдельных дисков размером 1 ТБ каждый. Сначала вы инициализируете пять дисков как физический том, а затем добавите их в группу томов.

Группа томов будет содержать 5 ТБ пространства, которое является пространством, доступным для всех физических томов. Из группы томов можно создать логические разделы.

Логические тома

Из пула пространства (группа томов) можно создать логические тома. Считайте, что это эквивалентно стандартному разделу диска.

Я использую сервер Ubuntu, запущенный в virtualbox для демонстрации. Если вы изучаете LVM впервые, проведите тестирование на любой виртуальной машине.

Внимание: Команды LVM требуют привилегий root. Выполняйте все команды либо от имени пользователя root, либо с привилегией sudo.

Шаг 1 – Инициализация физического тома

Я добавил три диска разного размера, в общей сложности 10G.

sudo lsblk /dev/sd[b-e]
  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  sdb 8:16 0 2G 0 disk
  sdc 8:32 0 3G 0 disk
  sdd 8:48 0 5G 0 disk

Для инициализации любого диска как физического тома используйте команду pvcreate с именем устройства в качестве аргумента.

sudo pvcreate /dev/sdb /dev/sdc /dev/sdd
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.

Чтобы проверить список физических томов, вы можете выполнить любую из следующих команд. Каждая команда даст разные результаты.

PVDISPLAY – Команда pvdisplay даст вам подробную информацию о каждом физическом томе, под какой группой томов он находится, уникальный ID и доступный размер.

sudo pvdisplay

PVS & PVSCAN – Эти две команды показывают информацию, как физический объем, группа томов, выделенный и свободный размер.

sudo pvs

sudo pvscan

Шаг 2 – Создание группы томов

Теперь у меня есть три диска, инициализированные как физический том общим размером 10 ГБ. Эти физические тома должны быть добавлены в пул хранения, известный как группа томов.

Выполните команду vgcreate для создания группы томов. Вы должны передать имя для группы томов. Здесь я использую «myDisk» в качестве имени группы томов.

sudo vgcreate myDisk /dev/sd[b-d]
Volume group "myDisk" successfully created

Выполните любую из следующих команд для проверки сведений о группе томов.

sudo vgdisplay

или

sudo vgdisplay <имя группы томов>

Шаг 3 – Отображение сведений о группе томов

Команды vgs и vgscan предоставят вам информацию обо всех доступных группах томов, количестве физических томов и количестве логических томов, выделенных и свободных размерах группы томов.

sudo vgs
sudo vgscan

Шаг 4 – Создание логических томов

Как я уже говорил, логический том похож на разделы диска. Теперь у нас есть почти 10 ГБ свободного места в пуле «myDisk» (группа томов). На основе этой группы томов мы создадим логические тома, отформатируем том с файловой системой ext4, смонтируем и будем использовать том.

Для создания логического тома можно использовать команду lvcreate. Общий синтаксис команды lvcreate приведен ниже.

sudo lvcreate -L <volume-size> -n <logical-volume-name> <volume-group>

Здесь,

  • -L => размер в KB, MB, GB
  • -n => Имя для вашего тома
  • => Какая группа томов будет использоваться Сейчас я создаю логический том размером 3GB. Я назвал логический том «guides «.
sudo lvcreate -L 3GB -n guides myDisk
Logical volume "guides" created.

Шаг 5 – Просмотр информации о логических томах

Для просмотра информации о логических томах можно использовать любую из следующих команд.

Команда *lvdisplay* предоставляет подробную информацию о логическом томе, связанной с ним группе томов, размере тома, пути к логическому тому и т.д.

lvdisplay

Или укажите имя логического тома явно:

lvdisplay guides

Команды lvscan и lvs также предоставят некоторую базовую информацию о логических томах.

lvscan
lvs

Шаг 6 – Форматирование и монтирование логических томов

Вам нужно отформатировать логический том с файловой системой и смонтировать его. Здесь я форматирую том с файловой системой ext4 и монтирую его в каталог /mnt/.

Вы должны увидеть файл устройства для логического тома под /dev/volume-group/logical-volume. В моем случае файл устройства будет /dev/myDisk/guides.

sudo mkfs.ext4 /dev/myDisk/guides
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: a477d1b6-e806-451f-ab34-4be9978c1328
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Для монтирования каталога выполните следующую команду. Вы можете смонтировать каталог в любое место по своему усмотрению.

sudo mount /dev/ostechnix_files/guides /mnt/

Для просмотра смонтированных томов выполните:

mount | grep -i guides
  /dev/mapper/myDisk-guides on /mnt type ext4 (rw,relatime)

Вы также можете выполнить команду df, чтобы проверить информацию о смонтированной файловой системе. Вы можете увидеть, что файловая система названа именем тома. Вам будет довольно легко понять, что это за том и его группа с таким названием.

df -h /mnt/
  Filesystem Size Used Avail Use% Mounted on
  /dev/mapper/myDisk-guides 2.9G 9.0M 2.8G 1% /mnt

Чтобы сделать монтирование постоянным при перезагрузках, вы должны добавить запись в fstab. Если вы не имеете представления о fstab, я советую вам ознакомиться с нашей подробной статьей о fstab.

Что такое Fstab в Linux

Похожие статьи

  1. Понимание файла /etc/mtab в системе Linux

Not to be confused with LLVM.

LVM (Logical Volume Manager) allows administrators to create meta devices that provide an abstraction layer between a file system and the physical storage that is used underneath. The meta devices (on which file systems are placed) are logical volumes, which use storage from storage pools called volume groups. A volume group is provisioned with one or more physical volumes which are the true devices on which the data is stored.

Physical volumes can be partitions, whole hard drives grouped as JBOD (Just a Bunch Of Disks), RAID systems, iSCSI, Fibre Channel, eSATA etc.

Installation

LVM is handled by both kernel-level drivers and user space applications to manage the LVM configuration.

Kernel

Activate the following kernel options:

KERNEL linux-4.9 Enabling LVM

Device Drivers  --->
   Multiple devices driver support (RAID and LVM)  --->
       <*> Device mapper support
           <*> Crypt target support
           <*> Snapshot target
           <*> Mirror target
           <*> Multipath target
               <*> I/O Path Selector based on the number of in-flight I/Os
               <*> I/O Path Selector based on the service time

USE flags

USE flags for
sys-fs/lvm2

User-land utilities for LVM2 (device-mapper) software

lvm Build all of LVM2 including daemons and tools like lvchange, not just the device-mapper library (for other packages to use). If your system uses LVM2 for managing disks and partitions, enable this flag.
readline Enable support for libreadline, a GNU line-editing library that almost everyone wants
sanlock Enable lvmlockd with support for sanlock
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
static !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
static-libs Build static versions of dynamic libraries as well
systemd Enable use of systemd-specific libraries and features like socket activation or session tracking
thin Support for thin volumes
udev Enable virtual/udev integration (device discovery, power and storage device support, etc)
valgrind Make Valgrind (dev-util/valgrind) aware of LVM2’s pool allocator.

Important
For all instructions requiring the use of the lvm, pv*, vg*, or lv* commands in this article as well as access of LVM volumes, the lvm USE flag is required to be enabled.

Emerge

Make sure to enable USE=lvm for sys-fs/lvm2:

FILE /etc/portage/package.use

# Enable support for the LVM daemon and related tools
sys-fs/lvm2 lvm

After reviewing the USE flags, ask Portage to install the sys-fs/lvm2 package:

root #emerge --ask sys-fs/lvm2

Configuration

Configuring LVM is done on several levels:

  1. LV, PV and VG management through the management utilities;
  2. LVM subsystem fine-tuning through the configuration file;
  3. Service management at the distribution level;
  4. Setup through an initial ram file system (initramfs).

Management of the logical and physical volumes as well as the volume groups is handled through the Usage chapter.

LVM configuration file

LVM has an extensive configuration file at /etc/lvm/lvm.conf. Most users will not need to modify settings in this file in order to start using LVM.

Service management

Gentoo provides the LVM service to automatically detect and activate the volume groups and logical volumes.

The service can be managed through the init system.

openrc

To start LVM manually:

root #/etc/init.d/lvm start

To start LVM at boot time:

root #rc-update add lvm boot

systemd

To start lvm manually:

root #systemctl start lvm2-monitor.service

To start LVM at boot time:

root #systemctl enable lvm2-monitor.service

Using LVM in an initramfs

Most bootloaders cannot boot from LVM directly — neither GRUB Legacy nor LILO can. GRUB2 can boot from an LVM linear logical volume, mirrored logical volume and possibly some kinds of RAID logical volumes. No bootloader currently supports thin logical volumes.

For that reason, it is recommended to use a non-LVM /boot partition and mount the LVM root from an initramfs. An initramfs can be generated automatically through Genkernel, Dracut or manually as Custom Initramfs:

  • genkernel can boot from all types except thin volumes (as it neither builds nor copies the sys-block/thin-provisioning-tools binaries from the build host) and maybe RAID10 (RAID10 support requires LVM2 2.02.98, but genkernel builds 2.02.89, however if static binaries are available it can copy those);
  • dracut should boot all types, but only includes thin support in the initramfs if the host being run on has a thin root.

Genkernel

Emerge sys-kernel/genkernel. The static USE flag may also be enabled on the package sys-fs/lvm2 so that genkernel will use the system binaries (otherwise it will build its own private copy). The following example will build only an initramfs (not an entire kernel) and enable support for LVM.

root #genkernel --lvm initramfs

The genkernel manpage outlines other options depending on system requirements.

The initrd will require parameters to tell it how to start LVM, and they are supplied the same way as other kernel parameters. For example:

FILE /etc/default/grubAdding dolvm as a kernel boot parameter

GRUB_CMDLINE_LINUX="dolvm"

Dracut

The sys-kernel/dracut package was ported from the RedHat project and serves a similar tool for generating an initramfs. For details, please refer to Dracut page. Generally, the following command will generate a usable default initramfs.

The initrd will require parameters to tell it how to start LVM, and they are supplied the same way as other kernel parameters. For example:

FILE /etc/default/grubAdding LVM support to the kernel boot parameters

GRUB_CMDLINE_LINUX="rd.lvm.vg=vol00"

For a comprehensive list of LVM options within dracut please see the section in the Dracut Manual.

Usage

LVM organizes storage in three different levels as follows:

  • hard drives, partitions, RAID systems or other means of storage are initialized as physical volumes (PVs)
  • Physical Volumes (PV) are grouped together in Volume Groups (VG)
  • Logical Volumes (LV) are managed in Volume Groups (VG)

PV (Physical Volume)

Physical Volumes are the actual hardware or storage system LVM builds up upon.

Partitioning

Note
Using separate partitions for provisioning storage to volume groups is only needed if it is not desired to use the entire disk for a single LVM volume group. If the entire disk can be used, then skip this and initialize the entire hard drive as a physical volume.

The partition type for LVM is 8e (Linux LVM).

For instance, to set the type through fdisk for a partition on /dev/sda:

In fdisk, create partitions using the n key and then change the partition type with the t key to 8e.

Create PV

Physical volumes can be created / initialized with the pvcreate command.

For instance, the following command creates a physical volume on the first primary partition of /dev/sda and /dev/sdb:

root #pvcreate /dev/sd[ab]1

List PV

With the pvdisplay command, an overview of all active physical volumes on the system can be obtained.

root #pvdisplay

 --- Physical volume ---
  PV Name               /dev/sda1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               4098
  Allocated PE          36864
  PV UUID               3WHAz3-dh4r-RJ0E-5o6T-9Dbs-4xLe-inVwcV
  
 --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               40962
  Allocated PE          0
  PV UUID               b031x0-6rej-BcBu-bE2C-eCXG-jObu-0Boo0x

If more physical volumes should be displayed, then pvscan can detect inactive physical volumes and activate those.

root #pvscan

  PV /dev/sda1  VG volgrp        lvm2 [160.01 GiB / 16.01 GiB free]
  PV /dev/sdb1  VG volgrp        lvm2 [160.01 GiB / 160.01 GiB free]
  Total: 2 [320.02 GB] / in use: 2 [320.02 GiB] / in no VG: 0 [0]

Remove PV

LVM automatically distributes the data onto all available physical volumes (unless told otherwise) but in a linear approach. If a requested logical volume (within a volume group) is smaller than the amount of free space on a single physical volume, then all space for the logical volume is claimed on that (single) physical volume in a contiguous manner. This is done for performance reasons.

If a physical volume needs to be removed from a volume group, the data first needs to be moved away from the physical volume. With the pvmove command, all data on a physical volume is moved to other physical volumes within the same volume group.

root #pvmove -v /dev/sda1

Such an operation can take a while depending on the amount of data that needs to be moved. Once finished, there should be no data left on the device. Verify with pvdisplay that the physical volume is no longer used by any logical volume.

The next step is to remove the physical volume from the volume group using vgreduce after which the device can be «deselected» as a physical volume using pvremove:

root #vgreduce vg0 /dev/sda1 && pvremove /dev/sda1

VG (Volume Group)

A volume group (VG) groups a number of physical volumes and show up as /dev/VG_NAME in the device file system. The name of a volume group is chosen by the administrator.

Create VG

The following command creates a volume group called vg0 with two physical volumes assigned to it: /dev/sda1 and /dev/sdb1.

root #vgcreate vg0 /dev/sd[ab]1

List VG

To list all active volume groups, use the vgdisplay command:

root #vgdisplay

  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                6
  Open LV               6
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               320.02 GiB
  PE Size               4.00 MiB
  Total PE              81924
  Alloc PE / Size       36864 / 144.00 GiB
  Free  PE / Size       45056 /176.01 GiB
  VG UUID               mFPXj3-DdPi-7YJ5-9WKy-KA5Y-Vd4S-Lycxq3

If volume groups are missing, use the vgscan command to locate volume groups:

root #vgscan

  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2

Extend VG

Volume groups group physical volumes, allowing administrators to use a pool of storage resources to allocate to file systems. When a volume group does not hold enough storage resources, it is necessary to extend the volume group with additional physical volumes.

The next example extends the volume group vg0 with a physical volume at /dev/sdc1:

root #vgextend vg0 /dev/sdc1

Remember that the physical volume first needs to be initialized as such!

Reduce VG

If physical volumes need to be removed from the volume group, all data still in use on the physical volume needs to be moved to other physical volumes in the volume group. As seen before, this is handled through the pvmove command, after which the physical volume can be removed from the volume group using vgreduce:

root #pvmove -v /dev/sdc1

root #vgreduce vg0 /dev/sdc1

Remove VG

If a volume group is no longer necessary (or, in other words, the storage pool that it represents is no longer used and the physical volumes in it need to be freed for other purposes) then the volume group can be removed with vgremove. This only works if no logical volume is defined for the volume group, and all but one physical volume have already been removed from the pool.

LV (Logical Volume)

Logical volumes are the final meta devices which are made available to the system, usually to create file systems on. They are created and managed in volume groups and show up as /dev/VG_NAME/LV_NAME. Like with volume groups, the name used for a logical volume is decided by the administrator.

Create LV

To create a logical volume, the lvcreate command is used. The parameters to the command consist out of the requested size for the logical volume (which cannot be larger than the amount of free space in the volume group), the volume group from which the space is to be claimed and the name of the logical volume to be created.

In the next example, a logical volume named lvol1 is created from the volume group named vg0 and with a size of 150MB:

root #lvcreate -L 150M -n lvol1 vg0

It is possible to tell lvcreate to use all free space inside a volume group. This is done through the -l option which selects the amount of extents rather than a (human readable) size. Logical volumes are split into logical extents which are data chunks inside a volume group. All extents in a volume group have the same size. With the -l option lvcreate can be asked to allocate all free extents:

root #lvcreate -l 100%FREE -n lvol1 vg0

Next to FREE the VG key can be used to denote the entire size of a volume group.

List LV

To list all logical volumes, use the lvdisplay command:

If logical volumes are missing, then the lvscan command can be used to scan for logical volumes on all available volume groups.

Extend LV

When a logical volume needs to be expanded, then the lvextend command can be used to grow the allocated space for the logical volume.

For instance, to extend the logical volume lvol1 to a total of 500 MB:

root #lvextend -L500M /dev/vg0/lvol1

It is also possible to use the size to be added rather than the total size:

root #lvextend -L+350MB /dev/vg0/lvol1

An extended volume group does not immediately provide the additional storage to the end users. For that, the file system on top of the volume group needs to be increased in size as well. Not all file systems allow online resizing, so check the documentation for the file system in question for more information.

For instance, to resize an ext4 file system to become 500MB in size:

root #resize2fs /dev/vg0/lvol1 500M

For certain file systems, lvresize extends the logical volume and the file system in one step. For instance, to extend the logical volume lvol1 and resize the ext4 file system:

root #lvresize --resizefs --size +350GB /dev/vg0/lvol1

Reduce LV

If a logical volume needs to be reduced in size, first shrink the file system itself. Not all file systems support online shrinking.

For instance, ext4 does not support online shrinking so the file system needs to be unmounted first. It is also recommended to do a file system check to make sure there are no inconsistencies:

root #umount /mnt/data

root #e2fsck -f /dev/vg0/lvol1

root #resize2fs /dev/vg0/lvol1 150M

With a reduced file system, it is now possible to reduce the logical volume as well:

root #lvreduce -L150M /dev/vg0/lvol1

LV Permissions

LVM supports permission states on the logical volumes.

For instance, a logical volume can be set to read only using the lvchange command:

root #lvchange -p r /dev/vg0/lvol1

root #mount -o remount /dev/vg0/lvol1

The remount is needed as the change is not enforced immediately.

To mark the logical volume as writable again, use the rw permission bit:

root #lvchange -p rw /dev/vg0/lvol1 && mount -o remount /dev/vg0/lvol1

Remove LV

Before removing a logical volume, make sure it is no longer mounted:

root #umount /dev/vg0/lvol1

Deactivate the logical volume so that no further write activity can take place:

root #lvchange -a n /dev/vg0/lvol1

With the volume unmounted and deactivated, it can now be removed, freeing the extents allocated to it for use by other logical volumes in the volume group:

root #lvremove /dev/vg0/lvol1

Features

LVM provides quite a few interesting features for storage administrators, including (but not limited to)

  • thin provisioning (over-committing storage)
  • snapshot support
  • volume types with different storage allocation methods

Thin provisioning

Make sure to enable USE=thin for sys-fs/lvm2:

FILE /etc/portage/package.use

# Enable support for the LVM daemon and related tools
sys-fs/lvm2 lvm
# Enable thin support
sys-fs/lvm2 thin

Recent versions of LVM2 (2.02.89) support «thin» volumes. Thin volumes are to block devices what sparse files are to file systems. Thus, a thin logical volume within a pool can be «over-committed»: its presented size can be larger than the allocated size — it can even be larger than the pool itself. Just like a sparse file, the extents are allocated as the block device gets populated. If the file system has discard support extents are freed again as files are removed, reducing space utilization of the pool.

Within LVM, such a thin pool is a special type of logical volume, which itself can host logical volumes.

Creating a thin pool

Warning
If an overflow occurs within the thin pool metadata, then the pool will be corrupted. LVM cannot recover from this.

Note
If the thin pool gets exhausted, any process that would cause the thin pool to allocate more (unavailable) extents will be stuck in «killable sleep» state until either the thin pool is extended or the process receives SIGKILL.

Each thin pool has metadata associated with it, which is added to the thin pool size. LVM will compute the size of the metadata based on the size of the thin pool as the minimum of pool_chunks * 64 bytes or 2 MiB, whichever is larger. The administrator can select a different metadata size as well.

To create a thin pool, add the --type thin-pool --thinpool thin_pool options to lvcreate:

root #lvcreate -L 150M --type thin-pool --thinpool thin_pool vg0

The above example creates a thin pool called thin_pool with a total size of 150 MB. This is the real allocated size for the thin pool (and thus the total amount of actual storage that can be used).

To explicitly ask for a certain metadata size, use the --metadatasize option:

root #lvcreate -L 150M --poolmetadatasize 2M --type thin-pool --thinpool thin_pool vg0

Due to the metadata that is added to the thin pool, the intuitive way of using all available size in a volume group for a logical volume does not work (see LVM bug 812726):

root #lvcreate -l 100%FREE --type thin-pool --thinpool thin_pool vg0

Insufficient suitable allocatable extents for logical volume thin_pool: 549 more required

Note the thin pool does not have an associated device node like other LV’s.

Creating a thin logical volume

A thin logical volume is a logical volume inside the thin pool (which itself is a logical volume). As thin logical volumes are sparse, a virtual size instead of a physical size is specified using the -V option:

root #lvcreate -T vg0/thin_pool -V 300M -n lvol1

In this example, the (thin) logical volume lvol1 is exposed as a 300MB-sized device, even though the underlying pool only holds 150MB of real allocated storage.

It is also possible to create both the thin pool as well as the logical volume inside the thin pool in one command:

root #lvcreate -T vg0/thin_pool -V 300M -L150M -n lvol1

Listing thin pools and thin logical volumes

Thin pools and thin logical volumes are special types of logical volumes, and as such as displayed through the lvdisplay command. The lvscan command will also detect these logical volumes.

Extending a thin pool

Warning
As of LVM2 2.02.89, the metadata size of the thin pool cannot be expanded, it is fixed at creation

The thin pool is expanded like a non-thin logical volume using lvextend. For instance:

root #lvextend -L500M vg0/thin_pool

Extending a thin logical volume

A thin logical volume is expanded just like a regular one:

root #lvextend -L1G vg0/lvol1

Note that the lvextend command uses the -L option (or -l if extent counts are used) and not a «virtual size» option as was used during the creation.

Reducing a thin pool

Currently, LVM cannot reduce the size of the thin pool. See LVM bug 812731.

Reducing a thin logical volume

Thin logical volumes are reduced just like regular logical volumes.

For instance:

root #lvreduce -L300M vg0/lvol1l

Note that the lvreduce command uses the -L option (or -l if extent counts are used) and not a «virtual size» option as was used during the creation.

Removing thin pools

Thin pools cannot be removed until all the thin logical volumes inside it are removed.

When a thin pool no longer services any thin logical volume, it can be removed through the lvremove command:

root #lvremove vg0/thin_pool

LVM2 snapshots and thin snapshots

A snapshot is a logical volume that acts as copy of another logical volume. It displays the state of the original logical volume at the time of snapshot creation.

Warning
Since the logical snapshot volume also gets the same filesystem LABEL and UUID, be sure the /etc/fstab file or initramfs does not contain entries for these filesystems using the LABEL= or UUID= syntax. Otherwise the system might end up with the snapshot being mounted instead of the (intended) original logical volume.

Creating a snapshot logical volume

A snapshot logical volume is created using the -s option to lvcreate. Snapshot logical volumes are still given allocated storage as LVM «registers» all changes made to the original logical volume and stores these changes in the allocated storage for the snapshot. When querying the snapshot state, LVM will start from the original logical volume and then check all changes registered, «undoing» the changes before showing the result to the user.

A snapshot logical volume henceforth «growths» at the rate that changes are made on the original logical volume. When the allocated storage for the snapshot is completely used, then the snapshot will be removed automatically from the system.

root #lvcreate -l 10%VG -s -n 20140412_lvol1 /dev/vg0/lvol1

The above example creates a snapshot logical volume called 20140412_lvol1, based on the logical volume lvol1 in volume group vg0. It uses 10% of the space (extents actually) allocated to the volume group.

Accessing a snapshot logical volume

Snapshot logical volumes can be mounted like regular logical volumes. They are even not restricted to read-only operations — it is possible to modify snapshots and thus use it for things such as testing changes before doing these on a «production» file system.

As long as snapshot logical volumes exist, the regular/original logical volume cannot be reduced in size or removed.

LVM thin snapshots

Note
A thin snapshot can only be taken on a thin pool for a thin logical volume. The thin device mapper target supports thin snapshots of read-only non-thin logical volumes, but the LVM2 tooling does not support this. However, it is possible to create a regular (non-thin) snapshot logical volume of a thin logical volume.

To create a thin snapshot, the lvcreate command is used with the -s option. No size declaration needs to be passed on:

root #lvcreate -s -n 20140413_lvol1 /dev/vg0/lvol1

Thin logical volume snapshots have the same size as their original thin logical volume, and use a physical allocation of 0 just like all other thin logical volumes.

Important
If -l or -L is specified, a snapshot will still be created, but the resulting snapshot will be a regular snapshot, not a thin snapshot.

It is also possible to take snapshots of snapshots:

root #lvcreate -s -n 1_20140413_lvol1 /dev/vg0/20140413_lvol1

Thin snapshots have several advantages over regular snapshots. First, thin snapshots are independent of their original logical volume once created. The original logical volume can be shrunk or deleted without affecting the snapshot. Second, thin snapshots can be efficiently created recursively (snapshots of snapshots) without the «chaining» overhead of regular recursive LVM snapshots.

Rolling back to snapshot state

To rollback the logical volume to the version of the snapshot, use the following command:

root #lvconvert --merge /dev/vg0/20140413_lvol1

This might take a couple of minutes, depending on the size of the volume. Please note that the rollback will only happen once the parent logical volume is offline. Hence a reboot might be required.

Important
The snapshot will disappear and this change is not revertible

Rolling back thin snapshots

For thin volumes, lvconvert —merge does not work. Instead, delete the original logical volume and rename the snapshot:

root #umount /dev/vg0/lvol1

root #lvremove /dev/vg0/lvol1

root #lvrename vg0/20140413_lvol1 lvol1

Different storage allocation methods

LVM supports different allocation methods for storage:

  • Linear volumes (which is the default);
  • Mirrored volumes (in a more-or-less active/standby setup);
  • Striping (RAID0);
  • Mirrored volumes (RAID1 — which is more an active/active setup);
  • Striping with parity (RAID4 and RAID5);
  • Striping with double parity (RAID6);
  • Striping and mirroring (RAID10).

Linear volumes

Linear volumes are the most common kind of LVM volumes. LVM will attempt to allocate the logical volume to be as physically contiguous as possible. If there is a physical volume large enough to hold the entire logical volume, then LVM will allocate it there, otherwise it will split it up into as few pieces as possible.

The commands introduced earlier on to create volume groups and logical volumes create linear volumes.

Because linear volumes have no special requirements, they are the easiest to manipulate and can be resized and relocated at will. If a logical volume is allocated across multiple physical volumes, and any of the physical volumes become unavailable, then that logical volume cannot be started anymore and will be unusable.

Mirrored volumes

LVM supports mirrored volumes, which provide fault tolerance in the event of drive failure. Unlike RAID1, there is no performance benefit — all reads and writes are delivered to a single side of the mirror.

To keep track of the mirror state, LVM requires a log to be kept. It is recommended (and often even mandatory) to position this log on a physical volume that does not contain any of the mirrored logical volumes. There are three kind of logs that can be used for mirrors:

  1. Disk is the default log type. All changes made are logged into extra metadata extents, which LVM manages. If a device fails, then the changes are kept in the log until the mirror can be restored again.
  2. Mirror logs are disk logs that are themselves mirrored.
  3. Core mirror logs record the state of the mirror in memory only. LVM will have to rebuild the mirror every time it is activated. This type is useful for temporary mirrors.

To create a logical volume with a single mirror, pass the -m 1 argument (to select standard mirroring) with optionally --mirrorlog to select a particular log type:

root #lvcreate -m 1 --mirrorlog mirror -l 40%VG --nosync -n lvol1 vg0

The -m 1 tells LVM to create one (additional) mirror, so requiring 2 physical volumes. The --nosync option is an optimization — without it LVM will try synchronize the mirror by copying empty sectors from one logical volume to another.

It is possible to create a mirror of an existing logical volume:

root #lvconvert -m 1 -b vg0/lvol1

The -b option does the conversion in the background as this can take quite a while.

To remove a mirror, set the number of mirrors (back) to 0:

root #lvconvert -m0 vg0/lvol1

If part of the mirror is unavailable (usually because the disk containing the physical volume has failed), the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

On the first write, LVM will notice the mirror is broken. The default policy («remove») is to automatically reduce/break the mirror according to the number of pieces available. A 3-way mirror with a missing physical volume will be reduced to 2-way mirror; a 2-way mirror will be reduced to a regular linear volume. If the failure is only transient, and the missing physical volume returns after LVM has broken the mirror, the mirrored logical volume will need to be recreated on it.

To recover the mirror, the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on that one). Then the mirror can be recreated with lvconvert at which point the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1

root #lvconvert -b -m 1 --mirrorlog disk vg0/lvol1

root #vgreduce --removemissing vg0

It is possible to have LVM recreate the mirror with free extents on a different physical volume if one side fails. To accomplish that, set mirror_image_fault_policy to allocate in lvm.conf.

Thin mirrors

It is not (yet) possible to create a mirrored thin pool or thin volume. It is possible to create a mirrored thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Warning
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the volume group. Also, conversion of a mirror into a thin pool destroys all existing data in the mirror!

root #lvcreate -m 1 --mirrorlog mirrored -l40%VG -n thin_pool vg0

root #lvcreate -m 1 --mirrorlog mirrored -L4MB -n thin_meta vg0

root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

Striping (RAID0)

Instead of a linear volume, where multiple contiguous physical volumes are appended, it possible to create a striped or RAID0 volume for better performance. This will alternate storage allocations across the available physical volumes.

To create a striped volume over three physical volumes:

root #lvcreate -i 3 -l 20%VG -n lvol1_stripe vg0

Using default stripesize 64.00 KiB

The -i option indicates over how many physical volumes the striping should be done.

It is possible to mirror a stripe set. The -i and -m options can be combined to create a striped mirror:

root #lvcreate -i 2 -m 1 -l 10%VG vg0

This creates a 2 physical volume stripe set and mirrors it on 2 different physical volumes, for a total of 4 physical volumes. An existing stripe set can be mirrored with lvconvert.

A thin pool can be striped like any other logical volume. All the thin volumes created from the pool inherit that settings — do not specify it manually when creating a thin volume.

It is not possible to stripe an existing volume, nor reshape the stripes across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set can be mirrored. It is possible to extend a stripe set across additional physical volumes, but they must be added in multiples of the original stripe set (which will effectively linearly append a new stripe set).

Mirroring (RAID1)

Unlike RAID0, which is striping, RAID1 is mirroring, but implemented differently than the original LVM mirror. Under RAID1, reads are spread out across physical volumes, improving performance. RAID1 mirror failures do not cause I/O to block because LVM does not need to break it on write.

Any place where an LVM mirror could be used, a RAID1 mirror can be used in its place. It is possible to have LVM create RAID1 mirrors instead of regular mirrors implicitly by setting mirror_segtype_default to raid1 in lvm.conf.

Warning
LVM RAID1 mirroring is not supported by GRUB before version 2.02. Ensure the latest version is installed with grub-install or the system may become unbootable if the grub files are contained in the LVM RAID1.

To create a logical volume with a single mirror:

root #lvcreate -m 1 --type raid1 -l 40%VG --nosync -n lvm_raid1 vg0

Note the difference for creating a mirror: There is no mirrorlog specified, because RAID1 logical volumes do not have an explicit mirror log — it built-in to the logical volume.

It is possible to convert an existing logical volume to RAID1:

root #lvconvert -m 1 --type raid1 -b vg0/lvol1

To remove a RAID1 mirror, set the number of mirrors to 0:

root #lvconvert -m0 vg0/lvm_raid1

If part of the RAID1 is unavailable (usually because the disk containing the physical volume has failed), the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

Unlike an LVM mirror, writing does NOT break the mirroring. If the failure is only transient, and the missing physical volume returns, LVM will resync the mirror by copying cover the out-of-date segments instead of the entire logical volume. If the failure is permanent, then the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on a different PV). The mirror can then be repaired with lvconvert, and the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1

root #lvconvert --repair -b vg0/lvm_raid1

root #vgreduce --removemissing vg0

Thin RAID1

It is not (yet) possible to create a RAID1 thin pool or thin volume. It is possible to create a RAID1 thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will then merge them into a single logical volume.

Warning
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID1 into a thin pool destroys all existing data in the mirror!

root #lvcreate -m 1 --type raid1 -l40%VG -n thin_pool vg0

root #lvcreate -m 1 --type raid1 -L4MB -n thin_meta vg0

root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

Striping with parity (RAID4 and RAID5)

Note
Striping with parity requires at least 3 physical volumes.

RAID0 is not fault-tolerant — if any of the physical volumes fail then the logical volume is unusable. By adding a parity stripe to RAID0 the logical volume can still function if a physical volume is missing. A new physical volume can then be added to restore fault tolerance.

Stripsets with parity come in 2 flavors: RAID4 and RAID5. Under RAID4, all the parity stripes are stored on the same physical volume. This can become a bottleneck because all writes hit that physical volume, and it gets worse the more physical volumes are in the array. With RAID5, the parity data is distributed evenly across the physical volumes so none of them become a bottleneck. For that reason, RAID4 is rare and is considered obsolete/historical. In practice, all stripesets with parity are RAID5.

root #lvcreate --type raid5 -l 20%VG -i 2 -n lvm_raid5 vg0

Only the data physical volumes are specified with -i, LVM adds one to it automatically for the parity. So for a 3 physical volume RAID5, -i 2 is passed on and not -i 3.

When a physical volume fails, then the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

The volume will work normally at this point, however this degrades the array to RAID0 until a replacement physical volume is added. Performance is unlikely to be affected while the array is degraded — although it does need to recompute its missing data via parity, it only requires simple XOR for the parity block with the remaining data. The overhead is negligible compared to the disk I/O.

To repair the RAID5:

root #lvconvert --repair vg0/lvm_raid5

root #vgreduce --removemissing vg0

It is possible to replace a still working physical volume in RAID5 as well:

root #lvconvert --replace /dev/sdb1 vg0/lvm_raid5

root #vgreduce vg0 /dev/sdb1

The same restrictions of stripe sets apply to stripe sets with parity as well: it is not possible to enable striping with parity on an existing volume, nor reshape the stripes with parity across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set with parity can be mirrored. It is possible to extend a stripe set with parity across additional physical volumes, but they must be added in multiples of the original stripe set with parity (which will effectively linearly append a new stripe set with parity).

Thin RAID5 logical volumes

It is not (yet) possible to create stripe set with parity (RAID5) thin pools or thin logical volumes. It is possible to create a RAID5 thin pool by creating a normal RAID5 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Warning
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, coversion of a RAID5 LV into a thin pool destroys all existing data in the LV!

root #lvcreate --type raid5 -i 2 -l20%VG -n thin_pool vg0

root #lvcreate --type raid5 -i 2 -L4MB -n thin_meta vg0

root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

Striping with double parity (RAID6)

Note
RAID6 requires at least 5 physical volumes.

RAID6 is similar to RAID5, however RAID6 can survive up to two physical volume failures, thus offering more fault tolerance than RAID5 at the expense of extra physical volumes.

root #lvcreate --type raid6 -l 20%VG -i 3 -n lvm_raid6 vg00

Like RAID5, the -i option is used to specify the number of physical volumes to stripe, excluding the 2 physical volumes for parity. So for a 5 physical volume RAID6, pass on -i 3 and not -i 5.

Recovery for RAID6 is the same as RAID5.

Note
Unlike RAID5 where parity block is cheap to recompute vs disk I/O, this is only half true in RAID6. RAID6 uses 2 parity stripes: One stripe is computed the same way as RAID5 (simple XOR). The second parity stripe is much harder to compute — see [https://www.kernel.org/pub/linux/kernel/people/hpa/raid6.pdf

Thin RAID6 logical volumes

It is not (yet) possible to create a RAID6 thin pool or thin volumes. It is possible to create a RAID6 thin pool by creating a normal RAID6 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Warning
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID6 LV into a thin pool destroys all existing data in the LV!

root #lvcreate --type raid6 -i 2 -l20%VG -n thin_pool vg0

root #lvcreate --type raid6 -i 2 -L4MB -n thin_meta vg0

root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

LVM RAID10

Note
RAID10 requires at least 4 physical volumes. Also LVM syntax requires the number of physical volumes be multiple of the numbers stripes and mirror, even though RAID10 format does not

RAID10 is a combination of RAID0 and RAID1. It is more powerful than RAID0+RAID1 as the mirroring is done at the stripe level instead of the logical volume level, and therefore the layout doesn’t need to be symmetric. A RAID10 volume can tolerate at least a single missing physical volume, and possibly more.

Note
LVM currently limits RAID10 to a single mirror.

root #lvcreate --type raid10 -l 1020 -i 2 -m 1 --nosync -n lvm_raid10 vg0

Both the -i and -m options are specified: -i is the number of stripes and -m is the number of mirrors. Two stripes and 1 mirror requires 4 physical volumes.

Thin RAID10

It is not (yet) possible to create a RAID10 thin pool or thin volumes. It is possible to create a RAID10 thin pool by creating a normal RAID10 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Warning
Conversion of a RAID10 logical volume into a thin pool destroys all existing data in the logical volume!

root #lvcreate -i 2 -m 1 --type raid10 -l 1012 -n thin_pool vg0

root #lvcreate -i 2 -m 1 --type raid10 -l 6 -n thin_meta vg0

root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

Experimenting with LVM

It is possible to experiment with LVM without using real storage devices. To accomplish this, loopback devices are created.

First make sure to have the loopback module loaded.

root #modprobe -r loop && modprobe loop max_part=63

Note
If loopback support is built into the kernel, then use loop.max_part=63 as boot option.

Next configure LVM to not use udev to scan for devices:

FILE /etc/lvm/lvm.confDisabling udev in LVM config

obtain_device_list_from_udev = 0

Important
This is for testing only, make sure to change the setting back when dealing with real devices since it is much faster to use udev!

Create some image files which will become the storage devices. The next example uses five files for a total of about ~10GB of real hard drive space:

root #mkdir /var/lib/lvm_img

root #dd if=/dev/null of=/var/lib/lvm_img/lvm0.img bs=1024 seek=2097152

root #dd if=/dev/null of=/var/lib/lvm_img/lvm1.img bs=1024 seek=2097152

root #dd if=/dev/null of=/var/lib/lvm_img/lvm2.img bs=1024 seek=2097152

root #dd if=/dev/null of=/var/lib/lvm_img/lvm3.img bs=1024 seek=2097152

root #dd if=/dev/null of=/var/lib/lvm_img/lvm4.img bs=1024 seek=2097152

Check which loopback devices are available:

Assuming all loopback devices are available, next create the devices:

root #losetup /dev/loop0 /var/lib/lvm_img/lvm0.img

root #losetup /dev/loop1 /var/lib/lvm_img/lvm1.img

root #losetup /dev/loop2 /var/lib/lvm_img/lvm2.img

root #losetup /dev/loop3 /var/lib/lvm_img/lvm3.img

root #losetup /dev/loop4 /var/lib/lvm_img/lvm4.img

The /dev/loop[0-4] devices are now available to use as any other hard drive in the system (and thus be perfect for physical volumes).

Note
On the next reboot, all the loopback devices will be released and the folder /var/lib/lvm_img can be deleted.

Troubleshooting

LVM has a few features that already provide some level of redundancy. However, there are situations where it is possible to restore lost physical volumes or logical volumes.

vgcfgrestore utility

By default, on any change to a LVM physical volume, volume group, or logical volume, LVM2 create a backup file of the metadata in /etc/lvm/archive. These files can be used to recover from an accidental change (like deleting the wrong logical volume). LVM also keeps a backup copy of the most recent metadata in /etc/lvm/backup. These can be used to restore metadata to a replacement disk, or repair corrupted metadata.

To see what states of the volume group are available to be restored (partial output to improve readability):

root #vgcfgrestore --list vg00

  File:		/etc/lvm/archive/vg0_00042-302371184.vg
  VG name:    	vg0
  Description:	Created *before* executing 'lvremove vg0/lvm_raid1'
  Backup Time:	Sat Jul 13 01:41:32 201

Recovering an accidentally deleted logical volume

Assuming the logical volume lvm_raid1 was accidentally removed from volume group vg0, it is possible to recover it as follows:

root #vgcfgrestore -f /etc/lvm/archive/vg0_00042-302371184.vg vg0

Important
vgcfgrestore only restores LVM metadata, not the data inside the logical volume. However pvremove, vgremove, and lvremove only wipe metadata, leaving any data intact. If issue_discards is set in /etc/lvm/lvm.conf though, then these command are destructive to data.

Replacing a failed physical volume

It possible to do a true «replace» and recreate the metadata on the new physical volume to be the same as the old physical volume:

root #vgdisplay --partial --verbose

  --- Physical volumes ---
  PV Name               /dev/loop0     
  PV UUID               iLdp2U-GX3X-W2PY-aSlX-AVE9-7zVC-Cjr5VU
  PV Status             allocatable
  Total PE / Free PE    511 / 102
  
  PV Name               unknown device     
  PV UUID               T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY
  PV Status             allocatable
  Total PE / Free PE    511 / 102

The important line here is the UUID «unknown device».

root #pvcreate --uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY --restorefile /etc/lvm/backup/vg0 /dev/loop1

  Couldn't find device with uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY.
  Physical volume "/dev/loop1" successfully created

This recreates the physical volume metadata, but not the missing logical volume or volume group data on the physical volume.

root #vgcfgrestore -f /etc/lvm/backup/vg0 vg0

  Restored volume group vg0

This now reconstructs all the missing metadata on the physical volume, including the logical volume and volume group data. However it doesn’t restore the data, so the mirror is out of sync.

root #vgchange -ay vg0

  device-mapper: reload ioctl on  failed: Invalid argument
  1 logical volume(s) in volume group "vg0" now active

root #lvchange --resync vg0/lvm_raid1

Do you really want to deactivate logical volume lvm_raid1 to resync it? [y/n]: y

This will resync the mirror. This works with RAID 4,5 and 6 as well.

Deactivating a logical volume

It is possible to deactivate a logical volume with the following command:

root #umount /dev/vg0/lvol1

root #lvchange -a n /dev/vg0/lvol1

It is not possible to mount the logical volume anywhere before it gets reactivated:

root #lvchange -a y /dev/vg0/lvol1

See also

  • Device-mapper
  • Raid1 with LVM from scratch

External resources

  • LVM2 sourceware.org
  • LVM tldp.org
  • LVM2 Wiki redhat.com
  • Shrinking root logical volume on-line

Содержание

Logical Volume Manager (LVM) — это очень мощная система управления томами с данными для Linux. Она позволяет создавать поверх физических разделов (или даже неразбитых винчестеров) логические тома, которые в самой системе будут видны как обычные блочные устройства с данными (т.е. как обычные разделы). Основные преимущества LVM в том, что во-первых одну группу логических томов можно создавать поверх любого количества физических разделов, а во-вторых размер логических томов можно легко менять прямо во время работы. Кроме того, LVM поддерживает механизм снапшотов, копирование разделов «на лету» и зеркалирование, подобное RAID-1.

Если планируются большие работы с LVM, то можно запустить специальную «оболочку» командой sudo lvm. Команда help покажет список команд.

Создание и удаление

Как уже отмечалось, LVM строится на основе разделов жёсткого диска и/или целых жёстких дисков. На каждом из дисков/разделов должен быть создан физический том (physical volume). К примеру, мы используем для LVM диск sda и раздел sdb2:

pvcreate /dev/sda
pvcreate /dev/sdb2

На этих физических томах создаём группу томов, которая будет называться, скажем, vg1:

vgcreate -s 32M vg1 /dev/sda /dev/sdb2

Посмотрим информацию о нашей группе томов:

vgdisplay vg1

Групп можно создать несколько, каждая со своим набором томов. Но обычно это не требуется.

Теперь в группе томов можно создать логические тома lv1 и lv2 размером 20 Гбайт и 30 Гбайт соответствено:

lvcreate -n lv1 -L 20G vg1
lvcreate -n lv2 -L 30G vg1

Теперь у нас есть блочные устройства /dev/vg1/lv1 и /dev/vg1/lv2.

Осталось создать на них файловую систему. Тут различий с обычными разделами нет:

mkfs.ext4 /dev/vg1/lv1
mkfs.reiserfs /dev/vg1/lv2

Удаление LVM (или отдельных его частей, например, логических томов или групп томов) происходит в обратном порядке — сначала нужно отмонтировать разделы, затем удалить логические тома (lvremove), после этого можно удалить группы томов (vgremove) и ненужные физические тома (pvremove).

Добавление физических томов

Чтобы добавить новый винчестер sdc в группу томов, создадим физический том:

pvcreate /dev/sdc

И добавим его в нашу группу:

vgextend vg1 /dev/sdc

Теперь можно создать ещё один логический диск (lvcreate) или увеличить размер существующего (lvresize).

Удаление физических томов

Чтобы убрать из работающей группы томов винчестер sda сначала перенесём все данные с него на другие диски:

pvmove /dev/sda

Затем удалим его из группы томов:

vgreduce vg1 /dev/sda

И, наконец, удалим физический том:

pvremove /dev/sda

Вообще-то, последняя команда просто убирает отметку о том, что диск является членом lvm, и особой пользы не приносит. После удаления из LVM для дальнейшего использования диск придётся переразбивать/переформатировать.

Изменение размеров

LVM позволяет легко изменять размер логических томов. Для этого нужно сначала изменить сам логический том:

lvresize -L 40G vg1/lv2

а затем файловую систему на нём:

resize2fs /dev/vg1/lv2
resize_reiserfs /dev/vg1/lv2

Изменение размеров физического тома — задача весьма сложная и обычно не применяется. Целесообразнее и безопаснее удалить физический том, изменить размер раздела и создать том заново.

Как просто попробовать

Если LVM устанавливается не для дальнейшего использования, а «напосмотреть», то диски и разделы можно заменить файлами. Не понадобятся ни дополнительные диски, ни виртуальные машины. Мы создадим виртуальные накопители и будем с ними работать. Например, можно создать 4 диска по 1 Гбайт, но можно создать другое количество большего или меньшего размера как вам хочется.
Создаем сами файлы, имитирующие устройства:

mkdir /mnt/sdc1/lvm
cd /mnt/sdc1/lvm
dd if=/dev/zero of=./d01 count=1 bs=1G
dd if=/dev/zero of=./d02 count=1 bs=1G
dd if=/dev/zero of=./d03 count=1 bs=1G
dd if=/dev/zero of=./d04 count=1 bs=1G

Создаем loopback устройства из файлов:

losetup -f --show ./d01
losetup -f --show ./d02
losetup -f --show ./d03
losetup -f --show ./d04

Дальше поступаем так же, как если бы ми создавали LVM на реальных дисках. Обратите внимание на названия loop-устройств — они могут отличаться от приведённых здесь.

pvcreate /dev/loop0
pvcreate /dev/loop1
pvcreate /dev/loop2
pvcreate /dev/loop3
vgcreate -s 32M vg /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
lvcreate -n first -L 2G vg
lvcreate -n second -L 400M vg
...

Снапшоты

Одна из важнейших особенностей LVM — это поддержка механизма снапшотов. Снапшоты позволяют сделать мгновенный снимок логического тома и использовать его в дальнейшем для работы с данными.

Примеры использования

LVM активно используется, когда необходим механизм снапшотов. Например, этот механизм крайне важен при бекапе постоянно меняющихся файлов. LVM позволяет заморозить некоторое состояние ФС и скопировать с неё все нужные данные, при этом на оригинальной ФС останавливать запись не нужно.

Также снапшоты можно применить для организации поддержки файловым сервером с Samba механизма архивных копий, об этом в соответствующей статье:

LVM с LiveCD

Если у вас возникла необходимость работать с LVM с LiveCD Ubuntu, то вам придётся выполнить несколько дополнительных действий, поскольку по умолчанию утилит для работы с LVM нет.

Сначала вам нужно установить эти утилиты:

sudo apt-get install lvm2

Далее посмотрите командами

sudo vgscan
sudo vgdisplay YOUR_VGNAME

доступность ваших групп томов. Ну а дальше запустите все группы командой

sudo vgchange -a y

Эта команда должна сообщить о том, что все ваши логические тома активированы. Теперь можно работать с ними обычным образом.

Ссылки

Red Hat Enterprise Linux 6

Руководство администратора LVM

Редакция 1

Аннотация

В данном документе приведена информация об управлении логическими томами, в том числе и в кластерном окружении.

Введение

1. Об этом руководстве

В данном документе рассматривается управление логическими томами (LVM, Logical Volume Manager) в кластерном окружении.

2. Целевая аудитория

Материал ориентирован на опытных администраторов Red Hat Enterprise Linux 6 со знаниями GFS2.

3. Версии

Таблица 1. Версии

Название Описание

RHEL 6

RHEL 6 или более поздние версии

GFS2

GFS2 для RHEL6 и последующих версий

5. Отзывы и предложения

Если вы обнаружили опечатку, или у вас есть предложения по усовершенствованию руководства, создайте запрос в Bugzilla (http://bugzilla.redhat.com/) для выпуска Red Hat Enterprise Linux 6 и компонента . Укажите идентификатор: Logical_Volume_Manager_Administration(EN)-6 (2011-05-19-15:20).

Если у вас есть предложения по улучшению руководства, постарайтесь подробно их описать. Для облегчения идентификации ошибок и опечаток укажите номер раздела и окружающий текст.

Глава 1. Обзор

В этой главе приведена общая информация об LVM и его основных характеристиках в Red Hat Enterprise Linux 6.

1.1. Новые и обновленные возможности

Эта секция содержит перечень новых и измененных функций LVM в Red Hat Enterprise Linux 6.

1.1.1. Изменения в Red Hat Enterprise Linux 6.0

Ниже перечислены основные изменения LVM в Red Hat Enterprise Linux 6.0.

  • Параметры mirror_image_fault_policy и mirror_log_fault_policy в секции activation файла lvm.conf позволяют настроить поведение зеркального тома в случае сбоя устройства. Если mirror_image_fault_policy имеет значение remove, система попытается исключить проблемное устройство и продолжить работу. Значение allocate определяет, что после удаления устройства необходимо выделить пространство для нового устройства. При отсутствии подходящей замены allocate работает аналогично remove (см. Раздел 4.4.3.1, «Правила работы при сбое зеркального тома»).

  • Стек ввода-вывода Linux стал распознавать ограничения ввода-вывода, заданные производителем, что позволяет оптимизировать размещение и доступ к данным. Отключать эту функциональность не рекомендуется, но при необходимости это можно сделать с помощью параметров data_alignment_detection и data_alignment_offset_detection в lvm.conf.

    Информацию о выравнивании данных в LVM и изменении data_alignment_detection и data_alignment_offset_detection можно можно найти в документации к /etc/lvm/lvm.conf (см. Приложение B, Файлы конфигурации LVM). Общие сведения о стеке ввода-вывода и его ограничениях в Red Hat Enterprise Linux 6 можно найти в руководстве по управлению накопителями.

  • Device-mapper напрямую поддерживает интеграцию udev, что позволяет синхронизировать проекции устройств, в том числе и для устройств LVM (см. Раздел A.3, «Поддержка udev»).

  • Для восстановления зеркала после сбоя диска можно использовать lvconvert --repair (см. Раздел 4.4.3.3, «Восстановление зеркального устройства»).

  • lvconvert --merge позволяет объединить снимок с исходным томом (см. Раздел 4.4.5, «Объединение снимка с оригиналом»).

  • lvconvert --splitmirrors позволяет разделить образ зеркального тома на части, тем самым состав новый том (см. Раздел 4.4.3.2, «Разбиение образа зеркального тома»).

  • Теперь можно создать журнал для зеркального логического устройства, для которого также создано зеркало. Для этого используется параметр --mirrorlog mirrored команды lvcreate (см. Раздел 4.4.3, «Создание зеркальных томов»).

1.1.2. Изменения в Red Hat Enterprise Linux 6.1

Ниже перечислены основные изменения LVM в Red Hat Enterprise Linux 6.1.

  • Допускается создание снимков зеркальных логических томов аналогично тому, как создаются снимки обычных томов (см. Раздел 4.4.4, «Создание снимков»).

  • При увеличении размера тома LVM можно использовать параметр --alloc cling команды lvextend. При этом место будет выбираться в пределах тех же физических томов, где расположен последний сегмент увеличиваемого тома. Если места не хватает, будет проверен файл lvm.conf и выбраны диски с тем же тегом.

    Раздел 4.4.12.2, «Увеличение логического тома в режиме cling» содержит описание наращивания зеркальных томов с помощью --alloc cling.

  • Допускается многократное указание аргументов --addtag и --deltag в командах pvchange, vgchange и lvchange (см. Раздел C.1, «Добавление и удаление тегов»).

  • Теперь теги объектов LVM могут содержать «/», «=», «!», «:», «#», «&» (см. Приложение C, Теги объектов LVM).

  • Логический том теперь может состоять из комбинаций RAID0 и RAID1. Если при создании тома было указано число зеркал (--mirrors X) и звеньев (--stripes Y), то будет создано зеркальное устройство с чередующимися составляющими (см. Раздел 4.4.3, «Создание зеркальных томов»).

  • Для создания резервной копии кластерного логического тома теперь можно специально активировать том и создать его снимок (см. Раздел 4.7, «Активация логических томов на отдельных узлах кластера»).

1.2. Логический том

LVM добавляет дополнительный уровень абстракции над физическими дисками, позволяя создавать на их основе логические тома, что обеспечивает бóльшую гибкость по сравнению с управлением физических дисков напрямую. Аппаратная конфигурация накопителей спрятана от программ, поэтому их можно переносить или изменять размер без необходимости остановки приложений и отключения файловых систем.

Преимущества логических томов:

  • Возможность изменения размера.

    Размер файловых систем логических томов не ограничивается одним диском, так как том может располагаться на разных дисках и разделах.

  • Изменение размера.

    С помощью простых команд можно изменить размер логических томов без необходимости переформатирования или переразбиения физических дисков в их основе.

  • Перемещение данных в активной системе.

    С целью создания новых, более быстрых и устойчивых подсистем хранения допускается перемещать данные в активной системе. Данные можно переносить, даже если к дискам выполняется обращение. Например, можно на ходу освободить заменяемый диск перед его удалением из набора.

  • Простота присвоения имен устройствам.

    Логические тома могут объединяться в группы для облегчения управления. Группам могут присваиваться произвольные имена.

  • Чередование дисков.

    Для повышения пропускной способности можно создать логический том с чередованием данных на нескольких дисках.

  • Зеркалирование томов.

    Использование логических томов позволяет создать зеркальные копии данных.

  • Снимки томов.

    Снимки томов представляют собой их точные копии и могут использоваться для тестирования, не подвергая риску исходный том.

Перечисленные возможности будут рассмотрены в этом документе.

1.3. Обзор архитектуры LVM

На смену исходному механизму LVM1, впервые появившемуся в RHEL4, пришел LVM2, архитектура которого более универсальна. LVM2 обладает следующими преимуществами:

  • гибкая емкость;

  • эффективное хранение метаданных;

  • улучшенный формат восстановления;

  • новый формат метаданных ASCII;

  • выборочное изменение метаданных;

  • поддержка избыточных копий метаданных.

LVM2 обратно совместим с LVM1 (за исключением снимков и кластерной поддержки). Группу томов LVM1 можно преобразовать в LVM2 с помощью команды vgconvert. Информацию о преобразовании формата метаданных можно найти на справочной странице vgconvert(8).

В основе логического тома лежит блочное устройство — раздел или целый диск. Это устройство инициализируется как физический том.

Физические тома объединяются в группы томов, тем самым создавая единое пространство для организации логических томов. Этот процесс аналогичен разбиению дисков на разделы. Логический том будет доступен файловым системам и приложениям.

Рисунок 1.1, «Компоненты логического тома» демонстрирует примеры логических томов.

Компоненты логического тома

Рисунок 1.1. Компоненты логического тома

Глава 2, Компоненты LVM содержит подробную информацию о составляющих логического тома.

1.4. CLVM

Кластерное управление логическими томами (CLVM, Clustered Logical Volume Manager) представляет собой набор кластерных расширений для LVM, позволяющих кластеру управлять общим пространством хранения, например в сети SAN. CLVM входит в состав комплекта отказоустойчивого хранилища RHEL 6.

Выбор CLVM также определяется требованиями, перечисленными ниже.

  • Если доступ к хранилищу необходим лишь одному узлу, можно ограничиться возможностями LVM. Создаваемые логические тома будут локальными.

  • Если для восстановления после отказа используется кластерная структура, где только один узел может обращаться к хранилищу в заданный момент времени, потребуются агенты HA-LVM (High Availability Logical Volume Management). Подробную информацию можно найти в документе под названием Конфигурация и управление кластером Red Hat.

  • Если пространство хранения должно быть доступно нескольким активным компьютерам, потребуется прибегнуть к помощи CLVM. CLVM позволит пользователю настроить логические тома в общем хранилище, блокируя доступ к физическому хранилищу во время настройки логического тома и используя кластерные службы блокирования для управления доступом.

Для работы CLVM необходимо, чтобы в системе работали комплекты высокой готовности и отказоустойчивого хранилища. На всех компьютерах в кластере должен выполняться процесс clvmd, который является главным кластерным расширением LVM. clvmd передает компьютерам обновления метаданных LVM, тем самым поддерживая постоянную структуру логических томов. Подробную информацию об комплекте высокой готовности можно найти в руководстве Конфигурация и управление кластером Red Hat.

Чтобы проверить, был ли запущен процесс clmvd во время загрузки компьютера, выполните:

# chkconfig clvmd on

Если clvmd не выполняется, для запуска выполните:

# service clvmd start

Создание логических томов в кластере аналогично созданию томов на одном узле (см. Глава 4, Администрирование LVM в текстовом режиме и Глава 7, Администрирование LVM в графическом режиме). Чтобы активировать созданные в кластере тома, необходимо, чтобы функционировала инфраструктура кластера.

По умолчанию логические тома, созданные в общем хранилище с помощью CLVM, будут видны всем компьютерам, у которых есть доступ к этому хранилищу. Можно создать целые группы томов, устройства хранения которых будут видны только одному компьютеру в кластере. Дополнительно можно изменить статус группы с «локальной» на «кластерную» (см. Раздел 4.3.2, «Создание групп томов в кластере» и Раздел 4.3.7, «Изменение параметров группы томов»).

При создании групп томов в общем хранилище с помощью CLVM необходимо убедиться, что у всех компьютеров в кластере есть доступ к физическим томам в составе группы. Асимметричные схемы кластеров с неравномерными правами доступа к хранилищу не поддерживаются.

Рисунок 1.2, «Структура CLVM» демонстрирует CLVM в кластере Red Hat.

Структура CLVM

Рисунок 1.2. Структура CLVM

Для блокирования в пределах кластера потребуется внести изменения в lvm.conf. Информацию о настройке кластерного блокирования можно найти в файле lvm.conf (см. Приложение B, Файлы конфигурации LVM).

1.5. Содержание документа

Содержание:

  • Глава 2, Компоненты LVM описывает составляющие компоненты логического тома.

  • Глава 3, Обзор администрирования LVM содержит обзор основных шагов по настройке логических томов с помощью команд или графического интерфейса LVM.

  • Глава 4, Администрирование LVM в текстовом режиме содержит обзор некоторых административных задач по созданию и управлению логическими томами.

  • Глава 5, Примеры конфигурации LVM приводит примеры конфигурации LVM.

  • Глава 6, Диагностика проблем содержит описание методов диагностики и решения типичных проблем LVM.

  • Глава 7, Администрирование LVM в графическом режиме содержит обзор графического интерфейса LVM.

  • Приложение A, Device Mapper содержит описание модуля Device-mapper, который LVM использует для создания соответствий между логическими и физическими томами.

  • Приложение B, Файлы конфигурации LVM содержит описание файлов конфигурации LVM.

  • Приложение C, Теги объектов LVM рассказывает о тегах объектов и узлов LVM.

  • Приложение D, Метаданные группы томов рассматривает структуру метаданных групп томов и приводит их образец.

Глава 2. Компоненты LVM

В этой главе рассматриваются компоненты LVM.

2.1. Физический том

В основе логического тома лежит блочное устройство — раздел или целый диск. Устройство инициализируется как физический том. В начале тома размещается специальная метка.

Метка LVM по умолчанию размещается во втором 512-байтном секторе. По желанию ее можно разместить в любом из первых четырех секторов, что позволяет томам использовать эти сектора параллельно с другими пользователями.

Метка определяет порядок устройств, так как очередность их обнаружения в процессе загрузки может меняться. Она не изменяется между перезагрузками в пределах кластера.

Метка идентифицирует устройство как физический том, содержит случайный уникальный идентификатор (UUID), размер устройства (в байтах) и расположение метаданных LVM на устройстве.

Метаданные LVM содержат настройки групп томов в системе. По умолчанию в секции метаданных каждого физического тома в группе хранится копия метаданных. Метаданные не занимают много места и хранятся в формате ASCII.

В настоящее время LVM позволяет сохранить 1-2 копии метаданных в каждом физическом томе. По умолчанию сохраняется одна копия. Задав число копий один раз, его нельзя будет изменить. Первая копия хранится в начале устройства — вскоре после метки. Вторая копия (если она существует) располагается в конце устройства. Если область в начале диска была случайно перезаписана, вторая копия поможет восстановить метаданные.

Приложение D, Метаданные группы томов содержит подробную информацию.

2.1.1. Структура физического тома

Рисунок 2.1, «Структура физического тома» демонстрирует организацию физического тома. Метка LVM расположена во втором секторе, за ней следует область метаданных. Остальное пространство доступно для использования.

В этом документе предполагается, что размер секторов составляет 512 байт (как и в ядре Linux).

Структура физического тома

Рисунок 2.1. Структура физического тома

2.1.2. Диски с несколькими разделами

LVM позволяет создавать физические тома на основе дисковых разделов. В этом случае рекомендуется создать единственный раздел, охватывающий весь диск, и присвоить ему метку физического тома. Достоинства такого подхода:

  • Облегчение администрирования.

    Так намного легче следить за отдельными дисками, особенно в случае сбоя. Кроме того, несколько физических томов на одном диске при загрузке приведут к появлению предупреждения во время загрузки о неизвестных типах разделов.

  • Производительность при чередовании.

    LVM не различает, расположены ли два физических тома на одном и том же диске. Если логический том с чередованием был создан на основе двух физических томов, расположенных на одном диске, может оказаться так, что области чередования расположены в различных разделах одного диска. Это приведет к снижению производительности вместо ожидаемой оптимизации.

Хоть это и не рекомендуется, но может случиться так, что диск все же необходимо разделить на несколько физических томов. Например, в системе с несколькими дисками может понадобиться перенести данные между разделами при миграции существующей системы в формат LVM. При наличии диска большого размера потребуется разбить его на разделы, если на его основе планируется создать несколько групп томов. Если есть такой диск с несколькими разделами, и разделы принадлежат одной группе томов, при создании томов с чередованием уделите особое внимание тому, какие разделы будут включены в логический том.

2.2. Группа томов

Физические тома объединяются в группы, что позволяет создать единое дисковое пространство, из которого будет выделяться место для логических томов.

В пределах группы пространство разделяется на блоки фиксированного размера — экстенты. Размер экстента является минимальным размером, который может быть выделен тому. На уровне физических томов используется понятие физических экстентов.

Логическому тому будут выделяться логические экстенты, размер которых равен размеру физических экстентов. То есть размер экстентов всегда один и тот же для всех логических томов в группе. Группа томов определяет соответствие логических экстентов физическим.

2.3. Логический том

Группа состоит из логических томов. Существует три типа логических томов: линейные, с чередованием и зеркальные.

2.3.1. Линейный том

Линейный том объединяет несколько физических томов. Например, при наличии двух дисков размером 60 гигабайт можно создать логический том размером 120 гигабайт.

При создании линейного тома ему выделяется непрерывный диапазон физических экстентов. Например, как иллюстрирует Рисунок 2.2, «Организация экстентов», логические экстенты с 1 до 99 могут принадлежать одному физическому тому, а логические экстенты с 100 до 198 — второму. С точки зрения приложения существует только одно устройство размером 198 экстентов.

Организация экстентов

Рисунок 2.2. Организация экстентов

Физические тома, на основе которых строится логический том, могут быть разных размеров. Рисунок 2.3, «Линейный том с физическими томами разного размера» демонстрирует группу VG1, размер физических экстентов которой равен 4 МБ. Эта группа включает физические тома PV1 и PV2, которые в свою очередь разделены на блоки размером 4 МБ (в соответствии с размером экстентов). Так, PV1 включает 100 экстентов (общий размер — 400 МБ), а PV2 — 200 экстентов (общий размер — 800 МБ). На их основе можно создать линейный том размером 4—1200 МБ, содержащий от 1 до 300 экстентов. В этом примере том LV1 содержит 300 экстентов.

Линейный том с физическими томами разного размера

Рисунок 2.3. Линейный том с физическими томами разного размера

На основе доступных физических экстентов можно создать один или несколько логических томов произвольного размера. Рисунок 2.4, «Несколько логических томов» демонстрирует ту же группу, что и Рисунок 2.3, «Линейный том с физическими томами разного размера», но в этом примере в группе создано два логических тома — LV1 (250 экстентов, общий размер — 1000 МБ) и LV2 (50 экстентов, общий размер — 200 МБ).

Несколько логических томов

Рисунок 2.4. Несколько логических томов

2.3.2. Том с чередованием

При записи данных в логический том файловая система размещает их в физических томах в его основе. Чередование позволяет повысить производительность при выполнении большого объема последовательных операций ввода-вывода.

При чередовании данные последовательно распределяются между заранее определенным числом физических томов, поэтому операции ввода и вывода могут выполняться параллельно. В некоторых случаях производительность даже может сравниться с линейной организацией.

Приведенная ниже схема демонстрирует чередование данных между тремя физическими томами:

  • первая секция данных записывается на PV1;

  • вторая секция данных записывается на PV2;

  • третья секция данных записывается на PV3;

  • четвертая секция данных записывается на PV1.

Размер сегментов чередования не может превышать размер экстента.

Чередование данных между тремя физическими томами

Рисунок 2.5. Чередование данных между тремя физическими томами

В конец существующего набора томов с чередованием можно добавлять дополнительные физические тома. Прежде чем приступить к увеличению размера, необходимо убедиться, что физические тома обладают достаточным свободным пространством. К примеру, если используется двухстороннее чередование для целой группы томов, одного дополнительного тома будет недостаточно — надо добавить как минимум два физических тома (см. Раздел 4.4.12.1, «Увеличение тома с чередованием»).

2.3.3. Зеркальный том

Зеркало содержит устройства с идентичными копиями данных. При записи данных на одно устройство их копия также записывается на другое, что облегчает восстановление в случае выхода из строя одного из устройств. В случае сбоя одной составляющей зеркала логический том будет преобразован в линейный и продолжит работу.

При создании зеркала LVM записывает копию данных в отдельный физический том. LVM позволяет создать несколько зеркал для логических томов.

LVM подразделяет зеркалируемое устройство на секции, размер которых обычно составляет 512 КБ и ведет журнал синхронизации секций с зеркалами. Журнал может храниться на диске (в таком случае он будет сохраняться между перезагрузками) или временно находиться в памяти.

Рисунок 2.6, «Зеркальный логический том» демонстрирует логический том с одним зеркалом. Его журнал хранится на диске.

Зеркальный логический том

Рисунок 2.6. Зеркальный логический том

Раздел 4.4.3, «Создание зеркальных томов» содержит информацию о создании и изменении зеркал.

2.3.4. Снимки

LVM позволяет создавать снимки — виртуальные образы устройств в любой момент, не прибегая к остановке служб. Если исходное устройство было изменено после создания снимка, будет создана копия измененных данных, чтобы впоследствии можно было воссоздать состояние устройства.

Создание снимков в кластерных группах томов не поддерживается.

Создание снимков для зеркальных логических томов не поддерживается.

Поскольку копируются только те данные, которые были изменены уже после создания снимка, для хранения снимков не требуется много пространства. Например, для хранения снимка редко обновляемого устройства будет достаточно 3-5% от его исходного размера.

Снимки не являются полнофункциональными резервными копиями, а всего лишь виртуальными. Поэтому заменять резервное копирование они не могут.

Размер снимка определяет объем пространства, который должен быть отведен для хранения будущих изменений. Например, если том был полностью перезаписан после создания снимка, размер копии изменений будет равен размеру исходного тома. Поэтому при расчете пространства для снимка следует учитывать ожидаемый объем изменений. Так, для снимка практически неизменяемого тома /usr потребуется меньше пространства, чем для /home, который подвергается изменениям довольно часто.

Если снимок полностью заполнен, он не сможет регистрировать будущие изменения исходного тома. Рекомендуется периодически проверять размер снимка и увеличивать его при необходимости. И наоборот, если вы обнаружили, что размер снимка слишком большой, можно его уменьшить и освободить место.

При создании файловой системы снимка права чтения и записи к исходному тому сохраняются. Если же часть снимка изменена, она будет отмечена и в дальнейшем уже не будет копироваться из исходного тома.

Когда же используются снимки?

  • Если необходимо создать резервную копию логического тома, не останавливая систему, данные в которой постоянно обновляются.

  • Для проверки целостности файловой системы исходного тома можно выполнить fsck в файловой системе снимка.

  • Так как снимок доступен для чтения и записи, в его рамках можно тестировать приложения. При этом действительные данные остаются нетронутыми.

  • В окружении виртуализации снимки виртуальных систем могут создаваться для их последующей модификации и создания на их основе других гостей. Руководство по виртуализации Red Hat Enterprise Linux содержит подробную информацию.

Раздел 4.4.4, «Создание снимков» содержит информацию о создании и изменении снимков

Начиная с Red Hat Enterprise Linux 6, команда lvconvert включает параметр --merge, предназначенный для слияния снимка с исходным томом. Это может использоваться для создания точки восстановления системы. Восстановленному путем слияния логическому тому будет присвоено имя исходного тома, его вспомогательный номер и UUID, а снимок будет удален (см. Раздел 4.4.5, «Объединение снимка с оригиналом»).

Глава 3. Обзор администрирования LVM

Данная глава содержит обзор настройки логических томов LVM. Глава 5, Примеры конфигурации LVM рассматривает более детальные примеры.

Глава 4, Администрирование LVM в текстовом режиме включает описание команд, используемых для администрирования LVM. Глава 7, Администрирование LVM в графическом режиме содержит обзор графического интерфейса.

3.1. Создание томов LVM в кластере

Для создания логических томов в кластерном окружении используется набор расширений CLVM, которые позволяют управлять общим хранилищем кластера. Для работы CLVM необходимо, чтобы в системе работали комплекты высокой готовности и отказоустойчивого хранилища. В процессе загрузки на всех компьютерах в кластере должна быть запущена служба clvmd (см. Раздел 1.4, «CLVM»).

Процесс создания логических томов LVM в кластерном окружении аналогичен созданию томов на отдельном компьютере. Используемые команды не отличаются, и при работе с графическим интерфейсом ничего не меняется. Для активации созданных томов требуется, чтобы была активна кластерная инфраструктура, а для кластера определен кворум.

Для блокирования в пределах кластера потребуется внести изменения в lvm.conf. Информацию о настройке кластерного блокирования можно найти в самом файле lvm.conf (см. Приложение B, Файлы конфигурации LVM).

По умолчанию логические тома, созданные в общем хранилище с помощью CLVM, будут доступны всем компьютерам, у которых есть доступ к этому хранилищу. Можно создать целые группы томов, устройства хранения которых будут видны только одному узлу в кластере. Также можно изменить статус группы с «локальной» на «кластерную» (см. Раздел 4.3.2, «Создание групп томов в кластере» и Раздел 4.3.7, «Изменение параметров группы томов»).

При создании групп томов в общем хранилище с помощью CLVM необходимо убедиться, что у всех компьютеров в кластере есть доступ к физическим томам в составе группы. Асимметричные конфигурации кластеров с неравномерными правами доступа к хранилищу не поддерживаются.

Информацию об установке комплекта высокой степени готовности и настройке кластера можно найти в руководстве по администрированию кластера.

Раздел 5.5, «Создание зеркального логического тома в кластере» содержит пример создания тома в кластере.

3.2. Создание логического тома

Далее приведен порядок действий при создании логического тома.

  1. Инициализация физических томов, на основе которых будет создан логический том.

  2. Создание группы томов.

  3. Создание логического тома.

После создания логического тома можно создать и подключить файловую систему. Приводимые в данном документе примеры подразумевают использование файловой системы GFS2.

GFS2 может быть создана отдельно в одной системе или как часть кластерной конфигурации, но Red Hat Enterprise Linux 6 не поддерживает GFS2 в отдельных системах. Их поддержка Red Hat ограничивается подключением снимков кластерных файловых систем с целью создания резервных копий.

  1. С помощью gfs_mkfs создайте файловую систему GFS2 на логическом томе.

  2. С помощью mkdir создайте точку подключения. В кластерной системе точку подключения надо создать на каждом узле.

  3. Подключите файловую систему. Для каждого узла в кластере можно добавить отдельную строчку в файле fstab.

Перечисленные действия также можно выполнить в окне графического интерфейса LVM.

Процесс создания томов не зависит от оборудования, так как информация о настройках LVM расположена в физических томах, а не на компьютере, где создается том. Использующие хранилище серверы обычно содержат локальные копии, но имеют возможность их воссоздания из содержимого физических томов. Физические тома можно подключить к другому серверу при условии совместимости их версий LVM.

3.3. Увеличение файловой системы логического тома

Порядок действий для увеличения файловой системы логического тома.

  1. Создайте новый физический том.

  2. Добавьте его в группу томов, в которую входит увеличиваемый логический том.

  3. Увеличьте размер логического тома, чтобы он включал новый физический том.

  4. Увеличьте размер файловой системы.

Если группа томов обладает достаточным объемом нераспределенного пространства, шаги 1 и 2 можно опустить.

3.4. Резервное копирование логического тома

Резервные копии и архивы метаданных создаются автоматически при изменении настроек логического тома и группы (это можно отключить в файле lvm.conf). Копия метаданных по умолчанию сохраняется в /etc/lvm/backup, а архивы — в /etc/lvm/archive. Параметры в lvm.conf определяют продолжительность хранения архивов в /etc/lvm/archive и число хранимых файлов. Ежедневная резервная копия должна включать содержимое каталога /etc/lvm.

Обратите внимание, что резервная копия метаданных не содержит системные данные и данные пользователя в логических томах.

Создать архив метаданных в /etc/lvm/backup можно с помощью команды vgcfgbackup. Восстановить метаданные можно с помощью vgcfgrestore (см. Раздел 4.3.12, «Создание резервной копии метаданных группы томов»).

3.5. Журнал событий

Вывод сообщений обрабатывается модулем журналирования. При этом события подразделяются на следующие категории:

  • стандартный вывод или ошибка;

  • syslog;

  • файл журнала;

  • внешняя функция журнала.

Уровни журналирования задаются в /etc/lvm/lvm.conf (см. Приложение B, Файлы конфигурации LVM).

Глава 4. Администрирование LVM в текстовом режиме

В этой главе приведены наборы команд для решения некоторых практических задач управления LVM.

Для управления томами в кластерном окружении необходимо, чтобы выполнялся процесс clvmd (см. Раздел 3.1, «Создание томов LVM в кластере»).

4.1. Использование команд

Сначала стоит упомянуть об основных возможностях команд LVM.

Если аргумент команды содержит величину объема информации, единицы можно указать вручную. Если единицы не указаны, по умолчанию будут подразумеваться килобайты или мегабайты. Сами значения должны быть целыми числами.

По умолчанию регистр единиц не имеет значения. Например, М и m эквивалентны, а сами значения будут кратны 1024. Но если задан аргумент --units, то обозначение единиц в нижнем регистре будет означать, что они кратны 1024, а в верхнем — 1000.

Если команды в качестве аргументов принимают имена отдельных томов или целых групп, можно указать их полный путь. Например, том lvol0 в группе vg0 можно определить как vg0/lvol0. Если ожидается список групп, но при этом он не указан, по умолчанию будет подставлен список ВСЕХ групп томов. Если команда ожидает список томов, но при этом задана группа томов, будет выполнена подстановка всех логических томов в заданной группе. К примеру, команда lvdisplay vg0 покажет список всех логических томов в группе vg0.

Аргумент -v усиливает степень подробности вывода. Его можно использовать каскадно для увеличения детализации. К примеру, стандартный вывод lvcreate выглядит так:

# lvcreate -L 50MB new_vg
  Rounding up size to full physical extent 52.00 MB
  Logical volume "lvol0" created

lvcreate с аргументом -v:

# lvcreate -v -L 50MB new_vg
    Finding volume group "new_vg"
  Rounding up size to full physical extent 52.00 MB
    Archiving volume group "new_vg" metadata (seqno 4).
    Creating logical volume lvol0
    Creating volume group backup "/etc/lvm/backup/new_vg" (seqno 5).
    Found volume group "new_vg"
    Creating new_vg-lvol0
    Loading new_vg-lvol0 table
    Resuming new_vg-lvol0 (253:2)
    Clearing start of logical volume "lvol0"
    Creating volume group backup "/etc/lvm/backup/new_vg" (seqno 5).
  Logical volume "lvol0" created

Степень подробности вывода можно усилить, указав -vv, -vvv или даже -vvvv. Максимально подробный вывод будет достигнут при указании -vvvv. Следующий пример демонстрирует лишь несколько первых строк вывода lvcreate -vvvv:

# lvcreate -vvvv -L 50MB new_vg
#lvmcmdline.c:913         Processing: lvcreate -vvvv -L 50MB new_vg
#lvmcmdline.c:916         O_DIRECT will be used
#config/config.c:864       Setting global/locking_type to 1
#locking/locking.c:138       File-based locking selected.
#config/config.c:841       Setting global/locking_dir to /var/lock/lvm
#activate/activate.c:358       Getting target version for linear
#ioctl/libdm-iface.c:1569         dm version   OF   [16384]
#ioctl/libdm-iface.c:1569         dm versions   OF   [16384]
#activate/activate.c:358       Getting target version for striped
#ioctl/libdm-iface.c:1569         dm versions   OF   [16384]
#config/config.c:864       Setting activation/mirror_region_size to 512
...

Для просмотра краткой справки по интересующей команде используется аргумент --help.

commandname --help

man открывает справочную страницу команды:

man commandname

Например, man lvm покажет информацию об LVM.

В рамках LVM обращение к объектам осуществляется при помощи уникального идентификатора UUID, который назначается при создании объектов. Например, представим, что из группы томов удален физический том /dev/sdf. При повторном его подключении он будет определен как /dev/sdk. LVM корректно его определит, так как для его идентификации используется UUID, а не имя устройства. Раздел 6.4, «Восстановление метаданных физического тома» содержит информацию о присвоении идентификаторов физическим томам при их создании.

4.2. Управление физическими томами

В этой секции рассматриваются команды управления физическими томами.

4.2.1. Создание физических томов

Далее рассматриваются команды, используемые для создания физических томов.

4.2.1.1. Настройка типов разделов

Если физический том занимает весь диск, на этом диске НЕ должно быть таблицы разделов. Разделам DOS соответствует идентификатор 0x8e (задается с помощью fdisk, cfdisk или их аналога). При удалении таблицы разделов данные на диске будут удалены автоматически. Существующую таблицу можно удалить путем заполнения первого сектора нулями:

dd if=/dev/zero of=физический_том bs=512 count=1

4.2.1.2. Инициализация физических томов

pvcreate позволяет инициализировать блочное устройство как физический том. Принципиально инициализация подобна форматированию файловой системы.

Команда инициализации /dev/sdd1, /dev/sde1 и /dev/sdf1 выглядит так:

pvcreate /dev/sdd1 /dev/sde1 /dev/sdf1

Для инициализации отдельных разделов применяется команда pvcreate. Следующий пример инициализирует /dev/hdb1 как физический том для дальнейшего включения в логический том LVM.

pvcreate /dev/hdb1

4.2.1.3. Поиск блочных устройств

С помощью lvmdiskscan можно выполнить поиск блочных устройств для создания физических томов на их основе. Пример:

# lvmdiskscan
/dev/ram0                    [       16.00 MB]
  /dev/sda                     [       17.15 GB]
  /dev/root                    [       13.69 GB]
  /dev/ram                     [       16.00 MB]
  /dev/sda1                    [       17.14 GB] LVM physical volume
  /dev/VolGroup00/LogVol01     [      512.00 MB]
  /dev/ram2                    [       16.00 MB]
  /dev/new_vg/lvol0            [       52.00 MB]
  /dev/ram3                    [       16.00 MB]
  /dev/pkl_new_vg/sparkie_lv   [        7.14 GB]
  /dev/ram4                    [       16.00 MB]
  /dev/ram5                    [       16.00 MB]
  /dev/ram6                    [       16.00 MB]
  /dev/ram7                    [       16.00 MB]
  /dev/ram8                    [       16.00 MB]
  /dev/ram9                    [       16.00 MB]
  /dev/ram10                   [       16.00 MB]
  /dev/ram11                   [       16.00 MB]
  /dev/ram12                   [       16.00 MB]
  /dev/ram13                   [       16.00 MB]
  /dev/ram14                   [       16.00 MB]
  /dev/ram15                   [       16.00 MB]
  /dev/sdb                     [       17.15 GB]
  /dev/sdb1                    [       17.14 GB] LVM physical volume
  /dev/sdc                     [       17.15 GB]
  /dev/sdc1                    [       17.14 GB] LVM physical volume
  /dev/sdd                     [       17.15 GB]
  /dev/sdd1                    [       17.14 GB] LVM physical volume
  7 disks
  17 partitions
  0 LVM physical volume whole disks
  4 LVM physical volumes

4.2.2. Просмотр физических томов

Для просмотра информации о физических томах LVM используются команды pvs, pvdisplay и pvscan.

pvs позволяет настроить формат вывода, показывая по одному тому в каждой строке (см. Раздел 4.8, «Настройка отчетов LVM»).

pvdisplay формирует подробный отчет для каждого физического тома, включая информацию о размере, экстентах, группе томов и пр. Формат вывода фиксирован.

Пример вывода pvdisplay для одного тома:

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               new_vg
  PV Size               17.14 GB / not usable 3.40 MB
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              4388
  Free PE               4375
  Allocated PE          13
  PV UUID               Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe

pvscan проверяет все поддерживаемые блочные устройства в системе на предмет наличия физических томов.

Пример:

# pvscan
 PV /dev/sdb2   VG vg0   lvm2 [964.00 MB / 0   free]
 PV /dev/sdc1   VG vg0   lvm2 [964.00 MB / 428.00 MB free]
 PV /dev/sdc2            lvm2 [964.84 MB]
 Total: 3 [2.83 GB] / in use: 2 [1.88 GB] / in no VG: 1 [964.84 MB]

Чтобы выборочно проверить устройства, можно создать фильтр в lvm.conf (см. Раздел 4.5, «Определение устройств LVM с помощью фильтров»).

4.2.3. Запрет выделения пространства физического тома

Команда pvchange позволяет запретить выделение свободных физических экстентов, что может потребоваться в случае ошибок диска или при удалении физического тома.

Следующая команда запрещает выделение экстентов на /dev/sdk1:

pvchange -x n /dev/sdk1

Аргументы -xy разрешат выделение экстентов там, где раньше это было запрещено.

4.2.4. Изменение размера физического тома

pvresize изменяет размер физического тома, если изменился размер блочного устройства в его основе.

4.2.5. Удаление физических томов

pvremove удаляет устройство, в котором больше нет необходимости, заполняя его метаданные нулями.

Если удаляемый том входит в состав группы, сначала исключите его из группы с помощью vgreduce (см. Раздел 4.3.6, «Удаление физических томов из группы»).

# pvremove /dev/ram15
  Labels on physical volume "/dev/ram15" successfully wiped

4.3. Управление группами

В этой секции описываются команды администрирования групп томов.

4.3.1. Создание групп томов

Команда vgcreate создаст новую группу томов с заданным именем и добавит в нее как минимум один физический том.

Следующая команда создаст группу vg1, включающую в свой состав физические тома /dev/sdd1 и /dev/sde1.

vgcreate vg1 /dev/sdd1 /dev/sde1

Если группа создается на основе физических томов, их пространство по умолчанию подразделяется на экстенты размером 4 мегабайт. Этот размер и определяет минимальную величину изменения размера логического тома. Число экстентов не оказывает влияния на эффективность ввода-вывода для логического тома.

Размер экстента можно задать с помощью аргумента -s команды vgcreate. Дополнительно можно ограничить число томов в группе — для этого используется -p (для физических томов) или -l (для логических томов).

По умолчанию группа томов выделяет физические экстенты согласно стандартным правилам, то есть чередующиеся секции не будут располагаться на одном физическом томе. Стандартная политика распределения обозначена как normal. Аргумент --alloc команды vgcreate позволяет изменить значение на contiguous, anywhere или cling.

contiguous требует, чтобы новые экстенты размещались следом за существующими. Если есть достаточное число экстентов, чтобы удовлетворить запрос выделения пространства, а политика normal не может их использовать, можно выбрать anywhere. Экстенты будут заняты, даже если при этом чередующиеся сегменты будут включены в один том, тем самым оказав отрицательный эффект на производительность. Команда vgchange позволяет изменить метод выделения экстентов.

Раздел 4.4.12.2, «Увеличение логического тома в режиме cling» содержит информацию о cling и выборе томов с помощью тегов.

В целом, любой метод, отличный от normal, используется только в особых, нестандартных случаях.

Файлы групп томов и их логических томов расположены в /dev. Путь:

/dev/vg/lv/

Например, если есть группы myvg1 и myvg2 с томами lvo1, lvo2 и lvo3 в составе каждой из них, им будет соответствовать шесть файлов:

/dev/myvg1/lv01
/dev/myvg1/lv02
/dev/myvg1/lv03
/dev/myvg2/lv01
/dev/myvg2/lv02
/dev/myvg2/lv03

Максимально допустимый размер устройства с LVM — 8 эксабайт для 64-битных процессоров.

4.3.2. Создание групп томов в кластере

Группы томов в кластерном окружении можно создать с помощью vgcreate.

По умолчанию группы, созданные с помощью CLVM в общем хранилище, доступны всем компьютерам, обладающим доступом к этому хранилищу. В принципе, можно создать локальные группы томов, которые будут видны только одному компьютеру в кластере. Для этого используется vgcreate с опцией -c n.

Следующая команда создаст локальную группу vg1 с томами /dev/sdd1 и /dev/sde1.

vgcreate -c n vg1 /dev/sdd1 /dev/sde1

vgchange -с позволяет изменить тип группы с локальной на кластерную (см. Раздел 4.3.7, «Изменение параметров группы томов»).

Тип группы можно проверить с помощью команды vgs. Приведенная далее команда вернет атрибуты групп VolGroup00 и testvg1. В этом примере testvg1 является кластерной группой, а VolGroup00 — нет, о чем свидетельствует значение c в столбце Attr.

[root@doc-07]# vgs
  VG            #PV #LV #SN Attr   VSize  VFree
  VolGroup00      1   2   0 wz--n- 19.88G    0
  testvg1         1   1   0 wz--nc 46.00G 8.00M

Раздел 4.3.4, «Просмотр групп томов», Раздел 4.8, «Настройка отчетов LVM» и справочная страница vgs содержат подробную информацию о vgs.

4.3.3. Добавление физических томов в группу

vgextend позволяет добавить физические тома в существующую группу, тем самым увеличив ее размер.

Команда добавления тома /dev/sdf1 в группу vg1:

vgextend vg1 /dev/sdf1

4.3.4. Просмотр групп томов

vgs и vgdisplay позволяют просмотреть информацию о группах томов LVM.

Основной целью команды vgscan является поиск групп на дисках и создание файла кэша LVM, но с ее помощью можно дополнительно показать список групп томов (см. Раздел 4.3.5, «Поиск групп томов на дисках»).

Команда vgs выведет информацию для каждой группы в отдельной строке. Формат вывода можно изменять, что широко применяется в сценариях (см. Раздел 4.8, «Настройка отчетов LVM»).

vgdisplay показывает параметры группы в фиксированном формате: размер, экстенты, число физических томов и пр. Приведенный далее пример демонстрирует вывод vgdisplay для группы new_vg. Если группа не указана, будет показана информация для всех групп.

# vgdisplay new_vg
  --- Volume group ---
  VG Name               new_vg
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  11
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               51.42 GB
  PE Size               4.00 MB
  Total PE              13164
  Alloc PE / Size       13 / 52.00 MB
  Free  PE / Size       13151 / 51.37 GB
  VG UUID               jxQJ0a-ZKk0-OpMO-0118-nlwO-wwqd-fD5D32

4.3.5. Поиск групп томов на дисках

vgscan проверяет все поддерживаемые дисковые устройства в системе на предмет наличия физических томов и групп томов. При этом будет создан файл /etc/lvm/.cache, содержащий перечень текущих устройств LVM.

LVM выполняет vgscan автоматически при загрузке системы, при запуске vgcreate и при обнаружении несоответствий LVM.

Если конфигурация оборудования была изменена, можно выполнить vgscan вручную. Это необходимо, например, при добавлении новых дисков в систему из SAN или при горячем подключении нового диска, отмеченного как физический том.

В lvm.conf можно определить фильтр для исключения устройств из проверки (см. Раздел 4.5, «Определение устройств LVM с помощью фильтров»).

Пример вывода vgscan:

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "new_vg" using metadata type lvm2
  Found volume group "officevg" using metadata type lvm2

4.3.6. Удаление физических томов из группы

Команда vgreduce удаляет неиспользуемые физические тома из группы, тем самым уменьшая ее размер. Освобожденные физические тома могут быть удалены или добавлены в другие группы.

Прежде чем удалить физический том из группы, надо убедиться, что он не используется логическими томами. Это можно сделать с помощью pvdisplay.

# pvdisplay /dev/hda1

-- Physical volume ---
PV Name               /dev/hda1
VG Name               myvg
PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV#                   1
PV Status             available
Allocatable           yes (but full)
Cur LV                1
PE Size (KByte)       4096
Total PE              499
Free PE               0
Allocated PE          499
PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

Если физический том все еще используется, надо перенести данные в другой том (с помощью pvmove). После этого можно будет уменьшить размер тома с помощью vgreduce.

Следующая команда удалит том /dev/hda1 из my_volume_group:

# vgreduce my_volume_group /dev/hda1

4.3.7. Изменение параметров группы томов

vgchange позволяет включить и отключить группы томов (см. Раздел 4.3.8, «Активация и деактивация групп томов»), а также изменить некоторые параметры.

Следующая команда изменяет максимально допустимое число логических томов для группы vg00, устанавливая его значение в 128:

vgchange -l 128 /dev/vg00

Справочная страница vgchange(8) содержит описание доступных параметров.

4.3.8. Активация и деактивация групп томов

При создании группы томов она будет активна по умолчанию, то есть логические тома в ее составе будут сразу доступны.

Существует множество причин, по которым может понадобиться отключить группу томов. Для это цели служит аргумент -a (--available) команды vgchange.

Пример отключения группы my_volume_group:

vgchange -a n my_volume_group

Если включено кластерное блокирование, добавьте «e» для активации или деактивации группы на выбранном узле в кластере или «I» — только на локальном узле. Логические тома со снимком на одном узле всегда активируются отдельно.

Отключение отдельных логических томов осуществляется с помощью lvchange (см. Раздел 4.4.8, «Изменение параметров группы логических томов»). Раздел 4.7, «Активация логических томов на отдельных узлах кластера» содержит информацию об активации логических томов на индивидуальных узлах кластера.

4.3.9. Удаление групп томов

Команда vgremove позволяет удалить пустую группу томов.

# vgremove officevg
  Volume group "officevg" successfully removed

4.3.10. Разбиение группы томов

Чтобы разделить физические тома в группе с целью создания новой группы, используется команда vgsplit.

Логические тома, принадлежащие разным группам, не могут быть разделены. Каждый логический том должен полностью принадлежать физическим томам, входящим в состав либо уже существующей, либо новой группы томов. Для принудительного разбиения используется pvmove.

Следующий пример отделяет новую группу томов smallvg от bigvg.

# vgsplit bigvg smallvg /dev/ram15
  Volume group "smallvg" successfully split from "bigvg"

4.3.11. Объединение групп томов

Для объединения двух групп в одну используется команда vgmerge. Возможно объединение двух неактивных томов, если размеры их физических экстентов равны и общий объем физических и логических томов обеих групп не превышает допустимый размер полученной группы.

Следующая команда добавит неактивную группу my_vg в группу databases с выводом отчета о процессе выполнения.

vgmerge -v databases my_vg

4.3.12. Создание резервной копии метаданных группы томов

Резервные копии и архивы метаданных по умолчанию создаются автоматически в случае изменения конфигурации логического тома или группы. Это можно отключить в lvm.conf. Резервная копия метаданных сохраняется в /etc/lvm/backup, а архивы — в /etc/lvm/archives. Команда vgcfgbackup позволяет создать резервную копию метаданных в /etc/lvm/backup в любое время.

vgcfrestore восстанавливает метаданные группы томов из архива и размещает их на всех физических томах в группах.

Раздел 6.4, «Восстановление метаданных физического тома» содержит пример использования vgcfgrestore для восстановления метаданных.

4.3.13. Переименование группы томов

Для переименования существующей группы томов используется команда vgrename.

Обе приведенные команды изменяют имя группы vg02 на my_volume_group.

vgrename /dev/vg02 /dev/my_volume_group
vgrename vg02 my_volume_group

4.3.14. Перенос группы томов в другую систему

С помощью vgexport и vgimport можно осуществлять перемещение целых групп томов между системами.

vgexport закрывает доступ к неактивной группе томов, что позволяет отключить ее физические тома, а vgimport снова разрешает доступ.

Порядок действий при переносе группы томов между системами:

  1. Убедитесь, что пользователи не обращаются к файлам в пределах активных томов в группе, затем отключите логические тома.

  2. Чтобы отметить группу томов как неактивную, выполните команду vgchange с аргументом -a n.

  3. vgexport позволяет экспортировать группу, что закроет к ней доступ из системы, откуда она будет удалена.

    После завершения экспортирования группы, когда вы запустите команду pvscan, будет видно, что физический том принадлежит экспортируемой группе. Пример:

    [root@tng3-1]# pvscan
      PV /dev/sda1    is in exported VG myvg [17.15 GB / 7.15 GB free]
      PV /dev/sdc1    is in exported VG myvg [17.15 GB / 15.15 GB free]
      PV /dev/sdd1   is in exported VG myvg [17.15 GB / 15.15 GB free]
      ...
    

    После следующего выключения системы можно отсоединить диски, на основе которых была построена эта группа томов, и переподключить их в новую систему.

  4. Подключив диски в новую систему, выполните vgimport для импорта группы томов, тем самым открыв к ней доступ из системы.

  5. Аргумент -a y команды vgchange позволяет активировать группу томов.

  6. Подключите файловую систему.

4.3.15. Восстановление каталога группы томов

Чтобы воссоздать каталог группы томов и специальные файлы логических томов, используется команда vgmknodes. Она проверяет специальные файлы LVM2 в каталоге /dev, необходимые для работы активных логических томов. При этом будут созданы недостающие специальные файлы, а лишние файлы будут удалены.

Аналогичного результата можно добиться с помощью vgscan, указав аргумент --mknodes.

4.4. Управление логическими томами

В этой секции будут рассмотрены команды управления логическими томами.

4.4.1. Создание линейных логических томов

Новый логический том можно создать с помощью lvcreate. Если имя тома не указано, по умолчанию будет использоваться обозначение lvol#, где # — внутренний номер логического тома.

Для нового линейного тома выделяются свободные экстенты из группы физических томов. Обычно логические тома используют все доступное пространство. При изменении размера логического тома экстенты в их основе будут переорганизованы или освобождены.

Следующая команда создаст логический том размером 10 гигабайт в группе vg1.

lvcreate -L 10G vg1

Приведенная далее команда создаст линейный том testlv размером 1500 мегабайт в группе testvg. При этом будет создано блочное устройство /dev/testvg/testlv.

lvcreate -L1500 -n testlv testvg

Далее из свободных экстентов в группе vg0 будет создан логический том gfslv размером 50 гигабайт.

lvcreate -L 50G -n gfslv vg0

lvcreate -l позволяет задать размер логического тома в экстентах. Также можно указать процентную часть группы томов, используемую для создания логического тома. Приведенная ниже команда создаст том mylv, занимающий 60% группы testvol.

lvcreate -l 60%VG -n mylv testvg

С помощью -l можно также указать процент свободного пространства группы, которое будет занято логическим томом. Например, команда создания тома yourlv, который займет все свободное пространство группы testvol будет выглядеть так:

lvcreate -l 100%FREE -n yourlv testvg

С помощью -l можно также создать логический том, который будет использовать целую группу томов. Другой способ создания логического тома, занимающего всю группу, состоит в передаче команде lvcreate значения «Total PE», найденного с помощью vgdisplay.

Пример создания логического тома mylv, который полностью заполнит группу testvg:

# vgdisplay testvg | grep "Total PE"
Total PE              10230
# lvcreate -l 10230 testvg -n mylv

При создании логического тома на основе физических томов стоит учесть вероятность того, что в будущем физический том может потребоваться удалить (см. Раздел 4.3.6, «Удаление физических томов из группы»).

Чтобы создать логический том на основе определенных физических томов в группе, надо их перечислить в командной строке lvcreate. Далее будет создан логический том testlv на основе физического тома /dev/sdg1 в группе testvg.

lvcreate -L 1500 -ntestlv testvg /dev/sdg1

Можно указать, какие экстенты будут задействованы для образования логического тома. В следующем примере будет создан линейный том, в состав которого войдут экстенты 0 — 24 физического тома /dev/sda1 и 50 — 124 тома /dev/sdb1. Оба физических тома принадлежат группе testvg.

lvcreate -l 100 -n testlv testvg /dev/sda1:0-24 /dev/sdb1:50-124

Следующий пример демонстрирует создание линейного тома на основе экстентов 0 — 25 физического тома /dev/sda1 и затем продолжая с экстента 100.

lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-

По умолчанию правила выделения экстентов наследуются от группы томов (inherit). Это можно изменить с помощью lvchange (см. Раздел 4.3.1, «Создание групп томов»).

4.4.2. Создание томов с чередованием

Для обработки больших объемов последовательных операций чтения и записи рекомендуется использовать логические тома с чередованием, так как при этом можно достичь высокой эффективности чтения и записи (см. Раздел 2.3.2, «Том с чередованием»).

При создании тома с чередованием число сегментов (физических томов) задается с помощью аргумента -i команды lvcreate. Это значение не должно превышать общее число физических томов в группе (за исключением использования --alloc anywhere).

Если размеры физических устройств, на основе которых создан логический том, отличаются, то максимальный объем тома с чередованием будет определяться размером наименьшего устройства. Например, если используются два физических тома, максимальный размер логического тома будет равен удвоенному размеру наименьшего устройства. Если же используются три тома, максимальный размер будет равен утроенному размеру наименьшего устройства.

Следующая команда создаст том gfslv размером 50 ГБ на основе двух физических томов в группе vg0; при этом размер сегмента чередования будет равен 64 КБ.

lvcreate -L 50G -i2 -I64 -n gfslv vg0

Так же как и в случае с линейными томами, можно явно указать число выделяемых экстентов. В следующем примере на основе двух физических томов будет создан том stripelv, содержащий 100 экстентов. Этот том будет входить в состав группы testvg и занимать секторы 0 — 49 тома /dev/sda1 и 50 — 99 тома /dev/sdb1.

# lvcreate -l 100 -i2 -nstripelv testvg /dev/sda1:0-49 /dev/sdb1:50-99
  Using default stripesize 64.00 KB
  Logical volume "stripelv" created

4.4.3. Создание зеркальных томов

Создание зеркального логического тома в кластере осуществляется по тем же правилам, что и на отдельном компьютере. Отличия состоят в том, что в кластере должна работать кластерная инфраструктура, кластер должен обладать кворумом, а тип блокирования в lvm.conf должен разрешать кластерное блокирование. Раздел 5.5, «Создание зеркального логического тома в кластере» содержит примеры создания зеркального тома в кластере.

Одновременные попытки выполнения команд создания и преобразования зеркал с разных компьютеров в кластере могут привести к их задержкам и сбоям. Поэтому команды создания зеркал рекомендуется выполнять с одного компьютера.

При создании зеркального тома необходимо указать число копий, для чего служит аргумент -m команды lvcreate. Так, -m1 создаст одно зеркало, то есть в файловой системе будет две копии — линейный логический том и его копия. Аналогичным образом, если указать -m2, будет создано два зеркала (всего три копии).

Ниже приведен пример создания тома mirrorlv размером 50 гигабайт с одним зеркалом. Пространство будет выделено из группы vg0.

lvcreate -L 50G -m1 -n mirrorlv vg0

Копируемое устройство разбивается на сегменты, размер которых по умолчанию составляет 512 килобайт. Аргумент -R команды lvcreate позволяет указать другой размер в мегабайтах, или его можно изменить напрямую с помощью параметра mirror_region_size в файле lvm.conf.

В силу ограничений кластерной инфраструктуры, размер сегментов зеркала, размер которого превышает 1.5 ТБ, должен быть больше 512 МБ. В противном случае может нарушиться функциональность LVM.

Размер сегмента рассчитывается так: размер зеркала в терабайтах округляется до следующего значения, кратного 2. Так, например, для зеркала размером 1.5 ТБ можно указать -R 2, для 3 ТБ — -R 4, для 5 ТБ — -R 8.

Следующая команда создаст зеркальный том с сегментами размером 2 МБ:

lvcreate -m1 -L 2T -R 2 -n mirror vol_group

LVM поддерживает краткий журнал синхронизации сегментов с зеркалами. По умолчанию журнал хранится на диске и сохраняется между перезагрузками. Если же требуется, чтобы журнал находился в памяти, используйте аргумент --corelog. Это отменяет необходимость в устройстве журналирования, но в то же время требует полной синхронизации зеркала при каждой перезагрузке.

Ниже будет создан логический том ondiskmirvol с одним зеркалом в группе bigvg. Размер тома равен 12 МБ, а журнал зеркала хранится в памяти.

# lvcreate -L 12MB -m1 --mirrorlog core -n ondiskmirvol bigvg
  Logical volume "ondiskmirvol" created

Журнал зеркала будет создан на отдельном устройстве. Возможно создание журнала на том же устройстве, где расположена секция зеркала, — для этого служит аргумент --alloc anywhere команды vgcreate. Это может отрицательно сказаться на производительности, но позволит создать зеркало даже при наличии всего двух устройств.

Ниже приведен пример создания тома mirrorlv размером 50 МБ с одним зеркалом на основе группы томов vg0. При этом журнал зеркала расположен на том же устройстве, что и составляющая зеркала. Группа томов vg0 состоит из двух устройств.

lvcreate -L 500M -m1 -n mirrorlv -alloc anywhere vg0

В кластерном окружении управление журналами зеркал осуществляется компьютером с наименьшим кластерным идентификатором. Если отдельные узлы кластера потеряли доступ к устройству, где хранится журнал, функциональность зеркала не нарушится при условии, что журнал доступен компьютеру с наименьшим идентификатором. Но если компьютер с наименьшим идентификатором потеряет доступ к журналу, процедура восстановления начнется, даже если журнал доступен с других узлов.

Для создания зеркала журнала служит аргумент --mirrorlog mirrored. Приведенная ниже команда создаст том twologvol с одним зеркалом в группе bigvg. Размер тома равен 12 МБ, а журналы зеркал хранятся на отдельных устройствах.

# lvcreate -L 12MB -m1 --mirrorlog mirrored -n twologvol bigvg
  Logical volume "twologvol" created

Параметр --alloc anywhere позволяет хранить копии журнала на том же устройстве, где расположено звено зеркала. Как уже упоминалось, это может отрицательно сказаться на производительности, но позволит создать дополнительный журнал, даже если общее число журналов превышает число физических дисков.

Составляющие зеркала синхронизируются в момент его создания. В зависимости от их размера процесс синхронизации может занять некоторое время. Если создается новое зеркало, синхронизация которого необязательна, можно добавить параметр nosync.

Можно явно указать, на каких устройствах будут располагаться журналы, и какие экстенты будут заняты зеркалом. Чтобы разместить журнал на конкретном диске, укажите всего ОДИН экстент на этом диске. LVM игнорирует порядок, в котором перечислены устройства. Если в списке присутствуют физические устройства, они и будут использоваться для выделения пространства; занятые физические экстенты будут пропущены.

Далее приведен пример создания зеркального тома mirrorlv размером 500 МБ с одним зеркалом и одним журналом. Том будет создан в группе vg0. Одна часть зеркала будет располагаться на устройстве /dev/sda1, вторая — на /dev/sdb1, а журнал будет храниться на /dev/sdc1.

lvcreate -L 500M -m1 -n mirrorlv vg0 /dev/sda1 /dev/sdb1 /dev/sdc1

Следующая команда создаст том mirrorlv размером 500 МБ с одним зеркалом. Том будет создан в составе группы vg0. Одна часть зеркала будет занимать экстенты 0 — 499 на /dev/sda1, вторая — экстенты 0 — 499 на /dev/sdb1, а журнал будет храниться на /dev/sdc1, начиная с нулевого экстента. Размер экстента равен 1 МБ. Если указанные экстенты уже заняты, они будут пропущены.

lvcreate -L 500M -m1 -n mirrorlv vg0 /dev/sda1:0-499 /dev/sdb1:0-499 /dev/sdc1:0

Начиная с Red Hat Enterprise Linux 6.1, допускается объединять массивы RAID0 и RAID1 в один логический том. Если при создании логического тома указано число зеркал (--mirrors X) и число секций (--stripes Y), будет создано зеркальное устройство с чередующимися составляющими.

4.4.3.1. Правила работы при сбое зеркального тома

Поведение зеркального тома в случае сбоя устройства можно определить с помощью параметров mirror_image_fault_policy и mirror_log_fault_policy в секции activation файла lvm.conf. Если этим параметрам присвоено значение remove, неисправные устройства будут исключены из системы. Значение allocate означает, что после исключения устройства будет предпринята попытка выделения пространства на другом устройстве. Если пространство выделить не удалось, allocate работает так же как remove.

По умолчанию mirror_log_fault_policy имеет значение allocate, то есть синхронизация поддерживается между перезагрузками и в случае сбоя. Если задан режим remove, то в случае сбоя устройства, где хранится журнал, зеркало будет поддерживать журнал в памяти без сохранения его между перезагрузками. Как следствие, после сбоя зеркало надо будет синхронизировать полностью.

По умолчанию mirror_image_fault_policy имеет значение remove, то есть если после сбоя звена зеркала осталась только одна копия, зеркало будет преобразовано в другой тип. allocate приводит к повторной синхронизации устройств с сохранением характеристик зеркала, что может занять некоторое время.

При выходе из строя устройства в составе зеркала начнется процесс восстановления. Сначала проблемные устройства будут исключены, что может привести к тому, что зеркало превратится в обычное линейное устройство. Далее начнется замена этих устройств при условии, что параметр mirror_log_fault_policy имеет значение allocate. Однако нет гарантий, что на втором этапе не будут выбраны устройства, которые раньше служили причиной сбоя зеркала.

Раздел 6.3, «Восстановление после сбоя зеркала» содержит дальнейшую информацию о восстановлении зеркал вручную.

4.4.3.2. Разбиение образа зеркального тома

Образ зеркального тома можно разделить на части с целью создания нового тома. Для этой цели служит lvconvert --splitmirrors с указанием числа копий. Аргумент --name задает имя нового тома.

В следующем примере от тома vg/lv будет отделен новый том copy, содержащий две копии зеркала. LVM сам выбирает, какие именно устройства будут отделены.

lvconvert --splitmirrors 2 --name copy vg/lv

Можно отдельно указать устройства. Ниже приведена команда отделения нового тома copy от vg/lv. Составляющие зеркала будут располагаться на двух устройствах: /dev/sdc1 и /dev/sde1.

lvconvert --splitmirrors 2 --name copy vg/lv /dev/sd[ce]1

4.4.3.3. Восстановление зеркального устройства

Команда lvconvert --repair поможет восстановить зеркало после сбоя диска. lvconvert --repair выполняется в интерактивном режиме, предлагая подтвердить замену сбойных устройств.

  • Чтобы пропустить запросы подтверждения и заменить все проблемные устройства, добавьте параметр -y.

  • Чтобы пропустить все запросы и не заменять устройства, добавьте параметр -f.

  • Чтобы пропустить запросы, но при этом включить доступные режимы замены для зеркального образа и журнала, укажите аргумент --use-policies. Он получает значения mirror_log_fault_policy и mirror_device_fault_policy из lvm.conf.

4.4.3.4. Изменение конфигурации зеркальных томов

Преобразование зеркального тома в линейный и наоборот осуществляется с помощью команды lvconvert. Она также позволяет изменить параметры существующих логических томов.

При преобразовании логического тома в зеркальный, в сущности, вы просто создаете составляющие зеркала для уже существующего тома. Группа томов должна иметь достаточно устройств и пространства для организации зеркал и хранения журнала.

Если по какой-то причине одна из составляющих зеркала перестала работать, LVM осуществит преобразование тома в линейный, чтобы сохранить доступ к его содержимому. После замены звена зеркало можно восстановить с помощью lvconvert (см. Раздел 6.3, «Восстановление после сбоя зеркала»).

Следующая команда преобразует линейный том vg00/lvol1 в зеркальный.

lvconvert -m1 vg00/lvol1

Команда преобразования зеркального логического тома vg00/lvol1 в линейный с удалением зеркального компонента будет выглядеть так:

lvconvert -m0 vg00/lvol1

4.4.4. Создание снимков

Команда lvcreate с аргументом -s позволяет создать том-снимок с разрешениями записи.

Создание снимков в кластерной группе томов не поддерживается. Но в Red Hat Enterprise Linux 6.1 можно отдельно активировать кластерный том и создать его снимок (см. Раздел 4.7, «Активация логических томов на отдельных узлах кластера»).

В Red Hat Enterprise Linux 6.1 добавлена поддержка снимков для зеркальных логических томов.

Ниже будет создан снимок /dev/vg00/snap для тома /dev/vg00/lvol1 размером 100 МБ. Если исходный том содержит файловую систему, можно будет подключить снимок в любой каталог, тем самым получив доступ к содержимому файловой системы для создания резервной копии, в то время как исходная файловая система будет продолжать обновление.

lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1

Выполнив lvdisplay для логических томов, можно получить список его снимков и их статус (активный или неактивный).

Ниже показано состояние тома /dev/new_vg/lvol0, для которого был создан снимок /dev/new_vg/newvgsnap.

# lvdisplay /dev/new_vg/lvol0
  --- Logical volume ---
  LV Name                /dev/new_vg/lvol0
  VG Name                new_vg
  LV UUID                LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
  LV Write Access        read/write
  LV snapshot status     source of
                         /dev/new_vg/newvgsnap1 [active]
  LV Status              available
  # open                 0
  LV Size                52.00 MB
  Current LE             13
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:2

Команда lvs по умолчанию показывает исходный том и процентную часть снимка. Следующий пример демонстрирует стандартный вывод lvs для системы с логическим томом /dev/new_vg/lvol0 с соответствующим ему снимком /dev/new_vg/newvgsnap.

# lvs
  LV         VG     Attr   LSize  Origin Snap%  Move Log Copy%
  lvol0      new_vg owi-a- 52.00M
  newvgsnap1 new_vg swi-a-  8.00M lvol0    0.20

Так как размер снимка увеличивается по мере изменения исходного тома, важно следить за его заполнением. Для этого можно использовать команду lvs. При заполнении снимка на 100% он будет потерян, так как запись в неизменяемые участки исходного тома повредит сам снимок.

4.4.5. Объединение снимка с оригиналом

В Red Hat Enterprise Linux 6 добавлена возможность объединения снимка с его исходным томом с помощью lvconvert --merge. Если не открыт ни снимок, ни исходный том, их слияние будет выполнено автоматически. В противном случае слияние начнется, как только один из томов станет активен или по факту закрытия обоих томов. Объединение снимка с томом, который не может быть закрыт (например, если он содержит корневую файловую систему), будет отложено до момента следующей активации исходного тома. Полученному в результате объединения тому будет присвоено имя исходного тома, его вторичный номер и UUID. Во время слияния все операции чтения и записи исходного тома будут представлены так, как будто они предназначаются снимку. После завершения снимок будет удален.

Следующая команда объединит снимок vg00/lvol1_snap с его исходным томом.

lvconvert --merge vg00/lvol1_snap"

В команде можно указать несколько снимков или их метки. Так, в приведенном ниже примере томам vg00/lvol1, vg00/lvol2 и vg00/lvol3 соответствует метка @some_tag. Команда последовательно осуществит слияние их снимков. Дополнительный параметр --background начнет объединение снимков параллельно.

lvconvert --merge @some_tag"

Приложение C, Теги объектов LVM содержит сведения о присвоении меток объектам LVM. Информацию о lvconvert --merge можно найти на справочной странице lvconvert(8).

4.4.6. Постоянные номера устройств

Старший и младший номер присваивается динамически при загрузке модуля. Производительность некоторых приложений оптимальна при условии, что оба номера остаются неизменными. Их можно задать с помощью команд lvcreate и lvchange:

--persistent y --major старший --minor младший

В качестве младшего номера используйте достаточно большое число, чтобы гарантировать, что этот номер не будет назначен устройству автоматически.

Если файловая система подключается по NFS, то указание в файле экспорта параметра fsid поможет избежать необходимости в обеспечении постоянства номера устройства в пределах LVM.

4.4.7. Изменение размера логических томов

С помощью команды lvreduce можно уменьшить размер логического тома. Если том содержит файловую систему, сначала необходимо уменьшить ее размер, чтобы размер логического тома был эквивалентен размеру файловой системы.

Следующая команда уменьшает размер тома lvol1 в группе vg00 на три логических экстента.

lvreduce -l -3 vg00/lvol1

4.4.8. Изменение параметров группы логических томов

С помощью команды lvchange можно изменить параметры логического тома. Полный список параметров можно найти на справочной странице lvchange(8).

lvchange также можно использовать для активации и деактивации логических томов. Одновременная активация ВСЕХ логических томов в группе осуществляется с помощью vgchange (см. Раздел 4.3.7, «Изменение параметров группы томов»).

Следующая команда ограничивает доступ к тому lvol1 в группе vg00 только чтением.

lvchange -pr vg00/lvol1

4.4.9. Переименование логических томов

Чтобы переименовать существующий логический том, используйте команду lvrename.

Обе приведенные команды изменят имя логического тома lvold в группе vg02 на lvnew.

lvrename /dev/vg02/lvold /dev/vg02/lvnew
lvrename vg02 lvold lvnew

Раздел 4.7, «Активация логических томов на отдельных узлах кластера» содержит информацию об активации логических томов на отдельных узлах кластера.

4.4.10. Удаление логических томов

Удалить неактивный логический том можно с помощью команды lvremove. Сначала выполните umount для его отключения из файловой системы. В кластерном окружении необходимо выключить том перед его удалением.

Приведенная далее команда удалит /dev/testvg/testlv из группы testvg. В этом примере логический том не был выключен.

[root@tng3-1 lvm]# lvremove /dev/testvg/testlv
Do you really want to remove active logical volume "testlv"? [y/n]: y
  Logical volume "testlv" successfully removed

Том можно отключить отдельно с помощью lvchange -an — тогда предупреждение об удалении активного тома не появится.

4.4.11. Просмотр логических томов

Для просмотра сведений о логических томах используются команды lvs, lvdisplay и lvscan.

lvs позволяет настроить формат полученных данных и выводит по одному тому на каждой строке, что может применяться при создании сценариев (см. Раздел 4.8, «Настройка отчетов LVM»).

Вывод команды lvdisplay будет содержать информацию о томе в фиксированном формате.

Следующая команда покажет атрибуты тома lvol2 в группе vg00. Вывод также будет содержать список снимков выбранного тома и их статус (активен или неактивен).

lvdisplay -v /dev/vg00/lvol2

lvscan покажет список логических томов в системе. Пример:

# lvscan
 ACTIVE                   '/dev/vg0/gfslv' [1.46 GB] inherit

4.4.12. Увеличение размера логических томов

lvextend позволяет увеличить размер логического тома.

Можно задать объем для увеличения тома или точный размер тома уже после увеличения.

Пример увеличения логического тома /dev/myvg/homevol до 12 гигабайт:

# lvextend -L12G /dev/myvg/homevol 
lvextend -- extending logical volume "/dev/myvg/homevol" to 12 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended

Следующая команда добавит еще один гигабайт в /dev/myvg/homevol.

# lvextend -L+1G /dev/myvg/homevol
lvextend -- extending logical volume "/dev/myvg/homevol" to 13 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended

Аргумент -l позволяет указать число экстентов для добавления в том. Также можно указать процент от общего размера группы томов или незанятого пространства. Приведенная ниже команда увеличит том testlv, выделив ему все нераспределенное пространство в группе myvg.

[root@tng3-1 ~]# lvextend -l +100%FREE /dev/myvg/testlv
  Extending logical volume testlv to 68.59 GB
  Logical volume testlv successfully resized

После увеличения тома необходимо увеличить размер его файловой системы.

Большинство стандартных утилит файловой системы по умолчанию нарастят файловую систему так, чтобы ее размер соответствовал размеру логического тома.

4.4.12.1. Увеличение тома с чередованием

Чтобы увеличить размер логического тома, использующего чередование, необходимо иметь достаточно пространства на физических томах в его основе. К примеру, в случае двухстороннего чередования, в котором занята целая группа томов, добавление нового физического тома в группу не позволит увеличить размер сегмента чередования — придется добавить как минимум два физических тома.

Возьмем в качестве примера группу vg, состоящую из двух физических томов.

# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     2   0   0 wz--n- 271.31G 271.31G

Новый сегмент чередования может занимать все доступное в группе место.

# lvcreate -n stripe1 -L 271.31G -i 2 vg
  Using default stripesize 64.00 KB
  Rounding up size to full physical extent 271.31 GB
  Logical volume "stripe1" created
# lvs -a -o +devices
  LV      VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe1 vg   -wi-a- 271.31G                               /dev/sda1(0),/dev/sdb1(0)

После этого в группе не останется свободного пространства.

# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     2   1   0 wz--n- 271.31G    0

Следующая команда добавит новый физический том в группу, тем самым увеличив ее размер на 135 гигабайт.

# vgextend vg /dev/sdc1
  Volume group "vg" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     3   1   0 wz--n- 406.97G 135.66G

На данном этапе увеличить объем тома с чередованием до максимального размера группы нельзя, так как для организации чередования необходимо два физических устройства.

# lvextend vg/stripe1 -L 406G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 406.00 GB
  Insufficient suitable allocatable extents for logical volume stripe1: 34480 
more required

Надо добавить еще один физический том и уже после этого можно будет увеличить размер логического тома.

# vgextend vg /dev/sdd1
  Volume group "vg" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     4   1   0 wz--n- 542.62G 271.31G
# lvextend vg/stripe1 -L 542G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 542.00 GB
  Logical volume stripe1 successfully resized

Если в вашем распоряжении нет необходимого числа физических устройств, все же можно увеличить объем логического тома, не используя при этом чередование. При наращивании тома по умолчанию используются параметры чередования последнего сегмента существующего логического тома, что можно переопределить. Следующий пример расширяет существующий том так, чтобы в случае неудачи команды lvextend использовалось все свободное пространство.

# lvextend vg/stripe1 -L 406G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 406.00 GB
  Insufficient suitable allocatable extents for logical volume stripe1: 34480 
more required
# lvextend -i1 -l+100%FREE vg/stripe1

4.4.12.2. Увеличение логического тома в режиме cling

При увеличении размера тома можно использовать механизм cling (параметр --alloc cling команды lvextend). При этом место будет выбираться в пределах тех же физических томов, где расположен последний сегмент увеличиваемого тома. Если места не хватает, но файл lvm.conf содержит список тегов, для увеличения тома будет выбран физический том с тем же тегом.

Например, при наличии логических томов с зеркалами, расположенными в той же группе, им можно присвоить теги @site1 и @site2, а в lvm.conf добавить следующее выражение:

cling_tag_list = [ "@site1", "@site2" ]

Приложение C, Теги объектов LVM содержит подробную информацию о присвоении тегов.

В следующем примере lvm.conf изменен так:

cling_tag_list = [ "@A", "@B" ]

В этом примере группа taft состоит из физических томов /dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1, /dev/sdf1, /dev/sdg1, /dev/sdh1, которые обозначены как A, B и C. Физические тома для организации составляющих зеркала будут выбираться по тегу.

[root@taft-03 ~]# pvs -a -o +pv_tags /dev/sd[bcdefgh]1
  PV         VG   Fmt  Attr PSize   PFree   PV Tags
  /dev/sdb1  taft lvm2 a-   135.66g 135.66g A
  /dev/sdc1  taft lvm2 a-   135.66g 135.66g B
  /dev/sdd1  taft lvm2 a-   135.66g 135.66g B
  /dev/sde1  taft lvm2 a-   135.66g 135.66g C
  /dev/sdf1  taft lvm2 a-   135.66g 135.66g C
  /dev/sdg1  taft lvm2 a-   135.66g 135.66g A
  /dev/sdh1  taft lvm2 a-   135.66g 135.66g A

Теперь в группе taft будет создан зеркальный том размером 100 гигабайт.

[root@taft-03 ~]# lvcreate -m 1 -n mirror --nosync -L 100G taft

Следующая команда покажет список устройств в составе зеркала.

[root@taft-03 ~]# lvs -a -o +devices
  LV                VG        Attr   LSize   Log         Copy%  Devices
  mirror            taft      Mwi-a- 100.00g mirror_mlog 100.00
mirror_mimage_0(0),mirror_mimage_1(0)
  [mirror_mimage_0] taft      iwi-ao 100.00g                    /dev/sdb1(0)
  [mirror_mimage_1] taft      iwi-ao 100.00g                    /dev/sdc1(0)
  [mirror_mlog]     taft      lwi-ao   4.00m                    /dev/sdh1(0)

Ниже приведен пример увеличения размера зеркального тома в режиме cling, то есть для наращивания звеньев зеркала будут использоваться физические тома с тем же тегом.

[root@taft-03 ~]# lvextend --alloc cling -L +100G taft/mirror
  Extending 2 mirror images.
  Extending logical volume mirror to 200.00 GiB
  Logical volume mirror successfully resized

Следующая команда покажет результат добавления физических томов с тем же тегом, что и исходный том. Устройства с тегом C будут проигнорированы.

[root@taft-03 ~]# lvs -a -o +devices
  LV                VG        Attr   LSize   Log         Copy%  Devices
  mirror            taft      Mwi-a- 200.00g mirror_mlog  50.16
mirror_mimage_0(0),mirror_mimage_1(0)
  [mirror_mimage_0] taft      Iwi-ao 200.00g                    /dev/sdb1(0)
  [mirror_mimage_0] taft      Iwi-ao 200.00g                    /dev/sdg1(0)
  [mirror_mimage_1] taft      Iwi-ao 200.00g                    /dev/sdc1(0)
  [mirror_mimage_1] taft      Iwi-ao 200.00g                    /dev/sdd1(0)
  [mirror_mlog]     taft      lwi-ao   4.00m                    /dev/sdh1(0)

4.4.13. Уменьшение размера логических томов

Чтобы уменьшить размер логического тома, сначала надо отключить файловую систему, а уже затем с помощью команды lvreduce сжать том. Завершив, снова подключите файловую систему.

Сначала надо уменьшить размер файловой системы, после чего можно уменьшить сам том. В противном случае данные могут быть потеряны.

Освобожденное пространство может быть выделено другим томам в группе.

Следующая команда уменьшит размер тома lvol1 в группе vg00 на три логических экстента.

lvreduce -l -3 vg00/lvol1

4.5. Определение устройств LVM с помощью фильтров

При запуске системы выполняется команда vgscan, которая выполнит поиск меток LVM на блочных устройствах с целью определения того, какие из них представляют собой физические тома, а также получения метаданных и создания списков групп томов. Названия физических томов хранятся в файле /etc/lvm/.cache на каждом узле. Команды будут обращаться к этому файлу во избежание необходимости повторного сканирования.

С помощью фильтров в lvm.conf можно управлять тем, какие устройства будут проверяться. Фильтр содержит набор регулярных выражений, применяемых к устройствам в каталоге /dev.

Ниже приведены примеры фильтров. Следует отметить, что некоторые примеры не являются лучшими решениями, так как регулярные выражения свободно сопоставляются с полными путями. Например, a/.*loop.*/ соответствует a/loop/ и /dev/solooperation/lvol1.

Следующий фильтр добавит все обнаруженные устройства, что делается по умолчанию в случае, если фильтры не заданы.

filter = [ "a/.*/" ]

Следующий фильтр исключит CD-ROM, если он не содержит диск, что позволит избежать задержек.

filter = [ "r|/dev/cdrom|" ]

Фильтр для добавления всех петлевых устройств и удаления всех блочных устройств будет выглядеть так:

filter = [ "a/loop.*/", "r/.*/" ]

Пример фильтра, добавляющего все IDE и петлевые устройства и удаляющего остальные блочные устройства:

filter =[ "a|loop.*|", "a|/dev/hd.*|", "r|.*|" ]

Пример фильтра, добавляющего только восьмой раздел на первом диске IDE и удаляющего все остальные блочные устройства:

filter = [ "a|^/dev/hda8$|", "r/.*/" ]

Приложение B, Файлы конфигурации LVM и справочная страница lvm.conf(5) содержат подробную информацию о lvm.conf.

4.6. Перенос данных в активной системе

Команда pvmove позволяет перемещать данные в активной системе.

pvmove разбивает данные на секции и создает временное зеркало для переноса каждой секции. Справочная страница pvmove(8) содержит подробную информацию.

Следующая команда переназначит все незанятое пространство физического тома /dev/sdc1 другим томам в группе:

pvmove /dev/sdc1

Следующая команда перенесет экстенты логического тома MyLV.

pvmove -n MyLV /dev/sdc1

Поскольку процесс переноса может быть достаточно длительным, можно его запустить в фоновом режиме. Приведенная далее команда переместит все распределенные сегменты тома /dev/sdc1 на /dev/sdf1 в фоновом режиме.

pvmove -b /dev/sdc1 /dev/sdf1

Следующая команда будет сообщать о прогрессе (в процентах) с пятисекундным интервалом:

pvmove -i5 /dev/sdd1

4.7. Активация логических томов на отдельных узлах кластера

В кластерном окружении может понадобиться эксклюзивно активировать логические тома на одном узле.

Для этой цели служит команда lvchange -aey, а lvchange -aly активирует логические тома на локальном узле, но не эксклюзивно.

Активировать логические тома на конкретных узлах также можно с помощью тегов LVM (см. Приложение C, Теги объектов LVM) или в файле конфигурации (см. Приложение B, Файлы конфигурации LVM).

4.8. Настройка отчетов LVM

С помощью pvs, lvs, vgs можно создавать отчеты о состоянии объектов LVM. Каждая строка в отчете содержит информацию об одном объекте. Вывод можно отфильтровать по физическим томам, по группе томов, по логическим томам, сегментам физических или логических томов.

Далее будет рассмотрено:

  • Обзор аргументов, используемых для настройки формата генерируемого отчета.

  • Перечень полей, которые можно выбрать для каждого объекта LVM.

  • Обзор аргументов для сортировки генерируемого отчета.

  • Определение единиц в отчете.

4.8.1. Изменение формата

Независимо от того, используете ли вы pvs, lvs или vgs, выбранная команда по умолчанию отображает стандартный набор полей, что можно переопределить с помощью различных опций.

  • Аргумент -o позволяет выбрать поля для вывода. Например, стандартный вывод команды pvs выглядит так:

    # pvs
      PV         VG     Fmt  Attr PSize  PFree
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G
    

    Следующая команда покажет только имя и размер физических томов.

    # pvs -o pv_name,pv_size
      PV         PSize
      /dev/sdb1  17.14G
      /dev/sdc1  17.14G
      /dev/sdd1  17.14G
    
  • Дополнительное поле можно добавить с помощью знака «+» в комбинации с «-o».

    Пример добавления идентификатора UUID в стандартный отчет:

    # pvs -o +pv_uuid
      PV         VG     Fmt  Attr PSize  PFree  PV UUID
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G Joqlch-yWSj-kuEn-IdwM-01S9-X08M-mcpsVe
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-UqkCS
    
  • Добавление -v позволяет включить другие поля. Например, pvs -v покажет не только стандартные поля, но и DevSize и PV UUID.

    # pvs -v
        Scanning for physical volume names
      PV         VG     Fmt  Attr PSize  PFree  DevSize PV UUID
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G  17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G  17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G  17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS
    
  • --noheadings спрячет строку заголовков, что используется при создании сценариев.

    Следующий пример использует аргумент --noheadings в комбинации с pv_name для отображения списка всех физических томов.

    # pvs --noheadings -o pv_name
      /dev/sdb1
      /dev/sdc1
      /dev/sdd1
    
  • --separator разделитель позволяет отделить поля друг от друга.

    В следующем примере поля вывода команды pvs разделены знаком равенства.

    # pvs --separator =
      PV=VG=Fmt=Attr=PSize=PFree
      /dev/sdb1=new_vg=lvm2=a-=17.14G=17.14G
      /dev/sdc1=new_vg=lvm2=a-=17.14G=17.09G
      /dev/sdd1=new_vg=lvm2=a-=17.14G=17.14G
    

    Для выравнивания полей при использовании разделителя, можно дополнительно указать --aligned.

    # pvs --separator = --aligned
      PV        =VG    =Fmt =Attr=PSize =PFree
      /dev/sdb1 =new_vg=lvm2=a-  =17.14G=17.14G
      /dev/sdc1 =new_vg=lvm2=a-  =17.14G=17.09G
      /dev/sdd1 =new_vg=lvm2=a-  =17.14G=17.14G
    

Для добавления в отчет списка неисправных томов используется параметр -P команд lvs и vgs (см. Раздел 6.2, «Получение информации о неисправных устройствах»).

Справочные страницы pvs(8), vgs(8) и lvs(8) содержат полный перечень параметров.

Поля группы томов могут быть смешаны с полями физического или логического тома (или их сегментов), но поля физического тома не могут быть смешаны с полями логического тома. Например, следующая команда покажет по одному физическому тому в строке:

# vgs -o +pv_name
  VG     #PV #LV #SN Attr   VSize  VFree  PV
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdc1
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdd1
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdb1

4.8.2. Выбор объектов

Далее приведены таблицы с полями вывода команд pvs, vgs, lvs.

Префикс может быть опущен, если он соответствует стандартному имени, используемому командой. Например, при указании name с командой pvs подразумевается pv_name, а с vgsvg_name.

Выполнение следующей команды эквивалентно pvs -o pv_free.

# pvs -o +free
  PFree
  17.14G
  17.09G
  17.14G

4.8.2.1. Команда pvs

Таблица 4.1, «Поля вывода pvs» содержит список аргументов команды pvs с названиями полей и их описанием.

Таблица 4.1. Поля вывода pvs

Аргумент Столбец Описание
dev_size DevSize Размер устройства в основе физического тома
pe_start 1st PE Смещение первого физического экстента физического устройства
pv_attr Attr Статус физического тома: (a)llocatable или e(x)ported
pv_fmt Fmt Формат метаданных физического тома (lvm2 или lvm1)
pv_free PFree Свободное место в пределах физического тома
pv_name PV Имя физического тома
pv_pe_alloc_count Alloc Число занятых физических экстентов
pv_pe_count PE Число физических экстентов
pvseg_size SSize Размер сегмента физического тома
pvseg_start Start Начальный физический экстент сегмента физического тома
pv_size PSize Размер физического тома
pv_tags PV Tags Теги физического тома
pv_used Used Занятое пространство физического тома
pv_uuid PV UUID UUID физического тома

По умолчанию pvs отображает поля pv_name, vg_name, pv_fmt, pv_attr, pv_size, pv_free, упорядоченные по pv_name.

# pvs
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
  /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
  /dev/sdd1  new_vg lvm2 a-   17.14G 17.13G

Параметр -v команды pvs добавит поля dev_size, pv_uuid.

# pvs -v
    Scanning for physical volume names
  PV         VG     Fmt  Attr PSize  PFree  DevSize PV UUID
  /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G  17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
  /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G  17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
  /dev/sdd1  new_vg lvm2 a-   17.14G 17.13G  17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS

pvs --segments покажет информацию о каждом сегменте физического тома. Сегмент представляет собой набор экстентов. Просмотр сегментов может помочь при определении фрагментации логического тома.

pvs --segments по умолчанию отобразит поля pv_name, vg_name, pv_fmt, pv_attr, pv_size, pv_free, pvseg_start, pvseg_size. Вывод будет отсортирован по pv_name и pvseg_size для каждого физического тома.

# pvs --segments
  PV         VG         Fmt  Attr PSize  PFree  Start SSize
  /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M     0  1172
  /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M  1172    16
  /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M  1188     1
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G     0    26
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G    26    24
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G    50    26
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G    76    24
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G   100    26
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G   126    24
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G   150    22
  /dev/sda1  vg         lvm2 a-   17.14G 16.75G   172  4217
  /dev/sdb1  vg         lvm2 a-   17.14G 17.14G     0  4389
  /dev/sdc1  vg         lvm2 a-   17.14G 17.14G     0  4389
  /dev/sdd1  vg         lvm2 a-   17.14G 17.14G     0  4389
  /dev/sde1  vg         lvm2 a-   17.14G 17.14G     0  4389
  /dev/sdf1  vg         lvm2 a-   17.14G 17.14G     0  4389
  /dev/sdg1  vg         lvm2 a-   17.14G 17.14G     0  4389

Для просмотра обнаруженных устройств, которые не были инициализированы в виде физических томов можно использовать команду pvs -a.

# pvs -a
  PV                             VG     Fmt  Attr PSize  PFree
  /dev/VolGroup00/LogVol01                   --       0      0
  /dev/new_vg/lvol0                          --       0      0
  /dev/ram                                   --       0      0
  /dev/ram0                                  --       0      0
  /dev/ram2                                  --       0      0
  /dev/ram3                                  --       0      0
  /dev/ram4                                  --       0      0
  /dev/ram5                                  --       0      0
  /dev/ram6                                  --       0      0
  /dev/root                                  --       0      0
  /dev/sda                                   --       0      0
  /dev/sdb                                   --       0      0
  /dev/sdb1                      new_vg lvm2 a-   17.14G 17.14G
  /dev/sdc                                   --       0      0
  /dev/sdc1                      new_vg lvm2 a-   17.14G 17.09G
  /dev/sdd                                   --       0      0
  /dev/sdd1                      new_vg lvm2 a-   17.14G 17.14G

4.8.2.2. Команда vgs

Таблица 4.2, «Поля вывода vgs» содержит список аргументов vgs и названия полей.

Таблица 4.2. Поля вывода vgs

Аргумент Столбец Описание
lv_count #LV Число логических томов в группе
max_lv MaxLV Максимально допустимое число логических томов в группе (0, если не ограничено)
max_pv MaxPV Максимально допустимое число томов в группе (0, если не ограничено)
pv_count #PV Число физических томов в основе группы
snap_count #SN Число снимков в группе томов
vg_attr Attr Статус группы томов. Допустимые значения: (w)riteable, (r)eadonly, resi(z)eable, e(x)ported, (p)artial, (c)lustered
vg_extent_count #Ext Число физических экстентов в группе томов
vg_extent_size Ext Размер физических экстентов в группе томов
vg_fmt Fmt Формат метаданных группы томов (lvm2 или lvm1)
vg_free VFree Объем свободного пространства в группе томов
vg_free_count Free Число свободных физических экстентов в группе томов
vg_name VG Имя группы томов
vg_seqno Seq Версия группы томов
vg_size VSize Размер группы томов
vg_sysid SYS ID Системный идентификатор LVM1
vg_tags VG Tags LVM-теги группы томов
vg_uuid VG UUID UUID группы томов

vgs по умолчанию показывает поля vg_name, pv_count, lv_count, snap_count, vg_attr, vg_size, vg_free. Вывод отсортирован по vg_name.

# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  new_vg   3   1   1 wz--n- 51.42G 51.36G

vgs -v позволяет дополнительно показать поля vg_extent_size, vg_uuid.

# vgs -v
    Finding all volume groups
    Finding volume group "new_vg"
  VG     Attr   Ext   #PV #LV #SN VSize  VFree  VG UUID
  new_vg wz--n- 4.00M   3   1   1 51.42G 51.36G jxQJ0a-ZKk0-OpMO-0118-nlwO-wwqd-fD5D32

4.8.2.3. Команда lvs

Таблица 4.3, «Поля вывода lvs» содержит список аргументов команды lvs с названиями полей и их описанием.

Таблица 4.3. Поля вывода lvs

Аргумент Столбец Описание
chunksize
chunk_size
Chunk Размер сегментов снимка
copy_percent Copy% Процентная часть синхронизации зеркального логического тома. Также используется при перемещении физических экстентов с помощью pv_move
devices Devices Устройства в основе логического тома: физические устройства, логические тома и начальные физические и логические экстенты
lv_attr Attr Статус логического тома. Его составляющие:

Бит 1: тип тома. Допустимые значения: (m)irrored, (M)irrored (без исходной синхронизации), (p)vmove, (s)napshot, (S)napshot (неверный), (v)irtual
Бит 2: доступ. Допустимые значения: (w)riteable, (r)ead-only
Бит 3: политика выделения пространства. Допустимые значения: (c)ontiguous, (n)ormal, (a)nywhere, (i)nherited.
Бит 4: (m)inor
Бит 5: статус. Допустимые значения: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid (S)uspended snapshot, mapped (d)evice (без таблиц) или (i)nactive (устройство с неактивной таблицей).
Бит 6: (o)pen (открытое устройство)
lv_kernel_major KMaj Действующий основной номер устройства логического тома (-1, если устройство неактивно)
lv_kernel_minor KMIN Действующий вспомогательный номер устройства логического тома (-1, если неактивно)
lv_major Maj Постоянный основной номер устройства логического тома (-1, если не задан)
lv_minor Min Постоянный вспомогательный номер устройства логического тома (-1, если не задан)
lv_name LV Имя логического тома
lv_size LSize Размер логического тома
lv_tags LV Tags Теги логического тома
lv_uuid LV UUID UUID логического тома
mirror_log Log Устройство, где размещен журнал зеркала
modules Modules Модуль ядра соответствий устройств
move_pv Move Исходный физический том, на основе которого создан временный логический том с помощью pvmove
origin Origin Исходное устройство снимка
regionsize
region_size
Region Размер сегментов зеркального логического тома
seg_count #Seg Число сегментов логического тома
seg_size SSize Размер сегментов логического тома
seg_start Start Смещение сегментов логического тома
seg_tags Seg Tags LVM-теги сегментов логического тома
segtype Type Тип сегмента логического тома (например, mirror, striped, linear)
snap_percent Snap% Процентная часть занятого пространства снимка
stripes #Str Число сегментов чередования или зеркал логического тома
stripesize
stripe_size
Stripe Размер сегментов чередования

По умолчанию вывод lvs будет содержать поля lv_name, vg_name, lv_attr, lv_size, origin, snap_percent, move_pv, mirror_log, copy_percent, отсортированные по vg_name и lv_name в пределах группы.

# lvs
  LV         VG     Attr   LSize  Origin Snap%  Move Log Copy%
  lvol0      new_vg owi-a- 52.00M
  newvgsnap1 new_vg swi-a-  8.00M lvol0    0.20

Параметр -v команды lvs добавляет в таблицу поля seg_count, lv_major, lv_minor, lv_kernel_major, lv_kernel_minor, lv_uuid.

# lvs -v
    Finding all logical volumes
  LV         VG     #Seg Attr   LSize  Maj Min KMaj KMin Origin Snap%  Move Copy%  Log LV UUID
  lvol0      new_vg    1 owi-a- 52.00M  -1  -1 253  3                                  LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
  newvgsnap1 new_vg    1 swi-a-  8.00M  -1  -1 253  5    lvol0    0.20                 1ye1OU-1cIu-o79k-20h2-ZGF0-qCJm-CfbsIx

lvs --segments показывает стандартный набор столбцов с информацией о сегментах. При этом префикс seg указывать не обязательно. Так, lvs --segments по умолчанию покажет поля lv_name, vg_name, lv_attr, stripes, segtype, seg_size, отсортированные по vg_name, lv_name в пределах группы томов и по seg_start — в пределах логического тома. Если логические тома фрагментированы, вывод будет содержать соответствующую информацию.

# lvs --segments
  LV       VG         Attr   #Str Type   SSize
  LogVol00 VolGroup00 -wi-ao    1 linear  36.62G
  LogVol01 VolGroup00 -wi-ao    1 linear 512.00M
  lv       vg         -wi-a-    1 linear 104.00M
  lv       vg         -wi-a-    1 linear 104.00M
  lv       vg         -wi-a-    1 linear 104.00M
  lv       vg         -wi-a-    1 linear  88.00M

Параметр -v добавляет поля seg_start, stripesize, chunksize.

# lvs -v --segments
    Finding all logical volumes
  LV         VG     Attr   Start SSize  #Str Type   Stripe Chunk
  lvol0      new_vg owi-a-    0  52.00M    1 linear     0     0
  newvgsnap1 new_vg swi-a-    0   8.00M    1 linear     0  8.00K

Следующий пример демонстрирует стандартный вывод команды lvs в системе с одним логическим томом, а также вывод lvs с аргументом segments.

# lvs
  LV    VG     Attr   LSize  Origin Snap%  Move Log Copy%
  lvol0 new_vg -wi-a- 52.00M
# lvs --segments
  LV    VG     Attr   #Str Type   SSize
  lvol0 new_vg -wi-a-    1 linear 52.00M

4.8.3. Форматирование вывода

Обычно вывод команд lvs, vgs, pvs сохраняется и отдельно форматируется. Аргумент --unbuffered покажет исходный вывод сразу после его генерации.

С помощью -O можно указать порядок столбцов. При этом включение этих столбцов в вывод необязательно.

Пример вывода pvs, содержащего имена физических томов, их размер и свободное пространство:

# pvs -o pv_name,pv_size,pv_free
  PV         PSize  PFree
  /dev/sdb1  17.14G 17.14G
  /dev/sdc1  17.14G 17.09G
  /dev/sdd1  17.14G 17.14G

Пример аналогичного вывода, отсортированного по объему свободного пространства:

# pvs -o pv_name,pv_size,pv_free -O pv_free
  PV         PSize  PFree
  /dev/sdc1  17.14G 17.09G
  /dev/sdd1  17.14G 17.14G
  /dev/sdb1  17.14G 17.14G

В следующем примере вывод отсортирован по размеру свободного пространства; при этом поле pv_free не будет показано.

# pvs -o pv_name,pv_size -O pv_free
  PV         PSize
  /dev/sdc1  17.14G
  /dev/sdd1  17.14G
  /dev/sdb1  17.14G

Чтобы изменить порядок сортировки, перед полем, которое служит критерием сортировки, надо указать -.

# pvs -o pv_name,pv_size,pv_free -O -pv_free
  PV         PSize  PFree
  /dev/sdd1  17.14G 17.14G
  /dev/sdb1  17.14G 17.14G
  /dev/sdc1  17.14G 17.09G

4.8.4. Выбор единиц

Аргумент --units позволяет указать единицы объема данных. Допустимые значения: (b)ytes, (k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (e)xabytes, (p)etabytes и (h)uman-readable. По умолчанию используется формат (h)uman-readable, что можно переопределить в файле lvm.conf, изменив параметр units в секции global.

Пример вывода pvs, использующего в качестве единиц мегабайты:

# pvs --units m
  PV         VG     Fmt  Attr PSize     PFree
  /dev/sda1         lvm2 --   17555.40M 17555.40M
  /dev/sdb1  new_vg lvm2 a-   17552.00M 17552.00M
  /dev/sdc1  new_vg lvm2 a-   17552.00M 17500.00M
  /dev/sdd1  new_vg lvm2 a-   17552.00M 17552.00M

По умолчанию числовые значения кратны 1024, что можно заменить на 1000, указав единицы в верхнем регистре (B, K, M, G, T, H).

Пример стандартного вывода (значения кратны 1024):

# pvs
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
  /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
  /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G

Значения, кратные 1000:

#  pvs --units G
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sdb1  new_vg lvm2 a-   18.40G 18.40G
  /dev/sdc1  new_vg lvm2 a-   18.40G 18.35G
  /dev/sdd1  new_vg lvm2 a-   18.40G 18.40G

В качестве единиц также можно использовать сектора (s), размер которых равен 512 байт, или даже произвольные единицы.

Пример, где в качестве единиц используются сектора:

# pvs --units s
  PV         VG     Fmt  Attr PSize     PFree
  /dev/sdb1  new_vg lvm2 a-   35946496S 35946496S
  /dev/sdc1  new_vg lvm2 a-   35946496S 35840000S
  /dev/sdd1  new_vg lvm2 a-   35946496S 35946496S

Пример, где в качестве единиц используются блоки размером 4 мегабайт:

# pvs --units 4m
  PV         VG     Fmt  Attr PSize    PFree
  /dev/sdb1  new_vg lvm2 a-   4388.00U 4388.00U
  /dev/sdc1  new_vg lvm2 a-   4388.00U 4375.00U
  /dev/sdd1  new_vg lvm2 a-   4388.00U 4388.00U

Глава 5. Примеры конфигурации LVM

В этой главе приведены простые примеры конфигурации LVM.

5.1. Создание логического тома на трех дисках

Данный пример демонстрирует создание логического тома new_logical_volume на дисках /dev/sda1, /dev/sdb1, /dev/sdc1.

5.1.1. Создание физических томов

Для использования дисков необходимо обозначить их как физические тома.

Следующая команда удалит все данные на /dev/sda1, /dev/sdb1, /dev/sdc1.

[root@tng3-1 ~]# pvcreate /dev/sda1 /dev/sdb1 /dev/sdc1
  Physical volume "/dev/sda1" successfully created
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created

5.1.2. Создание группы томов

Команда создания группы томов new_vol_group:

[root@tng3-1 ~]# vgcreate new_vol_group /dev/sda1 /dev/sdb1 /dev/sdc1
  Volume group "new_vol_group" successfully created

С помощью vgs можно просмотреть атрибуты новой группы:

[root@tng3-1 ~]# vgs
  VG            #PV #LV #SN Attr   VSize  VFree
  new_vol_group   3   0   0 wz--n- 51.45G 51.45G

5.1.3. Создание логического тома

В следующем примере будет выделен логический том new_logical_volume размером 2 гигабайта из группы томов new_vol_group.

[root@tng3-1 ~]# lvcreate -L2G -n new_logical_volume new_vol_group
  Logical volume "new_logical_volume" created

5.1.4. Создание файловой системы

Теперь для нового тома можно создать файловую систему.

[root@tng3-1 ~]# mkfs.gfs2 -plock_nolock -j 1 /dev/new_vol_group/new_logical_volume
This will destroy any data on /dev/new_vol_group/new_logical_volume.

Are you sure you want to proceed? [y/n] y

Device:                    /dev/new_vol_group/new_logical_volume
Blocksize:                 4096
Filesystem Size:           491460
Journals:                  1
Resource Groups:           8
Locking Protocol:          lock_nolock
Lock Table:

Syncing...
All Done

Следующие команды подключат логический том в файловую систему и покажут информацию об использовании дискового пространства.

[root@tng3-1 ~]# mount /dev/new_vol_group/new_logical_volume /mnt
[root@tng3-1 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/new_vol_group/new_logical_volume
                       1965840        20   1965820   1% /mnt

5.2. Создание логического тома с чередованием

В этом примере будет создан логический том new_vol_group, данные которого чередуются между дисками /dev/sda1, /dev/sdb1, /dev/sdc1.

5.2.1. Создание физических томов

Сначала надо обозначить диски как физические тома LVM.

Следующая команда удалит все данные на /dev/sda1, /dev/sdb1, /dev/sdc1.

[root@tng3-1 ~]# pvcreate /dev/sda1 /dev/sdb1 /dev/sdc1
  Physical volume "/dev/sda1" successfully created
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created

5.2.2. Создание группы томов

Затем можно создать группу volgroup01:

[root@tng3-1 ~]# vgcreate volgroup01 /dev/sda1 /dev/sdb1 /dev/sdc1
  Volume group "volgroup01" successfully created

С помощью vgs можно просмотреть атрибуты новой группы:

[root@tng3-1 ~]# vgs
  VG                #PV #LV #SN Attr   VSize  VFree
  volgroup01          3   0   0 wz--n- 51.45G 51.45G

5.2.3. Создание логического тома

Далее в группе volgroup01 будет создан том striped_logical_volume общим размером 2 гигабайта с сегментами, размер которых равен 4 килобайта.

[root@tng3-1 ~]# lvcreate -i3 -I4 -L2G -nstriped_logical_volume volgroup01
  Rounding size (512 extents) up to stripe boundary size (513 extents)
  Logical volume "striped_logical_volume" created

5.2.4. Создание файловой системы

Теперь для нового тома можно создать файловую систему.

[root@tng3-1 ~]# mkfs.gfs2 -plock_nolock -j 1 /dev/volgroup01/striped_logical_volume
This will destroy any data on /dev/volgroup01/striped_logical_volume.

Are you sure you want to proceed? [y/n] y

Device:                    /dev/volgroup01/striped_logical_volume
Blocksize:                 4096
Filesystem Size:           492484
Journals:                  1
Resource Groups:           8
Locking Protocol:          lock_nolock
Lock Table:

Syncing...
All Done

Следующие команды подключат логический том в файловую систему и покажут информацию об использовании дискового пространства.

[root@tng3-1 ~]# mount /dev/volgroup01/striped_logical_volume /mnt
[root@tng3-1 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      13902624   1656776  11528232  13% /
/dev/hda1               101086     10787     85080  12% /boot
tmpfs                   127880         0    127880   0% /dev/shm
/dev/volgroup01/striped_logical_volume
                       1969936        20   1969916   1% /mnt

5.3. Разбиение группы томов

Если в группе томов достаточно незанятого пространства, то новая группа может быть добавлена без необходимости добавления новых дисков. В качестве примера рассмотрим группу, в состав которой входит 3 физических тома.

Изначально логический том mylv создается из группы myvol, которая включает физические тома /dev/sda1, /dev/sdb1, /dev/sdc1.

После разбиения группа myvg будет состоять из /dev/sda1 и /dev/sdb1, а /dev/sdc1 будет включен в состав группы yourvg.

5.3.1. Определение наличия свободного пространства

С помощью команды pvscan можно определить объем незанятого пространства в группе томов.

[root@tng3-1 ~]# pvscan
  PV /dev/sda1  VG myvg   lvm2 [17.15 GB / 0    free]
  PV /dev/sdb1  VG myvg   lvm2 [17.15 GB / 12.15 GB free]
  PV /dev/sdc1  VG myvg   lvm2 [17.15 GB / 15.80 GB free]
  Total: 3 [51.45 GB] / in use: 3 [51.45 GB] / in no VG: 0 [0   ]

5.3.2. Перемещение данных

Для переноса занятых физических экстентов с /dev/sdc1 на /dev/sdb1 используется команда pvmove. Процесс может занять достаточно много времени.

[root@tng3-1 ~]# pvmove /dev/sdc1 /dev/sdb1
  /dev/sdc1: Moved: 14.7%
  /dev/sdc1: Moved: 30.3%
  /dev/sdc1: Moved: 45.7%
  /dev/sdc1: Moved: 61.0%
  /dev/sdc1: Moved: 76.6%
  /dev/sdc1: Moved: 92.2%
  /dev/sdc1: Moved: 100.0%

После перемещения данных убедитесь, что все пространство /dev/sdc1 теперь свободно:

[root@tng3-1 ~]# pvscan
  PV /dev/sda1   VG myvg   lvm2 [17.15 GB / 0    free]
  PV /dev/sdb1   VG myvg   lvm2 [17.15 GB / 10.80 GB free]
  PV /dev/sdc1   VG myvg   lvm2 [17.15 GB / 17.15 GB free]
  Total: 3 [51.45 GB] / in use: 3 [51.45 GB] / in no VG: 0 [0   ]

5.3.3. Разделение группы томов

С помощью vgsplit разделим группу myvg и создадим новую группу yourvg.

Прежде чем приступить к разделению группы томов, сначала необходимо убедиться, что файловая система отключена, а затем отключить сам логический том.

Отключить том можно с помощью lvchange и vgchange. Приведенная команда отключает том mylv, затем выделяет пространство для группы yourvg из myvg и переносит физический том /dev/sdc1 в yourvg.

[root@tng3-1 ~]# lvchange -a n /dev/myvg/mylv
[root@tng3-1 ~]# vgsplit myvg yourvg /dev/sdc1
  Volume group "yourvg" successfully split from "myvg"

Атрибуты обеих групп можно просмотреть с помощью vgs.

[root@tng3-1 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  myvg     2   1   0 wz--n- 34.30G 10.80G
  yourvg   1   0   0 wz--n- 17.15G 17.15G

5.3.4. Создание логического тома

После создания группы можно создать логический том yourlv:

[root@tng3-1 ~]# lvcreate -L5G -n yourlv yourvg
  Logical volume "yourlv" created

5.3.5. Создание файловой системы и подключение нового логического тома

Теперь для нового логического тома можно создать файловую систему.

[root@tng3-1 ~]#  mkfs.gfs2 -plock_nolock -j 1 /dev/yourvg/yourlv
This will destroy any data on /dev/yourvg/yourlv.

Are you sure you want to proceed? [y/n] y

Device:                    /dev/yourvg/yourlv
Blocksize:                 4096
Filesystem Size:           1277816
Journals:                  1
Resource Groups:           20
Locking Protocol:          lock_nolock
Lock Table:

Syncing...
All Done

[root@tng3-1 ~]# mount /dev/yourvg/yourlv /mnt

5.3.6. Активация и подключение исходного логического тома

Поскольку том mylv был отключен, его нужно снова подключить.

root@tng3-1 ~]# lvchange -a y mylv

[root@tng3-1 ~]# mount /dev/myvg/mylv /mnt
[root@tng3-1 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/yourvg/yourlv    24507776        32  24507744   1% /mnt
/dev/myvg/mylv        24507776        32  24507744   1% /mnt

5.4. Удаление диска из логического тома

Данный пример демонстрирует удаление диска из логического тома либо с целью его замены, либо при его переносе в другой том. Чтобы удалить диск, сначала необходимо переместить экстенты на другой диск или набор дисков.

5.4.1. Перенос экстентов в другой физический том

В этом примере логический том расположен на четырех физических томах группы myvg.

[root@tng3-1]# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdb1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdc1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdd1  myvg lvm2 a-   17.15G  2.15G 15.00G

Предположим, что требуется перенести экстенты с /dev/sdb1 и затем его удалить из группы томов.

Если на других физических томах в группе достаточно свободных экстентов, на удаляемом устройстве можно выполнить pvmove без аргументов, чтобы перераспределить свободные экстенты между другими устройствами.

[root@tng3-1 ~]# pvmove /dev/sdb1
  /dev/sdb1: Moved: 2.0%
 ...
  /dev/sdb1: Moved: 79.2%
 ...
  /dev/sdb1: Moved: 100.0%

После завершения pvmove распределение экстентов будет выглядеть так:

[root@tng3-1]# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1  myvg lvm2 a-   17.15G  7.15G 10.00G
  /dev/sdb1  myvg lvm2 a-   17.15G 17.15G     0
  /dev/sdc1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdd1  myvg lvm2 a-   17.15G  2.15G 15.00G

С помощью vgreduce можно удалить том /dev/sdb1 из группы.

[root@tng3-1 ~]# vgreduce myvg /dev/sdb1
  Removed "/dev/sdb1" from volume group "myvg"
[root@tng3-1 ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sda1  myvg lvm2 a-   17.15G  7.15G
  /dev/sdb1       lvm2 --   17.15G 17.15G
  /dev/sdc1  myvg lvm2 a-   17.15G 12.15G
  /dev/sdd1  myvg lvm2 a-   17.15G  2.15G

Теперь диск можно отсоединить или использовать его для других целей.

5.4.2. Перенос экстентов на новый диск

В следующем примере логический том расположен на трех физических томах группы myvg:

[root@tng3-1]# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1  myvg lvm2 a-   17.15G  7.15G 10.00G
  /dev/sdb1  myvg lvm2 a-   17.15G 15.15G  2.00G
  /dev/sdc1  myvg lvm2 a-   17.15G 15.15G  2.00G

Допустим, надо переместить экстенты /dev/sdb1 на новое устройство /dev/sdd1.

5.4.2.1. Создание физического тома

На основе /dev/sdd1 создадим физический том:

[root@tng3-1 ~]# pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created

5.4.2.2. Добавление физического тома в группу

Добавим /dev/sdd1 в группу myvg.

[root@tng3-1 ~]# vgextend myvg /dev/sdd1
  Volume group "myvg" successfully extended
[root@tng3-1]# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1   myvg lvm2 a-   17.15G  7.15G 10.00G
  /dev/sdb1   myvg lvm2 a-   17.15G 15.15G  2.00G
  /dev/sdc1   myvg lvm2 a-   17.15G 15.15G  2.00G
  /dev/sdd1   myvg lvm2 a-   17.15G 17.15G     0

5.4.2.3. Перемещение данных

С помощью pvmove переместим данные с /dev/sdb1 на /dev/sdd1:

[root@tng3-1 ~]# pvmove /dev/sdb1 /dev/sdd1
  /dev/sdb1: Moved: 10.0%
...
  /dev/sdb1: Moved: 79.7%
...
  /dev/sdb1: Moved: 100.0%

[root@tng3-1]# pvs -o+pv_used
  PV          VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1   myvg lvm2 a-   17.15G  7.15G 10.00G
  /dev/sdb1   myvg lvm2 a-   17.15G 17.15G     0
  /dev/sdc1   myvg lvm2 a-   17.15G 15.15G  2.00G
  /dev/sdd1   myvg lvm2 a-   17.15G 15.15G  2.00G

5.4.2.4. Удаление физического тома из группы

Завершив перенос данных с /dev/sdb1, его можно удалить из группы.

[root@tng3-1 ~]# vgreduce myvg /dev/sdb1
  Removed "/dev/sdb1" from volume group "myvg"

Теперь можно переназначить диск другой группе или удалить его из системы.

5.5. Создание зеркального логического тома в кластере

Создание зеркального логического тома в кластере осуществляется по тем же правилам, что и на отдельном компьютере. Отличия состоят в том, что в кластере должны работать необходимые кластерные службы, кластер должен обладать кворумом, а тип блокирования в lvm.conf должен разрешать кластерное блокирование. Раздел 5.5, «Создание зеркального логического тома в кластере» содержит примеры создания зеркального тома в кластере.

Далее будет создан зеркальный логический том. Предварительно будет проверено, выполняются ли необходимые кластерные службы.

  1. Чтобы создать общий зеркальный логический том, который будет доступен всем узлам в кластере, на каждом узле необходимо определить нужный тип блокирования в файле lvm.conf.

    # /sbin/lvmconf --enable-cluster
  2. Следующая команда проверит факт выполнения службы clvmd на текущем узле:

    [root@doc-07 ~]# ps auxw | grep clvmd
    root     17642  0.0  0.1 32164 1072 ?        Ssl  Apr06   0:00 clvmd -T20 -t 90
    

    Далее будут показаны сведения о состоянии кластера:

    [root@example-01 ~]# cman_tool services
    fence domain
    member count  3
    victim count  0
    victim now    0
    master nodeid 2
    wait state    none
    members       1 2 3
    
    dlm lockspaces
    name          clvmd
    id            0x4104eefa
    flags         0x00000000
    change        member 3 joined 1 remove 0 failed 0 seq 1,1
    members       1 2 3
    
  3. Убедитесь, что пакет cmirror установлен.

  4. Запустите cmirrord.

    [root@hexample-01 ~]# service cmirrord start
    Starting cmirrord:                                         [  OK  ]
    
  5. Далее будет создано три физических тома. Два будут использоваться для организации зеркала, а на третьем будет храниться журнал зеркала.

    [root@doc-07 ~]# pvcreate /dev/xvdb1
      Physical volume "/dev/xvdb1" successfully created
    [root@doc-07 ~]# pvcreate /dev/xvdb2
      Physical volume "/dev/xvdb2" successfully created
    [root@doc-07 ~]# pvcreate /dev/xvdc1
      Physical volume "/dev/xvdc1" successfully created
    
  6. Все три тома будут добавлены в группу vg001.

    [root@doc-07 ~]# vgcreate vg001 /dev/xvdb1 /dev/xvdb2 /dev/xvdc1
      Clustered volume group "vg001" successfully created
    

    Вывод vgcreate демонстрирует, что группа томов является кластерной (атрибут «c»). Команда vgs также может это проверить.

    [root@doc-07 ~]# vgs vg001
      VG       #PV #LV #SN Attr   VSize  VFree
      vg001      3   0   0 wz--nc 68.97G 68.97G
    
  7. В следующем примере будет создан логический том mirrorlv с одним зеркалом из группы vg001. Выделяемые экстенты будут указаны явно.

    [root@doc-07 ~]# lvcreate -l 1000 -m1 vg001 -n mirrorlv /dev/xvdb1:1-1000 /dev/xvdb2:1-1000 /dev/xvdc1:0
      Logical volume "mirrorlv" created
    

    С помощью lvs можно наблюдать за прогрессом создания зеркала (столбец Copy%).

    [root@doc-07 log]# lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog     47.00
    [root@doc-07 log]# lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog     91.00   
    [root@doc-07 ~]#  lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog    100.00
    

    Сообщение об успешном создании зеркала будет зарегистрировано в системном журнале:

    May 10 14:52:52 doc-07 [19402]: Monitoring mirror device vg001-mirrorlv for events
    May 10 14:55:00 doc-07 lvm[19402]: vg001-mirrorlv is now in-sync
    
  8. Для просмотра структуры зеркала можно выполнить lvs с параметрами -o +devices. В приведенном ниже примере логический том состоит из двух линейных томов и одного журнала.

    [root@doc-07 ~]# lvs -a -o +devices
      LV                  VG         Attr   LSize  Origin Snap%  Move Log           Copy%  Convert Devices                                  
      mirrorlv            vg001      mwi-a-  3.91G                    mirrorlv_mlog 100.00         mirrorlv_mimage_0(0),mirrorlv_mimage_1(0)
      [mirrorlv_mimage_0] vg001      iwi-ao  3.91G                                                 /dev/xvdb1(1)                            
      [mirrorlv_mimage_1] vg001      iwi-ao  3.91G                                                 /dev/xvdb2(1)                            
      [mirrorlv_mlog]     vg001      lwi-ao  4.00M                                                 /dev/xvdc1(0)
    

    Параметр seg_pe_ranges покажет диапазон физических экстентов.

    [root@doc-07 ~]# lvs -a -o +seg_pe_ranges --segments
      PE Ranges                                      
      mirrorlv_mimage_0:0-999 mirrorlv_mimage_1:0-999
      /dev/xvdb1:1-1000                              
      /dev/xvdb2:1-1000                              
      /dev/xvdc1:0-0
    

Раздел 6.3, «Восстановление после сбоя зеркала» содержит инструкции по восстановлению зеркала в случае выхода из строя его составляющих.

Глава 6. Диагностика проблем

Этот раздел содержит инструкции по исправлению различных проблем с LVM.

6.1. Диагностика

Если команда не функционирует как ожидается, осуществить сбор информации можно перечисленными ниже способами.

  • Использовать параметры -v, -vv, -vvv, -vvvv для усиления степени детализации вывода исполняемой команды.

  • Если проблема связана с активацией логического тома, в секции «log» файла конфигурации укажите ‘activation = 1’, затем выполните команду с параметром -vvvv. Проверив вывод, не забудьте сбросить значение переменной в 0, чтобы избежать возможных проблем с блокировкой машины в случае нехватки памяти.

  • Выполните команду lvmdump. Ее вывод будет содержать информацию, которая может помочь при определении проблем (см. страницу помощи lvmdump(8)).

  • Команды lvs -v, pvs -a, dmsetup info -c позволяют получить дополнительную информацию о системе.

  • Просмотрите последнюю резервную копию метаданных в /etc/lvm/backup и архивы в /etc/lvm/archive.

  • Команда lvm dumpconfig позволит проверить текущую конфигурацию.

  • Файл .cache в /etc/lvm должен включать список устройств, на которых расположены физические тома.

6.2. Получение информации о неисправных устройствах

Аргумент -P команд lvs и vgs покажет информацию о сбойном томе. К примеру, если в составе группы vg перестало функционировать одно устройство, следующая команда поможет его определить:

[root@link-07 tmp]# vgs -o +devices
  Volume group "vg" not found

vgs -P покажет информацию о сбойном устройстве, даже если группа томов, в состав которой это устройство входит, недоступна.

[root@link-07 tmp]# vgs -P -o +devices
  Partial mode. Incomplete volume groups will be activated read-only.
  VG   #PV #LV #SN Attr   VSize VFree Devices
  vg     9   2   0 rz-pn- 2.11T 2.07T unknown device(0)
  vg     9   2   0 rz-pn- 2.11T 2.07T unknown device(5120),/dev/sda1(0)

В этом примере выход из строя одного устройства привел к сбою линейного тома и тома с чередованием в группе. lvs без аргумента -P покажет:

[root@link-07 tmp]# lvs -a -o +devices
  Volume group "vg" not found

-P добавит в вывод список неисправных логических томов.

[root@link-07 tmp]# lvs -P -a -o +devices
  Partial mode. Incomplete volume groups will be activated read-only.
  LV     VG   Attr   LSize  Origin Snap%  Move Log Copy%  Devices
  linear vg   -wi-a- 20.00G                               unknown device(0)
  stripe vg   -wi-a- 20.00G                               unknown device(5120),/dev/sda1(0)

Следующие примеры демонстрируют вывод pvs и lvs с аргументом -P.

root@link-08 ~]#  vgs -a -o +devices -P
  Partial mode. Incomplete volume groups will be activated read-only.
  VG    #PV #LV #SN Attr   VSize VFree Devices
  corey   4   4   0 rz-pnc 1.58T 1.34T my_mirror_mimage_0(0),my_mirror_mimage_1(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T /dev/sdd1(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T unknown device(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T /dev/sdb1(0)
[root@link-08 ~]# lvs -a -o +devices -P
  Partial mode. Incomplete volume groups will be activated read-only.
  LV                   VG    Attr   LSize   Origin Snap%  Move Log            Copy%  Devices
  my_mirror            corey mwi-a- 120.00G                    my_mirror_mlog   1.95 my_mirror_mimage_0(0),my_mirror_mimage_1(0)
  [my_mirror_mimage_0] corey iwi-ao 120.00G                                          unknown device(0)
  [my_mirror_mimage_1] corey iwi-ao 120.00G                                          /dev/sdb1(0)
  [my_mirror_mlog]     corey lwi-ao   4.00M                                          /dev/sdd1(0)

6.3. Восстановление после сбоя зеркала

В этой секции рассматривается пример восстановления после выхода из строя компонента зеркального логического тома как следствие сбоя физического тома в его основе. При этом параметр mirror_log_fault_policy имеет значение remove (см. Раздел 6.3, «Восстановление после сбоя зеркала»).

LVM преобразует зеркальный том в линейный, сохранив функциональность, но уже без избыточности. После этого можно добавить новое устройство и пересоздать зеркало.

Следующая команда создаст физические тома, на основе которых впоследствии будет создано зеркало.

[root@link-08 ~]# pvcreate /dev/sd[abcdefgh][12]
  Physical volume "/dev/sda1" successfully created
  Physical volume "/dev/sda2" successfully created
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdc2" successfully created
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sdd2" successfully created
  Physical volume "/dev/sde1" successfully created
  Physical volume "/dev/sde2" successfully created
  Physical volume "/dev/sdf1" successfully created
  Physical volume "/dev/sdf2" successfully created
  Physical volume "/dev/sdg1" successfully created
  Physical volume "/dev/sdg2" successfully created
  Physical volume "/dev/sdh1" successfully created
  Physical volume "/dev/sdh2" successfully created

Далее создадим vg и зеркальный том groupfs:

[root@link-08 ~]# vgcreate vg /dev/sd[abcdefgh][12]
  Volume group "vg" successfully created
[root@link-08 ~]# lvcreate -L 750M -n groupfs -m 1 vg /dev/sda1 /dev/sdb1 /dev/sdc1
  Rounding up size to full physical extent 752.00 MB
  Logical volume "groupfs" created

С помощью lvs можно проверить структуру зеркального тома, устройств в его основе и журнала зеркала. В первом примере (см. ниже) синхронизация зеркала еще не завершена, поэтому сначала надо дождаться, пока индикатор прогресса Copy% не достигнет 100.00.

[root@link-08 ~]# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy% Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 21.28 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                       /dev/sda1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                       /dev/sdb1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M                                       /dev/sdc1(0)

[root@link-08 ~]# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy%  Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 100.00 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                        /dev/sda1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                        /dev/sdb1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M     i                                  /dev/sdc1(0)

В этом примере предполагается, что произошел сбой основного звена зеркала /dev/sda1. Попытки записи в зеркальный том приводят к определению неисправного зеркала, в случае чего LVM преобразует его в один линейный том. Команда dd начнет преобразование.

[root@link-08 ~]# dd if=/dev/zero of=/dev/vg/groupfs count=10
10+0 records in
10+0 records out

Чтобы убедиться, что устройство теперь является линейным, используйте команду lvs. Как следствие наличия неисправного диска, вывод будет сообщать об ошибке ввода-вывода.

[root@link-08 ~]# lvs -a -o +devices
  /dev/sda1: read failed after 0 of 2048 at 0: Input/output error
  /dev/sda2: read failed after 0 of 2048 at 0: Input/output error
  LV      VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  groupfs vg   -wi-a- 752.00M                               /dev/sdb1(0)

Том можно продолжать использовать, но уже как линейный.

После подключения нового устройства можно пересоздать физический том, а затем сам зеркальный том. При попытке использования того же диска в процессе выполнения pvcreate появятся предупреждающие сообщения.

[root@link-08 ~]# pvcreate /dev/sdi[12]
  Physical volume "/dev/sdi1" successfully created
  Physical volume "/dev/sdi2" successfully created

[root@link-08 ~]# pvscan
  PV /dev/sdb1   VG vg   lvm2 [67.83 GB / 67.10 GB free]
  PV /dev/sdb2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdi1           lvm2 [603.94 GB]
  PV /dev/sdi2           lvm2 [603.94 GB]
  Total: 16 [2.11 TB] / in use: 14 [949.65 GB] / in no VG: 2 [1.18 TB]

Далее надо добавить созданный том в группу.

[root@link-08 ~]# vgextend vg /dev/sdi[12]
  Volume group "vg" successfully extended

[root@link-08 ~]# pvscan
  PV /dev/sdb1   VG vg   lvm2 [67.83 GB / 67.10 GB free]
  PV /dev/sdb2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdi1   VG vg   lvm2 [603.93 GB / 603.93 GB free]
  PV /dev/sdi2   VG vg   lvm2 [603.93 GB / 603.93 GB free]
  Total: 16 [2.11 TB] / in use: 16 [2.11 TB] / in no VG: 0 [0   ]

Теперь можно преобразовать линейный том в зеркальный.

[root@link-08 ~]# lvconvert -m 1 /dev/vg/groupfs /dev/sdi1 /dev/sdb1 /dev/sdc1
  Logical volume mirror converted.

Убедитесь, что зеркало было восстановлено.

[root@link-08 ~]# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy% Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 68.62 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                       /dev/sdb1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                       /dev/sdi1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M                                       /dev/sdc1(0)

6.4. Восстановление метаданных физического тома

Представим, что область метаданных группы томов была случайно перезаписана или повреждена. В этом случае появится сообщение об ошибке в области метаданных или о неудачной попытке нахождения физического тома с заданным UUID. Чтобы не потерять данные физического тома, можно попробовать заново переписать область метаданных, включив прежний UUID метаданных.

Не следует это делать, если логический том активно используется, так как в случае указания неверного UUID все данные будут потеряны.

Пример вывода в случае потери или повреждения области метаданных:

[root@link-07 backup]# lvs -a -o +devices
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find all physical volumes for volume group VG.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find all physical volumes for volume group VG.
  ...

Перезаписанный UUID можно найти в файле ГруппаТомов_xxxx.vg в каталоге /etc/lvm/archive.

Другой способ определения идентификатора UUID состоит в отключении тома и установке параметра -P (partial).

[root@link-07 backup]# vgchange -an --partial
  Partial mode. Incomplete volume groups will be activated read-only.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  ...

С помощью аргументов --uuid и --restorefile команды pvcreate можно восстановить физический том. В приведенном далее примере устройству /dev/sdh1 соответствует UUID FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk. Команда восстановит информацию о метаданных из последнего успешного архива метаданных VG_00050.vg. pvcreate перезапишет только область метаданных, что не окажет влияния на существующие данные.

[root@link-07 backup]# pvcreate --uuid "FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk" --restorefile /etc/lvm/archive/VG_00050.vg /dev/sdh1
  Physical volume "/dev/sdh1" successfully created

Затем с помощью vgcfgrestore можно восстановить метаданные.

[root@link-07 backup]# vgcfgrestore VG
  Restored volume group VG

После этого можно получить доступ логическим томам.

[root@link-07 backup]# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

Первая команда выполнит активацию тома, а вторая покажет список активных томов.

[root@link-07 backup]# lvchange -ay /dev/VG/stripe
[root@link-07 backup]# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

vgcfgrestore может восстановить физический том, если метаданные были полностью перезаписаны. Если область перезаписи вышла за пределы области метаданных, возможна потеря данных. Попробуйте их восстановить с помощью fsck.

6.5. Замена физического тома

Для замены физического тома можно придерживаться той же последовательности действий, что и при восстановлении метаданных (см. Раздел 6.4, «Восстановление метаданных физического тома»). Используйте аргументы --partial и --verbose команды vgdisplay для определения UUID и размера уже исключенных физических томов. Если же вашей целью является замена физического тома другим томом того же размера, для инициализации нового устройства с тем же UUID используйте аргументы --restorefile и --uuid команды pvcreate. Затем с помощью vgcfgrestore можно восстановить метаданные группы.

6.6. Удаление физических томов из группы

В случае выхода из строя одного физического тома можно активировать остальные тома в группе с помощью аргумента --partial команды vgchange. Аргумент --removemissing команды vgreduce позволяет удалить из группы все логические тома, использующие этот физический том.

Рекомендуется сначала выполнить vgreduce с параметром --test, чтобы знать, что именно будет удалено.

Результат команды vgreduce обратим, если сразу же выполнить vgcfgrestore для восстановления метаданных. Например, если вы выполнили vgreduce с аргументом --removemissing, не указав при этом --test, логические тома будут удалены. В этом случае можно заменить физический том и выполнить vgcfgrestore для восстановления группы.

6.7. Нехватка свободных экстентов для логического тома

Если для создания логического тома не хватает экстентов, хотя вывод vgdisplay и vgs показывает обратное, появится сообщение «Insufficient free extents». Дело в том, что обе команды округляют значения для облегчения чтения. Чтобы указать точный размер, используйте число свободных физических экстентов вместо байтов.

Вывод vgdisplay по умолчанию включает число свободных физических экстентов:

# vgdisplay
  --- Volume group ---
  ...
  Free  PE / Size       8780 / 34.30 GB

Или же можно передать параметры vg_free_count и vg_extent_count команде vgs для вывода числа свободных экстентов и их общего числа.

[root@tng3-1 ~]# vgs -o +vg_free_count,vg_extent_count
  VG     #PV #LV #SN Attr   VSize  VFree  Free #Ext
  testvg   2   0   0 wz--n- 34.30G 34.30G 8780 8780

Всего свободно 8780 экстентов. Теперь можно выполнить следующую команду («l» использует экстенты в качестве единиц вместо байтов):

# lvcreate -l8780 -n testlv testvg

Том займет все свободные экстенты в группе томов.

# vgs -o +vg_free_count,vg_extent_count
  VG     #PV #LV #SN Attr   VSize  VFree Free #Ext
  testvg   2   1   0 wz--n- 34.30G    0     0 8780

Можно нарастить логический том так, чтобы он использовал процент незанятого пространства в группе. Для этого используется аргумент -l команды lvcreate (см. Раздел 4.4.1, «Создание линейных логических томов»).

Глава 7. Администрирование LVM в графическом режиме

Помимо текстового интерфейса LVM предоставляет графический интерфейс (GUI, Graphical User Interface) для настройки логических томов LVM. Для запуска графической утилиты выполните system-config-lvm. В главе «LVM» в руководстве по развертыванию Red Hat Enterprise Linux приведены пошаговые инструкции по настройке логического тома.

Приложение A. Device Mapper

Device Mapper — драйвер ядра, реализующий основную инфраструктуру для управления томами. Он позволяет создавать проекции устройств, которые могут использоваться в качестве логических томов. Device Mapper не обладает информацией о группах томов и форматах метаданных.

Device Mapper служит основой для некоторых технологий высокого уровня и активно используется командами dmraid и dm-multipath.

Device Mapper используется для активации логических томов. Логический том преобразуется в проецируемое устройство, а каждому сегменту будет соответствовать строка с таблице соответствий. Device Mapper поддерживает прямое проецирование, проецирование с чередованием или проецирование с учетом ошибок. Так, два диска могут быть объединены в один логический том с двумя линейными соответствиями — по одному на диск. При создании тома LVM будет также создана проекция, для обращения к которой используется dmsetup. Раздел A.1, «Таблица соответствий» содержит описание форматов устройств в таблице соответствий, а Раздел A.2, «dmsetup» предоставляет информацию об dmsetup.

A.1. Таблица соответствий

Проекции устройств определяются в таблице, которая содержит соответствия для диапазонов логических секторов. Формат строк в таблице:

начало длина проекция [параметры...]

Параметр начало обычно равен 0. Сумма параметров начало и длина в одной строке должна быть равна величине начало в следующей строке. Параметры зависят от типа проекции.

Размеры указываются в секторах (размер сектора — 512 байт).

Если в параметрах проецирования указано устройство, в файловой системе к нему можно обращаться и по имени (например, /dev/hda), и по номеру в формате основной:вспомогательный.

Пример таблицы соответствий, в которой определены 4 линейные составляющие:

0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256

Первые два параметра обозначают начальный блок и длину сегмента. Следующий параметр определяет тип проецирования (linear).

Тип может принимать следующие значения:

  • linear;

  • striped;

  • mirror;

  • snapshot и snapshot-origin;

  • error;

  • zero;

  • multipath;

  • crypt.

A.1.1. Тип linear

Создает линейное соответствие между непрерывным диапазоном блоков и другим блочным устройством.

начало длина linear устройство смещение
начало

первый блок виртуального устройства

длина

длина сегмента

устройство

блочное устройство, которое можно указать по имени или по номеру в формате основной:вспомогательный

смещение

смещение проекции

В следующем примере будет создана линейная проекция общей длиной 1638400. При этом основной и вспомогательный номера — 8:2, а смещение устройства — 41146992.

0 16384000 linear 8:2 41156992

Линейное соответствие для устройства /dev/hda:

0 20971520 linear /dev/hda 384

A.1.2. Тип striped

Тип striped обеспечивает чередование между несколькими физическими устройствами и в качестве аргументов принимает число устройств и размер чередующихся сегментов, за которым следуют пары имен устройств и секторов. Формат:

начало длина striped #число размер_сегмента устройство1 смещение1 ... устройствоN смещениеN

Каждому сегменту чередования соответствует одна пара значений устройство и смещение.

начало

первый блок виртуального устройства

длина

длина сегмента

число

число чередующихся сегментов для организации виртуального устройства

размер_сегмента

число секторов, которые будут записаны на одном устройстве, прежде чем будет выполнен переход к следующему. Должно быть кратно 2, а общий размер должен быть не меньше размера страницы ядра.

устройство

блочное устройство, заданное с помощью имени или пары основной:вспомогательный.

смещение

смещение проекции

Следующий пример демонстрирует чередование на трех устройствах. При этом размер сегмента равен 128 блокам:

0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0

первый блок виртуального устройства

73728

длина сегмента

striped 3 128

чередование на трех устройствах с размером сегмента равным 128 блокам

8:9

основной и вспомогательный номера первого устройства

384

смещение на первом устройстве

8:8

основной и вспомогательный номера второго устройства

384

смещение на втором устройстве

8:7

основной и вспомогательный номера третьего устройства

9789824

смещение на третьем устройстве

В следующем примере будет организовано чередование на двух устройствах; при этом размер сегмента будет равен 256 КиБ, а устройства будут заданы с помощью имен.

0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. Тип mirror

Тип mirror поддерживает проецирование зеркальных логических устройств. Формат:

начало длина mirror тип_журнала #число_аргументов аргумент1 ... аргументN #число_устройств устройство1 смещение1 ... устройствоN смещениеN
начало

первый блок виртуального устройства

длина

длина сегмента

тип_журнала

Возможные значения:

core

Журнал локального зеркала хранится в основной памяти. Этот тип принимает от одного до трех аргументов:

размер_сектора [[no]sync] [block_on_error]

disk

Журнал зеркала хранится на локальном диске. Этот тип принимает от двух до четырех аргументов:

устройство размер_сегмента [[no]sync] [block_on_error]

clustered_core

Журнал кластерного зеркала хранится в основной памяти. Этот тип принимает от двух до четырех аргументов:

размер_секции UUID [[no]sync] [block_on_error]

clustered_disk

Журнал кластерного зеркала хранится на диске. Этот тип принимает от трех до пяти аргументов:

устройство размер UUID [[no]sync] [block_on_error]

LVM поддерживает небольшой журнал, где регистрируется информация о синхронизации регионов с зеркалом. Размер определяет размер регионов.

В кластерном окружении UUID определяет уникальный идентификатор устройства, где расположен журнал.

Аргумент [no]sync не является обязательным; его целью является определение состояния зеркала как «in-sync» или «out-of-sync». Аргумент block_on_error заставит зеркало отвечать на ошибки, а не игнорировать их.

#число_аргументов

общее число аргументов журнала

аргумент1...аргументN

аргументы журнала зеркала. Число аргументов определяется параметром #число_аргументов, а допустимые аргументы определяются параметром тип_журнала.

#число_устройств

число составляющих зеркала. Для каждого элемента задается устройство и смещение.

устройство

блочное устройство в основе звена зеркала. Задается с помощью имени устройства или пары номеров основной:вспомогательный.

смещение

исходное смещение. Блочное устройство и смещение задаются для каждого элемента зеркала.

Следующий пример демонстрирует проецирование для кластерного зеркала с поддержкой журнала на диске.

0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
0

первый блок виртуального устройства

52428800

длина сегмента

mirror clustered_disk

зеркало и тип журнала, который в данном случае подразумевает, что он хранится на диске.

4

далее следуют четыре аргумента

253:2

основной и вспомогательный номера

1024

размер региона, где будет регистрироваться информация о синхронизации

UUID

UUID устройства с журналами кластера

block_on_error

зеркало должно реагировать на ошибки

3

число составляющих элементов зеркала

253:3 0 253:4 0 253:5 0

основной и вспомогательный номера и смещение

A.1.4. Тип snapshot и snapshot-origin

При создании первого снимка тома используются четыре устройства Device Mapper:

  1. Устройство с линейным проецированием (linear), содержащее изначальную таблицу соответствий для исходного тома.

  2. Устройство с линейным проецированием, используемое в качестве устройства CoW (copy-on-write) для исходного тома. При каждой операции записи данные сохраняются и на COW-устройство, тем самым синхронизируя содержимое (до тех пор пока COW-устройство не заполнится).

  3. Устройство с проецированием snapshot, совмещающим типы 1 и 2, которое представляет собой видимый снимок тома.

  4. Исходный том. Таблица этого тома заменяется соответствием «snapshot-origin» из первого устройства.

При создании этих устройств используется фиксированная схема присвоения имен. Например, команды создания тома base и его снимка snap будут выглядеть так:

# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base

В результате будет получено 4 устройства:

# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw-------  1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw-------  1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base

Формат snapshot-origin:

начало длина snapshot-origin исходный
начало

первый блок виртуального устройства

длина

длина сегмента

исходный

исходный том, для которого создается снимок

Исходный том snapshot-origin обычно имеет один или несколько снимков. При чтении проецирование будет осуществляться напрямую. При записи исходные данные будут сохранены в COW-устройство каждого снимка. Это делается с целью буферизации изменений, до тех пор пока COW-устройство не будет заполнено.

Формат snapshot:

начало длина snapshot исходный COW-устройство P|N размер_секции
начало

первый блок виртуального устройства

длина

длина сегмента

исходный

исходный том, для которого создается снимок

COW-устройство

Устройство, где будут сохраняться измененные секции данных

P|N

P (Persistent) или N (Not persistent) определяют, будет ли сохраняться снимок после перезагрузки. Значение P сохраняет снимок, а N — не сохраняет, в случае чего метаданные будут храниться в памяти.

размер_секции

Размер изменяемых секций на COW-устройстве (в секторах).

Следующий пример демонстрирует snapshot-origin для устройства с номером 254:11.

0 2097152 snapshot-origin 254:11

В следующем примере исходное устройство — 254:11, COW-устройство — 254:12. Снимок будет сохраняться между перезагрузками, а размер секций данных, сохраняемых в COW-устройстве, равен 16 секторам.

0 2097152 snapshot 254:11 254:12 P 16

A.1.5. Тип error

Тип «error» завершает неудачей любые запросы ввода и вывода к заданному сектору.

«error» обычно используется для тестирования. Скажем, надо проверить поведение устройства в случае сбоя. Для этого просто создается соответствие с поврежденным сектором где-нибудь посередине или работающий компонент зеркала специально заменяется поврежденным.

Проекция «error» может использоваться вместо поврежденного устройства во избежание задержек обращения или при реорганизации метаданных LVM в случае сбоя.

error требует указания только двух параметров — начало и конец.

Пример:

0 65536 error

A.1.6. Тип zero

Для подстановки соответствия zero используется блочное устройство /dev/zero. Запросы чтения будут возвращать блоки нулей, а запись хоть и будет завершена успешно, но записываемые данные не будут сохранены. zero принимает два параметра — начало и длина.

Пример создания соответствия zero для устройства размером 16 ТБ:

0 65536 zero

A.1.7. Тип multipath

Тип «multipath» обеспечивает сопоставление для многопутевых устройств. Формат:

начало длина  multipath  #число_функций [функция1 ... функцияN] #число_аргументов [аргумент1 ... аргументN] #число_групп след_группа аргументы_группы1 ... аргументы_группыN

Каждой группе путей соответствует один набор аргументы_группы.

начало

первый блок виртуального устройства

длина

длина сегмента

#число_функций

Число функций с их последующим списком. Если равно нулю, далее сразу будет следовать #число_аргументов. В настоящее время поддерживается лишь одна функция — queue_if_no_path, которая ставит запросы ввода-вывода в очередь при отсутствии доступных путей.

К примеру, если параметр no_path_retry в файле multipath.conf ставит операции ввода и вывода в очередь до тех пор, пока все пути не будут отмечены как сбойные после заданного числа попыток, соответствие будет выглядеть так:

0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 
1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000

После того как все проверки путей завершились неудачей, соответствие будет выглядеть так:

0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 
round-robin 0 2 1 8:0 1000 67:192 1000
#число_аргументов

Число аргументов аппаратного обработчика с последующим списком аргументов. Обработчик определяет модуль для выполнения операций, связанных с оборудованием, при изменении групп путей или при обработке ошибок ввода-вывода. Если значение равно нулю, дальше сразу будет следовать число_групп.

#число_групп

Число групп маршрутов. Группа маршрутов представляет собой набор маршрутов, используемых многопутевым устройством для распределения нагрузки. Каждой группе соответствует один набор параметров аргументы_группы.

след_группа

Следующая группа маршрутов.

аргументы_группы

Каждой группе соответствуют следующие аргументы:

алгоритм #число_аргументов #число_маршрутов #число_аргументов устройство1 число_запросов1 ... устройствоN число_запросовN 

Каждому маршруту соответствует один набор аргументов.

алгоритм

Алгоритм выбора пути для обработки следующего запроса ввода-вывода.

#число_аргументов

Число аргументов. По умолчанию равно 0.

#число_маршрутов

Число маршрутов в группе.

#число_аргументов

Число аргументов для каждого маршрута. По умолчанию равно 1 (единственный аргумент ioreqs).

устройство

Номер устройства маршрута в формате основной:вспомогательный.

ioreqs

Число запросов ввода и вывода, которые будут переданы этому маршруту, прежде чем будет выбран следующий путь.

Рисунок A.1, «Соответствие multipath» демонстрирует проекцию с двумя группами маршрутов.

Соответствие multipath

Рисунок A.1. Соответствие multipath

Следующий пример демонстрирует определение резервного устройства на случай сбоя многопутевого устройства. Цель включает четыре группы путей, но только один путь в группе может быть открыт.

0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 
round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 
round-robin 0 1 1 65:48 1000

Ниже приведен пример того же устройства, но в этом случае используется лишь одна группа маршрутов, между которыми нагрузка будет распределена равномерно.

0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 
 67:176 1000 68:240 1000 65:48 1000

Документ DM-Multipath содержит дальнейшую информацию.

A.1.8. Тип crypt

crypt обеспечит шифрование передаваемых через заданное устройство данных. При этом используется API Crypto.

Формат:

начало длина crypt код ключ смещение_IV устройство смещение
начало

первый блок виртуального устройства

длина

длина сегмента

код

Формат кода: cipher[-режим]-ivmode[:iv параметры].

код

Список кодов можно найти в файле /proc/crypto (например, aes).

режим

Надо указать cbc, а не ebc, так как ebc не использует исходный вектор (IV).

ivmode[:iv параметры]

IV — вектор инициализации, позволяющий изменить метод шифрования. Режим IV может принимать значения plain или essiv:hash. Метод plain использует номер сектора (плюс смещение IV) в качестве IV, в то время как -essiv представляет собой расширение для усиления защиты от атак Watermarking.

ключ

Ключ шифрования в шестнадцатеричной форме

смещение_IV

Смещение вектора инициализации

устройство

блочное устройство, которое можно указать по имени или по номеру в формате основной:вспомогательный

смещение

смещение проекции

Пример:

0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0

A.2. dmsetup

Для работы с модулем Device Mapper используется команда dmsetup с параметрами info, ls, status и deps. Они будут рассмотрены ниже.

За информацией о параметрах обратитесь к справочной странице dmsetup(8).

A.2.1. dmsetup info

Команда dmsetup info устройство позволяет получить информацию об устройствах Device Mapper. Если устройство не указано, будут показаны сведения о всех настроенных устройствах Device Mapper.

Формат вывода dmsetup info:

Name

Имя устройства в формате «группа_томов-логический_том». Если исходное имя содержит дефис, он будет указан дважды.

State

Возможные значения статуса: SUSPENDED, ACTIVE, READ-ONLY. Например для перевода устройства в состояние SUSPENDED выполните dmsetup suspend, что приостановит все операции ввода и вывода. dmsetup resume снова активирует устройство, изменив его статус на ACTIVE.

Read Ahead

Число блоков данных, которые система будет считывать заранее для каждого открытого файла. Значение можно изменить с помощью параметра --readahead команды dmsetup.

Tables present

Допустимые значения: LIVE, INACTIVE. INACTIVE обозначает, что загружена неактивная таблица, а когда команда dmsetup resume восстановит работу устройства (переведет в ACTIVE), ее статус изменится на LIVE. Более подробную информацию можно найти на справочной странице dmsetup.

Open count

Счетчик попыток открыть устройство с помощью mount.

Event number

Число полученных событий. dmsetup wait n позволит дождаться события с номером n, заблокировав вызов до тех пор, пока оно не будет получено.

Major, minor

Основной и вспомогательный номера устройства.

Number of targets

Число фрагментов в составе устройства. Например, линейное устройство, в основу которого положено 3 диска, будет иметь 3 фрагмента, а линейное устройство, включающее начало и конец диска, будет иметь 2 фрагмента.

UUID

Идентификатор UUID.

Пример частичного вывода dmsetup info:

[root@ask-07 ~]# dmsetup info
Name:              testgfsvg-testgfslv1
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 2
Number of targets: 2
UUID: LVM-K528WUGQgPadNXYcFrrf9LnPlUMswgkCkpgPIgYzSvigM7SfeWCypddNSWtNzc2N
...
Name:              VolGroup00-LogVol00
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        1
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: LVM-tOcS1kqFV9drb0X1Vr8sxeYP0tqcrpdegyqj5lZxe45JMGlmvtqLmbLpBcenh2L3

A.2.2. dmsetup ls

С помощью команды dmsetup ls можно просмотреть список проекций устройств. dmsetup ls --target тип покажет устройства, в основе которых лежит по крайней мере один компонент указанного типа. Другие параметры dmsetup ls можно просмотреть на справочной странице dmsetup.

Получение списка устройств:

[root@ask-07 ~]# dmsetup ls
testgfsvg-testgfslv3    (253, 4)
testgfsvg-testgfslv2    (253, 3)
testgfsvg-testgfslv1    (253, 2)
VolGroup00-LogVol01     (253, 1)
VolGroup00-LogVol00     (253, 0)

Получение списка зеркальных устройств:

[root@grant-01 ~]# dmsetup ls --target mirror
lock_stress-grant--02.1722      (253, 34)
lock_stress-grant--01.1720      (253, 18)
lock_stress-grant--03.1718      (253, 52)
lock_stress-grant--02.1716      (253, 40)
lock_stress-grant--03.1713      (253, 47)
lock_stress-grant--02.1709      (253, 23)
lock_stress-grant--01.1707      (253, 8)
lock_stress-grant--01.1724      (253, 14)
lock_stress-grant--03.1711      (253, 27)

Конфигурация LVM может быть довольно сложной. Параметр --tree покажет связи устройств в виде дерева.

# dmsetup ls --tree
vgtest-lvmir (253:13)
 ├─vgtest-lvmir_mimage_1 (253:12)
 │  └─mpathep1 (253:8)
 │     └─mpathe (253:5)
 │        ├─ (8:112)
 │        └─ (8:64)
 ├─vgtest-lvmir_mimage_0 (253:11)
 │  └─mpathcp1 (253:3)
 │     └─mpathc (253:2)
 │        ├─ (8:32)
 │        └─ (8:16)
 └─vgtest-lvmir_mlog (253:4)
    └─mpathfp1 (253:10)
       └─mpathf (253:6)
          ├─ (8:128)
          └─ (8:80)

A.2.3. dmsetup status

dmsetup status устройство покажет статус всех составляющих заданного устройства. Если устройство не указано, будет приведена информация для всех настроенных устройств. dmsetup status --target тип покажет статус устройств, в основе которых лежит по крайней мере один компонент указанного типа.

Получение статуса всех настроенных устройств:

[root@ask-07 ~]# dmsetup status
testgfsvg-testgfslv3: 0 312352768 linear 
testgfsvg-testgfslv2: 0 312352768 linear 
testgfsvg-testgfslv1: 0 312352768 linear 
testgfsvg-testgfslv1: 312352768 50331648 linear 
VolGroup00-LogVol01: 0 4063232 linear 
VolGroup00-LogVol00: 0 151912448 linear

A.2.4. dmsetup deps

Команда dmsetup deps устройство покажет список основных и вспомогательных номеров устройств, входящих в таблицу соответствий для заданного устройства. Если устройство не указано, будет показана информация обо всех устройствах.

Просмотр зависимостей для всех настроенных устройств:

[root@ask-07 ~]# dmsetup deps
testgfsvg-testgfslv3: 1 dependencies    : (8, 16)
testgfsvg-testgfslv2: 1 dependencies    : (8, 16)
testgfsvg-testgfslv1: 1 dependencies    : (8, 16)
VolGroup00-LogVol01: 1 dependencies     : (8, 2)
VolGroup00-LogVol00: 1 dependencies     : (8, 2)

Получение зависимостей для устройства lock_stress-grant--02.1722:

[root@grant-01 ~]# dmsetup deps lock_stress-grant--02.1722
3 dependencies  : (253, 33) (253, 32) (253, 31)

A.3. Поддержка udev

Основной задачей менеджера устройств udev является обслуживание файлов устройств в каталоге /dev. Создание файлов устройств осуществляется в соответствии с правилами udev в пространстве пользователя. При добавлении, удалении и изменении устройств ядро генерирует события, которые будут обработаны правилами udev.

udev может создавать не только файлы устройств, но и символьные ссылки, предоставляя тем самым свободу действий в выборе имен устройств и организации каталогов внутри /dev.

Событие udev содержит информацию об устройстве — имя, подсистема, которой оно принадлежит, тип устройства, основной и второстепенный номер и тип события. На основе этой информации и данных из /sys можно создать фильтры для правил.

udev предоставляет централизованный механизм настройки доступа к файлам устройств. Пользователь может определить собственный набор правил доступа к устройствам.

Правила могут содержать вызовы других программ. В свою очередь, программы могут экспортировать переменные окружения. Полученные результаты могут быть переданы правилам для дальнейшей обработки.

Обработка событий может осуществляться не только службой udev, но и другими программами, использующими библиотеку udev.

A.3.1. Интеграция udev с Device Mapper

В RHEL 6 обработка событий udev синхронизируется с Device Mapper. Синхронизация необходима, так как udev применяет правила параллельно с программой, запрашивающей изменение устройства (например, dmsetup или LVM). В противном случае могло бы оказаться так, что пользователь пытается удалить устройство, которое еще используется службой udev.

RHEL 6 обеспечивает поддержку правил udev для устройств Device Mapper. Правила располагаются в /lib/udev/rules.d (см. Таблица A.1, «Правила udev»).

Таблица A.1. Правила udev

Файл Описание
10-dm.rules
Содержит общие правила Device Mapper и создает символьные ссылки в /dev/mapper для устройств /dev/dm-N, где N — динамически назначенный ядром номер устройства.
Сценарии должны использовать действительные имена устройств из /dev/mapper, а не /dev/dm-N, так как номер N назначается динамически и изменяет порядок инициализации устройств.
11-dm-lvm.rules
Содержит правила для устройств LVM и создает символьные ссылки в каталоге /dev/vgname для устройств /dev/dm-N.
Правила udev должны следовать формату 11-dm-подсистема.rules. Пользователи libdevmapper, предоставляющие правила для udev, также должны придерживаться этого формата.
13-dm-disk.rules Содержит правила для обработки устройств Device Mapper и создает символьные ссылки в каталогах /dev/disk/by-id, /dev/disk/by-uuid и /dev/disk/by-uuid.
95-dm-notify.rules Содержит правило для уведомления ожидающего процесса. Уведомление будет отправлено после завершения обработки udev, то есть после применения всех правил. После этого процесс продолжит работу.

Дополнительные правила доступа можно добавить в 12-dm-permissions.rules. Этот файл не устанавливается в /lib/udev/rules по умолчанию и изначально расположен в каталоге /usr/share/doc/device-mapper-версия. Он содержит шаблон для настройки доступа на базе примера. Отредактировав файл, переместите его в /etc/udev/rules.d.

Указанные правила определяют основные переменные, которые могут использоваться другими правилами.

Переменные в 10-dm.rules:

  • DM_NAME: имя проекции устройства;

  • DM_UUID: идентификатор проекции устройства;

  • DM_SUSPENDED: устройство приостановлено;

  • DM_UDEV_RULES_VSN: версия. Проверяется другими правилами, чтобы убедиться, что указанные выше переменные определены официальными правилами Device Mapper.

Переменные в 11-dm-lvm.rules:

  • DM_LV_NAME: логический том;

  • DM_VG_NAME: группа томов;

  • DM_LV_LAYER: уровень LVM.

Для настройки доступа к конкретному устройству Device Mapper перечисленные переменные можно добавить в файл 12-dm-permissions.rules.

A.3.2. Команды для работы с udev

Таблица A.2, «Команды dmsetup для работы с udev» содержит список команд dmsetup для работы с udev.

Таблица A.2. Команды dmsetup для работы с udev

Команда Описание
dmsetup udevcomplete Сообщает о завершении обработки правил и разрешает продолжение ожидающего процесса (вызывается из 95-dm-notify.rules).
dmsetup udevcomplete_all Используется при отладке для возобновления всех ожидающих процессов.
dmsetup udevcookies Используется при отладке для просмотра существующих cookie-файлов.
dmsetup udevcreatecookie Используется для создания cookie-файлов вручную.
dmsetup udevreleasecookie Ожидает завершения обработки всех процессов для выбранного cookie.

Ниже приведен список параметров для перечисленных команд.

--udevcookie

Обязательный параметр. Используется вместе с udevcreatecookie и udevreleasecookie:

COOKIE=$(dmsetup udevcreatecookie)
  dmsetup команда --udevcookie $COOKIE ....
  dmsetup команда --udevcookie $COOKIE ....
  ....
  dmsetup команда --udevcookie $COOKIE ....
dmsetup udevreleasecookie --udevcookie $COOKIE

Дополнительно можно экспортировать переменную в окружение процесса:

export DM_UDEV_COOKIE=$(dmsetup udevcreatecookie)
  dmsetup команда ...
  dmsetup команда ...
  ...
  dmsetup команда ...
--noudevrules

Отключает правила udev. За создание файлов и ссылок будет отвечать libdevmapper. Этот аргумент используется для отладки udev.

--noudevsync

Отключает синхронизацию udev. Используется для отладки.

Более подробную информацию о dmsetup можно найти на справочной странице dmsetup(8).

Команды LVM поддерживают следующие параметры для интеграции с udev:

  • --noudevrules: отключает правила udev.

  • --noudevsync: отключает синхронизацию udev.

Ниже перечислены параметры, которые могут быть добавлены в lvm.conf.

  • udev_rules: включает и отключает udev_rules для всех команд LVM2.

  • udev_sync: включает и отключает синхронизацию udev для всех команд LVM.

lvm.conf содержит подробные комментарии.

Приложение B. Файлы конфигурации LVM

При запуске системы из каталога, заданного переменной окружения LVM_SYSTEM_DIR (по умолчанию установлена в /etc/lvm) будет загружен файл конфигурации lvm.conf.

В lvm.conf могут быть указаны дополнительные файлы конфигурации. Последующие настройки будут переопределять предыдущие. Чтобы отобразить текущие настройки, выполните lvm dumpconfig.

Раздел C.2, «Теги узлов» содержит инструкции по добавлению других файлов конфигурации.

B.1. Файлы конфигурации LVM

Далее перечислены файлы конфигурации LVM.

/etc/lvm/lvm.conf

Основной файл конфигурации, к которому обращаются утилиты.

etc/lvm/lvm_тег_узла.conf

Каждому тегу соответствует отдельный файл lvm_тег_узла.conf. Если он содержит другие теги, тогда имена соответствующих файлов конфигурации будут добавлены в список для последующего чтения (см. Раздел C.2, «Теги узлов»).

Также используются следующие файлы:

/etc/lvm/.cache

файл кэширования фильтров имен устройств (может быть изменен).

/etc/lvm/backup/

каталог, где хранятся автоматически созданные резервные копии метаданных групп томов (может быть изменен).

/etc/lvm/archive/

каталог, где хранятся архивы автоматически созданных резервных копий метаданных групп томов (настраивается в зависимости от длины истории архивации и пути)

/var/lock/lvm/

В структуре с одним узлом файлы блокировки предотвращают повреждение данных при параллельной работе программ. В кластере будет использоваться блокирование DLM.

B.2. Пример lvm.conf

Пример lvm.conf:

# This is an example configuration file for the LVM2 system.
# It contains the default settings that would be used if there was no
# /etc/lvm/lvm.conf file.
#
# Refer to 'man lvm.conf' for further information including the file layout.
#
# To put this file in a different directory and override /etc/lvm set
# the environment variable LVM_SYSTEM_DIR before running the tools.


# This section allows you to configure which block devices should
# be used by the LVM system.
devices {

    # Where do you want your volume groups to appear ?
    dir = "/dev"

    # An array of directories that contain the device nodes you wish
    # to use with LVM2.
    scan = [ "/dev" ]

    # If several entries in the scanned directories correspond to the
    # same block device and the tools need to display a name for device,
    # all the pathnames are matched against each item in the following
    # list of regular expressions in turn and the first match is used.
    # preferred_names = [ ]

    # Try to avoid using undescriptive /dev/dm-N names, if present.
    preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ]

    # A filter that tells LVM2 to only use a restricted set of devices.
    # The filter consists of an array of regular expressions.  These
    # expressions can be delimited by a character of your choice, and
    # prefixed with either an 'a' (for accept) or 'r' (for reject).
    # The first expression found to match a device name determines if
    # the device will be accepted or rejected (ignored).  Devices that
    # don't match any patterns are accepted.

    # Be careful if there there are symbolic links or multiple filesystem 
    # entries for the same device as each name is checked separately against
    # the list of patterns.  The effect is that if any name matches any 'a'
    # pattern, the device is accepted; otherwise if any name matches any 'r'
    # pattern it is rejected; otherwise it is accepted.

    # Don't have more than one filter line active at once: only one gets used.

    # Run vgscan after you change this parameter to ensure that
    # the cache file gets regenerated (see below).
    # If it doesn't do what you expect, check the output of 'vgscan -vvvv'.


    # By default we accept every block device:
    filter = [ "a/.*/" ]

    # Exclude the cdrom drive
    # filter = [ "r|/dev/cdrom|" ]

    # When testing I like to work with just loopback devices:
    # filter = [ "a/loop/", "r/.*/" ]

    # Or maybe all loops and ide drives except hdc:
    # filter =[ "a|loop|", "r|/dev/hdc|", "a|/dev/ide|", "r|.*|" ]

    # Use anchors if you want to be really specific
    # filter = [ "a|^/dev/hda8$|", "r/.*/" ]

    # The results of the filtering are cached on disk to avoid
    # rescanning dud devices (which can take a very long time).
    # By default this cache is stored in the /etc/lvm/cache directory
    # in a file called '.cache'.
    # It is safe to delete the contents: the tools regenerate it.
    # (The old setting 'cache' is still respected if neither of
    # these new ones is present.)
    cache_dir = "/etc/lvm/cache"
    cache_file_prefix = ""

    # You can turn off writing this cache file by setting this to 0.
    write_cache_state = 1

    # Advanced settings.

    # List of pairs of additional acceptable block device types found 
    # in /proc/devices with maximum (non-zero) number of partitions.
    # types = [ "fd", 16 ]

    # If sysfs is mounted (2.6 kernels) restrict device scanning to 
    # the block devices it believes are valid.
    # 1 enables; 0 disables.
    sysfs_scan = 1

    # By default, LVM2 will ignore devices used as components of
    # software RAID (md) devices by looking for md superblocks.
    # 1 enables; 0 disables.
    md_component_detection = 1

    # By default, if a PV is placed directly upon an md device, LVM2
    # will align its data blocks with the md device's stripe-width.
    # 1 enables; 0 disables.
    md_chunk_alignment = 1

    # Default alignment of the start of a data area in MB.  If set to 0,
    # a value of 64KB will be used.  Set to 1 for 1MiB, 2 for 2MiB, etc.
    # default_data_alignment = 1

    # By default, the start of a PV's data area will be a multiple of
    # the 'minimum_io_size' or 'optimal_io_size' exposed in sysfs.
    # - minimum_io_size - the smallest request the device can perform
    #   w/o incurring a read-modify-write penalty (e.g. MD's chunk size)
    # - optimal_io_size - the device's preferred unit of receiving I/O
    #   (e.g. MD's stripe width)
    # minimum_io_size is used if optimal_io_size is undefined (0).
    # If md_chunk_alignment is enabled, that detects the optimal_io_size.
    # This setting takes precedence over md_chunk_alignment.
    # 1 enables; 0 disables.
    data_alignment_detection = 1

    # Alignment (in KB) of start of data area when creating a new PV.
    # md_chunk_alignment and data_alignment_detection are disabled if set.
    # Set to 0 for the default alignment (see: data_alignment_default)
    # or page size, if larger.
    data_alignment = 0

    # By default, the start of the PV's aligned data area will be shifted by
    # the 'alignment_offset' exposed in sysfs.  This offset is often 0 but
    # may be non-zero; e.g.: certain 4KB sector drives that compensate for
    # windows partitioning will have an alignment_offset of 3584 bytes
    # (sector 7 is the lowest aligned logical block, the 4KB sectors start
    # at LBA -1, and consequently sector 63 is aligned on a 4KB boundary).
    # But note that pvcreate --dataalignmentoffset will skip this detection.
    # 1 enables; 0 disables.
    data_alignment_offset_detection = 1

    # If, while scanning the system for PVs, LVM2 encounters a device-mapper
    # device that has its I/O suspended, it waits for it to become accessible.
    # Set this to 1 to skip such devices.  This should only be needed
    # in recovery situations.
    ignore_suspended_devices = 0

    # During each LVM operation errors received from each device are counted.
    # If the counter of a particular device exceeds the limit set here, no
    # further I/O is sent to that device for the remainder of the respective
    # operation. Setting the parameter to 0 disables the counters altogether.
    disable_after_error_count = 0

    # Allow use of pvcreate --uuid without requiring --restorefile.
    require_restorefile_with_uuid = 1
}

# This section allows you to configure the way in which LVM selects
# free space for its Logical Volumes.
#allocation {
#    When searching for free space to extend an LV, the "cling"
#    allocation policy will choose space on the same PVs as the last
#    segment of the existing LV.  If there is insufficient space and a
#    list of tags is defined here, it will check whether any of them are
#    attached to the PVs concerned and then seek to match those PV tags
#    between existing extents and new extents.
#    Use the special tag "@*" as a wildcard to match any PV tag.
#    
#    Example: LVs are mirrored between two sites within a single VG.
#    PVs are tagged with either @site1 or @site2 to indicate where
#    they are situated.
#
#    cling_tag_list = [ "@site1", "@site2" ]
#    cling_tag_list = [ "@*" ]
#}

# This section that allows you to configure the nature of the
# information that LVM2 reports.
log {

    # Controls the messages sent to stdout or stderr.
    # There are three levels of verbosity, 3 being the most verbose.
    verbose = 0

    # Should we send log messages through syslog?
    # 1 is yes; 0 is no.
    syslog = 1

    # Should we log error and debug messages to a file?
    # By default there is no log file.
    #file = "/var/log/lvm2.log"

    # Should we overwrite the log file each time the program is run?
    # By default we append.
    overwrite = 0

    # What level of log messages should we send to the log file and/or syslog?
    # There are 6 syslog-like log levels currently in use - 2 to 7 inclusive.
    # 7 is the most verbose (LOG_DEBUG).
    level = 0

    # Format of output messages
    # Whether or not (1 or 0) to indent messages according to their severity
    indent = 1

    # Whether or not (1 or 0) to display the command name on each line output
    command_names = 0

    # A prefix to use before the message text (but after the command name,
    # if selected).  Default is two spaces, so you can see/grep the severity
    # of each message.
    prefix = "  "

    # To make the messages look similar to the original LVM tools use:
    #   indent = 0
    #   command_names = 1
    #   prefix = " -- "

    # Set this if you want log messages during activation.
    # Don't use this in low memory situations (can deadlock).
    # activation = 0
}

# Configuration of metadata backups and archiving.  In LVM2 when we
# talk about a 'backup' we mean making a copy of the metadata for the
# *current* system.  The 'archive' contains old metadata configurations.
# Backups are stored in a human readeable text format.
backup {

    # Should we maintain a backup of the current metadata configuration ?
    # Use 1 for Yes; 0 for No.
    # Think very hard before turning this off!
    backup = 1

    # Where shall we keep it ?
    # Remember to back up this directory regularly!
    backup_dir = "/etc/lvm/backup"

    # Should we maintain an archive of old metadata configurations.
    # Use 1 for Yes; 0 for No.
    # On by default.  Think very hard before turning this off.
    archive = 1

    # Where should archived files go ?
    # Remember to back up this directory regularly!
    archive_dir = "/etc/lvm/archive"

    # What is the minimum number of archive files you wish to keep ?
    retain_min = 10

    # What is the minimum time you wish to keep an archive file for ?
    retain_days = 30
}

# Settings for the running LVM2 in shell (readline) mode.
shell {

    # Number of lines of history to store in ~/.lvm_history
    history_size = 100
}


# Miscellaneous global LVM2 settings
global {

    # The file creation mask for any files and directories created.
    # Interpreted as octal if the first digit is zero.
    umask = 077

    # Allow other users to read the files
    #umask = 022

    # Enabling test mode means that no changes to the on disk metadata
    # will be made.  Equivalent to having the -t option on every
    # command.  Defaults to off.
    test = 0

    # Default value for --units argument
    units = "h"

    # Since version 2.02.54, the tools distinguish between powers of
    # 1024 bytes (e.g. KiB, MiB, GiB) and powers of 1000 bytes (e.g.
    # KB, MB, GB).
    # If you have scripts that depend on the old behaviour, set this to 0
    # temporarily until you update them.
    si_unit_consistency = 1

    # Whether or not to communicate with the kernel device-mapper.
    # Set to 0 if you want to use the tools to manipulate LVM metadata 
    # without activating any logical volumes.
    # If the device-mapper kernel driver is not present in your kernel
    # setting this to 0 should suppress the error messages.
    activation = 1

    # If we can't communicate with device-mapper, should we try running 
    # the LVM1 tools?
    # This option only applies to 2.4 kernels and is provided to help you
    # switch between device-mapper kernels and LVM1 kernels.
    # The LVM1 tools need to be installed with .lvm1 suffices
    # e.g. vgscan.lvm1 and they will stop working after you start using
    # the new lvm2 on-disk metadata format.
    # The default value is set when the tools are built.
    # fallback_to_lvm1 = 0

    # The default metadata format that commands should use - "lvm1" or "lvm2".
    # The command line override is -M1 or -M2.
    # Defaults to "lvm2".
    # format = "lvm2"

    # Location of proc filesystem
    proc = "/proc"

    # Type of locking to use. Defaults to local file-based locking (1).
    # Turn locking off by setting to 0 (dangerous: risks metadata corruption
    # if LVM2 commands get run concurrently).
    # Type 2 uses the external shared library locking_library.
    # Type 3 uses built-in clustered locking.
    # Type 4 uses read-only locking which forbids any operations that might 
    # change metadata.
    locking_type = 1

    # Set to 0 to fail when a lock request cannot be satisfied immediately.
    wait_for_locks = 1

    # If using external locking (type 2) and initialisation fails,
    # with this set to 1 an attempt will be made to use the built-in
    # clustered locking.
    # If you are using a customised locking_library you should set this to 0.
    fallback_to_clustered_locking = 1

    # If an attempt to initialise type 2 or type 3 locking failed, perhaps
    # because cluster components such as clvmd are not running, with this set
    # to 1 an attempt will be made to use local file-based locking (type 1).
    # If this succeeds, only commands against local volume groups will proceed.
    # Volume Groups marked as clustered will be ignored.
    fallback_to_local_locking = 1

    # Local non-LV directory that holds file-based locks while commands are
    # in progress.  A directory like /tmp that may get wiped on reboot is OK.
    locking_dir = "/var/lock/lvm"

    # Whenever there are competing read-only and read-write access requests for
    # a volume group's metadata, instead of always granting the read-only
    # requests immediately, delay them to allow the read-write requests to be
    # serviced.  Without this setting, write access may be stalled by a high
    # volume of read-only requests.
    # NB. This option only affects locking_type = 1 viz. local file-based
    # locking.
    prioritise_write_locks = 1

    # Other entries can go here to allow you to load shared libraries
    # e.g. if support for LVM1 metadata was compiled as a shared library use
    #   format_libraries = "liblvm2format1.so" 
    # Full pathnames can be given.

    # Search this directory first for shared libraries.
    #   library_dir = "/lib"

    # The external locking library to load if locking_type is set to 2.
    #   locking_library = "liblvm2clusterlock.so"

    # Treat any internal errors as fatal errors, aborting the process that
    # encountered the internal error. Please only enable for debugging.
    abort_on_internal_errors = 0

    # If set to 1, no operations that change on-disk metadata will be permitted.
    # Additionally, read-only commands that encounter metadata in need of repair
    # will still be allowed to proceed exactly as if the repair had been 
    # performed (except for the unchanged vg_seqno).
    # Inappropriate use could mess up your system, so seek advice first!
    metadata_read_only = 0
}

activation {
    # Set to 0 to disable udev synchronisation (if compiled into the binaries).
    # Processes will not wait for notification from udev.
    # They 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.
    # The command line argument --nodevsync takes precedence over this setting.
    # If set to 1 when udev is not running, and there are LVM2 processes
    # waiting for udev, run 'dmsetup udevcomplete_all' manually to wake them up.
    udev_sync = 1

    # Set to 0 to disable the udev rules installed by LVM2 (if built with
    # --enable-udev_rules). LVM2 will then manage the /dev nodes and symlinks
    # for active logical volumes directly itself.
    # N.B. Manual intervention may be required if this setting is changed
    # while any logical volumes are active.
    udev_rules = 1

    # How to fill in missing stripes if activating an incomplete volume.
    # Using "error" will make inaccessible parts of the device return
    # I/O errors on access.  You can instead use a device path, in which 
    # case, that device will be used to in place of missing stripes.
    # But note that using anything other than "error" with mirrored 
    # or snapshotted volumes is likely to result in data corruption.
    missing_stripe_filler = "error"

    # How much stack (in KB) to reserve for use while devices suspended
    reserved_stack = 256

    # How much memory (in KB) to reserve for use while devices suspended
    reserved_memory = 8192

    # Nice value used while devices suspended
    process_priority = -18

    # If volume_list is defined, each LV is only activated if there is a
    # match against the list.
    #   "vgname" and "vgname/lvname" are matched exactly.
    #   "@tag" matches any tag set in the LV or VG.
    #   "@*" matches if any tag defined on the host is also set in the LV or VG
    #
    # volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]

    # Size (in KB) of each copy operation when mirroring
    mirror_region_size = 512

    # Setting to use when there is no readahead value stored in the metadata.
    #
    # "none" - Disable readahead.
    # "auto" - Use default value chosen by kernel.
    readahead = "auto"

    # 'mirror_image_fault_policy' and 'mirror_log_fault_policy' define
    # how a device failure affecting a mirror is handled.
    # A mirror is composed of mirror images (copies) and a log.
    # A disk log ensures that a mirror does not need to be re-synced
    # (all copies made the same) every time a machine reboots or crashes.
    #
    # In the event of a failure, the specified policy will be used to determine
    # what happens. This applies to automatic repairs (when the mirror is being
    # monitored by dmeventd) and to manual lvconvert --repair when
    # --use-policies is given.
    #
    # "remove" - Simply remove the faulty device and run without it.  If
    #            the log device fails, the mirror would convert to using
    #            an in-memory log.  This means the mirror will not
    #            remember its sync status across crashes/reboots and
    #            the entire mirror will be re-synced.  If a
    #            mirror image fails, the mirror will convert to a
    #            non-mirrored device if there is only one remaining good
    #            copy.
    #
    # "allocate" - Remove the faulty device and try to allocate space on
    #            a new device to be a replacement for the failed device.
    #            Using this policy for the log is fast and maintains the
    #            ability to remember sync state through crashes/reboots.
    #            Using this policy for a mirror device is slow, as it
    #            requires the mirror to resynchronize the devices, but it
    #            will preserve the mirror characteristic of the device.
    #            This policy acts like "remove" if no suitable device and
    #            space can be allocated for the replacement.
    #
    # "allocate_anywhere" - Not yet implemented. Useful to place the log device
    #            temporarily on same physical volume as one of the mirror
    #            images. This policy is not recommended for mirror devices
    #            since it would break the redundant nature of the mirror. This
    #            policy acts like "remove" if no suitable device and space can
    #            be allocated for the replacement.

    mirror_log_fault_policy = "allocate"
    mirror_image_fault_policy = "remove"

    # 'snapshot_autoextend_threshold' and 'snapshot_autoextend_percent' define
    # how to handle automatic snapshot extension. The former defines when the
    # snapshot should be extended: when its space usage exceeds this many
    # percent. The latter defines how much extra space should be allocated for
    # the snapshot, in percent of its current size.
    #
    # For example, if you set snapshot_autoextend_threshold to 70 and
    # snapshot_autoextend_percent to 20, whenever a snapshot exceeds 70% usage,
    # it will be extended by another 20%. For a 1G snapshot, using up 700M will
    # trigger a resize to 1.2G. When the usage exceeds 840M, the snapshot will
    # be extended to 1.44G, and so on.
    #
    # Setting snapshot_autoextend_threshold to 100 disables automatic
    # extensions. The minimum value is 50 (A setting below 50 will be treated
    # as 50).

    snapshot_autoextend_threshold = 100
    snapshot_autoextend_percent = 20

    # While activating devices, I/O to devices being (re)configured is
    # suspended, and as a precaution against deadlocks, LVM2 needs to pin
    # any memory it is using so it is not paged out.  Groups of pages that
    # are known not to be accessed during activation need not be pinned
    # into memory.  Each string listed in this setting is compared against
    # each line in /proc/self/maps, and the pages corresponding to any
    # lines that match are not pinned.  On some systems locale-archive was
    # found to make up over 80% of the memory used by the process.
    # mlock_filter = [ "locale/locale-archive", "gconv/gconv-modules.cache" ]

    # Set to 1 to revert to the default behaviour prior to version 2.02.62
    # which used mlockall() to pin the whole process's memory while activating
    # devices.
    use_mlockall = 0

    # Monitoring is enabled by default when activating logical volumes.
    # Set to 0 to disable monitoring or use the --ignoremonitoring option.
    monitoring = 1

    # When pvmove or lvconvert must wait for the kernel to finish
    # synchronising or merging data, they check and report progress
    # at intervals of this number of seconds.  The default is 15 seconds.
    # If this is set to 0 and there is only one thing to wait for, there
    # are no progress reports, but the process is awoken immediately the
    # operation is complete.
    polling_interval = 15
}


####################
# Advanced section #
####################

# Metadata settings
#
# metadata {
    # Default number of copies of metadata to hold on each PV.  0, 1 or 2.
    # You might want to override it from the command line with 0 
    # when running pvcreate on new PVs which are to be added to large VGs.

    # pvmetadatacopies = 1

    # Default number of copies of metadata to maintain for each VG.
    # If set to a non-zero value, LVM automatically chooses which of
    # the available metadata areas to use to achieve the requested
    # number of copies of the VG metadata.  If you set a value larger
    # than the the total number of metadata areas available then
    # metadata is stored in them all.
    # The default value of 0 ("unmanaged") disables this automatic
    # management and allows you to control which metadata areas
    # are used at the individual PV level using 'pvchange
    # --metadataignore y/n'.

    # vgmetadatacopies = 0

    # Approximate default size of on-disk metadata areas in sectors.
    # You should increase this if you have large volume groups or
    # you want to retain a large on-disk history of your metadata changes.

    # pvmetadatasize = 255

    # List of directories holding live copies of text format metadata.
    # These directories must not be on logical volumes!
    # It's possible to use LVM2 with a couple of directories here,
    # preferably on different (non-LV) filesystems, and with no other 
    # on-disk metadata (pvmetadatacopies = 0). Or this can be in
    # addition to on-disk metadata areas.
    # The feature was originally added to simplify testing and is not
    # supported under low memory situations - the machine could lock up.
    #
    # Never edit any files in these directories by hand unless you
    # you are absolutely sure you know what you are doing! Use
    # the supplied toolset to make changes (e.g. vgcfgrestore).

    # dirs = [ "/etc/lvm/metadata", "/mnt/disk2/lvm/metadata2" ]
#}

# Event daemon
#
dmeventd {
    # mirror_library is the library used when monitoring a mirror device.
    #
    # "libdevmapper-event-lvm2mirror.so" attempts to recover from
    # failures.  It removes failed devices from a volume group and
    # reconfigures a mirror as necessary. If no mirror library is
    # provided, mirrors are not monitored through dmeventd.

    mirror_library = "libdevmapper-event-lvm2mirror.so"

    # snapshot_library is the library used when monitoring a snapshot device.
    #
    # "libdevmapper-event-lvm2snapshot.so" monitors the filling of
    # snapshots and emits a warning through syslog when the use of
    # the snapshot exceeds 80%. The warning is repeated when 85%, 90% and
    # 95% of the snapshot is filled.

    snapshot_library = "libdevmapper-event-lvm2snapshot.so"

    # Full path of the dmeventd binary.
    #
    # executable = "/sbin/dmeventd"
}

Приложение E. История изменений

История переиздания
Издание 1-3.400 2013-10-31

Rebuild with publican 4.0.0

Издание 1-3 2012-07-18 Anthony Towns

Rebuild for Publican 3.0

Издание 2.0-1 Thu May 19 2011 Steven Levine

Исходная версия документа для Red Hat Enterprise Linux 6.1

BZ#694619
Описание cling.
BZ#682649
Добавлено предупреждение о выполнении нескольких команд создания зеркального тома.
BZ#674100
Добавлен пример вывода dmsetup ls --tree.
BZ#694607
Добавлена информация о добавлении аргументов —addtag и —deltag в одну команду.
BZ#694604
Добавлена информация о поддержке расширенного списка знаков в тегах.
BZ#694611
Описание поддержки зеркальных томов с чередованием.
BZ#694616
Описание поддержки снимков зеркальных томов.
BZ#694618
Описание поддержки снимков кластерных томов.
BZ#682648
Добавлена информация о переносе журнала при переносе компонента зеркала.
BZ#661530
Обновлен пример cluster.conf.
BZ#642400
Добавлено примечание о поддержке журнала кластера на узлом с наименьшим идентификатором.
BZ#663462
Удалена устаревшая информация о виртуальной машине Xen.
Издание 1.0-1 Wed Nov 10 2010 Steven Levine

Исходная версия для Red Hat Enterprise Linux 6

Предметный указатель

Символы

/lib/udev/rules.d directory, Интеграция udev с Device Mapper
административные процедуры, Обзор администрирования LVM
активация групп томов
отдельные узлы, Активация и деактивация групп томов
только на локальном узле, Активация и деактивация групп томов
активация группы томов, Активация и деактивация групп томов
активация логических томов
отдельные узлы, Активация логических томов на отдельных узлах кластера
архивный файл, Резервное копирование логического тома
блочное устройство
поиск, Поиск блочных устройств
ведение журнала, Журнал событий
возможности, новые и обновленные, Новые и обновленные возможности
выделение пространства
ограничение, Запрет выделения пространства физического тома
правила, Создание групп томов
группа томов
активация, Активация и деактивация групп томов
деактивация, Активация и деактивация групп томов
изменение параметров, Изменение параметров группы томов
команда vgs, Команда vgs
наращивание, Добавление физических томов в группу
объединение, Объединение групп томов
определение, Группа томов
переименование, Переименование группы томов
перенос между системами, Перенос группы томов в другую систему
просмотр, Просмотр групп томов, Настройка отчетов LVM, Команда vgs
разделение, Разбиение группы томов
пример, Разбиение группы томов
сжатие, Удаление физических томов из группы
слияние, Объединение групп томов
создание в кластере, Создание групп томов в кластере
увеличение, Добавление физических томов в группу
удаление, Удаление групп томов
уменьшение, Удаление физических томов из группы
управление, общие принципы, Управление группами
группы томов
создание, Создание групп томов
деактивация групп томов
на единственном узле, Активация и деактивация групп томов
только на локальном узле, Активация и деактивация групп томов
деактивация группы томов, Активация и деактивация групп томов
диагностика проблем, Диагностика проблем
единицы в командах, Использование команд
единицы, командная строка, Использование команд
зеркальный логический том
восстановление, Восстановление после сбоя зеркала
изменение настроек, Изменение конфигурации зеркальных томов
кластерный, Создание зеркального логического тома в кластере
определение, Зеркальный том
политика сбоя, Правила работы при сбое зеркального тома
преобразование в линейный, Изменение конфигурации зеркальных томов
создание, Создание зеркальных томов
изменение размера
логический том, Изменение размера логических томов
физический том, Изменение размера физического тома
инициализация
разделы, Инициализация физических томов
физический том, Инициализация физических томов
каталог rules.d, Интеграция udev с Device Mapper
каталог специальных файлов устройств, Создание групп томов
кластерное окружение, CLVM, Создание томов LVM в кластере
команда lvchange, Изменение параметров группы логических томов
команда lvconvert, Изменение конфигурации зеркальных томов
команда lvcreate, Создание линейных логических томов
команда lvdisplay, Просмотр логических томов
команда lvextend, Увеличение размера логических томов
команда lvmdiskscan, Поиск блочных устройств
команда lvreduce, Изменение размера логических томов, Уменьшение размера логических томов
команда lvremove, Удаление логических томов
команда lvrename, Переименование логических томов
команда lvs, Настройка отчетов LVM, Команда lvs
аргументы вывода, Команда lvs
команда lvscan, Просмотр логических томов
команда pvdisplay, Просмотр физических томов
команда pvmove, Перенос данных в активной системе
команда pvremove, Удаление физических томов
команда pvresize, Изменение размера физического тома
команда pvs, Настройка отчетов LVM
аргументы, Команда pvs
команда pvscan, Просмотр физических томов
команда vgcfbackup, Создание резервной копии метаданных группы томов
команда vgcfrestore, Создание резервной копии метаданных группы томов
команда vgchange, Изменение параметров группы томов
команда vgcreate, Создание групп томов, Создание групп томов в кластере
команда vgdisplay, Просмотр групп томов
команда vgexport, Перенос группы томов в другую систему
команда vgextend, Добавление физических томов в группу
команда vgimport, Перенос группы томов в другую систему
команда vgmerge, Объединение групп томов
команда vgmknodes, Восстановление каталога группы томов
команда vgreduce, Удаление физических томов из группы
команда vgrename, Переименование группы томов
команда vgs, Настройка отчетов LVM
аргументы, Команда vgs
команда vgscan, Поиск групп томов на дисках
команда vgsplit, Разбиение группы томов
линейный логический том
определение, Линейный том
преобразование в зеркальный, Изменение конфигурации зеркальных томов
создание, Создание линейных логических томов
логический том
зеркальный, Создание зеркальных томов
изменение параметров, Изменение параметров группы логических томов
изменение размера, Изменение размера логических томов
команда lvs, Команда lvs
линейный, Создание линейных логических томов
локальный доступ, Активация логических томов на отдельных узлах кластера
монопольный доступ, Активация логических томов на отдельных узлах кластера
наращивание, Увеличение размера логических томов
определение, Логический том, Логический том
переименование, Переименование логических томов
пример создания, Создание логического тома на трех дисках
просмотр, Просмотр логических томов, Настройка отчетов LVM, Команда lvs
с чередованием, Создание томов с чередованием
сжатие, Уменьшение размера логических томов
снимок, Создание снимков
создание, Создание линейных логических томов
увеличение, Увеличение размера логических томов
удаление, Удаление логических томов
уменьшение, Уменьшение размера логических томов
управление, общие принципы, Управление логическими томами
логический том с чередованием
наращивание, Увеличение тома с чередованием
определение, Том с чередованием
пример создания, Создание логического тома с чередованием
создание, Создание томов с чередованием
увеличение, Увеличение тома с чередованием
логический том-снимок
создание, Создание снимков
менеджер устройств udev, Поддержка udev
метаданные
восстановление, Восстановление метаданных физического тома
резервное копирование, Резервное копирование логического тома, Создание резервной копии метаданных группы томов
номера устройств
младший, Постоянные номера устройств
постоянные, Постоянные номера устройств
старший, Постоянные номера устройств
обзор
возможности, новые и обновленные, Новые и обновленные возможности
окно справки, Использование команд
определение устройств, фильтры, Определение устройств LVM с помощью фильтров
отзывы
контактная информация, Отзывы и предложения
параметр mirror_image_fault_policy, Правила работы при сбое зеркального тома
параметр mirror_log_fault_policy, Правила работы при сбое зеркального тома
переименование
группа томов, Переименование группы томов
логический том, Переименование логических томов
перенос данных в работающей системе, Перенос данных в активной системе
перенос данных, онлайн, Перенос данных в активной системе
подробный вывод, Использование команд
поиск
блочные устройства, Поиск блочных устройств
постоянные номера устройств, Постоянные номера устройств
правила udev, Интеграция udev с Device Mapper
примеры конфигурации, Примеры конфигурации LVM
просмотр
группы томов, Просмотр групп томов, Команда vgs
логический том, Просмотр логических томов, Команда lvs
физический том, Просмотр физических томов, Команда pvs
форматирование вывода, Форматирование вывода
просмотр справочной страницы, Использование команд
пути, Использование команд
пути к устройствам, Использование команд
разделы
несколько, Диски с несколькими разделами
размер устройства, Создание групп томов
резервное копирование
метаданные, Резервное копирование логического тома, Создание резервной копии метаданных группы томов
файл, Резервное копирование логического тома
сбойные устройства
просмотр, Получение информации о неисправных устройствах
служба clvmd, CLVM
снимок
определение, Снимки
создание
группа томов, Создание групп томов в кластере
группы томов, Создание групп томов
логический том, Создание линейных логических томов
логический том с чередованием, пример, Создание логического тома с чередованием
логический том, пример, Создание логического тома на трех дисках
тома LVM в кластере, Создание томов LVM в кластере
физический том, Создание физических томов
создание томов LVM
обзор, Создание логического тома
сообщение о нехватке свободных экстентов, Нехватка свободных экстентов для логического тома
тип раздела, настройка, Настройка типов разделов
увеличение файловой системы
логический том, Увеличение файловой системы логического тома
удаление
диска из логического тома, Удаление диска из логического тома
логический том, Удаление логических томов
физический том, Удаление физических томов
файл archive, Создание резервной копии метаданных группы томов
файл backup, Создание резервной копии метаданных группы томов
файл кэша
создание, Поиск групп томов на дисках
файловая система
увеличение логического тома, Увеличение файловой системы логического тома
физический том
аргументы команды pvs, Команда pvs
восстановление, Замена физического тома
добавление в группу томов, Добавление физических томов в группу
изменение размера, Изменение размера физического тома
инициализация, Инициализация физических томов
определение, Физический том
пример, Структура физического тома
просмотр, Просмотр физических томов, Настройка отчетов LVM, Команда pvs
создание, Создание физических томов
структура, Структура физического тома
удаление, Удаление физических томов
удаление из группы, Удаление физических томов из группы
удаление из группы томов, Удаление физических томов из группы
управление, общие принципы, Управление физическими томами
физический экстент
запрет выделения, Запрет выделения пространства физического тома
фильтры, Определение устройств LVM с помощью фильтров
фильтры определения устройств, Определение устройств LVM с помощью фильтров
формат отчета, устройства LVM, Настройка отчетов LVM
экстент
выделение пространства, Создание групп томов
определение, Группа томов, Создание групп томов

L

LVM
ведение журнала, Журнал событий
группа томов, определение, Группа томов
история, Обзор архитектуры LVM
кластерный, CLVM
компоненты, Обзор архитектуры LVM, Компоненты LVM
метка, Физический том
обзор архитектуры, Обзор архитектуры LVM
справка, Использование команд
структура каталогов, Создание групп томов
управление логическими томами, Управление логическими томами
управление физическими томами, Управление физическими томами
физический том, определение, Физический том
формат отчета, Настройка отчетов LVM
LVM1, Обзор архитектуры LVM
LVM2, Обзор архитектуры LVM

Юридическое уведомление

Copyright © 2011 Red Hat, Inc. and others.

This document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed.

Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.

Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

Время на прочтение
4 мин

Количество просмотров 560K

Собственно, хочется просто и доступно рассказать про такую замечательную вещь как Logical Volume Management или Управление Логическими Томами.
Поскольку уже давно пользуюсь LVM-ом, расскажу что он значит именно для меня, не подглядывая в мануалы и не выдёргивая цитаты из wiki, своими словами, чтобы было понятно именно тем кто ничего о нем не знает. Постараюсь сразу не рассказывать о всяческих «продвинутых» функциях типа страйпов, снапшотов и т.п.

LVM — это дополнительный слой абстракции от железа, позволяющий собрать кучи разнородных дисков в один, и затем снова разбить этот один именно так как нам хочется.

есть 3 уровня абстракции:
1. PV (Physical Volume) — физические тома (это могут быть разделы или целые «неразбитые» диски)
2. VG (Volume Group) — группа томов (объединяем физические тома (PV) в группу, создаём единый диск, который будем дальше разбивать так, как нам хочется)
3. LV (Logical Volume) — логические разделы, собственно раздел нашего нового «единого диска» ака Группы Томов, который мы потом форматируем и используем как обычный раздел, обычного жёсткого диска.
это пожалуй вся теория. :) теперь практика:
для работы нужны пакеты lvm2 и возможность работать с привелегиями root поэтому:
$ sudo bash
# apt-get install lvm2

допустим у нас в компе есть жёсткий диск на 40Гб и нам удалось наскрести немного денег и наконец-то купить себе ТЕРАБАЙТНИК! :))) Система уже стоит и работает, и первый диск разбит одним разделом (/dev/sda1 как / ), второй — самый большой, который мы только подключили — вообще не разбит /dev/sdb…
Предлагаю немножко разгрузить корневой диск, а заодно ускорить (новый диск работает быстрее старого) и «обезопасить» систему с помощью lvm.
Можно делать на втором диске разделы и добавлять их в группы томов (если нам нужно несколько групп томов),
а можно вообще не делать на диске разделы и всё устройство сделать физическим разделом (PV)

root@ws:~# pvcreate /dev/sdb
Physical volume «/dev/sdb» successfully created

Создаём группу томов с говорящим названием, например по имени машины «ws», чтобы когда мы перетащим данный диск на другую машину небыло конфликтов с именами групп томов:

root@ws:~# vgcreate ws /dev/sdb
Volume group «vg0» successfully created

желательно внести с корневого раздела такие папки как /usr /var /tmp /home, чтобы не дефрагментировать лишний раз корневой раздел и ни в коем случае его не переполнить, поэтому создаём разделы:

root@ws:~# lvcreate -n usr -L10G ws # здесь мы создаём раздел с именем «usr», размером 10Gb
Logical volume «usr» created
по аналогии делаем то же для /var, /tmp, /home:
root@ws:~# lvcreate -n var -L10G ws
root@ws:~# lvcreate -n tmp -L2G ws
root@ws:~# lvcreate -n home -L500G ws
у нас ещё осталось немного свободного места в группе томов (например для будущего раздела под бэкап)
посмотреть сколько именно можно командой:
root@ws:~# vgdisplay
информацию по созданным логическим томам
root@ws:~# lvdisplay
информацию по физическим томам
root@ws:~# pvdisplay

разделы что мы создали появятся в папке /dev/[имя_vg]/, точнее там будут ссылки на файлы,
lrwxrwxrwx 1 root root 22 2009-08-10 18:35 swap -> /dev/mapper/ws-swap
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 tmp -> /dev/mapper/ws-tmp
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 usr -> /dev/mapper/ws-usr
lrwxrwxrwx 1 root root 21 2009-08-10 18:35 var -> /dev/mapper/ws-var
и т.д…

дальше lvm уже почти кончается… форматируем наши разделы в любимые файловые системы:
root@ws:~# mkfs.ext2 -L tmp /dev/ws/tmp
root@ws:~# mkfs.ext4 -L usr /dev/ws/usr
root@ws:~# mkfs.ext4 -L var /dev/ws/var
root@ws:~# mkfs.ext4 -L home /dev/ws/home

кстати, не плохо было бы сделать раздел подкачки:
root@ws:~# lvcreate -n swap -L2G ws
root@ws:~# mkswap -L swap /dev/ws/swap
root@ws:~# swapon /dev/ws/swap

создаём папку и подключая по очереди новообразовавшиеся тома, копируем в них нужное содержимое:
root@ws:~# mkdir /mnt/target
root@ws:~# mount /dev/ws/home /mnt/target
копируем туда всё из папки /home своим любимым файловым менеджером (с сохранением прав доступа), например так ;):
root@ws:~# cp -a /home/* /mnt/target/
root@ws:~# umount /mnt/target/
кстати, для папки temp необходимо только поправить права, копировать туда что-либо необязательно:
root@ws:~# mount /dev/ws/tmp /mnt/target && chmod -R a+rwx /mnt/target && umount /mnt/target/
добавляем нужные строчки в /etc/fstab, например такие:
/dev/mapper/ws-home /home ext4 relatime 0 2
/dev/mapper/ws-tmp /tmp ext2 noatime 0 2
/dev/mapper/ws-swap none swap sw 0 0
и перезагружаемся… (продвинутые господа могут обойтись без перезагрузки ;))

На вкусное, хочу предложить более продвинутую штуку:
допустим у нас есть система с разделом на LVM, а жёсткий диск начал сбоить, тогда мы можем без перезагрузки переместить всю систему на другой жёсткий диск/раздел:

# On-line добавление/удаление жёстких дисков с помощью LVM (пример)

root@ws:~# pvcreate /dev/sda1 # наш эмулятор сбойного диска
Physical volume «/dev/sda1» successfully created

root@ws:~# pvcreate /dev/sdb1 # наш эмулятор спасательного диска
Physical volume «/dev/sdb1» successfully created

root@ws:~# vgcreate vg0 /dev/sda1 # создаю группу томов vg0
Volume group «vg0» successfully created

root@ws:~# lvcreate -n test -L10G vg0 #создаю раздел для «важной» инфы
Logical volume «test» created

root@ws:~# mkfs.ext2 /dev/vg0/test # создаю файловую систему на разделе
root@ws:~# mount /dev/mapper/vg0-test /mnt/tmp/ #монтирую раздел
… # заполняю его информацией, открываю на нем несколько файлов и т.п.

root@ws:~# vgextend vg0 /dev/sdb1 # расширяю нашу групу томов на «спасательный» диск
Volume group «vg0» successfully extended

root@work:~# pvmove /dev/sda1 /dev/sdb1 #передвигаю содержимое с «умирающего» диска на «спасательный»
/dev/sda1: Moved: 0.9%
/dev/sda1: Moved: 1.8%

/dev/sda1: Moved: 99.7%
/dev/sda1: Moved: 100.0%

root@work:~# vgreduce vg0 /dev/sda1 # убираю «умирающий» диск из группы томов.
Removed «/dev/sda1» from volume group «vg0»

Итого:
Я создал логический раздел, отформатировал его, примонтировал и заполнил нужными данными, затем переместил его с одного устройства на другое, при этом раздел остался примонтирован и данные всё время оставались доступны!
Подобным образом мне удавалось без перезагрузки перенести всю систему с умирающего диска на рэид-массив. :)

А это моя любимая ссылка по LVM: xgu.ru/wiki/LVM

P.S. Прошу простить за опечатки, меня постоянно отвлекали =))

P.P.S. Ах, да!!! Самое главное и самый большой минус LVM — он не читается grub’ом
поэтому раздел /boot должен находиться вне LVM на отдельном разделе жёсткого диска,
иначе система не загрузится.

Понравилась статья? Поделить с друзьями:
  • Сумамед для детей суспензия цена инструкция по применению 100
  • Мануал при цистите у женщин
  • Набор для творчества эбру рисование на воде инструкция
  • Хондроитин вертекс капсулы инструкция по применению взрослым
  • Таблица руководство исследования