Showing posts with label Ubuntu. Show all posts
Showing posts with label Ubuntu. Show all posts

Thursday, June 4, 2009

Auto rip audio CDs in Ubuntu Server

I got my headless Linux server set up to auto rip music CDs and add them to my music library. Pop a CD in the tray and it automatically rips and tags the tracks to FLAC files and ejects the CD... and queues up a task to transcode to mp3 and then rescan my Squeezecenter library later. Here's how:

* Detection of the audio CD and kicking stuff off is done by ivman.
* Ripping and tagging is done by abcde.
* Transcoding is done by flac2mp3.
* Refreshing the library is done using the Squeezecenter CLI.

It took me "a while" to get it working end to end. The tough part was getting ivman configured. But that's the essential part for automation.

Ivman

To install
$ sudo apt-get install ivman
which installs a bunch of dependencies (but no X). Then I enabled an action to start a script when ivman detects an audio CD. This is what I added to /etc/ivman/IvmConfigActions.xml:
<ivm:Match name="hal.volume.disc.type" value="cd_rom">
<ivm:Match name="hal.volume.disc.has_audio" value="true">
<ivm:Match name="hal.volume.disc.has_data" value="false">
<ivm:Option name="exec" value="/home/user_x/bin/rip_cd '$hal.block.device$'"/>
</ivm:Match>
</ivm:Match>
</ivm:Match>
The rip_cd script just invokes abcde and directs its output to a log file.

The problem that broke my heart for ages was that ivman didn't have permission to use the cdrom drive. I got this error in the log file from abcde:
cd-discid: /dev/cdrom: open: Permission denied
[ERROR] abcde: CD could not be read. Perhaps there's no CD in the drive?
No such problem running abcde directly from the command line as the same user ivman ran as, since that user is a member of the group "cdrom".

How I eventually got it working consistently was to configure ivman to run explicitly as the group "cdrom".

Ivman requires you to specify both a user and a group for the daemon to run as - in /etc/ivman/IvmConfigBase.xml). Just because the user you specify is a member of a group, e.g. cdrom, doesn't mean that ivman will run as a member of that group.

In my setup, ivman is now solely configured from /etc/ivman and runs as "user_x" and group "cdrom". And abcde is solely configured from /etc/abcde.conf.

It can help to run ivman in debug mode:
$ sudo /etc/init.d/ivman stop
$ sudo ivman -d --nofork

ABCDE

To install
$ sudo apt-get install abcde
This also installs cd-discid and probably cdparanoia (which I had installed already). Getting abcde configured is easy, especially thanks to a great guide on Andrew's Corner.

I included a post-read hook in /etc/abcde.conf to enqueue a transcoding script when the CD is ripped.
post_read ()
{
atq -q x | while read line; do job=`echo $line | sed -e 's/\([0123456789]*\).*/\1/'`; atrm $job; done
at -q x 01:00AM -f /home/user_x/bin/flac2mp3
}
It would probably be better just to run the transcoding script as a cron job rather than "on demand". But this way works too.

The flac2mp3 script invokes Robin Bowes' flac2mp3, directing its output to a log file, and then invokes the Squeezecenter CLI to rescan the music library.

Of course, abcde would happily take care of ripping to FLAC and mp3 at the same time. But I prefer to rip to FLAC and transcode from there. That way, if I need to change tags, I just update the FLACs and run flac2mp3 to update the tags in my mp3s.

Squeezecenter CLI

Squeezecenter has a telnet-based command line interface. One of the things it supports is executing a rescan of the library. So I included the scriptlet below in my transcoding script, after transcoding completes:
echo `date` "requesting squeezecenter rescan..." >> $log
(
sleep 1;
/bin/echo -e "rescan\r";
sleep 1;
/bin/echo -e "exit\r";
sleep 1;
) | telnet localhost 9090 >> $log 2>&1
echo `date` "telnet exit status: " $? >> $log
Directing the output to a file was useful here (again). It helped me diagnose a problem when the "wrong" version of echo got used when the script was run from the at task, causing the telnet to fail. The fix was to use /bin/echo explicitly.

Of course, I could just let Squeezecenter schedule a regular rescan of the music library instead of doing it on demand. But I wanted to give the CLI a try.

Anyway, that's about it.

