#! /bin/sh # mglilo: LILO install helper for MobileGear version 0.4 # Copyright (C) 1999 Ichiya KAMIKI # # [usage] mglilo [-d] [-r path] [-k zImage] [-l lilodir] \ # [-i initrd] [-g C/H/S] [-v] device # # [option] # -d デバッグモード。カードに何も書き込みません。 # -r / partition を指定します。 # -k 母艦上の zImage のパスを指定します。 # -l モバイルギアパッチのあたった lilo ソースディレクトリを指定します。 # -i 母艦上の initrd, initrd.gz のパスを指定します。 # -g カードのジオメトリを直接指定します。 # -v verbose option. # # [action] # # device に PocketLinux 用の lilo.conf を作り LILO を install します。 # また、device に MobileGear 用のブートマーカをつけ、ブート出来るようにします。 # # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any # later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # LILODIR: MobileGear パッチのあたった lilo のデフォルトディレクトリ。 LILODIR=. TMPDIR=/tmp/ TMPFILE=${TMPDIR}/mglilo.$$ LILOCONF=${TMPDIR}/liloconf.$$ PERLFILE=${TMPDIR}/liloconfp.$$ # 母艦上の PocketLinux kernel のデフォルトパス。 # KERNEL=/usr/src/linux/arch/i386/boot/zImage KERNEL=../kernel/arch/i386/boot/zImage # 母艦上の initrd のデフォルトパス。 BOOTDISK=../initrd/initrd.gz # mglilo 内で使う変数はリセットしておく。 DEBUG= VERBOSE= ROOTP_= KERNEL_= BOOTDISK_= GEOM_= LILODIR_= C_= H_= S_= while : do case $# in 0) break ;; # arguments exhausted esac case "$1" in -d) DEBUG="OK" ;; -r) shift; ROOTP_="$1" ;; -k) shift; KERNEL_="$1" ;; -l) shift; LILODIR_="$1" ;; -i) shift; BOOTDISK_="$1" ;; -g) shift; GEOM_="$1" ;; -v) VERBOSE="OK" ;; -*) echo "$0: bad option $1" >&2 head -22 $0 exit 1 ;; *) DEVICE_="$1" ;; esac shift done if [ "${ROOTP_}" != "" ] ; then if [ "${VERBOSE}" = "OK" ] ; then echo Specified root partition: ${ROOTP_} fi fi if [ "${KERNEL_}" != "" ] ; then if [ -f ${KERNEL_} ] ; then if [ "${VERBOSE}" = "OK" ] ; then echo Specified kernel: ${KERNEL_} fi KERNEL=${KERNEL_} else echo 指定された場所 ${KERNEL_} にはカーネルがありません。 fi fi if [ "${LILODIR_}" != "" ] ; then if [ -x ${LILODIR_}/lilo ] ; then if [ "${VERBOSE}" = "OK" ] ; then echo Specified LILO directory: ${LILODIR_} fi LILODIR=${LILODIR_} else echo 指定された場所 ${LILODIR_} には lilo がありません。 exit 1 fi else if [ -x ${LILODIR}/lilo ] ; then if [ "${VERBOSE}" = "OK" ] ; then echo Specified LILO directory: ${LILODIR} fi else echo ${LILODIR} には LILO がありません。 exit 1 fi fi if [ "${BOOTDISK_}" != "" ] ; then if [ -f ${BOOTDISK_} ] ; then if [ "${VERBOSE}" = "OK" ] ; then echo Specified Initrd: ${BOOTDISK_} fi echo BOOTDISK=${BOOTDISK_} else echo 指定された場所 ${BOOTDISK_} には initrd がありません。 fi fi if [ "${GEOM_}" != "" ] ; then C_=`echo ${GEOM_} | cut -f1 -d/` H_=`echo ${GEOM_} | cut -f2 -d/` S_=`echo ${GEOM_} | cut -f3 -d/` fi if [ "${VERBOSE}" = "OK" ] ; then if [ "${GEOM_}" != "" ] ; then echo Specified card geometry: ${C_}/${H_}/${S_} fi fi if [ "${DEVICE_}" = "" ] ; then echo 'DEVICE (/dev/hde etc.) を指定して下さい。' exit 1 fi DEVICE=${DEVICE_} # # CHS, root partition の取得。 # ( cat <> ${PERLFILE} LANG=C fdisk -l ${DEVICE} | perl -n ${PERLFILE} > ${TMPFILE} source ${TMPFILE} rm -f ${TMPFILE} ${PERLFILE} if [ "${CHSOK}" != "YES" ] ; then echo "カードのジオメトリ C/H/S が取得できませんでした。" if [ "${GEOM_}" != "" ] ; then echo 引数で指定されたジオメトリ $C_,$H_,$S_ を使います。 C=${C_} H=${H_} S=${S_} else exit 1 fi fi if [ "${ROOTPOK}" != "YES" ] ; then echo "カードに bootable partition がありません。" exit 2 fi if [ "${FSTYPEOK}" != "YES" ] ; then echo "カードの bootable partition が minix fs でも ext2 fs でもありません。" exit 3 fi # # カードのマウント。 # mount | grep ${DEVICE}${ROOTP} > ${TMPFILE} if [ -s ${TMPFILE} ] ; then ROOTDIR=`cat ${TMPFILE} | awk '{print \$3;}'` UMOUNT=echo else ROOTDIR=card.$$ mkdir ${ROOTDIR} mount -t ${FSTYPE} ${DEVICE}${ROOTP} ${ROOTDIR} UMOUNT=umount fi rm -f ${TMPFILE} # # LILO 自身の install. # if [ "${DEBUG}" = "" ] ; then if [ ! -f ${ROOTDIR}/boot/boot.b ] ; then pushd ${LILODIR} ROOT=${ROOTDIR} make install popd fi if [ ! -f ${ROOTDIR}/boot/boot.b ] ; then echo "LILO の install に失敗しました。" exit 7 fi fi # # kernel, initrd の存在のチェック。 # if [ -d ${ROOTDIR}/boot ] ; then if [ -f ${ROOTDIR}/boot/zImage ] ; then ZIMAGE=boot/zImage else echo "do not found boot/zImage ..." pushd ${ROOTDIR} ZIMAGE=`find -name 'zImage' | head -1` if [ "${ZIMAGE}" = "" ] ; then echo "and nothing at all, try to copy from mother computer ..." if [ -f ${KERNEL} ] ; then cp ${KERNEL} ${ROOTDIR}/boot/zImage ZIMAGE=boot/zImage else echo "カーネルがありません。" exit 4 fi else echo "but found at ${ZIMAGE}" fi popd fi if [ -f ${ROOTDIR}/boot/initrd.gz ] ; then INITRD=boot/initrd.gz else echo "do not found boot/initrd.gz ..." if [ -f ${ROOTDIR}/boot/initrd ] ; then echo "but find boot/initrd," INITRD=boot/initrd else pushd ${ROOTDIR}/boot INITRD=`find -name '*.gz' | head -1` if [ "${INITRD}" = "" ] ; then echo "and nothing at all, try to copy from mother computer ..." if [ -f ${BOOTDISK} ] ; then cp ${BOOTDISK} ${ROOTDIR}/boot/initrd.gz INITRD=boot/initrd.gz else echo "initrd.gz や initrd がありません。" exit 5 fi else echo "but found at ${INITRD}" fi fi popd fi else echo "kernel, initrd.gz が install されていません。" exit 6 fi echo "OK ...." echo "PC Card = ${DEVICE}" echo "Root partition = ${DEVICE}${ROOTP} (${FSTYPE} fs)" echo "Mount point = ${ROOTDIR}/" echo "lilo.conf = etc/lilo.conf" echo "Kernel = ${ZIMAGE}" echo "Initrd = ${INITRD}" if [ "${DEBUG}" = "OK" ] ; then exit 0 fi # # /etc/lilo.conf の作成。 # ( cat < ${LILOCONF} # # lilo 実行の前に /dev/hd? が作成されているかどうかチェック。 # if [ ! -b ${ROOTDIR}${DEVICE} ] ; then echo "カード上に ${DEVICE}* を作成してください。" exit 8 fi if [ ! -d ${ROOTDIR}/tmp ] ; then mkdir ${ROOTDIR}/tmp fi # # lilo.conf のコピーから lilo 実行。 # if [ -f ${ROOTDIR}/etc/lilo.conf ] ; then mv ${ROOTDIR}/etc/lilo.conf ${ROOTDIR}/etc/lilo.conf.old fi mv ${LILOCONF} ${ROOTDIR}/etc/lilo.conf sync ${LILODIR}/lilo -r ${ROOTDIR} # # ブートマーカ設定。 # if [ ! -b /dev/necmg ] ; then mknod /dev/necmg b 78 83 fi # どっちが要るのか詳細が分からないので両方やっておくことにする。 rdev ${DEVICE} /dev/necmg # rdev ${DEVICE}${ROOTP} /dev/necmg # # カードの umount. # sync if [ "${UMOUNT}" = "umount" ] ; then ${UMOUNT} ${DEVICE}${ROOTP} rmdir ${ROOTDIR} fi