Tuesday, August 18, 2009
Alix board debian installation 2
Hardware
Using the Decisio casing, I can easily mount an internal 2,5" IDE on the 44-pin IDE header. But don't forget to jumper the drive for slave! I couldn't boot my first Alix for an hour before I remembered this. And to make things worse, I forgot again on the second Alix. Finding jumpers that fit a 2,5" IDE drive can be a hassle: they're really tiny.
Preparing the filesystem
First of, I used ext2 instead of ext3: I don't see the need for a journal on CF especially since it is only 4Gb in size.
Secondly, the use of tune2fs to reduce filesystem checks makes sense, but the behaviour of fsck.ext2 has changed recently. It used to not force disk with a timestamp in the past, but it has reverted this. It only doesn't do this anymore with timestamps in the 1970 region (the unix epoc), but it seems Alix has an epoch of 2000. In practise this means that when Alix boots, the time is in the past (as there is no battery backed-up RTC) and a check will always be done.
I haven't found a solution yet.
Configuring the base system
The original instructions mentioned a /dev/sda1 for the fstab. Actually Alix only has old-fashioned IDE ports, so this should read /dev/hda1.
Disabling unneeded drivers
Add "blacklist pcspkr" to /etc/modprobe.d/blacklist
Networking
The default Debian Lenny kernel doesn't seem to recognize the ethernet ports. At least in my case I only got eth1 up. If this happens to you to, update to 2.6.30 (which currently can be found in unstable). This worked for my first Alix (in progress for Alix nr. 2 as we speak).
Alix board debian installation
Note: I've copied them verbatim. I'll keep my changes in seperate postings.
Prerequisites
- A host system running debian. Can also be a Knoppix live CD. I used Ubuntu 8.10.
- CF card connected to a card reader. 2 GB was used for this system.
For the remainder of the guides, following notations are used:
- CF card mounted on the host system as /dev/sdf
- Prompt of the host system = Host#, so all commands following this prompt must be executed on the host system
Preparing the file system
With fdisk, create a partition and make it bootable, type should be 83:
Host# fdisk /dev/sdf
Next, create the filesystem:
Host# mkfs.ext3 /dev/sdf
and tune it to reduce file system checks:
Host# tune2fs -c 0 /dev/sdf1
Install minimal debian system
On the host system, install debootstrap:
Host# apt-get install debootstrap
Mount the CF card as /mnt/cf:
Host# mount /dev/sdf1 /mnt/cf
and execute debootstrap:
Host# debootstrap --arch i386 lenny /mnt/cf http://ftp.debian.org/debian
Make sure that the status returned by debootstrap is:
I: Base system installed successfully.
chroot in the newly created environment
Host# mount --bind /proc /mnt/cf/proc
Host# mount --bind /sys /mnt/cf/sys
and then chroot:
Host# chroot /mnt/cf /bin/bash
Configure the base system
- Remove all lines of the form /sbin/getty ... ttyN
- Add the following line: T0:23:respawn:/sbin/getty -L ttyS0 38400
Check, create and/or adapt the following lines:
- /etc/fstab
proc /proc proc defaults 0 0
/dev/sda1 / ext3 noatime,errors=remount-ro,commit=120 0 1
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/tmp tmpfs defaults,noatime 0 0
tmpfs /var/run tmpfs defaults 0 0
tmpfs /var/log tmpfs defaults 0 0
tmpfs /var/lock tmpfs defaults 0 0 - /etc/hostname
1 line with the hostname of the system - /etc/hosts
127.0.0.1 localhost - /etc/resolv.conf
search *
nameserver your.nameserver.com - /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eht0 inet dhcp
Install additional packages
deb http://ftp.be.debian.org/debian/ lenny main
deb-src http://ftp.be.debian.org/debian/ lenny main
deb http://www.voyage.hk/dists/experimental ./
The repository from voyage Linux is added since I will grab a kernel from that site.
Update the package repository with:
# aptitude update
You will probably get an error of the form:
: GPG error: http://www.voyage.hk ./ Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FC05444194EFBFA6
Add the missing key:
# gpg --keyserver subkeys.pgp.net --recv-keys FC05444194EFBFA6
# gpg --export
--armor FC05444194EFBFA6 apt-key add -
and try again:
# aptitude update
To avoid warnings about locale:
# export LC_ALL=C
In case you want to install additional locales:
# aptitude install locales
# dpkg-reconfigure locales
Now is also a good time to install ssh:
# aptitude install ssh
Check if /etc/ssh/sshd_not_to_be_run is not present, if so, delete
Install a kernel
# apt-cache search linux-image
For example, one from voyage is: linux-image-2.6.26-486-voyage
Before installing the kernel, create a configuration file /etc/kernel-img.conf with contents:
# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
relative_links = yes
do_bootloader = no
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
Install the kernel image with:
# aptitude install linux-image-2.6.26-486-voyage
Create /etc/modules with content:
natsemi
hostap_pci
lm90
w83627hf
scx200_acb base=0x810,0x820
geodewdt
Install grub
# aptitude install grub
Create the grub directory
# mkdir /boot/grub
Copy files needed for grub
# cp /usr/lib/grub/i386-pc/* /boot/grub
Create /boot/grub/device.map file with contents:
(hd0) /dev/sdf
Note that /dev/sdf is the device name of the CF mounted on the development machine
Exit chroot:
# exit
Unmount /proc and /sys on the development machine
Host# umount /mnt/cf/proc
Host# umount /mnt/cf/sys
Now, on the development machine:
Host# grub-install --root-directory=/mnt/cf /dev/sdf
Create menu.lst for grub, edit /mnt/cf/boot/grub/menu.lst with contents:
serial --speed=38400
terminal serial
timeout 1
default 0
title debian-lenny
root (hd0,0)
kernel /vmlinuz root=LABEL=ROOT_FS console=ttyS0,38400n8
initrd /initrd.img
Unmount the CF on the development machine
Host# umount /mnt/cf
In case busy, check with lsof what process is blocking it, most probably sshd, in which case:
Host# killall sshd
and unmount again:
Host# umount /mnt/cfAdd a label to the partition with:
Host# e2label /dev/sdf1 ROOT_FS
Now insert the CF in alix and boot, check the progress on the serial terminal
Login
# dmesg
In case you get errors such as:
eth0: ERROR while getting interface flags: No such device
and no network connectivity, you need to correct /etc/udev/rules.d/70-persistent-net.rules:
- Comment the atl1 SUBSYSTEM line
- Check and correct the names of eth0, eth1 and eth2. They should correspond to the MAC addresses of these interfaces
Also, avoid warnings in perl about locale. Edit /root/.profile and add:
export LC_ALL=C
export LANG="en_US.UTF-8"
Some settings to reduce CF wear. Link mtab to procs since mtab is written a lot:
# rm -f /etc/mtab
# ln -s /proc/mounts /etc/mtab
Configure the timezone with:
# dpkg-reconfigure tzdata
and make sure UTC=yes in /etc/default/rcS
Finally, set root password with passwd and create users with useradd
Install ntp
Additionally, the clock is not so accurate with a lot of drift (upto 4 hours / 6 days!).
For platforms with continuous network access, the best solution is to install ntp:
# aptitude install ntp
Adapt /etc/ntp.conf and specify a time server (in addition to the predefined ones)
Reload the ntp.conf file with:
# /etc/init.d/ntp restart
and check if peers are found with:
# ntpq -p
Compensate for clock drift
If the clock drift is bigger than 43.2 seconds per day, ntp can not compensate anymore.
A quick measurement on the Alix reveals that clock drift is more than 2000 seconds a day!
The solution is twofold:
- Install the adjtimex package to set the kernel time variables and compensate so that clock drift is less than 43.2 seconds per day
- Use ntp to synchronize to a time reference
First, disable ntp:
# /etc/init.d/ntp stop
Then, install adjtimex on the Alix:
# aptitude install adjtimex
As part of the installation, it will do a measurement of the clock skew and report values for tick and frequency. These quick measurements (70 seconds) resulted in good enough values to stay within 43.2 seconds drift/day.
Make sure these values are correctly placed in /etc/default/adjtimex
The installation will also add links to /etc/rcS.d so that adjtimex is run once at boottime.
Start adjtimex with:
# /etc/init.d/adjtimex start
and restart ntp:
# /etc/init.d/ntp start
In case the reported tick and frequency values during installation of adjtimex are not good enough, following workaround can be used:
Disable ntp:
# /etc/init.d/ntp stop
Set the values of tick and frequency to the default value in /etc/default/adjtimex:
- tick = 10000
- frequency = 0
and force reload these values:
# /etc/init.d/adjtimex restart
Synchronize the clock once with ntpdate:
# ntpdate your.timeserver.com
(in case ntpdate is not present, install it with: aptitude install ntpdate)
Let the system run for one day exactly (use a reference clock such as a DCF clock for instance) and check the date again with:
# date
Now you know the time difference you need to compensate for. Take as an example: system clock is 2000 seconds ahead.
With this number, you can calculate the value of tick:
- 1 tick is 8.64 sec/day
- 2000 / 8.64 = 231.5 ticks
If the clock is ahead, subtract from 10000: tick = 10000 - 231 = 9769
(if clock is behind, add to 10000)
This can be further finetuned with the frequency parameter since there is not enough granularity with tick alone.
- 231 * 8.64 = 1995.84
- 2000 - 1995.84 = 4.16 sec
This means that using the tick value, there will still be a 4.16 second deviation which need to be compensated for:
- frequency = 2^16 * 4.16 / 0.0864 = 3155437
Put these values (tick=9769 and frequency=3155437) in /etc/default/adjtimex and apply them:
# /etc/init.d/adjtimex restart
Now you can monitor the clock again for a couple of hours.
In case clock drift is within 43.2 sec/day, enable ntp again:
# /etc/init.d/ntp start