logical volume management
(Written by Paul Cobbaut, https://github.com/paulcobbaut/, with contributions by: Alex M. Schapelle, https://github.com/zero-pytagoras/)
Most lvm
implementations support
physical storage grouping
, logical volume resizing
and
data migration
.
Physical storage grouping is a fancy name for grouping multiple block devices (hard disks, but also iSCSI etc) into a logical mass storage device. To enlarge this physical group, block devices (including partitions) can be added at a later time.
The size of lvm volumes
on this physical group
is independent of the
individual size of the components. The total size of the group is the
limit.
One of the nice features of lvm
is the logical volume resizing. You
can increase the size of an lvm volume
, sometimes even without any
downtime. Additionally, you can migrate data away from a failing hard
disk device, create mirrors and create snapshots.
introduction to lvm
problems with standard partitions
There are some problems when working with hard disks and standard partitions. Consider a system with a small and a large hard disk device, partitioned like this. The first disk (/dev/sda) is partitioned in two, the second disk (/dev/sdb) has two partitions and some empty space.
In the example above, consider the options when you want to enlarge the
space available for /srv/project42
. What can you do ? The solution
will always force you to unmount the file system, take a backup of the
data, remove and recreate partitions, and then restore the data and
remount the file system.
solution with lvm
Using lvm
will create a virtual layer between the mounted file systems
and the hardware devices. This virtual layer will allow for an
administrator to enlarge a mounted file system in use. When lvm
is
properly used, then there is no need to unmount the file system to
enlarge it.
lvm terminology
physical volume (pv)
A physical volume
is any block device (a disk, a partition, a RAID
device or even an iSCSI device). All these devices can become a member
of a volume group
.
The commands used to manage a physical volume
start with pv.
[root@linux ~]# pv
pvchange pvck pvcreate pvdisplay pvmove pvremove
pvresize pvs pvscan
volume group (vg)
A volume group
is an abstraction layer between block devices
and
logical volumes
.
The commands used to manage a volume group
start with vg.
[root@linux ~]# vg
vgcfgbackup vgconvert vgextend vgmknodes vgs
vgcfgrestore vgcreate vgimport vgreduce vgscan
vgchange vgdisplay vgimportclone vgremove vgsplit
vgck vgexport vgmerge vgrename
logical volume (lv)
A logical volume
is created in a volume group
. Logical volumes that
contain a file system can be mounted. The use of logical volumes
is
similar to the use of partitions
and is accomplished with the same
standard commands (mkfs, mount, fsck, df, ...).
The commands used to manage a logical volume
start with lv.
[root@linux ~]# lv
lvchange lvextend lvmdiskscan lvmsar lvresize
lvconvert lvm lvmdump lvreduce lvs
lvcreate lvmchange lvmetad lvremove lvscan
lvdisplay lvmconf lvmsadc lvrename
example: using lvm
This example shows how you can use a device (in this case /dev/sdc, but it could have been /dev/sdb or any other disk or partition) with lvm, how to create a volume group (vg) and how to create and use a logical volume (vg/lvol0).
First thing to do, is create physical volumes that can join the volume
group with pvcreate
. This command makes a disk or
partition available for use in Volume Groups. The screenshot shows how
to present the SCSI Disk device to LVM.
root@RHEL4:~# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
Note: lvm will
work fine when using the complete device, but another
operating system on the same computer (or on the same SAN) will not
recognize lvm and will mark the block device as being empty! You can
avoid this by creating a partition that spans the whole device, then run
pvcreate
on the partition instead of the disk.
Then vgcreate
creates a volume group using one device.
Note that more devices could be added to the volume group.
root@RHEL4:~# vgcreate vg /dev/sdc
Volume group "vg" successfully created
The last step lvcreate
creates a logical volume.
root@RHEL4:~# lvcreate --size 500m vg
Logical volume "lvol0" created
The logical volume /dev/vg/lvol0 can now be formatted with ext3, and mounted for normal use.
root@linux:~# mke2fs -m0 -j /dev/vg/lvol0
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
128016 inodes, 512000 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
63 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@linux:~# mkdir /home/project10
root@linux:~# mount /dev/vg/lvol0 /home/project10/
root@linux:~# df -h | grep proj
/dev/mapper/vg-lvol0 485M 11M 474M 3% /home/project10
A logical volume is very similar to a partition, it can be formatted with a file system, and can be mounted so users can access it.
example: extend a logical volume
A logical volume can be extended without unmounting the file system. Whether or not a volume can be extended depends on the file system it uses. Volumes that are mounted as vfat or ext2 cannot be extended, so in the example here we use the ext3 file system.
The fdisk command shows us newly added scsi-disks that will serve our lvm volume. This volume will then be extended. First, take a look at these disks.
[root@linux ~]# fdisk -l | grep sd[bc]
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdb: 1181 MB, 1181115904 bytes
Disk /dev/sdc: 429 MB, 429496320 bytes
You already know how to partition a disk, below the first disk is partitioned (in one big primary partition), the second disk is left untouched.
[root@linux ~]# fdisk -l | grep sd[bc]
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdb: 1181 MB, 1181115904 bytes
/dev/sdb1 1 143 1148616 83 Linux
Disk /dev/sdc: 429 MB, 429496320 bytes
You also know how to prepare disks for lvm with
pvcreate
, and how to create a volume group with
vgcreate
. This example adds both the partitioned disk
and the untouched disk to the volume group named vg2
.
[root@linux ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@linux ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
[root@linux ~]# vgcreate vg2 /dev/sdb1 /dev/sdc
Volume group "vg2" successfully created
You can use pvdisplay
to verify that both the disk and
the partition belong to the volume group.
[root@linux ~]# pvdisplay | grep -B1 vg2
PV Name /dev/sdb1
VG Name vg2
--
PV Name /dev/sdc
VG Name vg2
And you are familiar both with the lvcreate
command to
create a small logical volume and the mke2fs
command to
put ext3 on it.
[root@linux ~]# lvcreate --size 200m vg2
Logical volume "lvol0" created
[root@linux ~]# mke2fs -m20 -j /dev/vg2/lvol0
...
As you see, we end up with a mounted logical volume that according to
df
is almost 200 megabyte in size.
[root@linux ~]# mkdir /home/resizetest
[root@linux ~]# mount /dev/vg2/lvol0 /home/resizetest/
[root@linux ~]# df -h | grep resizetest
194M 5.6M 149M 4% /home/resizetest
Extending the volume is easy with lvextend
.
[root@linux ~]# lvextend -L +100 /dev/vg2/lvol0
Extending logical volume lvol0 to 300.00 MB
Logical volume lvol0 successfully resized
But as you can see, there is a small problem: it appears that df is not able to display the extended volume in its full size. This is because the filesystem is only set for the size of the volume before the extension was added.
[root@linux ~]# df -h | grep resizetest
194M 5.6M 149M 4% /home/resizetest
With lvdisplay
however we can see that the volume is
indeed extended.
[root@linux ~]# lvdisplay /dev/vg2/lvol0 | grep Size
LV Size 300.00 MB
To finish the extension, you need resize2fs
to span the
filesystem over the full size of the logical volume.
[root@linux ~]# resize2fs /dev/vg2/lvol0
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg2/lvol0 is mounted on /home/resizetest; on-line re\
sizing required
Performing an on-line resize of /dev/vg2/lvol0 to 307200 (1k) blocks.
The filesystem on /dev/vg2/lvol0 is now 307200 blocks long.
Congratulations, you just successfully expanded a logical volume.
[root@linux ~]# df -h | grep resizetest
291M 6.1M 225M 3% /home/resizetest
[root@linux ~]#
example: resize a physical Volume
This is a humble demonstration of how to resize a physical Volume with lvm (after you resize it with fdisk). The demonstration starts with a 100MB partition named /dev/sde1. We used fdisk to create it, and to verify the size.
[root@linux ~]# fdisk -l 2>/dev/null | grep sde1
/dev/sde1 1 100 102384 83 Linux
[root@linux ~]#
Now we can use pvcreate to create the Physical Volume, followed by pvs to verify the creation.
[root@linux ~]# pvcreate /dev/sde1
Physical volume "/dev/sde1" successfully created
[root@linux ~]# pvs | grep sde1
/dev/sde1 lvm2 -- 99.98M 99.98M
[root@linux ~]#
The next step is to use fdisk to enlarge the partition (actually deleting it and then recreating /dev/sde1 with more cylinders).
[root@linux ~]# fdisk /dev/sde
Command (m for help): p
Disk /dev/sde: 858 MB, 858993152 bytes
64 heads, 32 sectors/track, 819 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/sde1 1 100 102384 83 Linux
Command (m for help): d
Selected partition 1
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
Value out of range.
Partition number (1-4): 1
First cylinder (1-819, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-819, default 819): 200
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@linux ~]#
When we now use fdisk and pvs to verify the size of the partition and the Physical Volume, then there is a size difference. LVM is still using the old size.
[root@linux ~]# fdisk -l 2>/dev/null | grep sde1
/dev/sde1 1 200 204784 83 Linux
[root@linux ~]# pvs | grep sde1
/dev/sde1 lvm2 -- 99.98M 99.98M
[root@linux ~]#
Executing pvresize on the Physical Volume will make lvm aware of the size change of the partition. The correct size can be displayed with pvs.
[root@linux ~]# pvresize /dev/sde1
Physical volume "/dev/sde1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
[root@linux ~]# pvs | grep sde1
/dev/sde1 lvm2 -- 199.98M 199.98M
[root@linux ~]#
example: mirror a logical volume
We start by creating three physical volumes for lvm. Then we verify the creation and the size with pvs. Three physical disks because lvm uses two disks for the mirror and a third disk for the mirror log!
[root@linux ~]# 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
[root@linux ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 -- 409.60M 409.60M
/dev/sdc lvm2 -- 409.60M 409.60M
/dev/sdd lvm2 -- 409.60M 409.60M
Then we create the Volume Group and verify again with pvs. Notice how the three physical volumes now belong to vg33, and how the size is rounded down (in steps of the extent size, here 4MB).
[root@linux ~]# vgcreate vg33 /dev/sdb /dev/sdc /dev/sdd
Volume group "vg33" successfully created
[root@linux ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup00 lvm2 a- 15.88G 0
/dev/sdb vg33 lvm2 a- 408.00M 408.00M
/dev/sdc vg33 lvm2 a- 408.00M 408.00M
/dev/sdd vg33 lvm2 a- 408.00M 408.00M
[root@linux ~]#
The last step is to create the Logical Volume with lvcreate
. Notice
the -m 1
switch to create one mirror. Notice also the change in free
space in all three Physical Volumes!
[root@linux ~]# lvcreate --size 300m -n lvmir -m 1 vg33
Logical volume "lvmir" created
[root@linux ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup00 lvm2 a- 15.88G 0
/dev/sdb vg33 lvm2 a- 408.00M 108.00M
/dev/sdc vg33 lvm2 a- 408.00M 108.00M
/dev/sdd vg33 lvm2 a- 408.00M 404.00M
You can see the copy status of the mirror with lvs. It currently shows a 100 percent copy.
[root@linux ~]# lvs vg33/lvmir
LV VG Attr LSize Origin Snap% Move Log Copy%
lvmir vg33 mwi-ao 300.00M lvmir_mlog 100.00
example: snapshot a logical volume
A snapshot is a virtual copy of all the data at a point in time on a volume. A snapshot Logical Volume will retain a copy of all changed files of the snapshotted Logical Volume.
The example below creates a snapshot of the bigLV Logical Volume.
[root@linux ~]# lvcreate -L100M -s -n snapLV vg42/bigLV
Logical volume "snapLV" created
[root@linux ~]#
You can see with lvs that the snapshot snapLV is indeed a snapshot of bigLV. Moments after taking the snapshot, there are few changes to bigLV (0.02 percent).
[root@linux ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
bigLV vg42 owi-a- 200.00M
snapLV vg42 swi-a- 100.00M bigLV 0.02
[root@linux ~]#
But after using bigLV for a while, more changes are done. This means the snapshot volume has to keep more original data (10.22 percent).
[root@linux ~]# lvs | grep vg42
bigLV vg42 owi-ao 200.00M
snapLV vg42 swi-a- 100.00M bigLV 10.22
[root@linux ~]#
You can now use regular backup tools (dump, tar, cpio, ...) to take a backup of the snapshot Logical Volume. This backup will contain all data as it existed on bigLV at the time the snapshot was taken. When the backup is done, you can remove the snapshot.
[root@linux ~]# lvremove vg42/snapLV
Do you really want to remove active logical volume "snapLV"? [y/n]: y
Logical volume "snapLV" successfully removed
[root@linux ~]#
verifying existing physical volumes
lvmdiskscan
To get a list of block devices that can be used with LVM, use
lvmdiskscan
. The example below uses grep to limit the
result to SCSI devices.
[root@linux ~]# lvmdiskscan | grep sd
/dev/sda1 [ 101.94 MB]
/dev/sda2 [ 15.90 GB] LVM physical volume
/dev/sdb [ 409.60 MB]
/dev/sdc [ 409.60 MB]
/dev/sdd [ 409.60 MB] LVM physical volume
/dev/sde1 [ 95.98 MB]
/dev/sde5 [ 191.98 MB]
/dev/sdf [ 819.20 MB] LVM physical volume
/dev/sdg1 [ 818.98 MB]
[root@linux ~]#
pvs
The easiest way to verify whether devices are known to lvm is with the
pvs
command. The screenshot below shows that only
/dev/sda2 is currently known for use with LVM. It shows that /dev/sda2
is part of Volgroup00 and is almost 16GB in size. It also shows /dev/sdc
and /dev/sdd as part of vg33. The device /dev/sdb is knwon to lvm, but
not linked to any Volume Group.
[root@linux ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 VolGroup00 lvm2 a- 15.88G 0
/dev/sdb lvm2 -- 409.60M 409.60M
/dev/sdc vg33 lvm2 a- 408.00M 408.00M
/dev/sdd vg33 lvm2 a- 408.00M 408.00M
[root@linux ~]#
pvscan
The pvscan
command will scan all disks for existing
Physical Volumes. The information is similar to pvs, plus you get a line
with total sizes.
[root@linux ~]# pvscan
PV /dev/sdc VG vg33 lvm2 [408.00 MB / 408.00 MB free]
PV /dev/sdd VG vg33 lvm2 [408.00 MB / 408.00 MB free]
PV /dev/sda2 VG VolGroup00 lvm2 [15.88 GB / 0 free]
PV /dev/sdb lvm2 [409.60 MB]
Total: 4 [17.07 GB] / in use: 3 [16.67 GB] / in no VG: 1 [409.60 MB]
[root@linux ~]#
pvdisplay
Use pvdisplay
to get more information about physical
volumes. You can also use pvdisplay
without an argument to display
information about all physical (lvm) volumes.
[root@linux ~]# pvdisplay /dev/sda2
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup00
PV Size 15.90 GB / not usable 20.79 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 508
Free PE 0
Allocated PE 508
PV UUID TobYfp-Ggg0-Rf8r-xtLd-5XgN-RSPc-8vkTHD
[root@linux ~]#
verifying existing volume groups
vgs
Similar to pvs
is the use of vgs
to display a quick
overview of all volume groups. There is only one volume group in the
screenshot below, it is named VolGroup00 and is almost 16GB in size.
[root@linux ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup00 1 2 0 wz--n- 15.88G 0
[root@linux ~]#
vgscan
The vgscan
command will scan all disks for existing
Volume Groups. It will also update the /etc/lvm/.cache
file. This file contains a list of all current lvm devices.
[root@linux ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup00" using metadata type lvm2
[root@linux ~]#
LVM will run the vgscan automatically at boot-up, so if you add hot swap devices, then you will need to run vgscan to update /etc/lvm/.cache with the new devices.
vgdisplay
The vgdisplay
command will give you more detailed
information about a volume group (or about all volume groups if you omit
the argument).
[root@linux ~]# vgdisplay VolGroup00
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 15.88 GB
PE Size 32.00 MB
Total PE 508
Alloc PE / Size 508 / 15.88 GB
Free PE / Size 0 / 0
VG UUID qsXvJb-71qV-9l7U-ishX-FobM-qptE-VXmKIg
[root@linux ~]#
verifying existing logical volumes
lvs
Use lvs
for a quick look at all existing logical
volumes. Below you can see two logical volumes named LogVol00 and
LogVol01.
[root@linux ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
LogVol00 VolGroup00 -wi-ao 14.88G
LogVol01 VolGroup00 -wi-ao 1.00G
[root@linux ~]#
lvscan
The lvscan
command will scan all disks for existing
Logical Volumes.
[root@linux ~]# lvscan
ACTIVE '/dev/VolGroup00/LogVol00' [14.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
[root@linux ~]#
lvdisplay
More detailed information about logical volumes is available through the
lvdisplay(1)
command.
[root@linux ~]# lvdisplay VolGroup00/LogVol01
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID RnTGK6-xWsi-t530-ksJx-7cax-co5c-A1KlDp
LV Write Access read/write
LV Status available
# open 1
LV Size 1.00 GB
Current LE 32
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1
[root@linux ~]#
manage physical volumes
pvcreate
Use the pvcreate
command to add devices to lvm. This
example shows how to add a disk (or hardware RAID device) to lvm.
[root@linux ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
[root@linux ~]#
This example shows how to add a partition to lvm.
[root@linux ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created
[root@linux ~]#
You can also add multiple disks or partitions as target to pvcreate. This example adds three disks to lvm.
[root@linux ~]# pvcreate /dev/sde /dev/sdf /dev/sdg
Physical volume "/dev/sde" successfully created
Physical volume "/dev/sdf" successfully created
Physical volume "/dev/sdg" successfully created
[root@linux ~]#
pvremove
Use the pvremove
command to remove physical volumes from
lvm. The devices may not be in use.
[root@linux ~]# pvremove /dev/sde /dev/sdf /dev/sdg
Labels on physical volume "/dev/sde" successfully wiped
Labels on physical volume "/dev/sdf" successfully wiped
Labels on physical volume "/dev/sdg" successfully wiped
[root@linux ~]#
pvresize
When you used fdisk to resize a partition on a disk, then you must use
pvresize
to make lvm recognize the new size of the
physical volume that represents this partition.
[root@linux ~]# pvresize /dev/sde1
Physical volume "/dev/sde1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
pvchange
With pvchange
you can prevent the allocation of a
Physical Volume in a new Volume Group or Logical Volume. This can be
useful if you plan to remove a Physical Volume.
[root@linux ~]# pvchange -xn /dev/sdd
Physical volume "/dev/sdd" changed
1 physical volume changed / 0 physical volumes not changed
[root@linux ~]#
To revert your previous decision, this example shows you how te re-enable the Physical Volume to allow allocation.
[root@linux ~]# pvchange -xy /dev/sdd
Physical volume "/dev/sdd" changed
1 physical volume changed / 0 physical volumes not changed
[root@linux ~]#
pvmove
With pvmove
you can move Logical Volumes from within a
Volume Group to another Physical Volume. This must be done before
removing a Physical Volume.
[root@linux ~]# pvs | grep vg1
/dev/sdf vg1 lvm2 a- 816.00M 0
/dev/sdg vg1 lvm2 a- 816.00M 816.00M
[root@linux ~]# pvmove /dev/sdf
/dev/sdf: Moved: 70.1%
/dev/sdf: Moved: 100.0%
[root@linux ~]# pvs | grep vg1
/dev/sdf vg1 lvm2 a- 816.00M 816.00M
/dev/sdg vg1 lvm2 a- 816.00M 0
manage volume groups
vgcreate
Use the vgcreate
command to create a volume group. You
can immediately name all the physical volumes that span the volume
group.
[root@linux ~]# vgcreate vg42 /dev/sde /dev/sdf
Volume group "vg42" successfully created
[root@linux ~]#
vgextend
Use the vgextend
command to extend an existing volume
group with a physical volume.
[root@linux ~]# vgextend vg42 /dev/sdg
Volume group "vg42" successfully extended
[root@linux ~]#
vgremove
Use the vgremove
command to remove volume groups from
lvm. The volume groups may not be in use.
[root@linux ~]# vgremove vg42
Volume group "vg42" successfully removed
[root@linux ~]#
vgreduce
Use the vgreduce
command to remove a Physical Volume
from the Volume Group.
The following example adds Physical Volume /dev/sdg to the vg1 Volume Group using vgextend. And then removes it again using vgreduce.
[root@linux ~]# pvs | grep sdg
/dev/sdg lvm2 -- 819.20M 819.20M
[root@linux ~]# vgextend vg1 /dev/sdg
Volume group "vg1" successfully extended
[root@linux ~]# pvs | grep sdg
/dev/sdg vg1 lvm2 a- 816.00M 816.00M
[root@linux ~]# vgreduce vg1 /dev/sdg
Removed "/dev/sdg" from volume group "vg1"
[root@linux ~]# pvs | grep sdg
/dev/sdg lvm2 -- 819.20M 819.20M
vgchange
Use the vgchange
command to change parameters of a
Volume Group.
This example shows how to prevent Physical Volumes from being added or removed to the Volume Group vg1.
[root@linux ~]# vgchange -xn vg1
Volume group "vg1" successfully changed
[root@linux ~]# vgextend vg1 /dev/sdg
Volume group vg1 is not resizable.
You can also use vgchange to change most other properties of a Volume Group. This example changes the maximum number of Logical Volumes and maximum number of Physical Volumes that vg1 can serve.
[root@linux ~]# vgdisplay vg1 | grep -i max
MAX LV 0
Max PV 0
[root@linux ~]# vgchange -l16 vg1
Volume group "vg1" successfully changed
[root@linux ~]# vgchange -p8 vg1
Volume group "vg1" successfully changed
[root@linux ~]# vgdisplay vg1 | grep -i max
MAX LV 16
Max PV 8
vgmerge
Merging two Volume Groups into one is done with vgmerge
.
The following example merges vg2 into vg1, keeping all the properties of
vg1.
[root@linux ~]# vgmerge vg1 vg2
Volume group "vg2" successfully merged into "vg1"
[root@linux ~]#
manage logical volumes
lvcreate
Use the lvcreate
command to create Logical Volumes in a
Volume Group. This example creates an 8GB Logical Volume in Volume Group
vg42.
[root@linux ~]# lvcreate -L5G vg42
Logical volume "lvol0" created
[root@linux ~]#
As you can see, lvm automatically names the Logical Volume
lvol0
. The next example creates a 200MB Logical Volume
named MyLV in Volume Group vg42.
[root@linux ~]# lvcreate -L200M -nMyLV vg42
Logical volume "MyLV" created
[root@linux ~]#
The next example does the same thing, but with different syntax.
[root@linux ~]# lvcreate --size 200M -n MyLV vg42
Logical volume "MyLV" created
[root@linux ~]#
This example creates a Logical Volume that occupies 10 percent of the Volume Group.
[root@linux ~]# lvcreate -l 10%VG -n MyLV2 vg42
Logical volume "MyLV2" created
[root@linux ~]#
This example creates a Logical Volume that occupies 30 percent of the remaining free space in the Volume Group.
[root@linux ~]# lvcreate -l 30%FREE -n MyLV3 vg42
Logical volume "MyLV3" created
[root@linux ~]#
lvremove
Use the lvremove
command to remove Logical Volumes from
a Volume Group. Removing a Logical Volume requires the name of the
Volume Group.
[root@linux ~]# lvremove vg42/MyLV
Do you really want to remove active logical volume "MyLV"? [y/n]: y
Logical volume "MyLV" successfully removed
[root@linux ~]#
Removing multiple Logical Volumes will request confirmation for each individual volume.
[root@linux ~]# lvremove vg42/MyLV vg42/MyLV2 vg42/MyLV3
Do you really want to remove active logical volume "MyLV"? [y/n]: y
Logical volume "MyLV" successfully removed
Do you really want to remove active logical volume "MyLV2"? [y/n]: y
Logical volume "MyLV2" successfully removed
Do you really want to remove active logical volume "MyLV3"? [y/n]: y
Logical volume "MyLV3" successfully removed
[root@linux ~]#
lvextend
Extending the volume is easy with lvextend
. This example
extends a 200MB Logical Volume with 100 MB.
[root@linux ~]# lvdisplay /dev/vg2/lvol0 | grep Size
LV Size 200.00 MB
[root@linux ~]# lvextend -L +100 /dev/vg2/lvol0
Extending logical volume lvol0 to 300.00 MB
Logical volume lvol0 successfully resized
[root@linux ~]# lvdisplay /dev/vg2/lvol0 | grep Size
LV Size 300.00 MB
The next example creates a 100MB Logical Volume, and then extends it to 500MB.
[root@linux ~]# lvcreate --size 100M -n extLV vg42
Logical volume "extLV" created
[root@linux ~]# lvextend -L 500M vg42/extLV
Extending logical volume extLV to 500.00 MB
Logical volume extLV successfully resized
[root@linux ~]#
This example doubles the size of a Logical Volume.
[root@linux ~]# lvextend -l+100%LV vg42/extLV
Extending logical volume extLV to 1000.00 MB
Logical volume extLV successfully resized
[root@linux ~]#
lvrename
Renaming a Logical Volume is done with lvrename
. This
example renames extLV to bigLV in the vg42 Volume Group.
[root@linux ~]# lvrename vg42/extLV vg42/bigLV
Renamed "extLV" to "bigLV" in volume group "vg42"
[root@linux ~]#
practice : lvm
1. Create a volume group that contains a complete disk and a partition on another disk.
2. Create two logical volumes (a small one and a bigger one) in this volumegroup. Format them wih ext3, mount them and copy some files to them.
3. Verify usage with fdisk, mount, pvs, vgs, lvs, pvdisplay, vgdisplay, lvdisplay and df. Does fdisk give you any information about lvm?
4. Enlarge the small logical volume by 50 percent, and verify your work!
5. Take a look at other commands that start with vg* , pv* or lv*.
6. Create a mirror and a striped Logical Volume.
7. Convert a linear logical volume to a mirror.
8. Convert a mirror logical volume to a linear.
9. Create a snapshot of a Logical Volume, take a backup of the snapshot. Then delete some files on the Logical Volume, then restore your backup.
10. Move your volume group to another disk (keep the Logical Volumes mounted).
11. If time permits, split a Volume Group with vgsplit, then merge it again with vgmerge.
solution : lvm
1. Create a volume group that contains a complete disk and a partition on another disk.
step 1: select disks:
root@linux:~# fdisk -l | grep Disk
Disk /dev/sda: 8589 MB, 8589934592 bytes
Disk identifier: 0x00055ca0
Disk /dev/sdb: 1073 MB, 1073741824 bytes
Disk identifier: 0x00000000
Disk /dev/sdc: 1073 MB, 1073741824 bytes
Disk identifier: 0x00000000
...
I choose /dev/sdb and /dev/sdc for now.
step 2: partition /dev/sdc
root@linux:~# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disk\
label
Building a new DOS disklabel with disk identifier 0x94c0e5d5.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):
Using default value 130
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
step 3: pvcreate and vgcreate
root@linux:~# pvcreate /dev/sdb /dev/sdc1
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc1" successfully created
root@linux:~# vgcreate VG42 /dev/sdb /dev/sdc1
Volume group "VG42" successfully created
2. Create two logical volumes (a small one and a bigger one) in this volumegroup. Format them wih ext3, mount them and copy some files to them.
root@linux:~# lvcreate --size 200m --name LVsmall VG42
Logical volume "LVsmall" created
root@linux:~# lvcreate --size 600m --name LVbig VG42
Logical volume "LVbig" created
root@linux:~# ls -l /dev/mapper/VG42-LVsmall
lrwxrwxrwx. 1 root root 7 Apr 20 20:41 /dev/mapper/VG42-LVsmall -> ../dm-2
root@linux:~# ls -l /dev/VG42/LVsmall
lrwxrwxrwx. 1 root root 7 Apr 20 20:41 /dev/VG42/LVsmall -> ../dm-2
root@linux:~# ls -l /dev/dm-2
brw-rw----. 1 root disk 253, 2 Apr 20 20:41 /dev/dm-2
root@linux:~# mkfs.ext3 /dev/mapper/VG42-LVsmall
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@linux:~# mkfs.ext3 /dev/VG42/LVbig
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
38400 inodes, 153600 blocks
7680 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=159383552
5 block groups
32768 blocks per group, 32768 fragments per group
7680 inodes per group
Superblock backups stored on blocks:
32768, 98304
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
The mounting and copying of files.
root@linux:~# mkdir /srv/LVsmall
root@linux:~# mkdir /srv/LVbig
root@linux:~# mount /dev/mapper/VG42-LVsmall /srv/LVsmall
root@linux:~# mount /dev/VG42/LVbig /srv/LVbig
root@linux:~# cp -r /etc /srv/LVsmall/
root@linux:~# cp -r /var/log /srv/LVbig/
3. Verify usage with fdisk, mount, pvs, vgs, lvs, pvdisplay, vgdisplay, lvdisplay and df. Does fdisk give you any information about lvm?
Run all those commands (only two are shown below), then answer \'no\'.
root@linux:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
6.7G 1.4G 5.0G 21% /
tmpfs 246M 0 246M 0% /dev/shm
/dev/sda1 485M 77M 383M 17% /boot
/dev/mapper/VG42-LVsmall
194M 30M 154M 17% /srv/LVsmall
/dev/mapper/VG42-LVbig
591M 20M 541M 4% /srv/LVbig
root@linux:~# mount | grep VG42
/dev/mapper/VG42-LVsmall on /srv/LVsmall type ext3 (rw)
/dev/mapper/VG42-LVbig on /srv/LVbig type ext3 (rw)
4. Enlarge the small logical volume by 50 percent, and verify your work!
root@linux:~# lvextend VG42/LVsmall -l+50%LV
Extending logical volume LVsmall to 300.00 MiB
Logical volume LVsmall successfully resized
root@linux:~# resize2fs /dev/mapper/VG42-LVsmall
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/VG42-LVsmall is mounted on /srv/LVsmall; on-line res\
izing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/VG42-LVsmall to 307200 (1k) blocks.
The filesystem on /dev/mapper/VG42-LVsmall is now 307200 blocks long.
root@linux:~# df -h | grep small
/dev/mapper/VG42-LVsmall
291M 31M 246M 12% /srv/LVsmall
root@linux:~#
5. Take a look at other commands that start with vg* , pv* or lv*.
6. Create a mirror and a striped Logical Volume.
7. Convert a linear logical volume to a mirror.
8. Convert a mirror logical volume to a linear.
9. Create a snapshot of a Logical Volume, take a backup of the snapshot. Then delete some files on the Logical Volume, then restore your backup.
10. Move your volume group to another disk (keep the Logical Volumes mounted).
11. If time permits, split a Volume Group with vgsplit, then merge it again with vgmerge.