update_grub.ksh revision e7cbe64f7a72dae5cb44f100db60ca88f3313c65
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#!/bin/ksh -p
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# CDDL HEADER START
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
2f523b64504a53ab2ee3baf2cc417a936a07a13fjroberts# The contents of this file are subject to the terms of the
2f523b64504a53ab2ee3baf2cc417a936a07a13fjroberts# Common Development and Distribution License (the "License").
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# You may not use this file except in compliance with the License.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# or http://www.opensolaris.org/os/licensing.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# See the License for the specific language governing permissions
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# and limitations under the License.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# When distributing Covered Code, include this CDDL HEADER in each
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# If applicable, add the following below this CDDL HEADER, with the
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# fields enclosed by brackets "[]" replaced with your own identifying
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# information: Portions Copyright [yyyy] [name of copyright owner]
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# CDDL HEADER END
2f523b64504a53ab2ee3baf2cc417a936a07a13fjroberts#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
cfb7311ca709ca6f4d930977c7498455556b5312Louis Tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# Use is subject to license terms.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# ident "%Z%%M% %I% %E% SMI"
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienPATH="/usr/bin:/usr/sbin:${PATH}"; export PATH
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienALT_ROOT=
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienwhile getopts R: OPT 2>/dev/null
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiendo
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien case $OPT in
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien R) ALT_ROOT="$OPTARG"
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien ;;
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien ?) echo "Usage: ${0##*/}: [-R \<root\>]"
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien ;;
d4ac42a1cd3016618a9ba0330862d410f0058f89Trang Do esac
31e37bb439502e3f7c4c0a9a77d655ea5d56887avndone
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienARCH=`uname -p`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienis_pcfs_boot=yes
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienis_zfs_boot=no
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
6dfee4834394825da35b977ca71cdc965bc7b6a4tsiencheck_pcfs_boot()
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien{
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien bootdev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | grep pcfs \
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien | grep "[ ]/stubboot[ ]" | nawk '{print $1}'`
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien if [ X"$bootdev" = "X" ]; then
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien is_pcfs_boot=no
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien fi
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien}
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsiencheck_zfs_boot()
54d9a2593fde02a00a43f74dbbc438402369fd6ajc{
54d9a2593fde02a00a43f74dbbc438402369fd6ajc if [ -f "$ALT_ROOT"/etc/lu/GRUB_slice ]; then
54d9a2593fde02a00a43f74dbbc438402369fd6ajc dev=`grep '^PHYS_SLICE=' "$ALT_ROOT"/etc/lu/GRUB_slice |
54d9a2593fde02a00a43f74dbbc438402369fd6ajc cut -d= -f2`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [ "`fstyp $dev`" = "zfs" ]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien is_zfs_boot=yes
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien else
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien rootfstype=`df -n ${ALT_ROOT:-/} | awk '{print $3}'`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [ "$rootfstype" = "zfs" ]; then
2f523b64504a53ab2ee3baf2cc417a936a07a13fjroberts is_zfs_boot=yes
2f523b64504a53ab2ee3baf2cc417a936a07a13fjroberts fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# Detect SVM root and return the list of raw devices under the mirror
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsienget_rootdev_list()
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [ -f "$ALT_ROOT"/etc/lu/GRUB_slice ]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien dev=`grep '^PHYS_SLICE' "$ALT_ROOT"/etc/lu/GRUB_slice |
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien cut -d= -f2`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [ "$is_zfs_boot" = "yes" ]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fstyp -a "$dev" | grep 'path: ' | grep -v phys_path: |
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien cut -d"'" -f2 | sed 's+/dsk/+/rdsk/+'
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien else
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien echo "$dev"
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien return
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien elif [ "$is_zfs_boot" = "yes" ]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien rootpool=`df -k ${ALT_ROOT:-/} | tail +2 | cut -d/ -f1`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien rootdevlist=`zpool iostat -v "$rootpool" | tail +5 |
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien grep -v mirror | sed -n -e '/--/q' -e p | awk '{print $1}'`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien else
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien metadev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | \
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien grep "[ ]/[ ]" | nawk '{print $2}'`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [[ $metadev = /dev/rdsk/* ]]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien rootdevlist=`echo "$metadev" | sed -e "s#/dev/rdsk/##"`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien elif [[ $metadev = /dev/md/rdsk/* ]]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien metavol=`echo "$metadev" | sed -e "s#/dev/md/rdsk/##"`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien rootdevlist=`metastat -p $metavol |\
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien grep -v "^$metavol[ ]" | nawk '{print $4}'`
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien fi
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien for rootdev in $rootdevlist
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien do
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien echo /dev/rdsk/$rootdev
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien done
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien}
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien# multiboot: install grub on the boot slice
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien#
822fb41d6f36e90a1ec836b32f869e1235e7da40tsieninstall_grub()
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien{
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien # Stage 2 blocks must remain untouched
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien STAGE1="$ALT_ROOT"/boot/grub/stage1
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien STAGE2="$ALT_ROOT"/boot/grub/stage2
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien if [ $is_pcfs_boot = yes ]; then
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien #
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien # Note: /stubboot/boot/grub/stage2 must stay untouched.
822fb41d6f36e90a1ec836b32f869e1235e7da40tsien #
bddc11567b8dc8b10ae555463608aad4f0c6cb44db mkdir -p "$ALT_ROOT"/stubboot/boot/grub
bddc11567b8dc8b10ae555463608aad4f0c6cb44db cp "$ALT_ROOT"/boot/grub/menu.lst "$ALT_ROOT"/stubboot/boot/grub
bddc11567b8dc8b10ae555463608aad4f0c6cb44db bootdev=`grep -v "^#" "$ALT_ROOT"/etc/vfstab | grep pcfs | \
bddc11567b8dc8b10ae555463608aad4f0c6cb44db grep "[ ]/stubboot[ ]" | nawk '{print $1}'`
bddc11567b8dc8b10ae555463608aad4f0c6cb44db rpcfsdev=`echo "$bootdev" | sed -e "s/dev\/dsk/dev\/rdsk/"`
bddc11567b8dc8b10ae555463608aad4f0c6cb44db if [ X"$rpcfsdev" != X ]; then
bddc11567b8dc8b10ae555463608aad4f0c6cb44db print "Installing grub on $rpcfsdev"
bddc11567b8dc8b10ae555463608aad4f0c6cb44db "$ALT_ROOT"/sbin/installgrub $STAGE1 $STAGE2 $rpcfsdev
bddc11567b8dc8b10ae555463608aad4f0c6cb44db fi
bddc11567b8dc8b10ae555463608aad4f0c6cb44db fi
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien grubdevlist=`get_rootdev_list`
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien zfsarg=""
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien if [ "$is_zfs_boot" = "yes" ]; then
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien zfsarg="-Z"
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien fi
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien for rootdev in $grubdevlist
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien do
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien if [ X"$rpcfsdev" != X ]; then
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien echo "create GRUB menu in "$ALT_ROOT"/stubboot"
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien "$ALT_ROOT"/sbin/bootadm update-menu $zfsarg\
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien -R "$ALT_ROOT"/stubboot -o $rootdev,"$ALT_ROOT"
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien else
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien echo "Creating GRUB menu in ${ALT_ROOT:-/}"
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien $ALT_ROOT/sbin/bootadm update-menu -R ${ALT_ROOT:-/} \
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien $zfsarg -o $rootdev
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien fi
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien print "Installing grub on $rootdev"
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien "$ALT_ROOT"/sbin/installgrub $STAGE1 $STAGE2 $rootdev
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien done
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien}
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien
6dfee4834394825da35b977ca71cdc965bc7b6a4tsienif [ -f "$ALT_ROOT"/platform/i86pc/multiboot -a "$ARCH" = i386 ] ; then
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien check_pcfs_boot
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien check_zfs_boot
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien install_grub
6dfee4834394825da35b977ca71cdc965bc7b6a4tsienfi
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien
6dfee4834394825da35b977ca71cdc965bc7b6a4tsienexit 0
6dfee4834394825da35b977ca71cdc965bc7b6a4tsien