Until now I have needed two devices for my server needs at home. One to serve as a general purpose router, phone, web and file server (Dell PowerEdge SC420) and another to watch my media on TV (Popcorn Hour). But recently I decided to combine the two and build a single, low power computer that costs less than the resale value of the previous two devices. Save money and save energy, what’s there to not like. Decribed below is my new set up. So far I have been very pleased with the performance. It consumes only 30W of power, even when playing 1080p HD movies. The rest of the functions don’t even register as CPU use (maybe 1% or 2%).

The Hardware

The key to building this device was to carefully pick the right combination of hardware and software while keeping the cost down. As far as processors go, ARM processors have extremely low power consumption and usually incorporate the memory controller and graphics plus additional perpheral connectivity on a single chip. However, the motherboards are usually all geared towards embedded use. I wanted to build a general purpose server with SATA controller and support of a mainstream Linux distribution. Because of this, I chose theIntel Atom 230 processor. It has two cores running at 1.6GHz and doesn’t require a fan to cool it. Its younger brother – Intel Atom N330 has 4 cores, but double the thermal dissipation requiring the use of a fan to cool it. I try to minimize the use of moving parts in my projects. So this was out. As it turned out, the 230 has plenty of horsepower to run XMBC; 330 would have been overkill (don’t believe everything you read on the web; people generally tend to want more, even when it isn’t needed).

APEX MI-008

The Atom is fine for running Linux as a router, file server etc., but what about video playback and 3D acceleration necessary for the fancy GUI of XBMC? For this, NVIDIA makes the companion chip called ION. It has numerous HD acceleration features including H.264 decoding and full HD output. And most importantly, the API used to utilize these features VDPAU, is fully supported in Linux and XBMC. So I searched for a Mini-ITX motherboard that has Intel Atom N230 CPU and NVIDIA Ion chipset and found the ZOTAC IONITX-B-E. I added 2 1GB DDR memory sticks to the board to take advantage of the double data rate transfer.

The next step was to find a suitable chassis that would stay quiet and fit under the TV. For this, I found APEX MI-008. It is fairly good looking and very quiet. Luckily, the air intake for the power supply is right above the CPU; so it sucks the rising heat out from the case. I did not need to install any more fans in the system.

The last step was to buy some storage. I took a trip to Best Buy and picked up a 2TB Western Digital Green drive. This drive parks its head every 5 seconds and gets unparked when the Linux ext filesystem does a flush every 8 seconds! This causes excessively high load cycles on the hard drive. To disable the parking, Google wdidle3.exe. This is a DOS tool that WD provides to disable the park timer on the hard driver, increasing its life expectancy in theory.

The Software

The first order of business after the hardware was assembled was to install Ubuntu 9.10 Server. This is a minimal install with no GUI at all. I have no intention of using the desktop, I control everything from the command line. The only reason the X-Server is required is for XBMC. So I start up a barebones X-Server with absolutely no window manager of any sort and then start up XBMC which occupies 100% of the screen at 1920×1080.

The Linux kernel does not include the VDPAU drivers from NVidia. This needs to be downloaded and installed manually. Thankfully, the installer is pretty good. You can install the drivers just by executing the downloaded binary. It installs the drivers and configures your xorg.conf file. In order to set up screen resolution and other features visually, there is a tool called nvidia-settings which requires X-Windows to be started up. Once it is installed, simply tell XBMC to use VDPAU and everything will run silky smooth.

http://www.nvidia.com/object/unix.html

There was another problem which apparently is resolved in the next version of the Linux kernel. The coretemp driver in 2.6.31-14-generic-pae is missing information about Intel Atom processors. This driver is used to read temperature off of the Atom processor. I had to download the source code, manually apply the patch, compile and load. Once compiled and loaded, you can use ‘sensors’ program from lm-sensors package to read the temperature. You can download my files as well as precompiled version of coretemp for 32-bit kernel 2.6.31. If you have a later kernel, you probably don’t need this.

coretemp-patch-2.6.31.tar.gz

There doesn’t appear to be a way to read the chipset temperature yet. But the nvidia-settings tool and BIOS are both able to display the value using some magic that is not available to the open source world.

