mirror of
https://github.com/PureDarwin/PureDarwin.git
synced 2026-01-25 12:16:26 +00:00
1794 lines
66 KiB
Bash
Executable File
1794 lines
66 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2007-2009 The PureDarwin Project.
|
|
# All rights reserved.
|
|
#
|
|
# @LICENSE_HEADER_START@
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
# @LICENSE_HEADER_END@
|
|
#
|
|
|
|
#
|
|
# Copyright (c) 2005, Apple Computer, Inc. All rights reserved.
|
|
#
|
|
# @APPLE_BSD_LICENSE_HEADER_START@
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
|
|
# its contributors may be used to endorse or promote products derived
|
|
# from this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
|
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
# @APPLE_BSD_LICENSE_HEADER_END@
|
|
#
|
|
|
|
#
|
|
# probono <probono@puredarwin.org>
|
|
# aladin <aladin@puredarwin.org>
|
|
#
|
|
|
|
#
|
|
# Set up a basic PureDarwin system
|
|
#
|
|
# WARNING: this will destroy all data on the target!
|
|
#
|
|
# Based on darwinmaster.sh by
|
|
# Kevin Van Vechten <kvv@apple.com>
|
|
# Based on buildcd.sh by
|
|
# Shantonu Sen <ssen@opendarwin.org>
|
|
# Felix Kronlage <fkr@opendarwin.org>
|
|
# Chuck Remes <cremes@opendarwin.org>
|
|
#
|
|
|
|
#
|
|
# Changelog
|
|
#
|
|
# 20090313 - See hg log (mercurial) and/or svn log from now - aladin
|
|
# 20090310 - Enabled PureFoundation
|
|
# pseudo network support - aladin
|
|
# 20090208 - Enabled xnu-dev (voodoo Release 1.0 Rev A)
|
|
# Developer choice, minor fixes - aladin
|
|
# 20081225 - Enabled xnu-dev (voodoo Release 1.0 Rev 1)
|
|
# Minor fixes about bootloader
|
|
# Provide startupfiletool, more WMs - aladin
|
|
# 20081224 - PureDarwin Xmas released!
|
|
# 20081219 - Added dtrace, keymaps (for X) in pd_roots
|
|
# Autoload X via launchd, minor fixes - aladin
|
|
# 20081217 - Assimilated pd_makeiso setup script
|
|
# Add qemu-img and mkisofs binary tool
|
|
# Fixed guestOS in .vmx, minor fixes - aladin
|
|
# 20081212 - Fixed mount manually to $MOUNT - probono
|
|
# 20081212 - Added zfs to pd_roots - fixed missingstuff - aladin
|
|
# 20081211 - We can't use missingstuff any more, need solve it
|
|
# Use entire disk, not just 256 MB - probono
|
|
# 20081210 - Mount manually to $MOUNT - probono
|
|
# 20081210 - Fixed experimental packages built with 9F33pd1.plist
|
|
# "nano" release uses launchd too, cosmetic updates - aladin
|
|
# 20081209 - License header update, minor updates
|
|
# Assimilated "nano" setup script
|
|
# Added autozone to pd_roots - aladin
|
|
# 20081030 - Add patched CF, IOKitUser, objc4 and launchd
|
|
# Added pam to pd_roots (for login & co) - aladin
|
|
# 20081022 - Fixed diskarbitrationd nag popup - probono
|
|
# 20081002 - Cleaned again - aladin
|
|
# 20080927 - Added .vmwarevm extension detection and support
|
|
# Minor fixes - aladin
|
|
# 20080926 - Many updates, umount fixed, vmware drivers cleaned
|
|
# Merge of pd_setup and pd_makedmg - aladin
|
|
# 20080925 - Fixed shell interactive mode in "nano"
|
|
# Minor updates, saving more spaces - aladin
|
|
# 20080921 - Added .zshrc, removed single user mode
|
|
# Added grep in pd_roots - aladin
|
|
# 20080917 - Minor updates and fixes
|
|
# Added zsh interactive mode (for "nano"), system_cmds (ps),
|
|
# file_cmds (ls), diskdev_cmds (devfs), adv_cmds (ps),
|
|
# libutil (mount), text_cmds (cat), in pd_roots - aladin
|
|
# 20080831 - Minor updates and fixes
|
|
# Added BootCache in pd_roots - aladin
|
|
# 20080827 - Less missingstuf: PCSC.framework (replaced by pcsc-lite)
|
|
# Added (temporary) VMware-Drivers-OpenSource.zip
|
|
# Minor updates - aladin
|
|
# 20080818 - Fixed minor errors
|
|
# Added vim in pd_roots
|
|
# Fake VMware guest OS detection
|
|
# Added pd_injectuser in pd_contrib/
|
|
# Added multi-user support - aladin
|
|
# 20080806 - Added timezone support
|
|
# Fixed errors found with debug activated (/var/log/syslog)
|
|
# Fixed pd_binaryroots (forgot to add ipsec in the previous commit)
|
|
# Fixed (almost) hostname - aladin
|
|
# 20080803 - Updating booter from v5.0.132_dfe_r28 to v5.0.132_dfe_r146
|
|
# Added IOBDStorageFamily in pd_drivers
|
|
# Changed missingstuff to override target existence test
|
|
# Less missingstuff: com.apple.securityd.plist, securityd,
|
|
# libsecurity, Security.framework (9D34),
|
|
# libipsec (9E17), libcrypto (openssl), ...
|
|
# Launchd debug and verbose boot log via syslog
|
|
# DTrace support
|
|
# motd and hostname are back! - aladin
|
|
# 20080527 - Fixed minor bugs - aladin
|
|
# 20080525 - Fork for "nano" - probono
|
|
# 20080523 - Using BinaryDrivers from DarwinBuild - probono
|
|
# 20080522 - Changed missingstuff not to use "L" since that
|
|
# filled up the disk too quickly and removed
|
|
# some of the missingstuff that is now available - probono
|
|
# 20080303 - Minor updates - aladin
|
|
# 20080108 - Initial version - probono
|
|
#
|
|
|
|
echo
|
|
echo "Set up a bootable PureDarwin system."
|
|
echo
|
|
|
|
################################################################################
|
|
# USAGE AND PREVENTIVE TESTS
|
|
################################################################################
|
|
|
|
# Fail on return error code
|
|
#set -e
|
|
|
|
# Fail on uninitialised variables
|
|
#set -u
|
|
|
|
# Ensure root exclusivity
|
|
if [ "$UID" -ne 0 ]
|
|
then
|
|
echo "You must be root in order to use $(basename $0)"
|
|
exit 1
|
|
fi
|
|
|
|
# Usage statement
|
|
if [ $# -lt 2 ]; then
|
|
echo "Usage: $(basename $0) available_output VolumeName"
|
|
echo
|
|
echo " * Create a physical volume"
|
|
echo " $(basename $0) /Volumes/PureDarwin PureDarwin"
|
|
echo " $(basename $0) /dev/diskX PureDarwin"
|
|
echo
|
|
echo " * Create an ISO 9660 image (.iso)"
|
|
echo " $(basename $0) /tmp/puredarwin.iso PureDarwin"
|
|
echo
|
|
echo " * Create a ready-to-run VMware virtual machine (.vmwarevm)"
|
|
echo " $(basename $0) puredarwin.vmwarevm PureDarwin"
|
|
echo
|
|
echo " * Create a ready-to-run VMware virtual disk (.vmdk)"
|
|
echo " $(basename $0) puredarwin.vmdk PureDarwin"
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure "" is not used as "target"
|
|
if [ "$1" = "" ]
|
|
then
|
|
echo "$(basename $0): Empty output filename"
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure / is not used as "target"
|
|
if [ "$1" = "/" ]
|
|
then
|
|
echo "Bad volume name: $1"
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure "target" exists (for real hw)
|
|
#if [ ! -e "$1" ]
|
|
#then
|
|
# echo "Unknown volume name: $1"
|
|
# exit 1
|
|
#fi
|
|
|
|
################################################################################
|
|
# PATHS AND VARIABLES
|
|
################################################################################
|
|
|
|
# Find out where this script lives
|
|
DIRNAME=$(cd $(dirname $0) && pwd)
|
|
|
|
# Reading global variables in pd_config file
|
|
source "$DIRNAME"/pd_config
|
|
|
|
# Destination output filename (aka "target")
|
|
TARGET="$1"
|
|
|
|
# FIXME remove redundancies btw TARGET and MOUNT
|
|
# Temporary pseudo PureDarwin Volume
|
|
MOUNT="/Volumes/$2"
|
|
|
|
# Volume label of the target image (ie: PureDarwin)
|
|
VOLNAME="$2"
|
|
|
|
# Thinned binary roots and drivers root folder
|
|
PACKAGES=$DIRNAME/$DESTDIR
|
|
|
|
# Add PureDarwin binaries and scripts to $PATH
|
|
export PATH=$DIRNAME/pd_setup_files/:$PATH
|
|
|
|
# Location for temporary auxiliary ISO
|
|
ELTORITOISO=/tmp/eltorito.iso
|
|
|
|
# mkisofs binary path (note: it doesn't come from darwin nor macosx)
|
|
MKISOFS_BIN="$DIRNAME/pd_setup_files/mkisofs"
|
|
|
|
# qemu-img binary path (note: it doesn't come from darwin nor macosx)
|
|
QEMUIMG_BIN="$DIRNAME/pd_setup_files/qemu-img"
|
|
|
|
# Target detection (real disk or image/vm) via extension
|
|
EXT=`/usr/bin/basename $1 | awk -F "." '{print $2}'`
|
|
|
|
# Needed for Mr proper in trap() function
|
|
export DEVICE=""
|
|
|
|
###############################################################################
|
|
# INFORMATION
|
|
###############################################################################
|
|
|
|
echo "Darwin release: $DARWIN_RELEASE"
|
|
echo "Architecture : $ARCH"
|
|
echo "Puredarwin : $PUREDARWIN_RELEASE"
|
|
echo
|
|
echo "\$1 (target) : $1"
|
|
echo "\$2 (name) : $2"
|
|
echo
|
|
|
|
###############################################################################
|
|
# WARNINGS
|
|
###############################################################################
|
|
|
|
echo "WARNING! this will destroy all data on $1"
|
|
printf "Continue? y[n] "
|
|
read CONT
|
|
if [ ! "$CONT" = "y" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
echo "WARNING! Are you sure?"
|
|
printf "Continue? y[n] "
|
|
read CONT
|
|
if [ ! "$CONT" = "y" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure "target" does not exist
|
|
if [ -e "$1" ]
|
|
then
|
|
echo "WARNING! \`$1' is going to be rewritten"
|
|
printf "Continue? y[n] "
|
|
read CONT
|
|
if [ ! "$CONT" = "y" ]; then
|
|
echo "Aborting! \`$CONT' is not \`y'."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo
|
|
echo "OK, You have been warned.."
|
|
echo
|
|
|
|
###############################################################################
|
|
# TRAP FUNCTIONS
|
|
###############################################################################
|
|
|
|
function mr_proper {
|
|
# Clean up temporary files and folders
|
|
echo "Cleaning up"
|
|
|
|
if [ -e $ELTORITOISO ];then
|
|
echo "Removing $ELTORITOISO"
|
|
rm $ELTORITOISO
|
|
fi
|
|
|
|
if [ -e /tmp/i386 ];then
|
|
echo "Removing /tmp/i386"
|
|
rm -r /tmp/i386
|
|
fi
|
|
|
|
CONT=""
|
|
T_ERROR=""
|
|
|
|
# Unmounting $MOUNT
|
|
echo "WARNING! \`$MOUNT is going to be unmounted"
|
|
printf "Continue? [y]n "
|
|
read CONT
|
|
if [ ! "$CONT" = "n" ]; then
|
|
T_ERROR=`umount -f "$MOUNT" 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
echo "$MOUNT unmounted"
|
|
else
|
|
echo "umount failed (error: $T_ERROR)"
|
|
fi
|
|
fi
|
|
|
|
# Ejecting $DEVICE
|
|
echo "WARNING! \`$DEVICE is going to be ejected"
|
|
printf "Continue? [y]n "
|
|
read CONT
|
|
if [ ! "$CONT" = "n" ]; then
|
|
T_ERROR=`hdiutil eject "$DEVICE" 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
echo "$DEVICE ejected"
|
|
else
|
|
echo "eject failed (error: $T_ERROR)"
|
|
fi
|
|
fi
|
|
|
|
# Removing $MOUNT
|
|
echo "WARNING! \`$MOUNT is going to be removed"
|
|
printf "Continue? [y]n "
|
|
read CONT
|
|
if [ ! "$CONT" = "n" ]; then
|
|
T_ERROR=`rmdir $MOUNT 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
echo "$MOUNT removed"
|
|
else
|
|
echo "rmdir failed: (error: $T_ERROR)"
|
|
fi
|
|
fi
|
|
|
|
# diskarbitrationd is not present nor needed in the "nano" and "bootstrap" releases.
|
|
if [ -e "/System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist" ]; then
|
|
# Revert diskarbitrationd mode to on
|
|
launchctl load /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist
|
|
fi
|
|
|
|
# Remove any previous copies
|
|
#if [ -e $TARGET ];then
|
|
# rm -rf "$TARGET"
|
|
# echo " * $TARGET removed"
|
|
#fi
|
|
}
|
|
|
|
# ^c (control-c) trapped
|
|
function trap_handler {
|
|
echo
|
|
echo "Trap function."
|
|
echo
|
|
|
|
# iso, vmwarevm, vmdk, dmg, etc..
|
|
if [ ! $EXT = "" ]; then
|
|
mr_proper
|
|
fi
|
|
|
|
# Resetting trap
|
|
trap - INT TERM EXIT
|
|
|
|
exit 0
|
|
}
|
|
|
|
# Trap ^c (control-c)
|
|
trap trap_handler INT TERM EXIT
|
|
|
|
###############################################################################
|
|
# BOOTLOADER PATH
|
|
###############################################################################
|
|
|
|
# Default bootloader: DFE bootloader v5.0.132_dfe_r146 based on Apple boot-132
|
|
BOOTi386=$DIRNAME/pd_setup_files/boot/i386/
|
|
|
|
# Add Chameleon bootloader (default: yes)
|
|
if [ ! "$ADD_CHAMELEON" = "n" ]; then
|
|
# The Chameleon bootloader
|
|
# (Apple Public Source License)
|
|
# http://chameleon.osx86.hu
|
|
# Chameleon 2.0-RC1-r431-bin
|
|
# Chameleon 2.0-RC2-r640-bin
|
|
# Chameleon 2.0-RC3-r658-bin
|
|
# Chameleon-2.0-RC4-r684-bin
|
|
|
|
T_CHAMELEON_RELEASE=""
|
|
if [ "$ADD_CHAMELEON_RC1" = "y" ]; then
|
|
T_CHAMELEON_RELEASE="Chameleon-2.0-RC1-r431-bin"
|
|
fi
|
|
|
|
if [ "$ADD_CHAMELEON_RC2" = "y" ]; then
|
|
T_CHAMELEON_RELEASE="Chameleon-2.0-RC2-r640-bin"
|
|
fi
|
|
|
|
if [ "$ADD_CHAMELEON_RC3" = "y" ]; then
|
|
T_CHAMELEON_RELEASE="Chameleon-2.0-RC3-r658-bin"
|
|
fi
|
|
|
|
if [ "$ADD_CHAMELEON_RC4" = "y" ]; then
|
|
T_CHAMELEON_RELEASE="Chameleon-2.0-RC4-r684-bin"
|
|
fi
|
|
echo "Extracting Chameleon bootloader ($T_CHAMELEON_RELEASE)"
|
|
# bsdtar 2.6.2 - libarchive 2.6.2 / Not in darwinbuild but present by default in Mac OS X
|
|
#bsdtar xjf $PACKAGES/$T_CHAMELEON_RELEASE.root.tar.bz2 -C "$DIRNAME/pd_setup_files/" --include "*/i386"
|
|
# tar (GNU tar) 1.15.1 / Present in darwinbuild and in Mac OS X FIXME but not in modern OS X
|
|
gnutar xjf $PACKAGES/$T_CHAMELEON_RELEASE.root.tar.bz2 -C "$DIRNAME/pd_setup_files/" --wildcards '*/i386*'
|
|
|
|
BOOTi386=$DIRNAME/pd_setup_files/$T_CHAMELEON_RELEASE/i386/
|
|
fi
|
|
|
|
BOOT0="boot0" # MBR
|
|
BOOT1H="boot1h" # Stage 1 bootsector of EFI partition
|
|
BOOT="boot" # Stage 2 boot2 HFS+ startup file
|
|
CDBOOT="cdboot" # CD-ROM, etc..
|
|
|
|
###############################################################################
|
|
# PARTITIONING THE DISK
|
|
###############################################################################
|
|
|
|
# iso, vmwarevm, vmdk, dmg, etc..
|
|
if [ ! $EXT = "" ]; then
|
|
|
|
#
|
|
# Ingredients for iso, dmg, vmwarevm, etc..
|
|
#
|
|
|
|
# Copy bootloader cdboot (but not only) for CD-ROMs
|
|
echo "Populating /tmp/i386 with bootloader files"
|
|
#echo "Making an ISO containing the boot-132 files and that has cdboot as its El Torito boot image at $ELTORITOISO..."
|
|
mkdir -p /tmp/i386
|
|
cp $BOOTi386/* /tmp/i386/
|
|
|
|
cd /tmp/i386
|
|
|
|
if [ ! -e $CDBOOT ]; then
|
|
# if it's not there, we should exit
|
|
echo "Aborting! cdboot cannot be found and is mandatory."
|
|
mr_proper
|
|
exit 1
|
|
fi
|
|
|
|
# mkisofs
|
|
#
|
|
# -quiet Less verbose
|
|
# -V Volume ID to be written into the master block
|
|
# -no-emul-boot The boot image used to create "El Torito" bootable CDs is a 'no emulation' image
|
|
# -boot-load-size Specifies the number of "virtual" (512-byte) sectors to load in no-emulation mode.
|
|
# The default is to load the entire boot file (here it is "4").
|
|
# Some BIOSes may have problems if this is not
|
|
# -c Path and filename of the boot catalog to be used when making an "El Torito" bootable CD
|
|
# -b Eltorito_boot path and filename of the boot image to be used when making an "El Torito" bootable CD
|
|
# -o Target written image file
|
|
echo "Creating $ELTORITOISO"
|
|
"$MKISOFS_BIN" -quiet -V "$VOLNAME" -no-emul-boot -boot-load-size 4 -c boot.cat -b $CDBOOT -o "$ELTORITOISO" .
|
|
|
|
# Sector count
|
|
sectors=$(du "$ELTORITOISO" | tail -1 | awk '{print $1}')
|
|
size_mb=$(du -h "$ELTORITOISO" | tail -1 | awk '{print $1}')
|
|
|
|
#echo "$ELTORITOISO has $sectors sectors, contains the boot-132 files and that has cdboot as its El Torito boot image"
|
|
echo "created: $ELTORITOISO ($size_mb | $sectors sectors)"
|
|
|
|
cd - > /dev/null
|
|
|
|
#
|
|
# Create a bootable image
|
|
#
|
|
|
|
# Remove any previous copies
|
|
#if [ -e "$TARGET" ];then
|
|
#rm -Rf "$TARGET"
|
|
#echo "removed: $TARGET"
|
|
#fi
|
|
|
|
|
|
# Default size of the bootable image to be created in Megabyte
|
|
# FIXME check size < thinned binaryroots dir?
|
|
# FIXME add size in pd_config
|
|
#SIZE=$(du -h -d 0 "$SOURCE" | cut -f 1 | sed 's/M//'g) # without "M"
|
|
#SIZE=$(expr $SIZE + $(expr 255 - $SIZE)) # add some MB to be on the safe side
|
|
SIZE="1618" # full
|
|
if [ "$ADD_RELEASE_NANO" = "y" ]; then
|
|
if [ "$PUREDARWIN_RELEASE" = "nano" ]; then
|
|
SIZE="150" # nano
|
|
else
|
|
SIZE="640" # bootstrap
|
|
fi
|
|
fi
|
|
|
|
# Create a bootable image
|
|
echo "Creating $TARGET (${SIZE}M)"
|
|
# hdiutil: manipulate disk images (attach, verify, burn, etc)
|
|
# create new image of the given size
|
|
# -fs specify the filesystem (HFS+J <- HFS+ journalised)
|
|
# -o the result written image
|
|
# -size specify the size of the image
|
|
# -layout specify the partition layout of the image (which is "NONE" here)
|
|
# -type UDIF is the default disk image type
|
|
# -nospotlight (Undocumented arg)
|
|
# > strings /usr/bin/hdiutil| grep nospotlight
|
|
# -nospotlight
|
|
# > strings /usr/share/man/man1/hdiutil.1 | grep nospotlight
|
|
# >
|
|
#hdiutil create -ov -fs HFS+J -o "$TARGET" -size ${SIZE}M -layout NONE -type UDIF -nospotlight
|
|
#mv $TARGET.dmg $TARGET
|
|
|
|
dd if=/dev/zero of="$TARGET" bs=1024k count=$SIZE
|
|
|
|
|
|
# Suppress automatic mounting of any filesystems in the image
|
|
# This will result in /dev entries being created and (for non-kernel-attached images)
|
|
# a process in the background, but no volumes will be mounted.
|
|
# FIXME `hdid' is not buildable nor available in Darwin, consequently the next steps are failing!
|
|
# FIXME `hdid' fails with unknown extension as .vmwarevm or .foobar
|
|
mv "$TARGET" "$TARGET.dmg"
|
|
export DEVICE=$(hdid -nomount "$TARGET.dmg" | head -1 | awk '{print $1}')
|
|
export RDEVICE=$(echo $DEVICE | sed s/disk/rdisk/)
|
|
mv "$TARGET.dmg" "$TARGET"
|
|
echo "Removed automatic mounting of any FS in $TARGET ($DEVICE entry kept)"
|
|
|
|
# Alternative `nbdst' <- not available.
|
|
|
|
# Alternative via `vndevice' works if
|
|
# fsck -fy has been run against the volume header of the HFS partition
|
|
|
|
echo "Initializing $RDEVICE"
|
|
# pdisk -initialise (Undocumented arg)
|
|
# > strings /usr/sbin/pdisk | grep "\-initia"
|
|
# -initialize
|
|
# > strings /usr/share/man/man8/pdisk.8| grep "\-initia"
|
|
# >
|
|
pdisk $RDEVICE -initialize
|
|
|
|
echo "Partitioning $RDEVICE"
|
|
# pdisk -dump (Undocumented arg)
|
|
# > strings /usr/sbin/pdisk | grep "\-dump"
|
|
# -initialize
|
|
# > strings /usr/share/man/man8/pdisk.8| grep "\-dump"
|
|
# >
|
|
blocks=$(pdisk $RDEVICE -dump | grep 2: | awk -F" " '{print $4}')
|
|
# create the partition on the image
|
|
pdisk $RDEVICE -createPartition "$VOLNAME" Apple_HFS $sectors $(expr $blocks - $sectors) > /dev/null
|
|
# figure out what slice the partition was created on
|
|
slice=`pdisk $RDEVICE -dump | grep "$VOLNAME" | awk -F: '{print $1}' | awk -F" " '{print $1}'`
|
|
echo "Partition created on slice $slice ($blocks blocks)"
|
|
|
|
|
|
# this is the tricky part
|
|
# dd
|
|
# skip=n Skip n blocks from the beginning of the input before copying.
|
|
# On input which supports seeks, an lseek(2) operation is used.
|
|
# Otherwise, input data is read and discarded.
|
|
# seek=n Seek n blocks from the beginning of the output before copying.
|
|
# bs=n Set both input and output block size to n bytes, superseding the ibs and obs operands.
|
|
#
|
|
# Partition map (with 512 byte blocks) on 'VirtualMachines/full.vmwarevm/full.iso'
|
|
# #: type name length base ( size )
|
|
# 1: Apple_partition_map Apple 63 @ 1
|
|
# 2: Apple_Free Extra 2664 @ 64 ( 1.3M) <=== ELTORITOISO is "dd-ed" here!
|
|
# 3: Apple_HFS full 2524440 @ 2728 ( 1.2G)
|
|
# 4: Apple_Free Extra 64 @ 2527168
|
|
# Device block size=512, Number of Blocks=2527232 (1.2G)
|
|
# DeviceType=0x0, DeviceId=0x0
|
|
echo "ddying $ELTORITOISO to $RDEVICE"
|
|
dd if="$ELTORITOISO" of=$RDEVICE skip=64 seek=64 bs=512
|
|
|
|
# journaled HFS+ volume (default: yes)
|
|
if [ ! "$ADD_HFS_JOURNAL" = "n" ]; then
|
|
echo "Initializing ${RDEVICE}s${slice} (Journaled HFS+ volume)"
|
|
newfs_hfs -s -J -v "$VOLNAME" ${RDEVICE}s${slice}
|
|
else
|
|
echo "Initializing ${RDEVICE}s${slice} (HFS+ volume)"
|
|
newfs_hfs -s -v "$VOLNAME" ${RDEVICE}s${slice}
|
|
fi
|
|
|
|
echo "Mounting ${DEVICE}s${slice} on $MOUNT"
|
|
mkdir -p "$MOUNT"
|
|
mount -t hfs -o perm ${DEVICE}s${slice} "$MOUNT"
|
|
|
|
# copying the boot2 HFS+ startup file
|
|
echo "Installing stage 2 loader (boot) to the partition's root directory"
|
|
cp $BOOTi386/$BOOT $MOUNT/
|
|
else
|
|
|
|
#
|
|
# Preparing and partitionning a whole physical disk device
|
|
#
|
|
|
|
# /dev/diskX passed as $1 ($TARGET)
|
|
if [ "`ls "$TARGET" | cut -b-9`" = "/dev/disk" ]; then
|
|
# Preventive check for disk device in /dev
|
|
if [ ! -e "$TARGET" ]; then
|
|
echo "ERROR: $TARGET does not exist."
|
|
trap_handler
|
|
fi
|
|
|
|
# disk device node in $1 ($TARGET)
|
|
export DEVICE=`ls "$TARGET" | cut -b-10`
|
|
export RDEVICE=${DEVICE/disk/rdisk}
|
|
else
|
|
# Default disk device node linked to an existing volume (e.g. /Volumes/PureDarwin)
|
|
PARTITION=$(df | grep "$1" | cut -d " " -f 1 ) # e.g.: /dev/disk0s2
|
|
RPARTITION=${PARTITION/disk/rdisk}
|
|
export DEVICE=$(echo $PARTITION | grep -o -e /dev/disk\[0-9\]\* )
|
|
export RDEVICE=${DEVICE/disk/rdisk}
|
|
fi
|
|
|
|
# diskarbitrationd is not present nor needed in the "nano" and "bootstrap" releases.
|
|
if [ -e "/System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist" ]; then
|
|
# Disable automounting in Finder and popping-up dialog boxed
|
|
launchctl unload /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist
|
|
fi
|
|
|
|
export COMMAND_LINE_INSTALL=1
|
|
umount -f ${DEVICE}s1
|
|
#umount -f $PARTITION
|
|
|
|
# FIXME fix needed for time
|
|
sleep 3
|
|
|
|
#
|
|
# Partitioning and Bootloader
|
|
#
|
|
|
|
# MBR initialisation with a template file (for BIOS)
|
|
# -i initialise the MBR sector and also erase partition table (exclusiv to u)
|
|
# -u Update MBR code, preserving existing partition table (exclusiv to i)
|
|
# -y Do not ask for confirmation before writing
|
|
# -a Specify an automatic partitioning style (which is "hfs")
|
|
# -f Specifies an alternate MBR template file (which is $BOOT0)
|
|
# Erase MBR (default: yes)
|
|
echo "Installing boot0 to the partition MBR"
|
|
if [ ! "$ADD_MBR_ERASE" = "n" ]; then
|
|
fdisk -i -y -a hfs -f $BOOTi386/$BOOT0 $RDEVICE
|
|
else
|
|
fdisk -u -y -a hfs -f $BOOTi386/$BOOT0 $RDEVICE
|
|
fi
|
|
|
|
# Create an HFS Plus file system
|
|
# -s case-sensitive HFS Plus filesystem
|
|
# -J journaled HFS+ volume (default journal size is 8MB)
|
|
# -v volume name (which is the following arg)
|
|
# journaled HFS+ volume (default: yes)
|
|
# FIXME "...s1" should not be hardcoded
|
|
if [ ! "$ADD_HFS_JOURNAL" = "n" ]; then
|
|
/sbin/newfs_hfs -s -J -v "$VOLNAME" ${RDEVICE}s1
|
|
else
|
|
/sbin/newfs_hfs -s -v "$VOLNAME" ${RDEVICE}s1
|
|
fi
|
|
#
|
|
sleep 5 # FIXME fix needed for time / absolutely needed!
|
|
|
|
echo "Installing stage 1 booter (boot1h) to the partition bootsector"
|
|
dd if=$BOOTi386/$BOOT1H of=${RDEVICE}s1
|
|
|
|
sleep 3 # FIXME fix needed for time
|
|
|
|
# Add Chameleon bootloader (default: yes)
|
|
if [ "$ADD_CHAMELEON" = "n" ]; then
|
|
# startupfiletool should not be needed with Chameleon
|
|
$DIRNAME/../scripts/startupfiletool ${RDEVICE}s1 $BOOTi386/$BOOT
|
|
fi
|
|
|
|
# TODO RAID Install
|
|
|
|
/bin/sync
|
|
|
|
# Force the mount point to be $MOUNT before diskarbitrationd is launched again
|
|
mkdir -p ${MOUNT}
|
|
mount -t hfs ${DEVICE}s1 ${MOUNT}
|
|
|
|
# copying the boot2 HFS+ startup file
|
|
echo "Installing stage 2 loader (boot) to the partition's root directory"
|
|
cp $BOOTi386/$BOOT $MOUNT/
|
|
|
|
# FIXME?
|
|
# ./fdisk -e /dev/rdiskX
|
|
# f 1
|
|
# w
|
|
# q
|
|
|
|
# diskarbitrationd is not present nor needed in the "nano" and "bootstrap" releases.
|
|
if [ -e "/System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist" ]; then
|
|
# Enable "automounting in Finder and popping-up dialog boxed" on Mac OS X host
|
|
launchctl load /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist
|
|
fi
|
|
fi
|
|
|
|
# Disable Spotlight
|
|
echo "Disabling Spotlight indexation"
|
|
touch ${MOUNT}/.metadata_never_index
|
|
|
|
# Adopts (activates) on-disk ownership
|
|
# FIXME deprecated.
|
|
echo "Adopting (Activating) on-disk ownership"
|
|
vsdbutil -a ${MOUNT}
|
|
|
|
# Ensure permissions are on
|
|
# FIXME seems to always fail and make the set -e strict mode also.
|
|
#vsdbutil -c ${MOUNT}
|
|
|
|
###############################################################################
|
|
# BINARYROOTS DEPLOYMENT
|
|
###############################################################################
|
|
|
|
# Moving to the PureDarwin root ("/")
|
|
cd ${MOUNT}
|
|
|
|
mkdir -p ./private/var/log/
|
|
echo "Installing packages on '${MOUNT}'..."
|
|
|
|
for PROJECT in `cat $DIRNAME/$BINARYROOTS_LIST_FILE` ; do
|
|
echo " * $(basename $PROJECT.root.tar.bz2)"
|
|
|
|
# (default: n)
|
|
if [ "$ADD_RELEASE_NANO" = "y" ]; then
|
|
tar xjpf $PACKAGES/$PROJECT.root.tar.bz2 \
|
|
--exclude '*svn*' \
|
|
--exclude '*/include/*' \
|
|
--exclude '/Developer' \
|
|
--exclude '/AppleInternal' \
|
|
--exclude '/usr/lib/libSystem.B_debug.dylib' \
|
|
--exclude '/usr/lib/libSystem.B_profile.dylib' \
|
|
--exclude '*.h' >> ${MOUNT}/private/var/log/pd_setup.log
|
|
#--exclude '/usr/local/lib/*' \
|
|
else
|
|
tar xjpf $PACKAGES/$PROJECT.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
done
|
|
|
|
echo
|
|
|
|
###############################################################################
|
|
# MISSING STUFF (mainly vital binarydrivers of darwin 10)
|
|
###############################################################################
|
|
|
|
# fixme: "until" is commented because missingstuff shouldn't miss stuff.
|
|
# It happens (stuff is missed) if the target dir or file exists, even partially.
|
|
# (e.g., CoreFoundation.framework)
|
|
# note: no missingstuff in "nano" release
|
|
|
|
missingstuff() {
|
|
until [ -e ${MOUNT}/$1 ]; do
|
|
echo "WARNING! $1 is missing. Do you want to copy it from your start volume?"
|
|
echo "You will not be allowed to use the resulting installation anywhere else but on your Apple-labeled computer. Please check with the Mac OS X license first."
|
|
printf "Copy? y[n] "
|
|
read CONT
|
|
if [ "$CONT" = "y" ]; then
|
|
ditto -v $1 ${MOUNT}/$1 #--rsrc --extattr
|
|
fi
|
|
done
|
|
}
|
|
|
|
# FIXME IOKitUser built in 9J61 lacks of symbol as _kextmanager* needed by kextload..
|
|
# The one from 9F33pd1/IOKitUser.root.tar.gz is OK!
|
|
|
|
#if [ "$DARWIN_RELEASE" = "10" ]; then
|
|
# Disabled for obvious reasons.
|
|
# missingstuff /System/Library/Extensions/AppleACPIPlatform.kext
|
|
# missingstuff /System/Library/Extensions/IOSCSIArchitectureModelFamily.kext
|
|
# missingstuff /System/Library/Extensions/AppleRTC.kext
|
|
# missingstuff /System/Library/Extensions/IOATAFamily.kext
|
|
# missingstuff /System/Library/Extensions/IOPCIFamily.kext
|
|
|
|
# echo " * ICHSMBus.root.tar.bz2 (replacement for closed AppleSMBus* kexts)"
|
|
# tar xjpf $PACKAGES/ICHSMBus.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
# echo " * iTCOWatchdog.root.tar.bz2 (replacement for AppleTCOWatchdog and potentially for AppleLPC kexts)"
|
|
# tar xjpf $PACKAGES/iTCOWatchdog.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
#fi
|
|
|
|
# Add Chameleon themes (default: yes)
|
|
#if [ ! "$ADD_CHAMELEON_THEMES" = "n" ]; then
|
|
# FIXME populate Extra folder, and custom plist + adapt graphics resolution
|
|
# http://forum.voodooprojects.org/index.php/topic,388.0.html
|
|
#fi
|
|
|
|
# Voodoo kernel (xnu-dev) replacement (default: y)
|
|
if [ ! "$ADD_VOODOO_XNU" = "n" ]; then
|
|
#
|
|
# Sources: http://code.google.com/p/xnu-dev/
|
|
#
|
|
echo " * Voodoo_kernel.root.tar.bz2"
|
|
tar xjpf $PACKAGES/Voodoo_kernel.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# Keeping the "vanilla" kernel
|
|
mv $MOUNT/mach_kernel $MOUNT/mach_kernel.origin
|
|
|
|
# mach_kernel.voodoo.9.5 (Voodoo 1.0 Rev A / xnu-dev) (default: y)
|
|
if [ ! "$ADD_VOODOO_XNU_9_5_0" = "n" ]; then
|
|
cp $MOUNT/mach_kernel.voodoo.9.5 $MOUNT/mach_kernel
|
|
fi
|
|
|
|
# mach_kernel.voodoo.9.7 (Voodoo 2 -- alpha 3 -- (based on XNU 9.7.0, for Intel only) (default: n)
|
|
if [ "$ADD_VOODOO_XNU_9_7_0" = "y" ]; then
|
|
cp $MOUNT/mach_kernel.voodoo.9.7 $MOUNT/mach_kernel
|
|
fi
|
|
fi
|
|
|
|
# Xnu-speedstep support (default: n)
|
|
if [ "$ADD_VOODOO_XNU_SPEEDSTEP" = "y" ]; then
|
|
# "A kernel extension for OS X to enable Intel SpeedStep and undervolting on any kernel"
|
|
#
|
|
# Intel SpeedStep driver which extends the range of CPUs and motherboard support
|
|
# AppleIntelCPUPowerManagement kext
|
|
# http://code.google.com/p/xnu-speedstep
|
|
# v1.4.9
|
|
echo " * VoodooIntelEnhancedSpeedStep.root.tar.bz2"
|
|
tar xjpf $PACKAGES/VoodooIntelEnhancedSpeedStep.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
chown -R root:wheel ${MOUNT}/System/Library/Extensions/IntelEnhancedSpeedStep.kext
|
|
chmod -R 755 $MOUNT/System/Library/Extensions/IntelEnhancedSpeedStep.kext
|
|
|
|
# Which frequencies are available: sysctl kern.cputhrottle_freqs
|
|
# switch frequency : sudo sysctl -w kern.cputhrottle_curfreq=YYYY
|
|
fi
|
|
|
|
# VoodooPowerMini Kext (v 1.2.4) support (default: n)
|
|
if [ "$ADD_VOODOO_POWER_MINI" = "y" ]; then
|
|
# "OSX Alternative Power Management"
|
|
#
|
|
# http://code.google.com/p/voodoo-power
|
|
# http://www.superhai.com/darwin.html
|
|
echo " * VoodooPowerMini.root.tar.bz2"
|
|
tar xjpf $PACKAGES/VoodooPowerMini.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
# FIXME add choice for:
|
|
#VoodooBattery.kext - To be used with vanilla ACPI and pm.bundle, 10.5.x
|
|
#VoodooPower Kext
|
|
#VoodooPower Command Line Interface Tool
|
|
#VoodooUSBEHCI for 10.5.x see readme!
|
|
|
|
|
|
|
|
# VoodooPS2Controller 0.98 support (default: y)
|
|
if [ ! "$ADD_VOODOO_PS2CONTROLLER" = "n" ]; then
|
|
# WARNING: conflict with ACPIPS2Nub!
|
|
#
|
|
# Contains:
|
|
# - VoodooPS2Controller
|
|
# - VoodooPS2Keyboard
|
|
# - VoodooPS2Mouse
|
|
# - VoodooPS2Trackpad
|
|
# c.f. Contents/Plugins/VoodooPS2Trackpad.kext/Info.plist
|
|
#
|
|
# FIXME synapticsconfigload <- needed? functional?
|
|
# FIXME in vmx? <- keyboard.vusb.enable = "FALSE"
|
|
echo " * VoodooPS2Controller.root.tar.bz2"
|
|
tar xjpf $PACKAGES/VoodooPS2Controller.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
|
|
# David Elliott PS2 support (default: n)
|
|
if [ "$ADD_DFE_PS2CONTROLLER" = "y" ]; then
|
|
# ACPIPS2Nub: PS2Controller for mouse matching a PNP device from David Elliott
|
|
# org.tgwbd.driver.ACPIPS2Nub
|
|
# version 1.0.0d1
|
|
echo " * ACPIPS2Nub.root.tar.bz2 (Copyright David Elliott, 2007)"
|
|
tar xjpf $PACKAGES/ACPIPS2Nub.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
echo " * ApplePS2Controller.root.tar.bz2"
|
|
tar xjpf $PACKAGES/ApplePS2Controller.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
|
|
# Prompt for VMware support (default: y)
|
|
if [ ! "$ADD_VMWARE" = "n" ]; then
|
|
# Fake easily guest OS detection (Mac OS X Server) in Fusion
|
|
# Template for a PureDarwin binary root:
|
|
# /System/Library/CoreServices/ServerVersion.plist
|
|
# /System/Library/CoreServices/SystemVersion.plist
|
|
# Info: http://code.google.com/p/puredarwin/issues/detail?id=3
|
|
|
|
# FIXME repack or at least move the archive elsewhere than in pd_setup_files
|
|
# LegacyAppleIntelPIIXATA and NullCPUPowerManagement KEXTs for use with VMware other than Fusion
|
|
echo " * VMware-Drivers-OpenSource.zip"
|
|
unzip -q $DIRNAME/pd_setup_files/VMware-Drivers-OpenSource.zip -d ${MOUNT}/System/Library/Extensions
|
|
|
|
# (default: n)
|
|
if [ "$ADD_X" = "y" ]; then
|
|
# Graphic drivers required for X display
|
|
echo " * VMwareIOFramebuffer.kext.zip"
|
|
unzip -q $DIRNAME/pd_setup_files/VMwareIOFramebuffer.kext.zip -d ${MOUNT}/System/Library/Extensions
|
|
fi
|
|
fi
|
|
|
|
# PureFoundation enhancements (default: y)
|
|
if [ ! "$ADD_PUREFOUNDATION" = "n" ]; then
|
|
#echo "Installing PureFoundation enhancements"
|
|
#rm -rf $MOUNT/System/Library/Frameworks/CoreFoundation.framework
|
|
# PureFoundation 0.003.1 (svn rev 30)
|
|
# SHA1 Checksum: b0bc7432627a060874f28f04297a80c4a5fbd094
|
|
# CoreFoundation and ddistnoted
|
|
# PureFoundation-0.003.1.root.zip
|
|
echo " * PureFoundation.root.tar.bz2 (Foundation, CoreFoundation and ddistnoted)"
|
|
tar xjpf $PACKAGES/PureFoundation.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
# WORKAROUND
|
|
# FIXME remove workaround
|
|
# Because otool -L /Volumes/PureDarwin/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
|
|
# /Volumes/PureDarwin/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation:
|
|
# /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
|
|
# ---> /Users/stuart/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 300.0.0)
|
|
# /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 36.0.0)
|
|
mkdir -p "$MOUNT/Users/stuart/Library/Frameworks"
|
|
chroot "$MOUNT" ln -fs /System/Library/Frameworks/Foundation.framework /Users/stuart/Library/Frameworks/Foundation.framework
|
|
|
|
# ddistnoted content is provided in PureFoundation archive too
|
|
echo " * ddistnoted.root.tar.bz2"
|
|
tar xjpf $PACKAGES/ddistnoted.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# Usefull for passwd (and dscl (and sudo?))
|
|
#rm -R ${MOUNT}/System/Library/PrivateFrameworks/OpenDirectory.framework/Versions/A/Frameworks
|
|
echo " * CFOpenDirectory.root.tar.bz2"
|
|
mkdir -p ${MOUNT}/System/Library/PrivateFrameworks/OpenDirectory.framework/Versions/A/Frameworks
|
|
tar xjpf $PACKAGES/CFOpenDirectory.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# configd stuff for network support
|
|
# Source: https://sites.google.com/a/puredarwin.org/puredarwin/developers/network
|
|
# on Mar 7, 2009 8:25 PM by stuart@echus.demon.co.uk (version 3 / earlier versions)
|
|
echo " * configd.root.tar.bz2"
|
|
tar xjpf $PACKAGES/configd.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# Satisfy dependencies for bootp (bootp popuplate /System/Library/SystemConfiguration with IPConf.. & co)
|
|
# bootp is now added in pd_roots
|
|
echo " * NotApple80211.root.tar.bz2"
|
|
tar xjpf $PACKAGES/NotApple80211.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# CFNetwork.framework and CarbonCore.framework (only headers) wrapped inside CoreServices.framework
|
|
# Source: https://sites.google.com/a/puredarwin.org/puredarwin/developers/cfnetwork
|
|
# on Feb 23, 2009 6:10 PM by stuart@echus.demon.co.uk (version 1)
|
|
echo " * CFNetwork.root.tar.bz2 (wrapped in CoreServices.framework)"
|
|
tar xjpf $PACKAGES/CFNetwork.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
# configd_plugins-91.root (partially built)
|
|
#
|
|
# InterfaceNamer.bundle <- ?
|
|
# KernelEventMonitor.bundle <- dhcp client (according to qemu user mode network stack
|
|
# Kicker.bundle <- ???
|
|
#cp -R /Users/aladin/PureDarwin/darwinbuild/9J61/.build/buildroot.nfs/private/var/tmp/configd_plugins/configd_plugins-91.root/System/Library/SystemConfiguration/KernelEventMonitor.bundle $MOUNT/System/Library/SystemConfiguration/
|
|
echo " * configd_plugins.root.tar.bz2 (InterfaceNamer.bundle, KernelEventMonitor.bundle and Kicker.bundle)"
|
|
tar xjpf $PACKAGES/configd_plugins.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
chown -R root:wheel $MOUNT/System/Library/LaunchDaemons/
|
|
|
|
# FIXME ? + /Library/Preferences/SystemConfiguration/preferences.plist
|
|
fi
|
|
|
|
# User login support (default: y)
|
|
if [ ! "$ADD_LOGIN" = "n" ]; then
|
|
# multi-user - temporary workaround mode (small PAM module for session)
|
|
#
|
|
# Source: https://sites.google.com/a/puredarwin.org/puredarwin/users/users
|
|
# https://sites.google.com/a/puredarwin.org/puredarwin/downloads
|
|
#
|
|
echo " * pam_sessioncreate.root.tar.bz2"
|
|
tar xjpf $PACKAGES/pam_sessioncreate.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
# FIXME should it be integrated into "pam_modules" ?
|
|
# FIXME + cat >${MOUNT}/etc/pam.d/login<<EOOF
|
|
|
|
# PC/SC stack
|
|
#
|
|
# Contain:
|
|
# - System/Library/Frameworks/PCSC.framework
|
|
# - usr/sbin/pcscd
|
|
echo " * PCSC.root.tar.bz2"
|
|
tar xjpf $PACKAGES/PCSC.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
|
|
# FIXME add MacPorts sources & bin? archive?
|
|
|
|
# Add MacPorts tcl requirements (default: y)
|
|
if [ ! "$ADD_MACPORTS_TCL" = "n" ]; then
|
|
# Needed in order to be able to compile MacPorts and probably with it.
|
|
echo " * tcl-8.5.6_0+threads.i386.tbz2"
|
|
tar xjpf $DIRNAME/$BINARYROOTS_DEFAULT_DIR/mp/tcl-8.5.6_0+threads.i386.tbz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
|
|
# FIXME archive
|
|
# Add X and co (default: no)
|
|
if [ "$ADD_X" = "y" ]; then
|
|
# Installing X binaryroots from macports (windowmaker, fluxbox, wmii, eterm, etc..)
|
|
for f in `ls $DIRNAME/$BINARYROOTS_DEFAULT_DIR/X/*.tbz2` ; do
|
|
echo " * $(basename $f)"
|
|
tar xjpf $f >> ${MOUNT}/private/var/log/pd_setup.log
|
|
done
|
|
|
|
# Removing MacPorts archive "noise" (+COMMENT +CONTENTS +DESC +PORTFILE and +STATE in /)
|
|
rm -f "${MOUNT}/+*"
|
|
|
|
# Prevent error: "Fontconfig error: Cannot load default config file" which "cycles" X
|
|
chroot ${MOUNT} /usr/X11R6/bin/fc-cache -v -f /usr/X11R6/lib/X11/fonts/
|
|
fi
|
|
|
|
# DTrace facility (default: n)
|
|
#
|
|
# DTrace is not present on http://src.macosforge.org/Roots/
|
|
# Notice Foundation.framework and CoreFoundation.framework dependencies
|
|
#
|
|
# What about "Symbolication.framework"? (problem with 9J61 (not patched as 9F33pd1))
|
|
#
|
|
if [ "$ADD_DTRACE" = "y" ]; then
|
|
|
|
echo " * dtrace.root.tar.bz2"
|
|
tar xjpf $PACKAGES/dtrace.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
#missingstuff /usr/sbin/dtrace
|
|
#missingstuff /System/Library/PrivateFrameworks/Symbolication.framework
|
|
#missingstuff /usr/lib/libdtrace.dylib
|
|
#missingstuff /usr/bin/dtruss
|
|
#missingstuff /usr/bin/procsystime
|
|
fi
|
|
|
|
# MacFUSE userland filesystem (default: n)
|
|
if [ "$ADD_MACFUSE" = "y" ]; then
|
|
|
|
# MacFUSE 2.0 - Version 2.0.3.2
|
|
echo " * MacFUSE.root.tar.bz2"
|
|
tar xjpf $PACKAGES/MacFUSE.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
|
|
chown -R root:wheel ${MOUNT}/Library/Filesystems/fusefs.fs
|
|
chmod -R 755 ${MOUNT}/Library/Filesystems/fusefs.fs
|
|
|
|
# FIXME TODO add binaryroots to uncomment below
|
|
# sshfs in MacFUSE (default: n)
|
|
# if [ "$ADD_MACFUSE_SSHFS" = "y" ]; then
|
|
# echo " * MacFUSE_sshfs.root.tar.bz2"
|
|
# curl "http://macfuse.googlecode.com/svn/trunk/filesystems/sshfs/binary/sshfs-static-leopard" > ${MOUNT}/usr/sbin/mount_sshfs
|
|
# chmod a+x ${MOUNT}/usr/sbin/mount_sshfs
|
|
# fi
|
|
|
|
# ramdisk in MacFUSE (default: n)
|
|
if [ "$ADD_MACFUSE_RAMDISK" = "y" ]; then
|
|
echo " * MacFUSE_ramdisk.root.tar.bz2"
|
|
tar xjpf $PACKAGES/MacFUSE_ramdisk.root.tar.bz2 >> ${MOUNT}/private/var/log/pd_setup.log
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
cd - > /dev/null
|
|
|
|
###############################################################################
|
|
# SELF DEPLOYMENT (bootstrap)
|
|
###############################################################################
|
|
|
|
# Clone the setup scripts repository to the target? (default: n)
|
|
if [ "$ADD_CLONE" = "y" ]; then
|
|
echo "Copying setup files..."
|
|
mkdir -p ${MOUNT}/usr/local/share/puredarwin/setup/$TEMPDIR
|
|
# Warning: read `hg help clone' (e.g. incompatible with mq)
|
|
# -l not supported on Darwin and Mac OS X
|
|
# -a not supported on Darwin..
|
|
#cp -Rfp $DIRNAME/.. ${MOUNT}/usr/local/share/puredarwin
|
|
cp -Rfp $DIRNAME/../APPLE_DRIVER_LICENSE.txt ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../APPLE_LICENSE.txt ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../PUREDARWIN_LICENSE.txt ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../WELCOME ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../patches ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../plists ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../projects ${MOUNT}/usr/local/share/puredarwin/
|
|
cp -Rfp $DIRNAME/../scripts ${MOUNT}/usr/local/share/puredarwin/
|
|
|
|
cp -fp $DIRNAME/../setup/* ${MOUNT}/usr/local/share/puredarwin/setup/ 2> /dev/null
|
|
|
|
# c.f. pd_config: DESTDIR="$TEMPDIR/Packages_D${DARWIN_RELEASE}_${ARCH}"
|
|
cp -Rfp $DIRNAME/../setup/pd_setup_files ${MOUNT}/usr/local/share/puredarwin/setup/
|
|
|
|
# FIXME below should disappear (with deps)
|
|
# An arbitrary mountpoint potentially usefull on read-only mode
|
|
mkdir -p ${MOUNT}/Volumes/PureDarwin
|
|
# Idem
|
|
mkdir -p ${MOUNT}/tmp/i386
|
|
|
|
fi
|
|
|
|
# Add setup binaryroots to the target? (default: n)
|
|
if [ "$ADD_CLONE_PACKAGES" = "y" ]; then
|
|
|
|
# e.g., DESTDIR="Packages_D9_i386" and TEMPDIR="pd_tmp"
|
|
cp -Rfp $DIRNAME/../setup/$DESTDIR ${MOUNT}/usr/local/share/puredarwin/setup/$TEMPDIR/
|
|
|
|
# Specific for X roots
|
|
mkdir -p ${MOUNT}/usr/local/share/puredarwin/setup/$BINARYROOTS_DEFAULT_DIR
|
|
cp -Rfp $DIRNAME/../setup/$BINARYROOTS_DEFAULT_DIR/mp ${MOUNT}/usr/local/share/puredarwin/setup/$BINARYROOTS_DEFAULT_DIR/
|
|
cp -Rfp $DIRNAME/../setup/$BINARYROOTS_DEFAULT_DIR/X ${MOUNT}/usr/local/share/puredarwin/setup/$BINARYROOTS_DEFAULT_DIR/
|
|
|
|
cp -Rfp $DIRNAME/../setup/$DESTDIR ${MOUNT}/usr/local/share/puredarwin/setup/$TEMPDIR/
|
|
|
|
# Alternative if a mercurial binary root is available (including its dependencies..)
|
|
#hg clone $DIRNAME/.. ${MOUNT}/usr/local/share/puredarwin
|
|
# Can take a lot of disk space
|
|
#hg clone $DIRNAME/$TEMPDIR ${MOUNT}/usr/local/share/puredarwin/$TEMPDIR
|
|
fi
|
|
|
|
###############################################################################
|
|
# SETTING FILES DEPLOYMENT
|
|
###############################################################################
|
|
|
|
echo "Copying settings files..."
|
|
# default: y
|
|
if [ "$ADD_SETTINGS_FILES" = "n" ]; then
|
|
# FIXME not sure we need all of them for nano
|
|
mkdir -p ${MOUNT}/Library/Preferences/SystemConfiguration/
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/Library/Preferences/SystemConfiguration/com.apple.Boot.plist ${MOUNT}/Library/Preferences/SystemConfiguration/com.apple.Boot.plist
|
|
|
|
mkdir -p ${MOUNT}/System/Library/LaunchDaemons/
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/System/Library/LaunchDaemons/com.apple.getty.plist ${MOUNT}/System/Library/LaunchDaemons/com.apple.getty.plist
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/System/Library/LaunchDaemons/org.puredarwin.nanoshell.plist ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.nanoshell.plist
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/System/Library/LaunchDaemons/org.puredarwin.installer.plist ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.installer.plist
|
|
|
|
mkdir -p ${MOUNT}/etc/
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/etc/ttys ${MOUNT}/etc/ttys
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/etc/zshrc ${MOUNT}/etc/zshrc
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/etc/bashrc ${MOUNT}/etc/bashrc
|
|
|
|
mkdir -p ${MOUNT}/System/Library/CoreServices/
|
|
touch ${MOUNT}/System/Library/CoreServices/ServerVersion.plist
|
|
|
|
mkdir -p ${MOUNT}/var/db/dslocal/nodes/Default/users
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/var/db/dslocal/nodes/Default/users/root.plist ${MOUNT}/var/db/dslocal/nodes/Default/users/root.plist
|
|
|
|
# APPLE_DRIVER_LICENSE.txt, APPLE_LICENSE.txt and PUREDARWIN_LICENSE.txt
|
|
# FIXME how to handle that correctly?
|
|
cp -fp $DIRNAME/../projects/PureDarwinSettings/*LICENSE.txt ${MOUNT}/
|
|
else
|
|
# Copying all settings files
|
|
cp -fpR $DIRNAME/../projects/PureDarwinSettings/* ${MOUNT}/
|
|
fi
|
|
|
|
###############################################################################
|
|
# EFI BOOTLOADER
|
|
###############################################################################
|
|
|
|
# Copy bootloader files for bless (usefull for pd_make_dmg)
|
|
mkdir -p $MOUNT/usr/standalone/i386/
|
|
cp $BOOTi386/* $MOUNT/usr/standalone/i386/
|
|
|
|
if [ ! -e "$MOUNT/System/Library/CoreServices" ]; then
|
|
echo "WARNING! $MOUNT/System/Library/CoreServices is missing, but it is needed for EFI booting."
|
|
#exit 1
|
|
fi
|
|
|
|
if [ ! -e "$MOUNT/usr/standalone/i386/cdboot" ]; then
|
|
echo "WARNING! $MOUNT/usr/standalone/i386/cdboot is missing, but it is needed for BIOS booting."
|
|
#exit 1
|
|
fi
|
|
|
|
#${MOUNT}/usr/sbin/bless -verbose -folder "$MOUNT/System/Library/CoreServices" -bootinfo -bootefi
|
|
# --folder Set this directory to be the Mac OS X/Darwin blessed directory, containing a BootX secondary loader for New World machines
|
|
# --bootinfo Create a BootX file in the Darwin system folder using file as a source.
|
|
# If file is not provided, a default is used (see FILES), using a path relative
|
|
# to the mountpoint you are blessing.
|
|
# This attempts to ensure that a BootX is used that is compatible with the OS on the target volume.
|
|
# --bootefi Create a boot.efi file in the Mac OS X/Darwin system folder using file as a source
|
|
# [...]
|
|
echo "Blessing $MOUNT/System/Library/CoreServices"
|
|
${MOUNT}/usr/sbin/bless --folder "$MOUNT/System/Library/CoreServices" --bootinfo --bootefi --verbose
|
|
#${MOUNT}/usr/sbin/bless --folder "$MOUNT/System/Library/CoreServices" --bootefi --verbose
|
|
|
|
|
|
# Use a little resolution (default: n)
|
|
# TODO alter com.apple.Boot.plist
|
|
if [ "$ADD_FB_640x480x32" = "y" ]; then
|
|
GRAPHICS_MODE="\"Graphics Mode\"=\"640x480x32\""
|
|
fi
|
|
|
|
# Use a medium resolution (default: y)
|
|
# TODO alter com.apple.Boot.plist
|
|
if [ ! "$ADD_FB_800x600x32" = "n" ]; then
|
|
GRAPHICS_MODE="\"Graphics Mode\"=\"800x600x32\""
|
|
fi
|
|
|
|
# Use a normal resolution (default: n)
|
|
# TODO alter com.apple.Boot.plist
|
|
if [ "$ADD_FB_1024x768x32" = "y" ]; then
|
|
GRAPHICS_MODE="\"Graphics Mode\"=\"1024x768x32\""
|
|
fi
|
|
|
|
###############################################################################
|
|
# TIMEZONE
|
|
###############################################################################
|
|
|
|
# FIXME which one as default?
|
|
# Setting GMT+1 timezone (instead of Pacific)
|
|
rm -f ${MOUNT}/private/etc/localtime
|
|
#chroot ${MOUNT} ln -s /usr/share/zoneinfo/Europe/Berlin /private/etc/localtime
|
|
# [...]
|
|
#chroot ${MOUNT} ln -s /usr/share/zoneinfo/Europe/London /private/etc/localtime
|
|
# [...]
|
|
ln -fs /usr/share/zoneinfo/Europe/Paris ${MOUNT}/private/etc/localtime
|
|
|
|
# Preparing /etc/hostconfig (deprecated?)
|
|
echo "CRASHREPORTER=-NO-" >> $MOUNT/private/etc/hostconfig
|
|
|
|
# Encrypting swap by default
|
|
# FIXME: it seems dynamic_pager lacks -E even with ENCRYPTSWAP=-YES
|
|
echo "ENCRYPTSWAP=-YES-" >> $MOUNT/private/etc/hostconfig
|
|
|
|
###############################################################################
|
|
# SYSCTL
|
|
###############################################################################
|
|
|
|
# Setting hostname
|
|
echo "kern.hostname=PureDarwin.local" > $MOUNT/private/etc/sysctl.conf
|
|
|
|
###############################################################################
|
|
# LOGIN PROMPT
|
|
###############################################################################
|
|
|
|
# Message Of The Day
|
|
echo "Welcome to PureDarwin!" > $MOUNT/private/etc/motd
|
|
echo '' >> ${MOUNT}/private/etc/motd
|
|
|
|
###############################################################################
|
|
# SHELLS
|
|
###############################################################################
|
|
|
|
# dyld errors
|
|
#
|
|
# com.apple.dyld[76]: update_dyld_shared_cache[76] for arch=i386 failed: /var/db/dyld/shared_region_roots/ does not exist, errno=2
|
|
mkdir -p ${MOUNT}/var/db/dyld/shared_region_roots
|
|
# com.apple.dyld[50]: update_dyld_shared_cache: warning, no entries found in shared_region_roots
|
|
echo "/bin/sh" > ${MOUNT}/var/db/dyld/shared_region_roots/Applications.paths
|
|
|
|
# Add the Bash shell as default shell? (default: y)
|
|
if [ ! "$ADD_BASH" = "n" ]; then
|
|
ln -fs /bin/bash ${MOUNT}/bin/sh
|
|
echo "/bin/bash" >> ${MOUNT}/var/db/dyld/shared_region_roots/Applications.paths
|
|
|
|
fi
|
|
|
|
# Populate (or remove) /etc/bashrc (default: y)
|
|
if [ "$ADD_BASHRC" = "n" ]; then
|
|
rm -f ${MOUNT}/etc/bashrc
|
|
fi
|
|
|
|
# Add the Z shell as default shell? (default: n)
|
|
if [ "$ADD_ZSH" = "y" ]; then
|
|
chroot ${MOUNT} ln -fs /bin/zsh /bin/sh
|
|
echo "/bin/zsh" >> ${MOUNT}/var/db/dyld/shared_region_roots/Applications.paths
|
|
fi
|
|
|
|
# Populate (or remove) /etc/zshrc (default: y)
|
|
if [ "$ADD_ZSHRC" = "n" ]; then
|
|
rm -f ${MOUNT}/etc/zshrc
|
|
fi
|
|
|
|
###############################################################################
|
|
# MINOR ERRORS FIXES
|
|
###############################################################################
|
|
|
|
echo "Fixing minor errors"
|
|
|
|
# Avoid orphan link of /etc/resolv.conf
|
|
touch ${MOUNT}/private/var/run/resolv.conf
|
|
|
|
# com.apple.dyld[50]: update_dyld_shared_cache: warning, empty cache not generated for arch i386
|
|
# -root specifies the root of an OS installation for which dyld's shared cache should be updated
|
|
# -arch generates cache files for the specified one (i386)
|
|
# -force regenerated the shared cache files even if they appear to be already up-to-date
|
|
#
|
|
# FIXME warning, could not bind /Volumes/PD/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation...
|
|
# ...because realpath() failed on /Volumes/PD/Users/stuart/Library/Frameworks/Foundation.framework/Versions/C/Foundation
|
|
|
|
# FIXME ./pd_setup: line 1138: /Volumes/bootstrap: is a directory
|
|
|
|
#if [ "$DARWIN_RELEASE" = "9" ]; then
|
|
#${MOUNT} update_prebinding -root ${MOUNT} -arch i386 -force # Available in Leopard
|
|
#${MOUNT} update_prebinding -root ${MOUNT} -arch i386 -force -debug
|
|
#else
|
|
#${MOUNT} update_dyld_shared_cache -root ${MOUNT} -arch i386 -force # Available in SnowLeopard
|
|
#fi
|
|
|
|
# com.apple.launchd[1] (org.ntp.ntpd): Unknown key: SHAuthorizationRight
|
|
#
|
|
# A project at Apple is overloading the launchd configuration file
|
|
# schema to store non-launchd preferences. We hope to resolve this
|
|
# matter in the next major version of Mac OS X.
|
|
#
|
|
# Key (temporary) disabled to keep "Pure" log.
|
|
#
|
|
# cat >${MOUNT}/System/Library/LaunchDaemons/org.ntp.ntpd.plist<<EOOF
|
|
|
|
# Problem: _CFGetHostUUIDString: unable to determine UUID for host. Error: 35
|
|
# Solution: A MAC address from an attached network interface should do the trick too.
|
|
# Pseudo-solution: Adding AppleEFINVRAM (CREDITS: XSource) via:
|
|
#missingstuff /System/Library/Extensions/AppleEFIRuntime.kext
|
|
|
|
################################################################################
|
|
# DEBUG
|
|
################################################################################
|
|
|
|
# Crank up the debug logging on launchd (default: yes). Credit: kvv for the tips.
|
|
if [ ! "$ADD_DEBUG" = "n" ]; then
|
|
echo "log level debug" > ${MOUNT}/etc/launchd.conf
|
|
echo "*.debug /var/log/syslog" >> ${MOUNT}/etc/syslog.conf
|
|
fi
|
|
|
|
###############################################################################
|
|
# COPYING UTILS, FUTILS AND INUTILS!
|
|
###############################################################################
|
|
|
|
mkdir -p ${MOUNT}/usr/local/sbin/
|
|
mkdir -p ${MOUNT}/usr/local/share/puredarwin/scripts
|
|
mkdir -p ${MOUNT}/usr/local/share/puredarwin/setup/pd_setup_files/
|
|
|
|
|
|
# Copy startupfiletool
|
|
echo "Copying startupfiletool"
|
|
cp $DIRNAME/pd_setup_files/startupfiletool ${MOUNT}/usr/local/share/puredarwin/setup/pd_setup_files/
|
|
|
|
# Copy PureDarwin scripts
|
|
echo "Copying PureDarwin scripts"
|
|
cp $DIRNAME/../scripts/pd_* ${MOUNT}/usr/local/share/puredarwin/scripts/
|
|
|
|
# Moar futils
|
|
#cp $DIRNAME/../projects/pd_xkp/pd_xkp ${MOUNT}/usr/local/sbin/
|
|
|
|
###############################################################################
|
|
# USER MANAGEMENT
|
|
###############################################################################
|
|
|
|
# multi-user - temporary workaround mode (securityd in single thread mode (it works with some threads))
|
|
#
|
|
# Source : https://sites.google.com/a/puredarwin.org/puredarwin/users/users
|
|
#
|
|
# + cat >${MOUNT}/System/Library/LaunchDaemons/com.apple.securityd.plist<<EOOF
|
|
|
|
# Root account (disabled)
|
|
#
|
|
# Enabling root is dangerous and not recommended,
|
|
# we do not provide root password! `sudo' should be for
|
|
# priviledge elevation purpose.
|
|
#
|
|
mkdir -p ${MOUNT}/var/db/dslocal/nodes/Default/users
|
|
# + cat >${MOUNT}/var/db/dslocal/nodes/Default/users/root.plist<<EOOF
|
|
|
|
# Creating default user account (default: y)
|
|
# username: toor
|
|
# password: toor
|
|
#
|
|
if [ ! "$ADD_DEFAULT_USER" = "n" ]; then
|
|
echo "Creating default user (toor:toor)"
|
|
# pd_injectuser (salter SHA-1 digest by default, should work into single user mode)
|
|
# FIXME update pd_adduser..
|
|
chroot $MOUNT /usr/local/share/puredarwin/scripts/pd_injectuser / toor
|
|
# pd_adduser must be run on Darwin/Mac OS X host, or in single user mode from PureDarwin
|
|
# Note: `dscl' and `passwd' dependencies must be satistified.
|
|
# $DIRNAME/../scripts/pd_adduser
|
|
fi
|
|
|
|
###############################################################################
|
|
# X11
|
|
###############################################################################
|
|
|
|
# Add X and co (default: no)
|
|
if [ "$ADD_X" = "y" ]; then
|
|
# Default keymapping
|
|
cp $MOUNT/System/Library/Keyboards/USA.keymapping $MOUNT/System/Library/Keyboards/USA.keymapping.orig
|
|
rm -f $MOUNT/System/Library/Keyboards/USA.keymapping
|
|
|
|
# Belge keymapping (default: n)
|
|
if [ "$ADD_KEYMAP_BELGE" = "y" ]; then
|
|
chroot $MOUNT ln -fs /System/Library/Keyboards/Belge.keymapping /System/Library/Keyboards/USA.keymapping
|
|
fi
|
|
# Deutsch keymapping (default: n)
|
|
if [ "$ADD_KEYMAP_DEUTSCH" = "y" ]; then
|
|
chroot $MOUNT ln -fs /System/Library/Keyboards/Deutsch.keymapping /System/Library/Keyboards/USA.keymapping
|
|
fi
|
|
# Francais keymapping (default: n)
|
|
if [ "$ADD_KEYMAP_FRANCAIS" = "y" ]; then
|
|
chroot $MOUNT ln -fs /System/Library/Keyboards/Francais.keymapping /System/Library/Keyboards/USA.keymapping
|
|
fi
|
|
# UK keymapping (default: n)
|
|
if [ "$ADD_KEYMAP_UK" = "y" ]; then
|
|
chroot $MOUNT ln -fs /System/Library/Keyboards/UK.keymapping /System/Library/Keyboards/USA.keymapping
|
|
fi
|
|
# USA keymapping (default: y)
|
|
if [ ! "$ADD_KEYMAP_USA" = "n" ]; then
|
|
mv $MOUNT/System/Library/Keyboards/USA.keymapping.orig $MOUNT/System/Library/Keyboards/USA.keymapping
|
|
fi
|
|
fi
|
|
|
|
###############################################################################
|
|
# X11 WMs
|
|
###############################################################################
|
|
|
|
# WindowMaker (default: n)
|
|
if [ "$ADD_WMAKER" = "y" ]; then
|
|
chroot ${MOUNT} /opt/local/bin/wmaker.inst
|
|
cp $DIRNAME/pd_setup_files/*png $MOUNT/var/root/GNUstep/Library/WindowMaker/Backgrounds
|
|
fi
|
|
|
|
#echo " 0 - WindowMaker 0.92"
|
|
#echo " 1 - Fluxbox 1.1.0.1_0"
|
|
#echo " 2 - wmii-3.1_0"
|
|
|
|
###############################################################################
|
|
# NANO LAUNCHD, DAEMONS AND PLISTS
|
|
###############################################################################
|
|
|
|
# Add launchd (default: yes)
|
|
if [ "$ADD_LAUNCHD" = "n" ]; then
|
|
# Overwrite /sbin/launchd with a trivial shell script
|
|
mkdir -p ${MOUNT}/sbin/
|
|
cp $DIRNAME/../scripts/pd_nanoshell ${MOUNT}/sbin/launchd
|
|
chown root:wheel ${MOUNT}/sbin/launchd
|
|
chmod 755 ${MOUNT}/sbin/launchd
|
|
else
|
|
|
|
# Add default login prompt (default: yes)
|
|
if [ "$ADD_LAUNCHD_GETTY" = "n" ]; then
|
|
# Disable login prompt
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.getty.plist
|
|
fi
|
|
|
|
# Add mDNSResponder (default: yes)
|
|
if [ "$ADD_LAUNCHD_MDNSRESPONDER" = "n" ]; then
|
|
# Disable mDNSResponder
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.mDNSResponderHelper.plist
|
|
fi
|
|
|
|
# Add portmap (default: yes)
|
|
if [ "$ADD_LAUNCHD_PORTMAP" = "n" ]; then
|
|
# Disable portmap
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.portmap.plist
|
|
fi
|
|
# Add statd (default: yes)
|
|
if [ "$ADD_LAUNCHD_STATD" = "n" ]; then
|
|
# Disable statd
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.statd.notify.plist
|
|
fi
|
|
|
|
# Add a synthetic custom "shell" launched by launchd (default: no)
|
|
if [ "$ADD_LAUNCHD_NANOSHELL" = "y" ]; then
|
|
# A launchd plist (org.puredarwin.nanoshell.plist) run a synthetic custom "shell" (pd_nanoshell)
|
|
chmod 644 ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.nanoshell.plist
|
|
chmod +x ${MOUNT}/usr/local/share/puredarwin/scripts/pd_nanoshell
|
|
else
|
|
# Disable launchd plist to run a synthetic custom "shell" (pd_nanoshell)
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.nanoshell.plist
|
|
fi
|
|
|
|
# Add a tiny installer script launched by launchd (default: no)
|
|
if [ "$ADD_LAUNCHD_INSTALLER" = "y" ]; then
|
|
# A launchd plist (org.puredarwin.installer.plist) run a CLI installer (pd_installer)
|
|
chmod 644 ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.installer.plist
|
|
chmod +x ${MOUNT}/usr/local/share/puredarwin/scripts/pd_installer
|
|
|
|
# not needed in this scenario..
|
|
rm -f \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.SystemStarter.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.atrun.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.bootlog.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.bsd.dirhelper.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.dyld.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.firmwaresyncd.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.hidd.plist\
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.kextd.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/com.apple.update.plist\
|
|
${MOUNT}/System/Library/LaunchDaemons/finger.plist \
|
|
${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.ddistnoted.plist
|
|
else
|
|
# Disable launchd plist to run a synthetic custom "shell" (pd_installer)
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/org.puredarwin.installer.plist
|
|
fi
|
|
fi
|
|
|
|
# (default: no)
|
|
if [ "$ADD_RELEASE_NANO" = "y" ]; then
|
|
#FIXME: below seems needed for network support!
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.DirectoryServices.plist
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.DirectoryServicesLocal.plist
|
|
rm -f ${MOUNT}/System/Library/LaunchDaemons/com.apple.DirectoryServicesInstallDaemon.plist
|
|
fi
|
|
|
|
|
|
###############################################################################
|
|
# REDUCING TARGET DISK SIZE
|
|
###############################################################################
|
|
|
|
|
|
# Keep developer stuff (default: y)
|
|
if [ "$ADD_DEVELOPER" = "n" ]; then
|
|
echo "Cleaning up unneeded developer files from ${MOUNT}..."
|
|
rm -rf ${MOUNT}/Developer # saves little (fixme, only if "Developer" has not been selected)
|
|
rm -rf ${MOUNT}/usr/include/ # saves > 150 MB (fixme, only if "Developer" has not been selected)
|
|
# find ${MOUNT}/ -type f | grep "\.h$" | xargs -I {} rm -f {} # more header files (fixme, only if "Developer" has not been selected)
|
|
rm -rf ${MOUNT}/AppleInternal/ # (fixme, only if "Developer" has not been selected)
|
|
#rm -rf ${MOUNT}/usr/lib/libSystem.B_debug.dylib # saves ~14M
|
|
#rm -rf ${MOUNT}/usr/lib/libSystem.B_profile.dylib # saves ~11M
|
|
find ${MOUNT} -name '.svn' | xargs rm -R
|
|
#else
|
|
|
|
# Macports sources
|
|
# http://guide.macports.org/#installing.macports.subversion
|
|
#
|
|
#svn co http://svn.macports.org/repository/macports/trunk/base
|
|
|
|
# Libdispatch sources
|
|
# http://svn.macosforge.org/repository/libdispatch/trunk/INSTALL
|
|
#
|
|
#svn checkout http://svn.macosforge.org/repository/libdispatch/trunk
|
|
fi
|
|
|
|
###############################################################################
|
|
# PERMISSIONS
|
|
###############################################################################
|
|
|
|
echo "Fixing permissions"
|
|
chown root:wheel ${MOUNT}/sbin
|
|
chown root:wheel ${MOUNT}/mach_kernel
|
|
chown -R root:wheel ${MOUNT}/System/Library/Extensions/
|
|
chmod -R 0644 $MOUNT/System/Library/Extensions/
|
|
chown -R root:wheel $MOUNT/var/empty # for sshd
|
|
|
|
# ZFS is disabled since MacOSForge also dropped it.
|
|
#
|
|
# zfs perms according to http://zfs.macosforge.org/trac/wiki/downloads
|
|
#chown -R root:wheel /System/Library/Extensions/zfs.kext
|
|
#chown -R root:wheel /System/Library/Filesystems/zfs.fs
|
|
#chown -R root:wheel /usr/sbin/zpool
|
|
#chown -R root:wheel /usr/sbin/zfs
|
|
#chown -R root:wheel /usr/lib/libzfs.dylib
|
|
|
|
###############################################################################
|
|
# CACHE AND EXTENTIONS.MKEXT
|
|
###############################################################################
|
|
|
|
echo "Set Extensions.mkext invocation"
|
|
touch $MOUNT/System/Library/Extensions
|
|
|
|
# Add creation of kext cache file (default: y)
|
|
if [ ! "$ADD_KEXTCACHE" = "n" ]; then
|
|
mkdir -p $MOUNT/System/Library/Caches/com.apple.kernelcaches
|
|
kextcache -a $ARCH -s -l -n -c "$MOUNT/System/Library/Caches/com.apple.kernelcaches/kernelcache.DEADBEEF" -k -K "$MOUNT/mach_kernel" -m "$MOUNT/System/Library/Extensions.mkext" "$MOUNT/System/Library/Extensions"
|
|
# ...leads to:
|
|
# Can't resolve dependencies amongst kexts for prelinked kernel.
|
|
# Failed to generate prelinked kernel.
|
|
|
|
fi
|
|
|
|
# Force completion of pending disk writes
|
|
/bin/sync
|
|
|
|
###############################################################################
|
|
# ISO / VMWAREVM / VMDK / DMG / etc..
|
|
###############################################################################
|
|
|
|
# Detect image extension (iso|vmwarevm|vmdk|dmg|*) and act in consequences
|
|
if [ ! $EXT = "" ]; then
|
|
|
|
# Some .vmx variables
|
|
if [ "$DARWIN_RELEASE" = "10" ]; then
|
|
T_GUESTOS="darwin10"; # Darwin 10
|
|
else
|
|
T_GUESTOS="darwin" # Darwin 9 and prior
|
|
fi
|
|
|
|
T_TARGET_EXT=$(basename $TARGET | awk -F '.' '{print $NF}')
|
|
case $T_TARGET_EXT in
|
|
|
|
###############################################################
|
|
# ISO 9660 CD-ROM filesystem (.iso)
|
|
###############################################################
|
|
iso)
|
|
T_TARGET=$(dirname $TARGET)/$(basename $TARGET | awk -F '.' '{print $1".iso"}')
|
|
;;
|
|
|
|
###############################################################
|
|
# VMware virtual disk (.vmdk)
|
|
###############################################################
|
|
vmdk)
|
|
T_TARGET=$(dirname $TARGET)/$(basename $TARGET | awk -F '.' '{print $1".iso"}')
|
|
# Forced converting iso to VMware vmdk
|
|
echo "Converting image to VMware VMDK disk image, please wait..."
|
|
$QEMUIMG_BIN convert -O vmdk $T_TARGET $(dirname $TARGET)/$(basename $TARGET | awk -F '.' '{print $1".vmdk"}')
|
|
;;
|
|
|
|
###############################################################
|
|
# VMware virtual machine package (.vmwarevm)
|
|
###############################################################
|
|
vmwarevm)
|
|
T_TARGET="$(basename $TARGET | awk -F '.' '{print $1".iso"}')"
|
|
# Moving the .vmwarevm file to .iso
|
|
mv "$TARGET" "$T_TARGET"
|
|
# Creating the .vmwarevm directory
|
|
mkdir -p "$TARGET"
|
|
# Moving the .iso file to the .vmwarevm directory
|
|
mv "$T_TARGET" "$TARGET/$T_TARGET"
|
|
|
|
cat > $TARGET/$(basename $TARGET | awk -F '.' '{print $1".vmx"}') <<EOOF
|
|
.encoding = "UTF-8"
|
|
bios.bootDelay = "5000"
|
|
config.version = "8"
|
|
displayName = "`/bin/date +"%y%m%d%H%M "`${DARWIN_RELEASE} / ${ARCH} / $PUREDARWIN_RELEASE"
|
|
ehci.present = "TRUE"
|
|
ethernet0.linkStatePropagation.enable = "FALSE"
|
|
ethernet0.present = "TRUE"
|
|
ethernet0.virtualDev = "e1000"
|
|
ethernet0.wakeOnPcktRcv = "FALSE"
|
|
floppy0.present = "FALSE"
|
|
ft.secondary0.enabled = "TRUE"
|
|
guestOS = "$T_GUESTOS"
|
|
ich7m.present = "TRUE"
|
|
ide0:0.deviceType = "cdrom-image"
|
|
ide0:0.fileName = "`basename $T_TARGET`"
|
|
ide0:0.present = "TRUE"
|
|
keyboardAndMouseProfile = "macProfile"
|
|
memsize = "128"
|
|
nvram = "$VOLNAME.nvram"
|
|
pciBridge0.present = "TRUE"
|
|
pciBridge4.functions = "8"
|
|
pciBridge4.present = "TRUE"
|
|
pciBridge4.virtualDev = "pcieRootPort"
|
|
pciBridge5.functions = "8"
|
|
pciBridge5.present = "TRUE"
|
|
pciBridge5.virtualDev = "pcieRootPort"
|
|
pciBridge6.functions = "8"
|
|
pciBridge6.present = "TRUE"
|
|
pciBridge6.virtualDev = "pcieRootPort"
|
|
pciBridge7.functions = "8"
|
|
pciBridge7.present = "TRUE"
|
|
pciBridge7.virtualDev = "pcieRootPort"
|
|
powerType.powerOff = "soft"
|
|
powerType.powerOn = "soft"
|
|
powerType.reset = "soft"
|
|
powerType.suspend = "soft"
|
|
printers.enabled = "FALSE"
|
|
roamingVM.exitBehavior = "go"
|
|
scsi0.present = "TRUE"
|
|
scsi0.virtualDev = "lsilogic"
|
|
scsi0:0.fileName = ""
|
|
scsi0:0.present = "FALSE"
|
|
serial0.fileType = "thinprint"
|
|
serial0.present = "FALSE"
|
|
smc.present = "TRUE"
|
|
tools.syncTime = "TRUE"
|
|
tools.upgrade.policy = "upgradeAtPowerCycle"
|
|
usb.present = "TRUE"
|
|
virtualHW.productCompatibility = "hosted"
|
|
virtualHW.version = "7"
|
|
vmci0.present = "TRUE"
|
|
EOOF
|
|
|
|
#Convert to VMware VMDK disk image for read-write support? (default: y)
|
|
if [ ! "$ADD_VMWARE_VMDK" = "n" ]; then
|
|
# Converting iso to VMware vmdk
|
|
echo "Converting image to VMware VMDK disk image, please wait..."
|
|
$QEMUIMG_BIN convert -O vmdk $TARGET/$T_TARGET $TARGET/$(basename $TARGET | awk -F '.' '{print $1".vmdk"}')
|
|
|
|
cat > $TARGET/$(basename $TARGET | awk -F '.' '{print $1".vmx"}') <<EOOF
|
|
.encoding = "UTF-8"
|
|
bios.bootDelay = "5000"
|
|
config.version = "8"
|
|
displayName = "`/bin/date +"%y%m%d%H%M "`${DARWIN_RELEASE} / ${ARCH} / $PUREDARWIN_RELEASE"
|
|
ehci.present = "TRUE"
|
|
ethernet0.linkStatePropagation.enable = "FALSE"
|
|
ethernet0.present = "TRUE"
|
|
ethernet0.virtualDev = "e1000"
|
|
ethernet0.wakeOnPcktRcv = "FALSE"
|
|
floppy0.present = "FALSE"
|
|
ft.secondary0.enabled = "TRUE"
|
|
guestOS = "$T_GUESTOS"
|
|
ich7m.present = "TRUE"
|
|
ide0:0.fileName = "$(basename $T_TARGET | awk -F '.' '{print $1".vmdk"}')"
|
|
ide0:0.present = "TRUE"
|
|
ide0:0.redo = ""
|
|
ide1:0.autodetect = "TRUE"
|
|
ide1:0.deviceType = "cdrom-image"
|
|
ide1:0.fileName = "`basename $T_TARGET`"
|
|
ide1:0.present = "TRUE"
|
|
keyboardAndMouseProfile = "macProfile"
|
|
memsize = "128"
|
|
nvram = "$VOLNAME.nvram"
|
|
pciBridge0.present = "TRUE"
|
|
pciBridge4.functions = "8"
|
|
pciBridge4.present = "TRUE"
|
|
pciBridge4.virtualDev = "pcieRootPort"
|
|
pciBridge5.functions = "8"
|
|
pciBridge5.present = "TRUE"
|
|
pciBridge5.virtualDev = "pcieRootPort"
|
|
pciBridge6.functions = "8"
|
|
pciBridge6.present = "TRUE"
|
|
pciBridge6.virtualDev = "pcieRootPort"
|
|
pciBridge7.functions = "8"
|
|
pciBridge7.present = "TRUE"
|
|
pciBridge7.virtualDev = "pcieRootPort"
|
|
powerType.powerOff = "soft"
|
|
powerType.powerOn = "soft"
|
|
powerType.reset = "soft"
|
|
powerType.suspend = "soft"
|
|
printers.enabled = "FALSE"
|
|
roamingVM.exitBehavior = "go"
|
|
scsi0.present = "TRUE"
|
|
scsi0.virtualDev = "lsilogic"
|
|
scsi0:0.fileName = ""
|
|
scsi0:0.present = "FALSE"
|
|
serial0.fileType = "thinprint"
|
|
serial0.present = "FALSE"
|
|
smc.present = "TRUE"
|
|
tools.syncTime = "TRUE"
|
|
tools.upgrade.policy = "upgradeAtPowerCycle"
|
|
usb.generic.autoconnect = "FALSE"
|
|
usb.present = "TRUE"
|
|
virtualHW.productCompatibility = "hosted"
|
|
virtualHW.version = "7"
|
|
vmci0.present = "TRUE"
|
|
EOOF
|
|
fi
|
|
|
|
|
|
|
|
# Add an (additional) IDE disk device to the .vmwarevm? (default: n)
|
|
if [ "$ADD_VMWARE_IDE_DRIVE" = "y" ]; then
|
|
# Creating a (second) VMware4 disk image via qemu-img
|
|
# SIZE at least equal to "the parent" one (most of the time, the bootstrap one)
|
|
# FIXME add check on the size
|
|
qemu-img create -f vmdk $TARGET/second.vmdk 2048M
|
|
|
|
# Reflect the disk image in the .vmx file
|
|
cat >> $TARGET/$(basename $TARGET | awk -F '.' '{print $1".vmx"}') <<EOOF
|
|
ide0:1.present = "TRUE"
|
|
ide0:1.fileName = "second.vmdk"
|
|
ide0:1.redo = ""
|
|
EOOF
|
|
fi
|
|
|
|
;;
|
|
|
|
###############################################################
|
|
# VAX COFF executable (.dmg)
|
|
###############################################################
|
|
dmg)
|
|
;;
|
|
|
|
###############################################################
|
|
# Default (.*)
|
|
###############################################################
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# FIXME too permissive
|
|
# Since the installation is done at root over a normal user,
|
|
# in finder the image is open in read-only after clickclick.. owner/perms
|
|
# need to be changed for rw (or the image needs to be mount as root)
|
|
chmod -R 777 $TARGET
|
|
chown -R 501:staff $TARGET
|
|
|
|
echo "Installation on ${TARGET} complete."
|
|
else
|
|
# Force completion of pending disk writes
|
|
/bin/sync
|
|
|
|
# Umounting the volume
|
|
echo "Unmounting..."
|
|
umount -f ${MOUNT}
|
|
|
|
echo "Installation on ${TARGET} complete. "
|
|
fi
|