Patchstick/Testing

From AwkwardTV
Revision as of 14:56, 8 April 2007 by Mactijn (talk | contribs) (first draft)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

This page describes how to make a Patch stick using OSX/Intel binaries, and therefor is not legally distributable.

However, I think this process is important enough to document, so we can see what steps are needed to build an open, free and 100% legal version of Patchstick. - Mactijn 23:56, 8 April 2007 (CEST)

Pre-requisites

  • USB flashdrive or disk (USB mass storage compatible)
  • an Intel machine running MacOSX 10.4.x (I used my macbook) (might also work on non-intel machines)
  • boot.efi from your ATV (yes I know, chicken/egg. Work is being done to remove this requirement)
  • Semthex's OSX86 kernel

Partitioning and formatting the USB disk

based on Turbo's excellent

  • hook up the USB drive to your iMac, macbook or macbook pro
  • check what disk it is:
hostname:~ user$ df -h
/dev/disk0s2               74G    72G   1.9G    97%    /
devfs                     100K   100K     0B   100%    /dev
fdesc                     1.0K   1.0K     0B   100%    /dev
<volfs>                   512K   512K     0B   100%    /.vol
automount -nsl [205]        0B     0B     0B   100%    /Network
automount -fstab [219]      0B     0B     0B   100%    /automount/Servers
automount -static [219]     0B     0B     0B   100%    /automount/static
/dev/diskX                499M    40K   499M     0%    /Volumes/NO NAME

note: sometimes, the disk can show up as diskXsY in stead of just diskX. You will only need the sY part for unmounting. After that, just use diskX

  • become root, and unmount the disk
hostname:~ user$ sudo -s
Password:
hostname:~ root# hdiutil unmount /dev/diskX
"diskX" unmounted successfully.
  • destroy the current partition table:
hostname:~ root# dd if=/dev/zero of=/dev/diskX bs=1m count=10
1+0 records in
1+0 records out
1048576 bytes transferred in 0.654783 secs (1601410 bytes/sec)
  • create a new one:
hostname:~ root# gpt create /dev/diskX
  • show the layout of the empty table:
hostname:~ root# gpt show /dev/diskX
    start     size  index  contents
        0        1         PMBR
        1        1         Pri GPT header
        2       32         Pri GPT table
       34  1022141         
  1022175       32         Sec GPT table
  1022207        1         Sec GPT header
  • create a new HFS partition, according to the values given above:
hostname:~ root# gpt add -b 34 -s 1022141 -i 1 -t "48465300-0000-11AA-AA11-00306543ECAC" /dev/diskX
  • Unplug and re-plug your USB disk. OSX will now give a dialog saying that the disk you inserted was not readable by this computer. Click on "Initialize..."
  • Disk utility will open. Select the partition (diskXsY) on the left. Then, select the "Erase" tab. In the "Name" field, type "Patchstick". Click the "Erase" button, and confirm.


Creating the patch-environment

this part is, for now, based on copying OSX binaries, and needs to be replaced ASAP

After performing the steps in the previous chapter, the USB drive's single partition should have mounted itself as /Volumes/Patchstick. If you named it differently, please substitute all occurences of /Volumes/Patchstick with the correct one.

  • in a shell, as root, change the current directory to the patchstick:
hostname:~ root# cd /Volumes/Patchstick
  • create the directory structure:
hostname:~ root# mkdir -p sbin usr/lib/system System/Library/Extensions stuff etc dev OSBoot
hostname:~ root# ln -s sbin bin
  • copy semthex's kernel (named mach_kernel) to /Volumes/Patchstick/
  • create /Volumes/Patchstick/com.apple.Boot.plist with your favourite text editor (vi/pico/joe/...) and make it look like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Background Color</key>
        <integer>0</integer>
        <key>Boot Fail Logo</key>
        <string></string>
        <key>Boot Logo</key>
        <string>BootLogo.png</string>
        <key>Kernel</key>
        <string>mach_kernel</string>
        <key>Kernel Flags</key>
        <string>-v</string>
</dict>
</plist>
  • copy over the following files:
