Xen PAE Kernel fuer Endian EFW 2.4.1 Community Edition

Das EFW Repository stellt keinen PAE Kernel bereit, d.h. eine EFW kann „normalerweise“ nur HVM virtualisiert werden.

Wer IPSec benoetigt, bitte das Update am Ende des Beitrags lesen…

Im Bugtracker der EFW steht allerdings eine kleine Bedienungsanleitung, wie ein PAE Kernel gebaut werden kann. Dank natuerlich an den urspruenglichen Autor.

hi,

I have build it myself,
you can download it or build it yourself

known bug: xen save, restore and live-migration does not work.

download and install:

http://www.its-doern.at/downloads/doc_download/23-endian-pae-kernel-241-kernel-pae-263225-57e40i686rpm [^]
copy kernel-pae.tar.gz to /tmp on the Endian Firewall 2.4.1
run on the Firewall:
root@efw:~ # cd /tmp/
root@efw:/tmp # tar -xzvf kernel-pae.tar.gz
root@efw:/tmp # rpm -Uvh /tmp/usr/src/endian/RPMS/i686/kernel-* --force --nodeps
root@efw:/tmp # reboot
root@efw:~ # uname -a
Linux efw.cluster.local 2.6.32.25-57.e40.i686.PAE 0000001 SMP Sat Jun 4 10:48:51 EDT 2011 i686 i686 i386 GNU/Linux

build it:

Boot Centos 4.9
http://centos.mirror.netelligent.ca/centos/4.9/isos/i386/CentOS-4.8-i386-binDVD.iso [^]