We haven’t discussed how the media center is controlled so far. There are various ways to do it – an infrared remote, RF remote, iPhone app and web interface. I use my iPhone to control it until I can buy a regular remote. It works really well and allows you to control the system from anywhere (I mean anywhere.. as long as you have 3G or wifi).

Here’s a video from You Tube until I can make my own. If you haven’t seen XBMC before, this will give you an idea of how cool it is:

The Specification List

Parameter Value
CPU Intel Atom N230 @1.6GHz
Chipset NVidia ION
Motherboard ZOTAC IONITX-B-E
Memory 2 x 1GB DDR2
Storage Western Digital Caviar Green 2TB
Chassis APEX MI-008
Operating System Ubuntu 9.10
Media Center Software XBMC 9.11 beta2
Observed CPU temp 55°C – 72°C (spec. max 95°C)
Observed HD temp 41°C – 45°C (spec. max 60°C)
Power use 30W – 35W
> cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 28
model name      : Intel(R) Atom(TM) CPU  230   @ 1.60GHz
stepping        : 2
cpu MHz         : 1599.940
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
                  clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc
                  arch_perfmon pebs bts pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr
                  pdcm movbe lahf_lm
bogomips        : 3199.88
clflush size    : 64
power management:
> lspci

00:00.0 Host bridge: nVidia Corporation MCP79 Host Bridge (rev b1)
00:00.1 RAM memory: nVidia Corporation MCP79 Memory Controller (rev b1)
00:03.0 ISA bridge: nVidia Corporation MCP79 LPC Bridge (rev b2)
00:03.1 RAM memory: nVidia Corporation MCP79 Memory Controller (rev b1)
00:03.2 SMBus: nVidia Corporation MCP79 SMBus (rev b1)
00:03.3 RAM memory: nVidia Corporation MCP79 Memory Controller (rev b1)
00:03.5 Co-processor: nVidia Corporation MCP79 Co-processor (rev b1)
00:04.0 USB Controller: nVidia Corporation MCP79 OHCI USB 1.1 Controller (rev b1)
00:04.1 USB Controller: nVidia Corporation MCP79 EHCI USB 2.0 Controller (rev b1)
00:06.0 USB Controller: nVidia Corporation MCP79 OHCI USB 1.1 Controller (rev b1)
00:06.1 USB Controller: nVidia Corporation MCP79 EHCI USB 2.0 Controller (rev b1)
00:08.0 Audio device: nVidia Corporation MCP79 High Definition Audio (rev b1)
00:09.0 PCI bridge: nVidia Corporation MCP79 PCI Bridge (rev b1)
00:0a.0 Ethernet controller: nVidia Corporation MCP79 Ethernet (rev b1)
00:0b.0 IDE interface: nVidia Corporation MCP79 SATA Controller (rev b1)
00:0c.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
00:10.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
00:15.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
00:16.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
00:17.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
00:18.0 PCI bridge: nVidia Corporation MCP79 PCI Express Bridge (rev b1)
03:00.0 VGA compatible controller: nVidia Corporation ION VGA (rev b1)
> cat /proc/scsi/scsi

Attached devices:
Host: scsi3 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: WDC WD20EADS-00R Rev: 01.0
  Type:   Direct-Access                    ANSI  SCSI revision: 05
> sensors

coretemp-isa-0000
Adapter: ISA adapter
Core 0:      +65.0°C  (crit = +95.0°C)

coretemp-isa-0001
Adapter: ISA adapter
Core 1:      +65.0°C  (crit = +95.0°C)
> smartctl -a /dev/sda

smartctl version 5.38 [i686-pc-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD20EADS-00R6B0
Serial Number:    WD-WCAVY0222862
Firmware Version: 01.00A01
User Capacity:    2,000,398,934,016 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Sat Dec 19 18:22:23 2009 EST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x84) Offline data collection activity
                                        was suspended by an interrupting command from host.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                 (41580) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 255) minutes.
Conveyance self-test routine
recommended polling time:        (   5) minutes.
SCT capabilities:              (0x303f) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   140   140   021    Pre-fail  Always       -       9975
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       16
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       256
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       14
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       4
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       11
194 Temperature_Celsius     0x0022   109   103   000    Old_age   Always       -       43
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   100   253   000    Old_age   Offline      -       0