This is relatively straightforward if you follow the steps carefully. It is recommended you have a good backup and a suitable rescue disk handy just in case.
The "normal" way of running an LVM root file system is to have a single non-LVM partition called /boot which contains the kernel and initial RAM disk needed to start the system. The system I upgraded was as follows:
| 
 # df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/rootvg/root        253871     93384    147380  39% /
/dev/hda1                17534     12944      3685  78% /boot
/dev/rootvg/home       4128448      4568   3914168   0% /home
/dev/rootvg/usr        1032088    332716    646944  34% /usr
/dev/rootvg/var         253871     31760    209004  13% /var
             | 
| 
 # ls /boot
System.map                 lost+found              vmlinux-2.2.16lvm
map                        module-info	           boot.0300  
boot.b                     os2_d.b                 chain.b
initrd.gz                  
 # tail /etc/lilo.conf
image=/boot/vmlinux-2.2.16lvm
        label=lvm08
        read-only
        root=/dev/rootvg/root
        initrd=/boot/initrd.gz
        append="ramdisk_size=8192"
             | 
Build LVM kernel and modules
Follow the steps outlined in Chapter 5 - Section 6.2 for instructions on how to get and build the necessary kernel components of LVM.
Build the LVM user tools
Follow the steps in Section 6.2 to build and install the user tools for LVM.
Install the new tools. Once you have done this you cannot do any LVM manipulation as they are not compatible with the kernel you are currently running.
Rename the existing initrd.gz
This is so it doesn't get overwritten by the new one
| 
# mv /boot/initrd.gz /boot/initrd08.gz
                      | 
Edit /etc/lilo.conf
Make the existing boot entry point to the renamed file. You will need to reboot using this if something goes wrong in the next reboot. The changed entry will look something like this:
| 
image=/boot/vmlinux-2.2.16lvm
        label=lvm08
        read-only
        root=/dev/rootvg/root
        initrd=/boot/initrd08.gz
        append="ramdisk_size=8192"
                      | 
Run lvmcreate_initrd to create a new initial RAM disk
| 
# lvmcreate_initrd 2.4.9
                      | 
Add a new entry into /etc/lilo.conf
This new entry is to boot the new kernel with its new initrd.
| 
image=/boot/vmlinux-2.4.9lvm
        label=lvm10
        read-only
        root=/dev/rootvg/root
        initrd=/boot/initrd.gz
        append="ramdisk_size=8192"
                      | 
Re-run lilo
This will install the new boot block
| 
# /sbin/lilo
                      | 
Reboot
When you get the LILO prompt select the new entry name (in this example lvm10) and your system should boot into Linux using the new LVM version.
If the new kernel does not boot, then simply boot the old one and try to fix the problem. It may be that the new kernel does not have all the correct device drivers built into it, or that they are not available in the initrd. Remember that all device drivers (apart from LVM) needed to access the root device should be compiled into the kernel and not as modules.
If you need to do any LVM manipulation when booted back into the old version, then simply recompile the old tools and install them with
| 
# make install
                      |