# Sample GRUB script to autodetect operating systems # # 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/>. set saved_root=$root function freebsd_ufs_variants { set device=$1 set fstype=$2 set uuid=$3 menuentry "FreeBSD (on $fstype $device)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (single)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --single set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (verbose)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (safe mode)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.hint.apic.0.disabled=1 set FreeBSD.hw.ata.ata_dma=0 set FreeBSD.hw.ata.atapi_dma=0 set FreeBSD.hw.ata.wc=0 set FreeBSD.hw.eisa_slots=0 set FreeBSD.hint.kbdmux.0.disabled=1 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } } function freebsd_zfs_variants { set device=$1 set fstype=zfs menuentry "FreeBSD (on $fstype $device)" $device { set root=$2 freebsd /@/boot/kernel/kernel set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (single)" $device { set root=$2 freebsd /@/boot/kernel/kernel --single set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (verbose)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (safe mode)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.hint.apic.0.disabled=1 set FreeBSD.hw.ata.ata_dma=0 set FreeBSD.hw.ata.atapi_dma=0 set FreeBSD.hw.ata.wc=0 set FreeBSD.hw.eisa_slots=0 set FreeBSD.hint.kbdmux.0.disabled=1 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } } insmod regexp for dev in (*); do # $device: parenthesis removed from $dev regexp -s device '\((.*)\)' $dev # $fstype: filesystem type identified probe -s fstype -f $dev # uuid: filesystem UUID probe -s uuid -u $dev if test -f ($device)/isolinux/isolinux.cfg ; then menuentry "ISOLINUX config (on $device)" $device { set root=$2 syslinux_configfile -i /isolinux/isolinux.cfg } fi if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then menuentry "Windows Vista bootmgr (on $device)" $device { set root=$2 chainloader +1 } elif test -f ($device)/ntldr -a \ -e ($device)/ntdetect.com -a -f ($device)/boot.ini; then menuentry "Windows NT/2000/XP loader (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/windows/win.com; then menuentry "Windows 98/ME (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/io.sys -a -f ($device)/command.com; then menuentry "MS-DOS (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/kernel.sys; then menuentry "FreeDOS (on $device)" $device { set root=$2 regexp -s type '([fh])d[0-9]+' $root regexp -s devnum '[fh]d([0-9]+)' $root if test $type = 'h' -a "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test "$fstype" = ufs1 -o "$fstype" = ufs2 -a \ -e ($device)/boot/kernel/kernel -a \ -e ($device)/boot/device.hints; then freebsd_ufs_variants $device $fstype $uuid elif test "$fstype" = zfs -a \ -e ($device)/@/boot/kernel/kernel -a \ -e ($device)/@/boot/device.hints; then freebsd_zfs_variants $device elif test "$fstype" = hfsplus -a -f ($device)/mach_kernel; then menuentry "Mac OS X/Darwin" $device $uuid { set root=$2 set uuid=$3 insmod vbe do_resume=0 if [ /var/vm/sleepimage -nt10 / ]; then if xnu_resume /var/vm/sleepimage; then do_resume=1 fi fi if [ $do_resume = 1 ]; then xnu_uuid $uuid uuid if [ -f /Extra/DSDT.aml ]; then acpi -e /Extra/DSDT.aml fi xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then xnu_mkext /System/Library/Extensions.mkext else xnu_mkext /System/Library/Extensions fi if [ -f /Extra/Extensions.mkext ]; then xnu_mkext /Extra/Extensions.mkext fi if [ -d /Extra/Extensions ]; then xnu_kextdir /Extra/Extensions fi if [ -f /Extra/devtree.txt ]; then xnu_devtree /Extra/devtree.txt fi if [ -f /Extra/splash.jpg ]; then insmod jpeg xnu_splash /Extra/splash.jpg fi if [ -f /Extra/splash.png ]; then insmod png xnu_splash /Extra/splash.png fi if [ -f /Extra/splash.tga ]; then insmod tga xnu_splash /Extra/splash.tga fi fi } else set root=$device for file in /boot/vmlinuz-* /boot/linux-*; do if test -f $file; then regexp -s version '/boot/vmlinuz-(.*)' $file regexp -s version '/boot/linux-(.*)' $file menuentry "Linux $file" $device $uuid $file $version { set root=$2 set uuid=$3 set kernel=$4 set version=$5 linux $kernel root=UUID=$uuid ro if test -f /boot/initrd-$version.img; then initrd /boot/initrd-$version.img elif test -f /boot/initrd.img-$version; then initrd /boot/initrd.img-$version elif test -f /boot/initrd-$version; then initrd /boot/initrd-$version fi } menuentry "Linux $file (single)" $device $uuid $file $version { set root=$2 set uuid=$3 set kernel=$4 set version=$5 linux $kernel root=UUID=$uuid ro single if test -f /boot/initrd-$version.img; then initrd /boot/initrd-$version.img elif test -f /boot/initrd.img-$version; then initrd /boot/initrd.img-$version elif test -f /boot/initrd-$version; then initrd /boot/initrd-$version fi } fi done fi done set root=$saved_root