create_ramdisk.ksh revision ece420eda27a88765390f9f110d824fd154a2e94
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
# ident "%Z%%M% %I% %E% SMI"
ERROR=0
#
# Parse options
#
while [ "$1" != "" ]
do
case $1 in
-R) shift
ALT_ROOT="$1"
if [ "$ALT_ROOT" != "/" ]; then
echo "Creating ram disk for $ALT_ROOT"
fi
;;
;;
exit
;;
esac
shift
done
fi
#
# mkisofs on s8 doesn't support functionality used by GRUB boot.
# Use ufs format for boot archive instead.
#
if [ "$release" = "5.8" ]; then
fi
if [ $# -eq 1 ]; then
ALT_ROOT="$1"
echo "Creating ram disk for $ALT_ROOT"
fi
# Shouldn't happen
echo "Warning: $rundir/symdef not present."
echo "Creating single archive at $ALT_ROOT/platform/i86pc/boot_archive"
else
fi
function cleanup
{
}
function getsize
{
# Estimate image size and add %10 overhead for ufs stuff.
# Note, we can't use du here in case we're on a filesystem, e.g. zfs,
# in which the disk usage is less than the sum of the file sizes.
# The nawk code
#
# {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
#
# next multiple of 1024. This mimics the behavior of ufs especially
# with directories. This results in a total size that's slightly
# bigger than if du was called on a ufs directory.
{t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
END {print int(t * 1.10 / 1024)}')
}
#
# Copies all desired files to a target directory.
#
# This function depends on several variables that must be set before calling:
# $ALT_ROOT - the target directory
# $filelist - the list of files and directories to search
# $NO_AMD64 - the find(1) expression to exclude files, if desired
# $which - One of "both", "32-bit", or "64-bit"
# $compress - whether or not the files in the archives should be compressed
# $rdmnt - the target directory
#
function find_and_copy
{
cd "/$ALT_ROOT"
#
# If compress is set, the files are gzip'd and put in the correct
# location in the loop. Nothing is printed, so the pipe and cpio
# at the end is a nop.
#
# If compress is not set, the file names are printed, which causes
# the cpio at the end to do the copy.
#
do
dir="${path%/*}"
else
print "$path"
fi
else
then
dir="${path%/*}"
else
print "$path"
fi
fi
fi
}
#
# The first argument can be:
#
# "both" - create an archive with both 32-bit and 64-bit binaries
# "32-bit" - create an archive with only 32-bit binaries
# "64-bit" - create an archive with only 64-bit binaries
#
function create_ufs
{
which=$1
archive=$2
lofidev=$3
# should we exclude amd64 binaries?
NO_AMD64="-type d -name amd64 -prune -o"
NO_AMD64=""
else
NO_AMD64=""
fi
# do the actual copy
#
# on systems that have gzip. Then run gzip out of the patch to
# pick it up from bfubin or something like that if needed.
#
# If compress is set, the individual files in the archive are
# compressed, and the final compression will accomplish very
# little. To save time, we skip the gzip in this case.
#
else
fi
}
#
# The first argument can be:
#
# "both" - create an archive with both 32-bit and 64-bit binaries
# "32-bit" - create an archive with only 32-bit binaries
# "64-bit" - create an archive with only 64-bit binaries
#
function create_isofs
{
which=$1
archive=$2
# should we exclude amd64 binaries?
NO_AMD64="-type d -name amd64 -prune -o"
NO_AMD64=""
else
NO_AMD64=""
fi
# create image directory seed with graft points
isocmd="mkisofs -quiet -graft-points -dlrDJN -relaxed-filenames"
#
# on systems that have gzip. Then run gzip out of the patch to
# pick it up from bfubin or something like that if needed.
#
# If compress is set, the individual files in the archive are
# compressed, and the final compression will accomplish very
# little. To save time, we skip the gzip in this case.
#
gzip > "${archive}-new"
else
fi
if [ $? -eq 0 ]; then
rm -f "${archive}-new"
fi
fi
}
function create_archive
{
which=$1
archive=$2
lofidev=$3
create_ufs "$which" "$archive" "$lofidev"
else
fi
# sanity check the archive before moving it into place
#
then
#
# 'file' will report "English text" for uncompressed
# boot_archives. Checking for that doesn't seem stable,
# so we just check that the file exists.
#
else
#
# the file type check also establishes that the
# file exists at all
#
fi
if [ $? = 1 ] && [ -x /usr/bin/gzip ] || [ $ARCHIVE_SIZE -lt 5000 ]
then
#
# Two of these functions may be run in parallel. We
# need to allow the other to clean up, so we can't
# exit immediately. Instead, we set a flag.
#
echo "update of $archive failed"
ERROR=1
else
fi
}
#
# get filelist
#
if [ ! -f "$ALT_ROOT/boot/solaris/filelist.ramdisk" ] &&
[ ! -f "$ALT_ROOT/etc/boot/solaris/filelist.ramdisk" ]
then
print -u2 "Can't find filelist.ramdisk"
exit 1
fi
# calculate image size
# We do two mkfile's of total_size, so double the space
# check to see if there is sufficient space in tmpfs
#
# assumes we have enough scratch space on $ALT_ROOT
fi
fi
lofidev32=""
lofidev64=""
# make directory for temp files safely
# Clean up upon exit.
trap 'cleanup' EXIT
#
# We can't run lofiadm commands in parallel, so we have to do
# them here.
#
if [ "$format" = "ufs" ]; then
fi
wait
if [ "$format" = "ufs" ]; then
fi
else
if [ "$format" = "ufs" ]; then
fi
fi
if [ $ERROR = 1 ]; then
exit 1
fi
#
# For the diskless case, hardlink archive to /boot to make it
# visible via tftp. /boot is lofs mounted under /tftpboot/<hostname>.
# NOTE: this script must work on both client and server.
#
if [ $? = 0 ]; then
fi