#! /bin/sh set -e # Copyright (C) 2010 Free Software Foundation, Inc. # # GRUB 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 3 of the License, or # (at your option) any later version. # # GRUB 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. # # You should have received a copy of the GNU General Public License # along with GRUB. If not, see . parted=parted grubshell=@builddir@/grub-shell . "@builddir@/grub-core/modinfo.sh" create_disk_image () { name="$1" size=$2 rm -f "${name}" dd if=/dev/zero of="${name}" bs=512 count=1 seek=$((size * 2048 - 1)) status=noxfer > /dev/null } check_output () { outfile=$1 shift for dsk in $@; do if ! grep "($dsk)" "${outfile}" >/dev/null then echo "($dsk): disk/partiton not found" exit 1 fi done } list_parts () { mod=$1; shift; imgfile="$1" shift outfile="$1" shift echo ls | "${grubshell}" --disk="${imgfile}" \ --modules=$mod | tr -d "\n\r" > "${outfile}" cat "${outfile}" echo } case "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" in mips-qemu_mips | mipsel-qemu_mips | i386-qemu | i386-multiboot | i386-coreboot | mipsel-loongson) disk=ata0 ;; powerpc-ieee1275) disk=ieee1275//pci@80000000/mac-io@4/ata-3@20000/disk@0 # FIXME: QEMU firmware has bugs which prevent it from accessing hard disk w/o recognised label. exit 0 ;; sparc64-ieee1275) disk=ieee1275//pci@1fe\,0/pci-ata@5/ide0@500/disk@0 # FIXME: QEMU firmware has bugs which prevent it from accessing hard disk w/o recognised label. exit 0 ;; i386-ieee1275) disk=ieee1275/d # FIXME: QEMU firmware has bugs which prevent it from accessing hard disk w/o recognised label. exit 0 ;; mips-arc) # FIXME: ARC firmware has bugs which prevent it from accessing hard disk w/o dvh disklabel. exit 0 ;; mipsel-arc) disk=arc/scsi0/disk0/rdisk0 ;; *) disk=hd0 ;; esac imgfile="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1 outfile="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1 # # MSDOS partition types # echo "Checking MSDOS partition types..." # 0 primary create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel msdos list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk # 1 primary create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 # 2 primary create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos2 # 3 primary create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart primary 20M 30M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos2 $disk,msdos3 # 4 primary create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart primary 20M 30M mkpart primary 30M 40M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos2 $disk,msdos3 $disk,msdos4 # 1 primary, 1 extended create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart extended 20M 100% list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 # 1 primary, 1 extended, 1 logical create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart extended 20M 100% mkpart logical 20M 30M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos5 # 1 primary, 1 extended, 2 logical create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart extended 20M 100% mkpart logical 20M 30M mkpart logical 30M 40M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos5 $disk,msdos6 # 1 primary, 1 extended, 3 logical create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart extended 20M 100% mkpart logical 20M 30M mkpart logical 30M 40M mkpart logical 40M 50M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos5 $disk,msdos6 $disk,msdos7 # 1 primary, 1 extended, 4 logical create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel msdos mkpart primary 0 10M mkpart primary 10M 20M mkpart extended 20M 100% mkpart logical 20M 30M mkpart logical 30M 40M mkpart logical 40M 50M mkpart logical 50M 60M list_parts part_msdos "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,msdos1 $disk,msdos5 $disk,msdos6 $disk,msdos7 $disk,msdos8 # # GPT partition types # echo "Checking GPT partition types..." # 0 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel gpt list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk # 1 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 # 2 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M mkpart 2 10M 20M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 $disk,gpt2 # 3 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M mkpart 2 10M 20M mkpart 3 20M 30M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 $disk,gpt2 $disk,gpt3 # 4 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M mkpart 2 10M 20M mkpart 4 20M 30M mkpart 5 30M 40M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 $disk,gpt2 $disk,gpt3 $disk,gpt4 # 5 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M mkpart 2 10M 20M mkpart 3 20M 30M mkpart 4 30M 40M mkpart 5 40M 50M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 $disk,gpt2 $disk,gpt3 $disk,gpt4 $disk,gpt5 # 6 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel gpt mkpart 1 0 10M mkpart 2 10M 20M mkpart 3 20M 30M mkpart 4 30M 40M mkpart 5 40M 50M mkpart 6 50M 60M list_parts part_gpt "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,gpt1 $disk,gpt2 $disk,gpt3 $disk,gpt4 $disk,gpt5 $disk,gpt6 # # SUN partition types # # It seems partition #3 is reserved for whole disk by parted. # echo "Checking SUN partition types..." # 0 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel sun list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk # 1 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 # 2 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M mkpart 10M 20M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 $disk,sun2 # 3 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M mkpart 10M 20M mkpart 20M 30M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 $disk,sun2 $disk,sun4 # 4 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M mkpart 10M 20M mkpart 20M 30M mkpart 30M 40M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 $disk,sun2 $disk,sun4 $disk,sun5 # 5 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M mkpart 10M 20M mkpart 20M 30M mkpart 30M 40M mkpart 40M 50M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 $disk,sun2 $disk,sun4 $disk,sun5 $disk,sun6 # 6 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel sun mkpart 0 10M mkpart 10M 20M mkpart 20M 30M mkpart 30M 40M mkpart 40M 50M mkpart 50M 60M list_parts part_sun "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,sun1 $disk,sun2 $disk,sun4 $disk,sun5 $disk,sun6 $disk,sun7 # # Apple partition types # # Partition table itself is part of some partition, so there is always # a partition by default. But I don't understand why GRUB displays # two partitions by default :-( # echo "Checking APPLE partition types..." # 0 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel mac list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 # 1 parts create_disk_image "${imgfile}" 64 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple3 # 2 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M mkpart b 10M 20M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple3 $disk,apple4 # 3 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M mkpart b 10M 20M mkpart c 20M 30M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple4 $disk,apple5 # 4 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M mkpart b 10M 20M mkpart c 20M 30M mkpart d 30M 40M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple4 $disk,apple5 $disk,apple6 # 5 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M mkpart b 10M 20M mkpart c 20M 30M mkpart d 30M 40M mkpart e 40M 50M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple4 $disk,apple5 $disk,apple6 $disk,apple7 # 6 parts create_disk_image "${imgfile}" 128 ${parted} -a none -s "${imgfile}" mklabel mac mkpart a 1M 10M mkpart b 10M 20M mkpart c 20M 30M mkpart d 30M 40M mkpart e 40M 50M mkpart f 50M 60M list_parts part_apple "${imgfile}" "${outfile}" check_output "${outfile}" $disk $disk,apple1 $disk,apple2 $disk,apple4 $disk,apple5 $disk,apple6 $disk,apple7 $disk,apple8