[root@localhost ~]# mkdir -p /efw-dev/usr/src
[root@localhost ~]# cd /efw-dev/usr/src/
[root@localhost src]# wget http://downloads.sourceforge.net/project/efw/Development/EFW-2.4.1/EFW-COMMUNITY-2.4.1-devel-srpm-rpms.tar.gz?r=http%3A%2F%2Fwww.endian.com%2Fen%2Fcommunity%2Fdownload%2F&ts=1300655980&use_mirror=puzzle [^]
[root@localhost ~]# cd /efw-dev
[root@localhost efw-dev]# mkdir -p usr/src/endian var/lib/rpm var/lock/rpm dev etc proc sys
[root@localhost efw-dev]# mkdir lib
[root@localhost efw-dev]# cp /lib/libtermcap.so.2 lib/
[root@localhost efw-dev]# cp /lib/libdl.so.2 lib/
[root@localhost efw-dev]# cp /lib/libc.so.6 lib/
[root@localhost efw-dev]# cp /lib/ld-linux.so.2 lib/
[root@localhost efw-dev]# mkdir bin
[root@localhost efw-dev]# cp /bin/bash bin/
[root@localhost efw-dev]# cp -a /dev/null /dev/zero /dev/urandom /dev/random dev
[root@localhost efw-dev]# for f in etc/passwd etc/group etc/shadow; do grep root /$f > $f; done
[root@localhost efw-dev]# grep " / " /etc/fstab > etc/fstab
[root@localhost efw-dev]# mount -t proc none /efw-dev/proc
[root@localhost efw-dev]# cd usr/src/endian
[root@localhost endian]# mkdir BUILD RPMS SRPMS SPECS SOURCES
[root@localhost endian]# tar -xzvf /efw-dev/usr/src/EFW-COMMUNITY-2.4.1-devel-srpm-rpms.tar.gz
[root@localhost endian]# cd EFW-COMMUNITY-2.4.1-201011120951/DEVEL_RPMS/
[root@localhost DEVEL_RPMS]# rpm --initdb --root /efw-dev
[root@localhost DEVEL_RPMS]# rpm --root /efw-dev -Uvh *.rpm --nodeps --force
[root@localhost ~]# cd /efw-dev/usr/src/
[root@localhost src]# wget http://mesh.dl.sourceforge.net/sourceforge/efw/EFW-COMMUNITY-2-devel-RPMS.tar.gz [^]
[root@localhost src]# wget http://downloads.sourceforge.net/efw/EFW-COMMUNITY-2.1.1-devel-SRPMS.tar.bz2 [^]
[root@localhost src]# tar xvjf EFW-COMMUNITY-2.1.1-devel-SRPMS.tar.bz2
[root@localhost src]# tar xvzf EFW-COMMUNITY-2-devel-RPMS.tar.gz
[root@localhost src]# mkdir /efw-dev/usr/src/redhat/SOURCES -p
[root@localhost src]# rpm --initdb --root /efw-dev
[root@localhost src]# rpm --root /efw-dev -Uvh EFW-COMMUNITY-2-devel-RPMS/readline-* --nodeps --force
[root@localhost src]# rpm --root /efw-dev -Uvh EFW-COMMUNITY-2.1.1-devel-SRPMS/base/kernel-utils* --nodeps --force
[root@localhost src]# rm -f -R /usr/src/
[root@localhost src]# ln -s /efw-dev/usr/src/ /usr/src
[root@localhost src]# cd /efw-dev/usr/src/
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/endian/EFW-COMMUNITY-2.4.1-201011120951/SRPMS/kernel-2.6.32.25-57.e40.src.rpm
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/endian/EFW-COMMUNITY-2.4.1-201011120951/DEVEL_RPMS/gcc-3.4.6-10.endian8.i586.rpm --force --nodeps
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/rpm-build-4.4.1-21.endian5.i386.rpm --force --nodeps
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/endian/EFW-COMMUNITY-2.4.1-201011120951/RPMS/* --nodeps --force
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/neon-0.24.7-6.endian0.i386.rpm --nodeps --force
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/bzip2-libs-1.0.3-0.endian0.i386.rpm --force --nodeps
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/endian/EFW-COMMUNITY-2.4.1-201011120951/SRPMS/kernel-2.6.32.25-57.e40.src.rpm
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/endian/EFW-COMMUNITY-2.4.1-201011120951/DEVEL_RPMS/glibc-kernheaders-2.4-9.1.103.EL.endian1.i586.rpm
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/glibc-2.3.4-2.19.endian5.i386.rpm --nodeps
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/glibc-common-2.3.4-2.19.endian5.i386.rpm --nodeps --force
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/glibc-headers-2.3.4-2.19.endian5.i386.rpm --nodeps --force
[root@localhost src]# rpm --root /efw-dev -Uvh /efw-dev/usr/src/EFW-COMMUNITY-2-devel-RPMS/glibc-2.3.4-2.19.endian5.i386.rpm --nodeps --force
[root@localhost src]# chroot /efw-dev/
[root@localhost src]# rm -rf /var/lib/rpm/__db*
[root@localhost src]# rpm --rebuilddb
bash-3.00# rpm -Uvh /usr/src/EFW-COMMUNITY-2-devel-RPMS/glibc-devel-2.3.4-2.19.endian5.i386.rpm
bash-3.2# cd /usr/src/redheat
bash-3.2# rpmbuild -ba SPECS/kernel.spec --target i686
bash-3.00# tar -czvf kernel-pae.tar.gz /usr/src/endian/RPMS/i686/*
bash-3.00# exit
[root@localhost src]# scp /efw-dev/usr/src/redhat/kernel-pae.tar.gz efw:/tmp
[root@localhost src]# ssh root@efw
root@efw:~ # cd /tmp/
root@efw:/tmp # tar -xzvf kernel-pae.tar.gz
root@efw:/tmp # rpm -Uvh /tmp/usr/src/endian/RPMS/i686/kernel-* --force --nodeps
root@efw:/tmp # reboot
root@efw:~ # uname -a
Linux efw.cluster.local 2.6.32.25-57.e40.i686.PAE 0000001 SMP Sat Jun 4 10:48:51 EDT 2011 i686 i686 i386 GNU/Linux

Sincerely yours
Georg

Idealerweise wird danach in der /boot/grub/grub.conf der Bootparameter veraendert, panic=10 und quiet entfernen, console=hvc0,ttyS1 hinzufuegen. Das liest sich dann etwa so:

title Endian Firewall Community release 2.4.1 (2.6.32.25-57.e40.i686.PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32.25-57.e40.i686.PAE root=UUID=2ae5c0da-f514-4a84-b69d-88be2dc57cd6 console=hvc0,ttyS1 ro
initrd /boot/initrd-2.6.32.25-57.e40.i686.PAE.img
savedefault

Natuerlich ist die UUID der Root-Partition entsprechend dem originalen Eintrag beizubehalten.

Damit die hvc0 Konsole auch benutzt werden kann, in /etc/inittab einen (virtualisiert ohnehin uninteressanten) tty2 Starteintrag auf hvc0 aendern, und in /etc/securetty hvc0 ergaenzen.

UPDATE: Der oben beschriebene Weg funktioniert bis auf die Einschraenkung, dass das ipsec.ko Kernel Modul nicht vorhanden ist.

Das bedeutet, IPSec Verbindungen werden zwar aufgebaut, allerdings greifen die Routing Einstellungen nicht. IPSec ist damit nicht nutzbar.

Um dieses Problem geloest zu bekommen, habe ich einen aktuellen Centos 6.1 Kernel mit dem Openswan Treiber und SAREF Patches aus Openswan 2.6.29dr11 mit fuer Endian 2.4.1 angepasster Kernelkonfiguration gebaut.
Dieser Kernel ist unified und hat so viel Plattformunterstuetzung wie moeglich aktiv, d.h. bootet Bare-Metal genauso wie unter Xen, KVM und VMWare.

Nachdem das ganze Prozedere schon zeitraubend genug war, habe ich final keine RPM Pakete gebaut, sondern ein funktionierendes Set aus Kernel, Ramdisk und Modules als tar.gz gepackt.
Das muss einfach nur im Wurzelverzeichnis der Endian ausgepackt werden.
Hier Beispiel fuer den Bootloader in /boot/grub/grub.conf, damit dieser Kern auch gebootet wird:

title Endian Firewall Community release 2.4.1 (2.6.32-131.21.1.el6efw.i686)
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.32-131.21.1.el6efw.i686 root=UUID=2c507bd3-1cac-42e0-a7d9-3168064941b1 selinux=0 console=hvc0,ttyS0 ro
    initrd /boot/initrd-2.6.32-131.21.1.el6efw.i686.img
    savedefault

Ueber selinux laesst sich streiten, wer weiss was es tut, kann es aktivieren und Regeln definieren, alle anderen lassen es deaktiviert 😉

Die UUID fuer die root-Partition muss natuerlich angepasst werden, und laesst sich mit blkid herausfinden.

root@efw:~ # blkid $(grep ' / ' /etc/mtab | cut -d' ' -f1)       
/dev/xvda1: UUID="2c507bd3-1cac-42e0-a7d9-3168064941b1" SEC_TYPE="ext2" TYPE="ext3" 
root@efw:~ # 

Das Archiv mit allen Binaries kann hier direkt heruntergeladen werden.

Wer den Kernel anders konfiguriert braucht, kann per Mail das VM Image der Build-Maschine bekommen. Da ein sauberes Sourcepaket oder gar ein SRPM zu bauen ist mir – ehrlich gesagt – zu aufwendig.

Schreibe einen Kommentar