Difference between revisions of "Enable USB Storage on 2.x"
m (→Kernel patch) |
m (→Defining a startup item) |
||
Line 201: | Line 201: | ||
[[Category:2.0.2]] | [[Category:2.0.2]] | ||
[[Category:2.1]] | [[Category:2.1]] | ||
+ | [[Category:2.3]] |
Revision as of 08:44, 8 December 2008
This guide is for Apple TV 2.x (Take 2), for 1.x see Enable USB Storage on 1.x
This page is a compilation of bits and pieces of other how-to's in this wiki, mainly
Ben Mackin's USB enabler patch doesn't work with AppleTV V2.0.1 or V2.0.2 /mach_kernel.prelink
straight out of the box.
But it works once the script has been modified.
Contents
Prerequisites
In order to enable mounting external USB devices, you will need
- SSH access to the AppleTV, or its harddisk directly connected to your computer
- Turbo's .kext enabler
- Ben Mackin's kernel patcher.
- Mac OS X Tiger - Intel: extensions for USB mass storage I/O
Installation
Kernel
Enabling USB requires to modify /mach_kernel.prelink
on the AppleTV.
If this file isn't there yet, this means the system partition hasn't been forced to be mounted read/write yet.
Force it read/write with:
ssh frontrow@AppleTV.local sudo -s mount -uw / touch /.readwrite reboot
Kext enabler
Turbo's Kext enabler allows to load .kext
system extensions into the system.
- Download turbo_atv_enabler.bin which offers the latest SSE3 emulation and works for AppleTV 2.x series
- Rename it from turbo_atv_enabler.bin to turbo_kext_enabler.bin. This is to ensure compatibility as older versions of this file were called turbo_atv_enabler.bin
- Copy it to the AppleTV in folder
/sbin/
and check for the file's attributes:
ssh frontrow@AppleTV.local sudo -s cd /sbin/ ls -l turbo_kext_enabler.bin
- You might want to change them to:
chown root:wheel turbo_kext_enabler.bin chmod 555 turbo_kext_enabler.bin
Note: Turbo's USB patch has not been updated to work for AppleTV 2.x yet.
Kernel patch
Ben Mackin has written a kernel patcher for enabling USB.
Note: the Take 2 Full Update page seems to indicate that the kernel patcher only works on Intel Macs, and has to be recompiled from source for PPC Macs (or other platforms).
To patch the kernel:
- Download the kernel patcher to your Mac.
- Extract the
kernelpatch
folder from it (double-click).
- Copy the AppleTV's
/mach_kernel.prelink
to your Mac inside that folder.
- Inside the Terminal,
cd
into that folder.
- With AppleTV 2.0.1, 2.0.2, 2.1, 2.2 or 2.3, modify the portion of
do_usb_patch.sh
so that it becomes:
# # ==== patch the decompressed kernel # echo ======== patch kernel ========= ./poke mach_kernel_patched.bin 0x52055e 0x75:0x75 0x34:0x30 if [ $? -ne 0 ]; then exit 1; fi ./poke mach_kernel_patched.bin 0x52123E 0x75:0x75 0x34:0x30 if [ $? -ne 0 ]; then exit 1; fi ./poke mach_kernel_patched.bin 0x520576 0x75:0x75 0x1c:0x18 if [ $? -ne 0 ]; then exit 1; fi ./poke mach_kernel_patched.bin 0x521256 0x75:0x75 0x1c:0x18 if [ $? -ne 0 ]; then exit 1; fi
- Patch the kernel:
./do_usb_patch.sh mv mach_kernel.prelink mach_kernel_original.prelink mv mach_kernel_patched.prelink mach_kernel.prelink
- Copy the new
/mach_kernel.prelink
back to the AppleTV.
- Reboot the AppleTV
Extensions for USB drives
The following extensions are needed for mounting USB drives:
/System/Library/Extensions/IOSCSIArchitectureModelFamily.kext /System/Library/Extensions/IOStorageFamily.kext /System/Library/Extensions/IOUSBMassStorageClass.kext
I got mine from a Mac OS X Tiger install on an Intel machine.
The ones from the Darwin x86 iso won't work: with these, I get the message:
kextload: loaded version 1.5.1 of module com.apple.iokit.IOStorageFamily differs from requested version com.apple.iokit.IOStorageFamily
One can retrieve files from a downloadable combo update.
Once the files are copied, you can try if they work. Reboot the AppleTV and:
ssh frontrow@AppleTV.local sudo -s /sbin/turbo_kext_enabler.bin /sbin/kextload -v /System/Library/Extensions/IOUSBMassStorageClass.kext
If the loading works fine, plug an USB drive to the AppleTV and check if it is seen by the system:
diskutil list
You should see
/dev/disk0 #: type name size identifier 0: GUID_partition_scheme *37.3 GB disk0 1: EFI 34.0 MB disk0s1 2: Apple_Recovery 400.0 MB disk0s2 3: Apple_HFS OSBoot 900.0 MB disk0s3 4: Apple_HFS Media 35.8 GB disk0s4 /dev/disk1 #: type name size identifier ...
where, /dev/disk1
is the newly mounted USB drive.
Automatic loading at boot
Using rc.local
Automatically loading the USB mass storage extension at boot can be done with the help of /etc/rc.local
.
Create or edit the file and add the commands from the following listing:
# rc.local # enable USB /sbin/turbo_kext_enabler.bin /sbin/kextload /System/Library/Extensions/IOUSBMassStorageClass.kext
Restart the AppleTV and try pluging and unplugging an USB drive.
Defining a startup item
Let's define a Shares
startup item:
- Login to the AppleTV and navigate to the user startup items location:
ssh frontrow@AppleTV.local sudo -s cd /Library/StartupItems/
- Create the folder defining the startup item and go inside it:
mkdir Shares cd Shares
- Create the
Shares
startup item script (the name must match the directory):
#!/bin/sh ## # Share control ## . /etc/rc.common service_name='Network Shares' StartService () { echo "Starting $service_name" turbo_kext_enabler.bin > /dev/null 2>&1 kextload /System/Library/Extensions/IOUSBMassStorageClass.kext } StopService () { echo "Stopping $service_name" kextunload /System/Library/Extensions/IOUSBMassStorageClass.kext } RestartService () { StopService sleep 2s StartService } RunService "$1"
Make the service executable:
chmod 755 Shares
- Create the
StartupParameters.plist
definition:
{ Description = "Network Shares"; Provides = ("Network Shares"); Requires = ("Disks"); }
Restart the AppleTV and try pluging and unplugging an USB drive.