So far, we have been using a generic 2.4.24 Linux kernel with LVM enabled. We had to compile this ourselves because the stock Red Hat / Fedora kernels don’t support our hard disks. See this article for more details. [Note: Before you do anything involving your partitions or volumes, make a complete backup. Make sure to set up a test system with the same kernel and distribution to see how this stuff works. This article was written using our lab box. Read our terms of use.] It turns out that the necessary drivers to do all we want to do with LVM are not even included in version 2.4.27. We aren’t ready to make the jump to 2.6 in our lab, so we had to patch our kernel. While we were at it, we also decided to replace the LVM RPMs. The problem with the kernel shows up when we try and use pvmove to get data off of /dev/sde and /dev/sdf:
[root@srv-1 root]# pvmove -v /dev/sde pvmove -- checking name of source physical volume "/dev/sde" pvmove -- locking logical volume manager pvmove -- reading data of source physical volume from "/dev/sde" pvmove -- checking volume group existence pvmove -- reading data of volume group "volgroup" from lvmtab pvmove -- checking volume group consistency of "volgroup" pvmove -- searching for source physical volume "/dev/sde" in volume group "volgroup" pvmove -- building list of possible destination physical volumes pvmove -- checking volume group activity pvmove -- moving physical extents in active volume group "volgroup" pvmove -- WARNING: if you lose power during the move you may need to restore your LVM metadata from backup! pvmove -- do you want to continue? [y/n] y pvmove -- starting to move extents away from physical volume "/dev/sde" pvmove -- checking for enough free physical extents in "volgroup" pvmove -- /dev/sde [PE 0 [logicalvol [LE 0]] -> /dev/sdf [PE 0] [1/768] /dev/volgroup/group::/dev/volgroup/logicalvol: 0840 8576, 0850 8576 pvmove -- ERROR "Inappropriate ioctl for device" copying extent from "/dev/sde" pvmove -- ERROR "Inappropriate ioctl for device" moving physical extents |
We really wanted to recompile from source, so we didn’t have to rely on particular RPMs or stock kernel versions. Device mapper is available from ftp://sources.redhat.com/pub/dm/, and LVM2 is available from ftp://sources.redhat.com/pub/lvm2/. Let’s find out what LVM package we are using and get rid of it:
[root@srv-1 root]# rpm -qa | grep lvm lvm-1.0.3-13 [root@srv-1 root]# [root@srv-1 root]# rpm -e lvm-1.0.3-13 error: Failed dependencies: lvm is needed by (installed) mkinitrd-3.5.14-1 [root@srv-1 root]# rpm -e lvm-1.0.3-13 --nodeps |
Note that we ignored the mkinitrd dependency. We aren’t using any modules at all, let alone at boot time. But, do be careful here. Now, let’s compile device-mapper, and point it at our Linux source tree, per the INSTALL file directions:
[root@srv-1 device-mapper.1.00.19]# ls autoconf contrib dmsetup INTRO Makefile.in patches scripts configure COPYING include kernel make.tmpl.in po VERSION configure.in COPYING.LIB INSTALL lib man README WHATS_NEW [root@srv-1 device-mapper.1.00.19]# ./configure --with-kernel-dir=/usr/src/linux-2.4.27 checking build system type... . . . config.status: creating man/Makefile config.status: creating po/Makefile configure: WARNING: Your kernel source in /usr/src/linux-2.4.27 needs patching configure: WARNING: For supported kernels, try 'make apply-patches' next to do this, or apply the device-mapper patches by hand. [root@srv-1 device-mapper.1.00.19]# |
Well, we’ll have to patch the kernel later. For now, let’s compile and install the device-mapper files:
[root@srv-1 device-mapper.1.00.19]# make make -C include . . . gcc -o dmsetup dmsetup.o -L../lib/ioctl \ -L../lib/ioctl -L/lib -ldevmapper make[1]: Leaving directory `/usr/src/device-mapper.1.00.19/dmsetup' [root@srv-1 device-mapper.1.00.19]# [root@srv-1 device-mapper.1.00.19]# make install make -C include make[1]: Entering directory `/usr/src/device-mapper.1.00.19/include' make[1]: Nothing to be done for `all . . . /usr/bin/install -c -D -o root -g root -m 555 dmsetup /sbin/dmsetup make[1]: Leaving directory `/usr/src/device-mapper.1.00.19/dmsetup' [root@srv-1 device-mapper.1.00.19]# |
Now, let’s compile and install the LVM files:
[root@srv-1 src]# tar -xzf LVM*.tgz [root@srv-1 src]# ls conf linux-2.4.27 lost+found LVM2.2.00.25.tgz linux-2.4.24.tar.gz linux-2.4.27.tar.gz LVM2.2.00.25 [root@srv-1 src]# cd LVM* [root@srv-1 LVM2.2.00.25]# [root@srv-1 LVM2.2.00.25]# ./configure checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu checking target system type... i686-pc-linux-gnu checking for gawk... gawk . . . checking libdevmapper.h usability... yes checking libdevmapper.h presence... yes . . . config.status: creating test/device/Makefile config.status: creating test/format1/Makefile config.status: creating test/regex/Makefile config.status: creating test/filters/Makefile [root@srv-1 LVM2.2.00.25]# [root@srv-1 LVM2.2.00.25]# make . . . -Wl,--export-dynamic -L../lib -L/lib -llvm -ldevmapper -ldl -rdynamic make[1]: Leaving directory `/usr/src/LVM2.2.00.25/tools' [root@srv-1 LVM2.2.00.25]# [root@srv-1 LVM2.2.00.25]# make install make[1]: Nothing to be done for `install'. make[1]: Leaving directory `/usr/src/LVM2.2.00.25/daemons' [root@srv-1 LVM2.2.00.25]# |
If we run pvmove –version, we will see that our kernel still needs the device-mapper driver:
[root@srv-1 LVM2.2.00.25]# pvmove --version LVM version: 2.00.25 (2004-09-29) Library version: 1.00.19-ioctl (2004-07-03) /dev/mapper/control: open failed: No such file or directory Is device-mapper driver missing from kernel? [root@srv-1 LVM2.2.00.25]# |
Let’s go in to our Linux source tree and patch:
[root@srv-1 linux-2.4.27]# patch -p1 < /usr/src/device-mapper.1.00.19/ patches/linux-2.4.26-rc1-devmapper-ioctl.patch patching file Documentation/Configure.help Hunk #1 succeeded at 1953 (offset 30 lines). patching file MAINTAINERS Hunk #1 succeeded at 589 (offset 2 lines). patching file arch/mips64/kernel/ioctl32.c patching file arch/parisc/kernel/ioctl32.c patching file arch/ppc64/kernel/ioctl32.c . . . patching file mm/Makefile patching file mm/filemap.c patching file mm/mempool.c patching file mm/vmalloc.c [root@srv-1 linux-2.4.27]# |
The patch appears to work OK with 2.4.27, but notice that we are being a bit adventurous. Notice that another option for device-mapper support shows up in the kernel configuration menu:
[root@srv-1 linux-2.4.27]# make menuconfig Linux Kernel v2.4.27 Configuration Multi-device support (RAID and LVM) [*] Multiple devices driver support (RAID and LVM) [*] RAID support [ ] Linear (append) mode [ ] RAID-0 (striping) mode [*] RAID-1 (mirroring) mode [ ] RAID-4/RAID-5 mode [ ] Multipath I/O support [*] Logical volume manager (LVM) support [*] Device-mapper support (NEW) [*] Mirror (RAID-1) support |
We just need to recompile our kernel, now, to enable the device-mapper support:
[root@srv-1 linux-2.4.27]# make dep clean bzImage |
After we install and boot from this kernel, we should be able to remove /dev/sde from our volume group, which we do in this article.
There are six articles in this series:
Setting Up Logical Volume Manager
Extending a Logical Volume
Shrinking a Logical Volume With LVM
Adding a RAID1 Device to a Volume With LVM
Upgrading LVM To Version 2 and Patching The Linux Kernel
Finish Conversion And Expansion to Two RAID1 Devices With LVM