Notes on swapping the internal Xbox One hard disk for a solid-state disk
In a desperate effort to improve the Xbox One user experience (UX), I experimented with swapping out the Samsung Spinpoint M8 5400 RPM hard disk for a solid-state disk (SSD). My hypothesis at the time was that the disk, because of its slow speed, must be very busy and that swapping it out would yield a noticeable performance boost to the operating system and improve overall UX.
But a few folks on Twitter expressed interest in reproducing the experiment so here are my notes. (Thanks for your patience, Stefán!)
All Xbox consoles ship in storage configurations (e.g. 500GB, 1TB) that have this configuration burnt into its flash memory. This configuration is used to rebuild the partition layout on the internal disk in recovery scenarios, presenting an obstacle for a quick and easy disk swap.
That means an Xbox One 500GB will always want to restore a partition layout compatible with a 500GB disk.
All Xbox consoles ship with a SATA2 controller. The Xbox One S ships with a SATA3 drive but the same controller, limiting the drive to theoretical SATA2 speeds. This part swap was likely due to the scarcity and current cost of SATA2 disks.
The wireless chipset reports antenna status to the operating system. If this is not plugged in, you will not be able to complete the out-of-box-experience (OOBE), even in a wired configuration.
Encrypted container use is common on this platform. This presents a hypothetical hardware configuration data persistence problem when migrating data from one disk to another.
The boot loader appears to maintain state about previous successful/unsuccessful boots, which could lead to unexpected behavior when swapping disks. (More testing is needed in this area.)
Anti-rollback protection is present and used, preventing use of older versions of the OS after an update. This can invalidate hard disk backups very quickly.
The disks are set up with a standard GUID Partition Table layout, with strict validation of both header and partition array CRC32 checksums.
All partitions must also be assigned a well-known GUID. This should not be confused with the partition type GUID.
I did not test if the disk identifier was also used/validated, but it's not unreasonable to assume such.
I did not test if the backup GPT header (backup LBA) was used/validated.
The GUID Partition Table entry order is not validated. You can re-order partitions, given you continue to meet the requirements above.
As the Temp and User partitions are likely to be most busy, it makes sense to stuff those on the larger, outer hard disk tracks. Their adjacency also allows for short disk head travel for the inevitable back and forth.
But programmatically generating the User partition on non-standard disks can be tricky due to being positioned in the middle of the table. Some opted for simplicity and round to the nearest gibibyte and ignore what's left. PowerShell made this easy to implement accurately but it's not necessary.
It's possible I missed the one application that retrieves an enumerable list of partitions and selects a partition using a hard-coded index. But the odds of that kind of code surviving a code review at Microsoft are high.
Software updates to the Xbox One OS may not be compatible with the new storage, I have yet to receive an update to my test device. I did, however, enable dev mode successfully with no side effects.
- Windows 10
- My Xbox partitioning PowerShell script
- I used an inexpensive StarTech USB 3.0 to SATA adapter to read and write to the external disks.
- Active@ Disk Editor, HxD, and HDD Raw Copy Tool were handy during script development.
- Disassemble the Xbox One and remove the disk.
- Use a USB to SATA bridge to copy the contents of the disk to the PC.
- Use partitioning script to ready a blank SSD for Xbox One use.
- Copy the contents of the disk (i.e. each partition) to the newly prepared SSD
- Plug the SSD into the Xbox One and boot.
- The Xbox One may exhibit odd behavior at this point. It may boot but report free space incorrectly, or it may not boot at all. This is the hypothetical hardware configuration data persistence problem I was referring to. To fix this, I reset the console.
- Restore the Xbox One to its factory defaults. Be sure to complete OOBE and gracefully shut down the Xbox One after that's completed.
- At this point, Xbox One has restored the original partition layout on the disk, which is not what you want. (See considerations above.) But the characteristics of our disk should be implanted within a container somewhere, which is great.
- Remove the SSD from the Xbox One.
- Use a USB to SATA bridge to copy the contents of the SSD to the PC.
- Use partitioning script to wipe and ready the SSD for Xbox One use again.
- Copy the contents of the SSD back to the prepared blank SSD.
- Plug the SSD into the Xbox One and boot.
- The Xbox One should now report the available free space correctly and everything should be functioning normally. Be sure to read the considerations above for potential future gotchas.