I'm not personally familiar with free or open source data recovery products.
GetDataBack is pretty easy to use and relatively cheap, as far as I know. It's been my go-to tool for about 8 years now in cases of data loss. It's relatively fast too.
Just run it against your drive and I'd imaging that as long as the drive motor isn't failing or the platters aren't physically damaged, you're likely to be able to recover most of your data without issue.
Important: Do not format or begin writing new files to the drive. Any changes to the drive you make prior to running a recovery have a great chance of overwriting previous data on the drive and lowering your chances of a complete and successful recovery.
UPDATE response to comment:
It appears as though your drive is undergoing progressive drive failure. This is serious. If you do not run a recovery procedure on your drive now, your chances of data recovery will continue to diminish.
In order to maximize your chances of successful data recovery, you should place your drive inside two or three new and clean ziplock bags and place it in the freezer for an hour or two. This will cool the drive down and minimize the chances of further damage.
While the drive is cooling, assemble whichever tools you choose to use for the data recovery on your computer.
Remove the drive from the freezer and connect to the computer and run the recovery steps as quickly and efficiently as possible. It is critical that you keep the drive as cool as possible during this process. Leave the computer open and point a fan into the system. Do not place the drive into a drive tray as this minimizes the airflow around it and allows for quicker heating of the drive.
All these processes are to maximize the time you'll have to run the necessary recovery tools and thus maximize your chances of successful recovery.
You could try ddrescue:
GNU ddrescue is a data recovery tool. It copies data from one file or block device (hard disc, cdrom, etc) to another, trying hard to rescue data in case of read errors.
A good primer for ddrescue is on the ForensicsWiki. Install it on Ubuntu by running sudo apt-get install gddrescue
. Next, you'll recover the partition. Quoting from the article:
First you copy as much data as possible, without retrying or splitting sectors:
ddrescue --no-split /dev/hda1 imagefile logfile
Now let it retry previous errors 3 times, using uncached reads:
ddrescue --direct --max-retries=3 /dev/hda1 imagefile logfile
If that fails you can try again but retrimmed, so it tries to reread full sectors:
ddrescue --direct --retrim --max-retries=3 /dev/hda1 imagefile logfile
The imagefile is going to be as big as the partition you want to recover, so make sure you have plenty of hard drive space (obviously not on the same HD you are recovering from).
Replace /dev/hda1
with the partition (ie /dev/sda2) you are trying to recover. Once you do this, you can mount the imagefile like this:
sudo mount -t ntfs-3g -o loop,ro imagefile /mnt
This mounts the image read-only at the directory /mnt
.
Best Answer
Since the drive is 320GB I would assume its using NTFS. I would highly recommend Recuva in this case, and if that fails, TestDisk can do a more thorough job.