I've solved this problem.
A key to discovering the cause was noticing that the standard RHEL5 build puts "quiet" on the kernel line in grub.conf. Removing this provided a more comprehensive log of the boot.
This showed that there was an out of memory condition. This caused oom-killer to kill the lvm.static (and depmod) processes during boot. Clearly, this was why the logical volume devices were not being created.(Indeed when I fiddled with the available memory, reducing it by setting mem=... in grub.conf it even killed off init!).
Oom-killer has a bit of a reputation for doing disruptive things and for it to become operational during boot phase and on a 64-bit system with 20GB of RAM is clearly unusual. (In its defense I would point out that without it I probably would not have been able to get at the logs to find out what the problem was.)
I checked and the low mem setting was indeed the full 20GB as expected on a 64-bit system.
As mentioned in my original post, the problem only arose after I added some extras to the system. Some hard thinking as to what could be consuming so much memory during boot phase led me to some kernel settings applied for Oracle.
This box was built as a test platform for some production systems that had over 3 times the available memory. The build details had been copied identically -- what else does one do for a test platform?
It turned out that a vm.nr_hugepages setting was responsible. The value chosen was OK for the production systems but inappropriate for this one. Removing this from sysctl.conf cured the problem.
Some learnings to take from this include
- The RH logging defaults are for convenience on a working system and not helpful for debugging
- oom-killer can cause boot problems
- Altering kernel defaults is risky
- Saving money by choosing cheaper hardware for a test system can be a false economy!