Just a note on hardware. I'm still using the fit-PC slim as my server. It doesn't have a CD drive. I connect the internal DVD burner from my old PC through a cheapo IDE-USB adapter cable from ebay.

Saturday, February 28, 2009

Installing mediainfo on Ubuntu

There's no single ready made package for mediainfo as far as I can see, so no apt-get install, but the required .deb packages are available and so can be installed using dpkg.

Pick the appropriate packages for your system from the mediainfo sourceforge download page, then install in the correct order using dpkg -i.

To install the CLI version on my fit-pc Ubuntu 8.10 server, I did
$ wget http://downloads.sourceforge.net/mediainfo/mediainfo_0.7.11-1_i386.Debian_5.0.deb
$ wget http://downloads.sourceforge.net/mediainfo/libmediainfo0_0.7.11-1_i386.Debian_5.0.deb
$ wget http://downloads.sourceforge.net/zenlib/libzen0_0.3.8-1_i386.Debian_5.0.deb
$ sudo dpkg -i libzen0_0.3.8-1_i386.Debian_5.0.deb
$ sudo dpkg -i libmediainfo0_0.7.11-1_i386.Debian_5.0.deb
$ sudo dpkg -i mediainfo_0.7.11-1_i386.Debian_5.0.deb
Then it's good to go.

Monday, February 2, 2009

Automount USB disks in Ubuntu Server

I am using the usbmount package to automount a 1TB USB disk connected to my mini linux media server. This allows me to mount and unmount the external disk simply by turning it on and off, which is a convenient and power-saving arrangement.

Since I'm now storing DVD rips for my Popcorn Hour media player, I needed to add more storage to my streaming media server. My fit-PC takes 2.5" IDE/PATA drives, so it is already fully loaded with a 250G drive. So I got a 1TB 3.5" SATA drive (Western Digital GreenPower) and put it in a USB enclosure.

It's a very quiet, low power drive (about 9W generally), but I don't want it on 24/7. Spinning down the disk is one option, and I might investigate that further. But right now I want
  1. To simply switch the disk on when I need it and off when I'm done.
  2. For that to be safe (without potential for losing data).
  3. To include the disk in the network share I export for the Popcorn Hour.
Desktops systems automount USB disks when you plug them in or power them on. This functionality is not available by default in Ubuntu server. (The packages used depend on the desktop environment.) Following a suggestion in the Ubuntu documentation, I installed the usbmount package
This package automatically mounts USB mass storage devices (typically USB pens) when they are plugged in, and unmounts them when they are removed. The mountpoints (/media/usb[0-7] by default), filesystem types to consider, and mount options are configurable. When multiple devices are plugged in, the first available mountpoint is automatically selected. If the device provides a model name, a symbolic link /var/run/usbmount/MODELNAME pointing to the mountpoint is automatically created. [...]
... which sounds ideal. And as far as I can see, it does the job.

I couldn't find much online about how to configure usbmount, but I soon found /etc/usbmount/usbmount.conf. You can configure mount options per filesystem type. The default options are
MOUNTOPTIONS="sync,noexec,nodev,noatime"

Out of the box, it only automounts ext2 and ext3 formatted volumes. I had formatted my new disk with XFS, so I added xfs to the configuration

FILESYSTEMS="ext2 ext3 xfs"

and it seems to work fine. When I switch on the disk, I see these messages in syslog:

