ae115bc77f6fcde83175c75b4206dc2e50747966mrj#!/bin/ksh -p
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# CDDL HEADER START
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# The contents of this file are subject to the terms of the
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# Common Development and Distribution License (the "License").
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# You may not use this file except in compliance with the License.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# or http://www.opensolaris.org/os/licensing.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# See the License for the specific language governing permissions
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# and limitations under the License.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# When distributing Covered Code, include this CDDL HEADER in each
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# If applicable, add the following below this CDDL HEADER, with the
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# fields enclosed by brackets "[]" replaced with your own identifying
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# information: Portions Copyright [yyyy] [name of copyright owner]
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# CDDL HEADER END
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# Use is subject to license terms.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjPATH="/usr/bin:/usr/sbin:${PATH}"; export PATH
ae115bc77f6fcde83175c75b4206dc2e50747966mrjALT_ROOT=
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjwhile getopts R: OPT 2>/dev/null
ae115bc77f6fcde83175c75b4206dc2e50747966mrjdo
ae115bc77f6fcde83175c75b4206dc2e50747966mrj case $OPT in
ae115bc77f6fcde83175c75b4206dc2e50747966mrj R) ALT_ROOT="$OPTARG"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ;;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ?) echo "Usage: ${0##*/}: [-R \<root\>]"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ;;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj esac
ae115bc77f6fcde83175c75b4206dc2e50747966mrjdone
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjARCH=`uname -p`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjis_pcfs_boot=yes
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gwis_zfs_boot=no
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjcheck_pcfs_boot()
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj bootdev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | grep pcfs \
ae115bc77f6fcde83175c75b4206dc2e50747966mrj | grep "[ ]/stubboot[ ]" | nawk '{print $1}'`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [ X"$bootdev" = "X" ]; then
ae115bc77f6fcde83175c75b4206dc2e50747966mrj is_pcfs_boot=no
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gwcheck_zfs_boot()
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw{
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw if [ -f "$ALT_ROOT"/etc/lu/GRUB_slice ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw dev=`grep '^PHYS_SLICE=' "$ALT_ROOT"/etc/lu/GRUB_slice |
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cut -d= -f2`
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw if [ "`fstyp $dev`" = "zfs" ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw is_zfs_boot=yes
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw else
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw rootfstype=`df -n ${ALT_ROOT:-/} | awk '{print $3}'`
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw if [ "$rootfstype" = "zfs" ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw is_zfs_boot=yes
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw}
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# Detect SVM root and return the list of raw devices under the mirror
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrjget_rootdev_list()
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [ -f "$ALT_ROOT"/etc/lu/GRUB_slice ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw dev=`grep '^PHYS_SLICE' "$ALT_ROOT"/etc/lu/GRUB_slice |
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cut -d= -f2`
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw if [ "$is_zfs_boot" = "yes" ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fstyp -a "$dev" | grep 'path: ' | grep -v phys_path: |
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw cut -d"'" -f2 | sed 's+/dsk/+/rdsk/+'
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw else
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw echo "$dev"
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw return
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw elif [ "$is_zfs_boot" = "yes" ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw rootpool=`df -k ${ALT_ROOT:-/} | tail +2 | cut -d/ -f1`
b5b76fec872120fb1395471edcf51f378acd7e83George Wilson rootdevlist=`LC_ALL=C zpool iostat -v "$rootpool" | tail +5 |
b5b76fec872120fb1395471edcf51f378acd7e83George Wilson egrep -v "mirror|spare|replacing" |
b5b76fec872120fb1395471edcf51f378acd7e83George Wilson sed -n -e '/--/q' -e p | awk '{print $1}'`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj else
ae115bc77f6fcde83175c75b4206dc2e50747966mrj metadev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | \
ae115bc77f6fcde83175c75b4206dc2e50747966mrj grep "[ ]/[ ]" | nawk '{print $2}'`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [[ $metadev = /dev/rdsk/* ]]; then
a98d0b109433aef9e2ce624376119405d33175e1Jerry Gilliam rootdevlist=`basename "$metadev"`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj elif [[ $metadev = /dev/md/rdsk/* ]]; then
a98d0b109433aef9e2ce624376119405d33175e1Jerry Gilliam metavol=`basename "$metadev"`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj rootdevlist=`metastat -p $metavol |\
ae115bc77f6fcde83175c75b4206dc2e50747966mrj grep -v "^$metavol[ ]" | nawk '{print $4}'`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw for rootdev in $rootdevlist
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw do
a98d0b109433aef9e2ce624376119405d33175e1Jerry Gilliam echo /dev/rdsk/`basename $rootdev`
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw done
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrj# multiboot: install grub on the boot slice
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#
ae115bc77f6fcde83175c75b4206dc2e50747966mrjinstall_grub()
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj # Stage 2 blocks must remain untouched
ae115bc77f6fcde83175c75b4206dc2e50747966mrj STAGE1="$ALT_ROOT"/boot/grub/stage1
ae115bc77f6fcde83175c75b4206dc2e50747966mrj STAGE2="$ALT_ROOT"/boot/grub/stage2
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [ $is_pcfs_boot = yes ]; then
ae115bc77f6fcde83175c75b4206dc2e50747966mrj #
ae115bc77f6fcde83175c75b4206dc2e50747966mrj # Note: /stubboot/boot/grub/stage2 must stay untouched.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj #
ae115bc77f6fcde83175c75b4206dc2e50747966mrj mkdir -p "$ALT_ROOT"/stubboot/boot/grub
ae115bc77f6fcde83175c75b4206dc2e50747966mrj cp "$ALT_ROOT"/boot/grub/menu.lst "$ALT_ROOT"/stubboot/boot/grub
ae115bc77f6fcde83175c75b4206dc2e50747966mrj bootdev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | grep pcfs | \
ae115bc77f6fcde83175c75b4206dc2e50747966mrj grep "[ ]/stubboot[ ]" | nawk '{print $1}'`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj rpcfsdev=`echo "$bootdev" | sed -e "s/dev\/dsk/dev\/rdsk/"`
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [ X"$rpcfsdev" != X ]; then
ae115bc77f6fcde83175c75b4206dc2e50747966mrj print "Installing grub on $rpcfsdev"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj "$ALT_ROOT"/sbin/installgrub $STAGE1 $STAGE2 $rpcfsdev
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw grubdevlist=`get_rootdev_list`
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw zfsarg=""
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw if [ "$is_zfs_boot" = "yes" ]; then
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw zfsarg="-Z"
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw fi
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw for rootdev in $grubdevlist
ae115bc77f6fcde83175c75b4206dc2e50747966mrj do
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if [ X"$rpcfsdev" != X ]; then
ae115bc77f6fcde83175c75b4206dc2e50747966mrj echo "create GRUB menu in "$ALT_ROOT"/stubboot"
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw "$ALT_ROOT"/sbin/bootadm update-menu $zfsarg\
ae115bc77f6fcde83175c75b4206dc2e50747966mrj -R "$ALT_ROOT"/stubboot -o $rootdev,"$ALT_ROOT"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj else
ae115bc77f6fcde83175c75b4206dc2e50747966mrj echo "Creating GRUB menu in ${ALT_ROOT:-/}"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj $ALT_ROOT/sbin/bootadm update-menu -R ${ALT_ROOT:-/} \
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw $zfsarg -o $rootdev
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj print "Installing grub on $rootdev"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj "$ALT_ROOT"/sbin/installgrub $STAGE1 $STAGE2 $rootdev
ae115bc77f6fcde83175c75b4206dc2e50747966mrj done
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjif [ -f "$ALT_ROOT"/platform/i86pc/multiboot -a "$ARCH" = i386 ] ; then
ae115bc77f6fcde83175c75b4206dc2e50747966mrj check_pcfs_boot
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw check_zfs_boot
ae115bc77f6fcde83175c75b4206dc2e50747966mrj install_grub
ae115bc77f6fcde83175c75b4206dc2e50747966mrjfi
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjexit 0