There is an easy to use tool for doing this called GNU Parted. It can resize
FAT16/FAT32 as well as EXT2 partitions. All data is retained and it is
completely safe. See http://www.gnu.org/software/parted/

Also:
RPM package: ftp://ftp.falsehope.net/pub/parted/
DEB package: http://packages.debian.org/unstable/admin/parted.html