kernel: [1034394.920087] usb 1-2: new high speed USB device using ehci_hcd and address 27
kernel: [1034395.064826] usb 1-2: configuration #1 chosen from 1 choice
kernel: [1034395.078845] scsi25 : SCSI emulation for USB Mass Storage devices
kernel: [1034395.085992] usb-storage: device found at 27
kernel: [1034395.086033] usb-storage: waiting for device to settle before scanning
kernel: [1034400.084595] usb-storage: device scan complete
kernel: [1034400.087474] scsi 25:0:0:0: Direct-Access     WDC WD10 EADS-00L5B1      0041 PQ: 0 ANSI: 0
kernel: [1034400.091636] sd 25:0:0:0: [sdb] 1953525168 512-byte hardware sectors (1000205 MB)
kernel: [1034400.094271] sd 25:0:0:0: [sdb] Write Protect is off
kernel: [1034400.094309] sd 25:0:0:0: [sdb] Mode Sense: 03 00 00 00
kernel: [1034400.094328] sd 25:0:0:0: [sdb] Assuming drive cache: write through
kernel: [1034400.104985] sd 25:0:0:0: [sdb] 1953525168 512-byte hardware sectors (1000205 MB)
kernel: [1034400.113058] sd 25:0:0:0: [sdb] Write Protect is off
kernel: [1034400.113094] sd 25:0:0:0: [sdb] Mode Sense: 03 00 00 00
kernel: [1034400.113114] sd 25:0:0:0: [sdb] Assuming drive cache: write through
kernel: [1034400.120193]  sdb: sdb1
kernel: [1034400.137434] sd 25:0:0:0: [sdb] Attached SCSI disk
kernel: [1034400.137980] sd 25:0:0:0: Attached scsi generic sg1 type 0
usbmount[16483]: executing command: mount -txfs -osync,noexec,nodev,noatime /dev/sdb1 /media/usb0
kernel: [1034401.228110] XFS mounting filesystem sdb1
kernel: [1034401.710070] Ending clean XFS mount for filesystem: sdb1
usbmount[16483]: executing command: run-parts /etc/usbmount/mount.d

The disk is mounted:

$ mount
<snip...>
/dev/sdb1 on /media/usb0 type xfs (rw,noexec,nodev,sync,noatime)

And when I switch it off, I see

kernel: [1034259.923629] usb 1-2: USB disconnect, address 26
kernel: [1034259.936251] xfs_force_shutdown(sdb1,0x1) called from line 420 of file /build/buildd/linux-2.6.27/fs/xfs/xfs_rw.c.  Return address = 0xe0a9ddb4
kernel: [1034259.936334] Filesystem "sdb1": I/O Error Detected.  Shutting down filesystem: sdb1
kernel: [1034259.936404] Please umount the filesystem, and rectify the problem(s)
kernel: [1034259.949818] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034259.949851] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034259.949890] xfs_force_shutdown(sdb1,0x1) called from line 420 of file /build/buildd/linux-2.6.27/fs/xfs/xfs_rw.c.  Return address = 0xe0a9ddb4
kernel: [1034259.968157] Filesystem "sdb1": xfs_log_force: error 5 returned.
usbmount[16307]: executing command: umount -l /media/usb0
kernel: [1034260.050924] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.057086] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.061208] xfs_force_shutdown(sdb1,0x1) called from line 420 of file /build/buildd/linux-2.6.27/fs/xfs/xfs_rw.c.  Return address = 0xe0a9ddb4
kernel: [1034260.069650] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.073675] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.077672] xfs_force_shutdown(sdb1,0x1) called from line 420 of file /build/buildd/linux-2.6.27/fs/xfs/xfs_rw.c.  Return address = 0xe0a9ddb4
usbmount[16307]: executing command: run-parts /etc/usbmount/umount.d
kernel: [1034260.084706] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.084735] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.084820] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.084864] Filesystem "sdb1": xfs_log_force: error 5 returned.
kernel: [1034260.084891] Filesystem "sdb1": xfs_log_force: error 5 returned.

which doesn't look so great. But after repeatedly mounting and unmounting the disk without any apparent problems, I was getting the feeling that this was not harmful.

I did a bit of searching to see whether XFS supports the sync mount option. The answer wasn't clear, so I raised a question on the XFS mailing list to see what they thought. The initial response was discouraging, but on followup it seems like since...
  • I am sync mounting the filesystem (what usbmount does by default), and

  • my kernel version is later than 2.6.17 (from which point write barrier support is enabled by default in XFS)
... I can keep on doing what I'm doing. I will not get corruption of the file system. (Do read the thread, the XFS FAQ and otherwise satisfy yourself. It's your data.)

The last item on my wish list was to include the disk in the network share I export for the Popcorn Hour. This is easy.

Usbmount mounts the disk to /media/usb[0-7] arbitrarily, but it also creates a symbolic link in /var/run/usbmount using the disk model name, which provides a consistent reference point. I created a link in my media storage directory to that point, e.g.
ln -s /home/shared/movies /var/run/usbmount/WDC_WD10_EADS-00L5B1_1/movies

Using my existing Samba share (/home/shared), this works perfectly. When the disk is on, I can browse into the linked directory from the Popcorn Hour. When the disk is off, the link is invisible.

Friday, January 23, 2009

Installing SwissCenter on Ubuntu Server

