Sunday, 27 July 2008

Sharing a mouse and keyboard with Synergy

If, like me, you have two computers on your desk with two keyboards and two mice and find yourself occasionally typing something on the wrong computer or clicking with the wrong mouse then this tip is for you.

First you need to install synergy on both computers;

sudo apt-get install synergy

Then choose one of the two to be the "server". You will use the keyboard and mouse that is connected to this computer. In this example the two PC's are side by side.

You will only need a configuration file on the server PC. Create one;

sudo vi /etc/synergy.conf

# sample synergy configuration file
# comments begin with the # character and continue to the end of
# line. comments may appear anywhere the syntax permits.

section: screens
section: links
left = client_pc
right = server_pc

Where server_pc and client_pc are the names of the two computers.

For example, my server PC is called "jupiter" and the client is called "saturn". The server is on the right (client on the left)

# sample synergy configuration file
# comments begin with the # character and continue to the end of
# line. comments may appear anywhere the syntax permits.

section: screens



section: links
left = saturn

right = earth

You can test the the setup with these commands;

On the server:

synergys -f --config /etc/synergy.conf

On the client:

synergyc -f server_pc

To start synergy automatically when gnome starts;

sudo gedit /etc/gdm/Init/Default

Add these lines just before the "sysmodmap=/etc/X11/Xmodmap" line:

On the server:

SYNERGYS=`gdmwhich synergys`
if [ x$SYNERGYS != x ] ; then $SYNERGYS --config /etc/synergy.conf

On the client;

SYNERGYC=`gdmwhich synergyc`
if [ x$SYNERGYC != x ] ; then $SYNERGYC server_pc

This starts synergy at the gnome login screen. Once you log in gnome kills the server so you need to start it again for your user session;

sudo gedit /etc/gdm/PreSession/Default

Add the same lines this time just before the "XSETROOT=`gdmwhich xsetroot`" line;

On the server:

SYNERGYS=`gdmwhich synergys`
if [ x$SYNERGYS != x ] ; then $SYNERGYS --config /etc/synergy.conf

On the client;

SYNERGYC=`gdmwhich synergyc`
if [ x$SYNERGYC != x ] ; then $SYNERGYC server_pc

Once you restart gnome on both the PC's you should be able to move the mouse left and right between the two screens. Keyboard focus will follow the mouse pointer.

Saturday, 26 July 2008

Dual-booting with Grub

On one of my PC's I still dual boot to Windows. Most of the online guides to dual booting instruct you to install Windows first and then install Linux and let Linux modify your boot sector accordingly.

I don't like doing it this way partly because I am an uber-geek and like to do stuff the hard way but also because i have a special setup whereby I can boot natively into Windows or I can boot the same Windows installation from within a vmware virtual machine which is neat. I might describe how to do that one day.

Anyway, to do this, Windows must be on its own separate drive and both Windows and Linux must use their own boot loaders and both must believe that they are booting from the primary hard disk.

To achieve this we must fool Windows into thinking that it is on the primary drive even tough it is on a secondary.

To do this we simply add the following stanza to /boot/grub/menu.lst

title Windows
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
chainloader +1

NOTE: The "map" lines have a 'space' between (hd0) (hd1). You will get "GRUB: Error 11: Unrecognized device string" error without that space.

If you want to hide/unhide partitions also add;
hide (hd0,0)
unhide (hd0,0)

Once you’ve made the change just update Grub with this command:


When you reboot, you should see an option to boot Windows.

For this to work, you must have a hard disk with a bootable, working copy of Windows on it. For example, install the HDD in your PC as the first drive (master) and install Windows. If it boots OK when you are done then remove the disk and install the one that has[will have] Ubuntu on it and set the Windows drive as slave. Modify grub as above and everything should be hunky-dory. (Disclaimer; If you muck any of this up it could render your PC unbootable and cause you much distress and possibly anger. It is your responsibility to ensure that you know what you are doing when mucking about inside your PC. For further info see this)

HOWTO: Mounting SSH directories

If you want to mount a directory on a remote PC then here is what you do.

Of course, to mount a folder via ssh the server must be running as a ssh server.

sudo apt-get install openssh-server

It is not necessary, but I strongly recommend that you set up passwordless ssh logins between the server and the client. The linked guide describes setting up SSH keys between two root users, so you do need to ensure that you configure things correctly for whatever pair of users you intend to use here.

From here on, all of the configuration we need to do is on the client.

1. Install SSHFS;

sudo apt-get install sshfs

2. Use the modprobe command to load fuse into the kernel;

sudo modprobe fuse

3. Set up the appropriate users & permissions;

sudo adduser username fuse
sudo chown root:fuse /dev/fuse
sudo chmod +x /bin/fusermount

If you've added yourself to the fuse user group, you need to logout and back in at this point.

To mount the home directory of "user";

sshfs user@host: mountpoint


sshfs brett@server: ~/server_home

You can add a path after the colon.

Eg. to mount the "share" directory on the server (ie. /home/brett/share)

sshfs brett@server:/share ~/share

UPDATED: By default, only the user who has mounted the share has access to it. To allow access to root add the following option;

-o allow_root

For all users;

-o allow_other

To mount the share as read only;

-o ro

Eg. to mount the "share" directory on the server as read only and available to all users;

sshfs -o allow_other -o ro brett@server:/share ~/share

And that is all you need to do! Easy Peasy!

Backing up a directory

This method backups only files that have changed since the last backup. If a file has been deleted it will delete the equivalent file in the backup folder.

rsync -a source_directoy --delete destination

Usually, the backup location will be another PC, which can be done like this;

rsync --rsh=/usr/bin/ssh source_dir destIP:/destination_dir

rsync --rsh=/usr/bin/ssh ~
will back up your home directory

You can use a name instead of an IP address
Exclude unwanted files with the --exclude="filename" argument;
The above example will require a user account using the same name on both PC's
The destination PC will require ssh server software

sudo-apt-get install openssh-server

Bit-Copy a Hard Disk Over A Network

This method creates a disk image file for the backup using dd and nc (netcat). See also rsync

On the server (destination of the image file)
nc -l 5000 | of=disk.dd.gz

On the PC (disk to be backed up)
dd if=/dev/sda | gzip -9 | nc -q 5 hostname 5000

5000 is the listen port, you can choose any unused port you like

To restore the disk;

On the receiver (where the physical disk is)
nc -l 5000 | gunzip | dd of=/dev/sda

On the server (where the disk image is)
dd if=disk.dd.gz | nc -q 5 hostname 5000

Thursday, 10 July 2008

Creating an ISO image from a directory

If you want to create an ISO image from the files contained inside a directory you can use mkisofs;

mkisofs -J -r -o filename.iso path/to/files

If you get an error that the file will be bigger than 4GiB-1 then use this command;

mkisofs -allow-limited-size -udf -J -r -o filename.iso path/to/files

Tuesday, 8 July 2008

Switching between versions of Java

If you install Sun Java you may end up with two versions of java on your system. To select which one is active use this command;

sudo update-alternatives --config java

Thursday, 3 July 2008

Converting an RPM to a DEB

Sometimes the software you want to install is not available in the Ubuntu repo's and when you find it on the web you discover that "oh noes, it's only available as a Red Hat "rpm"

Never fear, it is usually possible to convert the rpm to a deb using alien. This should be done as a last resort however, it's always better to use a native deb package wherever possible.

The alien package is available from the multiverse repository. If you need to enable this repo see this post here

Install alien;

sudo apt-get install alien

To convert an rpm;

alien --to-deb --scripts package-xyz.rpm

As always, you should change package-xyz to the name of your package,