AutoCasper NBI not booting Diskless?

bwiessner
Contributor II

So I created a new Netboot image with AutoCasperNBI with a 10.10.5 base with 9.81 casper imaging.

I made sure to set modified rc.netboot file was checked.

Booted to it and did a mount in terminal and it shows - /dev/disk0s2 on /private/var/netboot

Any ideas would be great - could love not having to make a ram disk.

1 ACCEPTED SOLUTION

bentoms
Release Candidate Programs Tester

@bwiessne well... if you searched here for "JDS AFP" you'd find a list like: this...

There are mentions in there for "Adding an AFP Share to a JDS Instance Installed on Linux"

View solution in original post

11 REPLIES 11

bwiessner
Contributor II

Here is a copy of my current rc.netboot file -

#!/bin/sh
##
# Copyright 2002-2009 Apple Inc.
#
# This script configures NetBoot
##

. /etc/rc.common

#
# This script has been modified to support diskless or RAM disk netboot
#
# Revised:      July 14th, 2011
# Revised by:   Richard Glaser
#
# For more information or give feedback or file bugs...
# See web site...
#
#    http://www.macos.utah.edu/documentation/administration/setup_netboot_service_on_mac_os_x_10.6.x_client.html
#

# 
# Define: NETBOOT_SHADOW
#
# Purpose:
#   To change the behavior of the system when choosing a netboot shadow
#   to use.
#
# Values:
#   -NETWORK-       Try to use the network for the shadow file, if
#           that fails, use the local drive
#   -NETWORK_ONLY-  Only use the network, fail if not available
#   -LOCAL-     Use the local drive for the shadow file, if that
#           fails, use the network
#   -LOCAL_ONLY-    Only use the local drive for the shadow, fail if
#           not available

NETBOOT_MOUNT=/var/netboot

# Change to "-LOCAL_ONLY-" to use RAM Disk instead of network
NETBOOT_SHADOW=-LOCAL_ONLY-

# NETBOOT_SHADOW=${NETBOOT_SHADOW:-NETWORK-}
# There is a bug in the default variable assignment, it loses the the beginning "-"
# So, it never correctly assigns the variable or branch in the case statement in the 
# do_start() sub-routine and always gets assigned to the "* )" branch.

Failed()
{
    echo rc.netboot: $1
    echo rc.netboot: $1 > /dev/console
    sleep 5
    exit 1
}

common_start()
{
    netboot_dir=$1
    netboot_shadow=$2
    if [ "${netboot_dir}" = "" ] ; then
    Failed "netboot_dir is empty"
    fi
    if [ "${netboot_shadow}" = "" ] ; then
    Failed "netboot_shadow is empty"
    fi
    netboot_shadow="${netboot_dir}/${netboot_shadow}"
    if ! mkdir -p "${netboot_dir}" ; then
    Failed "create ${netboot_dir} failed"
    fi
    chmod 700 "${netboot_dir}"
    mount -u -o ro /
    root_device=$(mount | sed -n 's:/dev/(.*) on / .*:1:p')
    case "${root_device}" in
    vn*)
        if ! touch "${netboot_shadow}" ; then
        Failed "create ${netboot_shadow} failed"
        fi
        chmod 600 "${netboot_shadow}"
            if ! /usr/libexec/vndevice shadow "/dev/r${root_device}" "${netboot_shadow}" ; then
        Failed "vndevice shadow failed"
        fi
        ;;
    "")
        Failed "root device unknown"
        ;;
    *)
        if ! touch "${netboot_shadow}" ; then
        Failed "failed to create shadow ${netboot_shadow}"
        fi
        chmod 600 "${netboot_shadow}"
        if ! /usr/bin/nbdst -recycle "${root_device}" "${netboot_shadow}" ; then
        Failed "nbdst failed" 
        fi
        ;;
    esac
}

local_mount()
{
#    tries=0
#    limit=11
#    while [ $tries -lt $limit ]; do
#   tries=$(( tries + 1 ))
#   volinfo=`autodiskmount -F 2>/dev/null`
#   if [ $? -ne 0 ]; then
#       if [ $tries -lt $limit ]; then
#       echo "Waiting for local drives..."
#       echo "Waiting for local drives (retry ${tries}/$(( limit - 1 )))..." > /dev/console
#       sleep 5
#       else
#       echo "autodiskmount -F found no local drives"
#       return 1
#       fi
#   else
#       tries=$limit
#   fi
#    done
#    set ${volinfo}
#    devname=$1
#    fstype=$2
#
#    mount -t "${fstype}" -o nosuid,nodev "/dev/${devname}" "${NETBOOT_MOUNT}" 2>&1
#    if [ $? -ne 0 ]; then
#   echo "mount of ${devname} failed"
#   return 1
#    fi
    volinfo=`autodiskmount -F 2>/dev/null`
    RAMDisk "${NETBOOT_MOUNT}"
    common_start "${NETBOOT_MOUNT}/.com.apple.NetBootX" shadowfile
    return 0
}

#
# Create a RAM disk with same perms as mountpoint
#

RAMDisk()
{
  mntpt=$1
  rdsize=2097152 #1GB ((1*1024^3)/512)=2097152, 2GB=((2*1024^3)/512)=4194304
  echo "Creating RAM Disk for $mntpt"
  dev=`hdik -drivekey system-image=yes -nomount ram://$rdsize`
  if [ $? -eq 0 ] ; then
    newfs_hfs $dev
    # save & restore fs permissions covered by the mount
    eval `/usr/bin/stat -s $mntpt`
    mount -t hfs -o union -o nobrowse $dev $mntpt
    chown $st_uid:$st_gid $mntpt
    chmod $st_mode $mntpt
    chflags hidden $mntpt
  fi
}