I got SwissCenter up and running on my fit-PC Slim, which is now running Ubuntu 8.10 Server.

At first I was working off the official SwissCenter Linux install documentation which is for SuSE 9.3. Later on I found this cheatsheet for installing SwissCenter on Ubuntu which is a bit out of date now, but still very useful.

Install apache2 and mysql

I had these installed already, done in the standard way as in the Ubuntu Server Guide, which is to say
$ sudo apt-get install apache2
$ sudo apt-get install mysql-server
Actually, I had the default mysql instance disabled, so re-enable it now and maybe try converging to a single mysql instance later.
$ cd /etc/rc2.d
$ sudo mv K81mysql S19mysql
$ sudo /etc/init.d/mysql start
Install PHP
$ sudo apt-get install php5 libapache2-mod-php5 php5-mysql php5-gd
Install SwissCenter
$ wget http://www.swisscenter.co.uk/downloads/swisscenter.zip
$ sudo mkdir -p /srv/www/swisscenter
$ cd /srv/www/swisscenter/
$ sudo unzip ~/swisscenter.zip
$ sudo chown -R www-data:www-data .
(Using www-data which is the standard apache user/group in Debian-based distributions, rather than wwwrun as specified in the SwissCenter document.)

Enable the site in Apache

Slightly different from the document here... I appended the following to /etc/apache2/sites-available/default
Listen 8080
NameVirtualHost --myhostname--
<virtualhost>
DocumentRoot "/srv/www/swisscenter"
<directory>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</directory>
<ifmodule>
DirectoryIndex index.html index.php
</ifmodule>
</VirtualHost>
Then restarted apache.

Checking and configuring SwissCenter

Point web browser to the SwissCenter Configuration page at http://<servername>:8080/config. On first attempt, the page showed:
Warning: dl() [function.dl]: Dynamically loaded extensions aren't enabled in /srv/www/swisscenter/base/image.php on line 50

Fatal error: Call to undefined function imagecreatetruecolor() in /srv/www/swisscenter/base/image.php on line 251
After a bit of searching, I found I needed to include php5-gd (included in the install command above. I didn't have it originally), so
$ sudo apt-get install php5-gd
$ sudo /etc/init.d/apache2 restart
Better this time. But the page still shows some errors under Installation Checks.
Unable to locate a TrueType font. The "Now Playing" screen will be missing track information.
Google turned up this, which helped me to find Advanced Options / Miscellaneous in the SwissCenter configuration pages where you can set the path to a TT font. I entered /usr/share/fonts/truetype/freefont/FreeSans.ttf.

That left a warning that database is not created yet. You create it from the SwissCenter Create Database page. On first attempt, I got
Unable to create database - Is your MySQL "Root" password correct?
Umm... Looks like I changed the default mysql root password when I installed mysql. I've forgotten it now. So I had to reset the root password. Now I can create the database successfully.

Back on the main Configuration page,
Unable to write to the SwissCenter playlists directory (playlists)
Under Media Management / Playlists, you enter a full path to a dir (which must be writeable by www-data user), i.e. created something like
$ sudo -u www-data mkdir <some_dir>
After all that, SwissCenter is up and ready to load some content. I pointed it to my photos and music directories for a start.

Accessing SwissCenter from the Popcorn Hour

The simplest way for a start is to add the SwissCenter URL to the Web Services page in the Popcorn Hour, i.e. create an entry pointing to http://servername:8080.

But you can run an additional service on the server to broadcast the SwissCenter's UPnP interface. With that running, SwissCenter shows up automatically in the Popcorn Hour's Media Sources page.

There's a nice custom broadcast script and a Debian init script to start and stop this broadcast service automatically. I modified the init.d script slightly to make it run in the background:
$ diff -upN broadcast.orig broadcast
--- broadcast.orig 2008-09-11 17:02:03.000000000 +0100
+++ broadcast 2009-01-11 02:00:52.011883945 +0000
@@ -46,7 +46,7 @@ do_start()
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
@@ -95,7 +95,7 @@ do_reload() {

case "$1" in
start)
- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+ log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
@@ -103,7 +103,7 @@ case "$1" in
esac
;;
stop)
- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+ log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;

And that's about it.

Saturday, November 22, 2008

When apt-get fails to reinstall a package

