This is one of the benefits of LVM. Once you start seeing errors on a disk, it is high time to move your data. With LVM this is easy as pie. We first do the obvious replacement example where you add a disk to the system that's at least as large as the one you want to replace.
To move data, we move Physical Extents of a Volume Group to another disk, or
more precisely, to another Physical Volume. For this, LVM offers us the
pvmove
utility.
Let's say that our suspicious disk is called /dev/hda1 and we want to replace it by /dev/sdb3. We first add /dev/sdb3 to the Volume Group that contains /dev/hda1.
It appears advisable to unmount any filesystems on this Volume Group before doing this. Having a full backup might not hurt either.
FIXME: is this necessary?
We then execute pvmove
. In its simplest invocation, we
just mention the disk we want to remove, like this:
# pvmove /dev/hda1
pvmove -- moving physical extents in active volume group "test1"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? [y/n] y
pvmove -- doing automatic backup of volume group "test1"
pvmove -- 12 extents of physical volume "/dev/hda1" successfully moved
Please heed this warning. Also, it appears that at least some kernels or LVM versions have trouble with this command. I tested it with 2.3.99pre6-2, and it works, but be warned.
Now that /dev/hda1 contains no Physical Extents anymore, we can reduce it from the Volume Group:
# vgreduce test1 /dev/hda1
vgreduce -- doing automatic backup of volume group "test1"
vgreduce -- volume group "test1" successfully reduced by physical volume:
vgreduce -- /dev/hda1
FIXME: we need clarity on a few things. Should the volume group be active? When do we get data loss?
If a disk fails without warning and you are unable to move the Physical Extents off it to a different Physical Volume you will have lost data unless the Logical Volumes on the PV that failed was mirrored. The correct course of action is to replace the failed PV with an identical one or at least a partition of the same size.
The directory /etc/lvmconf contains backups of the LVM data and structures that make the disks into Physical Volumes and list which Volume Groups that PV belongs to and what Logical Volumes are in the Volume Group.
After replacing the faulty disk you can use the
vgcfgrestore
command to recover the LVM data to the new PV. This
restores the Volume Group and all it's info, but it does not restore the
data that was in the Logical Volumes. This is why most LVM commands make
backups automatically of the LVM data when doing changes.