How To Make Your Xen-PAE Kernel Work With More Than 4GB RAM (Debian Etch With GRUB)

Version 1.0
Author: Falko Timme

If you have a server with more than 4GB RAM and want to install a 32bit Debian Etch on it (following this tutorial: Debian Etch And Xen From The Debian Repository), you'd expect the Xen-PAE kernel to see all your RAM because the Xen-PAE kernel supports up to 64GB RAM. In fact, it recognizes only about 3.3GB RAM due to a bug in the GRUB bootloader. This article explains how you can fix GRUB so that all your RAM gets recognized.

I do not issue any guarantee that this will work for you!


1 Preliminary Note

This bug exists on 64bit Debian systems as well - the default Debian Xen kernel also recognizes only 3.3GB of RAM. It's possible that the following procedure works for 64bit Debian Etch systems as well, although I have tested it only on a 32bit Debian Etch system.

I assume that you have already set up Xen on your system according to this tutorial: Debian Etch And Xen From The Debian Repository

I have tested this on a system with 6GB RAM.

Don't follow this tutorial if you're using another bootloader than GRUB (e.g. lilo)!


2 Check Your Memory

You can run

cat /proc/meminfo

to see how much memory your system recognizes:

Debian-40-etch-32-minimal:~# cat /proc/meminfo
MemTotal:      3468288 kB
MemFree:       3237948 kB
Buffers:         55884 kB
Cached:          46124 kB
SwapCached:          0 kB
Active:          68820 kB
Inactive:        41412 kB
HighTotal:     2731012 kB
HighFree:      2667548 kB
LowTotal:       737276 kB
LowFree:        570400 kB
SwapTotal:     2104440 kB
SwapFree:      2104440 kB
Dirty:            3524 kB
Writeback:           0 kB
AnonPages:        8196 kB
Mapped:           3932 kB
Slab:            10140 kB
PageTables:        304 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   3838584 kB
Committed_AS:    50368 kB
VmallocTotal:   116728 kB
VmallocUsed:      3776 kB
VmallocChunk:   112612 kB

As you see, only about 3.3GB are recognized by the system...


3 Rebuild GRUB

Now let's rebuild the GRUB bootloader. We need the package dpkg-dev for it:

apt-get install dpkg-dev

Then we download the GRUB sources...

apt-get source grub

... and install all requirements to rebuild GRUB:

apt-get build-dep grub

We must modify the stage2/common.c file in the GRUB source directory. First we make a copy of that file:

cd grub-0.97/
cp -a stage2/common.c stage2/common.c.original

Then we open it:

vi stage2/common.c

Around line 143, you should find this section:

#ifndef STAGE1_5
  unsigned long cont, memtmp, addr;
  int drive;

Modify it as follows:

#ifndef STAGE1_5
  unsigned long memtmp, addr;
  volatile unsigned long cont;
  int drive;

Save the file, then build the new GRUB package:

debian/rules binary

Afterwards we can install the new GRUB package as follows:

dpkg -i ../grub_0.97-27_i386.deb

Now we must install GRUB on our hard drives. I'm using two hard drives, /dev/sda and /dev/sdb (for software RAID1), so I run

grub-install /dev/sda
grub-install /dev/sdb

If you only got one hard drive, then run grub-install only once. Make sure that you use the correct device name for your hard drive (for example, instead of /dev/sda, yours might be /dev/hda - you can find out about the hard drive names by running

fdisk -l


Finally, it's time to reboot:



4 Check Your Memory Again

After the reboot, it's time to check the memory again. If everything went well, the system should now recognize the full amount of RAM:

cat /proc/meminfo

Debian-40-etch-32-minimal:~# cat /proc/meminfo
MemTotal:      6067200 kB
MemFree:       5902700 kB
Buffers:          1596 kB
Cached:          13964 kB
SwapCached:          0 kB
Active:          19316 kB
Inactive:         4408 kB
HighTotal:     5329732 kB
HighFree:      5299600 kB
LowTotal:       737468 kB
LowFree:        603100 kB
SwapTotal:     2104440 kB
SwapFree:      2104440 kB
Dirty:             784 kB
Writeback:           0 kB
AnonPages:        8160 kB
Mapped:           3932 kB
Slab:             8616 kB
PageTables:        324 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   5138040 kB
Committed_AS:    50388 kB
VmallocTotal:   116728 kB
VmallocUsed:      3776 kB
VmallocChunk:   112612 kB

As you see, my system is now recognizing my full 6GB of RAM.


Falko Timme

About Falko Timme

Falko Timme is an experienced Linux administrator and founder of Timme Hosting, a leading nginx business hosting company in Germany. He is one of the most active authors on HowtoForge since 2005 and one of the core developers of ISPConfig since 2000. He has also contributed to the O'Reilly book "Linux System Administration".

Share this page:

Suggested articles

1 Comment(s)

Add comment



Thanks for the help. I had the same problem on my amd64 system and this fixed it for me. I still get different RAM totals if I use a non-xen amd64 kernel, but now the difference is only a couple of megabytes.