While experimenting with the Moin Moin Wiki, I got into some bother attempting to uninstall and reinstall it. The problem originated from me manually removing some configuration files. apt-get subsequently refused to reinstall those files. I eventually resolved by using dpkg.

I had initially followed the installation steps for Moin Moin on the Ubuntu Server Guide. So I had installed by doing
$ sudo apt-get install python-moinmoin
So to uninstall, I did
$ sudo apt-get remove python-moinmoin
I now know that that did not uninstall a base package, moinmoin-common, on which it depends. But I didn't notice that at first. All I saw was that some configuration files were still present in /etc/moin, so I rm -rf them.

And there began my trouble, because thereafter I could not get apt-get to delete or reinstall the configuration files to that dir.

I did various iterations of apt-get install, apt-get remove and apt-get purge for the moinmoin-common and python-moinmoin packages. But the remove operations never removed /etc/moin and the installs never installed the missing files.

I used dpkg-deb to inspect the moinmoin-common archive file in /var/cache/apt/archives. I could see the to files I wanted were in the archive. But I could not get them to unpack to /etc/moin.

A temporary workaround was to use dpkg-deb to extract the archive file to /tmp, which unpacked everything, and then manually copy the uninstallable files from there to /etc/moin. But I wanted to find the proper solution.

I found a thread on the Ubuntu Forums outlining an equivalent problem with an apache2 installation. The advice there was to use Synaptic to remove the package. I don't have that option as I am running a headless server and Synaptic is a GUI tool. But at least there was the suggestion of a solution. If it can be done in a Debian/Ubuntu GUI, then be sure it can be done on the command line too.

Then I found a good article at Linux.com which explained how you can escalate from apt-get to dpkg to resolve package management problems.

So the happy ending was to do
$ sudo dpkg --purge moinmoin-common
This removed the troublesome files and the references to them that the package manager was evidently keeping. After that, I was able to cleanly reinstall Moin Moin.

Thursday, November 20, 2008

CUPS print server

I installed CUPS on my fit-PC mini Linux server to turn it into a USB print server.

Got a USB printer? Want to let several computers share it? Want to print to it wirelessly? Well you could buy a USB print server. Connect one of these to your router and your printer and you can share the printer on your network. If your router is wireless, you now have a wireless print server.

But since I already have an always-on mini Linux server, I can simply install CUPS on that and let it be my print server.

The setup
  • Fit-PC mini Linux server connected to my wireless router, as before.
  • USB laser printer (HP LaserJet 1010) connected to a USB port on the server.
  • CUPS installed and configured on the server to allow any PC connected to the router to use the printer.
  • Generic printer driver installed on Windows laptops so they can use the printer through the printer server.
So now I have a very handy wireless print server...
  • I can send stuff to the printer whenever I like.
  • The printer itself doesn't need to be turned on - just the server. Print jobs are spooled to the server.
  • When I want to collect printed pages, I just turn on the printer. The server detects it and sends the pending pages.
  • Pending print jobs are is written to disk, so even if you turn off the server, they are there when it restarts.
Installing and configuring CUPS on the server was straightforward.
$ sudo apt-get install cupsys
I Googled a bit for cupsys setup tips and made a few changes to /etc/cups/cupsd.conf.