hostname:~ root# cp -R /System/Library/Extensions/* /Volumes/Patchstick/System/Library/Extensions/
hostname:~ root# cp /bin/bash /bin/cp /sbin/mount /sbin/mount_hfs /sbin/mount_dev /bin/sleep /sbin/umount /Volumes/Patchstick/sbin/
hostname:~ root# cp /usr/sbin/sshd /Volumes/
hostname:~ root# cp /usr/lib/dyld /usr/lib/libSystem.B.dylib /usr/lib/libncurses.5.dylib /Volumes/Patchstick/usr/lib/
hostname:~ root# cp /usr/lib/system/libmathCommon.A.dylib /Volumes/Patchstick/usr/lib/system/
  • Patch the AppleFileSystemDriver and add the following section to the file /Volumes/Patchstick/System/Library/Extensions/AppleFileSystemDriver.kext/Contents/Info.plist in the IOPropertyMatch array:
                        <key>media-match</key>
                        <dict>
                                <key>IOPropertyMatch</key>
                                <array>
                                        <dict>
                                                <key>Content Hint</key>
                                                <string>5265636F-7665-11AA-AA11-00306543ECAC</string>
                                                <key>Leaf</key>
                                                <true/>
                                        </dict>
                                        <dict>
                                                <key>Content Hint</key>
                                                <string>Apple_Recovery</string>
                                                <key>Leaf</key>
                                                <true/>
                                        </dict>
                                        <dict>
                                                <key>Content Hint</key>
                                                <string>48465300-0000-11AA-AA11-00306543ECAC</string>
                                                <key>Leaf</key>
                                                <true/>
                                        </dict> 
  • create /Volumes/Patchstick/stuff/ssh.plist, make it look like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>com.openssh.sshd</string>
        <key>Program</key>
        <string>/usr/libexec/sshd-keygen-wrapper</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/sshd</string>
                <string>-i</string>
        </array>
        <key>SessionCreate</key>
        <true/>
        <key>Sockets</key>
        <dict>
                <key>Listeners</key>
                <dict>
                        <key>Bonjour</key>
                        <array>
                                <string>ssh</string>
                                <string>sftp-ssh</string>
                        </array>
                        <key>SockServiceName</key>
                        <string>ssh</string>
                </dict>
        </dict>
        <key>StandardErrorPath</key>
        <string>/dev/null</string>
        <key>inetdCompatibility</key>
        <dict>
                <key>Wait</key>
                <false/>
        </dict>
</dict>
</plist>
  • now, create /Volumes/Patchstick/sbin/launchd with your favourite text editor (vi/pico/joe/...) and make it look like this:
#!/bin/bash

exec 2>/dev/console
exec 1>/dev/console

echo
echo " --- AppleTV Patchstick ---"
echo

# echo "* remounting / r/w"
# /sbin/mount -uw /

echo "* mounting OSBoot partition r/o"
/sbin/mount -t hfs -r /dev/disk0s3 /OSBoot

echo "* re-mounting OSBoot partition r/w"
/sbin/mount -uw /OSBoot

if [ -d /OSBoot/dev/ ]; then

  # install ssh
  [ -f /stuff/sshd ] && [ -f /stuff/ssh.plist ] && (
    echo -n "* installing SSH daemon... "
    cp /stuff/sshd /OSBoot/usr/sbin/sshd
    cp /stuff/ssh.plist /OSBoot/System/Library/LaunchDaemons/ssh.plist
    echo "done."
  ) 

  # install Perian
  [ -d /stuff/Perian.component/ ] && (
    echo -n "* installing Perian Quicktime codec set... "
    cp -R /stuff/Perian.component /OSBoot/Library/Quicktime/
    echo "done."
  )

  # install ATVFiles
  [ -d /stuff/ATVFiles.frappliance/ ] && (
    echo -n "* installing ATVFiles... "
    cp -R /stuff/ATVFiles.frappliance /OSBoot/System/Library/CoreServices/Finder.app/Contents/PlugIns/
    echo "done."
  )

  ### Additional install stuff should go here


  /sbin/sync &>/dev/null
  /sbin/umount /OSBoot
  echo "all done!"

else
  echo "! OSBoot not mounted, not modifying anything"
fi


echo
echo "Now, you can reboot your AppleTV by unplugging/replugging the power supply."
/sbin/sleep 100000
  • make our launchd replacement executable:
hostname:~ root# chmod 755 /Volumes/Patchstick/sbin/launchd


Extra's

Above installs SSHD for you on your AppleTV. But the script also mentions Perian and ATVFiles. You can add them as a bonus:

  • Perian:
    • download and mount the current Perian .dmg
    • copy Perian.component to /Volumes/Patchstick/stuff/
  • ATVFiles:
    • download and unpack the ATVFiles tarball
    • copy ATVFiles.frappliance to /Volumes/Patchstick/stuff/

TODO

  • [page] add links to various items (semthex's kernel, Perian, ATVFiles)
  • [script] add more optional hacks
  • [script] hide patch messages, instead make animated (a la factory restore animation)