Installation von Debian GNU/Linux auf einer p630 LPAR Manuel Lässer Ralf Strauss Florian M. Weps Telekurs Services AG 20. Mai 2003 Der IBM pSeries Model 630 (7028-6C4) Server ist ein Entry-level-Server mit 1- bis 4-Weg Prozessor und einer 64-Bit Systemarchitektur. Es lassen sich Logical Partitions (LPAR) einrichten, auf denen wahlweise AIX und Linux gestartet werden kann. IBM empfiehlt Red Hat und SuSE Linux, die beide in einer 64-bit Variante erhältlich sind[1]. Wir haben eine Installation von Debian GNU/Linux vorgenommen. Debian[2] ist eine von Freiwilligen entwickelte und gewartete Linux-Distribution, die auf 11 Architekturen freigegeben und gepflegt wird - darunter auch PowerPC, dem 32-bit Subset der Power Architektur. Eine 64-bit Power-Distribution ist von Debian nicht erhältlich - allerdings ist die 32-bit Distribution auf dem ppc64-Linux-Kernel lauffähig. 0. Vorbereitungen ----------------- Für die Cross-Compilation des ppc64 Kernels war einige Vorarbeit nötig: Die GNU Toolchain (Assembler, Linker usw.) und der Gnu C Compiler mussten in Cross-Build Varianten gebaut werden. Wir verwendeten als Build-Host ein Apple iBook mit Debian GNU/Linux "unstable", da wir so auf einen zweiten Cross-Compiler verzichten konnten: zum Compilieren eines ppc64 Kernels sind sowohl ein Powerpc64-Compiler (für den Kernel-Code) als auch ein 32-bit Powerpc-Compiler (für den Bootstrap-Code) nötig. Den Source-Code für den Linux-ppc64 Kernel holten wir uns von der Linuxppc64-Projekt-Site[3], wo auch einige Hinweise zum Compilieren des Kernels zu finden waren. Der offizielle Kernel 2.4.20 Source Code von kernel.org muss mit drei Patches versehen werden, um Version 2.4.21-pre4-2 für ppc64 zu erhalten. Eine besonders nützliche Anleitung war die von Rolf Brudeseth[4] zur Netzwerk-Installation auf einem 44P-170. Das Initrd-Image für die Installation war dasjenige von Debian 3.0r1 für powerpc. Hier die Versionen der wichtigsten auf dem iBook installierten Pakete: toolchain-source 3.2-7 aus Debian "unstable" flex 2.5.4a-24 aus Debian 3.0r1 "woody" automake1.4 1.4-p6-6 aus Debian "unstable" Für Flex musste die ältere Version aus dem Debian "stable" Release 3.0r1 verwendet werden, weil die Version aus "unstable" Probleme beim Toolchain-Compilieren machte. Das Paket automake1.4 wurde aus demselben Grund den neueren Versionen vorgezogen. 1. Bauen der Cross-Binutils --------------------------- Auf dem iBook wurde das "toolchain-source" Paket sowie die Werkzeuge zum Bauen von Debian-Paketen installiert: # apt-get install toolchain-source dpkg-dev file gcc libc6-dev make \ patch perl autoconf dh-make devscripts fakeroot gnupg automake1.4 \ debconf-utils debhelper dpkg-cross html2text po-debconf bzip2 \ autoconf2.13 zlib1g-dev Das "flex"-Paket wurde aus dem "stable"-Archiv geholt und installiert. # wget \ http://ftp.de.debian.org/debian/pool/main/f/flex/flex_2.5.4a-24_powerpc.deb # dpkg -i flex_2.5.4a-24_powerpc.deb Eine Online-Anleitung zum Bauen der Cross-Toolchain findet sich auf der Seite von W. Borgert[5]. Da wir nicht unter root arbeiten wollten, mussten wir den Account, mit dem die Arbeiten durchgeführt wurden, der Gruppe "src" zuordnen, damit er Schreib-Rechte im Verzeichnis /usr/src hatte. $ cd /usr/src $ EMAIL='wpf@telekurs.com' tpkg-make powerpc64-linux Wir mussten einige Änderungen an den Build-Einstellungen der Cross-Binutils vornehmen: wir brauchten keine C-Bibliothek, daher entfiel ein Teil der Komplikationen einer Cross-Umgebung, ausserdem wollten wir bloss statisch gelinkte Binaries erzeugen, und schliesslich machten die Man-Pages Ärger, sodass wir sie nicht bauen liessen. Wir nahmen folgende Änderungen am File /usr/src/binutils-powerpc64-linux-2.13.90.0.18/debian/rules vor: 14,15c14,18 < --disable-static \ < --target=$(TARGET) --- > --disable-shared \ > --target=$(TARGET) \ > --enable-targets=powerpc64-linux \ > --disable-nls > 71,72c74,75 < mv debian/$(PACKAGE)/usr/man debian/$(PACKAGE)/usr/share/man < cp debian/gasp.1 debian/$(PACKAGE)/usr/share/man/man1/powerpc64-linux-linux-gasp.1 --- > #mv debian/$(PACKAGE)/usr/man debian/$(PACKAGE)/usr/share/man > #cp debian/gasp.1 debian/$(PACKAGE)/usr/share/man/man1/powerpc64-linux-linux-gasp.1 Die Binutils bauten wir mit folgendem Kommando (-us und -uc verhindern, dass die Pakete signiert werden, was ja in diesem Falle auch nicht nötig war) $ cd /usr/src/binutils-powerpc64-linux-2.13.90.0.18 $ debuild -us -uc $ cd .. $ sudo dpkg -i binutils-powerpc64-linux_2.13.90.0.18-1_powerpc.deb Nun waren powerpc64-linux- Varianten der Utilities ar, as, ld, nm usw. installiert. 2. Bauen des Cross-Compilers ---------------------------- Das "toolchain-source" Paket enthält auch Source Code für den GNU C Compiler; das Vorgehen zum Bauen des Cross-Compilers ist ganz analog zu den Binutils. Auch hier mussten wir das "rules" File zum Erzeugen des Debian-Pakets anpassen. $ cd /usr/src/gcc-powerpc64-linux-3.2.3.cvs20030221/debian $ vi rules Hier das Diff zwischen den gelieferten und unseren "rules" 16,19c16 < --infodir=/usr/share/info \ < --mandir=/usr/share/man \ < --with-gxx-include-dir=/usr/$(TARGET)/include/g++ \ < --enable-shared \ --- > --disable-shared \ 22,25c19,21 < --with-system-zlib \ < --enable-long-long \ < --enable-nls \ < --without-included-gettext \ --- > --disable-nls \ > --disable-threads \ > --enable-__cxa_atexit \ Bei der Wahl der richtigen Flags - insbesondere "--enable-__cxa_atexit" - war die Penguinppc64-Seite[3] hilfreich. $ cd /usr/src/gcc-powerpc64-linux-3.2.3.cvs20030221 $ debuild -us -uc $ cd .. $ sudo dpkg -i gcc-powerpc64-linux_3.2.3.cvs20030221-1_powerpc.deb Damit war die Cross-Build-Umgebung für den Kernel vollständig. Wenn die Build-Umgebung allerdings nicht bereits "powerpc" gewesen wäre, hätte noch eine Powerpc-cross-Toolchain gebaut werden müssen, da der Kernel-bootstrap bei ppc64 32-bit-Code ist und auch so compiliert werden muss. 3. Bauen des Kernels -------------------- Die Sourcen wurden von folgenden Quellen geholt: $ wget -c http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.gz $ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/testing/patch-2.4.21-pre4.gz $ wget ftp://ftp.linuxppc64.org/pub/people/engebret/linuxppc64-2.4.21-pre4.patch.gz $ wget ftp://ftp.linuxppc64.org/pub/people/engebret/linuxppc64-2.4.21-pre4-2.patch.gz Nach dem Applizieren der Patches war aus dem offiziellen 2.4.20 Kernel-Source Code ein ppc64-2.4.21-pre4-2 Kernel-Source geworden. $ tar xzf linux-2.4.20.tar.gz $ cd linux-2.4.20 $ zcat ../patch-2.4.21-pre4.gz | patch -p1 $ zcat ../linuxppc64-2.4.21-pre4.patch.gz | patch -p1 $ zcat ../linuxppc64-2.4.21-pre4-2.patch.gz | patch -p1 $ cd .. $ mv linux-2.4.20 linuxppc64-2.4.21-pre4-2 Die nächsten Schritte waren: das Top-Level Makefile anzupassen, um die cross-compilierung zu bewirken; das Debian Ramdisk-Image an den richtigen Ort zu legen, damit der Kernel-Build-Prozess es einbinden konnte; die Kernel-Debugger aus der Kernel-Konfiguration zu nehmen, da sie Cross-Building nicht richtig unterstützen; und ein Makefile im Verzeichnis arch/ppc64 anzupassen, da es einen Parameter für den Compiler enthält ("traceback=full"), der von unseren Cross-Tools nicht unterstützt wurde. Änderungen am Toplevel-Makefile: eigentlich hätte es genügen sollen, die Environment-Variablen ARCH=ppc64 und CROSS_COMPILE=powerpc64-linux- zu setzen - aber dieser Ansatz war nicht erfolgreich. 8c8,9 < ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) --- > #ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) > ARCH := ppc64 22c23 < CROSS_COMPILE = --- > CROSS_COMPILE = powerpc64-linux- Änderungen am "arch/ppc64"-Makefile: 25,26c25,26 < -Wno-uninitialized -mminimal-toc -fno-builtin \ < -mtraceback=full --- > -Wno-uninitialized -mminimal-toc -fno-builtin > # -mtraceback=full Debian Initrd-Image nach arch/ppc64/boot/ramdisk.image.gz kopieren: $ cd arch/ppc64/boot $ wget http://ftp.debian.org/debian/dists/woody/main/disks-powerpc/current/chrp/images-1.44/root.bin $ mv root.bin ramdisk.image.gz Kernel konfigurieren: eine Default-Kernel-Konfiguration ist in arch/ppc64/configs/pSeries_defconfig zu finden. Allerdings ist dort der Kernel-Debugger aktiviert, was beim Cross-Build zu Fehlern führt. Wir entfernten alle Debugger-Optionen aus der Konfiguration. Die Option "magic sysrq key" musste allerdings aktiviert bleiben, weil das hvc_console Modul davon abhängt. (Dies ist ein Bug: andere Module schützen ihre Abhängigkeit von "linux/sysrq.h" mit einer Präprozessor-Prüfung auf CONFIG_MAGIC_SYSRQ.) $ cd /usr/src/linuxppc64-2.4.21-pre4-2 $ cp arch/ppc64/configs/pSeries_defconfig .config $ make config Hier die Unterschiede zwischen unserer Kernel-Konfiguration und der mitgelieferten: 176d175 < # CONFIG_IDE_TASKFILE_IO is not set 231a231 > # CONFIG_BLK_DEV_ATARAID_SII is not set 545a546,550 > # CONFIG_IPMI_HANDLER is not set > # CONFIG_IPMI_PANIC_EVENT is not set > # CONFIG_IPMI_DEVICE_INTERFACE is not set > # CONFIG_IPMI_KCS is not set > # CONFIG_IPMI_WATCHDOG is not set 725,731c730,732 < CONFIG_KDB=y < # CONFIG_KDB_OFF is not set < CONFIG_KALLSYMS=y < CONFIG_PPCDBG=y < CONFIG_DUMP=y < CONFIG_DUMP_COMPRESS_RLE=y < CONFIG_DUMP_COMPRESS_GZIP=y --- > # CONFIG_KDB is not set > # CONFIG_PPCDBG is not set > # CONFIG_DUMP is not set Kernel bauen: $ make clean dep $ make zImage.initrd 4. Vorbereitungen zum Netzwerk-Booten der LPAR ---------------------------------------------- Der LPAR war kein CD-ROM-Drive zugeordnet. Wir booteten sie über tftp. Dazu installierten wir auf dem iBook einen tftp-Server und einen dhcp-Server. $ sudo apt-get install tftpd dhcp Die tftpd-Konfiguration besteht aus der Kommandozeile im /etc/inetd.conf: tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot Da der tcp-wrapper-Daemon tcpd verwendet wird, muss im /etc/hosts.allow die Client-IP-Adresse freigeschaltet werden. Für die Konfiguration von dhcp musste im /etc/dhcpd.conf ein Abschnitt für das Subnetz und einer für die Client-Maschine eingefügt werden: subnet 10.0.26.0 netmask 255.255.255.0 { } host dcsqa6 { hardware ethernet 00:02:55:af:c0:63; filename "zImage.initrd"; fixed-address 10.0.26.75; } Wir konfigurierten auf dem iBook eine IP-Adresse im Subnetz der zu installierenden Maschine und kopierten das Kernel-Image aus arch/ppc64/boot ins Verzeichnis /tftpboot. 5. Booten der LPAR ------------------ Im GUI der HSM-Workstation wurde die LPAR aktiviert und ein Konsolen-Fenster geöffnet. Durch drücken der Taste "8" brachen wir die normale Bootsequenz ab und gelangten an den Open Firmware Prompt. Wir wollten vom 2. Ethernet-Interface booten. Dazu definierten wir ein neues Device Alias: 0 > devalias ibm,sp /vdevice/IBM,sp@4000 disk /pci@400000000211/pci@2,6/scsi@1/sd@8,0 scsi /pci@400000000211/pci@2,6/scsi@1 screen /vdevice/vty@0 net /pci@400000000211/pci@2/ethernet@1 network /pci@400000000211/pci@2/ /nvram@3fdbd800000 ok 0 > devalias net2 /pci@400000000211/pci@2,2/ethernet@ 0 > boot net2:10.0.26.74,,10.0.26.75 (Beim boot-Befehl werden tftp-Server und -Client IP-Adressen in dieser Reihenfolge angegeben). Das iBook schickte das Kernel-Image, und das Debian Installationssystem wurde auf der LPAR gestartet. Bei den ersten Versuchen hatten wir das Problem, dass der Kernel keine Konsole finden konnte - wir hatten das hvc_console Device nicht eincompiliert, da es von der Kernel-Option CONFIG_MAGIC_SYSRQ abhängt, die wir entfernt hatten, weil sie im gleichen Abschnitt wie die Kernel-Debugger steht. In [4] wird eine Situation beschrieben, bei der der tftp-Transfer abbricht. Behoben werden kann das Problem anscheinend mit dem Kommando # arp -s 10.0.26.75 00:02:55:AF:C0:63 indem man den Arp-Cache-Eintrag für das Target auf dem Server manuell setzt. Wir haben dieses Kommando prophylaktisch verwendet. 6. Debian-Installation ---------------------- Von diesem Punkt an konnten wir der Beschreibung in [4] folgen. Zuerst editierten wir das Disklabel ("Partition a Harddisk"): sda1 Typ 41: PPC PReP Boot 8.39M sda2 Typ 82: Linux swap 1024.46M sda3 Typ 83: Linux ext2 35368.47M Wie in [4] beschrieben setzten wir das "bootable" flag für sda1. Die nächsten Schritte waren "Initialize and Activate a swap partition", und "initialize a Linux Partition". Beim Linux-Filesystem wählten wir ext2. Als nächstes konfigurierten wir den Hostnamen und initialisierten das Netzwerk. Dann installierten wir das Basis-System. Diese LPAR hatte kein CD-ROM Drive zugeordnet. Wir installierten das Basis-System via NFS - auf einem anderen Server wurde die Debian-CD gemountet und per NFS exportiert. Hier mussten wir die Debian-Installationsroutine verlassen: die Installation von Kernel, Bootloader und und Console-Device für powerpc64 wird von der gewöhnlichen powerpc-Installation nicht unterstützt. Mit "Execute a Shell" kamen wir an einen Shellprompt. Das frisch installierte Basissystem war unter /target gemountet. Mit # chroot /target wechselten wir ins installierte System - wir hatten nun eine art single-user-mode; bloss das /proc Filesystem fehlte noch: # mount /proc Zuerst holten wir den Kernel vom iBook und installerten ihn im /boot-Verzeichnis. Wir verwendetet ftp dafür; das Kernel-Image war die Datei vmlinux im Top-Level des Kernel-Source Tree. Um weitere Pakete zu installieren, verwendeten wir apt. Dazu musste die Datei /etc/apt/sources.list angepasst werden. Weil das Testsystem in der Serverzone stand, konnten wir nicht auf den Internet-Proxy zugreifen. Wir zielten apt also auf eine Workstation mit lokalem Debian-Mirror. Hier der Inhalt von /etc/apt/sources.list: deb http://truite.telekurs.com:9999/main unstable main deb http://truite.telekurs.com:9999/non-US unstable/non-US main In die Datei /etc/apt/apt.conf schrieben wir noch die Zeile Acquire::http::Timeout "600"; um den Timeout zu vergrössern. Wir holten die aktuelle Paketliste, machten einen Upgrade des installierten Basissystems auf die "unstable" (Entwickler-) Version wie in [6] beschrieben, und installierten noch die Pakete ssh und yaboot. Mit dem Aufruf von yabootconf (ohne Kommandozeilenparameter) installierten wir den Boot-Loader. Zuletzt mussten wir noch das Console-Device anpassen, da die Debian-Installaiton nicht darauf ausgelegt ist, die hvc_console zu verwenden. Die Major- und Minor-Device-Nummern der HVC-Konsole fanden wir im Kernel Source Code im File drivers/char/hvc_console.c # cd /dev # mknod hvc0 c 229 0 # chown root:tty hvc0 # chmod 600 hvc0 Wir mussten die Datei /etc/inittab editieren, damit die Post-Installationsroutine sich auf /dev/hvc0 setzte. Die angepasste Zeile: 1:2345:respawn:/usr/sbin/termwrap /usr/sbin/base-config /dev/hvc0 2>&1 Nun war alles bereit für den Reboot. Wie verliessen die chroot-Umgebung und stoppten die LPAR. # umount /dev # exit # umount /target # halt 7. Reboot --------- Von der HSM-workstation aus aktivierten wir die LPAR, brachen den normalen Bootvorgang durch drücken der '8' ab, und kamen an den Open Firmware Prompt. 0 > boot disk Yaboot aktivierte den Kernel, und das Sytsem bootete in die Post-Install Routine. Bei den ersten Versuchen kamen wir hier nicht weiter, weil wir das Device Special File für die HVC-Konsole nicht angelegt und die inittab nicht angepasst hatten. Daher die Installation von ssh: so konnten wir uns remote einloggen. A. Benchmarks ------------- Debian GNU/Linux hat eine Anzahl Pakete mit Benchmarks. Da Debian auf allen unterstützten Architekturen bis auf low-level Eigenschaften wie den Boot-Loader praktisch identisch ist, ist es interessant, als gleichwertig eingestufte Hardware unterschiedlicher Herkunft zu vergleichen, indem Debian installiert und Lasttests oder Benchmarks durchgeführt werden. bonnie++ -- disk i/o contest -- system responsiveness lmbench -- general tiobench -- threaded i/o siege -- httpd B. Referenzen ------------- [1] http://www-1.ibm.com/servers/eserver/pseries/linux/ [2] http://www.debian.org/ [3] http://penguinppc64.org/ [4] http://lists.debian.org/debian-powerpc/2002/debian-powerpc-200207/msg00858.html [5] http://people.debian.org/~debacle/cross.html [6] http://www.debian.org/releases/woody/powerpc/release-notes/ch-upgrading.en.html#s-dselectupgrade