For what it's worth, here's the diff between the default configuration (Ubuntu 8.04) and my current version.
$ diff /etc/cups/cupsd.conf.original /etc/cups/cupsd.conf
18a19
> Listen <my-server-ip-address>:631
27c28
< DefaultAuthType Basic
---
> DefaultAuthType None
31c32,35
< Order allow,deny
---
> Order deny,allow
> Deny From All
> Allow From 127.0.0.1
> Allow From 192.168.2.*
36a41
> Allow 192.168.2.*
58a64
> Allow 192.168.2.*
I think I had to restart the server once after installing cupsys, before I could access its web interface from my laptop. (Maybe apparmor related. I'm begining to think that reboot is required to allow any newly installed HTTP service available. Could be wrong there.)

Anyway, once it's setup right, you can point your browser to
http://<your-server>:631
to browse and manage the print server.

The setup on Windows laptops was very easy. I used "Add Printer" to add a network printer, specifying connect by URL, and a generic PostScript driver (I used Generic / MS Publisher ImageSetter).

There are of course many other ways to set it up, e.g. different printer driver options are covered here. But this is working out nicely for me.

Wednesday, October 15, 2008

Migrating subversion repository

I have a small subversion repository on my old server. I want to migrate it to the fit-PC.

Looking at the relevant section of Version Control with Subversion, it looks like it should be easy. Just create a dumpfile on the old box and load it to a new repository on the new one.

So on the old box
$ svnadmin dump repos > dumpfile
and copy the dumpfile onto the new box.

Last time I setup subversion + apache for HTTP access. This time I'm going to try svn+ssh.

As usual, Ubuntu provides a good general reference.

Install subversion
$ sudo apt-get install subversion 
Setup a subversion user and group, add myself to the group
$ sudo addgroup svn
$ sudo useradd -g svn -m -p <pwd> svn
$ sudo usermod -a -G svn <my_user>
Create the repository and load the dumpfile
$ sudo su svn
$ cd /home/svn
$ svnadmin create repos
$ svnadmin load repos < dumpfile
I want svnserve process to start when the box boots, so I added this line to /etc/rc.local:
sudo -u svn svnserve -d -r /home/svn
I'll make a proper init.d script like this one later.

Restart the box

Verify I am a member of the svn group
$ groups
Verify that svnserve process started
$ ps -ef | grep svnserve
Verify I can read the repository locally
$ svn list svn://localhost/repos/<project>/trunk

Setup access to the repository from Eclipse on my laptop

(I already have the subclipse plugin installed).

File / Import
Checkout Projects from SVN
Create a new repository location
svn+ssh://<hostname>/home/svn/repos

That fails with an error dialog and this message on the console:
    The system cannot find the file specified. 
svn: Can't create tunnel: The system cannot find the file specified.

Back to Google... The answer is here.

The problem was that Eclipse was not configured with an SSH client. Quick fix for me was to switch the Eclipse / Team / SVN configuration from JavaHL (which requires external SSH client) to SVNKit (which includes one). Now it works.

Edit! Actually, not quite there yet...

On attempting to commit to the repository, I got error
svn: Commit failed (details follow):
svn: Can't create directory '/home/svn/repos/db/transactions/1-1.txn':
Permission denied
It turns out that svn+ssh does not connect to the svnserve daemon I started above, but rather creates a temporary svnserve process (on each invocation) as the ssh user. And in the setup above, the ssh user has read access to the repos, but not write access. (Just like if you use subversion + apache and don't make the repository writable by the www-data user).

Temporary workaround (to commit my current work) is to make the whole repository writable by my ssh user
$ cd /home/svn
$ sudo chown <sshuser>:<sshuser> -R repos
Now the commit succeeds.

Next task is to read the relevant section of the Subversion manual more carefully. My original setup above will support working with the repository using svn://<host>/repos. I might just go with that for now.

Sunday, October 12, 2008

Initial setup

The first thing I want to do is get rid of the monitor and keyboard, so

$ sudo apt-get install openssh-server
$ sudo apt-get install screen

(Screen is great. I use it whenever I need to kick off some long-duration command. It means I can close the laptop, dropping my ssh session, but still reconnect to the console running the command whenever I want to.)

Edit /etc/network/interfaces to change from DHCP to static IP address, which is covered well here.

Serial console

I never tried this before...

I ordered the serial cable with my fit-PC and got a €3 generic USB RS-232 adapter cable from this store on ebay.

The instructions on the fit-PC wiki were great. On the other side, all I had to do was check which COM port the USB adapter was on using Windows device manager, and then create a serial PuTTY session using the same configuration.

With this setup, I get GRUB and kernel output to, and login from, the serial console. This is a real bonus compared to my old PC server.

I'd really like to be able to configure the fit-PC BIOS over the serial connection as well, but it sounds like that might be a bit more difficult.

Anyway, BIOS configuration changes aside, I can ditch the keyboard and monitor now. My fit-PC is ready to be a headless server.

Saturday, October 11, 2008

Ubuntu USB stick install, part 2

I finally got a successful install. But it took several attempts and a lot of Google.

First attempt

In the fit-PC BIOS setup, I set Drive C: Nand Flash but neglected to set Drive D: IDE. So when the installer got round to the partitioning stage it could only see the USB stick, not the hard disk. Hit reset button and start again...

Second attempt

I didn't create a separate ext3 /boot partition, just XFS root and /home partitions. Apparently installing GRUB on an XFS partition is not a good thing. Near the end of the install, the installer offers to install LILO for me. Now I dimly remembered going through LILO versus GRUB before and preferring GRUB, so I try to install GRUB anyway. The installer warns me that this is a bad idea. When I ignore that this makes a fatal error in the install which then hangs. Grit teeth, hit reset button and start again...

Third and fourth attempts

I created a separate ext3 /boot partition to stay sweet with GRUB. So I now have
#1 primary 100MB ext3 /boot
#1 primary 4GB XFS /
#5 logical 246GB XFS /home
Now the install completed successfully each time. But it all ended in tears when I tried to reboot the fit-PC. Each time, it immediately dropped to a debugger interface, saying Embedded BIOS Debugger Breakpoint Trap and refused to do anything else. Weep, hit the sack and try again in the morning...

I noticed that after each install attempt, I could no longer boot from the USB stick. It gave GRUB Error 21. I could fix the stick by reconnecting it to my old Linux box and doing install-mbr /dev/sdb. But why?

I finally guessed that the Ubuntu installer must be installing GRUB to the MBR of my USB stick, instead of the hard disk in my fit-PC where I needed it. Armed with that hunch, Google finally gave me some answers, like this, this and this.

Fifth attempt

I let the Ubuntu installer run to the very end, where it tells you to reboot. At that point, I opened a console and took a look around.

I found (fdisk) that my hard disk partitions were mounted on /target. So I did
# chroot /target
# grub-install /dev/sdb
to install GRUB into the MBR of the hard disk. Then I went back to the installer's console and let it finish.

On restart I removed the USB stick, hit DEL to enter the BIOS setup, reverted to Drive C: IDE and saved to reboot.

On first attempt GRUB started (phew) but said
Error 21: Selected disk does not exist
Press any key to continue...
So I did. Then GRUB gives the menu list of image it can boot and allows you to edit and boot them. I edited the entry for the first image. It's first line was root (hd1,0). I edited that to root (hd0,0) and the hit 'b' to boot. The system booted at last.

Once in, I took a look at /boot/grub/menu.list. All three had root (hd1,0).

I rebooted to confirm that GRUB would fail again with same error.
It did. I fixed as before. Once back in, I edited /boot/grub/menu.list to change all the hd1 to hd0 and rebooted again.

At last, the system boots successfully. Now I can get on with the more interesting stuff.

Friday, October 10, 2008

Ubuntu USB stick install on fit-PC, part 1

Hard disk installed. Bootable USB stick ready. Here we go...

Following the advice on the fit-PC forum I made the following BIOS settings:
Drive C: Nand Flash | Boot 1st
Drive D: IDE
It booted to the installer from the USB stick. I chose the cli boot option and set it off.

So that's the USB stick part over then, I thought. Just a normal install from here. (Wrong! See part 2 for the gory details.)

The installer's first big question is partitioning. I went with
#1 primary   4GB XFS /
#5 logical 246GB XFS /home
No swap. I can add it later if I need it.

I'm giving XFS a try this time because I might end up storing some ISO files on this disk. It's supposed to be a good file system for large files.

Thursday, October 9, 2008

Preparing to install from a USB stick

Since I ordered the diskless version of fit-PC, I need to add a hard disk and an operating system.

For the hard disk (2.5" IDE), I ordered a 250GB Western Digital Scorpio.

While I waited for the disk to arrive, I got ready to install the OS.

I'll stick with Ubuntu. I don't have a USB CD drive, so I'll try to install it from a USB memory stick. I followed the instructions here to make put a bootable installer on to my USB stick. The warnings about checking the correct device name are important! AFAIK the only way to be sure is to mount and list the device. Mine was /dev/sdb1.

I want a minimal server installation, so I just copied the netboot image and left it at that. I'll pull the packages I need from the network as I need them.

I initially tried
$ sudo zcat boot.img.gz > /dev/sdb1
but that was giving permission errors. So instead
$ sudo su
# zcat boot.img.gz > /dev/sdb1
did the job. I tried booting my laptop from the USB stick, but it said it was not a bootable device, so I followed the instructions on that same page to install an MBR.

I tried again to boot my laptop. This time it booted to a prompt
MBR FA:
Ummm... Back to Google. I found the answer here - first enter "a", then "1" and it launched the text-based installer. Good. Hopefully it'll do the same on the fit-PC.