Mount a Remote Drive via AFP under 1.1
This section explains how to mount a remote drive with AFP under release 1.1. See Mount a Remote Drive via AFP for the simpler 1.0 solution.
- 1 mount_afp (using AppleShare kernel extension from Intel Mac)
As of release 1.1, Apple TV does not contain mount_afp and the afp filesystem kernel extensions as 1.0 did, or OS X does for mounting AFP shares. But thanks to the great work of Turbo, it's now possible to load kernel extension from Intel Macs.
This process would not be available without the hard work of Turbo. Please donate on his site. http://0xfeedbeef.com/appletv/ I just copied and adjusted Dmd's great documentation on Mount a Remote Drive via SMBFS - he deserves all the credit for the text.
- You need SSH access
- Turbo's kextloader from http://0xfeedbeef.com/appletv/
- /System/Library/Filesystems/AppleShare and mount_afp from 10.4.9 (versions from 10.4.10 don't work!)
- If you have no Intel Mac with 10.4.7 - 10.4.9, you can get the files from the combo update for Intel, available from http://www.apple.com/support/downloads/macosx1049comboupdateintel.html
Copy files to Apple TV
Since you have to write files to your Apple TV disk, you have to Mount ReadWrite.
From Intel Mac
Copy the following files to your Apple TV (to the same location):
From Combo Update
If you don't have an Intel Mac with OS 10.4.7 - 10.4.9, download the Combo Update and open it, right-click the included .pkg file and click "Show package contents". Then extract the file Contents/Archive.pax.gz. For me this did not work using Finder, so I copied Archive.pax.gz into a directory on my desktop (e.g. $HOME/Desktop/Update) and ran the following command in this directory to extract the contents:
pax -r -z -f Archive.pax.gz
Now copy the following included files to your Apple TV:
- copy System/Library/Filesystems/AppleShare (directory) to /System/Library/Filesystems on Apple TV
- copy sbin/mount_afp to /sbin on Apple TV
- Create a symbolic link from AppleShare to afpfs.fs in /System/Library/Filesystems on Apple TV
cd /System/Library/Filesystems ln -s AppleShare afpfs.fs
Ensure your owner and permissions are correct
sudo chmod -R 755 /System/Library/Filesystems/AppleShare sudo chmod +x /sbin/mount_afp sudo chown -R root:wheel /System/Library/Filesystems/AppleShare sudo chown root:wheel /sbin/mount_afp
Turbo's Excellent Kext Enabler
Follow Turbo's instructions accurately(!) to create the /mach and /mach.sym files, a reboot is required. Execute the following commands on your Apple TV:
sudo mount -uw / sudo touch /.readwrite sudo sync
Next, reboot the Apple TV. When it comes back up, you'll have 2 new files /mach and /mach.sym (if you don't, something went wrong!). Now you can make it read-only again:
sudo rm /.readwrite sudo sync sudo mount -ur /
Now you have to make the kernel load your .kexts, which it does not yet. Download Turbo's excellent kextloader (turbo_kext_enabler.bin) from http://0xfeedbeef.com/appletv/ and copy it to your Apple TV. After that you have to make it executable and run it:
chmod +x turbo_kext_enabler.bin sudo ./turbo_kext_enabler.bin
Now you can load any kernel extensions! This has been reported to work with Apple TV 1.0 as well as 1.1.
Now you can mount any AFP share:
mkdir /path/to/your/share sudo mount_afp "afp://<Username>:<Password>@<IP-Address>/<Share>" /path/to/your/share
Mount at System Start
To make this mount and the .kext loading persistent across reboots, you can create a /etc/rc.local which can looks like that:
#!/bin/sh /your/path/to/turbo_kext_enabler.bin until ( ifconfig en0 ; ifconfig en1 ) 2>/dev/null | grep -q 'inet ' ; do sleep 2 done ping -c2 <Router/Gateway IP> # Ping twice for the first packet mount_afp "afp://<Username>:<Password>@<IP-Address>/<Share>" /path/to/your/share
Look at the comments to Sharity Light for some more ideas and common pitfalls using this method.
A better solution would be to create a StartupItem or using launchd (which is the recommended way for OS 10.4.x). The important thing is to wait with mounting the share, until the network interface has an IP address and is connected to the network. That's why a loop is used in the script above.