#!/bin/sh # # Copyright 1994, 1998 Patrick Volkerding, Moorhead, Minnesota USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. # #TMP=/var/log/setup/tmp TMP=/tmp devname_to_grubdevname() { # if $1 is /dev/sdc3, # $tmp_disk is /dev/sdc, $tmp_part is 3 tmp_disk=`echo $1 | sed 's%[0-9]*$%%'` tmp_part=`echo $1 | sed "s%$tmp_disk%%"` tmp_drive=`grep -v '^#' $device_map | grep $tmp_disk \ | sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'` echo $tmp_drive | sed "s%)$%,`expr $tmp_part - 1`)%" > $TMP/grubdrv$$ GRUB_DEV_NAME=`cat $TMP/grubdrv$$` rm -f $TMP/grubdrv$$ } # Figure out if we're installing from the hard drive if [ -r $TMP/SeTT_PX ]; then T_PX="`cat $TMP/SeTT_PX`" else if [ "$T_PX" = "" -a ! "$1" = "" ]; then T_PX=$1 else T_PX=/ fi fi if [ ! "`echo $T_PX|sed -e's/.*\/$//'`" = "" ] ; then T_PX="${T_PX}/" fi # Set color menu mode by default: COLOR=on # This is a different 'probe' than the function below. #if [ -x /sbin/probe ]; then # PROBE=/sbin/probe #else PROBE=/sbin/fdisk #fi # check device map for grub T_RX=/mnt if [ -f $TMP/SeTrootdev ] ; then ROOT_DEVICE=`cat $TMP/SeTrootdev` else ROOT_DEVICE="" fi if [ "$ROOT_DEVICE" = "" ] ; then T_RX=/ fi grub_shell=$T_RX/usr/sbin/grub device_map=$T_RX/boot/grub/device.map $grub_shell --batch --device-map=$device_map < $TMP/reply if [ $? = 1 -o $? = 255 ]; then exit fi TG="`cat $TMP/reply`" rm -r $TMP/reply if [ "$TG" == "Quit" ]; then exit fi if [ "$ROOT_DEVICE" = "" ] ; then dialog --title "rootパーティションの入力" --inputbox \ "カーネル起動直後に / にマウントするパーティションを \n\ 入力してください。 \n\ [例: /dev/hda2 ]\n" \ 11 62 2> $TMP/grubConfig_rootDev$$ ROOT_DEVICE=`cat $TMP/grubConfig_rootDev$$` rm -f $TMP/grubConfig_rootDev$$ fi if [ "$ROOT_DEVICE" = "" ] ; then echo "中止しました。" exit fi ROOT_DEVICE_NAME=`basename $ROOT_DEVICE` dialog --title "カーネルパラメータの入力" --inputbox \ "カーネル起動時に与えるカーネルパラメータをここで指定できます。\n\ 不要な場合は、単に Enter キーを押してください。\n\ [例: ide=nodma (IDE デバイスの DMA を OFF にする)] \n\ [例: max_scsi_luns=1 (検出を行う SCSI の LUN の最大数を指定)]\n\ [例: nosmp (SMP マシンをシングルプロセッサで動作)]\n" \ 13 72 2> $TMP/grubConfig_append$$ if [ $? = 1 -o $? = 255 ] ; then echo "中止しました。" rm -f $TMP/grubConfig_append$$ exit fi APPEND=`cat $TMP/grubConfig_append$$` rm -f $TMP/grubConfig_append$$ devname_to_grubdevname $ROOT_DEVICE GRUB_ROOT=$GRUB_DEV_NAME if [ "$TG" = "MBR" ]; then TARGET_LIST=`LANG=C $PROBE -l|grep "Disk /dev/"|sed -e 's/Disk //g'|tr -d ' '|tr ':' ' '` dialog --title "MBRにインストールするディスクの選択" \ --menu "どのディスクのMBRにGRUBをインストールしますか?\n" 21 60 13 \ $TARGET_LIST \ "Exit" "中止" 2> $TMP/reply$$ if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply$$ exit fi REPLY="`cat $TMP/reply$$`" rm -f $TMP/reply$$ if [ "$REPLY" = "Exit" ] ; then exit fi MBR_DEVICE=$REPLY MBR_DEVICE_NAME=`basename $MBR_DEVICE` devname_to_grubdevname "${MBR_DEVICE}1" GRUB_TARGET="`echo $GRUB_DEV_NAME|sed 's/,.*//'`)" #echo $GRUB_TARGET #GRUB_TARGET="(hd0)" elif [ "$TG" = "Root" ]; then GRUB_TARGET=$GRUB_ROOT elif [ "$TG" = "Floppy" ]; then GRUB_TARGET="(fd0)" fi #echo "tmp_disk = $tmp_disk" #echo "tmp_part = $tmp_part" #echo "tmp_drive = $tmp_drive" #echo "GRUB_TARGET= $GRUB_TARGET" cat << EOF > $T_RX/etc/grub.conf # GRUB configuration file # generated by 'grubconfig' # # Start GRUB global section default 0 timeout 30 fallback 1 splashimage $GRUB_ROOT/boot/grub/grubimg.xpm.gz title Plamo-4.0 (${ROOT_DEVICE_NAME}) root $GRUB_ROOT kernel $GRUB_ROOT/vmlinuz root=$ROOT_DEVICE ro $APPEND EOF # OK, now let's look for DOS partitions: ################ LANG=C $PROBE -l > $TMP/probe$$ DOSP=`cat $TMP/probe$$ | tr -d '*'|tr -s ' '|grep -e FAT|cut -f 1,6 -d ' '` DOSP_NUM=`cat $TMP/probe$$ | tr -d '*'|grep -e FAT|wc -l` NTP=`cat $TMP/probe$$ | tr -d '*'|tr -s ' '|grep -e NTFS|cut -f 1,6 -d ' '` NTP_NUM=`cat $TMP/probe$$ | tr -d '*'|grep -e NTFS|wc -l` rm -f $TMP/probe$$ WINP_NUM=`expr ${DOSP_NUM} + ${NTP_NUM}` ################ if [ ! $WINP_NUM = 0 ] ; then dialog --title "Windowsパーティションの選択" \ --menu "Windows がインストールされている\n\ パーティションは?" 21 60 13 \ $DOSP $NTP \ "NoWindows" "Windowsはインストールされていない" 2> $TMP/reply$$ if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply$$ exit fi REPLY="`cat $TMP/reply$$`" rm -f $TMP/reply$$ if [ "$REPLY" = "NoWindows" ] ; then WINP_NUM=0 else PARTITION_NT=$REPLY ################ if [ "`echo $DOSP|grep \"$PARTITION_NT\"`" = "" ] ; then FS_TYPE=ntfs else FS_TYPE=vfat fi ################ if [ ! "$PARTITION_NT" = "" ]; then devname_to_grubdevname $PARTITION_NT WIN_ROOT=$GRUB_DEV_NAME PARTITION_NT_NAME=`basename $PARTITION_NT` cat << EOF >> $T_PX/etc/grub.conf # DOS bootable partition config begins title = Windows (${PARTITION_NT_NAME}) rootnoverify $WIN_ROOT makeactive chainloader +1 EOF fi fi fi ################ if [ "$TG" = "MBR" ]; then MBR_BACKUP_FILE=${T_PX}/boot/${MBR_DEVICE_NAME}_backup.mbr if [ ! -f $MBR_BACKUP_FILE ] ; then dd if=$MBR_DEVICE of=$MBR_BACKUP_FILE bs=512 count=1 fi fi # Done, now we must install grub dialog --infobox "\nGRUBをインストール中..." 5 40 $grub_shell --batch < $T_PX/boot/boot.ini else MOUNT_POINT=$TMP/nt$$ mkdir $MOUNT_POINT mount -t $FS_TYPE $PARTITION_NT $MOUNT_POINT cat $MOUNT_POINT/boot.ini > $T_PX/boot/boot.ini if [ ! -f $MOUNT_POINT/boot.ini ] ; then dialog --title "エラー" --msgbox "$PARTITION_NT に boot.ini がありません!" 6 65 exit fi umount $MOUNT_POINT rmdir $MOUNT_POINT fi ################ LINUX_PBR="`basename $PARTITION_LINUX`" dialog --infobox "\nPBRをファイル化中..." 5 40 dd if=$PARTITION_LINUX of=$T_PX/boot/${LINUX_PBR}.pbr bs=512 count=1 1> /dev/null 2> /dev/null ################ if [ "`cat $T_PX/boot/boot.ini|grep ${LINUX_PBR}.pbr`" = "" ] ; then echo "C:\\${LINUX_PBR}.pbr = \"Plamo Linux (${LINUX_PBR})\" " >> $T_PX/boot/boot.ini fi cat $T_PX/boot/boot.ini|tr -d '\r' > $TMP/boot.ini$$ ################ dialog --title "新しい boot.ini の確認(日本語は文字化けします)" --textbox "$TMP/boot.ini$$" 22 74 rm -f $TMP/boot.ini$$ ################ dialog --title "確認【重要】" \ --menu "boot.ini は $PARTITION_NT から作成しました.\n\ \n\ とりあえず,現在の ${T_PX}boot/ 以下($PARTITION_LINUX の /boot/ 以下)\n\ に ${LINUX_PBR}.pbr と boot.ini を置きましたが,この2つのファイル\n\ はフロッピーなどに保存して,Windows の C:\\ 以下にコピーする\n\ 必要があります(そうしないと Linux は起動しません).\n\ 安全のためには,専用の FD を用意してこれらのファイルを \n\ 保存した方が確実ですが,レスキューデイスクを作成すれば \n\ 自動的にこれらのファイルはレスキューデイスクにコピーされる \n\ ので,レスキューデイスクから必要なファイルをコピーする \n\ ことも可能です. \n\ このメニューの「FD」を選ぶと,フロッピーを Windows で読める\n\ 形式でフォーマットし,${LINUX_PBR}.pbr と boot.ini を保存します.\ " 22 65 3 \ "FD" "フロッピーに ${LINUX_PBR}.pbr と boot.ini とを保存" \ "Exit" "終了(後で自分でなんとかする)" \ 2> $TMP/reply$$ if [ $? = 1 -o $? = 255 ]; then rm -f $TMP/reply$$ exit fi REPLY="`cat $TMP/reply$$`" rm -f $TMP/reply$$ NO_FD=0 if [ "$REPLY" = "Exit" ] ; then NO_FD=1 fi ################################ ################################################################ if [ $NO_FD = 0 ] ; then ################################################################ clear MOUNT_POINT_FD=`mount |grep "/dev/fd0 "|cut -f 3 -d ' '` if [ ! "$MOUNT_POINT_FD" = "" ] ; then echo "$MOUNT_POINT_FD へのマウントを解除します." umount $MOUNT_POINT_FD MPF=$MOUNT_POINT_FD else MOUNT_POINT_FD=$TMP/fd$$ MPF="" fi echo フロッピーディスクをセットして,Enterキーを押してください. echo FATフォーマットされていないものは,ここでフォーマットします. read ANS clear echo マウントしています... if [ "$MPF" = "" ] ; then mkdir $MOUNT_POINT_FD fi mount -t vfat /dev/fd0 $MOUNT_POINT_FD if [ ! $? = 0 ] ; then while [ 1 ] ; do echo Enterキーでフォーマットを開始します. read ANS clear echo フロッピーを物理フォーマットしています... fdformat /dev/fd0u1440 echo Windowsで読める形式でシステムフォーマットしています... mkdosfs /dev/fd0 echo フォーマットをやりなおしますか?[y/N] read ANS if [ "$ANS" = "Y" -o "$ANS" = "y" ]; then continue fi break done echo マウントしています... mount -t vfat /dev/fd0 $MOUNT_POINT_FD fi echo boot.ini と ${LINUX_PBR}.pbr をフロッピーにコピーしています... cp $T_PX/boot/boot.ini $T_PX/boot/${LINUX_PBR}.pbr $MOUNT_POINT_FD/. echo アンマウントしています... umount $MOUNT_POINT_FD if [ "$MPF" = "" ] ; then rmdir $MOUNT_POINT_FD fi echo 完了しました.Enterキーを押してください. read ANS dialog --title "完了" --msgbox "\ \n\ フロッピーに保存した boot.ini と ${LINUX_PBR}.pbr とを Windows の C:\\ \n\ 以下にコピーしてください.\n\ \n\ " 8 70 ################################################################ else ################################################################ dialog --title "完了" --msgbox "\ \n\ 現在の ${T_PX}boot/ 以下($PARTITION_LINUX の /boot/ 以下)\n\ の boot.ini と ${LINUX_PBR}.pbr とを Windows の C:\\ 以下に\n\ コピーしてください.\n\ " 9 70 ################################################################ fi ################################################################