Sag mir, wo der Speicher ist…
Posted by Jesco Freund at Jan. 12, 2008 8:47 p.m.
… wo ist er geblieben? Genau vor dieser Frage stand ich heute morgen, als ich auf meinem Server über 4 von insgesamt 8 vorhandenen Gigabytes an Arbeitsspeicher vermisste – als Xen-Dom0 gebootet, waren auf einmal nur noch ca. 3,4 GiB vorhanden, genau wie bei einem „normalsterblichen“ 32-Bit-System. Installiert ist aber Debian Etch in der amd64-Variante, die sich eigentlich über so viel RAM freuen sollte. Erst hatte ich den Kernel im Verdacht, aber am Ende stellte sich Grub als Übeltäter heraus. Während bei normalen Kerneln auf die vom BIOS bereitgestellte e820 Memory Map zurückgegriffen wird, verlässt Xen sich auf die vom Bootloader übergebene Memory Map, und die stimmt bei der aktuell in Etch enthaltenen Version 0.97-27 eben nur für die ersten 32 Bit des Adressraumes. Bei Debian gibt es dazu auch einen entsprechenden Bugreport. Zwar wird dort auch geraten, sich nicht mehr mit dem Problem zu befassen, da ja bald Grub 2 kommen soll – das war aber irgendwann im Frühjahr, und wer Debian kennt, wird ein „bald“ schon richtig zu interpretieren wissen ![]()
Allerdings ist es kein Hexenwerk, hier Abhilfe zu schaffen. Grub muss nur etwas angepasst werden, dann liefert er auch für 64-Bit-Systeme eine korrekte e820 RAM Map. Was zu tun ist, wird im folgenden beschrieben:
Schnelldurchgang für Faule
Wer sich den Aufwand sparen möchte, Grub selbst zu patchen und zu kompilieren oder sich sein System nicht mit devel-Paketen vollstopfen möchte, der kann gerne auf mein fertiges .deb-Paket zurückgreifen:
wget http://files.my-universe.com/debian/etch/xen/grub_0.97-27_amd64.deb
dpkg -i grub_0.97-27_amd64.deb
grub-install /dev/sda
#optional:
update-grub
reboot
Grub im Eigenbau
Selbst ist der Admin – wer lieber selber kompiliert, dem sei dies natürlich nicht verwehrt. Zunächst werden die Quellen von Grub benötigt. Der Einfachheit halber verwenden wir das Debian-Quellpaket:
cd ~
apt-get update
apt-get install debhelper gcc gcc-4.1-locales debian-keyring automake1.9 autoconf autotools-dev texinfo libncurses-dev libc6-dev-i386 texi2html e2tools mkisofs
apt-get source grub
apt-get build-dep grub
Damit sollten jetzt alle benötigten Pakete für den Eigenbau von Grub vorhanden sein. Außerdem sollte nun ein Verzeichnis ~/grub-0.97 vorhanden sein, dass die Quellen des Debian-Grubs enthält. Als nächstes muss besagte kleine Änderung an den Grub-Quellen vorgenommen werden. Am einfachsten geht das mit einem Patch, den ich dafür erstellt habe:
wget http://files.my-universe.com/debian/etch/xen/grub-0.97-xen.patch
patch -p0 < grub-0.97-xen.patch
Wer es genau wissen möchte: Der Patch verändert die Datei stage2/common.c ein wenig. Die Deklaration der Variable cont erfolgt nun als volatile unsigned long anstatt nur als unsigned long – das ist bereits das ganze Geheimnis.
Nun gilt es noch, die Quellen wieder zu einem .deb-Paket zu verbacken:
cd ~/grub-0.97/
debian/rules binary
cd ~
Wenn alles fehlerfrei durchgelaufen ist, sollte sich in ~/ ein neues .deb-Paket befinden, dass sich wie oben beschrieben installieren lässt. Nach einem Reboot sollte sich der Erfolg der Maßnahme auch leicht überprüfen lassen:
xm dmesg
...
(XEN) Command line: /xen-3.0.3-1-amd64.gz dom0_mem=256M
(XEN) Physical RAM map:
(XEN) 0000000000000000 - 000000000009f400 (usable)
(XEN) 000000000009f400 - 00000000000a0000 (reserved)
(XEN) 00000000000e4000 - 0000000000100000 (reserved)
(XEN) 0000000000100000 - 00000000ddfd0000 (usable)
(XEN) 00000000ddfd0000 - 00000000ddfde000 (ACPI data)
(XEN) 00000000ddfde000 - 00000000de000000 (ACPI NVS)
(XEN) 00000000fff00000 - 0000000100000000 (reserved)
(XEN) 0000000100000000 - 0000000220000000 (usable)
(XEN) System RAM: 8159MB (8355260kB)
(XEN) Xen heap: 13MB (14208kB)
1 comment | Defined tags for this entry: Debian, server, hardware virtualization, Xen

Content is subject to the conditions of the
Danke!
-act
act on Oct. 9, 2008 12:26 CEST