Apple TV repair
Contents
Structure of an Apple TV hard disk.
Apple TV, 1st generation, is an Intel mac running a special version of OS 10.4. The hard disk uses a GUID partition table (GPT), with four partitions:
- EFI
- The firmware updates when necessary.
- Apple Recovery
- The factory fresh version of the OS, used in Factory Restore.
- OSBoot
- The system software.
- Media
- The media.
This is what the whole disk looks like: Original ATV disk:
start size index contents 0 1 PMBR 1 1 Pri GPT header 2 32 Pri GPT table 34 6 40 69632 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B 69672 819200 2 GPT part - 5265636F-7665-11AA-AA11-00306543ECAC 888872 1843200 3 GPT part - 48465300-0000-11AA-AA11-00306543ECAC 2732072 75408048 4 GPT part - 48465300-0000-11AA-AA11-00306543ECAC 78140120 7 78140127 32 Sec GPT table 78140159 1 Sec GPT header
#: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *40.0 GB disk2 1: EFI 35.7 MB disk2s1 2: Apple_Recovery 419.4 MB disk2s2 3: Apple_HFS OSBoot 943.7 MB disk2s3 4: Apple_HFS Media 38.6 GB disk2s4
Backup
I wish I had a backup of my drive before the Apple TV went screwy, but I made a backup of the screwy state anyway. Here's how:
I unplugged the device, then I removed the hard drive. I skipped the hair-dryer step, which was a mistake. iFixit has guides for disassembling the machine: http://www.ifixit.com/Device/Apple_TV_1st_Generation
(Before I attached the drive, I should have turned off Spotlight, so it wouldn't add search folders to two of the volumes).
I attached the drive, via USB <> PATA adapter, to my Mac. I unmounted the volumes on the drives using Disk Utility, which I kept open so that I could repeatedly unmount the drives easily while I worked.
I used gpt to view a snapshot of the partitions as they were. But first I found the name of the disk from Disk Utility by clicking on the drive and getting "Information." Your disk may be in a different slot of the /dev/disk# numbering order:
gpt show /dev/disk1
Then I used dd to copy the entire drive as an image on my hard drive—make sure you have enough room, the ATV drive is at least 40GB. I put it in my Temp folder which I ordered Time Machine to ignore, so it doesn't bother backing up so huge a file.
sudo dd if=/dev/disk1 bs=1m of=~/Temp/appletv-orig.dd
You can press control-T during the execution of dd to see the progress. It took me about two hours to copy this way.
I used Disk Utility to make images of OSBoot and Media, the two partitions that are HFS+ format. This way I can restore either to a larger partition easily.
New hard drive
I've tried many different methods to copy what's on the old drive to the new drive. At the very least, supposedly, I need the partitions, with data in the recovery partition copied exactly. With that, "Factory Restore" should put everything back in order. Please note that many of these methods are experimental, have not worked. I found out late that perhaps the problem was a corrupted factory restore image, but that doesn't mean that was the only problem with these methods.
I've tried online methods:
http://www.engadget.com/2007/03/23/how-to-upgrade-the-drive-in-your-apple-tv/3 . This method balked at the re-addition of the fourth partition after removing it.
Using a G5
Next to try: http://guides.macrumors.com/Apple_TV_250GB_Hard_Drive_Upgrade . I should try it on my G5.
Rebuilding GPT
- Attach the original ATV disk to a Mac.
- Open Terminal
- Find out which disk is the ATV disk. After executing the following command, look for the disk that has volumes called OSBoot and Media. use the number of that disk as _DISK_NUMBER_ in the following instructions. As you're working, make sure to keep track of which disk is which with this command, they can change if you swap/eject them.
diskutil list
- Get the original disk's partition table's exact measurements. First you have to eject or unmount because gpt is prevented from working on the disk when it is mounted.
diskutil eject disk_DISK_NUMBER_ #For example diskutil eject disk8 gpt show disk_DISK_NUMBER_
- Copy from the image, made with dd, of the complete, original ATV drive.
dd if=/path/to/ATV-image-filename of=/dev/disk_DISK_NUMBER_
- Remove partitions 1-4 from the partition table.
gpt remove -i 4 disk_DISK_NUMBER_ diskutil eject disk_DISK_NUMBER_ gpt remove -i 3 disk_DISK_NUMBER_ diskutil eject disk_DISK_NUMBER_ gpt remove -i 2 disk_DISK_NUMBER_ diskutil eject disk_DISK_NUMBER_ gpt remove -i 1 disk_DISK_NUMBER_
- Use gpt add to replace partitions 1-3 with exact copies of the original partition measurements from gpt show, earlier. The -b switch means beginning, so use the number from the right side of the original table, the starting block for this partition. The -s switch means size, so use the number from the size column of the original table. The -t switch means type, so use the type string from the original table.
diskutil eject disk_DISK_NUMBER_ gpt add -b _STARTING_BLOCK_PARTITION_1_ -i 1 -s _PARTITION_SIZE_1_ -t _PARTITION_TYPE_1_ diskutil eject disk_DISK_NUMBER_ gpt add -b _STARTING_BLOCK_PARTITION_2_ -i 2 -s _PARTITION_SIZE_2_ -t _PARTITION_TYPE_2_ diskutil eject disk_DISK_NUMBER_ gpt add -b _STARTING_BLOCK_PARTITION_3_ -i 3 -s _PARTITION_SIZE_3_ -t _PARTITION_TYPE_3_
- Determine the leftover space for partition 4.
diskutil eject disk_DISK_NUMBER_ gpt show disk_DISK_NUMBER_
- Add a partition 4 that fills the rest of the space. Use the numbers from the empty space following partition 3 from gpt show's results.
diskutil eject disk_DISK_NUMBER_ gpt add -b _STARTING_BLOCK_PARTITION_4_ -i 4 -s _PARTITION_SIZE_4_ -t _PARTITION_TYPE_4_
- Use Disk Utility to repair the 4th partition, Media. It will see that the Volume Header's size (old size) doesn't match the partition table size (new size).
- Remove .Spotlight-V100 from Media and OSBoot if they're there. Maybe single-user mode would be best so that automatic interlopers like Spotlight don't mess with our disks.
The first time I tried all this, when I put the new drive in my ATV, it started with the factory original OS, then went into an endless loop of restarts that didn't allow me to get to Factory Reset. The screen would alternate between the startup apple symbol, then the menu, but the menu showed only for a second. Holding MENU and - on the remote restarted, but then, after long flashing amber light, the ATV put some text on the screen indicating an input/output error. Twice.
So I took the disk out and connected it to my G5, and copied the recovery volume back onto the disk.
dd if=/path/to/recoverypartition of=/dev/disk_DISK_NUMBER_ bs=1m
Then I returned it to the ATV, and powered up, while holding MENU and - on the remote. Flashing yellow, Apple symbol...Minutes later, language selection. Resolution selection, then a menu of startup choices (restart, diagnostics, factory restore). This time I went straight to Factory Restore. ATV restarted, flashed yellow for several seconds. Then language selection, resolution selection. I plugged in the ethernet..."Connecting to network..." Apple symbol. Splash screen. "Connect to iTunes" keeps flashing on for two seconds alternating with the Apple symbol. It's not showing up in my iTunes screen on my computer. I click the menu button on the remote and now it's back to alternating between the frontrow menu and the Apple symbol. Redoing factory restore by holding MENU and - on the remote. Restore process completed again. This time I'm going to try it in 720p, just for fun. It showed up in iTunes just for a second, then went back to that alternating Apple logo, each time changing the iTunes pairing code. AAARGH!
I have some suspicions. Either OSBoot has something bad on it that survives the factory restore; or the EFI partition is not properly representing the disk, and this is confusing; or the Media volume has something confusing on it.
I try restarting and running diagnostics three times, then restart. Same problems.
New suspicion: I am working with a copy of the messy original drive. Maybe I should make a copy of its repaired self, since I repaired it in the middle of this process.
I might also try duplicating the OSBoot partition also onto the new disk, and asking gpt to recover itself.
Another suspicion (Maybe there should be a section for these): I created some of the volumes as a user, not the root. This seems far-fetched.
Replacing corrupted recovery OS with one from Apple
When you normally update the Apple TV software, the ATV gets a disk image from Apple that contains the updated OS. According to the guide at http://code.google.com/p/atv-bootloader/wiki/ATVBackup you can replace the image normally used for Factory Restore, on the recovery drive, with this image of the updated OS. Then asking for a factory restore will introduce this as the default OS.
- Get the image from Apple: http://mesu.apple.com/data/OS/061-7495.20100210.TAVfr/2Z694-6013-013.dmg
- Temporarily change the partition type of the recovery partition on the new disk to hfs+ (no journaling).
- Mount that partition.
- Mount the image downloaded from Apple.
- Replace OS.dmg in the recovery volume with our OS.dmg from the download from Apple.
- Change the recovery partition back to recovery format.
- Put the drive back in the ATV.
Before I tried this, I was desperate, so I downloaded an image of somebody else's ATV, the first 2GB of a 2.0.2 system, and copied it onto my hd. It started with a curious linux penguin splash screen, then I did a factory restore. Although it copied only the first 2 GB, it still had a partition table that thought the disk ended at 40GB, so the Media capacity is only 32GB. I removed the Media partition (4) and replaced it with one that fit the empty space.
References
http://www.engadget.com/2007/03/23/how-to-upgrade-the-drive-in-your-apple-tv/
- dd
- The disk duplicator utility is excellent for copying data from and to disks verbatim. You should unmount disks before use so that the disk isn't changed in the middle of a copy. Use a large blocksize to speed copies, with the -bs switch, e.g. "bs=1m". The blocksize, in bytes, changes how much is copied into memory, which buffers reads and writes. The larger the buffer, the faster large transfers. bs can take numbers and popular suffixes, like k and m. The actual blocks on the disks are probably 512b, but that has no relation to dd's settings.