I found myself struggling with SD card corruption this week.
I think it was due to a combination of overclocking and an old SD card. Although I use svn or git with most of my code, occasionally I do a lot of work in a day and forget to add a file. After this last time, I decided to move my home directory to a partition on an external HDD just in case.
I will be posting some file recovery methods later in case you have also lost data.
Start by making sure your external drive is connected and open a terminal.
First of all you need to have root privileges to do all this (or use sudo privileges)
Make sure your drive is not mounted. To unmount it:
umount /mntpointIf you already have your external drive partitioned, skip to Step 4.
Step 1: Partition External Drive
The fdisk command with the -l flag can list all of your drives and partitions. So start by running that:
fdisk -l
Pick the HDD you want to use (mine was /dev/sdb but Ill put sdx and you can fill in appropriately) and run fdisk again to see partition information
fdisk /dev/sdx
You should be in an interactive prompt. Type p to see the partitions. There should be none. If there arent any, skip to Step 3.
Step 2: Deleting or resizing
If you need the old partitions and want to shrink them, type q to exit the fdisk prompt, otherwise skip to Step 3.
If you are using the partitions and just want to resize them, then there are various commands to do that (also its a good idea to have a back up).
For ext3/ext4, just use: resize2fs /dev/sdx #size
Or use parted
parted /dev/sdx (opens interactive prompt)
resize #size
For ntfs:
ntfsresize --size #sizeM /dev/sdx
Then open back up the fdisk prompt, you need to make new partitions that match.
Step 3: Writing partition changes
(Open fdisk back open if you closed it)
Now just use d #partition to delete any old partitions.
Then type n to make a new partition followed by p to make it a primary partition. If this is the only partition you need, you can make it the whole disk size. If you shrank a partition, you need to make two new partitions, with the first one having a size that matches your resize options.
Now type w to write changes to disk then q to quit. It will probably give you some warnings, it almost always does. Pay attention to them but dont freak out.
Now format the new partition (If you only made one partition #=1):
mkfs.ext4 /dev/sdx#
Step 4: Copying over your home directory files
Mount your new partition:
sudo mkdir /media/tmp
sudo mount -t ext4 /media/tmp
Navigate to your root folder
cd /home
Copy all your data recursively (this option seems to have worked the best for me to get all of the files including .bashrc and .vimrc files)
sudo cp -rp ./ /media/tmp
Step 5: Mounting your new home directory
Once that is finished, you can move the home directory and mount the new one (make sure no program is currently using the home directory or you will get errors).
sudo umount /media/tmp
sudo rm -rf /media/tmp (get rid of the tmp folder)
sudo mv /home /old_home
sudo mkdir /home
sudo echo "/dev/sdx# /home ext4 defaults,noatime,nodiratime 0 0" >> /etc/fstab
Again replacing x# with your drive number (mine was b2).
Now we can test it by mounting home. If this doesnt work, somewhere you messed up
sudo mount /home
After you have confirmed everything is working and copied over and you dont need your old home directory, you can delete it.
sudo rm -fr /old_home
Now you dont need to worry about SD Corruption.
References for help:
http://joshua14.homelinux.org/blog/?p=660
http://linuxtechres.blogspot.com/2007/08/how-to-use-ntfsresize-from-command-line.html
Consider donating to further my tinkering.
Places you can find me