This HOWTO describes how to get SME 7.x working properly on a Jetway J7F4 Mini-ITX motherboard, or other Mini-ITX boards based on the VIA CN700 or a similar chipset. These motherboards are an extremely attractive option for building a small, energy-efficient yet relatively fast server. The J7F4 series have two Realtek RTL8110SC Gigabit LAN adapters on board, and are powered by a VIA C7 (Esther) processor at 1.2 Ghz (passive cooling), or at 1.5 or 2.0 Ghz with active cooling. In addition, the chipset includes hardware AES and SHA encryption/decryption, hardware MPEG2/4 decoding and a number of other potentially useful features. Unfortunately however, this hardware is not very well supported by the 2.6.9 kernel that is supplied with SME and CentOS 4. This document describes the compilation and installation of a custom kernel. It can also be used as an example of how to get SME running on or with any hardware that requires a modified or newer linux kernel.
Before you start
It is always a good idea to make a backup, in case things get messed up. Furthermore, as the standard SME 7.x kernel doesn't support the RTL8110SC network controllers on board the J7F4, you might want to perform at least steps 1 through 4 on a different machine, and switch the harddisk to the Jetway machine after the new kernel is installed. If you follow the instructions below, the new kernel should run on most machines with a 686-compatible CPU (i.e. a Pentium II or higher).
Alternatively you could install a temporary network-card in the PCI slot on the Jetway-board, or install the r1000 kernel module from Realtek. The r1000 driver works with all RTL8169 and RTL8110 gigabit ethernet controllers. However, many people have found it to be buggy and unstable. Realtek has recently released a new version (6.001.00) of the r1000 driver, which is rumoured to fix some of the problems of earlier versions (1.05 and before). However, this version does not yet compile with newer kernel versions. You can use it with the SME/CentOS 2.6.9 kernel, but not with the new 2.6.2x kernels. As soon as you have installed the new kernel you can however switch to the r8169 kernel module. Recent versions of this driver have support for the RTL8110.
Step 1: Installing a compiler and build tools
Log in to the shell as root, and install the packages needed for compiling a kernel:
yum install kernel-devel gcc gcc-c++ ncurses-devel
Step 2: Installing the kernel sources
You can download the source tree for the newest Linux kernel from http://www.kernel.org. You should check to see which versions are available. If you need stability, you're best off using a 'stable' version. If you need maximum support for new hardware, you can try a 'testing' version, with or without the latest snapshot patches. For example, I used the latest 'testing' kernel, at the time of writing this was 2.6.21-rc5:
cd /usr/src/ wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.21-rc5.tar.bz2
Unpack the source tree and make /usr/src/linux a symbolic link to the source directory:
tar xvjf linux-2.6.21-rc5.tar.bz2 ln -s /usr/src/linux-2.6.21-rc5 /usr/src/linux
I also downloaded and applied the latest snapshot patches (this is of course optional, see the references section for more information):
wget http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.21-rc5-git1.bz2 cd /usr/src/linux/ bzip2 -dc /usr/src/patch-2.6.21-rc5-git1.bz2 | patch -p1
Finally, I applied a patch to add kernel support for the VIA C7 processor (this is also optional, the C7 is i686 compatible so it should work just fine without this patch):
wget -O /usr/src/via-c7.patch http://lkml.org/lkml/diff/2007/2/12/428/1 cd /usr/src/linux/ patch -p1 </usr/src/via-c7.patch
Step 3: Configuring the kernel
Next, we need to configure our new kernel. We need to make sure that all the drivers we need are included in the kernel or are built as modules. It is always a good idea to use the current kernel configuration as a starting point:
cd /usr/src/linux make clean && make mrproper cp /boot/config-`uname -r` ./smeconfig
Run the configuration tool:
Select "Load an Alternate Configuration File" and load the file "smeconfig". If you don't want to bother with the manual configuration below, you may also load the ready-made configuration file from this site and skip to the next step. This configuration should work on all boards with a VIA C7 processor.
We should give our custom kernel a name, to distinguish it from a generic kernel. You may choose any suffix you want, in this example I will use "-custom-via". Select the following in the menu:
General setup ---> () Local version - append to kernel release
Fill in "-custom-via".
Next comes a tricky part, you need to select the appropriate drivers. You will need at least these options to make MASQ routing and VPN work:
Device Drivers ---> Network device support ---> <M> PPP (point-to-point protocol) support <M> PPP MPPE compression (encryption) (EXPERIMENTAL)
Networking ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> --- Network packet filtering framework (Netfilter) [ ] Network packet filtering debugging [*] Bridged IP/ARP packets filtering Core Netfilter Configuration ---> <M> Netfilter connection tracking support Netfilter connection tracking support (Layer 3 Dependent Co. <M> Netfilter Xtables support (required for ip_tables) [...]
I also selected all the netfilter targets as modules:
IP: Netfilter Configuration ---> [...] <M> FTP protocol support <M> PPTP protocol support <M> IP tables support (required for filtering/masq/NAT) <M> IP range match support <M> TOS match support <M> recent match support <M> ECN match support <M> TTL match support <M> Owner match support <M> address type match support <M> Packet filtering <M> REJECT target support <M> LOG target support <M> ULOG target support <M> Full NAT <M> MASQUERADE target support <M> REDIRECT target support <M> NETMAP target support <M> SAME target support <M> Packet mangling <M> TOS target support <M> ECN target support <M> raw table support (required for NOTRACK/TRACE) <M> ARP tables support <M> ARP packet filtering <M> ARP payload mangling
I also selected these, just in case:
<M> IRC protocol support <M> TFTP protocol support <M> Amanda backup protocol support <M> H.323 protocol support (EXPERIMENTAL) <M> SIP protocol support (EXPERIMENTAL)
Finally you should make sure that all necessary modules are built for the hardware that you have. The default settings are quite reasonable, but for Jetway or VIA Epia boards, I would select at least the following additional options (when available):
Processor type and features ---> [*] Symmetric multi-processing support Processor family (VIA C7) ---> (X) VIA C7
If you have an older Mini-ITX board based on a VIA C3 processor, you should of course select one of the the VIA C3 options here instead of the C7. If your board has a 'Luke' CoreFusion or Eden-N processor (such as the VIA Epia VT or EK series Mini-ITX boards), you should probably select VIA C3-2 (Nehemiah). Symmetric multi-processing support (SMP) is only needed for dual Eden-N boards, such as the VIA Epia VT310DP.
Power management options (ACPI, APM) ---> [*] Power Management support ACPI (Advanced Configuration and Power Interface) Support ---> [*] ACPI Support [*] Procfs interface (deprecated) <M> AC Adapter <M> Button <*> Fan <*> Processor <*> Thermal Zone CPU Frequency scaling ---> [*] CPU Frequency scaling <*> CPU frequency translation statistics Default CPUFreq governor (userspace) ---> <*> 'performance' governor <*> 'powersave' governor --- 'userspace' governor for userspace frequency scaling <*> 'ondemand' cpufreq policy governor <*> 'conservative' cpufreq policy governor --- CPUFreq processor drivers <*> ACPI Processor P-States driver <*> VIA C7 Enhanced PowerSaver (EXPERIMENTAL)
Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> <*> VIA82CXXX chipset support Serial ATA (prod) and Parallel ATA (experimental) drivers ---> <M> ATA device support <M> VIA SATA support Network device support ---> Ethernet (10 or 100Mbit) ---> <M> VIA Rhine support [*] Use MMIO instead of PIO Ethernet (1000 Mbit) ---> <M> Realtek 8169 gigabit ethernet support <M> VIA Velocity support Character devices ---> <M> Hardware Random Number Generator Core support <M> VIA HW Random Number Generator support <*> VIA chipset support <M> Via unichrome video cards I2C support ---> <M> I2C support <M> I2C device interface I2C Hardware Bus support ---> <M> VIA VT82C596/82C686/82xx and CX700 Sound ---> <M> Sound card support Advanced Linux Sound Architecture ---> <M> Advanced Linux Sound Architecture <M> Sequencer support <M> OSS Mixer API <M> OSS PCM (digital audio) API PCI devices ---> <M> VIA 82C686A/B, 8233/8235 AC97 Controller
Cryptographic options ---> Hardware crypto devices ---> <M> Support for VIA PadLock ACE <M> PadLock driver for AES algorithm <M> PadLock driver for SHA1 and SHA256 algorithms
When you're done, exit and save your configuration.
Step 4: Compiling and installing the kernel
When everything is configured, you can can build the kernel. In order to facilitate an easy installation and maintenance, we will build the new kernel as an RPM package:
This will take a while. When the build is done, the kernel package will be located in /usr/src/redhat/RPMS/i386/. You can install it using rpm, e.g.:
cd /usr/src/redhat/RPMS/i386/ rpm -ivh --nodeps kernel-2.6.21rc5git1customvia.i386.rpm
Add the switch --force if you want to replace a previously installed version.
The new kernel is now almost ready for booting. You need to create an initrd ramdisk for the new kernel:
/sbin/mkinitrd /boot/initrd-2.6.21-rc5-git1-custom-via.img 2.6.21-rc5-git1-custom-via
And you need to add the new kernel to the configuration file of the GRUB bootloader:
My kernel is at /boot/vmlinuz-2.6.21-rc5-git1-custom-via and my initrd image is /boot/initrd-2.6.21-rc5-git1-custom-via.img. So I add the following kernel definition to grub.conf, as the first kernel in the list:
title SME Server (2.6.21-rc5-git1-custom-via) root (hd0,0) kernel /vmlinuz-2.6.21-rc5-git1-custom-via ro root=/dev/main/root initrd /initrd-2.6.21-rc5-git1-custom-via.img
Before rebooting, you should tell SME what driver you want to use for the on-board ethernet controllers.
If your board has RealTek RTL8169 or RTL8110 gigabit ethernet controllers (e.g. the Jetway J7F4 or the 3x Gigabit LAN extension module for the Jetway J7F2), you'll want to use the r8169 driver:
/sbin/e-smith/config set EthernetDriver1 r8169 /sbin/e-smith/config set EthernetDriver2 r8169
If your board has dual VIA 10/100 Mbit ethernet controllers (e.g. the VIA Epia VT or Epia EK series), you'll want to use the via-rhine driver:
/sbin/e-smith/config set EthernetDriver1 via-rhine /sbin/e-smith/config set EthernetDriver2 via-rhine
These instructions assume that you have two controllers on board with the same chipset. If you have more than one type of controller, you should of course modify the 'set EthernetDriver1' etc. lines to use the correct drivers. For instance, the VIA Epia VT boards have one VIA 'Velocity' series gigabit ethernet controller in addition to the dual 10/100 Mbit controllers, so you could also do:
/sbin/e-smith/config set EthernetDriver1 via-rhine /sbin/e-smith/config set EthernetDriver2 via-velocity /sbin/e-smith/config set EthernetDriver3 via-rhine
Step 5: Booting the new kernel
Now you can reboot the server:
/sbin/e-smith/signal-event post-upgrade /sbin/e-smith/signal-event reboot
Don't forget to select the new kernel in the GRUB boot menu! You can enter the kernel selection menu by hitting a key when in the GRUB splash-screen. Select the new kernel using the cursor keys, and keep your fingers crossed... ;-) GRUB will automagically remember the last-used kernel next time you boot.
If all goes well, your server should come up after a minute or so. You should check if everything still works, especially networking. If not, you have probably forgotten one or more essential modules, and you should go back to step 3.
Step 6: Final configuration
If all has gone well, you should now be up and running on your brand new kernel. All that remains is to make sure that any remaining 'extra features' are loaded into the kernel. If you are running on a VIA Eden, Eden-N or 'Luke' CoreFusion board such as the Jetway J7F4 / J7F2 or the VIA Epia VT / EK series, try the following to enable hardware crypting support:
/sbin/modprobe via-rng /sbin/modprobe padlock
And in the unlikely event that you want to run an Xserver with hardware accelerated 2D graphics and MPEG-decoding:
If your board has a C7 processor, you should also enable on-demand frequency scaling, so the processor will switch from 400 Mhz to e.g. 1200 Mhz when needed:
echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
If you have a dual core or dual processor board, you should do this for the second processor as well:
echo ondemand >/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
Of course, you don't want to type all of this every time you reboot the server. So you can create a script in /etc/e-smith/events/local that will configure things for you at boot-time:
Type or paste the following into the script:
#!/bin/sh # Custom initialisation stuff for the VIA C7 /sbin/modprobe via_rng /sbin/modprobe padlock echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # Uncomment the following for dual-processor boards: # echo ondemand >/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
Save the script (F2 or F10 in mcedit) and set the right permissions:
chmod 554 /etc/e-smith/events/actions/custom-setup-via
Add the script to the 'local' event by making a link to it in /etc/e-smith/events/local/:
ln -s /etc/e-smith/events/actions/custom-setup-via /etc/e-smith/events/local/S60custom-setup-via
Alternatively, you can put the script directly in etc/e-smith/events/local/ if you find that more convenient. It will be run at boot time, and you can always trigger it manually by issuing:
Step 7: Cleaning up
For security reasons, it is best to remove the compiler and development tools if you are not going to use them anymore:
yum -y remove libstdc++-devel cpp glibc-kernheaders glibc-headers glibc-devel gcc gcc-c++ kernel-devel ncurses-devel
You can also delete the remaining packages and sources in /usr/src, if you wish.
Other Tips & Tricks
According to this thread, the chipset used on many VIA C7-based boards is quite sensitive to overheating. This may cause lockups during high disk activity, especially if your board is passively cooled and in a small case. Jetway has released a new BIOS version (A07) for J7F4 boards that seems to more or less fix this problem. To flash it, you'll need to boot the board in DOS and use the Award flash utility. If you keep experiencing mysterious lockups after the BIOS-update, it is advisable to add a CPU- or case-fan or to fit the board into a bigger case.
Jetway have released a new revision of the J7F4 mainboard, which incorporates a bigger heatsink in conjunction with the new BIOS to solve the overheating problems. Thanks to Ryan Salsbury for pointing this out. Ryan has also kindly provided pictures of the old and new board revisions:
- The board with the old, small heatsink
- Rear view of the old board
- New board, with larger heatsink
- Front view of the new board
- Rear view of the new board
- Side view of the new board
- Overview of the new board
Kernel Version Issues
People have reported that USB drive recognition will no longer work after updating the kernel. This is due to the fact that the udev version used in CentOS 4 will not work with kernel versions above 2.6.12. You will need to update the udev package. I will update this Howto as soon as I have tried this myself. In the mean time, you may find newer udev versions here: ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/
Another problem is that the custom kernel may cause problems when trying to upgrade SME. On any update that includes a newer kernel, yum will complain about dependency problems because the custom kernel has a higher version-number than the kernel that is to be updated. The only way around this seems to be to uninstall the custom kernel (using yum remove ...), do the upgrade, and then re-install the custom kernel before rebooting. You can also use the exclude package option to avoid kernel and kmod updates, and everything will just work fine !
Author and Acknowledgements
This Howto is written by Levien van Zon (levien at scum.org). It is based to a large extent on forum postings and documents by Harro, Charlie Brady, Falko Timme, Simon Arlott, Neil, Ryan Salsbury and many others. See the references below for more information. This document may still contain mistakes and typos, so please feel free to add or correct things if you have wiki-access. You can also send corrections and suggestions to the author by e-mail.