I was running Ubuntu 10.10, but then I replaced a bunch of hardware, including upgrading a single hard drive to a RAID1 array of two drives, so I needed to install Ubuntu on the new system, but I wanted it to be like the old system. First I tried copying the old files onto the new ones using rsync, but that failed badly. I think the first obvious problem was that the new /boot and grub were not compatible with the kernel from the old setup. Well, no matter what it was, that went so badly that I repeated the install from scratch (very easy after having done it successfully the night before after about 20 failures). Next I tried something that worked a lot better. I mounted my old HDD as /c like so: sudo mkdir /c sudo mount -t ext3 /dev/sdc1 /c It was an ext3 partition. Other people trying to do this would have to look for their old drive partition to make sure they have the right one. Then I went to my old home directory and moved all the "hidden" files and directories (filenames beginning with ".") to their own directory (pretend my username was "user"): cd /c/home/user sudo mkdir dotfiles sudo mv .[A-Za-z]* dotfiles That worked for me. You might not need sudo -- it depends on permissions. You have to watch for changes in UID/GID between installations and fix them appropriately (e.g., compare /etc/passwd with /c/etc/passwd). Then I used rsync to copy my old home directory to my new one: sudo rsync -a /c/home/user /home I have the same username on both systems, but if they had been different, I would have done this: sudo rsync -a /c/home/user_old/ /home/user_new Note the slash after "user_old" -- it is necessary. The rsync copy skipped ~/.gvfs because of permissions, but that wasn't a problem. It worked well. Next I could move certain files from "dotfiles" to ~ and try to recover old settings appropriately (e.g., for browsers). Before I did much playing with config files in $HOME, I installed a bunch of the old programs I was missing. To figure out which ones I had installed before but did not have in the new system, I did this (one liner): grep -h ^Package: /c/var/lib/dpkg/status /var/lib/dpkg/status /var/lib/dpkg/status | cut -c10- | sort | uniq -c | awk '$1==1 {print $2}' | less I think that's a pretty cool way to go. I first opened synaptic... sudo synaptic ...and while skimming the output the long command in "less", I would see what I was missing and I would go to synaptic and find it. It worked out quite well and it only took me a few minutes to find everything I wanted. One could do the same kind of thing using the dpkg status file from another computer. On that other computer (let's call it compA), just do this: grep -h ^Package: /var/lib/dpkg/status > compA_status_list.txt Copy that output file (compA_status_list.txt) to another machine and do this: grep -h ^Package: /var/lib/dpkg/status /var/lib/dpkg/status compA_status_list.txt | cut -c10- | sort | uniq -c | awk '$1==1 {print $2}' | less To get a list of packages installed on the local machine but not on compA, you would use $1==2 instead of $1==1 in the awk command. To see a list of packages installed on both machines, you would use $1==3 instead of $1==1 in the awk command. Mike