Recover deleted Encrypted OS X Extended volume
Solution 1:
Under certain circumstances a deleted external HFS+ encrypted volume can be recovered after the disk has been formatted to a FAT32 volume:
- The whole disk has been encrypted (to one volume).
- The whole disk has been formatted to one FAT32 volume. The GUID partition table has not been replaced by an MBR. The disk still has an MBR (instead of a PMBR) though.
- Some internal invisible CoreStorage data structures mustn't be overwritten.
- the CoreStorage volume header structure at the (previous) volume block 0 (= disk block 409640)
- a second block at the (previous) volume block 8 (= disk block 409648)
- an encrypted metadata block starting at the 577456th last block and ending at the 573360th last block (size 4096 blocks)
- several Disk Label metadata items in the last 16392 blocks of the (previous) volume
If nothing has been written to the FAT32 volume those parts shouldn't be overwritten.
To recover the encrypted volume you have to use Terminal and do some math.
- Detach any external drive except the mal-formatted one
-
Open Terminal and enter:
diskutil list
to get an overview and the disk identifier of the external disk. Below I assume the disk identifier is disk1
- Make a backup of the whole disk with
sudo dd if=/dev/disk1 of=/Volumes/BackupVolume_Name/disk1.bin
just in case something goes wrong or for a future with advanced recovery tools. -
Now get the partition table of the disk with:
sudo gpt -r show /dev/disk1
You should get a similar result as this one:
start size index contents 0 1 MBR 1 1 Pri GPT header 2 32 Pri GPT table 34 6 40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B 409640 2008 411648 133804032 2 GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 134215680 2015 134217695 32 Sec GPT table 134217727 1 Sec GPT header
The first partition is the EFI volume, the second the FAT32 volume of the external disk. Your partition 2 is much larger than the one in the example though.
Even if you get a different output with no GUID partition table but only an MBR
start size index contents 0 1 MBR 1 1 2 134217726 1 MBR part 11
you can continue: encrypting a disk with FileVault requires a GUID partition table - so your disk previously had one. The probability to recover a FAT volume on a disk with a MBR seems to be much lower though. Apparently parts (namely some metadata and volume headers) may be overwritten by FAT32 file system stuff.
The same disk containing an encrypted external HFS+ volume should look like this:
start size index contents 0 1 PMBR 1 1 Pri GPT header 2 32 Pri GPT table 34 6 40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B 409640 133545904 2 GPT part - 53746F72-6167-11AA-AA11-00306543ECAC 133955544 262144 3 GPT part - 426F6F74-0000-11AA-AA11-00306543ECAC 134217688 7 134217695 32 Sec GPT table 134217727 1 Sec GPT header
The first partition is the EFI partition with a fixed size and start block, the third one is an Apple_Boot partition with a fixed size and start block relative to the last block of the disk and the remaining disk space allocated to the encrypted Core Storage Logical Group. All partitions are aligned to the physical block size of the disk (4096 Bytes).
-
To restore the old partition table you have to unmount the disk, delete the actual partition table and do some math to create a new one:
diskutil umountDisk /dev/disk1 sudo gpt destroy /dev/disk1 diskutil umountDisk /dev/disk1 sudo gpt create -f /dev/disk1 gpt add -b 40 -i 1 -s 409600 -t C12A7328-F81F-11D2-BA4B-00A0C93EC93B disk1
-
Now get the last block number of your disk (in my example that's 134217727) and substract 262183: LastBlockNumber-262183 is the start block of the 3rd partition (Apple_Boot). Add this partition with:
gpt add -b LastBlockNumber-262183 -i 3 -s 262144 -t 426F6F74-0000-11AA-AA11-00306543ECAC disk1
-
Check the size of the unallocated disk space between partition 1 and partition 3 with:
sudo gpt -r show /dev/disk1
-
The size of unallocated disk space (UnAlloc) between index 1 and index 3 is probably the size of the old encrypted volume. The size has to be divisible by 8 - please check this! Add this as a partition with:
gpt add -b 409640 -i 2 -s UnAlloc -t 53746F72-6167-11AA-AA11-00306543ECAC disk1 #with UnAlloc= size of unallocated disk space found above
-
After entering the last command you should be asked for password of the encrypted disk. if not then try:
diskutil cs list
to get a list of CoreStorage items. Try to mount the encrypted volume with:
diskutil cs unlockVolume LVUUID
with LVUUID: the UUID of the encrypted Logical Volume (usually the last one listed). If your main volume is also encrypted choose the proper LVUUID!
If the volume mounts successfully save the most important files and folders to an external volume because mounting the encrypted volume doesn' t necessarily mean that the volume isn't corrupted.
Unmount the volume and run
diskutil verifyDisk /dev/disk1
anddiskutil repairDisk /dev/disk1
. The last command may completely corrupt the disk!
This might still fail. The encrypted volume may still be recoverable though. But then I need more information, because special (invisible) non-file system items have to been read directly from disk with a HexEditor and then restored/replaced.
Solution 2:
I followed Klanomath's reply above to successfully recover my Macintosh HD. I had tried to resize it from ubuntu (Bootcamp) and completely stopped seeing my Macintosh HD partition. I had tried several posts and tools to write and rewrite partition tables without success and was about to give up. I followed the steps #5 to #8 from the post.
I did # 5 and assumed that my EFI would've started at 40 and had the same size 409600. The following screenshot from stellar recovery showed advanced volume starting at 40 so it gave me some hope that my EFI at least started at the same sector. Result from my machine:
diskutil umountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
sudo gpt destroy /dev/disk4
diskutil umountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
sudo gpt create -f /dev/disk4
gpt add -b 40 -i 1 -s 409600 -t C12A7328-F81F-11D2-BA4B-00A0C93EC93B disk4
disk4s1 added
For #6, here was the output from my machine:
$ sudo gpt -r show /dev/disk4
Password:
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 976695387
977105027 32 Sec GPT table
977105059 1 Sec GPT header
I had the last block of my hard disk (977105059), now what should be my third (last) partition whose size I should subtract from the end? (I remembered that I used to have a Recovery disk, a ubuntu disk in addition to the Macintosh HD. Also, testdisk had showed me dozens of lost recovery partition, which I guessed based on their sizes, but I couldn't pick between them). So I referred to the above screenshot again (stellar recovery). At this point I have seen and know that a mac Recovery HD is about 600ish MB so I have a few candidates from above screenshot. According to this post, the starting sector needs to be able to completely dividable by 8, which only worked for 'Lost Volume 6' from the screenshot.
So that gave me the starting sector (975835488) but what about the size? Well, from a few screenshots from a couple days ago of testdisk scan results (which showed me dozens of lost recovery disk partitions) I had noticed that though all of their starting sectors were different, their sizes were the same i.e. 1269536 (see screenshot below). This gave me confidence that this was the right size (in sectors) for a mac Recovery HD. So I ran the following command (using Starting sector:975835488, Size in sectors:1269536)
gpt add -b 975835488 -i 3 -s 1269536 -t 426F6F74-0000-11AA-AA11-00306543ECAC disk4
disk4s3 added
For #7, to show the most recent status of 'gpt -r show':
$ sudo gpt -r show /dev/disk4
Password:
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 975425848
975835488 1269536 3 GPT part - 426F6F74-0000-11AA-AA11-00306543ECAC
977105024 3
977105027 32 Sec GPT table
977105059 1 Sec GPT header
At this point I was like, "Oh okay, so my partition table looks slightly similar to the guy's in the post, but that's obviously not gonna do anything".
It was about 2 AM at that point and I just want to go through all the steps to discard yet another post because 'I tried that too'. So I'm kinda rushing through it still trying to get the numbers right.
So now for #8, from my last screenshot, 975425848 is the size, and 409640 is the starting sector for my partition that's supposed to be in the middle (aka. Macintosh HD). So I go ahead, still without much hope, and execute the following command:
gpt add -b 409640 -i 2 -s UnAlloc -t 53746F72-6167-11AA-AA11-00306543ECAC disk4
usage: gpt add [-b lba] [-i index] [-s lba] [-t uuid] device ...
oops, I actually have to write the size in place of 'UnAlloc'. I missed this from the guy's comments: with UnAlloc= size of unallocated disk space found above
second try:
gpt add -b 409640 -i 2 -s 975425848 -t 53746F72-6167-11AA-AA11-00306543ECAC disk4
disk4s2 added
This time the command took a couple of seconds to produce an output which got my heart racing. As soon as it produced the result (disk4s2 added) it asked me for a password for my "Macintosh HD" and I am jumping in my seat as I input the password that I can remember and voila, the disk shows up and so does all my data!!
After 4 full days of effort and freakout that I had lost all my work and my photo library, I couldn't believe it worked. Thank you, klanomath. Thank you, God.
p.s. I did all this on another mac with the original mac connected to it via thunderbolt in target disk mode. The Stellar Recovery software was executed on the mac too while test disk results were from a ubuntu live cd on the original mac (though I'm sure I could've ran testdisk on the second mac too albeit slower)