| #! /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 <http://www.gnu.org/licenses/>. |
| |
| 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}" --qemu-opts="-hda ${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 |
| # QEMU firmware has bugs which prevent it from accessing hard disk. |
| exit 0 |
| ;; |
| *) |
| 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 |