network_mount()
{
    mount_from=$(ipconfig netbootoption shadow_mount_path 2>&1)
    if [ $? -ne 0 ]; then
    echo "no network shadow mount path available"
    return 1
    fi
    shadow_path=$(ipconfig netbootoption shadow_file_path 2>&1)
    if [ $? -ne 0 ]; then
    echo "no network shadow file path available"
    return 1
    fi
    case "${mount_from}" in
    afp:*)
        fstype=afp
        kextutil -v 0 /System/Library/Filesystems/AppleShare/asp_tcp.kext
        kextutil -v 0 /System/Library/Filesystems/AppleShare/afpfs.kext
        ;;
    nfs:*) fstype=nfs;;
    *) echo "unknown network filesystem mount from ${mount_from}"
       return 1
       ;;
    esac
    mount -t "${fstype}" -o nobrowse "${mount_from}" "${NETBOOT_MOUNT}"
    if [ $? -ne 0 ]; then
    echo "mount -t ${fstype} -o nobrowse ${mount_from} ${NETBOOT_MOUNT} failed"
    return 1
    fi
    common_start "${NETBOOT_MOUNT}" "${shadow_path}"
    return 0
}

do_start()
{
    case "${NETBOOT_SHADOW}" in
    -LOCAL_ONLY- )
        err=$(local_mount)
        if [ $? -ne 0 ]; then
            Failed "${err}"
        fi
        ;;
    -LOCAL- )
        err=$(local_mount)
        if [ $? -ne 0 ]; then
            err=$(network_mount)
            if [ $? -ne 0 ]; then
            Failed "Could not find a local or network drive"
            fi
            fi
        ;;
    -NETWORK_ONLY-) 
        err=$(network_mount)
        if [ $? -ne 0 ]; then
            Failed "${err}"
        fi
        ;;

    * )
        err=$(network_mount)
        if [ $? -ne 0 ]; then
            err=$(local_mount)
            if [ $? -ne 0 ]; then
            Failed "Could not find a network or local drive"
            fi
        fi
        ;;
    esac

}

do_init()
{
    # attach the shadow file to the root disk image
    do_start

    # make sure the root filesystem is clean
    fsck -p || fsck -fy || Failed "Could not clean root filesystem"

    # make it writable
    mount -uw /

    # adjust /private/var/vm to point to the writable area (if not diskless)
    swapdir=/private/var/vm
    mounted_from=$(mount | sed -n 's:(.*) on .*/var/netboot.*:1:p')
    case "${mounted_from}" in
    /dev/*)
        netboot_dir="${NETBOOT_MOUNT}/.com.apple.NetBootX"
        if [ -d "${netboot_dir}" ]; then
            rm -rf "${swapdir}"
            ln -s "${netboot_dir}" "${swapdir}"
        fi
        ;;
    *)
    ;;
    esac

    # set the ComputerName based on what the NetBoot server told us it was
    machine_name=$(ipconfig netbootoption machine_name 2>&1)
    if [ $? -ne 0 ]; then
    echo "no machine name option available"
    else
    echo "Setting ComputerName to ${machine_name}"
    scutil --set ComputerName "${machine_name}"
    fi
}


if [ $# -lt 1 ] ; then
    exit 0
fi

command=$1

shift

case "${command}" in
    init)
    do_init $@
    ;;
esac 

##
# Exit
##
exit 0

bentoms
Release Candidate Programs Tester

@bwiessne This is the rc.netboot AutoCasperNBI uses.

It creates a RAM disk when using the rc.netboot option... else you can not check it & have it use a shadow file.

What is it you're looking for?

bwiessner
Contributor II

@bentoms That is the rc.netboot that is in my current netboot image but its still not booting diskless.

Casper imaging does block copy - eases the drive then installs the OS??

nitializing Imaging Process...
Mounting CasperJDS-XXXXXXXXX..
Mounting https://CasperJDS-XXXXX/CasperShareDAV/...
Preparing disk for block copy...
Performing Block Copy of osx_10.10.5_10.19.15_test.dmg...
Cleaning up after block copy...
Erasing Macintosh HD...
Installing osx_10.10.5_10.19.15.dmg...
Setting computer name to "C02N94P0G3QH"...
Creating /private/etc/jamf.conf...
Creating /usr/local/bin/jamf...
Creating jamfHelper...
Ensuring Apple's Setup Assistant does not appear...
Creating First Run Enroll Script...
Adding line for binding XXXXXX AD Bind...
Creating First Run Post Install Script...
Adding line to Fix ByHost Files...
Ensuring system files are hidden...
Unmounting Distribution Point...
Blessing System...

bentoms
Release Candidate Programs Tester

@bwiessne Ahh JDS, can you try this?

bwiessner
Contributor II

@bentoms we are using an Ubuntu JDS - says the script is for OS X only

@Kelly.Conrad

bentoms
Release Candidate Programs Tester

@bwiessne well... if you searched here for "JDS AFP" you'd find a list like: this...

There are mentions in there for "Adding an AFP Share to a JDS Instance Installed on Linux"

bwiessner
Contributor II

Just found this - Yep. I will give it a try

https://jamfnation.jamfsoftware.com/discussion.html?id=10819#responseChild61698

bentoms
Release Candidate Programs Tester

@bwiessne the JDS needs an AFP share for imaging.

bwiessner
Contributor II

@bentoms Sorry to bug you. Any ideas?

Thanks in advance.

bentoms
Release Candidate Programs Tester

@bwiessne erm? About what? For JDS imaging AFP is needed. Those links I posted & the search show JAMFs method to create an AFP share.

Once done it should work.

bwiessner
Contributor II

@bentoms - No idea why it posted my original post twice? Was not me!